opencode-plugin-flow 4.0.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,7 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ One short line per release. For the full rationale behind each entry, see the
4
+ commit history and review evidence.
5
+
3
6
  ## [Unreleased]
4
7
 
8
+ ## [4.1.0] - 2026-06-15
9
+
10
+ - Add Flow-native orchestration handoffs, verification gates, and a hidden verifier worker while keeping the public runtime surface unchanged.
11
+
12
+ ## [4.0.1] - 2026-06-15
13
+
14
+ Teach Flow to fan out through named evidence, validation, audit, review, and candidate workers while keeping runtime state changes manager-owned.
15
+
5
16
  ## [4.0.0] - 2026-06-14
6
17
 
7
18
  Breaking overhaul: Flow is now a skills-first plugin with a minimal v4 runtime ledger, seven tools, one active `.flow/session.json`, archived history, embedded review evidence on completion, and no context-pack or separate review-decision framework.
package/README.md CHANGED
@@ -10,7 +10,7 @@ Add Flow to your OpenCode config:
10
10
 
11
11
  ```json
12
12
  {
13
- "plugin": ["opencode-plugin-flow@4.0.0"]
13
+ "plugin": ["opencode-plugin-flow@4.1.0"]
14
14
  }
15
15
  ```
16
16
 
@@ -59,6 +59,8 @@ The v4 runtime exposes seven tools:
59
59
 
60
60
  There is no `flow_context` and no separate review-record tool. Review evidence is part of `flow_feature_complete`: every completed feature needs a passing `featureReview`, and the final feature also needs a passing `finalReview`.
61
61
 
62
+ Broad Flow work can fan out through hidden evidence, review, validation, audit, verifier, and candidate workers. Those workers return structured handoffs with coverage, evidence, confidence, and gaps; the manager still owns all Flow state changes and no extra user command is required.
63
+
62
64
  ## Runtime Contract
63
65
 
64
66
  The runtime owns only safety:
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import{createHash as g}from"node:crypto";import{mkdir as Xe,readdir as w,readFile as y,rm as b,writeFile as $e}from"node:fs/promises";import{dirname as Ye,join as n,normalize as k,sep as x}from"node:path";var _=".flow-skill-version";function p(){return process.env.HOME??process.env.USERPROFILE??""}function I(e=p()){return n(e,".config","opencode","skills")}function R(e){return g("sha256").update(e).digest("hex")}async function u(e){try{return await y(e,"utf8")}catch(a){if(a.code==="ENOENT")return null;throw a}}function F(e){let a=new Map;if(!e)return a;for(let t of e.split(/\r?\n/)){let s=/^file=(.+) sha256=([a-f0-9]{64})$/.exec(t)??/^file=(.+)=sha256:([a-f0-9]{64})$/.exec(t);if(s?.[1]&&s[2])a.set(s[1],s[2]);let i=/^hash=sha256:([a-f0-9]{64})$/.exec(t);if(i?.[1]&&!a.has("SKILL.md"))a.set("SKILL.md",i[1])}return a}function q(e,a){let t=k(n(e,...a.split("/")));if(t!==e&&t.startsWith(`${e}${x}`))return t;throw Error(`Unsafe skill file path '${a}'.`)}async function h(e=p()){let a=I(e),t=[],s=[],i;try{i=await w(a)}catch(o){if(o.code==="ENOENT")return{removed:t,kept:s};throw o}for(let o of i){if(o!=="flow"&&!o.startsWith("flow-"))continue;let r=n(a,o),l=await u(n(r,_));if(l===null){s.push(r);continue}let f=F(l),c=!1;for(let[m,v]of f){let d=await u(q(r,m));if(d!==null&&R(d)!==v){c=!0;break}}if(c){s.push(r);continue}await b(r,{recursive:!0,force:!0}),t.push(r)}return{removed:t,kept:s}}async function A(e){if(e[2]!=="uninstall"){process.stderr.write(`usage: opencode-plugin-flow uninstall
3
- `),process.exitCode=2;return}let t=await h();for(let s of t.removed)process.stdout.write(`Removed Flow skill: ${s}
4
- `);for(let s of t.kept)process.stdout.write(`Kept non-Flow or user-edited skill: ${s}
2
+ import{createHash as g}from"node:crypto";import{mkdir as aa,readdir as w,readFile as y,rm as b,writeFile as ta}from"node:fs/promises";import{dirname as ra,join as i,normalize as k,sep as x}from"node:path";var _=".flow-skill-version";function h(){return process.env.HOME??process.env.USERPROFILE??""}function F(e=h()){return i(e,".config","opencode","skills")}function R(e){return g("sha256").update(e).digest("hex")}async function u(e){try{return await y(e,"utf8")}catch(a){if(a.code==="ENOENT")return null;throw a}}function I(e){let a=new Map;if(!e)return a;for(let t of e.split(/\r?\n/)){let o=/^file=(.+) sha256=([a-f0-9]{64})$/.exec(t)??/^file=(.+)=sha256:([a-f0-9]{64})$/.exec(t);if(o?.[1]&&o[2])a.set(o[1],o[2]);let n=/^hash=sha256:([a-f0-9]{64})$/.exec(t);if(n?.[1]&&!a.has("SKILL.md"))a.set("SKILL.md",n[1])}return a}function C(e,a){let t=k(i(e,...a.split("/")));if(t!==e&&t.startsWith(`${e}${x}`))return t;throw Error(`Unsafe skill file path '${a}'.`)}async function p(e=h()){let a=F(e),t=[],o=[],n;try{n=await w(a)}catch(r){if(r.code==="ENOENT")return{removed:t,kept:o};throw r}for(let r of n){if(r!=="flow"&&!r.startsWith("flow-"))continue;let s=i(a,r),c=await u(i(s,_));if(c===null){o.push(s);continue}let f=I(c),l=!1;for(let[m,v]of f){let d=await u(C(s,m));if(d!==null&&R(d)!==v){l=!0;break}}if(l){o.push(s);continue}await b(s,{recursive:!0,force:!0}),t.push(s)}return{removed:t,kept:o}}async function U(e){if(e[2]!=="uninstall"){process.stderr.write(`usage: opencode-plugin-flow uninstall
3
+ `),process.exitCode=2;return}let t=await p();for(let o of t.removed)process.stdout.write(`Removed Flow skill: ${o}
4
+ `);for(let o of t.kept)process.stdout.write(`Kept non-Flow or user-edited skill: ${o}
5
5
  `);process.stdout.write(`Remove "opencode-plugin-flow" from opencode.json and restart OpenCode.
6
- `)}A(process.argv).catch((e)=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}
6
+ `)}U(process.argv).catch((e)=>{process.stderr.write(`${e instanceof Error?e.message:String(e)}
7
7
  `),process.exitCode=1});
package/dist/index.js CHANGED
@@ -1,19 +1,190 @@
1
- import{createHash as St}from"node:crypto";import{mkdir as _t,readdir as rr,readFile as It,rm as nr,writeFile as M}from"node:fs/promises";import{createRequire as Pt}from"node:module";import{dirname as At,join as I,normalize as Ct,sep as Tt}from"node:path";var ae=`# Parallel orchestration
1
+ import{createHash as At}from"node:crypto";import{mkdir as Pt,readdir as pn,readFile as Tt,rm as fn,writeFile as M}from"node:fs/promises";import{createRequire as Et}from"node:module";import{dirname as Ut,join as I,normalize as jt,sep as Ot}from"node:path";var ae=`# Flow worker handoff contract
2
2
 
