opencode-plugin-flow 4.1.11 → 4.1.14

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
@@ -3,6 +3,18 @@
3
3
  One short line per release. For the full rationale behind each entry, see the
4
4
  commit history and review evidence.
5
5
 
6
+ ## [4.1.14] - 2026-06-22
7
+
8
+ Publish Flow through npm trusted publishing so release CI no longer depends on expiring npm tokens.
9
+
10
+ ## [4.1.13] - 2026-06-21
11
+
12
+ Teach Flow's parallel orchestration lore to walk a full wave while pinning hidden worker permissions to tested docs.
13
+
14
+ ## [4.1.12] - 2026-06-18
15
+
16
+ Harden Flow's hidden worker lore, scriptable doctor checks, typed package smoke, and session edge contracts without widening the v4 runtime surface.
17
+
6
18
  ## [4.1.11] - 2026-06-17
7
19
 
8
20
  Give bundled Flow command lore a real title seed so OpenCode can name new chats while keeping the heavy instructions synthetic.
package/README.md CHANGED
@@ -21,8 +21,8 @@ The manager still owns every Flow state change. Workers gather evidence; they do
21
21
  Use OpenCode's plugin installer when your OpenCode version supports it:
22
22
 
23
23
  ```bash
24
- opencode plugin opencode-plugin-flow@4.1.11 --global --force
25
- npx -y opencode-plugin-flow@4.1.11 sync
24
+ opencode plugin opencode-plugin-flow@4.1.14 --global --force
25
+ npx -y opencode-plugin-flow@4.1.14 sync
26
26
  ```
27
27
 
28
28
  The first command adds Flow to your global OpenCode plugin config or replaces an
@@ -48,7 +48,7 @@ OpenCode config manually instead:
48
48
 
49
49
  ```json
50
50
  {
51
- "plugin": ["opencode-plugin-flow@4.1.11"]
51
+ "plugin": ["opencode-plugin-flow@4.1.14"]
52
52
  }
53
53
  ```
54
54
 
@@ -59,7 +59,7 @@ duplicate entry.
59
59
  Then run the same pre-start skill sync and start or restart OpenCode:
60
60
 
61
61
  ```bash
62
- npx -y opencode-plugin-flow@4.1.11 sync
62
+ npx -y opencode-plugin-flow@4.1.14 sync
63
63
  ```
64
64
 
65
65
  Project-local skill overrides still work through OpenCode's normal lookup:
@@ -84,9 +84,21 @@ version in your global `opencode.json`.
84
84
  To inspect the installed skill set:
85
85
 
86
86
  ```bash
87
- npx -y opencode-plugin-flow@4.1.11 doctor
87
+ npx -y opencode-plugin-flow@4.1.14 doctor
88
88
  ```
89
89
 
90
+ For automation, keep the default human-readable `doctor` output and opt into
91
+ machine behavior explicitly:
92
+
93
+ ```bash
94
+ npx -y opencode-plugin-flow@4.1.14 doctor --json
95
+ npx -y opencode-plugin-flow@4.1.14 doctor --check
96
+ ```
97
+
98
+ `doctor --check` and `doctor --strict` exit nonzero when the health status is
99
+ `sync_required` or `action_required`; plain `doctor` remains advisory and exits
100
+ successfully.
101
+
90
102
  If a command reports `Skill "flow-review" not found. Available skills...` or a
91
103
  similar Flow skill-loading error after upgrading, it is usually an older
92
104
  OpenCode process or stale resolved command body. Flow command preflight replaces
@@ -99,7 +111,7 @@ above first. Missing, incomplete, or outdated managed skills can still be
99
111
  repaired with:
100
112
 
101
113
  ```bash
102
- npx -y opencode-plugin-flow@4.1.11 sync
114
+ npx -y opencode-plugin-flow@4.1.14 sync
103
115
  ```
104
116
 
105
117
  Then restart OpenCode so the refreshed registry is loaded. `sync` manages all
@@ -122,6 +134,13 @@ native skill discovery for the required Flow loop:
122
134
  | `/flow-review` | Run a read-only review. |
