opencode-plugin-flow 4.0.1 → 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
@@ -5,6 +5,10 @@ commit history and review evidence.
5
5
 
6
6
  ## [Unreleased]
7
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
+
8
12
  ## [4.0.1] - 2026-06-15
9
13
 
10
14
  Teach Flow to fan out through named evidence, validation, audit, review, and candidate workers while keeping runtime state changes manager-owned.
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.1"]
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 Je,join as i,normalize as k,sep as x}from"node:path";var _=".flow-skill-version";function p(){return process.env.HOME??process.env.USERPROFILE??""}function R(e=p()){return i(e,".config","opencode","skills")}function I(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 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 h(e=p()){let a=R(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),l=await u(i(s,_));if(l===null){o.push(s);continue}let f=F(l),d=!1;for(let[m,v]of f){let c=await u(C(s,m));if(c!==null&&I(c)!==v){d=!0;break}}if(d){o.push(s);continue}await b(s,{recursive:!0,force:!0}),t.push(s)}return{removed:t,kept:o}}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 o of t.removed)process.stdout.write(`Removed Flow skill: ${o}
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
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,39 +1,181 @@
1
- import{createHash as St}from"node:crypto";import{mkdir as _t,readdir as nn,readFile as It,rm as rn,writeFile as M}from"node:fs/promises";import{createRequire as Ct}from"node:module";import{dirname as At,join as I,normalize as Pt,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 fan-out for every worker category whose output can be merged as evidence,
4
- review, validation support, audit findings, or an isolated candidate patch. Flow
5
- execution still has one active feature, and the manager owns every
6
- state-changing Flow tool call.
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.
7
132
 
8
133
  ## Manager sequence
9
134
 
10
- 1. Call \`flow_status\` if a session may exist.
11
- 2. Do a brief serial orientation pass so slices are real and non-overlapping.
12
- 3. Name the manager's immediate local task; do not delegate the next blocker.
13
- 4. Define slices by module, risk, route, command, artifact type, or worktree.
14
- 5. Send workers narrow prompts with exact ownership and expected output shape.
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.
15
149
  6. Continue non-overlapping manager work while workers run.
16
- 7. Reconcile handoffs yourself; dedupe, refute, and decide what belongs in the
17
- plan, completion payload, review payload, or follow-up feature.
18
- 8. Run second waves only for material gaps, conflicts, or missing coverage.
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.
19
159
 
20
160
  ## Modes
21
161
 
22
162
  When fanning out Flow work, select the matching hidden Flow agent by name. Do
23
- not use generic subagents for Flow slices because the Flow workers carry the
163
+ not use generic subagents for Flow slices because Flow workers carry the
24
164
  permission boundaries for each mode.
25
165
 
26
166
  | Mode | Use agent | Worker output | Write access | Flow tools |
27
167
  | --- | --- | --- | --- | --- |
28
- | \`evidence\` | \`flow-evidence-worker\` | Facts, files inspected, gaps, suggested plan targets | No | \`flow_status\` only if needed |
29
- | \`review\` | \`flow-reviewer\` | Candidate findings or review slice summary | No | \`flow_status\` only if needed |
30
- | \`validation\` | \`flow-validation-worker\` | Command options, raw output summaries, coverage gaps | No code edits; commands only when explicitly allowed | \`flow_status\` only if needed |
31
- | \`audit\` | \`flow-audit-worker\` | Refuted or surviving finding candidates | No | \`flow_status\` only if needed |
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 |
32
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 |
33
174
 
34
- Do not fan out parallel \`flow_run_start\`, \`flow_feature_complete\`,
35
- \`flow_feature_reset\`, or \`flow_session_close\` calls. Runtime locking serializes
36
- file writes, but the Flow model accepts only one active feature result at a time.
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.
37
179
 
38
180
  ## Worker rules
39
181
 
@@ -51,9 +193,9 @@ Workers must not edit \`.flow/**\` and must not call:
51
193
  - \`flow_feature_reset\`
52
194
  - \`flow_session_close\`
53
195
 
54
- Workers also must not approve work, close sessions, or claim validation they did
55
- not run. A worker may report raw validation output it actually ran; the manager
56
- decides whether it is strong enough to record.
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.
57
199
 
58
200
  ## Prompt contract
59
201
 
@@ -61,31 +203,17 @@ Every worker prompt includes:
61
203
 
62
204
  \`\`\`text
63
205
  Overall goal, context only: <goal>
64
- Mode: evidence | review | validation | audit | candidate-implementation
65
- Your exact slice: <paths, modules, command, risk lens, or worktree>
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>
66
209
  Do: <bounded actions>
67
- Do not: call Flow state tools, edit .flow/**, own sibling slices, or make the final verdict.
68
- Return exactly the handoff shape below.
69
- \`\`\`
70
-
71
- Ask workers for:
72
-
73
- \`\`\`text
74
- Scope
75
- Evidence inspected
76
- Findings or facts
77
- Open questions / gaps
78
- Suggested Flow follow-ups
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.
79
212
  \`\`\`
80
213
 
81
- For candidate implementation workers, ask for:
82
-
83
- \`\`\`text
84
- Changed or proposed patch
85
- Verification run
86
- Merge risks
87
- Manager follow-ups
88
- \`\`\`
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.
89
217
 
90
218
  ## Where handoffs go
91
219
 
@@ -97,12 +225,117 @@ Manager follow-ups
97
225
  and raw outcome are concrete enough to trust.
98
226
  - Review evidence informs \`featureReview\` or \`finalReview\`, but the manager owns
99
227
  the pass/fail verdict.
228
+ - Audit evidence becomes findings only after refutation and verification rules
229
+ in \`verification-gates.md\`.
100
230
  - Candidate patches are inspected, merged, and validated by the manager before
101
231
  any Flow completion call.
102
232
 
103
- If worker results conflict, prefer the directly inspected source artifact over
104
- summaries and rerun the narrowest missing check.
105
- `;var ne='# 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 re="---\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
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
106
339
 
107
340
  Refactoring is a behavior-preserving sequence of small changes. This workflow keeps cleanup from becoming an unreviewable rewrite.
108
341
 
@@ -144,7 +377,7 @@ Weak evidence includes:
144
377
  - Public contracts and compatibility shims remain intact or were explicitly planned.
145
378
  - Deleted code is actually unreachable or obsolete.
146
379
  - Validation can catch a realistic mistake in the refactor.
147
- `;var ie=`# Deslop smell rubric
380
+ `;var le=`# Deslop smell rubric
148
381
 
149
382
  Use this rubric to turn vague cleanup instincts into reviewable findings.
150
383
 
@@ -178,7 +411,7 @@ class; severity; location; evidence read; refutation checked; why it matters; sa
178
411
  \`\`\`
179
412
 
180
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.
181
- `;var se=`---
414
+ `;var ce=`---
182
415
  name: flow-deslop
183
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.
184
417
  ---
@@ -220,7 +453,73 @@ For each claimed smell removal, verify:
220
453
  - **blast radius** — public contracts and downstream callers still work.
221
454
 
222
455
  Never approve cleanup because it "looks cleaner" without evidence. Tests passing is necessary but not sufficient when the refactor changes structure across files.
223
- `;var le="# Parallel discovery\n\nUse 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.\n\n## Good slices\n\n- Independent modules or packages.\n- Frontend route and backend endpoint pairs.\n- Test, CI, and release surfaces.\n- Risk lenses such as security, persistence, accessibility, migration, or performance.\n- Documentation and operator-contract checks.\n\n## Flow repo default slices\n\nFor this repository, good first-wave slices are:\n\n- Runtime gates: `src/runtime/schema.ts`, `src/runtime/transitions.ts`,\n `src/runtime/api.ts`, and `tests/runtime-gates.test.ts`.\n- Workspace persistence: `src/runtime/workspace.ts`,\n `src/runtime/json/strict-object.ts`, and\n `tests/workspace-persistence.test.ts`.\n- OpenCode adapter surface: `src/adapters/opencode/**`, `src/config-shared.ts`,\n `src/config.ts`, `src/index.ts`, and surface tests.\n- Distribution and synced skills: `src/distribution/**`, `src/cli.ts`,\n `skills/**`, and distribution tests.\n- CI, package, and release contract: `.github/workflows/**`, `package.json`,\n `bun.lock`, `README.md`, and `CHANGELOG.md`.\n- Docs and operator contract: `docs/**`, `README.md`, and skill references.\n\n## Worker prompt\n\n```text\nInspect <slice> for <goal>. Read-only. Do not edit files or call Flow tools.\nReturn: scope inspected; files/commands checked; evidence-backed facts or findings; gaps; suggested feature targets and validation.\n```\n\nFor validation-oriented discovery:\n\n```text\nInspect <slice> for validation risk. Read-only. Do not edit files or call Flow\ntools. You may report commands that should be run, and include raw output only\nfor commands you actually ran. Return: scope inspected; validation-relevant\nfacts; suggested targeted checks; broad-gate implications; gaps.\n```\n\n## Synthesis\n\nConvert only evidence-backed work into plan fields:\n\n- `requirements`: user promises and externally visible acceptance criteria.\n- `decisions`: architecture boundaries, rejected approaches, and scope cuts.\n- feature `targets`: files, modules, routes, commands, docs, or workflows the feature owns.\n- feature `validation`: checks expected to prove the feature.\n\nIf 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.\n";var ce=`# Planning examples
456
+ `;var de=`# Parallel discovery
457
+
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.
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
+
464
+ ## Good slices
465
+
466
+ - Independent modules or packages.
467
+ - Frontend route and backend endpoint pairs.
468
+ - Test, CI, and release surfaces.
469
+ - Risk lenses such as security, persistence, accessibility, migration, or performance.
470
+ - Documentation and operator-contract checks.
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
+
496
+ ## Worker prompt
497
+
498
+ \`\`\`text
499
+ Inspect <slice> for <goal>. Read-only. Do not edit files or call Flow tools.
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.
510
+ \`\`\`
511
+
512
+ ## Synthesis
513
+
514
+ Convert only evidence-backed work into plan fields:
515
+
516
+ - \`requirements\`: user promises and externally visible acceptance criteria.
517
+ - \`decisions\`: architecture boundaries, rejected approaches, and scope cuts.
518
+ - feature \`targets\`: files, modules, routes, commands, docs, or workflows the feature owns.
519
+ - feature \`validation\`: checks expected to prove the feature.
520
+
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.
522
+ `;var ue=`# Planning examples
224
523
 
225
524
  ## Rate limiting feature set
226
525
 
@@ -305,7 +604,7 @@ Better plan:
305
604
  - Validation that only says "manual testing".
306
605
  - Targets that name the entire repo.
307
606
  - Features with hidden dependencies instead of \`dependsOn\`.
308
- `;var de=`---
607
+ `;var pe=`---
309
608
  name: flow-plan
310
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.
311
610
  ---
@@ -319,7 +618,7 @@ If \`flow_plan_save\` is unavailable, stop and tell the user to check that \`ope
319
618
  ## Inspect first
320
619
 
321
620
  - Read the files, docs, tests, package scripts, and local conventions that determine the work.
322
- - 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.
323
622
  - For cleanup/refactor goals, load \`flow-deslop\`.
324
623
  - For UI/frontend goals, load \`flow-ui-quality\`.
325
624
  - Do not invent findings. Broad "review and fix" goals start with a review-first feature whose deliverable is evidence-backed findings.
@@ -366,7 +665,7 @@ Use \`finalReviewPolicy: "broad"\` only for low-risk, narrow work. Use \`"detail
366
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.
367
666
 
368
667
  See \`references/planning-examples.md\` for payload examples and decomposition anti-patterns.
369
- `;var ue=`# Review rubric
668
+ `;var fe=`# Review rubric
370
669
 
371
670
  Use this to decide whether a \`featureReview\` or \`finalReview\` payload may pass.
372
671
 
@@ -454,7 +753,7 @@ When reviewing a findings report, verify findings adversarially:
454
753
  - Downgrade or reject findings that do not survive refutation.
455
754
 
456
755
  Approve only on evidence actually inspected. A review is a claim of coverage, not a courtesy stamp.
457
- `;var pe=`---
756
+ `;var me=`---
458
757
  name: flow-review
459
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.
460
759
  ---
@@ -514,11 +813,12 @@ Use \`status: "failed"\` when any blocking finding remains. Advisory findings ma
514
813
  - Large reviews: use \`../flow/references/parallel-orchestration.md\` for
515
814
  read-only slices by changed-file group, risk lens, or validation surface.
516
815
  Use the named review, audit, evidence, or validation agents from that
517
- reference instead of generic subagents. Synthesize the handoffs yourself; only
518
- the manager returns the final \`featureReview\` or \`finalReview\` payload.
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.
519
819
 
520
820
  Never approve to unblock completion, fix findings in the review pass, or vouch for validation you did not inspect.
521
- `;var fe=`# Audit findings rubric
821
+ `;var he=`# Audit findings rubric
522
822
 
523
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.
524
824
 
@@ -538,8 +838,9 @@ A finding that survives this pass is worth reporting. A finding you did not try
538
838
 
539
839
  For broad audits, use \`../../flow/references/parallel-orchestration.md\` to split
540
840
  read-only slices by module, data flow, or risk lens. Workers surface candidates;
541
- the audit author owns the report. Before blocking severity, dedupe, trace
542
- 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.
543
844
 
544
845
  ## Every blocking finding records "guards checked"
545
846
 
@@ -570,7 +871,7 @@ follow-up order — correctness and persisted/user-input surfaces first
570
871
  \`\`\`
571
872
 
572
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.
573
- `;var me=`# Validation evidence rubric
874
+ `;var ge=`# Validation evidence rubric
574
875
 
575
876
  Use this before recording \`flow_feature_complete\`.
576
877
 
@@ -588,6 +889,7 @@ Use the strongest practical tier. For risky work, combine tiers.
588
889
  - Each \`validationRun\` entry has \`command\`, \`status\`, and \`summary\`.
589
890
  - Completion accepts only passing entries. Failed or skipped checks belong in the summary/notes and must be resolved or explained as blockers.
590
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.
591
893
  - Include scope in the summary: what behavior, files, routes, or states the check covered.
592
894
  - UI work should include browser or screenshot evidence when the app can run locally.
593
895
  - Cleanup/refactor work should show behavior preservation, not only formatting success.
@@ -626,7 +928,7 @@ Broad validation usually means the repo's full check command, full relevant test
626
928
  - If validation needs external access, missing credentials, or ambiguous user input, record \`status: "needs_input"\` with an honest \`outcome\`.
627
929
 
628
930
  Never trim failing output, relabel a failed command as passed, or use "not run" as completion evidence.
629
- `;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\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 may report command output they actually ran or propose focused checks;\nthe manager 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 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
630
932
 
631
933
  Use this rubric for frontend planning, implementation, and review.
632
934
 
@@ -670,7 +972,7 @@ class; severity; location or screenshot area; evidence inspected; user impact; f
670
972
  \`\`\`
671
973
 
672
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.
673
- `;var ve=`# Visual verification workflow
975
+ `;var ye=`# Visual verification workflow
674
976
 
675
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.
676
978
 
@@ -710,7 +1012,7 @@ Record the reason and use the strongest available substitute:
710
1012
  - code inspection against existing component patterns.
711
1013
 
712
1014
  Do not claim visual polish was verified if no visual artifact was inspected.
713
- `;var we=`---
1015
+ `;var be=`---
714
1016
  name: flow-ui-quality
715
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.
716
1018
  ---
@@ -755,13 +1057,13 @@ Approve only when the interface is both useful and inspectable:
755
1057
  - Screenshot/browser evidence supports the claim whenever feasible.
756
1058
 
757
1059
  Never approve a UI change based only on code shape. If users will judge it visually, Flow evidence should include visual inspection.
758
- `;var ye=[{name:"flow",files:[{relativePath:"SKILL.md",content:re},{relativePath:"references/recovery-playbook.md",content:ne},{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 Fe(e){return St("sha256").update(e).digest("hex")}function be(e,a){return[`version=${a}`,...e.files.map((t)=>`file=${t.relativePath} sha256=${Fe(t.content)}`),""].join(`
759
- `)}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 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 ke(e,a){let t=Pt(I(e,...a.split("/")));if(t!==e&&t.startsWith(`${e}${Tt}`))return t;throw Error(`Unsafe skill file path '${a}'.`)}async function Ut(e,a,t){let n=I(t,e.name),r=I(n,Et),i=await V(r),s=jt(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 _=ke(n,x.relativePath),P=await V(_);if(P===x.content)continue;m=!0;let te=s.get(x.relativePath);if(P!==null&&(te?Fe(P)!==te:i!==null))await M(`${_}.backup`,P,"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(n,x.relativePath);await _t(At(_),{recursive:!0}),await M(_,x.content,"utf8")}return await M(r,be(e,a),"utf8"),{name:e.name,action:ee?"updated_with_backup":st?"updated":"installed"}}function Re(){if(process.env.npm_package_version)return process.env.npm_package_version;try{let e=Ct(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 Nt(e,a=xe()){let t=Ot(a);return Promise.all(ye.map((n)=>Ut(n,e,t)))}async function Se(e,a){try{let n=(await Nt(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 Vt}from"node:crypto";import{mkdir as N,open as Te,readFile as je,rename as Jt,rm as q,writeFile as Ee}from"node:fs/promises";import{homedir as Bt}from"node:os";import{dirname as Oe,isAbsolute as vn,join as F,parse as Gt,resolve as Ue}from"node:path";import{setTimeout as Kt}from"node:timers/promises";function qt(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 _e(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=qt(e);if(n)return{ok:!1,error:`${a} has duplicate key '${n}'.`};return{ok:!0,value:t}}import{z as o}from"zod";var v=/^[a-z0-9]+(?:-[a-z0-9]+)*$/,C="Feature ids must be lowercase kebab-case",Ie=o.enum(["pending","in_progress","completed","blocked"]),Dt=o.enum(["planning","ready","running","blocked","completed"]),$t=o.enum(["passed","failed"]),Wt=o.enum(["passed","failed"]),J=o.enum(["targeted","broad"]),H=o.enum(["broad","detailed"]),zt=o.object({summary:o.string().min(1),severity:o.enum(["blocking","advisory"]).default("blocking")}).strict(),T=o.object({status:$t,summary:o.string().min(1),blockingFindings:o.array(zt).default([])}).strict(),B=T.extend({reviewDepth:H}).strict(),G=o.object({command:o.string().min(1),status:Wt,summary:o.string().min(1)}).strict(),K=o.object({path:o.string().min(1)}).strict(),Ce=o.object({id:o.string().regex(v,C),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(Ce).min(1)}).strict(),E=Ae.omit({features:!0}).extend({finalReviewPolicy:H.optional(),features:o.array(Ce.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)}),Pe=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,C),summary:o.string().min(1),artifactsChanged:o.array(K).default([]),validationRun:o.array(G).default([]),validationScope:J,featureReview:T,finalReview:B.optional(),outcome:Pe.optional()}).strict(),o.object({status:o.literal("needs_input"),featureId:o.string().regex(v,C),summary:o.string().min(1),artifactsChanged:o.array(K).default([]),validationRun:o.array(G).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,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(G).default([]),validationScope:J.optional(),featureReview:T.optional(),finalReview:B.optional(),outcome:Pe.optional()}).strict(),j=o.object({version:o.literal(2),id:o.string().min(1),goal:o.string().min(1),status:Dt,approval:o.enum(["pending","approved"]),plan:Ae.nullable(),activeFeatureId:o.string().regex(v,C).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 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=Ue(a);return Gt(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===Ue(process.env.HOME??Bt()))throw new D("Flow refuses to use $HOME itself as a mutable workspace root.");return a}function Ne(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 qe(e){return F(W(e),"history")}function Ht(e,a){if(!/^[a-zA-Z0-9_-]+$/.test(a))throw Error("Invalid session id.");return F(qe(e),`${a}.json`)}async function De(e,a){await N(Oe(e),{recursive:!0});let t=`${e}.${process.pid}.${Vt()}.tmp`,n=await Te(t,"w");try{await n.writeFile(a,"utf8"),await n.sync()}catch(i){throw await n.close(),await q(t,{force:!0}),i}await n.close();try{await Jt(t,e)}catch(i){throw await q(t,{force:!0}),i}let r=await Te(Oe(e),"r");try{await r.sync()}finally{await r.close()}}var U=new Map,Xt=30000,Yt=25;async function Zt(e){let a=W(e),t=F(a,"session.lock"),n=Date.now();while(!0)try{return await N(t,{recursive:!1}),async()=>{await q(t,{recursive:!0,force:!0})}}catch(r){let i=r.code;if(i==="ENOENT"){await N(a,{recursive:!0});continue}if(i!=="EEXIST")throw r;if(Date.now()-n>Xt)throw Error(`Timed out waiting for Flow session lock at ${t}.`);await Kt(Yt)}}async function $e(e,a){let t=U.get(e)??Promise.resolve(),n=()=>{},r=new Promise((d)=>{n=d}),i=t.catch(()=>{return}).then(()=>r);U.set(e,i);let s=null;try{return await t.catch(()=>{return}),s=await Zt(e),await a()}finally{try{await s?.()}finally{if(n(),U.get(e)===i)U.delete(e)}}}async function A(e){let a=$(e),t;try{t=await je(Y(a),"utf8")}catch(r){if(r.code==="ENOENT")return null;throw r}let n=_e(t,"Flow session file");if(!n.ok)throw Error(n.error);return j.parse(n.value)}async function w(e,a){let t=$(e),n=j.parse(a);return await De(Y(t),`${JSON.stringify(n,null,2)}
760
- `),await We(t),n}async function Z(e,a){let t=$(e);await N(qe(t),{recursive:!0}),await De(Ht(t,a.id),`${JSON.stringify(j.parse(a),null,2)}
761
- `),await q(Y(t),{force:!0}),await We(t)}async function We(e){let a=F(W(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()}
762
1064
  session.lock/
763
- `,"utf8")}catch(t){if(t.code!=="ENOENT")throw t;await Ee(a,`session.lock/
764
- `,"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"}},"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 scope, evidence inspected, findings or facts, gaps, and suggested Flow 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, and gaps.",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 evidence, guards checked, gaps, and 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, merge risks, and manager follow-ups.",permission:{edit:"ask",bash:"ask",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 ze(e){let a=ta();e.agent={...e.agent??{},...a.agent},e.command={...e.command??{},...a.command}}function Le(e){return async(a)=>{ze(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 na}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 ra(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,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:na(),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=ra(a),n=oa(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 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)),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(!Me(i,t))return l(`Feature '${a}' has incomplete dependencies.`);return u(i)}let r=e.find((i)=>Me(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 Ge(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 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 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,n){return l(t,n,{...e,lastError:{tool:a,summary:t,recovery:n,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((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(!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 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 Ke(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 n=la(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 ca(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 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),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 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 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: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:n,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 R(e){return{status:"error",summary:e.message,...e.recovery?{recovery:e.recovery}:{}}}async function S(e,a){return $e(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(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 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 R(t);let n=await w(e,t.value);return{...b(n),status:"ok",summary:"Flow plan approved."}})}async function et(e,a){let t=pa.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=Ge(n,t.featureId);if(!r.ok)return R(r);let i=await w(e,r.value.session);return{...b(i),status:"ok",summary:`Started feature '${r.value.feature.id}'.`,feature:r.value.feature}})}async function tt(e,a){let t=O.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=Ke(n,t);if(!r.ok){if(r.session)await w(e,r.session);return R(r)}let i=await w(e,r.value);return{...b(i),status:"ok",summary:"Feature result recorded."}})}async function at(e,a){let t=fa.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 w(e,r.value);return{...b(i),status:"ok",summary:`Feature '${t.featureId}' reset.`}})}async function nt(e,a){let t=ma.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.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 rt(e){return JSON.stringify(e,null,2)}function ha(e){return rt({status:"error",summary:e instanceof Error?e.message:String(e)})}async function k(e,a){try{return rt(await a(Ne(e)))}catch(t){return ha(t)}}function ot(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,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,(n)=>Ze(n,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,(n)=>et(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)=>tt(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)=>at(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)=>nt(n,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((n)=>n.status==="completed").length??0}/${t.plan?.features.length??0}`,"Call flow_status before any Flow action."].join(`
765
- `)}catch{return null}}function ga(e){return async(a,t)=>{let n=await it(e);if(n)t.system.push(n)}}var va=async(e)=>{let a=z(e);return a("info","Flow v4 plugin initialized."),await Se(Re(),a),{config:Le(e),tool:ot(e),"experimental.chat.system.transform":ga(e),"experimental.session.compacting":async(t,n)=>{let r=await it(e);if(!r)return;n.context=[...n.context??[],r]}}},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};
766
1068
 
767
- //# debugId=7C8AC5AB436E3BC964756E2164756E21
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\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 scope, evidence inspected, findings or facts, gaps, and suggested Flow 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, and gaps.\",\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 evidence, guards checked, gaps, and 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, 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} 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": "7C8AC5AB436E3BC964756E2164756E21",
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.1",
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",