3
- Use parallel workers only for read-only discovery, audit, validation research, or review coverage. Flow execution remains one active feature at a time, and the manager owns all state-changing tool calls.
3
+ Flow managers merge only the worker's final response. Treat that response as the
4
+ worker report of record: it must include the assigned scope, what was actually
5
+ covered, the evidence for each useful claim, and the remaining gaps. End worker
6
+ prompts with "Return only this Flow handoff."
7
+
8
+ ## Evidence, review, validation, or audit worker report
9
+
10
+ Use this for \`flow-evidence-worker\`, \`flow-reviewer\`,
11
+ \`flow-validation-worker\`, and \`flow-audit-worker\`.
12
+
13
+ \`\`\`markdown
14
+ ## Status
15
+ success | partial | blocked
16
+
17
+ ## Scope
18
+ <owned slice: path set, module, command, risk lens, route, data range, or question set>
19
+
20
+ ## Coverage
21
+ - Expected: <files, ranges, questions, commands, or findings assigned>
22
+ - Checked: <actual coverage, for example "12/12 files" or "command not run">
23
+ - Not checked: <items skipped with reason, or "none">
24
+
25
+ ## Findings or facts
26
+ - [high|med|low] <claim>; evidence: <file:line | command summary | screenshot path | URL | metric>; corroboration: <N sources or "single source">
27
+ - [high|med|low] <claim>; evidence: <...>; corroboration: <...>
28
+
29
+ ## Sources
30
+ - <paths read, commands run, docs fetched, data ranges covered, screenshots inspected>
31
+
32
+ ## Confidence and verification
33
+ - Verified: <claims directly re-run, recounted, traced, or cross-checked>
34
+ - Single-source: <claims with exactly one supporting source>
35
+ - Inferred: <claims derived from surrounding evidence rather than directly observed>
36
+ - Unsettled: <claims, sources, or citations that could not be resolved>
37
+ - Falsifier or missing input: <what would overturn or materially change the result>
38
+
39
+ ## Open questions / gaps
40
+ - <ambiguity, missing source, contradiction, skipped item, or out-of-scope dependency>
41
+
42
+ ## Manager follow-ups
43
+ - <concrete next tasks, verifier claims, validation commands, or Flow plan targets>
44
+ \`\`\`
45
+
46
+ Validation workers must include exact command names and raw outcome summaries
47
+ for commands they actually ran. Audit workers must include guards checked for
48
+ any blocking-severity candidate. Review workers must separate blocking findings
49
+ from advisory notes.
50
+
51
+ ## Verifier worker report
52
+
53
+ Use this for \`flow-verifier-worker\`. Give it atomic claims and the cited sources
54
+ or commands. Do not include the generator's reasoning unless that reasoning is
55
+ the thing being verified.
56
+
57
+ \`\`\`markdown
58
+ ## Status
59
+ success | partial | blocked
60
+
61
+ ## Scope
62
+ <claim ids, sources or commands checked, and the acceptance question>
63
+
64
+ ## Verdict per claim
65
+ - <claim id>: verdict=<supported | partly-supported | unsupported | source-not-found>
66
+ - claim: <claim text>
67
+ - evidence: <supporting snippet, path plus line, measured value, command result, or "none">
68
+ - source resolution: <URL, path, or command plus whether it resolved>
69
+ - confidence level: high | med | low
70
+ - recommended action: <keep, narrow, rewrite, or remove>
71
+
72
+ ## Overall
73
+ <accept | revise | reject> because <brief reason>
74
+
75
+ ## Gaps
76
+ - <unavailable source, ambiguous claim wording, missing oracle, or check not run>
77
+
78
+ ## Manager follow-ups
79
+ - <narrow recheck, plan adjustment, review finding, or none>
80
+ \`\`\`
81
+
82
+ ## Candidate implementation worker report
83
+
84
+ Use this only for isolated worktrees or exact non-overlapping path ownership
85
+ authorized by the manager.
86
+
87
+ \`\`\`markdown
88
+ ## Status
89
+ success | partial | blocked
90
+
91
+ ## Scope
92
+ <isolated worktree or exact path-owned slice>
93
+
94
+ ## Changed or proposed patch
95
+ - <path>: <what changed and why>
96
+
97
+ ## Coverage
98
+ - Assigned: <owned files/modules>
99
+ - Touched: <files changed or proposed>
100
+ - Skipped: <anything assigned but not changed and why, or "none">
101
+
102
+ ## Verification
103
+ live-verified | test-verified | type-check-only | not-verified
104
+ - <command, observed outcome, pass/fail counts, or manual check>
105
+
106
+ ## Confidence and risk
107
+ - Checked directly: <behavior, files, or commands verified by the worker>
108
+ - Still open: <tests, review paths, or integration points the manager must cover>
109
+ - Risk: low | medium | high -- <why>
110
+
111
+ ## Merge notes
112
+ - <conflicts, nearby user changes, assumptions, or deviations>
113
+
114
+ ## Manager follow-ups
115
+ - <merge, reject, rerun check, verifier pass, or replan task>
116
+ \`\`\`
117
+
118
+ The manager must inspect and validate any candidate patch before recording Flow
119
+ completion.
120
+ `;var ne=`# Parallel orchestration
121
+
122
+ Use fan-out when Flow work is broad enough that independent workers can gather
123
+ evidence faster than one linear pass. The manager still owns the Flow session:
124
+ only the manager calls state-changing Flow tools, approves plans, completes
125
+ features, records reviews, or closes sessions.
126
+
127
+ Read these companion references before a broad wave:
128
+
129
+ - \`handoff-format.md\` for the exact worker response shapes.
130
+ - \`verification-gates.md\` for coverage checks, handoff acceptance, verifier
131
+ triggers, and synthesis rules.
4
132
 
5
133
  ## Manager sequence
6
134
 
7
- 1. Call \`flow_status\` if a session may exist.
8
- 2. Define slices by module, risk, route, command, or artifact type.
9
- 3. Send workers narrow prompts with exact files, commands to inspect, and expected output shape.
10
- 4. Keep workers read-only unless the user explicitly asked for independent implementation outside Flow.
11
- 5. Reconcile evidence yourself; dedupe, refute, and decide what belongs in the plan, completion payload, or review payload.
12
- 6. Run second waves only for material gaps.
135
+ 1. Call \`flow_status\` if a Flow session may already exist.
136
+ 2. Do a serial orientation pass. Read enough files, schemas, docs, tests,
137
+ commands, or artifacts to identify real slices.
138
+ 3. Define the local manager task. Do not delegate the immediate blocker that
139
+ determines whether fan-out is even valid.
140
+ 4. Build a pre-fan-out coverage gate:
141
+ - total files, modules, routes, commands, findings, rows, or claims in scope.
142
+ - one line per slice with path/range/lens and expected count.
143
+ - partition check showing slices add back to the total when the work is
144
+ countable.
145
+ - overlap/gap check showing no duplicate ownership, empty slices, or missing
146
+ target areas.
147
+ 5. Spawn only named Flow workers. Use exact slices and the required handoff
148
+ shape. Keep each prompt self-contained.
149
+ 6. Continue non-overlapping manager work while workers run.
150
+ 7. Read every handoff. Keep only claims that have evidence, match the assigned
151
+ scope, and carry confidence labels.
152
+ 8. Send important low-confidence, single-source, contested, or citation-heavy
153
+ claims to \`flow-verifier-worker\`.
154
+ 9. Run second waves only for material gaps, conflicts, narrowed scope, or
155
+ verification needs.
156
+ 10. Synthesize one Flow artifact: plan fields, completion evidence, review
157
+ payload, audit report, or candidate patch decision. Do not paste worker
158
+ handoffs as the user-facing result.
159
+
160
+ ## Modes
161
+
162
+ When fanning out Flow work, select the matching hidden Flow agent by name. Do
163
+ not use generic subagents for Flow slices because Flow workers carry the
164
+ permission boundaries for each mode.
165
+
166
+ | Mode | Use agent | Worker output | Write access | Flow tools |
167
+ | --- | --- | --- | --- | --- |
168
+ | \`evidence\` | \`flow-evidence-worker\` | Coverage, facts, files inspected, confidence, gaps, suggested plan targets | No | \`flow_status\` only if needed |
169
+ | \`review\` | \`flow-reviewer\` | Coverage, candidate findings or review slice summary, confidence, gaps | No | \`flow_status\` only if needed |
170
+ | \`validation\` | \`flow-validation-worker\` | Command options or manager-authorized raw output, coverage, confidence, gaps | No code edits; commands only when explicitly allowed | \`flow_status\` only if needed |
171
+ | \`audit\` | \`flow-audit-worker\` | Refuted or surviving finding candidates, guards checked, confidence, gaps | No | \`flow_status\` only if needed |
172
+ | \`verifier\` | \`flow-verifier-worker\` | Per-claim verdicts against cited evidence or commands | No | \`flow_status\` only if needed |
173
+ | \`candidate-implementation\` | \`flow-candidate-worker\` | Candidate patch summary from an isolated worktree or exact path-owned slice | Only with explicit user authorization plus isolation or exact non-overlapping path ownership | No state-changing Flow tools |
174
+
175
+ Do not fan out parallel \`flow_plan_save\`, \`flow_plan_approve\`,
176
+ \`flow_run_start\`, \`flow_feature_complete\`, \`flow_feature_reset\`, or
177
+ \`flow_session_close\` calls. Runtime locking protects files, but Flow accepts only
178
+ one active feature result at a time.
13
179
 
14
180
  ## Worker rules
15
181
 
16
- Workers may read files, inspect docs, run read-only commands, and summarize evidence. Workers must not edit \`.flow/**\` and must not call:
182
+ Workers may read files, inspect docs, run authorized read-only commands, and
183
+ summarize evidence. Candidate implementation workers may edit only when the
184
+ manager assigned an isolated worktree or exact path ownership that does not
185
+ overlap sibling workers or manager edits.
186
+
187
+ Workers must not edit \`.flow/**\` and must not call:
17
188
 
18
189
  - \`flow_plan_save\`
19
190
  - \`flow_plan_approve\`
@@ -22,28 +193,149 @@ Workers may read files, inspect docs, run read-only commands, and summarize evid
22
193
  - \`flow_feature_reset\`
23
194
  - \`flow_session_close\`
24
195
 
25
- Workers also must not approve work, close sessions, or claim validation they did not run.
196
+ Workers also must not approve work, close sessions, record Flow validation, or
197
+ claim validation they did not run. A worker may report raw validation output it
198
+ actually ran; the manager decides whether it is strong enough to record.
26
199
 
27
- ## Output shape
200
+ ## Prompt contract
28
201
 
29
- Ask workers for:
202
+ Every worker prompt includes:
30
203
 
31
204
  \`\`\`text
32
- Scope
33
- Evidence inspected
34
- Findings or facts
35
- Open questions / gaps
36
- Suggested Flow follow-ups
205
+ Overall goal, context only: <goal>
206
+ Mode: evidence | review | validation | audit | verifier | candidate-implementation
207
+ Your exact slice: <paths, modules, command, claim ids, risk lens, or worktree>
208
+ Expected coverage: <count, paths, range, or complete question set>
209
+ Do: <bounded actions>
210
+ Do not: call Flow state tools, edit .flow/**, own sibling slices, or make the final Flow verdict.
211
+ Return exactly the matching handoff shape from handoff-format.md.
37
212
  \`\`\`
38
213
 
39
- ## Where evidence goes
214
+ For research or current-doc slices, require source checks for versioned or
215
+ time-sensitive facts. For implementation candidates, remind workers that other
216
+ work may be active and that they must not revert unrelated changes.
40
217
 
41
- - Planning evidence becomes \`requirements\`, \`decisions\`, feature \`targets\`, feature \`validation\`, or plan notes in prose fields.
42
- - Execution evidence informs the active feature, but \`flow_feature_complete\` is manager-owned.
43
- - Review evidence informs \`featureReview\` or \`finalReview\`, but the manager decides whether it is strong enough to record.
218
+ ## Where handoffs go
44
219
 
45
- If worker results conflict, prefer the directly inspected source artifact over summaries and rerun the narrowest missing check.
46
- `;var re='# Recovery playbook\n\nUse this when a Flow tool returns `status: "error"`, a blocker, or a `nextAction` that conflicts with memory.\n\n## First response\n\n1. Re-anchor with `flow_status`.\n2. Read the returned `summary`, `recovery`, `lastError`, and active feature.\n3. Fix the cause, then retry the smallest valid Flow action.\n\n## Common cases\n\n- `missing_session`: start with `flow_plan_save` using the user\'s goal.\n- `missing_goal`: ask for a concrete goal before planning.\n- `Approved plans cannot be changed`: use `flow_feature_reset` when only affected features need another pass; otherwise close and start a new goal.\n- `No feature is currently running`: call `flow_run_start` before completing.\n- `already in progress`: finish, reset, or block the active feature before starting another.\n- `Completion requires recorded validation evidence`: run real validation and include at least one passing `validationRun`.\n- `Completion requires all recorded validation to pass`: fix failures and rerun. Do not relabel failed checks as passed.\n- `Non-final feature completion requires targeted validation`: use `validationScope: "targeted"` for ordinary features.\n- `Final feature completion requires broad validation`: run the project-level gate and use `validationScope: "broad"`.\n- `Completion requires a passing featureReview`: run or request a real review and include a passing `featureReview` only when there are no blocking findings.\n- `Final feature completion requires a finalReview`: perform final review and include `finalReview`.\n- `Final review depth must match the plan policy`: use `reviewDepth` equal to the approved plan\'s `finalReviewPolicy`.\n- `Cannot close ... unfinished features`: complete, reset, defer, or abandon honestly. Do not mark completed while work remains.\n\n## Reset guidance\n\nUse `flow_feature_reset` when the active or completed work was built on the wrong assumption, validation revealed a design issue, dependencies need to be rerun, or dependent features must be invalidated. Resetting a feature also resets its dependents.\n\n## Closure guidance\n\nUse `flow_session_close`:\n\n- `completed`: only after all planned features are complete.\n- `deferred`: the user intentionally postpones unfinished work.\n- `abandoned`: the session should be archived without claiming delivery.\n\nAfter closure, the active `.flow/session.json` is removed and the archived JSON is stored under `.flow/history/`.\n';var ne="---\nname: flow\ndescription: Main Flow loop for skills-first OpenCode work. Use when a user asks for Flow-guided planning, autonomous execution, resumable implementation, session status, or end-to-end delivery with validation and review gates.\n---\n\n# Flow\n\nUse Flow as a minimal state ledger, not as a framework. Skills provide judgment; the runtime only records the approved plan, active feature, validation evidence, review evidence, and closure.\n\n## Loop\n\n1. Call `flow_status` first. Trust its active session and next action over conversation memory.\n2. If there is no active session and the user gave a goal, load `flow-plan`, save a plan with `flow_plan_save`, then approve it with `flow_plan_approve`. If there is no goal, ask for one.\n3. Load `flow-run`, call `flow_run_start`, implement exactly one feature, validate it, and prepare a `flow_feature_complete` payload.\n4. Load `flow-review` for the required feature review. The reviewer reports a `featureReview` payload; the manager records it inside `flow_feature_complete`.\n5. On the final feature, run broad validation and include `finalReview` in the same `flow_feature_complete` call. Its `reviewDepth` must match the plan's `finalReviewPolicy`.\n6. After all features are complete, archive the session with `flow_session_close` using `kind: \"completed\"`.\n\nUse `references/parallel-orchestration.md` for broad read-only discovery, audit, or review. The manager owns every `flow_*` state change.\n\n## Runtime Surface\n\n- `flow_status`: read the active session.\n- `flow_plan_save`: create a session and/or save a draft plan.\n- `flow_plan_approve`: lock the draft plan.\n- `flow_run_start`: start one runnable feature.\n- `flow_feature_complete`: record completion or a real blocker with validation and review evidence.\n- `flow_feature_reset`: reset one feature and its dependents.\n- `flow_session_close`: archive the active session as `completed`, `deferred`, or `abandoned`.\n\nThere is no `flow_context`, no separate review-record tool, and no multi-session activation surface. The single active source of truth is `.flow/session.json`; closed sessions are archived under `.flow/history/`.\n\n## Hard Gates\n\n- Approved plans are immutable. To change direction, reset affected features or close the session and start a new goal.\n- Only one feature can be active at a time.\n- Completion requires at least one passing `validationRun` entry.\n- Non-final completion requires `validationScope: \"targeted\"`.\n- Final completion requires `validationScope: \"broad\"` and a passing `finalReview`.\n- Every completed feature requires a passing `featureReview` with no blocking findings.\n- `flow_session_close` accepts `kind: \"completed\"` only after an approved plan has passed final completion.\n\n## Recovery\n\n- Confused state: call `flow_status` and follow `nextAction`.\n- Wrong assumption or failed implementation path: use `flow_feature_reset` for the feature and dependents, then rerun from the corrected plan.\n- Missing validation or review evidence: gather real evidence, then call `flow_feature_complete`.\n- Approved plan is materially wrong: reset the affected features, save a revised plan if the session is back in planning; otherwise close and start a new goal.\n- Unknown runtime error: read `summary` and `recovery`; see `references/recovery-playbook.md` for common cases.\n\nNever fabricate validation output, backfill review approval you did not perform, or close as `deferred`/`abandoned` merely to avoid an unfinished-work blocker.\n";var oe=`# Safe refactor workflow
220
+ - Planning evidence becomes \`requirements\`, \`decisions\`, feature \`targets\`,
221
+ feature \`validation\`, or plan notes in prose fields.
222
+ - Execution evidence informs the active feature, but \`flow_feature_complete\` is
223
+ manager-owned.
224
+ - Validation evidence may become \`validationRun\` only when the command, status,
225
+ and raw outcome are concrete enough to trust.
226
+ - Review evidence informs \`featureReview\` or \`finalReview\`, but the manager owns
227
+ the pass/fail verdict.
228
+ - Audit evidence becomes findings only after refutation and verification rules
229
+ in \`verification-gates.md\`.
230
+ - Candidate patches are inspected, merged, and validated by the manager before
231
+ any Flow completion call.
232
+
233
+ When worker results conflict, inspect the underlying artifact directly and rerun
234
+ the smallest check that can settle the disagreement.
235
+
236
+ ## Second waves
237
+
238
+ Start a follow-up wave when first-wave handoffs reveal:
239
+
240
+ - missing coverage in the original slice map.
241
+ - conflicting findings that matter to the Flow decision.
242
+ - a specialized follow-up that was intentionally out of scope.
243
+ - high-stakes, low-confidence, or single-source claims needing verification.
244
+ - bounded implementation candidates after research converges.
245
+
246
+ Do not recurse by default. If a worker says it needs another worker, the manager
247
+ decides whether that is a second wave and writes the next bounded prompt.
248
+ `;var re='# Recovery playbook\n\nUse this when a Flow tool returns `status: "error"`, a blocker, or a `nextAction` that conflicts with memory.\n\n## First response\n\n1. Re-anchor with `flow_status`.\n2. Read the returned `summary`, `recovery`, `lastError`, and active feature.\n3. Fix the cause, then retry the smallest valid Flow action.\n\n## Common cases\n\n- `missing_session`: start with `flow_plan_save` using the user\'s goal.\n- `missing_goal`: ask for a concrete goal before planning.\n- `Approved plans cannot be changed`: use `flow_feature_reset` when only affected features need another pass; otherwise close and start a new goal.\n- `No feature is currently running`: call `flow_run_start` before completing.\n- `already in progress`: finish, reset, or block the active feature before starting another.\n- `Completion requires recorded validation evidence`: run real validation and include at least one passing `validationRun`.\n- `Completion requires all recorded validation to pass`: fix failures and rerun. Do not relabel failed checks as passed.\n- `Non-final feature completion requires targeted validation`: use `validationScope: "targeted"` for ordinary features.\n- `Final feature completion requires broad validation`: run the project-level gate and use `validationScope: "broad"`.\n- `Completion requires a passing featureReview`: run or request a real review and include a passing `featureReview` only when there are no blocking findings.\n- `Final feature completion requires a finalReview`: perform final review and include `finalReview`.\n- `Final review depth must match the plan policy`: use `reviewDepth` equal to the approved plan\'s `finalReviewPolicy`.\n- `Cannot close ... unfinished features`: complete, reset, defer, or abandon honestly. Do not mark completed while work remains.\n\n## Reset guidance\n\nUse `flow_feature_reset` when the active or completed work was built on the wrong assumption, validation revealed a design issue, dependencies need to be rerun, or dependent features must be invalidated. Resetting a feature also resets its dependents.\n\n## Closure guidance\n\nUse `flow_session_close`:\n\n- `completed`: only after all planned features are complete.\n- `deferred`: the user intentionally postpones unfinished work.\n- `abandoned`: the session should be archived without claiming delivery.\n\nAfter closure, the active `.flow/session.json` is removed and the archived JSON is stored under `.flow/history/`.\n';var oe=`# Verification gates
249
+
250
+ Verification is how Flow keeps parallel work from turning into parallel
251
+ guesswork. Worker handoffs are candidate evidence; the manager decides what can
252
+ enter the plan, validation record, review payload, audit report, or final
253
+ answer.
254
+
255
+ ## Before fan-out
256
+
257
+ Run a pre-fan-out gate after serial orientation and before spawning workers:
258
+
259
+ - Count the total work items when countable: files, modules, routes, commands,
260
+ rows, findings, screenshots, or claims.
261
+ - List every slice with path/range/lens and expected count.
262
+ - Check that countable slices add back to the total.
263
+ - Check for overlapping ownership, missing areas, empty slices, and ambiguous
264
+ shared contracts.
265
+ - Fix the slice map centrally before spawning if the gate does not reconcile.
266
+
267
+ If the scope cannot be counted, state the completeness rule instead, such as
268
+ "all changed files plus callers" or "all public commands plus release docs."
269
+
270
+ ## Every handoff
271
+
272
+ Accept a handoff only after a cheap manager-side pass:
273
+
274
+ - \`Status\` is terminal: \`success\`, \`partial\`, or \`blocked\`.
275
+ - Coverage matches the assigned slice, or skips are explicit.
276
+ - Important claims have concrete evidence and confidence tags.
277
+ - Cited paths, commands, screenshots, URLs, or metrics resolve.
278
+ - The evidence supports the claim, not just the topic.
279
+ - Findings stay inside the worker's slice.
280
+ - Headline counts can be recounted or traced.
281
+ - Contradictions between workers are either resolved or explicitly marked as
282
+ contested.
283
+
284
+ Demote, drop, re-task, or verify claims that fail this pass.
285
+
286
+ ## Verifier triggers
287
+
288
+ Use \`flow-verifier-worker\` when a claim is:
289
+
290
+ - blocking or release-sensitive.
291
+ - high-stakes for user data, security, persistence, permissions, or public API
292
+ behavior.
293
+ - low-confidence, inferred, surprising, or single-sourced.
294
+ - citation-heavy enough that source drift would change the conclusion.
295
+ - contradicted by another worker or by manager inspection.
296
+ - a count, benchmark, command result, or pass/fail claim that a Flow payload will
297
+ rely on.
298
+
299
+ Give the verifier atomic claims, cited sources or commands, and the acceptance
300
+ question. Do not ask it to redesign the work or review the whole feature.
301
+
302
+ ## Flow payload acceptance
303
+
304
+ Planning fields may use worker evidence only when the source and scope are clear.
305
+ Unverified broad findings should become a review-first feature, not a fix plan.
306
+
307
+ \`validationRun\` entries may use worker-reported commands only when the worker
308
+ was explicitly authorized to run the command and reported the exact command,
309
+ status, and raw outcome summary.
310
+
311
+ \`featureReview\` and \`finalReview\` may use worker review slices, but the manager
312
+ owns the pass/fail decision and must resolve blockers, contradictions, and
313
+ coverage gaps before returning the payload.
314
+
315
+ Audit reports may include only findings that survived refutation. Blocking audit
316
+ findings need guards checked, deployment context, and evidence that the current
317
+ code exhibits the behavior.
318
+
319
+ Candidate implementation patches are not Flow evidence until the manager
320
+ inspects, merges or rejects them, and runs suitable validation in the main
321
+ Flow-managed workspace.
322
+
323
+ ## Final synthesis
324
+
325
+ Before presenting or recording the result:
326
+
327
+ - Preserve confidence: verified, single-sourced, inferred, and unresolved claims
328
+ stay distinct when it matters.
329
+ - When workers disagree, inspect the cited artifact or rerun the cited command
330
+ instead of arbitrating from summaries.
331
+ - Run the strongest practical local check for the deliverable.
332
+ - Re-read critical files or docs that will be cited in the final decision.
333
+ - Record gaps honestly instead of converting missing evidence into success
334
+ language.
335
+
336
+ \`Status: success\` only says the worker believes its slice is done. The manager
337
+ still checks coverage and evidence before trusting the result.
338
+ `;var ie="---\nname: flow\ndescription: Main Flow loop for skills-first OpenCode work. Use when a user asks for Flow-guided planning, autonomous execution, resumable implementation, session status, or end-to-end delivery with validation and review gates.\n---\n\n# Flow\n\nUse Flow as a minimal state ledger, not as a framework. Skills provide judgment; the runtime only records the approved plan, active feature, validation evidence, review evidence, and closure.\n\n## Loop\n\n1. Call `flow_status` first. Trust its active session and next action over conversation memory.\n2. If there is no active session and the user gave a goal, load `flow-plan`, save a plan with `flow_plan_save`, then approve it with `flow_plan_approve`. If there is no goal, ask for one.\n3. Load `flow-run`, call `flow_run_start`, implement exactly one feature, validate it, and prepare a `flow_feature_complete` payload.\n4. Load `flow-review` for the required feature review. The reviewer reports a `featureReview` payload; the manager records it inside `flow_feature_complete`.\n5. On the final feature, run broad validation and include `finalReview` in the same `flow_feature_complete` call. Its `reviewDepth` must match the plan's `finalReviewPolicy`.\n6. After all features are complete, archive the session with `flow_session_close` using `kind: \"completed\"`.\n\nUse `references/parallel-orchestration.md` for broad read-only discovery, audit, validation, review, verification, or candidate implementation waves. Its `references/handoff-format.md` and `references/verification-gates.md` companions define the worker contracts. The manager owns every `flow_*` state change.\n\n## Runtime Surface\n\n- `flow_status`: read the active session.\n- `flow_plan_save`: create a session and/or save a draft plan.\n- `flow_plan_approve`: lock the draft plan.\n- `flow_run_start`: start one runnable feature.\n- `flow_feature_complete`: record completion or a real blocker with validation and review evidence.\n- `flow_feature_reset`: reset one feature and its dependents.\n- `flow_session_close`: archive the active session as `completed`, `deferred`, or `abandoned`.\n\nThere is no `flow_context`, no separate review-record tool, and no multi-session activation surface. The single active source of truth is `.flow/session.json`; closed sessions are archived under `.flow/history/`.\n\n## Hard Gates\n\n- Approved plans are immutable. To change direction, reset affected features or close the session and start a new goal.\n- Only one feature can be active at a time.\n- Completion requires at least one passing `validationRun` entry.\n- Non-final completion requires `validationScope: \"targeted\"`.\n- Final completion requires `validationScope: \"broad\"` and a passing `finalReview`.\n- Every completed feature requires a passing `featureReview` with no blocking findings.\n- `flow_session_close` accepts `kind: \"completed\"` only after an approved plan has passed final completion.\n\n## Recovery\n\n- Confused state: call `flow_status` and follow `nextAction`.\n- Wrong assumption or failed implementation path: use `flow_feature_reset` for the feature and dependents, then rerun from the corrected plan.\n- Missing validation or review evidence: gather real evidence, then call `flow_feature_complete`.\n- Approved plan is materially wrong: reset the affected features, save a revised plan if the session is back in planning; otherwise close and start a new goal.\n- Unknown runtime error: read `summary` and `recovery`; see `references/recovery-playbook.md` for common cases.\n\nNever fabricate validation output, backfill review approval you did not perform, or close as `deferred`/`abandoned` merely to avoid an unfinished-work blocker.\n";var se=`# Safe refactor workflow
47
339
 
48
340
  Refactoring is a behavior-preserving sequence of small changes. This workflow keeps cleanup from becoming an unreviewable rewrite.
49
341
 
@@ -85,7 +377,7 @@ Weak evidence includes:
85
377
  - Public contracts and compatibility shims remain intact or were explicitly planned.
86
378
  - Deleted code is actually unreachable or obsolete.
87
379
  - Validation can catch a realistic mistake in the refactor.
88
- `;var ie=`# Deslop smell rubric
380
+ `;var le=`# Deslop smell rubric
89
381
 
90
382
  Use this rubric to turn vague cleanup instincts into reviewable findings.
91
383
 
@@ -119,7 +411,7 @@ class; severity; location; evidence read; refutation checked; why it matters; sa
119
411
  \`\`\`
120
412
 
121
413
  Rate as blocking only when the smell materially raises defect risk, blocks planned work, hides behavior, or makes the success claim unverifiable. Style-only cleanup is advisory.
122
- `;var se=`---
414
+ `;var ce=`---
123
415
  name: flow-deslop
124
416
  description: Flow guidance for evidence-backed code smell cleanup, AI-slop removal, overengineering reduction, maintainability refactors, and behavior-preserving cleanup. Use when planning, executing, or reviewing broad cleanup/refactor work, code smell findings, duplicated or bloated code, speculative abstractions, dead code, or agent-introduced mess.
125
417
  ---
@@ -161,10 +453,14 @@ For each claimed smell removal, verify:
161
453
  - **blast radius** — public contracts and downstream callers still work.
162
454
 
163
455
  Never approve cleanup because it "looks cleaner" without evidence. Tests passing is necessary but not sufficient when the refactor changes structure across files.
164
- `;var le=`# Parallel discovery
456
+ `;var de=`# Parallel discovery
165
457
 
166
458
  Use this only after a serial orientation pass has identified the repo shape and the likely slices. Workers are read-only evidence gatherers; the planner owns the plan.
167
459
 
460
+ For broad waves, also load \`../../flow/references/parallel-orchestration.md\`.
461
+ Use its pre-fan-out coverage gate and
462
+ \`../../flow/references/handoff-format.md\` response shapes.
463
+
168
464
  ## Good slices
169
465
 
170
466
  - Independent modules or packages.
@@ -173,11 +469,44 @@ Use this only after a serial orientation pass has identified the repo shape and
173
469
  - Risk lenses such as security, persistence, accessibility, migration, or performance.
174
470
  - Documentation and operator-contract checks.
175
471
 
472
+ ## Flow repo default slices
473
+
474
+ For this repository, good first-wave slices are:
475
+
476
+ - Runtime gates: \`src/runtime/schema.ts\`, \`src/runtime/transitions.ts\`,
477
+ \`src/runtime/api.ts\`, and \`tests/runtime-gates.test.ts\`.
478
+ - Workspace persistence: \`src/runtime/workspace.ts\`,
479
+ \`src/runtime/json/strict-object.ts\`, and
480
+ \`tests/workspace-persistence.test.ts\`.
481
+ - OpenCode adapter surface: \`src/adapters/opencode/**\`, \`src/config-shared.ts\`,
482
+ \`src/config.ts\`, \`src/index.ts\`, and surface tests.
483
+ - Distribution and synced skills: \`src/distribution/**\`, \`src/cli.ts\`,
484
+ \`skills/**\`, and distribution tests.
485
+ - CI, package, and release contract: \`.github/workflows/**\`, \`package.json\`,
486
+ \`bun.lock\`, \`README.md\`, and \`CHANGELOG.md\`.
487
+ - Docs and operator contract: \`docs/**\`, \`README.md\`, and skill references.
488
+
489
+ ## Coverage gate
490
+
491
+ Before spawning workers, state the total discovery scope and one line per slice.
492
+ For countable scopes, confirm that slice counts add back to the total and that
493
+ there are no overlaps, gaps, or empty slices. If the scope is not countable,
494
+ state the completeness rule, such as "all changed files plus callers."
495
+
176
496
  ## Worker prompt
177
497
 
178
498
  \`\`\`text
179
499
  Inspect <slice> for <goal>. Read-only. Do not edit files or call Flow tools.
180
- Return: scope inspected; files/commands checked; evidence-backed facts or findings; gaps; suggested feature targets and validation.
500
+ Return the evidence/review/validation/audit handoff shape from ../../flow/references/handoff-format.md.
501
+ \`\`\`
502
+
503
+ For validation-oriented discovery:
504
+
505
+ \`\`\`text
506
+ Inspect <slice> for validation risk. Read-only. Do not edit files or call Flow
507
+ tools. You may report commands that should be run, and include raw output only
508
+ for commands you actually ran. Return the evidence/review/validation/audit
509
+ handoff shape from ../../flow/references/handoff-format.md.
181
510
  \`\`\`
182
511
 
183
512
  ## Synthesis
@@ -190,7 +519,7 @@ Convert only evidence-backed work into plan fields:
190
519
  - feature \`validation\`: checks expected to prove the feature.
191
520
 
192
521
  If workers disagree, inspect the source artifact yourself. If a candidate finding lacks a concrete citation or refutation pass, make it a review-first deliverable rather than a fix feature.
193
- `;var ce=`# Planning examples
522
+ `;var ue=`# Planning examples
194
523
 
195
524
  ## Rate limiting feature set
196
525
 
@@ -275,7 +604,7 @@ Better plan:
275
604
  - Validation that only says "manual testing".
276
605
  - Targets that name the entire repo.
277
606
  - Features with hidden dependencies instead of \`dependsOn\`.
278
- `;var de=`---
607
+ `;var pe=`---
279
608
  name: flow-plan
280
609
  description: Plan Flow work for the v4 skills-first runtime: inspect the repo, decompose a user goal into right-sized features, save a draft with flow_plan_save, and approve it with flow_plan_approve.
281
610
  ---
@@ -289,7 +618,7 @@ If \`flow_plan_save\` is unavailable, stop and tell the user to check that \`ope
289
618
  ## Inspect first
290
619
 
291
620
  - Read the files, docs, tests, package scripts, and local conventions that determine the work.
292
- - For broad discovery, read \`references/parallel-discovery.md\` after a serial orientation pass.
621
+ - For broad discovery, read \`references/parallel-discovery.md\` after a serial orientation pass. Use \`../flow/references/parallel-orchestration.md\` when discovery needs multiple workers, and apply its coverage gate before fan-out.
293
622
  - For cleanup/refactor goals, load \`flow-deslop\`.
294
623
  - For UI/frontend goals, load \`flow-ui-quality\`.
295
624
  - Do not invent findings. Broad "review and fix" goals start with a review-first feature whose deliverable is evidence-backed findings.
@@ -336,7 +665,7 @@ Use \`finalReviewPolicy: "broad"\` only for low-risk, narrow work. Use \`"detail
336
665
  After saving, summarize the plan to the user or proceed if they already authorized implementation. Then call \`flow_plan_approve\`. Approved plans are immutable; changing them later requires reset/closure rather than silent edits.
337
666
 
338
667
  See \`references/planning-examples.md\` for payload examples and decomposition anti-patterns.
339
- `;var ue=`# Review rubric
668
+ `;var fe=`# Review rubric
340
669
 
341
670
  Use this to decide whether a \`featureReview\` or \`finalReview\` payload may pass.
342
671
 
@@ -424,7 +753,7 @@ When reviewing a findings report, verify findings adversarially:
424
753
  - Downgrade or reject findings that do not survive refutation.
425
754
 
426
755
  Approve only on evidence actually inspected. A review is a claim of coverage, not a courtesy stamp.
427
- `;var pe=`---
756
+ `;var me=`---
428
757
  name: flow-review
429
758
  description: Review Flow work in the v4 runtime: inspect feature or final-session changes, classify findings, and return featureReview or finalReview payloads for flow_feature_complete.
430
759
  ---
@@ -481,10 +810,15 @@ Use \`status: "failed"\` when any blocking finding remains. Advisory findings ma
481
810
  - Cleanup/refactor: load \`flow-deslop\`; verify the smell was real, refutation paths were checked, and behavior was preserved.
482
811
  - UI/frontend: load \`flow-ui-quality\`; verify state coverage and visual evidence when a local target was available.
483
812
  - Audit reports: use \`flow-run/references/audit-rubric.md\`; findings must survive refutation before they can drive fix features.
484
- - Large reviews: use \`../flow/references/parallel-orchestration.md\` for read-only slices, then synthesize and own the verdict yourself.
813
+ - Large reviews: use \`../flow/references/parallel-orchestration.md\` for
814
+ read-only slices by changed-file group, risk lens, or validation surface.
815
+ Use the named review, audit, evidence, or validation agents from that
816
+ reference instead of generic subagents. Apply its handoff format and
817
+ verification gates; only the manager returns the final \`featureReview\` or
818
+ \`finalReview\` payload.
485
819
 
486
820
  Never approve to unblock completion, fix findings in the review pass, or vouch for validation you did not inspect.
487
- `;var fe=`# Audit findings rubric
821
+ `;var he=`# Audit findings rubric
488
822
 
489
823
  What counts as a valid finding when the feature's deliverable is a findings report: a codebase audit, a review-first feature, or any report whose findings a later feature will fix. The commands you run are still governed by \`validation-rubric.md\`; this rubric governs the findings themselves.
490
824
 
@@ -504,8 +838,9 @@ A finding that survives this pass is worth reporting. A finding you did not try
504
838
 
505
839
  For broad audits, use \`../../flow/references/parallel-orchestration.md\` to split
506
840
  read-only slices by module, data flow, or risk lens. Workers surface candidates;
507
- the audit author owns the report. Before blocking severity, dedupe, trace
508
- guards, fill cross-layer checks, and downgrade missing context.
841
+ the audit author owns the report. Apply its handoff format and verification
842
+ gates. Before blocking severity, dedupe, trace guards, fill cross-layer checks,
843
+ verify contested or high-stakes claims, and downgrade missing context.
509
844
 
510
845
  ## Every blocking finding records "guards checked"
511
846
 
@@ -536,7 +871,7 @@ follow-up order — correctness and persisted/user-input surfaces first
536
871
  \`\`\`
537
872
 
538
873
  Never: promote a hypothesis to blocking severity; cite a line you did not read in context; rate severity against a deployment model the product does not have; pad the report to look thorough — six verified findings outrank nine where three die on first contact.
539
- `;var me=`# Validation evidence rubric
874
+ `;var ge=`# Validation evidence rubric
540
875
 
541
876
  Use this before recording \`flow_feature_complete\`.
542
877
 
@@ -554,6 +889,7 @@ Use the strongest practical tier. For risky work, combine tiers.
554
889
  - Each \`validationRun\` entry has \`command\`, \`status\`, and \`summary\`.
555
890
  - Completion accepts only passing entries. Failed or skipped checks belong in the summary/notes and must be resolved or explained as blockers.
556
891
  - Do not claim a command was run unless it was run in this session or directly reported by a trusted worker with raw output.
892
+ - Worker-reported command output must satisfy \`../../flow/references/verification-gates.md\`: exact command, status, raw outcome summary, coverage, and manager acceptance.
557
893
  - Include scope in the summary: what behavior, files, routes, or states the check covered.
558
894
  - UI work should include browser or screenshot evidence when the app can run locally.
559
895
  - Cleanup/refactor work should show behavior preservation, not only formatting success.
@@ -592,7 +928,7 @@ Broad validation usually means the repo's full check command, full relevant test
592
928
  - If validation needs external access, missing credentials, or ambiguous user input, record \`status: "needs_input"\` with an honest \`outcome\`.
593
929
 
594
930
  Never trim failing output, relabel a failed command as passed, or use "not run" as completion evidence.
595
- `;var he="---\nname: flow-run\ndescription: Execute one approved Flow feature in the v4 runtime: start a feature with flow_run_start, make scoped changes, gather real validation evidence, obtain review payloads, and complete with flow_feature_complete.\n---\n\n# Flow Run\n\nUse this skill for implementation after a Flow plan is approved. Work one feature at a time.\n\nIf `flow_run_start` is unavailable, stop and tell the user to check that `opencode-plugin-flow` is loaded in OpenCode.\n\n## Start\n\n- Call `flow_status`.\n- Call `flow_run_start` with no `featureId` unless the user or plan requires a specific runnable feature.\n- Treat the returned feature as the sole scope until it is completed, blocked, or reset.\n- Load `flow-deslop` for cleanup/refactor features.\n- Load `flow-ui-quality` for frontend, UX, responsive, accessibility, or visual work.\n\n## Implement\n\n- Read the feature `targets`, `summary`, `validation`, dependencies, and plan `requirements`/`decisions`.\n- Keep edits scoped to the active feature. If new scope appears, stop and replan or defer it to another feature.\n- Preserve unrelated user changes in the worktree.\n- When a wrong assumption invalidates the feature, use `flow_feature_reset`; do not pile patches onto a bad path.\n\n## Validate\n\n- Read `references/validation-rubric.md` before completing.\n- Run the strongest practical checks for the changed behavior.\n- Record concrete command names, status, and observed results. \"Tests pass\" is not evidence.\n- Non-final features complete with `validationScope: \"targeted\"`.\n- The final feature must run a broad project-level gate and use `validationScope: \"broad\"`.\n\n## Review and complete\n\nBefore `flow_feature_complete`, obtain a `featureReview` payload. Load `flow-review`; for read-only subagent reviews, the manager receives the payload and records it.\n\nFor the final feature, also obtain a `finalReview` payload whose `reviewDepth` equals the approved plan's `finalReviewPolicy`.\n\nComplete with:\n\n```json\n{\n \"status\": \"ok\",\n \"featureId\": \"active-feature-id\",\n \"summary\": \"what changed\",\n \"artifactsChanged\": [{ \"path\": \"src/file.ts\" }],\n \"validationRun\": [\n { \"command\": \"bun test tests/foo.test.ts\", \"status\": \"passed\", \"summary\": \"3 pass, exercised foo behavior\" }\n ],\n \"validationScope\": \"targeted\",\n \"featureReview\": { \"status\": \"passed\", \"summary\": \"review summary\", \"blockingFindings\": [] }\n}\n```\n\nIf genuinely blocked, call `flow_feature_complete` with `status: \"needs_input\"` and an `outcome` that explains the blocker and next step. Never fabricate validation or review evidence to force progress.\n";var ge=`# UI quality rubric
931
+ `;var we="---\nname: flow-run\ndescription: Execute one approved Flow feature in the v4 runtime: start a feature with flow_run_start, make scoped changes, gather real validation evidence, obtain review payloads, and complete with flow_feature_complete.\n---\n\n# Flow Run\n\nUse this skill for implementation after a Flow plan is approved. Work one feature at a time.\n\nIf `flow_run_start` is unavailable, stop and tell the user to check that `opencode-plugin-flow` is loaded in OpenCode.\n\n## Start\n\n- Call `flow_status`.\n- Call `flow_run_start` with no `featureId` unless the user or plan requires a specific runnable feature.\n- Treat the returned feature as the sole scope until it is completed, blocked, or reset.\n- Load `flow-deslop` for cleanup/refactor features.\n- Load `flow-ui-quality` for frontend, UX, responsive, accessibility, or visual work.\n\n## Implement\n\n- Read the feature `targets`, `summary`, `validation`, dependencies, and plan `requirements`/`decisions`.\n- Keep edits scoped to the active feature. If new scope appears, stop and replan or defer it to another feature.\n- Preserve unrelated user changes in the worktree.\n- When a wrong assumption invalidates the feature, use `flow_feature_reset`; do not pile patches onto a bad path.\n\n## Validate\n\n- Read `references/validation-rubric.md` before completing.\n- Run the strongest practical checks for the changed behavior.\n- Record concrete command names, status, and observed results. \"Tests pass\" is not evidence.\n- Non-final features complete with `validationScope: \"targeted\"`.\n- The final feature must run a broad project-level gate and use `validationScope: \"broad\"`.\n\nFor broad validation research, risky changes, or unclear coverage, use\n`../flow/references/parallel-orchestration.md` to fan out named Flow workers.\nUse the mode-to-agent mapping in that reference instead of generic subagents.\nWorkers must use the handoff format and verification gates from that reference.\nThey may report command output they actually ran or propose focused checks; the\nmanager decides what is strong enough to record.\n\nFor independent implementation attempts, use candidate workers only with\nexplicit user authorization plus isolated worktrees or exact non-overlapping\npath ownership. Treat their output as candidate patches. The manager inspects,\nmerges, validates, and records Flow state serially.\n\n## Review and complete\n\nBefore `flow_feature_complete`, obtain a `featureReview` payload. Load `flow-review`; for read-only subagent reviews, the manager receives the payload and records it.\n\nFor the final feature, also obtain a `finalReview` payload whose `reviewDepth` equals the approved plan's `finalReviewPolicy`.\n\nComplete with:\n\n```json\n{\n \"status\": \"ok\",\n \"featureId\": \"active-feature-id\",\n \"summary\": \"what changed\",\n \"artifactsChanged\": [{ \"path\": \"src/file.ts\" }],\n \"validationRun\": [\n { \"command\": \"bun test tests/foo.test.ts\", \"status\": \"passed\", \"summary\": \"3 pass, exercised foo behavior\" }\n ],\n \"validationScope\": \"targeted\",\n \"featureReview\": { \"status\": \"passed\", \"summary\": \"review summary\", \"blockingFindings\": [] }\n}\n```\n\nIf genuinely blocked, call `flow_feature_complete` with `status: \"needs_input\"` and an `outcome` that explains the blocker and next step. Never fabricate validation or review evidence to force progress.\n";var ve=`# UI quality rubric
596
932
 
597
933
  Use this rubric for frontend planning, implementation, and review.
598
934
 
@@ -636,7 +972,7 @@ class; severity; location or screenshot area; evidence inspected; user impact; f
636
972
  \`\`\`
637
973
 
638
974
  Blocking UI findings are issues that prevent task completion, hide required information, break accessibility basics, create incoherent layout at supported sizes, or make the visual success claim unverifiable.
639
- `;var ve=`# Visual verification workflow
975
+ `;var ye=`# Visual verification workflow
640
976
 
641
977
  Use this workflow when UI changes can be run locally. Flow execution may create visual evidence; Flow review usually assesses recorded evidence because the reviewer is read-only.
642
978
 
@@ -676,7 +1012,7 @@ Record the reason and use the strongest available substitute:
676
1012
  - code inspection against existing component patterns.
677
1013
 
678
1014
  Do not claim visual polish was verified if no visual artifact was inspected.
679
- `;var we=`---
1015
+ `;var be=`---
680
1016
  name: flow-ui-quality
681
1017
  description: Flow guidance for UX/UI design, frontend polish, visual quality review, responsive and accessible interfaces, and avoiding generic AI-generated UI. Use when planning, executing, or reviewing frontend pages, components, dashboards, visual redesigns, interaction states, screenshots, or browser-verified UI work.
682
1018
  ---
@@ -721,13 +1057,13 @@ Approve only when the interface is both useful and inspectable:
721
1057
  - Screenshot/browser evidence supports the claim whenever feasible.
722
1058
 
723
1059
  Never approve a UI change based only on code shape. If users will judge it visually, Flow evidence should include visual inspection.
724
- `;var ye=[{name:"flow",files:[{relativePath:"SKILL.md",content:ne},{relativePath:"references/recovery-playbook.md",content:re},{relativePath:"references/parallel-orchestration.md",content:ae}]},{name:"flow-plan",files:[{relativePath:"SKILL.md",content:de},{relativePath:"references/planning-examples.md",content:ce},{relativePath:"references/parallel-discovery.md",content:le}]},{name:"flow-run",files:[{relativePath:"SKILL.md",content:he},{relativePath:"references/validation-rubric.md",content:me},{relativePath:"references/audit-rubric.md",content:fe}]},{name:"flow-review",files:[{relativePath:"SKILL.md",content:pe},{relativePath:"references/review-rubric.md",content:ue}]},{name:"flow-deslop",files:[{relativePath:"SKILL.md",content:se},{relativePath:"references/smell-rubric.md",content:ie},{relativePath:"references/refactor-workflow.md",content:oe}]},{name:"flow-ui-quality",files:[{relativePath:"SKILL.md",content:we},{relativePath:"references/ui-rubric.md",content:ge},{relativePath:"references/visual-verification.md",content:ve}]}];var Et=".flow-skill-version";function xe(){return process.env.HOME??process.env.USERPROFILE??""}function Ot(e=xe()){return I(e,".config","opencode","skills")}function Re(e){return St("sha256").update(e).digest("hex")}function be(e,a){return[`version=${a}`,...e.files.map((t)=>`file=${t.relativePath} sha256=${Re(t.content)}`),""].join(`
725
- `)}async function V(e){try{return await It(e,"utf8")}catch(a){if(a.code==="ENOENT")return null;throw a}}function jt(e){let a=new Map;if(!e)return a;for(let t of e.split(/\r?\n/)){let r=/^file=(.+) sha256=([a-f0-9]{64})$/.exec(t)??/^file=(.+)=sha256:([a-f0-9]{64})$/.exec(t);if(r?.[1]&&r[2])a.set(r[1],r[2]);let n=/^hash=sha256:([a-f0-9]{64})$/.exec(t);if(n?.[1]&&!a.has("SKILL.md"))a.set("SKILL.md",n[1])}return a}function ke(e,a){let t=Ct(I(e,...a.split("/")));if(t!==e&&t.startsWith(`${e}${Tt}`))return t;throw Error(`Unsafe skill file path '${a}'.`)}async function qt(e,a,t){let r=I(t,e.name),n=I(r,Et),i=await V(n),s=jt(i);if(await V(I(r,"SKILL.md"))!==null&&i===null)return{name:e.name,action:"skipped_foreign"};let m=!1,ee=!1;for(let x of e.files){let _=ke(r,x.relativePath),C=await V(_);if(C===x.content)continue;m=!0;let te=s.get(x.relativePath);if(C!==null&&(te?Re(C)!==te:i!==null))await M(`${_}.backup`,C,"utf8"),ee=!0}if(!m&&i===be(e,a))return{name:e.name,action:"unchanged"};let st=i!==null;for(let x of e.files){let _=ke(r,x.relativePath);await _t(At(_),{recursive:!0}),await M(_,x.content,"utf8")}return await M(n,be(e,a),"utf8"),{name:e.name,action:ee?"updated_with_backup":st?"updated":"installed"}}function Fe(){if(process.env.npm_package_version)return process.env.npm_package_version;try{let e=Pt(import.meta.url);for(let a of["../package.json","../../package.json"])try{let t=e(a);if(t.version)return t.version}catch{}}catch{}return"0.0.0"}async function Ut(e,a=xe()){let t=Ot(a);return Promise.all(ye.map((r)=>qt(r,e,t)))}async function Se(e,a){try{let r=(await Ut(e)).filter((n)=>n.action!=="unchanged"&&n.action!=="skipped_foreign");if(r.length>0)a("info",`Flow synced skills (${r.map((n)=>`${n.name}:${n.action}`).join(", ")}). Restart OpenCode if skills were just installed.`)}catch(t){a("warn",`Flow skill sync failed: ${t instanceof Error?t.message:String(t)}`)}}import{randomUUID as Vt}from"node:crypto";import{mkdir as U,open as Te,readFile as je,rename as Jt,rm as N,writeFile as Ee}from"node:fs/promises";import{homedir as Bt}from"node:os";import{dirname as Oe,isAbsolute as gr,join as R,parse as Kt,resolve as qe}from"node:path";import{setTimeout as Gt}from"node:timers/promises";function Nt(e){let a=[],t=0;while(t<e.length){let r=e[t];if(r==="{"){a.push({isObject:!0,keys:new Set,awaitingKey:!0}),t+=1;continue}if(r==="["){a.push({isObject:!1,keys:new Set,awaitingKey:!1}),t+=1;continue}if(r==="}"||r==="]"){a.pop(),t+=1;continue}if(r===","){let n=a.at(-1);if(n?.isObject)n.awaitingKey=!0;t+=1;continue}if(r===":"){let n=a.at(-1);if(n?.isObject)n.awaitingKey=!1;t+=1;continue}if(r==='"'){let n=t+1;while(n<e.length){if(e[n]==="\\"){n+=2;continue}if(e[n]==='"')break;n+=1}let i=a.at(-1);if(i?.isObject&&i.awaitingKey){let s=JSON.parse(e.slice(t,n+1));if(i.keys.has(s))return s;i.keys.add(s)}t=n+1;continue}t+=1}return null}function _e(e,a){if(e.trim().length===0)return{ok:!1,error:`${a} is empty.`};let t;try{t=JSON.parse(e)}catch(n){return{ok:!1,error:n instanceof Error?`${a} is not valid JSON: ${n.message}`:`${a} is not valid JSON.`}}if(t===null||typeof t!=="object"||Array.isArray(t))return{ok:!1,error:`${a} must be a JSON object.`};let r=Nt(e);if(r)return{ok:!1,error:`${a} has duplicate key '${r}'.`};return{ok:!0,value:t}}import{z as o}from"zod";var v=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,P="Feature ids must be lowercase kebab-case",Ie=o.enum(["pending","in_progress","completed","blocked"]),$t=o.enum(["planning","ready","running","blocked","completed"]),Dt=o.enum(["passed","failed"]),zt=o.enum(["passed","failed"]),J=o.enum(["targeted","broad"]),H=o.enum(["broad","detailed"]),Wt=o.object({summary:o.string().min(1),severity:o.enum(["blocking","advisory"]).default("blocking")}).strict(),T=o.object({status:Dt,summary:o.string().min(1),blockingFindings:o.array(Wt).default([])}).strict(),B=T.extend({reviewDepth:H}).strict(),K=o.object({command:o.string().min(1),status:zt,summary:o.string().min(1)}).strict(),G=o.object({path:o.string().min(1)}).strict(),Pe=o.object({id:o.string().regex(v,P),title:o.string().min(1),summary:o.string().min(1),status:Ie.default("pending"),targets:o.array(o.string().min(1)).default([]),validation:o.array(o.string().min(1)).default([]),dependsOn:o.array(o.string().regex(v)).default([])}).strict(),Ae=o.object({summary:o.string().min(1),overview:o.string().min(1),requirements:o.array(o.string().min(1)).default([]),decisions:o.array(o.string().min(1)).default([]),finalReviewPolicy:H.default("detailed"),features:o.array(Pe).min(1)}).strict(),E=Ae.omit({features:!0}).extend({finalReviewPolicy:H.optional(),features:o.array(Pe.omit({status:!0}).extend({status:Ie.optional(),targets:o.array(o.string().min(1)).optional(),validation:o.array(o.string().min(1)).optional(),dependsOn:o.array(o.string().regex(v)).optional()}).strict()).min(1)}),Ce=o.object({kind:o.enum(["completed","blocked","needs_input","replan_required"]).default("completed"),summary:o.string().min(1).optional(),resolutionHint:o.string().min(1).optional()}).strict(),Lt=o.object({kind:o.enum(["blocked","needs_input","replan_required"]).default("needs_input"),summary:o.string().min(1),resolutionHint:o.string().min(1).optional()}).strict(),O=o.discriminatedUnion("status",[o.object({status:o.literal("ok"),featureId:o.string().regex(v,P),summary:o.string().min(1),artifactsChanged:o.array(G).default([]),validationRun:o.array(K).default([]),validationScope:J,featureReview:T,finalReview:B.optional(),outcome:Ce.optional()}).strict(),o.object({status:o.literal("needs_input"),featureId:o.string().regex(v,P),summary:o.string().min(1),artifactsChanged:o.array(G).default([]),validationRun:o.array(K).default([]),validationScope:J.optional(),featureReview:T.optional(),finalReview:B.optional(),outcome:Lt}).strict()]).superRefine((e,a)=>{if(e.status==="ok"&&e.outcome?.kind&&e.outcome.kind!=="completed")a.addIssue({code:"custom",path:["outcome","kind"],message:'ok worker results must use outcome.kind "completed".'})}),Mt=o.object({featureId:o.string().regex(v,P),status:o.enum(["completed","blocked","needs_input"]),summary:o.string().min(1),recordedAt:o.string().min(1),artifactsChanged:o.array(G).default([]),validationRun:o.array(K).default([]),validationScope:J.optional(),featureReview:T.optional(),finalReview:B.optional(),outcome:Ce.optional()}).strict(),j=o.object({version:o.literal(2),id:o.string().min(1),goal:o.string().min(1),status:$t,approval:o.enum(["pending","approved"]),plan:Ae.nullable(),activeFeatureId:o.string().regex(v,P).nullable(),history:o.array(Mt).default([]),closure:o.object({kind:o.enum(["completed","deferred","abandoned"]),summary:o.string().min(1),recordedAt:o.string().min(1)}).strict().nullable(),lastError:o.object({tool:o.string().min(1),summary:o.string().min(1),recovery:o.string().min(1).optional(),recordedAt:o.string().min(1)}).strict().nullable().default(null),timestamps:o.object({createdAt:o.string().min(1),updatedAt:o.string().min(1),completedAt:o.string().min(1).nullable()}).strict()}).strict();class $ extends Error{code="INVALID_FLOW_WORKSPACE_ROOT";constructor(e){super(e);this.name="InvalidFlowWorkspaceRootError"}}function X(e){let a=e?.trim();if(!a)return null;let t=qe(a);return Kt(t).root===t?null:t}function D(e){let a=X(e);if(!a)throw new $("Flow requires a non-root workspace path.");if(a===qe(process.env.HOME??Bt()))throw new $("Flow refuses to use $HOME itself as a mutable workspace root.");return a}function Ue(e){let a=X(e.worktree)??X(e.directory);if(!a)throw new $("Flow could not resolve a workspace root from tool context.");return D(a)}function z(e){return R(e,".flow")}function Y(e){return R(z(e),"session.json")}function Ne(e){return R(z(e),"history")}function Ht(e,a){if(!/^[a-zA-Z0-9_-]+$/.test(a))throw Error("Invalid session id.");return R(Ne(e),`${a}.json`)}async function $e(e,a){await U(Oe(e),{recursive:!0});let t=`${e}.${process.pid}.${Vt()}.tmp`,r=await Te(t,"w");try{await r.writeFile(a,"utf8"),await r.sync()}catch(i){throw await r.close(),await N(t,{force:!0}),i}await r.close();try{await Jt(t,e)}catch(i){throw await N(t,{force:!0}),i}let n=await Te(Oe(e),"r");try{await n.sync()}finally{await n.close()}}var q=new Map,Xt=30000,Yt=25;async function Zt(e){let a=z(e),t=R(a,"session.lock"),r=Date.now();while(!0)try{return await U(t,{recursive:!1}),async()=>{await N(t,{recursive:!0,force:!0})}}catch(n){let i=n.code;if(i==="ENOENT"){await U(a,{recursive:!0});continue}if(i!=="EEXIST")throw n;if(Date.now()-r>Xt)throw Error(`Timed out waiting for Flow session lock at ${t}.`);await Gt(Yt)}}async function De(e,a){let t=q.get(e)??Promise.resolve(),r=()=>{},n=new Promise((d)=>{r=d}),i=t.catch(()=>{return}).then(()=>n);q.set(e,i);let s=null;try{return await t.catch(()=>{return}),s=await Zt(e),await a()}finally{try{await s?.()}finally{if(r(),q.get(e)===i)q.delete(e)}}}async function A(e){let a=D(e),t;try{t=await je(Y(a),"utf8")}catch(n){if(n.code==="ENOENT")return null;throw n}let r=_e(t,"Flow session file");if(!r.ok)throw Error(r.error);return j.parse(r.value)}async function w(e,a){let t=D(e),r=j.parse(a);return await $e(Y(t),`${JSON.stringify(r,null,2)}
726
- `),await ze(t),r}async function Z(e,a){let t=D(e);await U(Ne(t),{recursive:!0}),await $e(Ht(t,a.id),`${JSON.stringify(j.parse(a),null,2)}
727
- `),await N(Y(t),{force:!0}),await ze(t)}async function ze(e){let a=R(z(e),".gitignore");try{let t=await je(a,"utf8");if(t.includes("session.lock"))return;await Ee(a,`${t.trimEnd()}
1060
+ `;var ke=[{name:"flow",files:[{relativePath:"SKILL.md",content:ie},{relativePath:"references/recovery-playbook.md",content:re},{relativePath:"references/parallel-orchestration.md",content:ne},{relativePath:"references/handoff-format.md",content:ae},{relativePath:"references/verification-gates.md",content:oe}]},{name:"flow-plan",files:[{relativePath:"SKILL.md",content:pe},{relativePath:"references/planning-examples.md",content:ue},{relativePath:"references/parallel-discovery.md",content:de}]},{name:"flow-run",files:[{relativePath:"SKILL.md",content:we},{relativePath:"references/validation-rubric.md",content:ge},{relativePath:"references/audit-rubric.md",content:he}]},{name:"flow-review",files:[{relativePath:"SKILL.md",content:me},{relativePath:"references/review-rubric.md",content:fe}]},{name:"flow-deslop",files:[{relativePath:"SKILL.md",content:ce},{relativePath:"references/smell-rubric.md",content:le},{relativePath:"references/refactor-workflow.md",content:se}]},{name:"flow-ui-quality",files:[{relativePath:"SKILL.md",content:be},{relativePath:"references/ui-rubric.md",content:ve},{relativePath:"references/visual-verification.md",content:ye}]}];var qt=".flow-skill-version";function Re(){return process.env.HOME??process.env.USERPROFILE??""}function Nt(e=Re()){return I(e,".config","opencode","skills")}function Se(e){return At("sha256").update(e).digest("hex")}function xe(e,a){return[`version=${a}`,...e.files.map((t)=>`file=${t.relativePath} sha256=${Se(t.content)}`),""].join(`
1061
+ `)}async function V(e){try{return await Tt(e,"utf8")}catch(a){if(a.code==="ENOENT")return null;throw a}}function Dt(e){let a=new Map;if(!e)return a;for(let t of e.split(/\r?\n/)){let n=/^file=(.+) sha256=([a-f0-9]{64})$/.exec(t)??/^file=(.+)=sha256:([a-f0-9]{64})$/.exec(t);if(n?.[1]&&n[2])a.set(n[1],n[2]);let r=/^hash=sha256:([a-f0-9]{64})$/.exec(t);if(r?.[1]&&!a.has("SKILL.md"))a.set("SKILL.md",r[1])}return a}function Fe(e,a){let t=jt(I(e,...a.split("/")));if(t!==e&&t.startsWith(`${e}${Ot}`))return t;throw Error(`Unsafe skill file path '${a}'.`)}async function $t(e,a,t){let n=I(t,e.name),r=I(n,qt),i=await V(r),s=Dt(i);if(await V(I(n,"SKILL.md"))!==null&&i===null)return{name:e.name,action:"skipped_foreign"};let m=!1,ee=!1;for(let x of e.files){let _=Fe(n,x.relativePath),P=await V(_);if(P===x.content)continue;m=!0;let te=s.get(x.relativePath);if(P!==null&&(te?Se(P)!==te:i!==null))await M(`${_}.backup`,P,"utf8"),ee=!0}if(!m&&i===xe(e,a))return{name:e.name,action:"unchanged"};let ct=i!==null;for(let x of e.files){let _=Fe(n,x.relativePath);await Pt(Ut(_),{recursive:!0}),await M(_,x.content,"utf8")}return await M(r,xe(e,a),"utf8"),{name:e.name,action:ee?"updated_with_backup":ct?"updated":"installed"}}function _e(){if(process.env.npm_package_version)return process.env.npm_package_version;try{let e=Et(import.meta.url);for(let a of["../package.json","../../package.json"])try{let t=e(a);if(t.version)return t.version}catch{}}catch{}return"0.0.0"}async function Wt(e,a=Re()){let t=Nt(a);return Promise.all(ke.map((n)=>$t(n,e,t)))}async function Ie(e,a){try{let n=(await Wt(e)).filter((r)=>r.action!=="unchanged"&&r.action!=="skipped_foreign");if(n.length>0)a("info",`Flow synced skills (${n.map((r)=>`${r.name}:${r.action}`).join(", ")}). Restart OpenCode if skills were just installed.`)}catch(t){a("warn",`Flow skill sync failed: ${t instanceof Error?t.message:String(t)}`)}}import{randomUUID as Kt}from"node:crypto";import{mkdir as q,open as Ue,readFile as qe,rename as Ht,rm as N,writeFile as je}from"node:fs/promises";import{homedir as Xt}from"node:os";import{dirname as Oe,isAbsolute as Sn,join as F,parse as Yt,resolve as Ne}from"node:path";import{setTimeout as Zt}from"node:timers/promises";function zt(e){let a=[],t=0;while(t<e.length){let n=e[t];if(n==="{"){a.push({isObject:!0,keys:new Set,awaitingKey:!0}),t+=1;continue}if(n==="["){a.push({isObject:!1,keys:new Set,awaitingKey:!1}),t+=1;continue}if(n==="}"||n==="]"){a.pop(),t+=1;continue}if(n===","){let r=a.at(-1);if(r?.isObject)r.awaitingKey=!0;t+=1;continue}if(n===":"){let r=a.at(-1);if(r?.isObject)r.awaitingKey=!1;t+=1;continue}if(n==='"'){let r=t+1;while(r<e.length){if(e[r]==="\\"){r+=2;continue}if(e[r]==='"')break;r+=1}let i=a.at(-1);if(i?.isObject&&i.awaitingKey){let s=JSON.parse(e.slice(t,r+1));if(i.keys.has(s))return s;i.keys.add(s)}t=r+1;continue}t+=1}return null}function Ce(e,a){if(e.trim().length===0)return{ok:!1,error:`${a} is empty.`};let t;try{t=JSON.parse(e)}catch(r){return{ok:!1,error:r instanceof Error?`${a} is not valid JSON: ${r.message}`:`${a} is not valid JSON.`}}if(t===null||typeof t!=="object"||Array.isArray(t))return{ok:!1,error:`${a} must be a JSON object.`};let n=zt(e);if(n)return{ok:!1,error:`${a} has duplicate key '${n}'.`};return{ok:!0,value:t}}import{z as o}from"zod";var w=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,C="Feature ids must be lowercase kebab-case",Ae=o.enum(["pending","in_progress","completed","blocked"]),Lt=o.enum(["planning","ready","running","blocked","completed"]),Mt=o.enum(["passed","failed"]),Vt=o.enum(["passed","failed"]),B=o.enum(["targeted","broad"]),H=o.enum(["broad","detailed"]),Bt=o.object({summary:o.string().min(1),severity:o.enum(["blocking","advisory"]).default("blocking")}).strict(),T=o.object({status:Mt,summary:o.string().min(1),blockingFindings:o.array(Bt).default([])}).strict(),G=T.extend({reviewDepth:H}).strict(),J=o.object({command:o.string().min(1),status:Vt,summary:o.string().min(1)}).strict(),K=o.object({path:o.string().min(1)}).strict(),Pe=o.object({id:o.string().regex(w,C),title:o.string().min(1),summary:o.string().min(1),status:Ae.default("pending"),targets:o.array(o.string().min(1)).default([]),validation:o.array(o.string().min(1)).default([]),dependsOn:o.array(o.string().regex(w)).default([])}).strict(),Te=o.object({summary:o.string().min(1),overview:o.string().min(1),requirements:o.array(o.string().min(1)).default([]),decisions:o.array(o.string().min(1)).default([]),finalReviewPolicy:H.default("detailed"),features:o.array(Pe).min(1)}).strict(),E=Te.omit({features:!0}).extend({finalReviewPolicy:H.optional(),features:o.array(Pe.omit({status:!0}).extend({status:Ae.optional(),targets:o.array(o.string().min(1)).optional(),validation:o.array(o.string().min(1)).optional(),dependsOn:o.array(o.string().regex(w)).optional()}).strict()).min(1)}),Ee=o.object({kind:o.enum(["completed","blocked","needs_input","replan_required"]).default("completed"),summary:o.string().min(1).optional(),resolutionHint:o.string().min(1).optional()}).strict(),Gt=o.object({kind:o.enum(["blocked","needs_input","replan_required"]).default("needs_input"),summary:o.string().min(1),resolutionHint:o.string().min(1).optional()}).strict(),U=o.discriminatedUnion("status",[o.object({status:o.literal("ok"),featureId:o.string().regex(w,C),summary:o.string().min(1),artifactsChanged:o.array(K).default([]),validationRun:o.array(J).default([]),validationScope:B,featureReview:T,finalReview:G.optional(),outcome:Ee.optional()}).strict(),o.object({status:o.literal("needs_input"),featureId:o.string().regex(w,C),summary:o.string().min(1),artifactsChanged:o.array(K).default([]),validationRun:o.array(J).default([]),validationScope:B.optional(),featureReview:T.optional(),finalReview:G.optional(),outcome:Gt}).strict()]).superRefine((e,a)=>{if(e.status==="ok"&&e.outcome?.kind&&e.outcome.kind!=="completed")a.addIssue({code:"custom",path:["outcome","kind"],message:'ok worker results must use outcome.kind "completed".'})}),Jt=o.object({featureId:o.string().regex(w,C),status:o.enum(["completed","blocked","needs_input"]),summary:o.string().min(1),recordedAt:o.string().min(1),artifactsChanged:o.array(K).default([]),validationRun:o.array(J).default([]),validationScope:B.optional(),featureReview:T.optional(),finalReview:G.optional(),outcome:Ee.optional()}).strict(),j=o.object({version:o.literal(2),id:o.string().min(1),goal:o.string().min(1),status:Lt,approval:o.enum(["pending","approved"]),plan:Te.nullable(),activeFeatureId:o.string().regex(w,C).nullable(),history:o.array(Jt).default([]),closure:o.object({kind:o.enum(["completed","deferred","abandoned"]),summary:o.string().min(1),recordedAt:o.string().min(1)}).strict().nullable(),lastError:o.object({tool:o.string().min(1),summary:o.string().min(1),recovery:o.string().min(1).optional(),recordedAt:o.string().min(1)}).strict().nullable().default(null),timestamps:o.object({createdAt:o.string().min(1),updatedAt:o.string().min(1),completedAt:o.string().min(1).nullable()}).strict()}).strict();class D extends Error{code="INVALID_FLOW_WORKSPACE_ROOT";constructor(e){super(e);this.name="InvalidFlowWorkspaceRootError"}}function X(e){let a=e?.trim();if(!a)return null;let t=Ne(a);return Yt(t).root===t?null:t}function $(e){let a=X(e);if(!a)throw new D("Flow requires a non-root workspace path.");if(a===Ne(process.env.HOME??Xt()))throw new D("Flow refuses to use $HOME itself as a mutable workspace root.");return a}function De(e){let a=X(e.worktree)??X(e.directory);if(!a)throw new D("Flow could not resolve a workspace root from tool context.");return $(a)}function W(e){return F(e,".flow")}function Y(e){return F(W(e),"session.json")}function $e(e){return F(W(e),"history")}function Qt(e,a){if(!/^[a-zA-Z0-9_-]+$/.test(a))throw Error("Invalid session id.");return F($e(e),`${a}.json`)}async function We(e,a){await q(Oe(e),{recursive:!0});let t=`${e}.${process.pid}.${Kt()}.tmp`,n=await Ue(t,"w");try{await n.writeFile(a,"utf8"),await n.sync()}catch(i){throw await n.close(),await N(t,{force:!0}),i}await n.close();try{await Ht(t,e)}catch(i){throw await N(t,{force:!0}),i}let r=await Ue(Oe(e),"r");try{await r.sync()}finally{await r.close()}}var O=new Map,ea=30000,ta=25;async function aa(e){let a=W(e),t=F(a,"session.lock"),n=Date.now();while(!0)try{return await q(t,{recursive:!1}),async()=>{await N(t,{recursive:!0,force:!0})}}catch(r){let i=r.code;if(i==="ENOENT"){await q(a,{recursive:!0});continue}if(i!=="EEXIST")throw r;if(Date.now()-n>ea)throw Error(`Timed out waiting for Flow session lock at ${t}.`);await Zt(ta)}}async function ze(e,a){let t=O.get(e)??Promise.resolve(),n=()=>{},r=new Promise((d)=>{n=d}),i=t.catch(()=>{return}).then(()=>r);O.set(e,i);let s=null;try{return await t.catch(()=>{return}),s=await aa(e),await a()}finally{try{await s?.()}finally{if(n(),O.get(e)===i)O.delete(e)}}}async function A(e){let a=$(e),t;try{t=await qe(Y(a),"utf8")}catch(r){if(r.code==="ENOENT")return null;throw r}let n=Ce(t,"Flow session file");if(!n.ok)throw Error(n.error);return j.parse(n.value)}async function v(e,a){let t=$(e),n=j.parse(a);return await We(Y(t),`${JSON.stringify(n,null,2)}
1062
+ `),await Le(t),n}async function Z(e,a){let t=$(e);await q($e(t),{recursive:!0}),await We(Qt(t,a.id),`${JSON.stringify(j.parse(a),null,2)}
1063
+ `),await N(Y(t),{force:!0}),await Le(t)}async function Le(e){let a=F(W(e),".gitignore");try{let t=await qe(a,"utf8");if(t.includes("session.lock"))return;await je(a,`${t.trimEnd()}
728
1064
  session.lock/
729
- `,"utf8")}catch(t){if(t.code!=="ENOENT")throw t;await Ee(a,`session.lock/
730
- `,"utf8")}}var Qt={"flow-reviewer":{mode:"subagent",hidden:!0,description:"Internal read-only reviewer for Flow-guided work.",prompt:"Load `flow-review`. Inspect the current work read-only, report findings, and do not mutate Flow state.",permission:{edit:"deny",bash:"deny",task:{"*":"deny"},"flow_*":"deny",flow_status:"allow"}}},ea={"flow-auto":{description:"Drive Flow skills against the minimal runtime ledger",template:"Load the `flow` skill and drive the Flow loop until completion or a real blocker: $ARGUMENTS"},"flow-plan":{description:"Create or approve a Flow plan",template:"Load the `flow-plan` skill and plan: $ARGUMENTS"},"flow-run":{description:"Run one approved Flow feature",template:"Load the `flow-run` skill and execute the next approved feature. $ARGUMENTS"},"flow-review":{description:"Run a read-only Flow review",agent:"flow-reviewer",subtask:!0,template:"Load the `flow-review` skill and review: $ARGUMENTS"},"flow-status":{description:"Inspect the active Flow session",template:"Call flow_status and report the session state and next action."}};function ta(){return{agent:Object.fromEntries(Object.entries(Qt).map(([e,a])=>{let t=a.permission?{...a.permission,...a.permission.task?{task:{...a.permission.task}}:{}}:void 0;return[e,{...a,...t?{permission:t}:{}}]})),command:Object.fromEntries(Object.entries(ea).map(([e,a])=>[e,{...a}]))}}function We(e){let a=ta();e.agent={...e.agent??{},...a.agent},e.command={...e.command??{},...a.command}}function Le(e){return async(a)=>{We(a)}}function W(e){let a=e?.client,t=a?.app?.log;return(r,n)=>{if(typeof t!=="function")return;try{t.call(a?.app,{body:{service:"opencode-plugin-flow",level:r,message:n}})}catch{}}}import{z as p}from"zod";import{randomUUID as ra}from"node:crypto";var aa=null;function h(){return aa?.()??new Date().toISOString()}function u(e){return{ok:!0,value:e}}function l(e,a,t){return{ok:!1,message:e,...a?{recovery:a}:{},...t?{session:t}:{}}}function na(e){let a=E.parse(e);return{summary:a.summary,overview:a.overview,requirements:a.requirements??[],decisions:a.decisions??[],finalReviewPolicy:a.finalReviewPolicy??"detailed",features:a.features.map((t)=>({id:t.id,title:t.title,summary:t.summary,status:"pending",targets:t.targets??[],validation:t.validation??[],dependsOn:t.dependsOn??[]}))}}function oa(e){let a=new Set;for(let s of e.features){if(a.has(s.id))return`Duplicate feature id '${s.id}'.`;a.add(s.id)}for(let s of e.features)for(let d of s.dependsOn){if(!a.has(d))return`Feature '${s.id}' depends on unknown feature '${d}'.`;if(d===s.id)return`Feature '${s.id}' cannot depend on itself.`}let t=new Set,r=new Set,n=new Map(e.features.map((s)=>[s.id,s]));function i(s){if(r.has(s))return!1;if(t.has(s))return!0;t.add(s);for(let d of n.get(s)?.dependsOn??[])if(i(d))return!0;return t.delete(s),r.add(s),!1}return e.features.some((s)=>i(s.id))?"Feature dependencies contain a cycle.":null}function L(e){let a=h();return{version:2,id:ra(),goal:e,status:"planning",approval:"pending",plan:null,activeFeatureId:null,history:[],closure:null,lastError:null,timestamps:{createdAt:a,updatedAt:a,completedAt:null}}}function y(e){return{...e,timestamps:{...e.timestamps,updatedAt:h()}}}function Je(e,a){if(e.approval==="approved"||e.status!=="planning")return l("Approved plans cannot be changed. Reset or start a new session.");let t=na(a),r=oa(t);if(r)return l(r);return u(y({...e,status:"planning",approval:"pending",plan:t,activeFeatureId:null,history:[],closure:null,lastError:null,timestamps:{...e.timestamps,completedAt:null}}))}function Be(e){if(!e.plan)return l("There is no draft plan to approve.");if(e.approval==="approved"&&e.status==="ready")return u(e);if(e.status!=="planning")return l("Only planning sessions can be approved.");return u(y({...e,approval:"approved",status:"ready"}))}function Me(e,a){return e.status==="pending"&&e.dependsOn.every((t)=>a.has(t))}function ia(e,a){let t=new Set(e.filter((i)=>i.status==="completed").map((i)=>i.id)),r=new Map(e.map((i)=>[i.id,i]));if(a){let i=r.get(a);if(!i)return l(`Feature '${a}' is not in the plan.`);if(i.status==="completed")return l(`Feature '${a}' is already completed.`);if(i.status!=="pending")return l(`Feature '${a}' is ${i.status} and must be reset before it can run.`);if(!Me(i,t))return l(`Feature '${a}' has incomplete dependencies.`);return u(i)}let n=e.find((i)=>Me(i,t));return n?u(n):l("No runnable feature is available.")}function Q(e,a,t){return e.map((r)=>r.id===a?{...r,status:t}:r.status==="in_progress"&&t==="in_progress"?{...r,status:"pending"}:r)}function Ke(e,a){if(e.status==="completed")return l("This Flow session is already completed.");if(!e.plan||e.approval!=="approved")return l("There is no approved plan to run.");if(e.status==="blocked")return l("Blocked features must be reset before rerun.","Call flow_feature_reset for the blocked feature, then start it again.");if(e.activeFeatureId){if(!a||a===e.activeFeatureId){let i=e.plan.features.find((s)=>s.id===e.activeFeatureId);if(i)return u({session:e,feature:i})}return l(`Feature '${e.activeFeatureId}' is already in progress.`)}let t=ia(e.plan.features,a);if(!t.ok)return t;let r={...e.plan,features:Q(e.plan.features,t.value.id,"in_progress")},n=y({...e,status:"running",plan:r,activeFeatureId:t.value.id,lastError:null});return u({session:n,feature:n.plan?.features.find((i)=>i.id===t.value.id)??t.value})}function Ve(e){return e.status==="passed"&&e.blockingFindings.length===0}function sa(e,a){if(!e.plan)return!1;return e.plan.features.every((t)=>t.id===a||t.status==="completed")}function g(e,a,t,r){return l(t,r,{...e,lastError:{tool:a,summary:t,recovery:r,recordedAt:h()}})}function la(e,a){let t=sa(e,a.featureId);if(a.validationRun.length===0)return g(e,"flow_feature_complete","Completion requires recorded validation evidence.","Run the targeted or broad validation command and record the result.");if(!a.validationRun.every((r)=>r.status==="passed"))return g(e,"flow_feature_complete","Completion requires all recorded validation to pass.","Fix failures, rerun validation, then complete the feature.");if(!t&&a.validationScope!=="targeted")return g(e,"flow_feature_complete","Non-final feature completion requires targeted validation.","Record validationScope: targeted for ordinary feature completion.");if(t&&a.validationScope!=="broad")return g(e,"flow_feature_complete","Final feature completion requires broad validation.","Run the project-level gate and record validationScope: broad.");if(!Ve(a.featureReview))return g(e,"flow_feature_complete","Completion requires a passing featureReview with no blocking findings.","Fix or acknowledge the review findings before completing.");if(t){if(!a.finalReview)return g(e,"flow_feature_complete","Final feature completion requires a finalReview.","Run final review and include the finalReview payload.");if(!Ve(a.finalReview))return g(e,"flow_feature_complete","Final completion requires a passing finalReview.","Resolve final review findings before completing the session.");let r=e.plan?.finalReviewPolicy??"detailed";if(a.finalReview.reviewDepth!==r)return g(e,"flow_feature_complete",`Final review depth must match the plan policy '${r}'.`,"Record a finalReview whose reviewDepth matches the approved plan.")}return u(void 0)}function Ge(e,a){if(!e.plan||e.status!=="running"||!e.activeFeatureId)return l("No feature is currently running.");let t=O.parse(a);if(t.featureId!==e.activeFeatureId)return l(`Worker result feature '${t.featureId}' does not match active feature '${e.activeFeatureId}'.`);if(t.status==="needs_input"){let m={featureId:t.featureId,status:"needs_input",summary:t.summary,recordedAt:h(),artifactsChanged:t.artifactsChanged,validationRun:t.validationRun,validationScope:t.validationScope,featureReview:t.featureReview,finalReview:t.finalReview,outcome:t.outcome};return u(y({...e,status:"blocked",activeFeatureId:null,plan:{...e.plan,features:Q(e.plan.features,t.featureId,"blocked")},history:[...e.history,m]}))}let r=la(e,t);if(!r.ok)return r;let n={featureId:t.featureId,status:"completed",summary:t.summary,recordedAt:h(),artifactsChanged:t.artifactsChanged,validationRun:t.validationRun,validationScope:t.validationScope,featureReview:t.featureReview,finalReview:t.finalReview,outcome:t.outcome},i=Q(e.plan.features,t.featureId,"completed"),s=i.every((m)=>m.status==="completed"),d=h();return u(y({...e,status:s?"completed":"ready",activeFeatureId:null,plan:{...e.plan,features:i},history:[...e.history,n],closure:s?{kind:"completed",summary:t.summary,recordedAt:d}:null,lastError:null,timestamps:{...e.timestamps,completedAt:s?d:e.timestamps.completedAt}}))}function ca(e,a){let t=new Set([a]),r=!0;while(r){r=!1;for(let n of e){if(t.has(n.id))continue;if(n.dependsOn.some((i)=>t.has(i)))t.add(n.id),r=!0}}return t}function He(e,a){if(!e.plan)return l("There is no active plan to reset.");if(!e.plan.features.some((s)=>s.id===a))return l(`Feature '${a}' is not in the plan.`);let t=ca(e.plan.features,a),r=e.activeFeatureId&&t.has(e.activeFeatureId)?null:e.activeFeatureId,n=e.plan.features.map((s)=>t.has(s.id)?{...s,status:"pending"}:s),i=e.approval!=="approved"?"planning":r?"running":n.some((s)=>s.status==="blocked")?"blocked":"ready";return u(y({...e,status:i,activeFeatureId:r,plan:{...e.plan,features:n},closure:null,lastError:null,timestamps:{...e.timestamps,completedAt:null}}))}function Xe(e,a,t){if(a==="completed"){if(!e.plan||e.approval!=="approved")return l("Cannot close a Flow session as completed without an approved plan.");let n=e.plan.features.filter((i)=>i.status!=="completed");if(n.length>0)return l("Cannot close a Flow session as completed with unfinished features.",`Unfinished features: ${n.map((i)=>i.id).join(", ")}`);if(e.status!=="completed")return l("Cannot close a Flow session as completed before final completion gates pass.")}let r=h();return u(y({...e,status:a==="completed"?"completed":e.status,activeFeatureId:null,closure:{kind:a,summary:t??`Session closed as ${a}.`,recordedAt:r},timestamps:{...e.timestamps,completedAt:a==="completed"?r:e.timestamps.completedAt}}))}function b(e){if(!e)return{status:"missing_session",summary:"No active Flow session exists.",nextAction:"Start with /flow-plan <goal>."};let a=e.plan?.features??[],t=a.filter((s)=>s.status==="completed"),r=e.history.at(-1)??null,n=e.status==="blocked"?r:null,i=e.activeFeatureId?a.find((s)=>s.id===e.activeFeatureId):null;return{status:e.status,summary:e.closure?.summary??e.lastError?.summary??n?.summary??e.plan?.summary??"Flow session is active.",nextAction:da(e),session:{id:e.id,goal:e.goal,status:e.status,approval:e.approval,activeFeature:i??null,progress:{completed:t.length,total:a.length},features:a,closure:e.closure,lastError:e.lastError,latestHistoryEntry:r,historyCount:e.history.length,timestamps:e.timestamps}}}function da(e){if(!e.plan)return"Save a plan with flow_plan_save.";if(e.approval!=="approved")return"Approve the plan.";if(e.status==="ready")return"Start the next feature.";if(e.status==="running")return"Complete or reset the active feature.";if(e.status==="blocked")return"Reset the blocked feature or close the session.";if(e.status==="completed")return"Close/archive the session or start a new goal.";return"Inspect session state."}var ua=p.object({goal:p.string().trim().min(1).optional(),plan:E.optional()}).strict(),pa=p.object({featureId:p.string().min(1).optional()}).strict(),fa=p.object({featureId:p.string().min(1)}).strict(),ma=p.object({kind:p.enum(["completed","deferred","abandoned"]),summary:p.string().trim().min(1).optional()}).strict();function F(e){return{status:"error",summary:e.message,...e.recovery?{recovery:e.recovery}:{}}}async function S(e,a){return De(e,async()=>a(await A(e)))}async function Ye(e){return b(await A(e))}async function Ze(e,a){let t=ua.parse(a??{});return S(e,async(r)=>{let n=t.goal??r?.goal;if(!n)return{status:"missing_goal",summary:"Provide a goal before saving a Flow plan.",nextAction:"/flow-plan <goal>"};if(r?.status==="completed")await Z(e,r);let i=r?.status==="completed"?L(n):r??L(n);if(i.goal!==n){if(i.approval==="approved")return{status:"error",summary:"An approved Flow session already exists for a different goal. Close it before starting a new one."}}let s=i.goal===n?i:L(n),d=t.plan?Je(s,t.plan):{ok:!0,value:s};if(!d.ok)return F(d);let m=await w(e,d.value);return{...b(m),status:"ok",summary:t.plan?"Flow plan saved.":"Flow session ready."}})}async function Qe(e){return S(e,async(a)=>{if(!a)return{status:"missing_session",summary:"No active Flow session exists.",nextAction:"/flow-plan <goal>"};let t=Be(a);if(!t.ok)return F(t);let r=await w(e,t.value);return{...b(r),status:"ok",summary:"Flow plan approved."}})}async function et(e,a){let t=pa.parse(a??{});return S(e,async(r)=>{if(!r)return{status:"missing_session",summary:"No active Flow session exists.",nextAction:"/flow-plan <goal>"};let n=Ke(r,t.featureId);if(!n.ok)return F(n);let i=await w(e,n.value.session);return{...b(i),status:"ok",summary:`Started feature '${n.value.feature.id}'.`,feature:n.value.feature}})}async function tt(e,a){let t=O.parse(a??{});return S(e,async(r)=>{if(!r)return{status:"missing_session",summary:"No active Flow session exists.",nextAction:"/flow-plan <goal>"};let n=Ge(r,t);if(!n.ok){if(n.session)await w(e,n.session);return F(n)}let i=await w(e,n.value);return{...b(i),status:"ok",summary:"Feature result recorded."}})}async function at(e,a){let t=fa.parse(a??{});return S(e,async(r)=>{if(!r)return{status:"missing_session",summary:"No active Flow session exists.",nextAction:"/flow-plan <goal>"};let n=He(r,t.featureId);if(!n.ok)return F(n);let i=await w(e,n.value);return{...b(i),status:"ok",summary:`Feature '${t.featureId}' reset.`}})}async function rt(e,a){let t=ma.parse(a??{});return S(e,async(r)=>{if(!r)return{status:"missing_session",summary:"No active Flow session exists.",nextAction:"/flow-plan <goal>"};let n=Xe(r,t.kind,t.summary);if(!n.ok)return F(n);return await Z(e,n.value),{status:"ok",summary:`Flow session closed as ${t.kind}.`,archivedSessionId:n.value.id,closure:n.value.closure}})}import{tool as f}from"@opencode-ai/plugin";var c=f.schema;function nt(e){return JSON.stringify(e,null,2)}function ha(e){return nt({status:"error",summary:e instanceof Error?e.message:String(e)})}async function k(e,a){try{return nt(await a(Ue(e)))}catch(t){return ha(t)}}function ot(e){return W(e)("info","Creating minimal Flow v4 tool surface."),{flow_status:f({description:"Show the active Flow session and next action",args:{},execute:(a,t)=>k(t,Ye)}),flow_plan_save:f({description:"Create or update a draft Flow plan for the active goal",args:{goal:c.string().optional(),plan:c.any().optional()},execute:(a,t)=>k(t,(r)=>Ze(r,a))}),flow_plan_approve:f({description:"Approve the current draft Flow plan",args:{},execute:(a,t)=>k(t,Qe)}),flow_run_start:f({description:"Start the next runnable approved Flow feature",args:{featureId:c.string().optional()},execute:(a,t)=>k(t,(r)=>et(r,a))}),flow_feature_complete:f({description:"Record a completed or blocked active feature with validation and review evidence",args:{status:c.enum(["ok","needs_input"]),featureId:c.string(),summary:c.string(),artifactsChanged:c.array(c.object({path:c.string()})).optional(),validationRun:c.array(c.object({command:c.string(),status:c.enum(["passed","failed"]),summary:c.string()})).optional(),validationScope:c.enum(["targeted","broad"]).optional(),featureReview:c.any().optional(),finalReview:c.any().optional(),outcome:c.any().optional()},execute:(a,t)=>k(t,(r)=>tt(r,a))}),flow_feature_reset:f({description:"Reset one feature and its dependents to pending",args:{featureId:c.string()},execute:(a,t)=>k(t,(r)=>at(r,a))}),flow_session_close:f({description:"Close and archive the active Flow session",args:{kind:c.enum(["completed","deferred","abandoned"]),summary:c.string().optional()},execute:(a,t)=>k(t,(r)=>rt(r,a))})}}async function it(e){let a=e.worktree??e.directory;if(!a)return null;try{let t=await A(a);if(!t)return null;return["Flow session facts:",`- goal: ${t.goal}`,`- status: ${t.status}`,`- approval: ${t.approval}`,`- active feature: ${t.activeFeatureId??"none"}`,`- progress: ${t.plan?.features.filter((r)=>r.status==="completed").length??0}/${t.plan?.features.length??0}`,"Call flow_status before any Flow action."].join(`
731
- `)}catch{return null}}function ga(e){return async(a,t)=>{let r=await it(e);if(r)t.system.push(r)}}var va=async(e)=>{let a=W(e);return a("info","Flow v4 plugin initialized."),await Se(Fe(),a),{config:Le(e),tool:ot(e),"experimental.chat.system.transform":ga(e),"experimental.session.compacting":async(t,r)=>{let n=await it(e);if(!n)return;r.context=[...r.context??[],n]}}},wa=va;export{wa as default};
1065
+ `,"utf8")}catch(t){if(t.code!=="ENOENT")throw t;await je(a,`session.lock/
1066
+ `,"utf8")}}var na={"flow-reviewer":{mode:"subagent",hidden:!0,description:"Internal read-only reviewer for Flow-guided work.",prompt:"Load `flow-review`. Inspect the current work read-only, report coverage, evidence-backed findings, confidence, gaps, and manager follow-ups, and do not mutate Flow state.",permission:{edit:"deny",bash:"deny",task:{"*":"deny"},"flow_*":"deny",flow_status:"allow"}},"flow-evidence-worker":{mode:"subagent",hidden:!0,description:"Internal read-only evidence worker for Flow planning and execution support.",prompt:"Use Flow evidence mode. Inspect only the assigned slice, do not edit files, do not call state-changing Flow tools, and return coverage, evidence inspected, confidence-tagged findings or facts, gaps, and manager follow-ups.",permission:{edit:"deny",bash:"deny",task:{"*":"deny"},"flow_*":"deny",flow_status:"allow"}},"flow-validation-worker":{mode:"subagent",hidden:!0,description:"Internal validation worker for Flow check selection and command evidence.",prompt:"Use Flow validation mode. Run only manager-specified commands or propose focused checks, do not edit files, do not call state-changing Flow tools, and report exact command, status, raw outcome summary, coverage, confidence, gaps, and manager follow-ups.",permission:{edit:"deny",bash:"ask",task:{"*":"deny"},"flow_*":"deny",flow_status:"allow"}},"flow-audit-worker":{mode:"subagent",hidden:!0,description:"Internal read-only audit worker for refuted or surviving finding candidates.",prompt:"Use Flow audit mode. Inspect only the assigned slice, actively refute candidate findings before reporting them, do not edit files, do not call state-changing Flow tools, and return coverage, evidence, guards checked, confidence, gaps, and manager follow-ups.",permission:{edit:"deny",bash:"ask",task:{"*":"deny"},"flow_*":"deny",flow_status:"allow"}},"flow-candidate-worker":{mode:"subagent",hidden:!0,description:"Internal candidate implementation worker for isolated Flow worktrees or exact non-overlapping path ownership.",prompt:"Use Flow candidate-implementation mode only when the manager assigned an isolated worktree or exact non-overlapping path ownership. Do not edit .flow/**, do not call state-changing Flow tools, do not complete Flow state, and return changed or proposed patch, verification run, coverage, confidence, merge risks, and manager follow-ups.",permission:{edit:"ask",bash:"ask",task:{"*":"deny"},"flow_*":"deny",flow_status:"allow"}},"flow-verifier-worker":{mode:"subagent",hidden:!0,description:"Internal verifier worker for checking Flow worker claims against cited evidence.",prompt:"Use Flow verifier mode. Verify only the assigned claims against the provided sources, commands, counts, or current docs. Do not generate new scope, do not edit files, do not call state-changing Flow tools, and return supported, partly-supported, unsupported, or source-not-found per claim with evidence, confidence, gaps, and manager follow-ups.",permission:{edit:"deny",bash:"ask",task:{"*":"deny"},"flow_*":"deny",flow_status:"allow"}}},ra={"flow-auto":{description:"Drive Flow skills against the minimal runtime ledger",template:"Load the `flow` skill and drive the Flow loop until completion or a real blocker: $ARGUMENTS"},"flow-plan":{description:"Create or approve a Flow plan",template:"Load the `flow-plan` skill and plan: $ARGUMENTS"},"flow-run":{description:"Run one approved Flow feature",template:"Load the `flow-run` skill and execute the next approved feature. $ARGUMENTS"},"flow-review":{description:"Run a read-only Flow review",agent:"flow-reviewer",subtask:!0,template:"Load the `flow-review` skill and review: $ARGUMENTS"},"flow-status":{description:"Inspect the active Flow session",template:"Call flow_status and report the session state and next action."}};function oa(){return{agent:Object.fromEntries(Object.entries(na).map(([e,a])=>{let t=a.permission?{...a.permission,...a.permission.task?{task:{...a.permission.task}}:{}}:void 0;return[e,{...a,...t?{permission:t}:{}}]})),command:Object.fromEntries(Object.entries(ra).map(([e,a])=>[e,{...a}]))}}function Me(e){let a=oa();e.agent={...e.agent??{},...a.agent},e.command={...e.command??{},...a.command}}function Ve(e){return async(a)=>{Me(a)}}function z(e){let a=e?.client,t=a?.app?.log;return(n,r)=>{if(typeof t!=="function")return;try{t.call(a?.app,{body:{service:"opencode-plugin-flow",level:n,message:r}})}catch{}}}import{z as p}from"zod";import{randomUUID as sa}from"node:crypto";var ia=null;function h(){return ia?.()??new Date().toISOString()}function u(e){return{ok:!0,value:e}}function l(e,a,t){return{ok:!1,message:e,...a?{recovery:a}:{},...t?{session:t}:{}}}function la(e){let a=E.parse(e);return{summary:a.summary,overview:a.overview,requirements:a.requirements??[],decisions:a.decisions??[],finalReviewPolicy:a.finalReviewPolicy??"detailed",features:a.features.map((t)=>({id:t.id,title:t.title,summary:t.summary,status:"pending",targets:t.targets??[],validation:t.validation??[],dependsOn:t.dependsOn??[]}))}}function ca(e){let a=new Set;for(let s of e.features){if(a.has(s.id))return`Duplicate feature id '${s.id}'.`;a.add(s.id)}for(let s of e.features)for(let d of s.dependsOn){if(!a.has(d))return`Feature '${s.id}' depends on unknown feature '${d}'.`;if(d===s.id)return`Feature '${s.id}' cannot depend on itself.`}let t=new Set,n=new Set,r=new Map(e.features.map((s)=>[s.id,s]));function i(s){if(n.has(s))return!1;if(t.has(s))return!0;t.add(s);for(let d of r.get(s)?.dependsOn??[])if(i(d))return!0;return t.delete(s),n.add(s),!1}return e.features.some((s)=>i(s.id))?"Feature dependencies contain a cycle.":null}function L(e){let a=h();return{version:2,id:sa(),goal:e,status:"planning",approval:"pending",plan:null,activeFeatureId:null,history:[],closure:null,lastError:null,timestamps:{createdAt:a,updatedAt:a,completedAt:null}}}function y(e){return{...e,timestamps:{...e.timestamps,updatedAt:h()}}}function Je(e,a){if(e.approval==="approved"||e.status!=="planning")return l("Approved plans cannot be changed. Reset or start a new session.");let t=la(a),n=ca(t);if(n)return l(n);return u(y({...e,status:"planning",approval:"pending",plan:t,activeFeatureId:null,history:[],closure:null,lastError:null,timestamps:{...e.timestamps,completedAt:null}}))}function Ke(e){if(!e.plan)return l("There is no draft plan to approve.");if(e.approval==="approved"&&e.status==="ready")return u(e);if(e.status!=="planning")return l("Only planning sessions can be approved.");return u(y({...e,approval:"approved",status:"ready"}))}function Be(e,a){return e.status==="pending"&&e.dependsOn.every((t)=>a.has(t))}function da(e,a){let t=new Set(e.filter((i)=>i.status==="completed").map((i)=>i.id)),n=new Map(e.map((i)=>[i.id,i]));if(a){let i=n.get(a);if(!i)return l(`Feature '${a}' is not in the plan.`);if(i.status==="completed")return l(`Feature '${a}' is already completed.`);if(i.status!=="pending")return l(`Feature '${a}' is ${i.status} and must be reset before it can run.`);if(!Be(i,t))return l(`Feature '${a}' has incomplete dependencies.`);return u(i)}let r=e.find((i)=>Be(i,t));return r?u(r):l("No runnable feature is available.")}function Q(e,a,t){return e.map((n)=>n.id===a?{...n,status:t}:n.status==="in_progress"&&t==="in_progress"?{...n,status:"pending"}:n)}function He(e,a){if(e.status==="completed")return l("This Flow session is already completed.");if(!e.plan||e.approval!=="approved")return l("There is no approved plan to run.");if(e.status==="blocked")return l("Blocked features must be reset before rerun.","Call flow_feature_reset for the blocked feature, then start it again.");if(e.activeFeatureId){if(!a||a===e.activeFeatureId){let i=e.plan.features.find((s)=>s.id===e.activeFeatureId);if(i)return u({session:e,feature:i})}return l(`Feature '${e.activeFeatureId}' is already in progress.`)}let t=da(e.plan.features,a);if(!t.ok)return t;let n={...e.plan,features:Q(e.plan.features,t.value.id,"in_progress")},r=y({...e,status:"running",plan:n,activeFeatureId:t.value.id,lastError:null});return u({session:r,feature:r.plan?.features.find((i)=>i.id===t.value.id)??t.value})}function Ge(e){return e.status==="passed"&&e.blockingFindings.length===0}function ua(e,a){if(!e.plan)return!1;return e.plan.features.every((t)=>t.id===a||t.status==="completed")}function g(e,a,t,n){return l(t,n,{...e,lastError:{tool:a,summary:t,recovery:n,recordedAt:h()}})}function pa(e,a){let t=ua(e,a.featureId);if(a.validationRun.length===0)return g(e,"flow_feature_complete","Completion requires recorded validation evidence.","Run the targeted or broad validation command and record the result.");if(!a.validationRun.every((n)=>n.status==="passed"))return g(e,"flow_feature_complete","Completion requires all recorded validation to pass.","Fix failures, rerun validation, then complete the feature.");if(!t&&a.validationScope!=="targeted")return g(e,"flow_feature_complete","Non-final feature completion requires targeted validation.","Record validationScope: targeted for ordinary feature completion.");if(t&&a.validationScope!=="broad")return g(e,"flow_feature_complete","Final feature completion requires broad validation.","Run the project-level gate and record validationScope: broad.");if(!Ge(a.featureReview))return g(e,"flow_feature_complete","Completion requires a passing featureReview with no blocking findings.","Fix or acknowledge the review findings before completing.");if(t){if(!a.finalReview)return g(e,"flow_feature_complete","Final feature completion requires a finalReview.","Run final review and include the finalReview payload.");if(!Ge(a.finalReview))return g(e,"flow_feature_complete","Final completion requires a passing finalReview.","Resolve final review findings before completing the session.");let n=e.plan?.finalReviewPolicy??"detailed";if(a.finalReview.reviewDepth!==n)return g(e,"flow_feature_complete",`Final review depth must match the plan policy '${n}'.`,"Record a finalReview whose reviewDepth matches the approved plan.")}return u(void 0)}function Xe(e,a){if(!e.plan||e.status!=="running"||!e.activeFeatureId)return l("No feature is currently running.");let t=U.parse(a);if(t.featureId!==e.activeFeatureId)return l(`Worker result feature '${t.featureId}' does not match active feature '${e.activeFeatureId}'.`);if(t.status==="needs_input"){let m={featureId:t.featureId,status:"needs_input",summary:t.summary,recordedAt:h(),artifactsChanged:t.artifactsChanged,validationRun:t.validationRun,validationScope:t.validationScope,featureReview:t.featureReview,finalReview:t.finalReview,outcome:t.outcome};return u(y({...e,status:"blocked",activeFeatureId:null,plan:{...e.plan,features:Q(e.plan.features,t.featureId,"blocked")},history:[...e.history,m]}))}let n=pa(e,t);if(!n.ok)return n;let r={featureId:t.featureId,status:"completed",summary:t.summary,recordedAt:h(),artifactsChanged:t.artifactsChanged,validationRun:t.validationRun,validationScope:t.validationScope,featureReview:t.featureReview,finalReview:t.finalReview,outcome:t.outcome},i=Q(e.plan.features,t.featureId,"completed"),s=i.every((m)=>m.status==="completed"),d=h();return u(y({...e,status:s?"completed":"ready",activeFeatureId:null,plan:{...e.plan,features:i},history:[...e.history,r],closure:s?{kind:"completed",summary:t.summary,recordedAt:d}:null,lastError:null,timestamps:{...e.timestamps,completedAt:s?d:e.timestamps.completedAt}}))}function fa(e,a){let t=new Set([a]),n=!0;while(n){n=!1;for(let r of e){if(t.has(r.id))continue;if(r.dependsOn.some((i)=>t.has(i)))t.add(r.id),n=!0}}return t}function Ye(e,a){if(!e.plan)return l("There is no active plan to reset.");if(!e.plan.features.some((s)=>s.id===a))return l(`Feature '${a}' is not in the plan.`);let t=fa(e.plan.features,a),n=e.activeFeatureId&&t.has(e.activeFeatureId)?null:e.activeFeatureId,r=e.plan.features.map((s)=>t.has(s.id)?{...s,status:"pending"}:s),i=e.approval!=="approved"?"planning":n?"running":r.some((s)=>s.status==="blocked")?"blocked":"ready";return u(y({...e,status:i,activeFeatureId:n,plan:{...e.plan,features:r},closure:null,lastError:null,timestamps:{...e.timestamps,completedAt:null}}))}function Ze(e,a,t){if(a==="completed"){if(!e.plan||e.approval!=="approved")return l("Cannot close a Flow session as completed without an approved plan.");let r=e.plan.features.filter((i)=>i.status!=="completed");if(r.length>0)return l("Cannot close a Flow session as completed with unfinished features.",`Unfinished features: ${r.map((i)=>i.id).join(", ")}`);if(e.status!=="completed")return l("Cannot close a Flow session as completed before final completion gates pass.")}let n=h();return u(y({...e,status:a==="completed"?"completed":e.status,activeFeatureId:null,closure:{kind:a,summary:t??`Session closed as ${a}.`,recordedAt:n},timestamps:{...e.timestamps,completedAt:a==="completed"?n:e.timestamps.completedAt}}))}function b(e){if(!e)return{status:"missing_session",summary:"No active Flow session exists.",nextAction:"Start with /flow-plan <goal>."};let a=e.plan?.features??[],t=a.filter((s)=>s.status==="completed"),n=e.history.at(-1)??null,r=e.status==="blocked"?n:null,i=e.activeFeatureId?a.find((s)=>s.id===e.activeFeatureId):null;return{status:e.status,summary:e.closure?.summary??e.lastError?.summary??r?.summary??e.plan?.summary??"Flow session is active.",nextAction:ma(e),session:{id:e.id,goal:e.goal,status:e.status,approval:e.approval,activeFeature:i??null,progress:{completed:t.length,total:a.length},features:a,closure:e.closure,lastError:e.lastError,latestHistoryEntry:n,historyCount:e.history.length,timestamps:e.timestamps}}}function ma(e){if(!e.plan)return"Save a plan with flow_plan_save.";if(e.approval!=="approved")return"Approve the plan.";if(e.status==="ready")return"Start the next feature.";if(e.status==="running")return"Complete or reset the active feature.";if(e.status==="blocked")return"Reset the blocked feature or close the session.";if(e.status==="completed")return"Close/archive the session or start a new goal.";return"Inspect session state."}var ha=p.object({goal:p.string().trim().min(1).optional(),plan:E.optional()}).strict(),ga=p.object({featureId:p.string().min(1).optional()}).strict(),wa=p.object({featureId:p.string().min(1)}).strict(),va=p.object({kind:p.enum(["completed","deferred","abandoned"]),summary:p.string().trim().min(1).optional()}).strict();function R(e){return{status:"error",summary:e.message,...e.recovery?{recovery:e.recovery}:{}}}async function S(e,a){return ze(e,async()=>a(await A(e)))}async function Qe(e){return b(await A(e))}async function et(e,a){let t=ha.parse(a??{});return S(e,async(n)=>{let r=t.goal??n?.goal;if(!r)return{status:"missing_goal",summary:"Provide a goal before saving a Flow plan.",nextAction:"/flow-plan <goal>"};if(n?.status==="completed")await Z(e,n);let i=n?.status==="completed"?L(r):n??L(r);if(i.goal!==r){if(i.approval==="approved")return{status:"error",summary:"An approved Flow session already exists for a different goal. Close it before starting a new one."}}let s=i.goal===r?i:L(r),d=t.plan?Je(s,t.plan):{ok:!0,value:s};if(!d.ok)return R(d);let m=await v(e,d.value);return{...b(m),status:"ok",summary:t.plan?"Flow plan saved.":"Flow session ready."}})}async function tt(e){return S(e,async(a)=>{if(!a)return{status:"missing_session",summary:"No active Flow session exists.",nextAction:"/flow-plan <goal>"};let t=Ke(a);if(!t.ok)return R(t);let n=await v(e,t.value);return{...b(n),status:"ok",summary:"Flow plan approved."}})}async function at(e,a){let t=ga.parse(a??{});return S(e,async(n)=>{if(!n)return{status:"missing_session",summary:"No active Flow session exists.",nextAction:"/flow-plan <goal>"};let r=He(n,t.featureId);if(!r.ok)return R(r);let i=await v(e,r.value.session);return{...b(i),status:"ok",summary:`Started feature '${r.value.feature.id}'.`,feature:r.value.feature}})}async function nt(e,a){let t=U.parse(a??{});return S(e,async(n)=>{if(!n)return{status:"missing_session",summary:"No active Flow session exists.",nextAction:"/flow-plan <goal>"};let r=Xe(n,t);if(!r.ok){if(r.session)await v(e,r.session);return R(r)}let i=await v(e,r.value);return{...b(i),status:"ok",summary:"Feature result recorded."}})}async function rt(e,a){let t=wa.parse(a??{});return S(e,async(n)=>{if(!n)return{status:"missing_session",summary:"No active Flow session exists.",nextAction:"/flow-plan <goal>"};let r=Ye(n,t.featureId);if(!r.ok)return R(r);let i=await v(e,r.value);return{...b(i),status:"ok",summary:`Feature '${t.featureId}' reset.`}})}async function ot(e,a){let t=va.parse(a??{});return S(e,async(n)=>{if(!n)return{status:"missing_session",summary:"No active Flow session exists.",nextAction:"/flow-plan <goal>"};let r=Ze(n,t.kind,t.summary);if(!r.ok)return R(r);return await Z(e,r.value),{status:"ok",summary:`Flow session closed as ${t.kind}.`,archivedSessionId:r.value.id,closure:r.value.closure}})}import{tool as f}from"@opencode-ai/plugin";var c=f.schema;function it(e){return JSON.stringify(e,null,2)}function ya(e){return it({status:"error",summary:e instanceof Error?e.message:String(e)})}async function k(e,a){try{return it(await a(De(e)))}catch(t){return ya(t)}}function st(e){return z(e)("info","Creating minimal Flow v4 tool surface."),{flow_status:f({description:"Show the active Flow session and next action",args:{},execute:(a,t)=>k(t,Qe)}),flow_plan_save:f({description:"Create or update a draft Flow plan for the active goal",args:{goal:c.string().optional(),plan:c.any().optional()},execute:(a,t)=>k(t,(n)=>et(n,a))}),flow_plan_approve:f({description:"Approve the current draft Flow plan",args:{},execute:(a,t)=>k(t,tt)}),flow_run_start:f({description:"Start the next runnable approved Flow feature",args:{featureId:c.string().optional()},execute:(a,t)=>k(t,(n)=>at(n,a))}),flow_feature_complete:f({description:"Record a completed or blocked active feature with validation and review evidence",args:{status:c.enum(["ok","needs_input"]),featureId:c.string(),summary:c.string(),artifactsChanged:c.array(c.object({path:c.string()})).optional(),validationRun:c.array(c.object({command:c.string(),status:c.enum(["passed","failed"]),summary:c.string()})).optional(),validationScope:c.enum(["targeted","broad"]).optional(),featureReview:c.any().optional(),finalReview:c.any().optional(),outcome:c.any().optional()},execute:(a,t)=>k(t,(n)=>nt(n,a))}),flow_feature_reset:f({description:"Reset one feature and its dependents to pending",args:{featureId:c.string()},execute:(a,t)=>k(t,(n)=>rt(n,a))}),flow_session_close:f({description:"Close and archive the active Flow session",args:{kind:c.enum(["completed","deferred","abandoned"]),summary:c.string().optional()},execute:(a,t)=>k(t,(n)=>ot(n,a))})}}async function lt(e){let a=e.worktree??e.directory;if(!a)return null;try{let t=await A(a);if(!t)return null;return["Flow session facts:",`- goal: ${t.goal}`,`- status: ${t.status}`,`- approval: ${t.approval}`,`- active feature: ${t.activeFeatureId??"none"}`,`- progress: ${t.plan?.features.filter((n)=>n.status==="completed").length??0}/${t.plan?.features.length??0}`,"Call flow_status before any Flow action."].join(`
1067
+ `)}catch{return null}}function ba(e){return async(a,t)=>{let n=await lt(e);if(n)t.system.push(n)}}var ka=async(e)=>{let a=z(e);return a("info","Flow v4 plugin initialized."),await Ie(_e(),a),{config:Ve(e),tool:st(e),"experimental.chat.system.transform":ba(e),"experimental.session.compacting":async(t,n)=>{let r=await lt(e);if(!r)return;n.context=[...n.context??[],r]}}},xa=ka;export{xa as default};
732
1068
 
733
- //# debugId=42646A93F00F668D64756E2164756E21
1069
+ //# debugId=E0CD440B3A586E5F64756E2164756E21
package/dist/index.js.map CHANGED
@@ -3,11 +3,11 @@
3
3
  "sources": ["../src/distribution/sync.ts", "../src/distribution/flow-skill-definitions.ts", "../src/runtime/workspace.ts", "../src/runtime/json/strict-object.ts", "../src/runtime/schema.ts", "../src/config-shared.ts", "../src/adapters/opencode/config.ts", "../src/adapters/opencode/logging.ts", "../src/runtime/api.ts", "../src/runtime/transitions.ts", "../src/runtime/time.ts", "../src/adapters/opencode/sdk.ts", "../src/adapters/opencode/tools.ts", "../src/adapters/opencode/plugin.ts"],
4
4
  "sourcesContent": [
5
5
  "import { createHash } from \"node:crypto\";\nimport { mkdir, readdir, readFile, rm, writeFile } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport { dirname, join, normalize, sep } from \"node:path\";\nimport {\n\tFLOW_SKILL_DEFINITIONS,\n\ttype FlowSkillDefinition,\n} from \"./flow-skill-definitions\";\n\nconst MARKER_FILENAME = \".flow-skill-version\";\n\ntype FlowLog = (level: \"info\" | \"warn\" | \"error\", message: string) => void;\n\nfunction homeDir(): string {\n\treturn process.env.HOME ?? process.env.USERPROFILE ?? \"\";\n}\n\nfunction skillsRoot(home = homeDir()): string {\n\treturn join(home, \".config\", \"opencode\", \"skills\");\n}\n\nfunction sha256(value: string): string {\n\treturn createHash(\"sha256\").update(value).digest(\"hex\");\n}\n\nfunction markerFor(definition: FlowSkillDefinition, version: string): string {\n\treturn [\n\t\t`version=${version}`,\n\t\t...definition.files.map(\n\t\t\t(file) => `file=${file.relativePath} sha256=${sha256(file.content)}`,\n\t\t),\n\t\t\"\",\n\t].join(\"\\n\");\n}\n\nasync function optionalRead(path: string): Promise<string | null> {\n\ttry {\n\t\treturn await readFile(path, \"utf8\");\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n\t\tthrow error;\n\t}\n}\n\nfunction parseMarkerFiles(content: string | null): Map<string, string> {\n\tconst files = new Map<string, string>();\n\tif (!content) return files;\n\tfor (const line of content.split(/\\r?\\n/)) {\n\t\tconst match =\n\t\t\t/^file=(.+) sha256=([a-f0-9]{64})$/.exec(line) ??\n\t\t\t/^file=(.+)=sha256:([a-f0-9]{64})$/.exec(line);\n\t\tif (match?.[1] && match[2]) files.set(match[1], match[2]);\n\t\tconst topLevelHash = /^hash=sha256:([a-f0-9]{64})$/.exec(line);\n\t\tif (topLevelHash?.[1] && !files.has(\"SKILL.md\")) {\n\t\t\tfiles.set(\"SKILL.md\", topLevelHash[1]);\n\t\t}\n\t}\n\treturn files;\n}\n\nfunction resolveSkillFile(folder: string, relativePath: string): string {\n\tconst resolved = normalize(join(folder, ...relativePath.split(\"/\")));\n\tif (resolved !== folder && resolved.startsWith(`${folder}${sep}`)) {\n\t\treturn resolved;\n\t}\n\tthrow new Error(`Unsafe skill file path '${relativePath}'.`);\n}\n\nasync function syncSkill(\n\tdefinition: FlowSkillDefinition,\n\tversion: string,\n\troot: string,\n) {\n\tconst folder = join(root, definition.name);\n\tconst markerPath = join(folder, MARKER_FILENAME);\n\tconst markerContent = await optionalRead(markerPath);\n\tconst existingMarkerHashes = parseMarkerFiles(markerContent);\n\tconst existingSkill = await optionalRead(join(folder, \"SKILL.md\"));\n\tif (existingSkill !== null && markerContent === null) {\n\t\treturn { name: definition.name, action: \"skipped_foreign\" as const };\n\t}\n\n\tlet changed = false;\n\tlet backedUp = false;\n\tfor (const file of definition.files) {\n\t\tconst path = resolveSkillFile(folder, file.relativePath);\n\t\tconst existing = await optionalRead(path);\n\t\tif (existing === file.content) continue;\n\t\tchanged = true;\n\t\tconst recordedHash = existingMarkerHashes.get(file.relativePath);\n\t\tconst userEdited =\n\t\t\texisting !== null &&\n\t\t\t(recordedHash\n\t\t\t\t? sha256(existing) !== recordedHash\n\t\t\t\t: markerContent !== null);\n\t\tif (userEdited) {\n\t\t\tawait writeFile(`${path}.backup`, existing, \"utf8\");\n\t\t\tbackedUp = true;\n\t\t}\n\t}\n\n\tif (!changed && markerContent === markerFor(definition, version)) {\n\t\treturn { name: definition.name, action: \"unchanged\" as const };\n\t}\n\n\tconst managedSkillExists = markerContent !== null;\n\tfor (const file of definition.files) {\n\t\tconst path = resolveSkillFile(folder, file.relativePath);\n\t\tawait mkdir(dirname(path), { recursive: true });\n\t\tawait writeFile(path, file.content, \"utf8\");\n\t}\n\tawait writeFile(markerPath, markerFor(definition, version), \"utf8\");\n\treturn {\n\t\tname: definition.name,\n\t\taction: backedUp\n\t\t\t? (\"updated_with_backup\" as const)\n\t\t\t: managedSkillExists\n\t\t\t\t? (\"updated\" as const)\n\t\t\t\t: (\"installed\" as const),\n\t};\n}\n\nexport function resolveFlowPluginVersion(): string {\n\tif (process.env.npm_package_version) return process.env.npm_package_version;\n\ttry {\n\t\tconst require = createRequire(import.meta.url);\n\t\tfor (const path of [\"../package.json\", \"../../package.json\"]) {\n\t\t\ttry {\n\t\t\t\tconst manifest = require(path) as { version?: string };\n\t\t\t\tif (manifest.version) return manifest.version;\n\t\t\t} catch {\n\t\t\t\t// Try the next layout: source tree and bundled dist differ.\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Fall through to sentinel.\n\t}\n\treturn \"0.0.0\";\n}\n\nexport async function syncFlowSkills(version: string, home = homeDir()) {\n\tconst root = skillsRoot(home);\n\treturn Promise.all(\n\t\tFLOW_SKILL_DEFINITIONS.map((definition) =>\n\t\t\tsyncSkill(definition, version, root),\n\t\t),\n\t);\n}\n\nexport async function runFlowSkillSync(\n\tversion: string,\n\tlog: FlowLog,\n): Promise<void> {\n\ttry {\n\t\tconst results = await syncFlowSkills(version);\n\t\tconst changed = results.filter(\n\t\t\t(result) =>\n\t\t\t\tresult.action !== \"unchanged\" && result.action !== \"skipped_foreign\",\n\t\t);\n\t\tif (changed.length > 0) {\n\t\t\tlog(\n\t\t\t\t\"info\",\n\t\t\t\t`Flow synced skills (${changed.map((item) => `${item.name}:${item.action}`).join(\", \")}). Restart OpenCode if skills were just installed.`,\n\t\t\t);\n\t\t}\n\t} catch (error) {\n\t\tlog(\n\t\t\t\"warn\",\n\t\t\t`Flow skill sync failed: ${error instanceof Error ? error.message : String(error)}`,\n\t\t);\n\t}\n}\n\nexport async function uninstallFlowSkills(home = homeDir()) {\n\tconst root = skillsRoot(home);\n\tconst removed: string[] = [];\n\tconst kept: string[] = [];\n\tlet entries: string[];\n\ttry {\n\t\tentries = await readdir(root);\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n\t\t\treturn { removed, kept };\n\t\t}\n\t\tthrow error;\n\t}\n\tfor (const name of entries) {\n\t\tif (name !== \"flow\" && !name.startsWith(\"flow-\")) continue;\n\t\tconst folder = join(root, name);\n\t\tconst markerContent = await optionalRead(join(folder, MARKER_FILENAME));\n\t\tif (markerContent === null) {\n\t\t\tkept.push(folder);\n\t\t\tcontinue;\n\t\t}\n\t\tconst hashes = parseMarkerFiles(markerContent);\n\t\tlet userEdited = false;\n\t\tfor (const [relativePath, recordedHash] of hashes) {\n\t\t\tconst content = await optionalRead(\n\t\t\t\tresolveSkillFile(folder, relativePath),\n\t\t\t);\n\t\t\tif (content !== null && sha256(content) !== recordedHash) {\n\t\t\t\tuserEdited = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (userEdited) {\n\t\t\tkept.push(folder);\n\t\t\tcontinue;\n\t\t}\n\t\tawait rm(folder, { recursive: true, force: true });\n\t\tremoved.push(folder);\n\t}\n\treturn { removed, kept };\n}\n",
6
- "import flowParallelOrchestrationDoc from \"../../skills/flow/references/parallel-orchestration.md\" with {\n\ttype: \"text\",\n};\nimport flowRecoveryPlaybookDoc from \"../../skills/flow/references/recovery-playbook.md\" with {\n\ttype: \"text\",\n};\nimport flowSkillDoc from \"../../skills/flow/SKILL.md\" with { type: \"text\" };\nimport flowDeslopRefactorWorkflowDoc from \"../../skills/flow-deslop/references/refactor-workflow.md\" with {\n\ttype: \"text\",\n};\nimport flowDeslopSmellRubricDoc from \"../../skills/flow-deslop/references/smell-rubric.md\" with {\n\ttype: \"text\",\n};\nimport flowDeslopSkillDoc from \"../../skills/flow-deslop/SKILL.md\" with {\n\ttype: \"text\",\n};\nimport flowPlanParallelDiscoveryDoc from \"../../skills/flow-plan/references/parallel-discovery.md\" with {\n\ttype: \"text\",\n};\nimport flowPlanPlanningExamplesDoc from \"../../skills/flow-plan/references/planning-examples.md\" with {\n\ttype: \"text\",\n};\nimport flowPlanSkillDoc from \"../../skills/flow-plan/SKILL.md\" with {\n\ttype: \"text\",\n};\nimport flowReviewReviewRubricDoc from \"../../skills/flow-review/references/review-rubric.md\" with {\n\ttype: \"text\",\n};\nimport flowReviewSkillDoc from \"../../skills/flow-review/SKILL.md\" with {\n\ttype: \"text\",\n};\nimport flowRunAuditRubricDoc from \"../../skills/flow-run/references/audit-rubric.md\" with {\n\ttype: \"text\",\n};\nimport flowRunValidationRubricDoc from \"../../skills/flow-run/references/validation-rubric.md\" with {\n\ttype: \"text\",\n};\nimport flowRunSkillDoc from \"../../skills/flow-run/SKILL.md\" with {\n\ttype: \"text\",\n};\nimport flowUiQualityUiRubricDoc from \"../../skills/flow-ui-quality/references/ui-rubric.md\" with {\n\ttype: \"text\",\n};\nimport flowUiQualityVisualVerificationDoc from \"../../skills/flow-ui-quality/references/visual-verification.md\" with {\n\ttype: \"text\",\n};\nimport flowUiQualitySkillDoc from \"../../skills/flow-ui-quality/SKILL.md\" with {\n\ttype: \"text\",\n};\n\nexport type FlowSkillFile = {\n\trelativePath: string;\n\tcontent: string;\n};\n\nexport type FlowSkillDefinition = {\n\tname: string;\n\tfiles: FlowSkillFile[];\n};\n\nexport const FLOW_SKILL_DEFINITIONS: readonly FlowSkillDefinition[] = [\n\t{\n\t\tname: \"flow\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowSkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/recovery-playbook.md\",\n\t\t\t\tcontent: flowRecoveryPlaybookDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/parallel-orchestration.md\",\n\t\t\t\tcontent: flowParallelOrchestrationDoc,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"flow-plan\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowPlanSkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/planning-examples.md\",\n\t\t\t\tcontent: flowPlanPlanningExamplesDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/parallel-discovery.md\",\n\t\t\t\tcontent: flowPlanParallelDiscoveryDoc,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"flow-run\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowRunSkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/validation-rubric.md\",\n\t\t\t\tcontent: flowRunValidationRubricDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/audit-rubric.md\",\n\t\t\t\tcontent: flowRunAuditRubricDoc,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"flow-review\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowReviewSkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/review-rubric.md\",\n\t\t\t\tcontent: flowReviewReviewRubricDoc,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"flow-deslop\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowDeslopSkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/smell-rubric.md\",\n\t\t\t\tcontent: flowDeslopSmellRubricDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/refactor-workflow.md\",\n\t\t\t\tcontent: flowDeslopRefactorWorkflowDoc,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"flow-ui-quality\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowUiQualitySkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/ui-rubric.md\",\n\t\t\t\tcontent: flowUiQualityUiRubricDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/visual-verification.md\",\n\t\t\t\tcontent: flowUiQualityVisualVerificationDoc,\n\t\t\t},\n\t\t],\n\t},\n];\n",
6
+ "import flowHandoffFormatDoc from \"../../skills/flow/references/handoff-format.md\" with {\n\ttype: \"text\",\n};\nimport flowParallelOrchestrationDoc from \"../../skills/flow/references/parallel-orchestration.md\" with {\n\ttype: \"text\",\n};\nimport flowRecoveryPlaybookDoc from \"../../skills/flow/references/recovery-playbook.md\" with {\n\ttype: \"text\",\n};\nimport flowVerificationGatesDoc from \"../../skills/flow/references/verification-gates.md\" with {\n\ttype: \"text\",\n};\nimport flowSkillDoc from \"../../skills/flow/SKILL.md\" with { type: \"text\" };\nimport flowDeslopRefactorWorkflowDoc from \"../../skills/flow-deslop/references/refactor-workflow.md\" with {\n\ttype: \"text\",\n};\nimport flowDeslopSmellRubricDoc from \"../../skills/flow-deslop/references/smell-rubric.md\" with {\n\ttype: \"text\",\n};\nimport flowDeslopSkillDoc from \"../../skills/flow-deslop/SKILL.md\" with {\n\ttype: \"text\",\n};\nimport flowPlanParallelDiscoveryDoc from \"../../skills/flow-plan/references/parallel-discovery.md\" with {\n\ttype: \"text\",\n};\nimport flowPlanPlanningExamplesDoc from \"../../skills/flow-plan/references/planning-examples.md\" with {\n\ttype: \"text\",\n};\nimport flowPlanSkillDoc from \"../../skills/flow-plan/SKILL.md\" with {\n\ttype: \"text\",\n};\nimport flowReviewReviewRubricDoc from \"../../skills/flow-review/references/review-rubric.md\" with {\n\ttype: \"text\",\n};\nimport flowReviewSkillDoc from \"../../skills/flow-review/SKILL.md\" with {\n\ttype: \"text\",\n};\nimport flowRunAuditRubricDoc from \"../../skills/flow-run/references/audit-rubric.md\" with {\n\ttype: \"text\",\n};\nimport flowRunValidationRubricDoc from \"../../skills/flow-run/references/validation-rubric.md\" with {\n\ttype: \"text\",\n};\nimport flowRunSkillDoc from \"../../skills/flow-run/SKILL.md\" with {\n\ttype: \"text\",\n};\nimport flowUiQualityUiRubricDoc from \"../../skills/flow-ui-quality/references/ui-rubric.md\" with {\n\ttype: \"text\",\n};\nimport flowUiQualityVisualVerificationDoc from \"../../skills/flow-ui-quality/references/visual-verification.md\" with {\n\ttype: \"text\",\n};\nimport flowUiQualitySkillDoc from \"../../skills/flow-ui-quality/SKILL.md\" with {\n\ttype: \"text\",\n};\n\nexport type FlowSkillFile = {\n\trelativePath: string;\n\tcontent: string;\n};\n\nexport type FlowSkillDefinition = {\n\tname: string;\n\tfiles: FlowSkillFile[];\n};\n\nexport const FLOW_SKILL_DEFINITIONS: readonly FlowSkillDefinition[] = [\n\t{\n\t\tname: \"flow\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowSkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/recovery-playbook.md\",\n\t\t\t\tcontent: flowRecoveryPlaybookDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/parallel-orchestration.md\",\n\t\t\t\tcontent: flowParallelOrchestrationDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/handoff-format.md\",\n\t\t\t\tcontent: flowHandoffFormatDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/verification-gates.md\",\n\t\t\t\tcontent: flowVerificationGatesDoc,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"flow-plan\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowPlanSkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/planning-examples.md\",\n\t\t\t\tcontent: flowPlanPlanningExamplesDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/parallel-discovery.md\",\n\t\t\t\tcontent: flowPlanParallelDiscoveryDoc,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"flow-run\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowRunSkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/validation-rubric.md\",\n\t\t\t\tcontent: flowRunValidationRubricDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/audit-rubric.md\",\n\t\t\t\tcontent: flowRunAuditRubricDoc,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"flow-review\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowReviewSkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/review-rubric.md\",\n\t\t\t\tcontent: flowReviewReviewRubricDoc,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"flow-deslop\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowDeslopSkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/smell-rubric.md\",\n\t\t\t\tcontent: flowDeslopSmellRubricDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/refactor-workflow.md\",\n\t\t\t\tcontent: flowDeslopRefactorWorkflowDoc,\n\t\t\t},\n\t\t],\n\t},\n\t{\n\t\tname: \"flow-ui-quality\",\n\t\tfiles: [\n\t\t\t{ relativePath: \"SKILL.md\", content: flowUiQualitySkillDoc },\n\t\t\t{\n\t\t\t\trelativePath: \"references/ui-rubric.md\",\n\t\t\t\tcontent: flowUiQualityUiRubricDoc,\n\t\t\t},\n\t\t\t{\n\t\t\t\trelativePath: \"references/visual-verification.md\",\n\t\t\t\tcontent: flowUiQualityVisualVerificationDoc,\n\t\t\t},\n\t\t],\n\t},\n];\n",
7
7
  "import { randomUUID } from \"node:crypto\";\nimport { mkdir, open, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { dirname, isAbsolute, join, parse, resolve } from \"node:path\";\nimport { setTimeout as sleep } from \"node:timers/promises\";\nimport { parseStrictJsonObject } from \"./json/strict-object\";\nimport { type Session, SessionSchema } from \"./schema\";\n\nexport class InvalidFlowWorkspaceRootError extends Error {\n\treadonly code = \"INVALID_FLOW_WORKSPACE_ROOT\";\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"InvalidFlowWorkspaceRootError\";\n\t}\n}\n\nexport function normalizeWorkspaceRoot(\n\trawPath: string | undefined,\n): string | null {\n\tconst value = rawPath?.trim();\n\tif (!value) return null;\n\tconst normalized = resolve(value);\n\treturn parse(normalized).root === normalized ? null : normalized;\n}\n\nexport function assertMutableWorkspaceRoot(rawPath: string): string {\n\tconst root = normalizeWorkspaceRoot(rawPath);\n\tif (!root) {\n\t\tthrow new InvalidFlowWorkspaceRootError(\n\t\t\t\"Flow requires a non-root workspace path.\",\n\t\t);\n\t}\n\tif (root === resolve(process.env.HOME ?? homedir())) {\n\t\tthrow new InvalidFlowWorkspaceRootError(\n\t\t\t\"Flow refuses to use $HOME itself as a mutable workspace root.\",\n\t\t);\n\t}\n\treturn root;\n}\n\nexport function resolveWorkspaceRoot(context: {\n\tworktree?: string;\n\tdirectory?: string;\n}): string {\n\tconst candidate =\n\t\tnormalizeWorkspaceRoot(context.worktree) ??\n\t\tnormalizeWorkspaceRoot(context.directory);\n\tif (!candidate) {\n\t\tthrow new InvalidFlowWorkspaceRootError(\n\t\t\t\"Flow could not resolve a workspace root from tool context.\",\n\t\t);\n\t}\n\treturn assertMutableWorkspaceRoot(candidate);\n}\n\nexport function flowDir(worktree: string): string {\n\treturn join(worktree, \".flow\");\n}\n\nexport function sessionPath(worktree: string): string {\n\treturn join(flowDir(worktree), \"session.json\");\n}\n\nexport function historyDir(worktree: string): string {\n\treturn join(flowDir(worktree), \"history\");\n}\n\nexport function archivedSessionPath(\n\tworktree: string,\n\tsessionId: string,\n): string {\n\tif (!/^[a-zA-Z0-9_-]+$/.test(sessionId)) {\n\t\tthrow new Error(\"Invalid session id.\");\n\t}\n\treturn join(historyDir(worktree), `${sessionId}.json`);\n}\n\nasync function writeFileAtomically(\n\tpath: string,\n\tcontents: string,\n): Promise<void> {\n\tawait mkdir(dirname(path), { recursive: true });\n\tconst tempPath = `${path}.${process.pid}.${randomUUID()}.tmp`;\n\tconst handle = await open(tempPath, \"w\");\n\ttry {\n\t\tawait handle.writeFile(contents, \"utf8\");\n\t\tawait handle.sync();\n\t} catch (error) {\n\t\tawait handle.close();\n\t\tawait rm(tempPath, { force: true });\n\t\tthrow error;\n\t}\n\tawait handle.close();\n\ttry {\n\t\tawait rename(tempPath, path);\n\t} catch (error) {\n\t\tawait rm(tempPath, { force: true });\n\t\tthrow error;\n\t}\n\tconst directory = await open(dirname(path), \"r\");\n\ttry {\n\t\tawait directory.sync();\n\t} finally {\n\t\tawait directory.close();\n\t}\n}\n\nconst inProcessLocks = new Map<string, Promise<void>>();\nconst LOCK_TIMEOUT_MS = 30_000;\nconst LOCK_RETRY_MS = 25;\n\nasync function acquireLock(worktree: string): Promise<() => Promise<void>> {\n\tconst root = flowDir(worktree);\n\tconst lock = join(root, \"session.lock\");\n\tconst startedAt = Date.now();\n\twhile (true) {\n\t\ttry {\n\t\t\tawait mkdir(lock, { recursive: false });\n\t\t\treturn async () => {\n\t\t\t\tawait rm(lock, { recursive: true, force: true });\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tconst code = (error as NodeJS.ErrnoException).code;\n\t\t\tif (code === \"ENOENT\") {\n\t\t\t\tawait mkdir(root, { recursive: true });\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (code !== \"EEXIST\") throw error;\n\t\t\tif (Date.now() - startedAt > LOCK_TIMEOUT_MS) {\n\t\t\t\tthrow new Error(`Timed out waiting for Flow session lock at ${lock}.`);\n\t\t\t}\n\t\t\tawait sleep(LOCK_RETRY_MS);\n\t\t}\n\t}\n}\n\nexport async function withSessionLock<T>(\n\tworktree: string,\n\ttask: () => Promise<T>,\n): Promise<T> {\n\tconst previous = inProcessLocks.get(worktree) ?? Promise.resolve();\n\tlet releaseQueue = () => {};\n\tconst current = new Promise<void>((resolve) => {\n\t\treleaseQueue = resolve;\n\t});\n\tconst queued = previous.catch(() => undefined).then(() => current);\n\tinProcessLocks.set(worktree, queued);\n\n\tlet releaseFileLock: (() => Promise<void>) | null = null;\n\ttry {\n\t\tawait previous.catch(() => undefined);\n\t\treleaseFileLock = await acquireLock(worktree);\n\t\treturn await task();\n\t} finally {\n\t\ttry {\n\t\t\tawait releaseFileLock?.();\n\t\t} finally {\n\t\t\treleaseQueue();\n\t\t\tif (inProcessLocks.get(worktree) === queued) {\n\t\t\t\tinProcessLocks.delete(worktree);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport async function loadSession(worktree: string): Promise<Session | null> {\n\tconst root = assertMutableWorkspaceRoot(worktree);\n\tlet raw: string;\n\ttry {\n\t\traw = await readFile(sessionPath(root), \"utf8\");\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return null;\n\t\tthrow error;\n\t}\n\tconst parsed = parseStrictJsonObject(raw, \"Flow session file\");\n\tif (!parsed.ok) throw new Error(parsed.error);\n\treturn SessionSchema.parse(parsed.value);\n}\n\nexport async function saveSession(\n\tworktree: string,\n\tsession: Session,\n): Promise<Session> {\n\tconst root = assertMutableWorkspaceRoot(worktree);\n\tconst normalized = SessionSchema.parse(session);\n\tawait writeFileAtomically(\n\t\tsessionPath(root),\n\t\t`${JSON.stringify(normalized, null, 2)}\\n`,\n\t);\n\tawait ensureFlowGitignore(root);\n\treturn normalized;\n}\n\nexport async function archiveAndClearSession(\n\tworktree: string,\n\tsession: Session,\n): Promise<void> {\n\tconst root = assertMutableWorkspaceRoot(worktree);\n\tawait mkdir(historyDir(root), { recursive: true });\n\tawait writeFileAtomically(\n\t\tarchivedSessionPath(root, session.id),\n\t\t`${JSON.stringify(SessionSchema.parse(session), null, 2)}\\n`,\n\t);\n\tawait rm(sessionPath(root), { force: true });\n\tawait ensureFlowGitignore(root);\n}\n\nasync function ensureFlowGitignore(worktree: string): Promise<void> {\n\tconst path = join(flowDir(worktree), \".gitignore\");\n\ttry {\n\t\tconst existing = await readFile(path, \"utf8\");\n\t\tif (existing.includes(\"session.lock\")) return;\n\t\tawait writeFile(path, `${existing.trimEnd()}\\nsession.lock/\\n`, \"utf8\");\n\t} catch (error) {\n\t\tif ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n\t\tawait writeFile(path, \"session.lock/\\n\", \"utf8\");\n\t}\n}\n\nexport function isAbsoluteOrTraversal(value: string): boolean {\n\treturn isAbsolute(value) || value === \"..\" || value.startsWith(\"../\");\n}\n",
8
8
  "type StrictJsonObjectParseResult =\n\t| { ok: true; value: Record<string, unknown> }\n\t| { ok: false; error: string };\n\nfunction findDuplicateKey(input: string): string | null {\n\ttype Frame = { isObject: boolean; keys: Set<string>; awaitingKey: boolean };\n\tconst stack: Frame[] = [];\n\tlet index = 0;\n\n\twhile (index < input.length) {\n\t\tconst char = input[index];\n\t\tif (char === \"{\") {\n\t\t\tstack.push({ isObject: true, keys: new Set(), awaitingKey: true });\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"[\") {\n\t\t\tstack.push({ isObject: false, keys: new Set(), awaitingKey: false });\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \"}\" || char === \"]\") {\n\t\t\tstack.pop();\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \",\") {\n\t\t\tconst top = stack.at(-1);\n\t\t\tif (top?.isObject) top.awaitingKey = true;\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === \":\") {\n\t\t\tconst top = stack.at(-1);\n\t\t\tif (top?.isObject) top.awaitingKey = false;\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"') {\n\t\t\tlet cursor = index + 1;\n\t\t\twhile (cursor < input.length) {\n\t\t\t\tif (input[cursor] === \"\\\\\") {\n\t\t\t\t\tcursor += 2;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (input[cursor] === '\"') break;\n\t\t\t\tcursor += 1;\n\t\t\t}\n\t\t\tconst top = stack.at(-1);\n\t\t\tif (top?.isObject && top.awaitingKey) {\n\t\t\t\tconst key = JSON.parse(input.slice(index, cursor + 1)) as string;\n\t\t\t\tif (top.keys.has(key)) return key;\n\t\t\t\ttop.keys.add(key);\n\t\t\t}\n\t\t\tindex = cursor + 1;\n\t\t\tcontinue;\n\t\t}\n\t\tindex += 1;\n\t}\n\treturn null;\n}\n\nexport function parseStrictJsonObject(\n\traw: string,\n\tlabel: string,\n): StrictJsonObjectParseResult {\n\tif (raw.trim().length === 0) {\n\t\treturn { ok: false, error: `${label} is empty.` };\n\t}\n\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(raw);\n\t} catch (error) {\n\t\treturn {\n\t\t\tok: false,\n\t\t\terror:\n\t\t\t\terror instanceof Error\n\t\t\t\t\t? `${label} is not valid JSON: ${error.message}`\n\t\t\t\t\t: `${label} is not valid JSON.`,\n\t\t};\n\t}\n\n\tif (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n\t\treturn { ok: false, error: `${label} must be a JSON object.` };\n\t}\n\n\tconst duplicate = findDuplicateKey(raw);\n\tif (duplicate) {\n\t\treturn { ok: false, error: `${label} has duplicate key '${duplicate}'.` };\n\t}\n\n\treturn { ok: true, value: parsed as Record<string, unknown> };\n}\n",
9
9
  "import { z } from \"zod\";\n\nexport const FEATURE_ID_PATTERN = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\nexport const FEATURE_ID_MESSAGE = \"Feature ids must be lowercase kebab-case\";\n\nexport const FeatureStatusSchema = z.enum([\n\t\"pending\",\n\t\"in_progress\",\n\t\"completed\",\n\t\"blocked\",\n]);\n\nexport const SessionStatusSchema = z.enum([\n\t\"planning\",\n\t\"ready\",\n\t\"running\",\n\t\"blocked\",\n\t\"completed\",\n]);\n\nexport const ReviewStatusSchema = z.enum([\"passed\", \"failed\"]);\nexport const ValidationStatusSchema = z.enum([\"passed\", \"failed\"]);\nexport const ValidationScopeSchema = z.enum([\"targeted\", \"broad\"]);\nexport const FinalReviewPolicySchema = z.enum([\"broad\", \"detailed\"]);\n\nexport const ReviewFindingSchema = z\n\t.object({\n\t\tsummary: z.string().min(1),\n\t\tseverity: z.enum([\"blocking\", \"advisory\"]).default(\"blocking\"),\n\t})\n\t.strict();\n\nexport const ReviewSchema = z\n\t.object({\n\t\tstatus: ReviewStatusSchema,\n\t\tsummary: z.string().min(1),\n\t\tblockingFindings: z.array(ReviewFindingSchema).default([]),\n\t})\n\t.strict();\n\nexport const FinalReviewSchema = ReviewSchema.extend({\n\treviewDepth: FinalReviewPolicySchema,\n}).strict();\n\nexport const ValidationRunSchema = z\n\t.object({\n\t\tcommand: z.string().min(1),\n\t\tstatus: ValidationStatusSchema,\n\t\tsummary: z.string().min(1),\n\t})\n\t.strict();\n\nexport const ArtifactSchema = z\n\t.object({\n\t\tpath: z.string().min(1),\n\t})\n\t.strict();\n\nexport const FeatureSchema = z\n\t.object({\n\t\tid: z.string().regex(FEATURE_ID_PATTERN, FEATURE_ID_MESSAGE),\n\t\ttitle: z.string().min(1),\n\t\tsummary: z.string().min(1),\n\t\tstatus: FeatureStatusSchema.default(\"pending\"),\n\t\ttargets: z.array(z.string().min(1)).default([]),\n\t\tvalidation: z.array(z.string().min(1)).default([]),\n\t\tdependsOn: z.array(z.string().regex(FEATURE_ID_PATTERN)).default([]),\n\t})\n\t.strict();\n\nexport const PlanSchema = z\n\t.object({\n\t\tsummary: z.string().min(1),\n\t\toverview: z.string().min(1),\n\t\trequirements: z.array(z.string().min(1)).default([]),\n\t\tdecisions: z.array(z.string().min(1)).default([]),\n\t\tfinalReviewPolicy: FinalReviewPolicySchema.default(\"detailed\"),\n\t\tfeatures: z.array(FeatureSchema).min(1),\n\t})\n\t.strict();\n\nexport const PlanInputSchema = PlanSchema.omit({ features: true }).extend({\n\tfinalReviewPolicy: FinalReviewPolicySchema.optional(),\n\tfeatures: z\n\t\t.array(\n\t\t\tFeatureSchema.omit({ status: true })\n\t\t\t\t.extend({\n\t\t\t\t\tstatus: FeatureStatusSchema.optional(),\n\t\t\t\t\ttargets: z.array(z.string().min(1)).optional(),\n\t\t\t\t\tvalidation: z.array(z.string().min(1)).optional(),\n\t\t\t\t\tdependsOn: z.array(z.string().regex(FEATURE_ID_PATTERN)).optional(),\n\t\t\t\t})\n\t\t\t\t.strict(),\n\t\t)\n\t\t.min(1),\n});\n\nexport const WorkerOutcomeSchema = z\n\t.object({\n\t\tkind: z\n\t\t\t.enum([\"completed\", \"blocked\", \"needs_input\", \"replan_required\"])\n\t\t\t.default(\"completed\"),\n\t\tsummary: z.string().min(1).optional(),\n\t\tresolutionHint: z.string().min(1).optional(),\n\t})\n\t.strict();\n\nexport const NeedsInputOutcomeSchema = z\n\t.object({\n\t\tkind: z\n\t\t\t.enum([\"blocked\", \"needs_input\", \"replan_required\"])\n\t\t\t.default(\"needs_input\"),\n\t\tsummary: z.string().min(1),\n\t\tresolutionHint: z.string().min(1).optional(),\n\t})\n\t.strict();\n\nexport const WorkerResultSchema = z\n\t.discriminatedUnion(\"status\", [\n\t\tz\n\t\t\t.object({\n\t\t\t\tstatus: z.literal(\"ok\"),\n\t\t\t\tfeatureId: z.string().regex(FEATURE_ID_PATTERN, FEATURE_ID_MESSAGE),\n\t\t\t\tsummary: z.string().min(1),\n\t\t\t\tartifactsChanged: z.array(ArtifactSchema).default([]),\n\t\t\t\tvalidationRun: z.array(ValidationRunSchema).default([]),\n\t\t\t\tvalidationScope: ValidationScopeSchema,\n\t\t\t\tfeatureReview: ReviewSchema,\n\t\t\t\tfinalReview: FinalReviewSchema.optional(),\n\t\t\t\toutcome: WorkerOutcomeSchema.optional(),\n\t\t\t})\n\t\t\t.strict(),\n\t\tz\n\t\t\t.object({\n\t\t\t\tstatus: z.literal(\"needs_input\"),\n\t\t\t\tfeatureId: z.string().regex(FEATURE_ID_PATTERN, FEATURE_ID_MESSAGE),\n\t\t\t\tsummary: z.string().min(1),\n\t\t\t\tartifactsChanged: z.array(ArtifactSchema).default([]),\n\t\t\t\tvalidationRun: z.array(ValidationRunSchema).default([]),\n\t\t\t\tvalidationScope: ValidationScopeSchema.optional(),\n\t\t\t\tfeatureReview: ReviewSchema.optional(),\n\t\t\t\tfinalReview: FinalReviewSchema.optional(),\n\t\t\t\toutcome: NeedsInputOutcomeSchema,\n\t\t\t})\n\t\t\t.strict(),\n\t])\n\t.superRefine((value, ctx) => {\n\t\tif (\n\t\t\tvalue.status === \"ok\" &&\n\t\t\tvalue.outcome?.kind &&\n\t\t\tvalue.outcome.kind !== \"completed\"\n\t\t) {\n\t\t\tctx.addIssue({\n\t\t\t\tcode: \"custom\",\n\t\t\t\tpath: [\"outcome\", \"kind\"],\n\t\t\t\tmessage: 'ok worker results must use outcome.kind \"completed\".',\n\t\t\t});\n\t\t}\n\t});\n\nexport const ExecutionHistoryEntrySchema = z\n\t.object({\n\t\tfeatureId: z.string().regex(FEATURE_ID_PATTERN, FEATURE_ID_MESSAGE),\n\t\tstatus: z.enum([\"completed\", \"blocked\", \"needs_input\"]),\n\t\tsummary: z.string().min(1),\n\t\trecordedAt: z.string().min(1),\n\t\tartifactsChanged: z.array(ArtifactSchema).default([]),\n\t\tvalidationRun: z.array(ValidationRunSchema).default([]),\n\t\tvalidationScope: ValidationScopeSchema.optional(),\n\t\tfeatureReview: ReviewSchema.optional(),\n\t\tfinalReview: FinalReviewSchema.optional(),\n\t\toutcome: WorkerOutcomeSchema.optional(),\n\t})\n\t.strict();\n\nexport const SessionSchema = z\n\t.object({\n\t\tversion: z.literal(2),\n\t\tid: z.string().min(1),\n\t\tgoal: z.string().min(1),\n\t\tstatus: SessionStatusSchema,\n\t\tapproval: z.enum([\"pending\", \"approved\"]),\n\t\tplan: PlanSchema.nullable(),\n\t\tactiveFeatureId: z\n\t\t\t.string()\n\t\t\t.regex(FEATURE_ID_PATTERN, FEATURE_ID_MESSAGE)\n\t\t\t.nullable(),\n\t\thistory: z.array(ExecutionHistoryEntrySchema).default([]),\n\t\tclosure: z\n\t\t\t.object({\n\t\t\t\tkind: z.enum([\"completed\", \"deferred\", \"abandoned\"]),\n\t\t\t\tsummary: z.string().min(1),\n\t\t\t\trecordedAt: z.string().min(1),\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.nullable(),\n\t\tlastError: z\n\t\t\t.object({\n\t\t\t\ttool: z.string().min(1),\n\t\t\t\tsummary: z.string().min(1),\n\t\t\t\trecovery: z.string().min(1).optional(),\n\t\t\t\trecordedAt: z.string().min(1),\n\t\t\t})\n\t\t\t.strict()\n\t\t\t.nullable()\n\t\t\t.default(null),\n\t\ttimestamps: z\n\t\t\t.object({\n\t\t\t\tcreatedAt: z.string().min(1),\n\t\t\t\tupdatedAt: z.string().min(1),\n\t\t\t\tcompletedAt: z.string().min(1).nullable(),\n\t\t\t})\n\t\t\t.strict(),\n\t})\n\t.strict();\n\nexport type Artifact = z.infer<typeof ArtifactSchema>;\nexport type ExecutionHistoryEntry = z.infer<typeof ExecutionHistoryEntrySchema>;\nexport type Feature = z.infer<typeof FeatureSchema>;\nexport type FinalReview = z.infer<typeof FinalReviewSchema>;\nexport type Plan = z.infer<typeof PlanSchema>;\nexport type PlanInput = z.input<typeof PlanInputSchema>;\nexport type Review = z.infer<typeof ReviewSchema>;\nexport type Session = z.infer<typeof SessionSchema>;\nexport type ValidationRun = z.infer<typeof ValidationRunSchema>;\nexport type WorkerResult = z.infer<typeof WorkerResultSchema>;\n",
10
- "export type FlowPermissionConfig = {\n\tedit?: string;\n\tbash?: string;\n\ttask?: Record<string, string>;\n\t[toolPattern: string]: string | Record<string, string> | undefined;\n};\n\nexport type FlowAgentConfig = {\n\tmode: \"subagent\";\n\tdescription: string;\n\tprompt: string;\n\thidden?: boolean;\n\tpermission?: FlowPermissionConfig;\n};\n\nexport type FlowCommandConfig = {\n\tdescription: string;\n\ttemplate: string;\n\tagent?: string;\n\tsubtask?: boolean;\n};\n\nexport type MutableFlowConfig = {\n\tagent?: Record<string, unknown>;\n\tcommand?: Record<string, unknown>;\n};\n\nexport const FLOW_CORE_AGENTS = {\n\t\"flow-reviewer\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription: \"Internal read-only reviewer for Flow-guided work.\",\n\t\tprompt:\n\t\t\t\"Load `flow-review`. Inspect the current work read-only, report findings, and do not mutate Flow state.\",\n\t\tpermission: {\n\t\t\tedit: \"deny\",\n\t\t\tbash: \"deny\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n} satisfies Record<string, FlowAgentConfig>;\n\nexport const FLOW_CORE_COMMANDS = {\n\t\"flow-auto\": {\n\t\tdescription: \"Drive Flow skills against the minimal runtime ledger\",\n\t\ttemplate:\n\t\t\t\"Load the `flow` skill and drive the Flow loop until completion or a real blocker: $ARGUMENTS\",\n\t},\n\t\"flow-plan\": {\n\t\tdescription: \"Create or approve a Flow plan\",\n\t\ttemplate: \"Load the `flow-plan` skill and plan: $ARGUMENTS\",\n\t},\n\t\"flow-run\": {\n\t\tdescription: \"Run one approved Flow feature\",\n\t\ttemplate:\n\t\t\t\"Load the `flow-run` skill and execute the next approved feature. $ARGUMENTS\",\n\t},\n\t\"flow-review\": {\n\t\tdescription: \"Run a read-only Flow review\",\n\t\tagent: \"flow-reviewer\",\n\t\tsubtask: true,\n\t\ttemplate: \"Load the `flow-review` skill and review: $ARGUMENTS\",\n\t},\n\t\"flow-status\": {\n\t\tdescription: \"Inspect the active Flow session\",\n\t\ttemplate: \"Call flow_status and report the session state and next action.\",\n\t},\n} satisfies Record<string, FlowCommandConfig>;\n\nexport function createFlowCoreConfigEntries() {\n\treturn {\n\t\tagent: Object.fromEntries(\n\t\t\tObject.entries(FLOW_CORE_AGENTS).map(([name, value]) => {\n\t\t\t\tconst permission = value.permission\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...value.permission,\n\t\t\t\t\t\t\t...(value.permission.task\n\t\t\t\t\t\t\t\t? { task: { ...value.permission.task } }\n\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\t\t\t\treturn [\n\t\t\t\t\tname,\n\t\t\t\t\t{\n\t\t\t\t\t\t...value,\n\t\t\t\t\t\t...(permission ? { permission } : {}),\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t}),\n\t\t),\n\t\tcommand: Object.fromEntries(\n\t\t\tObject.entries(FLOW_CORE_COMMANDS).map(([name, value]) => [\n\t\t\t\tname,\n\t\t\t\t{ ...value },\n\t\t\t]),\n\t\t),\n\t};\n}\n\nexport function applyFlowConfig(config: MutableFlowConfig): void {\n\tconst entries = createFlowCoreConfigEntries();\n\tconfig.agent = { ...(config.agent ?? {}), ...entries.agent };\n\tconfig.command = { ...(config.command ?? {}), ...entries.command };\n}\n",
10
+ "export type FlowPermissionConfig = {\n\tedit?: string;\n\tbash?: string;\n\ttask?: Record<string, string>;\n\t[toolPattern: string]: string | Record<string, string> | undefined;\n};\n\nexport type FlowAgentConfig = {\n\tmode: \"subagent\";\n\tdescription: string;\n\tprompt: string;\n\thidden?: boolean;\n\tpermission?: FlowPermissionConfig;\n};\n\nexport type FlowCommandConfig = {\n\tdescription: string;\n\ttemplate: string;\n\tagent?: string;\n\tsubtask?: boolean;\n};\n\nexport type MutableFlowConfig = {\n\tagent?: Record<string, unknown>;\n\tcommand?: Record<string, unknown>;\n};\n\nexport const FLOW_CORE_AGENTS = {\n\t\"flow-reviewer\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription: \"Internal read-only reviewer for Flow-guided work.\",\n\t\tprompt:\n\t\t\t\"Load `flow-review`. Inspect the current work read-only, report coverage, evidence-backed findings, confidence, gaps, and manager follow-ups, and do not mutate Flow state.\",\n\t\tpermission: {\n\t\t\tedit: \"deny\",\n\t\t\tbash: \"deny\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n\t\"flow-evidence-worker\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription:\n\t\t\t\"Internal read-only evidence worker for Flow planning and execution support.\",\n\t\tprompt:\n\t\t\t\"Use Flow evidence mode. Inspect only the assigned slice, do not edit files, do not call state-changing Flow tools, and return coverage, evidence inspected, confidence-tagged findings or facts, gaps, and manager follow-ups.\",\n\t\tpermission: {\n\t\t\tedit: \"deny\",\n\t\t\tbash: \"deny\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n\t\"flow-validation-worker\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription:\n\t\t\t\"Internal validation worker for Flow check selection and command evidence.\",\n\t\tprompt:\n\t\t\t\"Use Flow validation mode. Run only manager-specified commands or propose focused checks, do not edit files, do not call state-changing Flow tools, and report exact command, status, raw outcome summary, coverage, confidence, gaps, and manager follow-ups.\",\n\t\tpermission: {\n\t\t\tedit: \"deny\",\n\t\t\tbash: \"ask\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n\t\"flow-audit-worker\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription:\n\t\t\t\"Internal read-only audit worker for refuted or surviving finding candidates.\",\n\t\tprompt:\n\t\t\t\"Use Flow audit mode. Inspect only the assigned slice, actively refute candidate findings before reporting them, do not edit files, do not call state-changing Flow tools, and return coverage, evidence, guards checked, confidence, gaps, and manager follow-ups.\",\n\t\tpermission: {\n\t\t\tedit: \"deny\",\n\t\t\tbash: \"ask\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n\t\"flow-candidate-worker\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription:\n\t\t\t\"Internal candidate implementation worker for isolated Flow worktrees or exact non-overlapping path ownership.\",\n\t\tprompt:\n\t\t\t\"Use Flow candidate-implementation mode only when the manager assigned an isolated worktree or exact non-overlapping path ownership. Do not edit .flow/**, do not call state-changing Flow tools, do not complete Flow state, and return changed or proposed patch, verification run, coverage, confidence, merge risks, and manager follow-ups.\",\n\t\tpermission: {\n\t\t\tedit: \"ask\",\n\t\t\tbash: \"ask\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n\t\"flow-verifier-worker\": {\n\t\tmode: \"subagent\",\n\t\thidden: true,\n\t\tdescription:\n\t\t\t\"Internal verifier worker for checking Flow worker claims against cited evidence.\",\n\t\tprompt:\n\t\t\t\"Use Flow verifier mode. Verify only the assigned claims against the provided sources, commands, counts, or current docs. Do not generate new scope, do not edit files, do not call state-changing Flow tools, and return supported, partly-supported, unsupported, or source-not-found per claim with evidence, confidence, gaps, and manager follow-ups.\",\n\t\tpermission: {\n\t\t\tedit: \"deny\",\n\t\t\tbash: \"ask\",\n\t\t\ttask: { \"*\": \"deny\" },\n\t\t\t\"flow_*\": \"deny\",\n\t\t\tflow_status: \"allow\",\n\t\t},\n\t},\n} satisfies Record<string, FlowAgentConfig>;\n\nexport const FLOW_CORE_COMMANDS = {\n\t\"flow-auto\": {\n\t\tdescription: \"Drive Flow skills against the minimal runtime ledger\",\n\t\ttemplate:\n\t\t\t\"Load the `flow` skill and drive the Flow loop until completion or a real blocker: $ARGUMENTS\",\n\t},\n\t\"flow-plan\": {\n\t\tdescription: \"Create or approve a Flow plan\",\n\t\ttemplate: \"Load the `flow-plan` skill and plan: $ARGUMENTS\",\n\t},\n\t\"flow-run\": {\n\t\tdescription: \"Run one approved Flow feature\",\n\t\ttemplate:\n\t\t\t\"Load the `flow-run` skill and execute the next approved feature. $ARGUMENTS\",\n\t},\n\t\"flow-review\": {\n\t\tdescription: \"Run a read-only Flow review\",\n\t\tagent: \"flow-reviewer\",\n\t\tsubtask: true,\n\t\ttemplate: \"Load the `flow-review` skill and review: $ARGUMENTS\",\n\t},\n\t\"flow-status\": {\n\t\tdescription: \"Inspect the active Flow session\",\n\t\ttemplate: \"Call flow_status and report the session state and next action.\",\n\t},\n} satisfies Record<string, FlowCommandConfig>;\n\nexport function createFlowCoreConfigEntries() {\n\treturn {\n\t\tagent: Object.fromEntries(\n\t\t\tObject.entries(FLOW_CORE_AGENTS).map(([name, value]) => {\n\t\t\t\tconst permission = value.permission\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...value.permission,\n\t\t\t\t\t\t\t...(value.permission.task\n\t\t\t\t\t\t\t\t? { task: { ...value.permission.task } }\n\t\t\t\t\t\t\t\t: {}),\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined;\n\t\t\t\treturn [\n\t\t\t\t\tname,\n\t\t\t\t\t{\n\t\t\t\t\t\t...value,\n\t\t\t\t\t\t...(permission ? { permission } : {}),\n\t\t\t\t\t},\n\t\t\t\t];\n\t\t\t}),\n\t\t),\n\t\tcommand: Object.fromEntries(\n\t\t\tObject.entries(FLOW_CORE_COMMANDS).map(([name, value]) => [\n\t\t\t\tname,\n\t\t\t\t{ ...value },\n\t\t\t]),\n\t\t),\n\t};\n}\n\nexport function applyFlowConfig(config: MutableFlowConfig): void {\n\tconst entries = createFlowCoreConfigEntries();\n\tconfig.agent = { ...(config.agent ?? {}), ...entries.agent };\n\tconfig.command = { ...(config.command ?? {}), ...entries.command };\n}\n",
11
11
  "import { applyFlowConfig, type MutableFlowConfig } from \"../../config-shared\";\n\nexport function createConfigHook(_ctx: unknown) {\n\treturn async (config: MutableFlowConfig) => {\n\t\tapplyFlowConfig(config);\n\t};\n}\n",
12
12
  "type FlowLogLevel = \"info\" | \"warn\" | \"error\";\n\nexport function createFlowLog(ctx: unknown) {\n\tconst client = (ctx as { client?: { app?: { log?: unknown } } } | null)\n\t\t?.client;\n\tconst log = client?.app?.log;\n\treturn (level: FlowLogLevel, message: string): void => {\n\t\tif (typeof log !== \"function\") return;\n\t\ttry {\n\t\t\tvoid log.call(client?.app, {\n\t\t\t\tbody: { service: \"opencode-plugin-flow\", level, message },\n\t\t\t});\n\t\t} catch {\n\t\t\t// Logging is best-effort and must never break plugin startup.\n\t\t}\n\t};\n}\n",
13
13
  "import { z } from \"zod\";\nimport { PlanInputSchema, WorkerResultSchema } from \"./schema\";\nimport {\n\tapplyPlan,\n\tapprovePlan,\n\tcloseSession,\n\tcompleteFeature,\n\tcreateSession,\n\tresetFeature,\n\tstartRun,\n\tsummarizeSession,\n} from \"./transitions\";\nimport {\n\tarchiveAndClearSession,\n\tloadSession,\n\tsaveSession,\n\twithSessionLock,\n} from \"./workspace\";\n\nexport type RuntimeResponse = Record<string, unknown>;\n\nexport const FlowPlanSaveSchema = z\n\t.object({\n\t\tgoal: z.string().trim().min(1).optional(),\n\t\tplan: PlanInputSchema.optional(),\n\t})\n\t.strict();\n\nexport const FlowRunStartSchema = z\n\t.object({\n\t\tfeatureId: z.string().min(1).optional(),\n\t})\n\t.strict();\n\nexport const FlowFeatureResetSchema = z\n\t.object({\n\t\tfeatureId: z.string().min(1),\n\t})\n\t.strict();\n\nexport const FlowSessionCloseSchema = z\n\t.object({\n\t\tkind: z.enum([\"completed\", \"deferred\", \"abandoned\"]),\n\t\tsummary: z.string().trim().min(1).optional(),\n\t})\n\t.strict();\n\nfunction responseFromFailure(result: {\n\tmessage: string;\n\trecovery?: string;\n}): RuntimeResponse {\n\treturn {\n\t\tstatus: \"error\",\n\t\tsummary: result.message,\n\t\t...(result.recovery ? { recovery: result.recovery } : {}),\n\t};\n}\n\nasync function mutate(\n\tworktree: string,\n\ttask: (\n\t\tsession: Awaited<ReturnType<typeof loadSession>>,\n\t) => Promise<RuntimeResponse>,\n): Promise<RuntimeResponse> {\n\treturn withSessionLock(worktree, async () =>\n\t\ttask(await loadSession(worktree)),\n\t);\n}\n\nexport async function flowStatus(worktree: string): Promise<RuntimeResponse> {\n\treturn summarizeSession(await loadSession(worktree));\n}\n\nexport async function flowPlanSave(\n\tworktree: string,\n\tinput: unknown,\n): Promise<RuntimeResponse> {\n\tconst args = FlowPlanSaveSchema.parse(input ?? {});\n\treturn mutate(worktree, async (existing) => {\n\t\tconst goal = args.goal ?? existing?.goal;\n\t\tif (!goal) {\n\t\t\treturn {\n\t\t\t\tstatus: \"missing_goal\",\n\t\t\t\tsummary: \"Provide a goal before saving a Flow plan.\",\n\t\t\t\tnextAction: \"/flow-plan <goal>\",\n\t\t\t};\n\t\t}\n\t\tif (existing?.status === \"completed\") {\n\t\t\tawait archiveAndClearSession(worktree, existing);\n\t\t}\n\t\tconst base =\n\t\t\texisting?.status === \"completed\"\n\t\t\t\t? createSession(goal)\n\t\t\t\t: (existing ?? createSession(goal));\n\t\tif (base.goal !== goal) {\n\t\t\tif (base.approval === \"approved\") {\n\t\t\t\treturn {\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\tsummary:\n\t\t\t\t\t\t\"An approved Flow session already exists for a different goal. Close it before starting a new one.\",\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\tconst session = base.goal === goal ? base : createSession(goal);\n\t\tconst result = args.plan\n\t\t\t? applyPlan(session, args.plan)\n\t\t\t: { ok: true as const, value: session };\n\t\tif (!result.ok) return responseFromFailure(result);\n\t\tconst saved = await saveSession(worktree, result.value);\n\t\treturn {\n\t\t\t...summarizeSession(saved),\n\t\t\tstatus: \"ok\",\n\t\t\tsummary: args.plan ? \"Flow plan saved.\" : \"Flow session ready.\",\n\t\t};\n\t});\n}\n\nexport async function flowPlanApprove(\n\tworktree: string,\n): Promise<RuntimeResponse> {\n\treturn mutate(worktree, async (session) => {\n\t\tif (!session) {\n\t\t\treturn {\n\t\t\t\tstatus: \"missing_session\",\n\t\t\t\tsummary: \"No active Flow session exists.\",\n\t\t\t\tnextAction: \"/flow-plan <goal>\",\n\t\t\t};\n\t\t}\n\t\tconst result = approvePlan(session);\n\t\tif (!result.ok) return responseFromFailure(result);\n\t\tconst saved = await saveSession(worktree, result.value);\n\t\treturn {\n\t\t\t...summarizeSession(saved),\n\t\t\tstatus: \"ok\",\n\t\t\tsummary: \"Flow plan approved.\",\n\t\t};\n\t});\n}\n\nexport async function flowRunStart(\n\tworktree: string,\n\tinput: unknown,\n): Promise<RuntimeResponse> {\n\tconst args = FlowRunStartSchema.parse(input ?? {});\n\treturn mutate(worktree, async (session) => {\n\t\tif (!session) {\n\t\t\treturn {\n\t\t\t\tstatus: \"missing_session\",\n\t\t\t\tsummary: \"No active Flow session exists.\",\n\t\t\t\tnextAction: \"/flow-plan <goal>\",\n\t\t\t};\n\t\t}\n\t\tconst result = startRun(session, args.featureId);\n\t\tif (!result.ok) return responseFromFailure(result);\n\t\tconst saved = await saveSession(worktree, result.value.session);\n\t\treturn {\n\t\t\t...summarizeSession(saved),\n\t\t\tstatus: \"ok\",\n\t\t\tsummary: `Started feature '${result.value.feature.id}'.`,\n\t\t\tfeature: result.value.feature,\n\t\t};\n\t});\n}\n\nexport async function flowFeatureComplete(\n\tworktree: string,\n\tinput: unknown,\n): Promise<RuntimeResponse> {\n\tconst worker = WorkerResultSchema.parse(input ?? {});\n\treturn mutate(worktree, async (session) => {\n\t\tif (!session) {\n\t\t\treturn {\n\t\t\t\tstatus: \"missing_session\",\n\t\t\t\tsummary: \"No active Flow session exists.\",\n\t\t\t\tnextAction: \"/flow-plan <goal>\",\n\t\t\t};\n\t\t}\n\t\tconst result = completeFeature(session, worker);\n\t\tif (!result.ok) {\n\t\t\tif (result.session) await saveSession(worktree, result.session);\n\t\t\treturn responseFromFailure(result);\n\t\t}\n\t\tconst saved = await saveSession(worktree, result.value);\n\t\treturn {\n\t\t\t...summarizeSession(saved),\n\t\t\tstatus: \"ok\",\n\t\t\tsummary: \"Feature result recorded.\",\n\t\t};\n\t});\n}\n\nexport async function flowFeatureReset(\n\tworktree: string,\n\tinput: unknown,\n): Promise<RuntimeResponse> {\n\tconst args = FlowFeatureResetSchema.parse(input ?? {});\n\treturn mutate(worktree, async (session) => {\n\t\tif (!session) {\n\t\t\treturn {\n\t\t\t\tstatus: \"missing_session\",\n\t\t\t\tsummary: \"No active Flow session exists.\",\n\t\t\t\tnextAction: \"/flow-plan <goal>\",\n\t\t\t};\n\t\t}\n\t\tconst result = resetFeature(session, args.featureId);\n\t\tif (!result.ok) return responseFromFailure(result);\n\t\tconst saved = await saveSession(worktree, result.value);\n\t\treturn {\n\t\t\t...summarizeSession(saved),\n\t\t\tstatus: \"ok\",\n\t\t\tsummary: `Feature '${args.featureId}' reset.`,\n\t\t};\n\t});\n}\n\nexport async function flowSessionClose(\n\tworktree: string,\n\tinput: unknown,\n): Promise<RuntimeResponse> {\n\tconst args = FlowSessionCloseSchema.parse(input ?? {});\n\treturn mutate(worktree, async (session) => {\n\t\tif (!session) {\n\t\t\treturn {\n\t\t\t\tstatus: \"missing_session\",\n\t\t\t\tsummary: \"No active Flow session exists.\",\n\t\t\t\tnextAction: \"/flow-plan <goal>\",\n\t\t\t};\n\t\t}\n\t\tconst result = closeSession(session, args.kind, args.summary);\n\t\tif (!result.ok) return responseFromFailure(result);\n\t\tawait archiveAndClearSession(worktree, result.value);\n\t\treturn {\n\t\t\tstatus: \"ok\",\n\t\t\tsummary: `Flow session closed as ${args.kind}.`,\n\t\t\tarchivedSessionId: result.value.id,\n\t\t\tclosure: result.value.closure,\n\t\t};\n\t});\n}\n",
@@ -17,7 +17,7 @@
17
17
  "import {\n\tflowFeatureComplete,\n\tflowFeatureReset,\n\tflowPlanApprove,\n\tflowPlanSave,\n\tflowRunStart,\n\tflowSessionClose,\n\tflowStatus,\n} from \"../../runtime/api\";\nimport { resolveWorkspaceRoot } from \"../../runtime/workspace\";\nimport { createFlowLog } from \"./logging\";\nimport { type ToolContext, tool } from \"./sdk\";\n\nconst z = tool.schema;\n\nfunction toJson(value: unknown): string {\n\treturn JSON.stringify(value, null, 2);\n}\n\nfunction toolError(error: unknown): string {\n\treturn toJson({\n\t\tstatus: \"error\",\n\t\tsummary: error instanceof Error ? error.message : String(error),\n\t});\n}\n\nasync function execute(\n\tcontext: ToolContext,\n\thandler: (worktree: string) => Promise<Record<string, unknown>>,\n): Promise<string> {\n\ttry {\n\t\treturn toJson(await handler(resolveWorkspaceRoot(context)));\n\t} catch (error) {\n\t\treturn toolError(error);\n\t}\n}\n\nexport function createTools(ctx: unknown) {\n\tcreateFlowLog(ctx)(\"info\", \"Creating minimal Flow v4 tool surface.\");\n\treturn {\n\t\tflow_status: tool({\n\t\t\tdescription: \"Show the active Flow session and next action\",\n\t\t\targs: {},\n\t\t\texecute: (_args, context) => execute(context, flowStatus),\n\t\t}),\n\t\tflow_plan_save: tool({\n\t\t\tdescription: \"Create or update a draft Flow plan for the active goal\",\n\t\t\targs: {\n\t\t\t\tgoal: z.string().optional(),\n\t\t\t\tplan: z.any().optional(),\n\t\t\t},\n\t\t\texecute: (args, context) =>\n\t\t\t\texecute(context, (worktree) => flowPlanSave(worktree, args)),\n\t\t}),\n\t\tflow_plan_approve: tool({\n\t\t\tdescription: \"Approve the current draft Flow plan\",\n\t\t\targs: {},\n\t\t\texecute: (_args, context) => execute(context, flowPlanApprove),\n\t\t}),\n\t\tflow_run_start: tool({\n\t\t\tdescription: \"Start the next runnable approved Flow feature\",\n\t\t\targs: {\n\t\t\t\tfeatureId: z.string().optional(),\n\t\t\t},\n\t\t\texecute: (args, context) =>\n\t\t\t\texecute(context, (worktree) => flowRunStart(worktree, args)),\n\t\t}),\n\t\tflow_feature_complete: tool({\n\t\t\tdescription:\n\t\t\t\t\"Record a completed or blocked active feature with validation and review evidence\",\n\t\t\targs: {\n\t\t\t\tstatus: z.enum([\"ok\", \"needs_input\"]),\n\t\t\t\tfeatureId: z.string(),\n\t\t\t\tsummary: z.string(),\n\t\t\t\tartifactsChanged: z.array(z.object({ path: z.string() })).optional(),\n\t\t\t\tvalidationRun: z\n\t\t\t\t\t.array(\n\t\t\t\t\t\tz.object({\n\t\t\t\t\t\t\tcommand: z.string(),\n\t\t\t\t\t\t\tstatus: z.enum([\"passed\", \"failed\"]),\n\t\t\t\t\t\t\tsummary: z.string(),\n\t\t\t\t\t\t}),\n\t\t\t\t\t)\n\t\t\t\t\t.optional(),\n\t\t\t\tvalidationScope: z.enum([\"targeted\", \"broad\"]).optional(),\n\t\t\t\tfeatureReview: z.any().optional(),\n\t\t\t\tfinalReview: z.any().optional(),\n\t\t\t\toutcome: z.any().optional(),\n\t\t\t},\n\t\t\texecute: (args, context) =>\n\t\t\t\texecute(context, (worktree) => flowFeatureComplete(worktree, args)),\n\t\t}),\n\t\tflow_feature_reset: tool({\n\t\t\tdescription: \"Reset one feature and its dependents to pending\",\n\t\t\targs: {\n\t\t\t\tfeatureId: z.string(),\n\t\t\t},\n\t\t\texecute: (args, context) =>\n\t\t\t\texecute(context, (worktree) => flowFeatureReset(worktree, args)),\n\t\t}),\n\t\tflow_session_close: tool({\n\t\t\tdescription: \"Close and archive the active Flow session\",\n\t\t\targs: {\n\t\t\t\tkind: z.enum([\"completed\", \"deferred\", \"abandoned\"]),\n\t\t\t\tsummary: z.string().optional(),\n\t\t\t},\n\t\t\texecute: (args, context) =>\n\t\t\t\texecute(context, (worktree) => flowSessionClose(worktree, args)),\n\t\t}),\n\t};\n}\n",
18
18
  "import {\n\tresolveFlowPluginVersion,\n\trunFlowSkillSync,\n} from \"../../distribution/sync\";\nimport { loadSession } from \"../../runtime/workspace\";\nimport { createConfigHook } from \"./config\";\nimport { createFlowLog } from \"./logging\";\nimport type { Hooks, Plugin, ToolContext } from \"./sdk\";\nimport { createTools } from \"./tools\";\n\nasync function compactSessionFacts(\n\tcontext: Pick<ToolContext, \"worktree\" | \"directory\">,\n): Promise<string | null> {\n\tconst root = context.worktree ?? context.directory;\n\tif (!root) return null;\n\ttry {\n\t\tconst session = await loadSession(root);\n\t\tif (!session) return null;\n\t\treturn [\n\t\t\t\"Flow session facts:\",\n\t\t\t`- goal: ${session.goal}`,\n\t\t\t`- status: ${session.status}`,\n\t\t\t`- approval: ${session.approval}`,\n\t\t\t`- active feature: ${session.activeFeatureId ?? \"none\"}`,\n\t\t\t`- progress: ${\n\t\t\t\tsession.plan?.features.filter(\n\t\t\t\t\t(feature) => feature.status === \"completed\",\n\t\t\t\t).length ?? 0\n\t\t\t}/${session.plan?.features.length ?? 0}`,\n\t\t\t\"Call flow_status before any Flow action.\",\n\t\t].join(\"\\n\");\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nfunction createSystemTransformHook(\n\tctx: Pick<ToolContext, \"worktree\" | \"directory\">,\n): NonNullable<Hooks[\"experimental.chat.system.transform\"]> {\n\treturn async (_input, output) => {\n\t\tconst facts = await compactSessionFacts(ctx);\n\t\tif (facts) output.system.push(facts);\n\t};\n}\n\nconst FlowPlugin: Plugin = async (ctx) => {\n\tconst log = createFlowLog(ctx);\n\tlog(\"info\", \"Flow v4 plugin initialized.\");\n\tawait runFlowSkillSync(resolveFlowPluginVersion(), log);\n\n\treturn {\n\t\tconfig: createConfigHook(ctx),\n\t\ttool: createTools(ctx),\n\t\t\"experimental.chat.system.transform\": createSystemTransformHook(ctx),\n\t\t\"experimental.session.compacting\": async (_input, output) => {\n\t\t\tconst facts = await compactSessionFacts(ctx);\n\t\t\tif (!facts) return;\n\t\t\toutput.context = [...(output.context ?? []), facts];\n\t\t},\n\t};\n};\n\nexport default FlowPlugin;\n"
19
19
  ],
20
- "mappings": "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",
21
- "debugId": "42646A93F00F668D64756E2164756E21",
20
+ "mappings": "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",
21
+ "debugId": "E0CD440B3A586E5F64756E2164756E21",
22
22
  "names": []
23
23
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "opencode-plugin-flow",
3
- "version": "4.0.0",
3
+ "version": "4.1.0",
4
4
  "description": "Stateful planning and execution workflow plugin for OpenCode",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",