flow-workflows 0.67.0 → 0.68.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/adapters/codex/CORE.md +10 -1
- package/adapters/codex/skills/flow-doctor/SKILL.md +4 -0
- package/adapters/gemini/CORE.md +10 -1
- package/adapters/gemini/commands/flow/doctor.toml +4 -0
- package/adapters/hermes/CORE.md +10 -1
- package/adapters/hermes/skills/flow-doctor/SKILL.md +4 -0
- package/adapters/opencode/CORE.md +10 -1
- package/adapters/opencode/commands/flow-doctor.md +4 -0
- package/bin/cli.mjs +15 -0
- package/package.json +1 -1
- package/plugins/flow/.claude-plugin/plugin.json +1 -1
- package/plugins/flow/CHANGELOG.md +27 -0
package/adapters/codex/CORE.md
CHANGED
|
@@ -17,7 +17,7 @@ Every `$flow-*` command assumes these rules. They are stated once, here, so a co
|
|
|
17
17
|
carries what is specific to its phase. Read this once per session; a command that says "load
|
|
18
18
|
`flow-core`" means this file.
|
|
19
19
|
|
|
20
|
-
**This file belongs to flow `0.
|
|
20
|
+
**This file belongs to flow `0.68.0`.** Compare it once, at the start of the session, against
|
|
21
21
|
`version` in `~/.claude/flow/.claude-plugin/plugin.json`. The two differing means the session
|
|
22
22
|
is running a **mixture** — the commands from one copy of the plugin, these shared rules from another
|
|
23
23
|
— which is exactly what happens when a branch or a release candidate is loaded over an installed
|
|
@@ -65,6 +65,15 @@ a command relies on is simply absent in that session, and nothing else will repo
|
|
|
65
65
|
base branch — and goes out in no MR/PR at all. So a phase writing a tracked file writes it
|
|
66
66
|
**here**, in the directory it is running in, and `$flow-feat-ship §5.5` is what catches the
|
|
67
67
|
tools that could not be told.
|
|
68
|
+
- **A fenced block in a FLOW file is an example, and an example is not configuration.** These
|
|
69
|
+
files are prose with keys in them, and the rule that decides what a key *is* — a `- key:` line
|
|
70
|
+
under a `## section` — knows nothing about triple backticks. So a block written to be pasted
|
|
71
|
+
("add this to try it once") was read as the configuration it illustrates, for as long as it sat
|
|
72
|
+
there. It happened in a real repo: `agents.exec_cmd` came from the fenced example of a file whose
|
|
73
|
+
prose argued at length that it was deliberately unset, and every review round took the one-shot
|
|
74
|
+
path that prose warned against — with nothing anywhere to say so, because the file and the
|
|
75
|
+
configuration disagreed while both looked right. **Skip fenced regions when you read a FLOW
|
|
76
|
+
file**; `flow-workflows` does the same, so the two of you resolve the same config.
|
|
68
77
|
- Merge by section and key. A key present in the active overlay replaces the base value; a key
|
|
69
78
|
absent there inherits the base. **A present-but-empty overlay key masks the base** and resolves
|
|
70
79
|
to the normal empty-key fallback — this is how Codex can inherit its session model while a legacy
|
|
@@ -129,6 +129,10 @@ Whether the world they describe exists —
|
|
|
129
129
|
CLIs installed *and authenticated*, agents discoverable, hooks executable, the MCP reachable, the
|
|
130
130
|
base branch resolvable — is §2 below; flag the key here, check the world there, never both.
|
|
131
131
|
|
|
132
|
+
- **Keys inside a fenced block**: report them, one line, naming the file and the keys — they are
|
|
133
|
+
an example and resolve to nothing (flow-core §0), which is exactly what a reader who pasted a
|
|
134
|
+
block to enable it cannot tell from a key that works. Say what to do about it: move the line out
|
|
135
|
+
of the fence to make it real, leave it there to keep it an illustration.
|
|
132
136
|
- **Fan-out and cost ceilings**: `agents.fanout_max` must be a positive integer; else flag and note
|
|
133
137
|
the default `4` applies. `agents.budget_max` must be a non-negative integer (`0` = no ceiling);
|
|
134
138
|
else flag and note the default `12`. **Both absent → say so as a finding, not a pass**: the review
|
package/adapters/gemini/CORE.md
CHANGED
|
@@ -16,7 +16,7 @@ Every `/flow:*` command assumes these rules. They are stated once, here, so a co
|
|
|
16
16
|
carries what is specific to its phase. Read this once per session; a command that says "load
|
|
17
17
|
`flow-core`" means this file.
|
|
18
18
|
|
|
19
|
-
**This file belongs to flow `0.
|
|
19
|
+
**This file belongs to flow `0.68.0`.** Compare it once, at the start of the session, against
|
|
20
20
|
`version` in `~/.claude/flow/.claude-plugin/plugin.json`. The two differing means the session
|
|
21
21
|
is running a **mixture** — the commands from one copy of the plugin, these shared rules from another
|
|
22
22
|
— which is exactly what happens when a branch or a release candidate is loaded over an installed
|
|
@@ -64,6 +64,15 @@ a command relies on is simply absent in that session, and nothing else will repo
|
|
|
64
64
|
base branch — and goes out in no MR/PR at all. So a phase writing a tracked file writes it
|
|
65
65
|
**here**, in the directory it is running in, and `/flow:feat:ship §5.5` is what catches the
|
|
66
66
|
tools that could not be told.
|
|
67
|
+
- **A fenced block in a FLOW file is an example, and an example is not configuration.** These
|
|
68
|
+
files are prose with keys in them, and the rule that decides what a key *is* — a `- key:` line
|
|
69
|
+
under a `## section` — knows nothing about triple backticks. So a block written to be pasted
|
|
70
|
+
("add this to try it once") was read as the configuration it illustrates, for as long as it sat
|
|
71
|
+
there. It happened in a real repo: `agents.exec_cmd` came from the fenced example of a file whose
|
|
72
|
+
prose argued at length that it was deliberately unset, and every review round took the one-shot
|
|
73
|
+
path that prose warned against — with nothing anywhere to say so, because the file and the
|
|
74
|
+
configuration disagreed while both looked right. **Skip fenced regions when you read a FLOW
|
|
75
|
+
file**; `flow-workflows` does the same, so the two of you resolve the same config.
|
|
67
76
|
- Merge by section and key. A key present in the active overlay replaces the base value; a key
|
|
68
77
|
absent there inherits the base. **A present-but-empty overlay key masks the base** and resolves
|
|
69
78
|
to the normal empty-key fallback — this is how Codex can inherit its session model while a legacy
|
|
@@ -125,6 +125,10 @@ Whether the world they describe exists —
|
|
|
125
125
|
CLIs installed *and authenticated*, agents discoverable, hooks executable, the MCP reachable, the
|
|
126
126
|
base branch resolvable — is §2 below; flag the key here, check the world there, never both.
|
|
127
127
|
|
|
128
|
+
- **Keys inside a fenced block**: report them, one line, naming the file and the keys — they are
|
|
129
|
+
an example and resolve to nothing (flow-core §0), which is exactly what a reader who pasted a
|
|
130
|
+
block to enable it cannot tell from a key that works. Say what to do about it: move the line out
|
|
131
|
+
of the fence to make it real, leave it there to keep it an illustration.
|
|
128
132
|
- **Fan-out and cost ceilings**: `agents.fanout_max` must be a positive integer; else flag and note
|
|
129
133
|
the default `4` applies. `agents.budget_max` must be a non-negative integer (`0` = no ceiling);
|
|
130
134
|
else flag and note the default `12`. **Both absent → say so as a finding, not a pass**: the review
|
package/adapters/hermes/CORE.md
CHANGED
|
@@ -17,7 +17,7 @@ Every `/flow-*` command assumes these rules. They are stated once, here, so a co
|
|
|
17
17
|
carries what is specific to its phase. Read this once per session; a command that says "load
|
|
18
18
|
`flow-core`" means this file.
|
|
19
19
|
|
|
20
|
-
**This file belongs to flow `0.
|
|
20
|
+
**This file belongs to flow `0.68.0`.** Compare it once, at the start of the session, against
|
|
21
21
|
`version` in `~/.claude/flow/.claude-plugin/plugin.json`. The two differing means the session
|
|
22
22
|
is running a **mixture** — the commands from one copy of the plugin, these shared rules from another
|
|
23
23
|
— which is exactly what happens when a branch or a release candidate is loaded over an installed
|
|
@@ -65,6 +65,15 @@ a command relies on is simply absent in that session, and nothing else will repo
|
|
|
65
65
|
base branch — and goes out in no MR/PR at all. So a phase writing a tracked file writes it
|
|
66
66
|
**here**, in the directory it is running in, and `/flow-feat-ship §5.5` is what catches the
|
|
67
67
|
tools that could not be told.
|
|
68
|
+
- **A fenced block in a FLOW file is an example, and an example is not configuration.** These
|
|
69
|
+
files are prose with keys in them, and the rule that decides what a key *is* — a `- key:` line
|
|
70
|
+
under a `## section` — knows nothing about triple backticks. So a block written to be pasted
|
|
71
|
+
("add this to try it once") was read as the configuration it illustrates, for as long as it sat
|
|
72
|
+
there. It happened in a real repo: `agents.exec_cmd` came from the fenced example of a file whose
|
|
73
|
+
prose argued at length that it was deliberately unset, and every review round took the one-shot
|
|
74
|
+
path that prose warned against — with nothing anywhere to say so, because the file and the
|
|
75
|
+
configuration disagreed while both looked right. **Skip fenced regions when you read a FLOW
|
|
76
|
+
file**; `flow-workflows` does the same, so the two of you resolve the same config.
|
|
68
77
|
- Merge by section and key. A key present in the active overlay replaces the base value; a key
|
|
69
78
|
absent there inherits the base. **A present-but-empty overlay key masks the base** and resolves
|
|
70
79
|
to the normal empty-key fallback — this is how Codex can inherit its session model while a legacy
|
|
@@ -129,6 +129,10 @@ Whether the world they describe exists —
|
|
|
129
129
|
CLIs installed *and authenticated*, agents discoverable, hooks executable, the MCP reachable, the
|
|
130
130
|
base branch resolvable — is §2 below; flag the key here, check the world there, never both.
|
|
131
131
|
|
|
132
|
+
- **Keys inside a fenced block**: report them, one line, naming the file and the keys — they are
|
|
133
|
+
an example and resolve to nothing (flow-core §0), which is exactly what a reader who pasted a
|
|
134
|
+
block to enable it cannot tell from a key that works. Say what to do about it: move the line out
|
|
135
|
+
of the fence to make it real, leave it there to keep it an illustration.
|
|
132
136
|
- **Fan-out and cost ceilings**: `agents.fanout_max` must be a positive integer; else flag and note
|
|
133
137
|
the default `4` applies. `agents.budget_max` must be a non-negative integer (`0` = no ceiling);
|
|
134
138
|
else flag and note the default `12`. **Both absent → say so as a finding, not a pass**: the review
|
|
@@ -16,7 +16,7 @@ Every `/flow-*` command assumes these rules. They are stated once, here, so a co
|
|
|
16
16
|
carries what is specific to its phase. Read this once per session; a command that says "load
|
|
17
17
|
`flow-core`" means this file.
|
|
18
18
|
|
|
19
|
-
**This file belongs to flow `0.
|
|
19
|
+
**This file belongs to flow `0.68.0`.** Compare it once, at the start of the session, against
|
|
20
20
|
`version` in `~/.claude/flow/.claude-plugin/plugin.json`. The two differing means the session
|
|
21
21
|
is running a **mixture** — the commands from one copy of the plugin, these shared rules from another
|
|
22
22
|
— which is exactly what happens when a branch or a release candidate is loaded over an installed
|
|
@@ -64,6 +64,15 @@ a command relies on is simply absent in that session, and nothing else will repo
|
|
|
64
64
|
base branch — and goes out in no MR/PR at all. So a phase writing a tracked file writes it
|
|
65
65
|
**here**, in the directory it is running in, and `/flow-feat-ship §5.5` is what catches the
|
|
66
66
|
tools that could not be told.
|
|
67
|
+
- **A fenced block in a FLOW file is an example, and an example is not configuration.** These
|
|
68
|
+
files are prose with keys in them, and the rule that decides what a key *is* — a `- key:` line
|
|
69
|
+
under a `## section` — knows nothing about triple backticks. So a block written to be pasted
|
|
70
|
+
("add this to try it once") was read as the configuration it illustrates, for as long as it sat
|
|
71
|
+
there. It happened in a real repo: `agents.exec_cmd` came from the fenced example of a file whose
|
|
72
|
+
prose argued at length that it was deliberately unset, and every review round took the one-shot
|
|
73
|
+
path that prose warned against — with nothing anywhere to say so, because the file and the
|
|
74
|
+
configuration disagreed while both looked right. **Skip fenced regions when you read a FLOW
|
|
75
|
+
file**; `flow-workflows` does the same, so the two of you resolve the same config.
|
|
67
76
|
- Merge by section and key. A key present in the active overlay replaces the base value; a key
|
|
68
77
|
absent there inherits the base. **A present-but-empty overlay key masks the base** and resolves
|
|
69
78
|
to the normal empty-key fallback — this is how Codex can inherit its session model while a legacy
|
|
@@ -127,6 +127,10 @@ Whether the world they describe exists —
|
|
|
127
127
|
CLIs installed *and authenticated*, agents discoverable, hooks executable, the MCP reachable, the
|
|
128
128
|
base branch resolvable — is §2 below; flag the key here, check the world there, never both.
|
|
129
129
|
|
|
130
|
+
- **Keys inside a fenced block**: report them, one line, naming the file and the keys — they are
|
|
131
|
+
an example and resolve to nothing (flow-core §0), which is exactly what a reader who pasted a
|
|
132
|
+
block to enable it cannot tell from a key that works. Say what to do about it: move the line out
|
|
133
|
+
of the fence to make it real, leave it there to keep it an illustration.
|
|
130
134
|
- **Fan-out and cost ceilings**: `agents.fanout_max` must be a positive integer; else flag and note
|
|
131
135
|
the default `4` applies. `agents.budget_max` must be a non-negative integer (`0` = no ceiling);
|
|
132
136
|
else flag and note the default `12`. **Both absent → say so as a finding, not a pass**: the review
|
package/bin/cli.mjs
CHANGED
|
@@ -240,7 +240,22 @@ function parseFlow(text) {
|
|
|
240
240
|
const out = {}
|
|
241
241
|
let section = null
|
|
242
242
|
let listKey = null
|
|
243
|
+
let fence = null
|
|
243
244
|
for (const line of text.split('\n')) {
|
|
245
|
+
// A fenced block is an illustration, not configuration. This reader knows headings and
|
|
246
|
+
// `- key:` lines and nothing else, so an example written the way `docs/CONFIGURATION.md`
|
|
247
|
+
// and every FLOW.md in the wild write one — keys inside triple backticks, under a sentence
|
|
248
|
+
// saying "paste this to try it" — was live config the whole time. A real repo had
|
|
249
|
+
// `agents.exec_cmd` set from the block of a file whose prose argued, at length, that it was
|
|
250
|
+
// deliberately unset, and every review round took the one-shot path it warned against.
|
|
251
|
+
// Closing fence: same character, at least as long as the opening one (CommonMark).
|
|
252
|
+
const f = /^\s{0,3}(`{3,}|~{3,})/.exec(line)
|
|
253
|
+
if (f) {
|
|
254
|
+
if (!fence) fence = f[1]
|
|
255
|
+
else if (f[1][0] === fence[0] && f[1].length >= fence.length) fence = null
|
|
256
|
+
continue
|
|
257
|
+
}
|
|
258
|
+
if (fence) continue
|
|
244
259
|
const heading = /^##\s+(\S+)/.exec(line)
|
|
245
260
|
if (heading) {
|
|
246
261
|
section = heading[1]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "flow-workflows",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.68.0",
|
|
4
4
|
"description": "Guided feat/bug workflows (start→ship), post-deploy monitoring and multi-agent code review, stack-agnostic. Each repo uses a shared FLOW.md plus optional harness overlay.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"name": "flow",
|
|
4
4
|
"displayName": "Flow — guided dev workflows",
|
|
5
5
|
"description": "Guided feat/bug workflows (start→ship), post-deploy monitoring and multi-agent code review, stack-agnostic. Each repo uses a shared FLOW.md plus optional harness overlay.",
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.68.0",
|
|
7
7
|
"author": {
|
|
8
8
|
"name": "Alberto Vioque",
|
|
9
9
|
"email": "mashware@gmail.com"
|
|
@@ -5,6 +5,33 @@ plugin and is what `/flow:news` reads to show you what changed since your previo
|
|
|
5
5
|
|
|
6
6
|
The canonical, richest notes live in the [GitHub Releases](https://github.com/mashware/flow-workflows/releases).
|
|
7
7
|
|
|
8
|
+
## v0.68.0 — The block written to be pasted was the configuration · 2026-09-21
|
|
9
|
+
|
|
10
|
+
**In short**
|
|
11
|
+
- **A fenced block in a FLOW file is an example again.** `- key:` lines inside triple backticks (or tildes) are skipped by `bin/cli.mjs` and by flow-core §0, so the two resolve the same configuration. Until now they were read as the config they illustrate.
|
|
12
|
+
- **This was found in a live repo, not imagined.** `agents.exec_cmd` was set from the fenced example of a file whose prose argued, at length, that it was deliberately unset — so every review round took the one-shot path that prose warned against, and nothing anywhere said so.
|
|
13
|
+
- **`/flow:doctor` reports keys found inside a fence**, names the file and says what to do: move the line out to make it real, leave it to keep it an illustration.
|
|
14
|
+
- **`script/tests/flow-config.sh`** pins it — fenced values never leak, `~~~` and four-backtick blocks are fences, a closed fence does not swallow the keys after it. Every case fails against the old reader.
|
|
15
|
+
- **Two tests now actually run in CI**: the new one and `tier.sh`, which existed and was wired into nothing.
|
|
16
|
+
|
|
17
|
+
A `FLOW.md` is prose with keys in it, and that is the point of it: the keys are the contract, the
|
|
18
|
+
prose is why the value is what it is. What decides which is which is shape alone — a `- key:` line
|
|
19
|
+
under a `## section` — and shape is exactly what a documented example shares with the thing it
|
|
20
|
+
documents. `docs/CONFIGURATION.md` teaches keys in fenced blocks. The template's own comments do.
|
|
21
|
+
So does every real `FLOW.md` that explains an option before enabling it.
|
|
22
|
+
|
|
23
|
+
The repo where this surfaced had a Claude overlay with three paragraphs on why `agents.exec_cmd`
|
|
24
|
+
stays unset — cost against the panel that had been finding the defects — followed by a block
|
|
25
|
+
introduced with *"to try it once, add both blocks below and take them out again afterwards"*. The
|
|
26
|
+
block was live from the moment it was written: `exec_cmd` set, `quality.reviewers` masked with four
|
|
27
|
+
role descriptions instead of the four agents the base names. The file and its configuration said
|
|
28
|
+
opposite things, and both looked right.
|
|
29
|
+
|
|
30
|
+
Nothing warns about that class of mistake, because the file is valid and the round it produces is
|
|
31
|
+
green. So the reader changes: fenced regions are skipped, by the CLI and by the command pages that
|
|
32
|
+
read the file themselves, and `doctor` reports what it found in one — a reader who pasted a block
|
|
33
|
+
to enable it needs to be told why it does nothing, which is the mirror of the same problem.
|
|
34
|
+
|
|
8
35
|
## v0.67.0 — Every layer of the review was argued from judgement, and none was ever checked · 2026-09-21
|
|
9
36
|
|
|
10
37
|
**In short**
|