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 +12 -0
- package/README.md +32 -7
- package/dist/adapters/opencode/config.d.ts +3 -0
- package/dist/adapters/opencode/logging.d.ts +3 -0
- package/dist/adapters/opencode/plugin.d.ts +3 -0
- package/dist/adapters/opencode/sdk.d.ts +3 -0
- package/dist/adapters/opencode/tools.d.ts +211 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +221 -58
- package/dist/config-shared.d.ts +265 -0
- package/dist/config.d.ts +1 -0
- package/dist/distribution/flow-skill-definitions.d.ts +9 -0
- package/dist/distribution/sync.d.ts +63 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +222 -66
- package/dist/index.js.map +9 -9
- package/dist/runtime/api.d.ts +123 -0
- package/dist/runtime/json/strict-object.d.ts +9 -0
- package/dist/runtime/schema.d.ts +490 -0
- package/dist/runtime/time.d.ts +2 -0
- package/dist/runtime/transitions.d.ts +112 -0
- package/dist/runtime/workspace.d.ts +22 -0
- package/package.json +14 -3
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.
|
|
25
|
-
npx -y opencode-plugin-flow@4.1.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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,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 {};
|