123
135
  | `/flow-status` | Show the active session and next action. |
124
136
 
137
+ Flow reserves its public command IDs (`flow-auto`, `flow-plan`, `flow-run`,
138
+ `flow-review`, `flow-status`) and internal worker IDs (`flow-reviewer`,
139
+ `flow-evidence-worker`, `flow-validation-worker`, `flow-audit-worker`,
140
+ `flow-candidate-worker`, `flow-verifier-worker`) while the plugin is enabled.
141
+ The plugin injects those entries to keep command preflight and worker permission
142
+ boundaries safe.
143
+
125
144
  `flow-test` and `flow-commit` are managed helper skills, not public commands in
126
145
  this release. `flow-commit` is user-triggered only and stays outside the
127
146
  autonomous Flow runtime loop.
@@ -160,6 +179,12 @@ The runtime owns only safety:
160
179
  - Non-final completion requires `validationScope: "targeted"`.
161
180
  - Final completion requires `validationScope: "broad"` and a passing final review matching the plan's `finalReviewPolicy`.
162
181
  - `flow_session_close` accepts `kind: "completed"` only after an approved plan has passed final completion.
182
+ - Reset keeps prior history entries as audit/provenance data. Current state comes
183
+ from `features`, `activeFeature`, `status`, `progress`, and `closure`, not from
184
+ old completion summaries.
185
+ - Deferred and abandoned closures archive the session with its status at the time
186
+ of closure, clear the active session file, and remove the generated instruction
187
+ projection.
163
188
 
164
189
  Planning quality, decomposition, review depth, validation adequacy, orchestration, and recovery judgment live in the skills.
165
190
 
@@ -201,7 +226,7 @@ First remove `opencode-plugin-flow` from your OpenCode plugin config so future
201
226
  OpenCode startups stop loading Flow. Then remove Flow-owned synced skills:
202
227
 
203
228
  ```bash
204
- npx -y opencode-plugin-flow@4.1.11 uninstall
229
+ npx -y opencode-plugin-flow@4.1.14 uninstall
205
230
  ```
206
231
 
207
232
  Restart OpenCode after both steps. This removes Flow-owned synced skills when
