mindforge-cc 11.9.8 → 11.9.9
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/.agent/mindforge/health.md +7 -4
- package/.agent/mindforge/help.md +9 -5
- package/.agent/mindforge/install-skill.md +8 -6
- package/.agent/mindforge/marketplace.md +6 -0
- package/.agent/mindforge/security-scan.md +9 -4
- package/.agent/mindforge/skills-index.md +1 -1
- package/.agent/mindforge/status.md +5 -4
- package/.claude/commands/mindforge/health.md +7 -4
- package/.claude/commands/mindforge/help.md +9 -5
- package/.claude/commands/mindforge/install-skill.md +8 -6
- package/.claude/commands/mindforge/marketplace.md +6 -0
- package/.claude/commands/mindforge/security-scan.md +9 -4
- package/.claude/commands/mindforge/skills-index.md +1 -1
- package/.claude/commands/mindforge/status.md +5 -4
- package/.mindforge/config.json +1 -1
- package/.mindforge/dynamic-workflows/scripts/feature-planner.js +12 -0
- package/.mindforge/dynamic-workflows/scripts/incident-response.js +6 -0
- package/.mindforge/dynamic-workflows/scripts/onboard-codebase.js +9 -0
- package/.mindforge/dynamic-workflows/scripts/perf-optimize.js +6 -0
- package/.mindforge/dynamic-workflows/scripts/refactor-plan.js +3 -0
- package/.mindforge/dynamic-workflows/scripts/release-prep.js +9 -0
- package/.mindforge/dynamic-workflows/scripts/tdd-sprint.js +12 -0
- package/.mindforge/dynamic-workflows/scripts/verification-loop.js +6 -0
- package/.mindforge/org/skills/MANIFEST.md +32 -0
- package/.mindforge/personas/mf-executor.md +1 -1
- package/.mindforge/personas/mf-memory.md +1 -1
- package/.mindforge/personas/mf-tool.md +1 -1
- package/.mindforge/personas/swarm-templates.json +10 -20
- package/CHANGELOG.md +58 -0
- package/MINDFORGE-AGENTIC-SECURITY.md +189 -0
- package/MINDFORGE.md +2 -2
- package/README.md +134 -87
- package/RELEASENOTES.md +28 -0
- package/SECURITY.md +1 -1
- package/bin/governance/audit-verifier.js +12 -3
- package/bin/installer/harness-adapter-compliance.js +1 -1
- package/bin/installer-core.js +58 -14
- package/bin/mindforge-cli.js +2 -2
- package/bin/verify-audit.js +7 -1
- package/changelogs/v11.9.9.md +59 -0
- package/docs/References/commands.md +2 -2
- package/docs/References/config-reference.md +20 -35
- package/docs/References/sdk-api.md +10 -4
- package/docs/References/skills-api.md +9 -7
- package/docs/commands-reference.md +2 -2
- package/docs/faq.md +2 -2
- package/docs/getting-started.md +9 -3
- package/docs/sdk-reference.md +3 -3
- package/docs/security/SECURITY.md +14 -0
- package/docs/security/ZTAI-OVERVIEW.md +53 -0
- package/docs/security/penetration-test-results.md +36 -0
- package/docs/security/threat-model.md +148 -0
- package/docs/troubleshooting.md +14 -10
- package/docs/user-guide.md +12 -8
- package/docs/usp-features.md +60 -0
- package/package.json +4 -1
- package/subagents/README.md +38 -0
- package/.agent/skills/godmode/SKILL.md +0 -396
- package/.agent/skills/godmode/references/jailbreak-templates.md +0 -128
- package/.agent/skills/godmode/references/refusal-detection.md +0 -142
package/README.md
CHANGED
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
# MindForge
|
|
2
2
|
|
|
3
|
-
[](https://www.npmjs.com/package/mindforge-cc)
|
|
3
|
+
[](https://www.npmjs.com/package/mindforge-cc)
|
|
4
|
+
[](https://github.com/sairam0424/MindForge/actions/workflows/mindforge-ci.yml)
|
|
5
|
+
[](#what-is-actually-enforced)
|
|
6
|
+
|
|
4
7
|
[](https://www.npmjs.com/package/mindforge-cc)
|
|
5
8
|
[](LICENSE)
|
|
6
9
|
[](package.json)
|
|
7
|
-
[](https://github.com/sairam0424/MindForge/actions/workflows/mindforge-ci.yml)
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+

|
|
12
|
+

|
|
13
|
+

|
|
14
|
+

|
|
15
|
+

|
|
16
|
+

|
|
17
|
+
|
|
18
|
+
**A governance and orchestration layer for Claude Code** (and Antigravity, Cursor, Copilot,
|
|
19
|
+
Gemini, OpenCode).
|
|
10
20
|
|
|
11
21
|
Claude Code alone runs one agent in one context. MindForge adds the parts that don't fit in a
|
|
12
22
|
single context window: skills that auto-load by trigger, personas you can call by name, a
|
|
@@ -15,11 +25,9 @@ tamper-evident audit chain, and cost-aware routing across providers. Install it
|
|
|
15
25
|
`/mindforge:plan-phase` → `/mindforge:execute-phase` → `/mindforge:verify-phase` → `/mindforge:ship`
|
|
16
26
|
as your actual working loop, not a slogan.
|
|
17
27
|
|
|
18
|
-
|
|
19
|
-
run (asciinema or GIF) and embed it here. Every comparable README in this space leads with a
|
|
20
|
-
visual in the first 15 lines; this is currently the single biggest gap. -->
|
|
28
|
+
221 commands · 354 skills · 216 personas · 164 subagents · 35 workflows
|
|
21
29
|
|
|
22
|
-
**Jump to:** [Latest release](#latest-release) · [What you get](#what-you-get) · [What is actually enforced](#what-is-actually-enforced) · [Install](#install) · [Quick start](#quick-start-new-project) · [Documentation](#documentation) · [Core workflow](#core-workflow) · [Dynamic workflows](#dynamic-workflow-library)
|
|
30
|
+
**Jump to:** [Latest release](#latest-release) · [What you get](#what-you-get) · [What is actually enforced](#what-is-actually-enforced) · [Install](#install) · [Verify](#verify) · [Quick start (new)](#quick-start-new-project) · [Quick start (existing)](#quick-start-existing-codebase) · [How it fits together](#how-it-fits-together) · [Documentation](#documentation) · [Core workflow](#core-workflow) · [Dynamic workflows](#dynamic-workflow-library) · [Updates](#updates-and-migrations) · [Token usage](#token-usage-profiling) · [License](#license)
|
|
23
31
|
|
|
24
32
|
---
|
|
25
33
|
|
|
@@ -28,11 +36,12 @@ as your actual working loop, not a slogan.
|
|
|
28
36
|
| | Capability | Detail |
|
|
29
37
|
|---|---|---|
|
|
30
38
|
| 🧩 | **221 slash commands** | `/mindforge:plan-phase`, `/mindforge:execute-phase`, `/mindforge:ship`, and 218 more — [full reference](docs/commands-reference.md) |
|
|
31
|
-
| 🛠️ | **
|
|
39
|
+
| 🛠️ | **354 skills** | 232 auto-triggered by keyword match (engine tier) + 122 explicit, invoked by name (extended tier) |
|
|
32
40
|
| 🎭 | **216 personas** | In-session role overlays via `/mindforge:agent <name>` — same context, different behavioral spec |
|
|
33
|
-
| 🤖 | **164 subagents** | Genuine isolated-context Claude-Code-native subagent definitions — a separate mechanism from personas, see [docs/PERSONAS.md](docs/PERSONAS.md) |
|
|
41
|
+
| 🤖 | **164 subagents** | Genuine isolated-context Claude-Code-native subagent definitions — a separate mechanism from personas, see [docs/PERSONAS.md](docs/PERSONAS.md); 152 adapted from [VoltAgent's `awesome-claude-code-subagents`](https://github.com/VoltAgent/awesome-claude-code-subagents) (MIT), attribution in [subagents/README.md](subagents/README.md) |
|
|
34
42
|
| 🔀 | **35 dynamic workflows** | Multi-agent fan-out scripts across 5 tiers (Research, Dev, Ops, Intelligence, Beast) — [workflow atlas](docs/workflow-atlas.md) |
|
|
35
43
|
| 🔒 | **Tamper-evident audit chain** | SHA-256 hash-linked `.planning/AUDIT.jsonl`; verify independently with `node bin/verify-audit.js` |
|
|
44
|
+
| 🔍 | **Multi-model cross-review + decision council** | Two-model adversarial PR review (`/mindforge:pr-review`) and a 4-voice consensus council (`/mindforge:council`) — `bin/review/`, `bin/engine/council-runtime.js` |
|
|
36
45
|
| 💸 | **Cost-aware model routing** | Anthropic / OpenAI / Gemini / Bedrock / Ollama, routed by task difficulty tier |
|
|
37
46
|
| 🧠 | **Local-first knowledge graph** | Zero-native-dependency SQLite (`sql.js` / WASM) — no native build step |
|
|
38
47
|
| 📊 | **Live dashboard** | Express + SSE at `localhost:7339` |
|
|
@@ -42,10 +51,69 @@ entry, and an MCP server.
|
|
|
42
51
|
|
|
43
52
|
---
|
|
44
53
|
|
|
54
|
+
## What is actually enforced
|
|
55
|
+
|
|
56
|
+
Read this before you rely on anything below blocking a bad command. MindForge ships a large
|
|
57
|
+
corpus of agent instructions — commands, skills, personas, protocols — and those are advisory: they work by
|
|
58
|
+
being in the model's context, and a model can decline them. The parts that would *block* an
|
|
59
|
+
action are hooks. Through 11.9.2 **no channel registered them.** 11.9.3 added the registration code
|
|
60
|
+
but it declined to run on almost every project, so in practice nothing was enforced there either.
|
|
61
|
+
**As of 11.9.4** both channels register and execute them **on Claude Code**, and nowhere else.
|
|
62
|
+
|
|
63
|
+
| Capability | Plugin channel | `npx` channel |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| Slash commands | Yes | Yes |
|
|
66
|
+
| Skills / personas / protocol docs | Yes | Yes |
|
|
67
|
+
| Subagents | Yes | Yes |
|
|
68
|
+
| Audit hash-chain (`bin/verify-audit.js`) | Yes | Yes |
|
|
69
|
+
| **Hooks enforced (can block a tool call)** | **Claude Code only** | **Claude Code + `--local` only** |
|
|
70
|
+
|
|
71
|
+
What that means, measured rather than asserted:
|
|
72
|
+
|
|
73
|
+
- **The `npx` channel generates the config it never used to ship.** `files[]` has 52 entries and
|
|
74
|
+
none of them contains `settings`, so no settings file is *published* — instead
|
|
75
|
+
`bin/installer/hook-registration.js` writes one at install time, merging append-only into any
|
|
76
|
+
file you already have. Measured on a confined install: **8 hooks registered** into
|
|
77
|
+
`.claude/settings.json`, of which the installer's own preflight **executed 7 and verified all 3
|
|
78
|
+
deny-class hooks returning exit 2** before keeping the file. A preflight failure rolls the
|
|
79
|
+
registration back rather than leaving a config whose commands do not run.
|
|
80
|
+
- **The plugin channel's dispatcher runs.** It previously crashed on every fire —
|
|
81
|
+
`run-with-flags.js` requires `./lib/hook-flags` and `plugins/mindforge/scripts/lib/` was not
|
|
82
|
+
copied in. That directory now exists, all **14 path tokens** in
|
|
83
|
+
`plugins/mindforge/hooks/hooks.json` resolve under the plugin root, and driving the dispatcher by
|
|
84
|
+
hand returns **exit 2** for `mindforge-block-no-verify` and `mindforge-config-protection`.
|
|
85
|
+
|
|
86
|
+
> [!WARNING]
|
|
87
|
+
> Still **not** enforced, deliberately and with a printed reason for each: any runtime other than
|
|
88
|
+
> Claude Code (Cursor, Copilot, Gemini/Antigravity, OpenCode), `--global` scope, a self-install
|
|
89
|
+
> inside a MindForge checkout, and Windows. Writing a Claude-schema config into `.cursor/` without an
|
|
90
|
+
> execution-verified hook contract would be decorative. Every outcome, including "not registered", is
|
|
91
|
+
> printed by the installer and written to `.mindforge/hook-registration.json`.
|
|
92
|
+
|
|
93
|
+
Three things gate whether a registered hook is *live*, none of them in MindForge's control: the
|
|
94
|
+
harness must be **restarted** (hooks are snapshotted at session start), the project must be
|
|
95
|
+
**trusted** in the harness, and `CLAUDE_PROJECT_DIR` must be set with `node` on the hook PATH —
|
|
96
|
+
if it is not, the commands exit 1 and the gate is simply absent, which is a deliberate trade
|
|
97
|
+
against a fail-closed tail that was measured denying benign commands on a fresh clone. See
|
|
98
|
+
*Hooks are installed but nothing is blocked* in `docs/troubleshooting.md`.
|
|
99
|
+
|
|
100
|
+
So: on Claude Code, treat MindForge as a policy enforcement point for the 8 registered hooks plus
|
|
101
|
+
a tamper-evident audit log; on every other harness, as **governance-by-convention** plus that same
|
|
102
|
+
audit log. Installing it also expands your repository's trust boundary by a large volume of agent
|
|
103
|
+
instructions — review what you install. The audit chain is verifiable today
|
|
104
|
+
(`node bin/verify-audit.js`).
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
45
108
|
## Install
|
|
46
109
|
|
|
47
110
|
Pick whichever matches how you work — all of these are real, live channels.
|
|
48
111
|
|
|
112
|
+
On a typical connection, `npx mindforge-cc@latest --claude --local` finishes in well under 10
|
|
113
|
+
seconds (measured: ~5.4s locally) — reproduce with `time npx mindforge-cc@latest --claude --local`
|
|
114
|
+
in an empty directory. Install makes zero model calls; you don't spend a token or a dollar until
|
|
115
|
+
you run a command that dispatches to a subagent.
|
|
116
|
+
|
|
49
117
|
### `npx` (recommended)
|
|
50
118
|
|
|
51
119
|
Writes `.mindforge/` governance, memory, and planning into your project:
|
|
@@ -119,12 +187,13 @@ Build on MindForge programmatically:
|
|
|
119
187
|
npm i mindforge-sdk
|
|
120
188
|
```
|
|
121
189
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
190
|
+
> [!NOTE]
|
|
191
|
+
> **Upgrading from 11.9.x?** The installer does not overwrite an existing
|
|
192
|
+
> `.mindforge/MINDFORGE-SCHEMA.json`, so 11.9.2's armed config validator keeps the older
|
|
193
|
+
> permissive schema on a plain upgrade — run with `--force` for the stricter gate. The daily cost
|
|
194
|
+
> cap declared as `[COST_HARD_LIMIT_USD]` in `MINDFORGE.md` was **not enforced** in 11.9.2 (11.9.3
|
|
195
|
+
> arms it), and an upgrade never rewrites an existing `MINDFORGE.md` — add
|
|
196
|
+
> `[COST_HARD_LIMIT_USD] = 25.00` yourself if yours predates the key.
|
|
128
197
|
|
|
129
198
|
Full install matrix, plugin packs, and team-setup guidance: [docs/getting-started.md](docs/getting-started.md).
|
|
130
199
|
|
|
@@ -170,20 +239,33 @@ Full verification walkthrough: [docs/quick-verify.md](docs/quick-verify.md).
|
|
|
170
239
|
|
|
171
240
|
## Latest release
|
|
172
241
|
|
|
173
|
-
**v11.9.
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
242
|
+
**v11.9.9** (2026-09-23) — Release-readiness audit: 5 CRITICAL + 9 HIGH findings fixed. An
|
|
243
|
+
8-agent audit workflow tested every surface (commands, skills, personas, subagents,
|
|
244
|
+
dynamic workflows, CLI/MCP, live install/verify/health) as a release gate before pointing
|
|
245
|
+
real external users at the project. Every finding was independently re-verified against
|
|
246
|
+
live code before fixing, not trusted from the audit report alone. Five were ship-blocking:
|
|
247
|
+
a real LLM jailbreak toolkit (`godmode`) shipping unconditionally in the package is gone;
|
|
248
|
+
`help.md`/`status.md`/`health.md`/`security-scan.md` stop claiming PQAS/biometric/
|
|
249
|
+
lattice-crypto verification is "active by default" when the code says the opposite;
|
|
250
|
+
`--minimal` now actually skips the persona set instead of shipping all 218 files anyway; a
|
|
251
|
+
"Sovereign Integrity Check" that called a CLI flag on a script with no CLI entrypoint (and
|
|
252
|
+
so could never fail) is replaced with a real check; and a dead 4-line stub standing in for
|
|
253
|
+
"232 auto-triggered skills" is now disclosed as what it is. Nine more: corrected CLI
|
|
254
|
+
invocation docs, disclosed the marketplace's zero published packages, crash-guards on 8
|
|
255
|
+
dynamic workflows, 32 unregistered skills added to the manifest, 3 personas granting
|
|
256
|
+
tools that don't exist fixed, 11 dangling swarm-template references reconciled, `health`
|
|
257
|
+
wired to a real integrity check, and a brand-new install's audit log no longer reporting a
|
|
258
|
+
false "BROKEN" status. See [RELEASENOTES.md](./RELEASENOTES.md) or
|
|
259
|
+
[CHANGELOG.md](./CHANGELOG.md).
|
|
260
|
+
|
|
261
|
+
<details>
|
|
262
|
+
<summary><strong>Earlier releases</strong></summary>
|
|
263
|
+
|
|
264
|
+
**v11.9.8** fixed two real bugs found by a literal, end-to-end README audit (113 claims
|
|
265
|
+
checked, 98 held up): `--runtime claude,cursor` crashed the installer outright, and
|
|
266
|
+
`--minimal` claimed "no persona library" but shipped all 216 anyway. The other twelve
|
|
267
|
+
findings were documentation catching up to what the code actually does. The previous
|
|
268
|
+
release, **v11.9.7**, fixed a version self-contradiction and a false "Enabled"
|
|
187
269
|
claim in the install banner, a dead `docs.mindforge.cc` link, and a persona-count doc
|
|
188
270
|
regression (218 → back to the correct 216) introduced by v11.9.6's own honesty pass.
|
|
189
271
|
**v11.9.6** was the release-readiness pass before pointing real, external users at the
|
|
@@ -200,58 +282,7 @@ change under a patch bump** still applies — the installer writes `.claude/sett
|
|
|
200
282
|
where it previously declined, merging append-only and backing up first. See the BREAKING
|
|
201
283
|
section in [CHANGELOG.md](./CHANGELOG.md).
|
|
202
284
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
## What is actually enforced
|
|
206
|
-
|
|
207
|
-
Read this before you rely on anything below blocking a bad command. MindForge ships a large
|
|
208
|
-
corpus of agent instructions — commands, skills, personas, protocols — and those are advisory: they work by
|
|
209
|
-
being in the model's context, and a model can decline them. The parts that would *block* an
|
|
210
|
-
action are hooks. Through 11.9.2 **no channel registered them.** 11.9.3 added the registration code
|
|
211
|
-
but it declined to run on almost every project, so in practice nothing was enforced there either.
|
|
212
|
-
**As of 11.9.4** both channels register and execute them **on Claude Code**, and nowhere else.
|
|
213
|
-
|
|
214
|
-
| Capability | Plugin channel | `npx` channel |
|
|
215
|
-
|---|---|---|
|
|
216
|
-
| Slash commands | Yes | Yes |
|
|
217
|
-
| Skills / personas / protocol docs | Yes | Yes |
|
|
218
|
-
| Subagents | Yes | Yes |
|
|
219
|
-
| Audit hash-chain (`bin/verify-audit.js`) | Yes | Yes |
|
|
220
|
-
| **Hooks enforced (can block a tool call)** | **Claude Code only** | **Claude Code + `--local` only** |
|
|
221
|
-
|
|
222
|
-
What that means, measured rather than asserted:
|
|
223
|
-
|
|
224
|
-
- **The `npx` channel generates the config it never used to ship.** `files[]` has 49 entries and
|
|
225
|
-
none of them contains `settings`, so no settings file is *published* — instead
|
|
226
|
-
`bin/installer/hook-registration.js` writes one at install time, merging append-only into any
|
|
227
|
-
file you already have. Measured on a confined install: **8 hooks registered** into
|
|
228
|
-
`.claude/settings.json`, of which the installer's own preflight **executed 7 and verified all 3
|
|
229
|
-
deny-class hooks returning exit 2** before keeping the file. A preflight failure rolls the
|
|
230
|
-
registration back rather than leaving a config whose commands do not run.
|
|
231
|
-
- **The plugin channel's dispatcher runs.** It previously crashed on every fire —
|
|
232
|
-
`run-with-flags.js` requires `./lib/hook-flags` and `plugins/mindforge/scripts/lib/` was not
|
|
233
|
-
copied in. That directory now exists, all **14 path tokens** in
|
|
234
|
-
`plugins/mindforge/hooks/hooks.json` resolve under the plugin root, and driving the dispatcher by
|
|
235
|
-
hand returns **exit 2** for `mindforge-block-no-verify` and `mindforge-config-protection`.
|
|
236
|
-
|
|
237
|
-
Still **not** enforced, deliberately and with a printed reason for each: any runtime other than
|
|
238
|
-
Claude Code (Cursor, Copilot, Gemini/Antigravity, OpenCode), `--global` scope, a self-install
|
|
239
|
-
inside a MindForge checkout, and Windows. Writing a Claude-schema config into `.cursor/` without an
|
|
240
|
-
execution-verified hook contract would be decorative. Every outcome, including "not registered", is
|
|
241
|
-
printed by the installer and written to `.mindforge/hook-registration.json`.
|
|
242
|
-
|
|
243
|
-
Three things gate whether a registered hook is *live*, none of them in MindForge's control: the
|
|
244
|
-
harness must be **restarted** (hooks are snapshotted at session start), the project must be
|
|
245
|
-
**trusted** in the harness, and `CLAUDE_PROJECT_DIR` must be set with `node` on the hook PATH —
|
|
246
|
-
if it is not, the commands exit 1 and the gate is simply absent, which is a deliberate trade
|
|
247
|
-
against a fail-closed tail that was measured denying benign commands on a fresh clone. See
|
|
248
|
-
*Hooks are installed but nothing is blocked* in `docs/troubleshooting.md`.
|
|
249
|
-
|
|
250
|
-
So: on Claude Code, treat MindForge as a policy enforcement point for the 8 registered hooks plus
|
|
251
|
-
a tamper-evident audit log; on every other harness, as **governance-by-convention** plus that same
|
|
252
|
-
audit log. Installing it also expands your repository's trust boundary by a large volume of agent
|
|
253
|
-
instructions — review what you install. The audit chain is verifiable today
|
|
254
|
-
(`node bin/verify-audit.js`).
|
|
285
|
+
</details>
|
|
255
286
|
|
|
256
287
|
---
|
|
257
288
|
|
|
@@ -271,14 +302,22 @@ instructions — review what you install. The audit chain is verifiable today
|
|
|
271
302
|
|
|
|
272
303
|
v
|
|
273
304
|
Verification (build / typecheck / lint / test / security / diff)
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
305
|
+
pass | fail
|
|
306
|
+
+--------------+--------------+
|
|
307
|
+
v v
|
|
308
|
+
Handoff (.planning/HANDOFF.json Temporal rollback -> sets status
|
|
309
|
+
+ AUDIT.jsonl) "awaiting_regeneration"
|
|
277
310
|
```
|
|
278
311
|
|
|
312
|
+
The fail path is real but partial: `bin/hindsight-injector.js` rolls back `.planning/` state and sets
|
|
313
|
+
`auto-state.json.status = "awaiting_regeneration"` — verified, and hash-chained into the audit log
|
|
314
|
+
like everything else. What is **not** currently true: nothing in `bin/` reads that status back out
|
|
315
|
+
to automatically re-trigger the wave (`awaiting_regeneration` has one writer, zero readers today) —
|
|
316
|
+
regeneration after a rollback is a manual step, not a closed loop.
|
|
317
|
+
|
|
279
318
|
Four layers underlie this, top to bottom: **Interface** (`.claude/`, `.agent/` — the 221 slash
|
|
280
|
-
commands and hooks), **Engine specs** (`.mindforge/` — 232 of the
|
|
281
|
-
`config.json` runtime knobs; the other
|
|
319
|
+
commands and hooks), **Engine specs** (`.mindforge/` — 232 of the 354 skills plus 216 personas and
|
|
320
|
+
`config.json` runtime knobs; the other 122 skills are extended-tier, under `.agent/skills/`),
|
|
282
321
|
**Execution** (`bin/`, ~32K raw / ~25K stripped-of-comments LOC — the wave executor, governance,
|
|
283
322
|
memory, and dashboard code that actually runs), and **Persistence** (`.planning/` — `STATE.md`,
|
|
284
323
|
the audit chain, resumable `HANDOFF.json`). Edit behavior in layer 2 where possible; layer 3 is
|
|
@@ -308,7 +347,7 @@ Six categories, read in this order the first time:
|
|
|
308
347
|
| Security | [SECURITY.md](SECURITY.md) | Reporting a vulnerability; credentials are read from env vars and never committed |
|
|
309
348
|
| Security | [Threat model](docs/security/threat-model.md) | Historical only — scoped to the v1.0.0 predecessor, not re-reviewed against v11.x; see [SECURITY.md](SECURITY.md) for what's actually enforced today |
|
|
310
349
|
| Contributing | [Architecture](docs/architecture/README.md) | Understanding the codebase before sending a PR |
|
|
311
|
-
| Contributing | [Contributing guide](
|
|
350
|
+
| Contributing | [Contributing guide](CONTRIBUTING.md) | Sending a PR |
|
|
312
351
|
| Contributing | [CI quickstart](docs/ci-quickstart.md) | Understanding what CI checks before you push |
|
|
313
352
|
| Contributing | [Release checklist](docs/release-checklist-guide.md) | Cutting a release |
|
|
314
353
|
| Reference | [USPs and features](docs/usp-features.md) | The same "measured, not asserted" honesty pass applied to what's actually shipped — no competitor comparison |
|
|
@@ -386,6 +425,14 @@ published under it — this is the mechanism, not a catalog.
|
|
|
386
425
|
(`--profile` doesn't exist; real flags are `--phase N`, `--session ID`, `--window short|medium|long`,
|
|
387
426
|
and `--optimise`.) See `.mindforge/production/token-optimiser.md`.
|
|
388
427
|
|
|
428
|
+
Installing and running `/mindforge:plan-phase`/`/mindforge:execute-phase` costs real model calls
|
|
429
|
+
once a subagent starts working — install itself does not (`npx mindforge-cc@latest` never calls
|
|
430
|
+
a model). Spend is capped by `[COST_HARD_LIMIT_USD]` in `MINDFORGE.md` (default `25.00`),
|
|
431
|
+
enforced in code by `bin/models/cost-tracker.js`'s `preflight()` before each call goes out — not a
|
|
432
|
+
policy statement. The per-project token/cost *reports* from `/mindforge:tokens` and
|
|
433
|
+
`.mindforge/production/token-optimiser.md` are heuristic estimates (`file size / 4`), explicitly
|
|
434
|
+
logged with `measured: false`.
|
|
435
|
+
|
|
389
436
|
---
|
|
390
437
|
|
|
391
438
|
## License
|
package/RELEASENOTES.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# Release Notes
|
|
2
2
|
|
|
3
|
+
## v11.9.9 — 2026-09-23 — Release-readiness audit: 5 CRITICAL + 9 HIGH findings fixed
|
|
4
|
+
|
|
5
|
+
### Why this release exists
|
|
6
|
+
|
|
7
|
+
An 8-agent audit workflow tested every MindForge surface — slash commands, skills,
|
|
8
|
+
personas, subagents, dynamic workflows, CLI/MCP, and a live install/verify/health cycle —
|
|
9
|
+
as a release gate before shipping to real external users. Every finding was independently
|
|
10
|
+
re-verified against live code and commands before being fixed, not trusted from the audit
|
|
11
|
+
report alone.
|
|
12
|
+
|
|
13
|
+
### The user-visible part
|
|
14
|
+
|
|
15
|
+
**Five CRITICAL findings, all ship-blocking:** a real, complete LLM jailbreak toolkit
|
|
16
|
+
(`godmode`) that was shipping unconditionally in the published package is gone; `help.md`,
|
|
17
|
+
`status.md`, `health.md`, and `security-scan.md` stop claiming PQAS/biometric/lattice-crypto
|
|
18
|
+
verification is "active by default" when the code itself says it's simulated and off;
|
|
19
|
+
`--minimal` now actually skips the persona set instead of shipping all 218 files anyway; a
|
|
20
|
+
"Sovereign Integrity Check" that called a CLI flag on a script with no CLI entrypoint (and
|
|
21
|
+
so could never fail) is replaced with a real check; and a dead 4-line stub standing in for
|
|
22
|
+
"232 auto-triggered skills" is now disclosed as what it is.
|
|
23
|
+
|
|
24
|
+
**Nine HIGH-severity findings:** corrected CLI invocation docs, disclosed the marketplace
|
|
25
|
+
has zero published packages today, added crash-guards to 8 dynamic workflows, registered 32
|
|
26
|
+
skills that existed on disk but were never in the manifest, fixed three personas granting
|
|
27
|
+
tools that don't exist, reconciled 11 dangling swarm-template references, wired the `health`
|
|
28
|
+
command to an actual integrity check, and stopped a brand-new install's audit log from
|
|
29
|
+
reporting a false "BROKEN" status.
|
|
30
|
+
|
|
3
31
|
## v11.9.8 — 2026-09-21 — What the README claims, verified line by line
|
|
4
32
|
|
|
5
33
|
### Why this release exists
|
package/SECURITY.md
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
/**
|
|
3
|
-
* MindForge — Audit chain verifier (UC-04). Fail-closed: any break => valid:false.
|
|
3
|
+
* MindForge — Audit chain verifier (UC-04). Fail-closed: any break => valid:false. An ABSENT log
|
|
4
|
+
* (ENOENT) is reported separately via `missing: true` rather than folded into the generic
|
|
5
|
+
* `unreadable:` reason below — a project that has never written an audit entry is not evidence of
|
|
6
|
+
* tampering, and callers (bin/verify-audit.js) use the distinction to avoid crying "BROKEN" at a
|
|
7
|
+
* brand-new user who has done nothing wrong.
|
|
4
8
|
*
|
|
5
9
|
* Walks the JSONL audit log line-by-line and re-derives each entry's hash from its
|
|
6
10
|
* content plus the prior entry's hash. The chain is valid only if EVERY link holds:
|
|
@@ -32,12 +36,17 @@ function hashEntry(entry, previousHash) {
|
|
|
32
36
|
/**
|
|
33
37
|
* Verifies the integrity of a hash-chained audit log. Fail-closed.
|
|
34
38
|
* @param {string} auditPath — path to the AUDIT.jsonl file
|
|
35
|
-
* @returns {{ valid: boolean, count: number, brokenAt?: number, reason?: string }}
|
|
39
|
+
* @returns {{ valid: boolean, count: number, brokenAt?: number, reason?: string, missing?: boolean }}
|
|
36
40
|
*/
|
|
37
41
|
function verifyAuditChain(auditPath) {
|
|
38
42
|
let lines;
|
|
39
43
|
try { lines = fs.readFileSync(auditPath, 'utf8').split('\n').filter(Boolean); }
|
|
40
|
-
catch (e) {
|
|
44
|
+
catch (e) {
|
|
45
|
+
if (e.code === 'ENOENT') {
|
|
46
|
+
return { valid: false, count: 0, missing: true, reason: 'no audit log yet — nothing has been audited' };
|
|
47
|
+
}
|
|
48
|
+
return { valid: false, count: 0, brokenAt: 0, reason: `unreadable: ${e.message}` };
|
|
49
|
+
}
|
|
41
50
|
|
|
42
51
|
let previousHash = null;
|
|
43
52
|
for (let i = 0; i < lines.length; i++) {
|
|
@@ -84,7 +84,7 @@ function freezeRecord(record) {
|
|
|
84
84
|
*/
|
|
85
85
|
function sharedAssetTrees(base, { hooks = 11 } = {}) {
|
|
86
86
|
return [
|
|
87
|
-
{ asset: 'skills', dir: `${base}/skills`, min_files:
|
|
87
|
+
{ asset: 'skills', dir: `${base}/skills`, min_files: 279, verbatim_subset_of: '.agent/skills' },
|
|
88
88
|
{ asset: 'hooks', dir: `${base}/hooks`, min_files: hooks, verbatim_subset_of: '.agent/hooks' },
|
|
89
89
|
{ asset: 'personas', dir: `${base}/personas`, min_files: 218, verbatim_subset_of: '.mindforge/personas' },
|
|
90
90
|
{ asset: 'docs references', dir: `${base}/docs/references`, min_files: 20, verbatim_subset_of: 'docs/References' },
|
package/bin/installer-core.js
CHANGED
|
@@ -636,13 +636,16 @@ async function install(runtime, scope, options = {}) {
|
|
|
636
636
|
const assetMappings = [
|
|
637
637
|
{ key: 'skillsSubdir', src: src('.agent', 'skills'), label: 'skills' },
|
|
638
638
|
{ key: 'hooksSubdir', src: src('.agent', 'hooks'), label: 'hooks' },
|
|
639
|
-
{ key: 'personasSubdir', src: src('.mindforge', 'personas'), label: 'personas' },
|
|
640
639
|
// NB: on-disk dirs are capitalized (docs/References, docs/Templates). macOS is
|
|
641
640
|
// case-insensitive so lowercase used to "work" locally, but npm/Linux is
|
|
642
641
|
// case-sensitive — the lookup silently missed in production (UC: REFERENCES 0).
|
|
643
642
|
{ key: 'docsSubdir', src: src('docs', 'References'), label: 'references' },
|
|
644
643
|
{ key: 'docsSubdir', src: src('docs', 'Templates'), label: 'templates' }
|
|
645
644
|
];
|
|
645
|
+
// Mirrors the real copy logic in Section 2.1: personas are skipped under --minimal.
|
|
646
|
+
if (!minimal) {
|
|
647
|
+
assetMappings.push({ key: 'personasSubdir', src: src('.mindforge', 'personas'), label: 'personas' });
|
|
648
|
+
}
|
|
646
649
|
|
|
647
650
|
assetMappings.forEach(asset => {
|
|
648
651
|
const subDir = cfg[asset.key];
|
|
@@ -813,17 +816,25 @@ async function install(runtime, scope, options = {}) {
|
|
|
813
816
|
}
|
|
814
817
|
}
|
|
815
818
|
|
|
816
|
-
// ── 2.1 Install Enterprise Assets (Skills, Hooks, Personas)
|
|
819
|
+
// ── 2.1 Install Enterprise Assets (Skills, Hooks, Personas, Docs, Memory, Plugins) ──
|
|
817
820
|
if (scope === 'local' && !selfInstall) {
|
|
818
821
|
const assetTypes = [
|
|
819
822
|
{ key: 'skillsSubdir', src: src('.agent', 'skills'), label: 'skills' },
|
|
820
823
|
{ key: 'hooksSubdir', src: src('.agent', 'hooks'), label: 'hooks' },
|
|
821
|
-
{ key: 'personasSubdir', src: src('.mindforge', 'personas'), label: 'personas' },
|
|
822
824
|
{ key: 'docsSubdir', src: src('docs', 'References'), label: 'references' },
|
|
823
825
|
{ key: 'docsSubdir', src: src('docs', 'Templates'), label: 'templates' },
|
|
824
826
|
{ key: 'memorySubdir', src: src('.mindforge', 'memory'), label: 'memory' },
|
|
825
827
|
{ key: 'pluginsSubdir', src: src('.mindforge', 'plugins'), label: 'plugins' }
|
|
826
828
|
];
|
|
829
|
+
// 'personas' is gated on !minimal, not removed: this copy into <runtime>/personas/ (e.g.
|
|
830
|
+
// .claude/personas/) is a real, tested, documented per-harness asset delivery contract
|
|
831
|
+
// (bin/installer/harness-adapter-compliance.js's ADAPTER_RECORDS asserts a >=218-file floor
|
|
832
|
+
// here for every harness except copilot), not dead/unused. The bug was that it ran
|
|
833
|
+
// unconditionally regardless of --minimal, undermining --minimal's "no persona library"
|
|
834
|
+
// promise (README.md, docs/getting-started.md) by shipping the full persona set anyway.
|
|
835
|
+
if (!minimal) {
|
|
836
|
+
assetTypes.push({ key: 'personasSubdir', src: src('.mindforge', 'personas'), label: 'personas' });
|
|
837
|
+
}
|
|
827
838
|
|
|
828
839
|
assetTypes.forEach(asset => {
|
|
829
840
|
const subDir = cfg[asset.key];
|
|
@@ -1082,6 +1093,13 @@ async function install(runtime, scope, options = {}) {
|
|
|
1082
1093
|
// install-manifests/install-state pair, which are build- and CI-side and have no business in a
|
|
1083
1094
|
// consumer project.
|
|
1084
1095
|
'bin/installer/hook-registration.js',
|
|
1096
|
+
// A thin (12-line) entry point whose only require is bin/governance/audit-verifier.js, which
|
|
1097
|
+
// already ships unconditionally via sovereignEngines above -- so this adds zero new surface,
|
|
1098
|
+
// just the one file consumers need to actually run "node bin/verify-audit.js" themselves.
|
|
1099
|
+
// Previously gated behind --with-utils for no functional reason: CLAUDE.md documents
|
|
1100
|
+
// "node bin/verify-audit.js" as a top-level command, not a --with-utils-only one, and a
|
|
1101
|
+
// fresh default install had the doc but not the script.
|
|
1102
|
+
'bin/verify-audit.js',
|
|
1085
1103
|
];
|
|
1086
1104
|
coreFiles.forEach(rel => {
|
|
1087
1105
|
const srcFile = src(...rel.split('/'));
|
|
@@ -1330,17 +1348,6 @@ async function run(args) {
|
|
|
1330
1348
|
bannerVersion = require('./utils/mindforge-version').resolveMindforgeVersion(process.cwd()).version;
|
|
1331
1349
|
} catch { /* a banner must never be the reason health cannot run */ }
|
|
1332
1350
|
|
|
1333
|
-
// Print header and brand manifest
|
|
1334
|
-
// Print header and brand manifest
|
|
1335
|
-
Theme.printHeader(bannerVersion);
|
|
1336
|
-
Theme.printBrandManifest();
|
|
1337
|
-
// Check for updates only
|
|
1338
|
-
if (isCheck) {
|
|
1339
|
-
const { checkAndUpdate } = require('./updater/self-update');
|
|
1340
|
-
await checkAndUpdate({ apply: false });
|
|
1341
|
-
return;
|
|
1342
|
-
}
|
|
1343
|
-
|
|
1344
1351
|
const runtimes = runtime === 'all'
|
|
1345
1352
|
? Object.keys(RUNTIMES)
|
|
1346
1353
|
: runtime.split(',').map((r) => r.trim()).filter(Boolean);
|
|
@@ -1353,6 +1360,43 @@ async function run(args) {
|
|
|
1353
1360
|
process.exit(1);
|
|
1354
1361
|
}
|
|
1355
1362
|
|
|
1363
|
+
// Print header and brand manifest
|
|
1364
|
+
Theme.printHeader(bannerVersion);
|
|
1365
|
+
Theme.printBrandManifest();
|
|
1366
|
+
// `health` (routed here via --check — bin/mindforge-cli.js:33-37) advertises itself as "Verify
|
|
1367
|
+
// project health and installation integrity". Until now it only did the first half — this
|
|
1368
|
+
// npm-registry lookup — and returned before touching a single file on disk. Measured: in a fresh
|
|
1369
|
+
// --claude --local install with bin/governance/policy-engine.js deleted by hand, `mindforge health`
|
|
1370
|
+
// printed only "vX.Y.Z is the latest version" and exited 0 — the missing file was invisible to the
|
|
1371
|
+
// one command whose job is to say so.
|
|
1372
|
+
//
|
|
1373
|
+
// verifyInstall() already exists as the real per-runtime file check (used by install() at :1144,
|
|
1374
|
+
// see its own comment for why it was dead code before that). Reusing it here for a project's
|
|
1375
|
+
// EXISTING install — rather than inventing a second checker — means both callers agree on what
|
|
1376
|
+
// "installed" means.
|
|
1377
|
+
if (isCheck) {
|
|
1378
|
+
const { checkAndUpdate } = require('./updater/self-update');
|
|
1379
|
+
await checkAndUpdate({ apply: false });
|
|
1380
|
+
|
|
1381
|
+
let anyMissing = false;
|
|
1382
|
+
for (const rt of runtimes) {
|
|
1383
|
+
const cfg = RUNTIMES[rt];
|
|
1384
|
+
const rtBaseDir = resolveBaseDir(rt, scope);
|
|
1385
|
+
const rtCmdsDir = norm(path.join(rtBaseDir, cfg.commandsSubdir));
|
|
1386
|
+
const verification = verifyInstall(rtBaseDir, rtCmdsDir, rt, scope);
|
|
1387
|
+
if (verification.ok) {
|
|
1388
|
+
Theme.printResolved(c.bold(`${rt} (${scope}): install verified (${verification.checked} required files present)`));
|
|
1389
|
+
} else {
|
|
1390
|
+
anyMissing = true;
|
|
1391
|
+
console.error(`\n ❌ ${rt} (${scope}): install verification failed — ${verification.missing.length} of ` +
|
|
1392
|
+
`${verification.checked} required file(s) missing:`);
|
|
1393
|
+
verification.missing.forEach(f => console.error(` ${f}`));
|
|
1394
|
+
}
|
|
1395
|
+
}
|
|
1396
|
+
if (anyMissing) process.exit(1);
|
|
1397
|
+
return;
|
|
1398
|
+
}
|
|
1399
|
+
|
|
1356
1400
|
for (const rt of runtimes) {
|
|
1357
1401
|
if (isUninstall) await uninstall(rt, scope, options);
|
|
1358
1402
|
else if (isUpdate) await install(rt, scope, { ...options, isUpdate: true });
|
package/bin/mindforge-cli.js
CHANGED
|
@@ -41,11 +41,11 @@ const COMMANDS = {
|
|
|
41
41
|
},
|
|
42
42
|
'pr-review': {
|
|
43
43
|
script: 'bin/review/cross-review-engine.js',
|
|
44
|
-
description: '
|
|
44
|
+
description: 'Alias for cross-review -- runs the same 2-model adversarial review engine'
|
|
45
45
|
},
|
|
46
46
|
'cross-review': {
|
|
47
47
|
script: 'bin/review/cross-review-engine.js',
|
|
48
|
-
description: 'Run
|
|
48
|
+
description: 'Run the 2-model adversarial cross-review engine (architect + security auditor)'
|
|
49
49
|
},
|
|
50
50
|
'classify': {
|
|
51
51
|
script: 'bin/change-classifier.js',
|
package/bin/verify-audit.js
CHANGED
|
@@ -3,7 +3,13 @@
|
|
|
3
3
|
const { verifyAuditChain } = require('./governance/audit-verifier');
|
|
4
4
|
const auditPath = process.argv[2] || '.planning/AUDIT.jsonl';
|
|
5
5
|
const result = verifyAuditChain(auditPath);
|
|
6
|
-
if (result.
|
|
6
|
+
if (result.missing) {
|
|
7
|
+
// Not a break: a project that has never written an audit entry has no chain to break. Measured
|
|
8
|
+
// before this branch existed: an absent log printed "❌ audit chain BROKEN at entry 0: unreadable:
|
|
9
|
+
// ENOENT..." and exited 1 — indistinguishable from real tamper detection to a brand-new user.
|
|
10
|
+
process.stdout.write(`ℹ️ no audit log yet at ${auditPath} — one will be created on first audited action\n`);
|
|
11
|
+
process.exit(0);
|
|
12
|
+
} else if (result.valid) {
|
|
7
13
|
process.stdout.write(`✅ audit chain valid: ${result.count} entries\n`);
|
|
8
14
|
process.exit(0);
|
|
9
15
|
} else {
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
## [11.9.9] — 2026-09-23 — Release-readiness audit: 5 CRITICAL + 9 HIGH findings fixed
|
|
4
|
+
|
|
5
|
+
Patch release. An 8-agent audit workflow tested every MindForge surface (slash commands,
|
|
6
|
+
skills, personas, subagents, dynamic workflows, CLI/MCP, live install/verify/health) as a
|
|
7
|
+
release gate before shipping to real external users. Every finding was independently
|
|
8
|
+
re-verified against live code/commands before fixing, not trusted from the audit report
|
|
9
|
+
alone.
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
**CRITICAL**
|
|
14
|
+
|
|
15
|
+
- Removed the `godmode` skill entirely — a real, complete LLM jailbreak toolkit that was
|
|
16
|
+
shipping unconditionally in the published npm tarball, undisclosed anywhere in the docs.
|
|
17
|
+
- Rewrote `help.md`/`status.md`/`health.md`/`security-scan.md`: they claimed
|
|
18
|
+
PQAS/biometric-bypass/lattice-crypto signature verification was "active by default,"
|
|
19
|
+
directly contradicted by `quantum-crypto.js`'s own comments (simulated, off by default).
|
|
20
|
+
- Fixed `--minimal`: a second, unguarded persona-copy path in `installer-core.js` shipped
|
|
21
|
+
the full 218-file persona set regardless of `--minimal`. Gated on `!minimal` rather than
|
|
22
|
+
removed outright — the copy is a real, tested per-harness delivery contract, confirmed
|
|
23
|
+
against `harness-adapter-compliance.js`'s `ADAPTER_RECORDS`.
|
|
24
|
+
- Fixed `security-scan.md`'s "Sovereign Integrity Check," which called a CLI flag on a
|
|
25
|
+
module with no CLI entrypoint (always exits 0) — a CRITICAL gate that could never fail.
|
|
26
|
+
Replaced with the one real check (policy-engine tamper detection).
|
|
27
|
+
- Disclosed `bin/engine/skill-loader.js` as dead code (4 lines, zero callers). The real
|
|
28
|
+
trigger-matching mechanism is an LLM-followed protocol spec
|
|
29
|
+
(`.mindforge/engine/skills/loader.md`), not deterministic code.
|
|
30
|
+
|
|
31
|
+
**HIGH**
|
|
32
|
+
|
|
33
|
+
- `install-skill.md`: documented the literal action token (`install`/`register`/`audit`)
|
|
34
|
+
`bin/skill-registry.js` deliberately requires with no default.
|
|
35
|
+
- `marketplace.md`: disclosed that zero published packages exist today; labeled sample
|
|
36
|
+
output as illustrative, not reproducible.
|
|
37
|
+
- `status.md`: fixed a nonexistent-file reference (`AutoRunner.js` -> the real
|
|
38
|
+
`bin/autonomous/auto-runner.js`).
|
|
39
|
+
- `pr-review`/`cross-review`: was an unqualified alias with descriptions implying different
|
|
40
|
+
behavior — now honestly documented as the same 2-model adversarial review engine.
|
|
41
|
+
- 8 dynamic-workflow scripts (`feature-planner`, `tdd-sprint`, `onboard-codebase`,
|
|
42
|
+
`incident-response`, `release-prep`, `perf-optimize`, `refactor-plan`,
|
|
43
|
+
`verification-loop`): added null-guards after every dependent `agent()` call, matching
|
|
44
|
+
the pattern ~27 other scripts already use.
|
|
45
|
+
- `MANIFEST.md`: registered 32 engine-tier skills that existed on disk but were never
|
|
46
|
+
listed in the registration source of truth (`systematic-debugging`,
|
|
47
|
+
`test-driven-development`, and 30 others).
|
|
48
|
+
- 3 MF-series personas (`mf-tool`, `mf-memory`, `mf-executor`): replaced fictional tool
|
|
49
|
+
grants (`Database`, `API`, `task_boundary`, `commit_memory`,
|
|
50
|
+
`multi_replace_file_content`) with the real Claude Code tool vocabulary.
|
|
51
|
+
- `swarm-templates.json`: reconciled 11 dangling persona references (2 fixed by name
|
|
52
|
+
correction, 9 removed with no real equivalent); updated `docs/PERSONAS.md`'s
|
|
53
|
+
`data-privacy-engineer` writeup to match the real `privacy-engineer.md` persona it now
|
|
54
|
+
points to.
|
|
55
|
+
- `health` command: wired to `verifyInstall()` so it actually checks installation
|
|
56
|
+
integrity instead of only an npm-version lookup.
|
|
57
|
+
- `AUDIT.jsonl`: distinguished "no audit log yet" from "chain broken" so a brand-new
|
|
58
|
+
install doesn't report a false BROKEN status; shipped `verify-audit.js` by default (its
|
|
59
|
+
only dependencies already shipped unconditionally).
|
|
@@ -36,7 +36,7 @@ the complete, verified list.
|
|
|
36
36
|
| `/mindforge:note` | `note <text> [list|promote N]` | Zero-friction idea capture and todo promotion | v2.0.0 |
|
|
37
37
|
| `/mindforge:quick` | `quick` | Run a small, single-task plan without a full phase | |
|
|
38
38
|
| `/mindforge:status` | `status` | Show current phase, plan status, and next action | |
|
|
39
|
-
| `/mindforge:health` | `health
|
|
39
|
+
| `/mindforge:health` | `health` | Validate installation. `--repair` is documented but not wired into the CLI backing path — it's silently ignored, byte-identical to plain `health`. | |
|
|
40
40
|
| `/mindforge:review` | `review [N]` | Run a structured review pass for a phase | |
|
|
41
41
|
| `/mindforge:debug` | `debug [plan-id]` | Debug a failed plan with root-cause workflow | |
|
|
42
42
|
| `/mindforge:add-backlog` | `add-backlog <desc>` | Park ideas in 999.x "parking lot" | v2.0.0 |
|
|
@@ -70,7 +70,7 @@ the complete, verified list.
|
|
|
70
70
|
| `/mindforge:metrics` | `metrics [--phase N]` | Compute quality and throughput metrics | |
|
|
71
71
|
| `/mindforge:profile-team` | `profile-team` | Generate team skill and ownership profile | |
|
|
72
72
|
| `/mindforge:benchmark` | `benchmark [--skill X]` | Measure skill effectiveness | |
|
|
73
|
-
| `/mindforge:tokens` | `tokens [--
|
|
73
|
+
| `/mindforge:tokens` | `tokens [--phase N] [--session ID] [--window short\|medium\|long] [--optimise]` | Token usage profiling and optimisation (`--profile`/`--summary` don't exist) | |
|
|
74
74
|
|
|
75
75
|
### Integrations & distribution
|
|
76
76
|
|