You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
OpenCode and Pi now discover and call the plannotator binary instead of
bundling their own server implementations. Adds plugin protocol, binary
discovery, capability checks, and auto-install bridge.
There are two separate server implementations with the same API surface:
96
+
Plannotator has one server implementation:
94
97
95
-
-**Bun server** (`packages/server/`) — used by both Claude Code (`apps/hook/`) and OpenCode (`apps/opencode-plugin/`). These plugins import directly from `@plannotator/server`.
96
-
-**Pi server** (`apps/pi-extension/server/`) — a standalone Node.js server for the Pi extension. It mirrors the Bun server's API but uses `node:http` primitives instead of Bun's `Request`/`Response` APIs.
98
+
-**Bun server** (`packages/server/`) — owns plan review, code review, annotate, archive, and shared browser APIs.
97
99
98
-
When adding or modifying server endpoints, both implementations must be updated. Runtime-agnostic logic (store, validation, types) lives in `packages/shared/` and is imported by both.
100
+
Claude Code runs this server through the released `plannotator` binary entrypoint. OpenCode and Pi do not package their own server implementations; they call the same binary through the plugin protocol in `packages/shared/plugin-protocol.ts`. Runtime-agnostic logic (store, validation, types) lives in `packages/shared/`.
99
101
100
102
## Installation
101
103
@@ -118,6 +120,8 @@ claude --plugin-dir ./apps/hook
118
120
|`PLANNOTATOR_REMOTE`| Set to `1` / `true` for remote mode, `0` / `false` for local mode, or leave unset for SSH auto-detection. Uses a fixed port in remote mode; browser-opening behavior depends on the environment. |
119
121
|`PLANNOTATOR_PORT`| Fixed port to use. Default: random locally, `19432` for remote sessions. |
120
122
|`PLANNOTATOR_BROWSER`| Custom browser to open plans in. macOS: app name or path. Linux/Windows: executable path. |
123
+
|`PLANNOTATOR_BIN`| Explicit `plannotator` binary path for OpenCode/Pi plugin clients. Overrides PATH and standard install locations. |
124
+
|`PLANNOTATOR_DISABLE_AUTO_INSTALL`| Set to `1` / `true` to make OpenCode/Pi fail clearly instead of running the official installer when no compatible binary is found. |
121
125
|`PLANNOTATOR_SHARE`| Set to `disabled` to turn off URL sharing entirely. Default: enabled. |
122
126
|`PLANNOTATOR_SHARE_URL`| Custom base URL for share links (self-hosted portal). Default: `https://share.plannotator.ai`. |
123
127
|`PLANNOTATOR_PASTE_URL`| Base URL of the paste service API for short URL sharing. Default: `https://plannotator-paste.plannotator.workers.dev`. |
Copy file name to clipboardExpand all lines: apps/hook/.claude-plugin/plugin.json
+1-1Lines changed: 1 addition & 1 deletion
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
{
2
2
"name": "plannotator",
3
3
"description": "Interactive Plan Review: Mark up and refine your plans using a UI, easily share for team collaboration, automatically integrates with plan mode hooks.",
Released binaries ship with SHA256 sidecars and [SLSA build provenance](https://slsa.dev/) attestations from v0.17.2 onwards. See the [installation docs](https://plannotator.ai/docs/getting-started/installation/#verifying-your-install) for version pinning and verification commands.
25
25
26
+
The released binary owns Plannotator's browser server runtime for Claude Code, OpenCode, and Pi. See [Single Binary Runtime](../../docs/single-binary-runtime.md) for the plugin client boundary and daemon-next design.
@@ -629,153 +626,6 @@ export function devMockApi(): Plugin {
629
626
630
627
if(req.url==='/api/plan'){
631
628
res.setHeader('Content-Type','application/json');
632
-
if(USE_GOAL_SETUP_DEMO){
633
-
res.end(JSON.stringify({
634
-
plan: '',
635
-
origin: 'claude-code',
636
-
mode: 'goal-setup',
637
-
sharingEnabled: false,
638
-
goalSetup: GOAL_SETUP_DEMO==="facts" ? {
639
-
stage: "facts",
640
-
title: "Interactive goal setup facts",
641
-
goalSlug: "interactive-goal-setup-ui",
642
-
facts: [
643
-
{
644
-
id: "skill-batch",
645
-
text: "The setup-goal skill should package all interview questions into one Plannotator UI session.",
646
-
accepted: false,
647
-
removed: false,
648
-
recommendedAutomatedVerification: true,
649
-
automatedVerification: true,
650
-
},
651
-
{
652
-
id: "facts-verify",
653
-
text: "Each fact can be accepted, edited, removed, commented on, and marked for automated verification.",
654
-
accepted: false,
655
-
removed: false,
656
-
recommendedAutomatedVerification: true,
657
-
automatedVerification: true,
658
-
},
659
-
{
660
-
id: "header-submit",
661
-
text: "Goal setup submission should use the Plannotator app header action area instead of local form buttons.",
662
-
accepted: false,
663
-
removed: false,
664
-
recommendedAutomatedVerification: false,
665
-
automatedVerification: false,
666
-
},
667
-
{
668
-
id: "question-modes",
669
-
text: "The interview UI should cover text answers, single-select choices, multi-select choices, and custom option entry.",
670
-
accepted: false,
671
-
removed: false,
672
-
recommendedAutomatedVerification: true,
673
-
automatedVerification: true,
674
-
},
675
-
{
676
-
id: "previous",
677
-
text: "Previously accepted facts remain visible in the facts review with their accepted state preserved.",
678
-
accepted: true,
679
-
removed: false,
680
-
recommendedAutomatedVerification: false,
681
-
automatedVerification: false,
682
-
},
683
-
{
684
-
id: "bulk-accept",
685
-
text: "The facts UI provides a single action to accept every visible fact while keeping the review open for final edits.",
686
-
accepted: false,
687
-
removed: false,
688
-
recommendedAutomatedVerification: true,
689
-
automatedVerification: true,
690
-
},
691
-
{
692
-
id: "copy-export",
693
-
text: "The interview and facts UIs can copy the current state as raw JSON or markdown for provenance and debugging.",
694
-
accepted: false,
695
-
removed: false,
696
-
recommendedAutomatedVerification: false,
697
-
automatedVerification: false,
698
-
},
699
-
],
700
-
} : {
701
-
stage: "interview",
702
-
title: "Interactive goal setup interview",
703
-
goalSlug: "interactive-goal-setup-ui",
704
-
questions: [
705
-
{
706
-
id: "objective",
707
-
prompt: "What is the primary outcome of this goal?",
708
-
description: "One sentence that captures what 'done' looks like.",
709
-
answerMode: "text",
710
-
recommendedAnswer: "A bundled goal setup UI where agents launch one browser session for interview Q&A and a second for facts acceptance, replacing multi-turn chat prompting.",
711
-
},
712
-
{
713
-
id: "audience",
714
-
prompt: "Which inferred audience assumption should change?",
715
-
description: "The agent should not need basic confirmation here; only change this if the default is wrong.",
716
-
answerMode: "single",
717
-
recommendedAnswer: "Developers using Claude Code with Plannotator installed.",
718
-
recommendedOptionIds: ["devs-cc"],
719
-
options: [
720
-
{id: "devs-cc",label: "Developers on Claude Code"},
721
-
{id: "devs-oc",label: "Developers on OpenCode"},
722
-
{id: "devs-all",label: "All Plannotator users"},
723
-
],
724
-
},
725
-
{
726
-
id: "scope",
727
-
prompt: "Which inferred scope items should stay or be added?",
728
-
description: "Recommended items are based on the code paths the agent can infer. Add only missing nuance.",
729
-
answerMode: "multi-custom",
730
-
recommendedAnswer: "Skill text, interactive UI, server endpoints, and tests.",
recommendedAnswer: "Vertical list with per-fact accept, edit, remove, comment, and automated-verification toggle. Accepted facts hidden by default on re-review.",
767
-
},
768
-
{
769
-
id: "out-of-scope",
770
-
prompt: "Anything explicitly out of scope?",
771
-
answerMode: "custom",
772
-
required: false,
773
-
},
774
-
],
775
-
},
776
-
}));
777
-
return;
778
-
}
779
629
res.end(JSON.stringify({
780
630
plan: undefined,// Editor uses its own DIFF_DEMO_PLAN_CONTENT
781
631
origin: 'claude-code',
@@ -786,15 +636,6 @@ export function devMockApi(): Plugin {
0 commit comments