ryanvogel-opencode-note-review
v0.4.1
Published
OpenCode TUI review-note plugin with shared note uploads and HTML/PDF report generation.
Maintainers
Readme
OpenCode Content Review
Shared OpenCode review-note tooling for model and release evaluations.
What It Does
- Adds TUI slash commands:
/notefor shared review collection and/feedbackfor response-specific early-access feedback. - Lets the reviewer choose how many prompt/response pairs to capture.
- Lets the reviewer select or create a shared tag through an authenticated Worker API.
- Uploads each complete note to a Cloudflare Worker/D1 review store;
/notedoes not save local copies. - Captures exact prompt text, model/version fields when available, reasoning effort, request IDs, tool inputs/outputs, and trace parts.
- Correlates submitted feedback only when the selected response supports the early-access feedback flow.
- Generates a minimal, academic-style HTML or PDF report.
/note collection and report generation use the shared remote store by default. The report CLI can still read local or exported note files when --input is provided.
Install From npm
Add the TUI plugin to .opencode/tui.json in the project where you want to review models:
{
"$schema": "https://opencode.ai/tui.json",
"plugin": [
["ryanvogel-opencode-note-review", {
"defaultPairs": 1,
"defaultTag": "General",
"apiEndpoint": "https://feedback-notes.anoma.ly/v1",
"authSecret": "replace-with-shared-auth-secret",
"maxTextChars": 12000,
"includeToolOutputs": true,
"feedbackEndpoint": "https://feedback-intake.example.invalid/v1/response-feedback",
"releaseChannel": "early-access"
}]
]
}Restart OpenCode after editing tui.json.
authSecret must match the Worker's AUTH_SECRET secret. This is a shared bearer credential: anyone who can read the plugin configuration can read and write shared review data through the API.
For the configured hosted review store and current shared setup prompt, open https://feedback-notes.anoma.ly/install.md.
Install the report CLI globally if you want the opencode-review command available outside OpenCode:
npm install -g ryanvogel-opencode-note-reviewYou can also run the report CLI with npm exec:
npx ryanvogel-opencode-note-review report --helpSet the shared API secret in your shell before generating API-backed reports:
export OPENCODE_REVIEW_AUTH_SECRET="replace-with-shared-auth-secret"Run the report command without arguments for an interactive setup flow:
opencode-review reportIt asks for report name, optional local notes input, output format, output path, and optional tag filter while showing defaults. Leave local notes input blank to retrieve notes from the hosted API. The default output filename includes the report name and current date.
Install For Local Development
Build the package:
bun install
bun run buildFor local development, point .opencode/tui.json at the built file:
{
"$schema": "https://opencode.ai/tui.json",
"plugin": [
["/Users/ryanvogel/dev/opencode-content-review/dist/tui.js", {
"defaultPairs": 1,
"defaultTag": "General",
"apiEndpoint": "https://feedback-notes.anoma.ly/v1",
"authSecret": "replace-with-shared-auth-secret",
"maxTextChars": 12000,
"includeToolOutputs": true,
"feedbackEndpoint": "https://feedback-intake.example.invalid/v1/response-feedback",
"releaseChannel": "early-access"
}]
]
}Restart OpenCode after editing tui.json.
Usage
In an OpenCode session, run:
/noteThe plugin asks for the number of prompt/response pairs to capture, fetches shared tags from the API, lets you select or create a tag, and then opens a note prompt. After confirmation it uploads the complete note to the configured API. It does not write a local note copy.
Each note is self-contained. For each captured pair, it stores the exact prompt, assistant output, model/provider IDs, request IDs when OpenCode exposes them, reasoning effort when available, token/cost metadata, tool inputs and outputs, raw message metadata, and trace parts such as reasoning, snapshots, patches, retries, and step markers.
Submit Feedback
Configure feedbackEndpoint with the feedback intake URL supplied for the early-access program, then run:
/feedbackThe feedback flow selects an individual feedback-capable model response, requires one of Bug, Poor result, Good result, Safety concern, or Other, and requires written details. Submission includes the required correlation identifier for the selected response. If no feedback-capable response exists in the current session, the plugin does not submit feedback.
Before submission, the user chooses whether to include limited diagnostics. This option is off by default. With diagnostics disabled, the payload includes only the required response correlation, category, details, harness version, and configured release channel. With diagnostics enabled, it additionally includes only the model label for the selected response. It does not send captured prompts, response bodies, paths, tool inputs or outputs, raw trace data, or session identifiers, and it does not persist a local copy of submitted feedback.
Generate Report HTML
By default, the report CLI retrieves all available notes from https://feedback-notes.anoma.ly/v1 using OPENCODE_REVIEW_AUTH_SECRET or --auth-secret.
export OPENCODE_REVIEW_AUTH_SECRET="replace-with-shared-auth-secret"
opencode-review report \
--out .opencode/reviews/reports/model-review.html \
--title "GPT-5.5 Model Review"Or after building:
opencode-review report --out .opencode/reviews/reports/model-review.htmlIf --title is omitted in an interactive terminal, the CLI asks for a report name. Default output filenames include the report name and current date, for example .opencode/reviews/reports/frontier-model-review-2026-05-13.pdf.
For a different deployed service, pass --api-endpoint <url>. To use local or exported notes instead of the API, --input can be a single .jsonl file, a single note .json file, or a folder. Folder inputs are scanned recursively for .jsonl files and note_*.json notes, then deduped by note ID.
Example combined folder workflow:
combined-notes/
alice/note_20260511_120000_a1b2c3d4.json
ben/notes.jsonl
casey/reviews/notes/note_20260511_130000_e5f6g7h8.jsonopencode-review report \
--input combined-notes \
--out reports/combined-model-review.pdf \
--title "Combined Model Review"Filter by tag:
opencode-review report \
--tag gpt-5-5 \
--out reports/gpt-5-5-review.pdfGenerate Report PDF
The CLI can render the report directly to PDF with headless Chrome. On macOS it automatically checks /Applications/Google Chrome.app/Contents/MacOS/Google Chrome; on other systems it checks common Chrome/Chromium executable names in PATH.
export OPENCODE_REVIEW_AUTH_SECRET="replace-with-shared-auth-secret"
opencode-review report \
--pdf .opencode/reviews/reports/model-review.pdf \
--title "GPT-5.5 Model Review"Generate an AI-written abstract at the beginning of the report with OpenCode:
opencode-review report \
--out .opencode/reviews/reports/model-review.pdf \
--title "GPT-5.5 Model Review" \
--abstractOptional abstract controls:
opencode-review report \
--out .opencode/reviews/reports/model-review.pdf \
--abstract \
--abstract-model opencode/gpt-5.5 \
--abstract-variant highFor deterministic/manual reports, pass your own abstract text:
opencode-review report \
--out .opencode/reviews/reports/model-review.pdf \
--abstract-text "This report summarizes reviewer observations and supporting traces for the evaluated model."You can also use a .pdf output path:
opencode-review report --out .opencode/reviews/reports/model-review.pdfUseful PDF options:
--html <path>writes the intermediate HTML used for PDF rendering.--keep-htmlwrites a sidecar HTML file next to the PDF.--chrome-path <path>uses a specific Chrome or Chromium executable.--title <text>skips the interactive report-name prompt.--tag <name>filters by tag name or tag folder ID.--input <path>uses local/exported JSON or JSONL notes instead of the API.--api-endpoint <url>selects another notes API endpoint.--auth-secret <secret>passes API authentication directly; preferOPENCODE_REVIEW_AUTH_SECRETin shell history-sensitive environments.--abstractcallsopencode runto generate a report abstract.--abstract-text <text>uses a manual abstract instead of calling a model.--abstract-model <provider/model>chooses the model for abstract generation.--abstract-variant <variant>passes a provider variant/reasoning effort toopencode run.
Notes
- Tool inputs and outputs are captured and uploaded by default for technical review evidence.
maxTextCharslimits each prompt and response body to prevent accidental giant reports.- Use
defaultPairs: "all"only for short review sessions. - Use
defaultTagto change the default tag shown in the tag picker.