@@ -0,0 +1,3 @@
1
+ import { type MutableFlowConfig } from "../../config-shared";
2
+ import type { ToolContext } from "./sdk";
3
+ export declare function createConfigHook(ctx: Pick<ToolContext, "worktree" | "directory">): (config: MutableFlowConfig) => Promise<void>;
@@ -0,0 +1,3 @@
1
+ type FlowLogLevel = "info" | "warn" | "error";
2
+ export declare function createFlowLog(ctx: unknown): (level: FlowLogLevel, message: string) => void;
3
+ export {};
@@ -0,0 +1,3 @@
1
+ import type { Plugin } from "./sdk";
2
+ declare const FlowPlugin: Plugin;
3
+ export default FlowPlugin;
@@ -0,0 +1,3 @@
1
+ export type { Hooks, Plugin, ToolContext } from "@opencode-ai/plugin";
2
+ export { tool } from "@opencode-ai/plugin";
3
+ export type { Part } from "@opencode-ai/sdk";
@@ -0,0 +1,211 @@
1
+ import { type ToolContext } from "./sdk";
2
+ export declare function createTools(ctx: unknown): {
3
+ flow_status: {
4
+ description: string;
5
+ args: {};
6
+ execute(args: Record<string, never>, context: ToolContext): Promise<import("@opencode-ai/plugin").ToolResult>;
7
+ };
8
+ flow_plan_save: {
9
+ description: string;
10
+ args: {
11
+ goal: import("zod").ZodOptional<import("zod").ZodString>;
12
+ plan: import("zod").ZodOptional<import("zod").ZodObject<{
13
+ summary: import("zod").ZodString;
14
+ overview: import("zod").ZodString;
15
+ requirements: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodString>>;
16
+ decisions: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodString>>;
17
+ finalReviewPolicy: import("zod").ZodOptional<import("zod").ZodEnum<{
18
+ broad: "broad";
19
+ detailed: "detailed";
20
+ }>>;
21
+ features: import("zod").ZodArray<import("zod").ZodObject<{
22
+ summary: import("zod").ZodString;
23
+ id: import("zod").ZodString;
24
+ title: import("zod").ZodString;
25
+ status: import("zod").ZodOptional<import("zod").ZodEnum<{
26
+ pending: "pending";
27
+ in_progress: "in_progress";
28
+ completed: "completed";
29
+ blocked: "blocked";
30
+ }>>;
31
+ targets: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
32
+ validation: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
33
+ dependsOn: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
34
+ }, import("zod/v4/core").$strict>>;
35
+ }, import("zod/v4/core").$strict>>;
36
+ };
37
+ execute(args: {
38
+ goal?: string | undefined;
39
+ plan?: {
40
+ summary: string;
41
+ overview: string;
42
+ requirements: string[];
43
+ decisions: string[];
44
+ features: {
45
+ summary: string;
46
+ id: string;
47
+ title: string;
48
+ status?: "pending" | "in_progress" | "completed" | "blocked" | undefined;
49
+ targets?: string[] | undefined;
50
+ validation?: string[] | undefined;
51
+ dependsOn?: string[] | undefined;
52
+ }[];
53
+ finalReviewPolicy?: "broad" | "detailed" | undefined;
54
+ } | undefined;
55
+ }, context: ToolContext): Promise<import("@opencode-ai/plugin").ToolResult>;
56
+ };
57
+ flow_plan_approve: {
58
+ description: string;
59
+ args: {};
60
+ execute(args: Record<string, never>, context: ToolContext): Promise<import("@opencode-ai/plugin").ToolResult>;
61
+ };
62
+ flow_run_start: {
63
+ description: string;
64
+ args: {
65
+ featureId: import("zod").ZodOptional<import("zod").ZodString>;
66
+ };
67
+ execute(args: {
68
+ featureId?: string | undefined;
69
+ }, context: ToolContext): Promise<import("@opencode-ai/plugin").ToolResult>;
70
+ };
71
+ flow_feature_complete: {
72
+ description: string;
73
+ args: {
74
+ status: import("zod").ZodEnum<{
75
+ ok: "ok";
76
+ needs_input: "needs_input";
77
+ }>;
78
+ featureId: import("zod").ZodString;
79
+ summary: import("zod").ZodString;
80
+ artifactsChanged: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
81
+ path: import("zod").ZodString;
82
+ }, import("zod/v4/core").$strict>>>;
83
+ validationRun: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodObject<{
84
+ command: import("zod").ZodString;
85
+ status: import("zod").ZodEnum<{
86
+ passed: "passed";
87
+ failed: "failed";
88
+ }>;
89
+ summary: import("zod").ZodString;
90
+ }, import("zod/v4/core").$strict>>>;
91
+ validationScope: import("zod").ZodOptional<import("zod").ZodEnum<{
92
+ targeted: "targeted";
93
+ broad: "broad";
94
+ }>>;
95
+ featureReview: import("zod").ZodOptional<import("zod").ZodObject<{
96
+ status: import("zod").ZodEnum<{
97
+ passed: "passed";
98
+ failed: "failed";
99
+ }>;
100
+ summary: import("zod").ZodString;
101
+ blockingFindings: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
102
+ summary: import("zod").ZodString;
103
+ severity: import("zod").ZodDefault<import("zod").ZodEnum<{
104
+ blocking: "blocking";
105
+ advisory: "advisory";
106
+ }>>;
107
+ }, import("zod/v4/core").$strict>>>;
108
+ }, import("zod/v4/core").$strict>>;
109
+ finalReview: import("zod").ZodOptional<import("zod").ZodObject<{
110
+ status: import("zod").ZodEnum<{
111
+ passed: "passed";
112
+ failed: "failed";
113
+ }>;
114
+ summary: import("zod").ZodString;
115
+ blockingFindings: import("zod").ZodDefault<import("zod").ZodArray<import("zod").ZodObject<{
116
+ summary: import("zod").ZodString;
117
+ severity: import("zod").ZodDefault<import("zod").ZodEnum<{
118
+ blocking: "blocking";
119
+ advisory: "advisory";
120
+ }>>;
121
+ }, import("zod/v4/core").$strict>>>;
122
+ reviewDepth: import("zod").ZodEnum<{
123
+ broad: "broad";
124
+ detailed: "detailed";
125
+ }>;
126
+ }, import("zod/v4/core").$strict>>;
127
+ outcome: import("zod").ZodOptional<import("zod").ZodUnion<readonly [import("zod").ZodObject<{
128
+ kind: import("zod").ZodDefault<import("zod").ZodEnum<{
129
+ completed: "completed";
130
+ blocked: "blocked";
131
+ needs_input: "needs_input";
132
+ replan_required: "replan_required";
133
+ }>>;
134
+ summary: import("zod").ZodOptional<import("zod").ZodString>;
135
+ resolutionHint: import("zod").ZodOptional<import("zod").ZodString>;
136
+ }, import("zod/v4/core").$strict>, import("zod").ZodObject<{
137
+ kind: import("zod").ZodDefault<import("zod").ZodEnum<{
138
+ blocked: "blocked";
139
+ needs_input: "needs_input";
140
+ replan_required: "replan_required";
141
+ }>>;
142
+ summary: import("zod").ZodString;
143
+ resolutionHint: import("zod").ZodOptional<import("zod").ZodString>;
144
+ }, import("zod/v4/core").$strict>]>>;
145
+ };
146
+ execute(args: {
147
+ status: "ok" | "needs_input";
148
+ featureId: string;
149
+ summary: string;
150
+ artifactsChanged?: {
151
+ path: string;
152
+ }[] | undefined;
153
+ validationRun?: {
154
+ command: string;
155
+ status: "passed" | "failed";
156
+ summary: string;
157
+ }[] | undefined;
158
+ validationScope?: "targeted" | "broad" | undefined;
159
+ featureReview?: {
160
+ status: "passed" | "failed";
161
+ summary: string;
162
+ blockingFindings: {
163
+ summary: string;
164
+ severity: "blocking" | "advisory";
165
+ }[];
166
+ } | undefined;
167
+ finalReview?: {
168
+ status: "passed" | "failed";
169
+ summary: string;
170
+ blockingFindings: {
171
+ summary: string;
172
+ severity: "blocking" | "advisory";
173
+ }[];
174
+ reviewDepth: "broad" | "detailed";
175
+ } | undefined;
176
+ outcome?: {
177
+ kind: "completed" | "blocked" | "needs_input" | "replan_required";
178
+ summary?: string | undefined;
179
+ resolutionHint?: string | undefined;
180
+ } | {
181
+ kind: "blocked" | "needs_input" | "replan_required";
182
+ summary: string;
183
+ resolutionHint?: string | undefined;
184
+ } | undefined;
185
+ }, context: ToolContext): Promise<import("@opencode-ai/plugin").ToolResult>;
186
+ };
187
+ flow_feature_reset: {
188
+ description: string;
189
+ args: {
190
+ featureId: import("zod").ZodString;
191
+ };
192
+ execute(args: {
193
+ featureId: string;
194
+ }, context: ToolContext): Promise<import("@opencode-ai/plugin").ToolResult>;
195
+ };
196
+ flow_session_close: {
197
+ description: string;
198
+ args: {
199
+ kind: import("zod").ZodEnum<{
200
+ completed: "completed";
201
+ deferred: "deferred";
202
+ abandoned: "abandoned";
203
+ }>;
204
+ summary: import("zod").ZodOptional<import("zod").ZodString>;
205
+ };
206
+ execute(args: {
207
+ kind: "completed" | "deferred" | "abandoned";
208
+ summary?: string | undefined;
209
+ }, context: ToolContext): Promise<import("@opencode-ai/plugin").ToolResult>;
210
+ };
211
+ };
package/dist/cli.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};