mindforge-cc 11.9.8 → 12.0.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/.agent/mindforge/agent.md +1 -1
- 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/agent.md +1 -1
- 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 +9 -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 +146 -0
- package/MINDFORGE-AGENTIC-SECURITY.md +189 -0
- package/MINDFORGE.md +2 -2
- package/README.md +136 -85
- package/RELEASENOTES.md +64 -0
- package/SECURITY.md +1 -1
- package/bin/governance/audit-verifier.js +12 -3
- package/bin/governance/config-manager.js +4 -1
- package/bin/installer/harness-adapter-compliance.js +1 -1
- package/bin/installer-core.js +74 -21
- package/bin/mindforge-cli.js +2 -2
- package/bin/security/trust-boundaries.js +12 -0
- package/bin/utils/readiness-gate.js +1 -1
- package/bin/verify-audit.js +7 -1
- package/bin/wizard/theme.js +3 -4
- package/changelogs/v11.9.9.md +59 -0
- package/changelogs/v12.0.0.md +89 -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 +5 -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 53 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,37 @@ Full verification walkthrough: [docs/quick-verify.md](docs/quick-verify.md).
|
|
|
170
239
|
|
|
171
240
|
## Latest release
|
|
172
241
|
|
|
173
|
-
**
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
242
|
+
**v12.0.0** (2026-09-24) — First release aimed at real external users. The major-version
|
|
243
|
+
bump marks that shift, not a breaking change — there isn't one; every item here is a fix.
|
|
244
|
+
A second, independent 8-agent audit checked whether v11.9.9 actually cleared that bar
|
|
245
|
+
(security/STRIDE, staff-engineer code review, deps+license, a live production dry-run
|
|
246
|
+
across all 6 supported runtimes, docs accuracy, re-verification of the prior release's
|
|
247
|
+
deferred backlog, test-coverage gaps, and a full trace of the release pipeline) and found
|
|
248
|
+
1 CRITICAL + 4 HIGH issues still standing in the way. The CRITICAL: `--global` installs
|
|
249
|
+
printed a fabricated banner claiming 216 personas/122 skills were "active" while writing
|
|
250
|
+
none of them — now prints an honest description of what a global install actually writes.
|
|
251
|
+
The four HIGH: an unhedged "active" claim for a confirmed no-op feature plus unearned
|
|
252
|
+
"Autonomous Enterprise/Sovereign" marketing language in the install banner, both reworded;
|
|
253
|
+
a dynamic-workflow script's own null-guard commit missed one crash-causing edge case, now
|
|
254
|
+
covered; and two real test-coverage gaps (nothing guarded the removed `godmode` skill or
|
|
255
|
+
the `--minimal` persona fix against regressing) are closed. Eight more, lower severity: a
|
|
256
|
+
security dropper-chain pattern gap, a latent prototype-pollution path, a CodeQL-flagged
|
|
257
|
+
regex-escape bug, a non-LTS Node base image that slipped in via Dependabot, a docs table
|
|
258
|
+
citing 16 nonexistent personas, a release-pipeline step that's failed cosmetically on the
|
|
259
|
+
last 4 releases, a cross-runtime hook-registration parity gap, and CI/doc hygiene fixes.
|
|
184
260
|
See [RELEASENOTES.md](./RELEASENOTES.md) or [CHANGELOG.md](./CHANGELOG.md).
|
|
185
261
|
|
|
186
|
-
|
|
262
|
+
<details>
|
|
263
|
+
<summary><strong>Earlier releases</strong></summary>
|
|
264
|
+
|
|
265
|
+
**v11.9.9** ran the first release-readiness audit as a gate before pointing real external
|
|
266
|
+
users at the project for the first time — 5 CRITICAL findings (including a shipped LLM
|
|
267
|
+
jailbreak skill and a `--minimal` flag that shipped the full persona set anyway) and 9 HIGH
|
|
268
|
+
findings, all fixed. **v11.9.8** fixed two real bugs found by a literal, end-to-end README
|
|
269
|
+
audit (113 claims checked, 98 held up): `--runtime claude,cursor` crashed the installer
|
|
270
|
+
outright, and `--minimal` claimed "no persona library" but shipped all 216 anyway. The
|
|
271
|
+
other twelve findings were documentation catching up to what the code actually does. The
|
|
272
|
+
release before that, **v11.9.7**, fixed a version self-contradiction and a false "Enabled"
|
|
187
273
|
claim in the install banner, a dead `docs.mindforge.cc` link, and a persona-count doc
|
|
188
274
|
regression (218 → back to the correct 216) introduced by v11.9.6's own honesty pass.
|
|
189
275
|
**v11.9.6** was the release-readiness pass before pointing real, external users at the
|
|
@@ -200,58 +286,7 @@ change under a patch bump** still applies — the installer writes `.claude/sett
|
|
|
200
286
|
where it previously declined, merging append-only and backing up first. See the BREAKING
|
|
201
287
|
section in [CHANGELOG.md](./CHANGELOG.md).
|
|
202
288
|
|
|
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`).
|
|
289
|
+
</details>
|
|
255
290
|
|
|
256
291
|
---
|
|
257
292
|
|
|
@@ -271,14 +306,22 @@ instructions — review what you install. The audit chain is verifiable today
|
|
|
271
306
|
|
|
|
272
307
|
v
|
|
273
308
|
Verification (build / typecheck / lint / test / security / diff)
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
309
|
+
pass | fail
|
|
310
|
+
+--------------+--------------+
|
|
311
|
+
v v
|
|
312
|
+
Handoff (.planning/HANDOFF.json Temporal rollback -> sets status
|
|
313
|
+
+ AUDIT.jsonl) "awaiting_regeneration"
|
|
277
314
|
```
|
|
278
315
|
|
|
316
|
+
The fail path is real but partial: `bin/hindsight-injector.js` rolls back `.planning/` state and sets
|
|
317
|
+
`auto-state.json.status = "awaiting_regeneration"` — verified, and hash-chained into the audit log
|
|
318
|
+
like everything else. What is **not** currently true: nothing in `bin/` reads that status back out
|
|
319
|
+
to automatically re-trigger the wave (`awaiting_regeneration` has one writer, zero readers today) —
|
|
320
|
+
regeneration after a rollback is a manual step, not a closed loop.
|
|
321
|
+
|
|
279
322
|
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
|
|
323
|
+
commands and hooks), **Engine specs** (`.mindforge/` — 232 of the 354 skills plus 216 personas and
|
|
324
|
+
`config.json` runtime knobs; the other 122 skills are extended-tier, under `.agent/skills/`),
|
|
282
325
|
**Execution** (`bin/`, ~32K raw / ~25K stripped-of-comments LOC — the wave executor, governance,
|
|
283
326
|
memory, and dashboard code that actually runs), and **Persistence** (`.planning/` — `STATE.md`,
|
|
284
327
|
the audit chain, resumable `HANDOFF.json`). Edit behavior in layer 2 where possible; layer 3 is
|
|
@@ -308,7 +351,7 @@ Six categories, read in this order the first time:
|
|
|
308
351
|
| Security | [SECURITY.md](SECURITY.md) | Reporting a vulnerability; credentials are read from env vars and never committed |
|
|
309
352
|
| 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
353
|
| Contributing | [Architecture](docs/architecture/README.md) | Understanding the codebase before sending a PR |
|
|
311
|
-
| Contributing | [Contributing guide](
|
|
354
|
+
| Contributing | [Contributing guide](CONTRIBUTING.md) | Sending a PR |
|
|
312
355
|
| Contributing | [CI quickstart](docs/ci-quickstart.md) | Understanding what CI checks before you push |
|
|
313
356
|
| Contributing | [Release checklist](docs/release-checklist-guide.md) | Cutting a release |
|
|
314
357
|
| 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 +429,14 @@ published under it — this is the mechanism, not a catalog.
|
|
|
386
429
|
(`--profile` doesn't exist; real flags are `--phase N`, `--session ID`, `--window short|medium|long`,
|
|
387
430
|
and `--optimise`.) See `.mindforge/production/token-optimiser.md`.
|
|
388
431
|
|
|
432
|
+
Installing and running `/mindforge:plan-phase`/`/mindforge:execute-phase` costs real model calls
|
|
433
|
+
once a subagent starts working — install itself does not (`npx mindforge-cc@latest` never calls
|
|
434
|
+
a model). Spend is capped by `[COST_HARD_LIMIT_USD]` in `MINDFORGE.md` (default `25.00`),
|
|
435
|
+
enforced in code by `bin/models/cost-tracker.js`'s `preflight()` before each call goes out — not a
|
|
436
|
+
policy statement. The per-project token/cost *reports* from `/mindforge:tokens` and
|
|
437
|
+
`.mindforge/production/token-optimiser.md` are heuristic estimates (`file size / 4`), explicitly
|
|
438
|
+
logged with `measured: false`.
|
|
439
|
+
|
|
389
440
|
---
|
|
390
441
|
|
|
391
442
|
## License
|
package/RELEASENOTES.md
CHANGED
|
@@ -1,5 +1,69 @@
|
|
|
1
1
|
# Release Notes
|
|
2
2
|
|
|
3
|
+
## v12.0.0 — 2026-09-24 — First release aimed at real external users
|
|
4
|
+
|
|
5
|
+
### Why this release exists
|
|
6
|
+
|
|
7
|
+
This is the first MindForge release deliberately cut for real external users, not just
|
|
8
|
+
internal iteration — the major-version bump marks that shift, not a breaking change (there
|
|
9
|
+
isn't one; every item below is a fix). Ahead of it, a second independent 8-agent audit
|
|
10
|
+
checked whether v11.9.9 actually cleared that bar: security/STRIDE review, a fresh
|
|
11
|
+
staff-engineer code review, a dependency and license audit, a live production dry-run
|
|
12
|
+
across all 6 supported runtimes, a docs-accuracy pass, re-verification of the prior
|
|
13
|
+
release's deferred backlog, a test-coverage-gap sweep, and a full trace of the release
|
|
14
|
+
pipeline itself. It found 1 CRITICAL and 4 HIGH issue still standing in the way, plus 8
|
|
15
|
+
MEDIUM/LOW issues worth closing before this exact cutover — all adversarially re-verified
|
|
16
|
+
(10/10 confirmed, 0 refuted) before being fixed.
|
|
17
|
+
|
|
18
|
+
### The user-visible part
|
|
19
|
+
|
|
20
|
+
**The one CRITICAL:** `--global` installs printed a fabricated success banner claiming 216
|
|
21
|
+
personas and 122 skills were "active," when a global install writes none of them by
|
|
22
|
+
design — now prints an honest description of what it actually writes.
|
|
23
|
+
|
|
24
|
+
**Four HIGH fixes:** the install banner also claimed a "Proactive Semantic Intent
|
|
25
|
+
Harvesting" feature was "active" when it's a confirmed no-op, and carried marketing
|
|
26
|
+
language ("Autonomous Enterprise Agentic Ecosystem," "Sovereign Intelligence") this project
|
|
27
|
+
doesn't otherwise stand behind — both reworded to match the honesty bar the rest of the
|
|
28
|
+
docs already hold to. A dynamic-workflow script could still crash on an edge case its own
|
|
29
|
+
null-guard commit missed. Two real test-coverage gaps (nothing guarded the removed
|
|
30
|
+
`godmode` skill or the `--minimal` persona fix against regressing) are closed.
|
|
31
|
+
|
|
32
|
+
**Eight more, lower severity:** a security dropper-chain pattern gap, a latent
|
|
33
|
+
prototype-pollution path, a CodeQL-flagged incomplete regex escape, a non-LTS Node base
|
|
34
|
+
image that slipped in via an unconstrained Dependabot config, a docs table citing 16
|
|
35
|
+
personas that don't exist, a release-pipeline step that's failed cosmetically on the last 4
|
|
36
|
+
releases, a cross-runtime hook-registration parity gap, and a handful of GitHub Actions and
|
|
37
|
+
documentation hygiene fixes. Full list in [CHANGELOG.md](./CHANGELOG.md).
|
|
38
|
+
|
|
39
|
+
## v11.9.9 — 2026-09-23 — Release-readiness audit: 5 CRITICAL + 9 HIGH findings fixed
|
|
40
|
+
|
|
41
|
+
### Why this release exists
|
|
42
|
+
|
|
43
|
+
An 8-agent audit workflow tested every MindForge surface — slash commands, skills,
|
|
44
|
+
personas, subagents, dynamic workflows, CLI/MCP, and a live install/verify/health cycle —
|
|
45
|
+
as a release gate before shipping to real external users. Every finding was independently
|
|
46
|
+
re-verified against live code and commands before being fixed, not trusted from the audit
|
|
47
|
+
report alone.
|
|
48
|
+
|
|
49
|
+
### The user-visible part
|
|
50
|
+
|
|
51
|
+
**Five CRITICAL findings, all ship-blocking:** a real, complete LLM jailbreak toolkit
|
|
52
|
+
(`godmode`) that was shipping unconditionally in the published package is gone; `help.md`,
|
|
53
|
+
`status.md`, `health.md`, and `security-scan.md` stop claiming PQAS/biometric/lattice-crypto
|
|
54
|
+
verification is "active by default" when the code itself says it's simulated and off;
|
|
55
|
+
`--minimal` now actually skips the persona set instead of shipping all 218 files anyway; a
|
|
56
|
+
"Sovereign Integrity Check" that called a CLI flag on a script with no CLI entrypoint (and
|
|
57
|
+
so could never fail) is replaced with a real check; and a dead 4-line stub standing in for
|
|
58
|
+
"232 auto-triggered skills" is now disclosed as what it is.
|
|
59
|
+
|
|
60
|
+
**Nine HIGH-severity findings:** corrected CLI invocation docs, disclosed the marketplace
|
|
61
|
+
has zero published packages today, added crash-guards to 8 dynamic workflows, registered 32
|
|
62
|
+
skills that existed on disk but were never in the manifest, fixed three personas granting
|
|
63
|
+
tools that don't exist, reconciled 11 dangling swarm-template references, wired the `health`
|
|
64
|
+
command to an actual integrity check, and stopped a brand-new install's audit log from
|
|
65
|
+
reporting a false "BROKEN" status.
|
|
66
|
+
|
|
3
67
|
## v11.9.8 — 2026-09-21 — What the README claims, verified line by line
|
|
4
68
|
|
|
5
69
|
### 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++) {
|
|
@@ -54,10 +54,13 @@ class ConfigManager {
|
|
|
54
54
|
|
|
55
55
|
for (let i = 0; i < keys.length - 1; i++) {
|
|
56
56
|
const k = keys[i];
|
|
57
|
+
if (k === '__proto__' || k === 'constructor' || k === 'prototype') continue;
|
|
57
58
|
if (!target[k]) target[k] = {};
|
|
58
59
|
target = target[k];
|
|
59
60
|
}
|
|
60
|
-
|
|
61
|
+
const lastKey = keys[keys.length - 1];
|
|
62
|
+
if (lastKey === '__proto__' || lastKey === 'constructor' || lastKey === 'prototype') return value;
|
|
63
|
+
target[lastKey] = value;
|
|
61
64
|
|
|
62
65
|
this._save();
|
|
63
66
|
return value;
|
|
@@ -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('/'));
|
|
@@ -1105,7 +1123,8 @@ async function install(runtime, scope, options = {}) {
|
|
|
1105
1123
|
Theme.printStatus(c.dim(' - Post-Quantum Agentic Security (PQAS): available in simulated/experimental '
|
|
1106
1124
|
+ 'mode (inactive by default — set experimental.pqc_demo=true to enable the simulated demo)'), 'info');
|
|
1107
1125
|
}
|
|
1108
|
-
Theme.printStatus(c.dim(' - Proactive Semantic Intent Harvesting
|
|
1126
|
+
Theme.printStatus(c.dim(' - Proactive Semantic Intent Harvesting: available in simulated/experimental '
|
|
1127
|
+
+ 'mode (the underlying scan/claim logic is not yet wired to run automatically)'), 'info');
|
|
1109
1128
|
|
|
1110
1129
|
// bin/ utilities (remaining non-engine scripts)
|
|
1111
1130
|
if (withUtils) {
|
|
@@ -1330,17 +1349,6 @@ async function run(args) {
|
|
|
1330
1349
|
bannerVersion = require('./utils/mindforge-version').resolveMindforgeVersion(process.cwd()).version;
|
|
1331
1350
|
} catch { /* a banner must never be the reason health cannot run */ }
|
|
1332
1351
|
|
|
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
1352
|
const runtimes = runtime === 'all'
|
|
1345
1353
|
? Object.keys(RUNTIMES)
|
|
1346
1354
|
: runtime.split(',').map((r) => r.trim()).filter(Boolean);
|
|
@@ -1353,6 +1361,43 @@ async function run(args) {
|
|
|
1353
1361
|
process.exit(1);
|
|
1354
1362
|
}
|
|
1355
1363
|
|
|
1364
|
+
// Print header and brand manifest
|
|
1365
|
+
Theme.printHeader(bannerVersion);
|
|
1366
|
+
Theme.printBrandManifest();
|
|
1367
|
+
// `health` (routed here via --check — bin/mindforge-cli.js:33-37) advertises itself as "Verify
|
|
1368
|
+
// project health and installation integrity". Until now it only did the first half — this
|
|
1369
|
+
// npm-registry lookup — and returned before touching a single file on disk. Measured: in a fresh
|
|
1370
|
+
// --claude --local install with bin/governance/policy-engine.js deleted by hand, `mindforge health`
|
|
1371
|
+
// printed only "vX.Y.Z is the latest version" and exited 0 — the missing file was invisible to the
|
|
1372
|
+
// one command whose job is to say so.
|
|
1373
|
+
//
|
|
1374
|
+
// verifyInstall() already exists as the real per-runtime file check (used by install() at :1144,
|
|
1375
|
+
// see its own comment for why it was dead code before that). Reusing it here for a project's
|
|
1376
|
+
// EXISTING install — rather than inventing a second checker — means both callers agree on what
|
|
1377
|
+
// "installed" means.
|
|
1378
|
+
if (isCheck) {
|
|
1379
|
+
const { checkAndUpdate } = require('./updater/self-update');
|
|
1380
|
+
await checkAndUpdate({ apply: false });
|
|
1381
|
+
|
|
1382
|
+
let anyMissing = false;
|
|
1383
|
+
for (const rt of runtimes) {
|
|
1384
|
+
const cfg = RUNTIMES[rt];
|
|
1385
|
+
const rtBaseDir = resolveBaseDir(rt, scope);
|
|
1386
|
+
const rtCmdsDir = norm(path.join(rtBaseDir, cfg.commandsSubdir));
|
|
1387
|
+
const verification = verifyInstall(rtBaseDir, rtCmdsDir, rt, scope);
|
|
1388
|
+
if (verification.ok) {
|
|
1389
|
+
Theme.printResolved(c.bold(`${rt} (${scope}): install verified (${verification.checked} required files present)`));
|
|
1390
|
+
} else {
|
|
1391
|
+
anyMissing = true;
|
|
1392
|
+
console.error(`\n ❌ ${rt} (${scope}): install verification failed — ${verification.missing.length} of ` +
|
|
1393
|
+
`${verification.checked} required file(s) missing:`);
|
|
1394
|
+
verification.missing.forEach(f => console.error(` ${f}`));
|
|
1395
|
+
}
|
|
1396
|
+
}
|
|
1397
|
+
if (anyMissing) process.exit(1);
|
|
1398
|
+
return;
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1356
1401
|
for (const rt of runtimes) {
|
|
1357
1402
|
if (isUninstall) await uninstall(rt, scope, options);
|
|
1358
1403
|
else if (isUpdate) await install(rt, scope, { ...options, isUpdate: true });
|
|
@@ -1360,17 +1405,25 @@ async function run(args) {
|
|
|
1360
1405
|
}
|
|
1361
1406
|
|
|
1362
1407
|
if (!isUninstall) {
|
|
1363
|
-
// collectManifestStats() counts the SOURCE tree, not what was written. For a normal install
|
|
1364
|
-
// coincide, so the panel is accidentally accurate. For a self-install nothing is copied, and
|
|
1365
|
-
//
|
|
1366
|
-
//
|
|
1367
|
-
//
|
|
1408
|
+
// collectManifestStats() counts the SOURCE tree, not what was written. For a normal LOCAL install
|
|
1409
|
+
// those coincide, so the panel is accidentally accurate. For a self-install nothing is copied, and
|
|
1410
|
+
// for a GLOBAL install Section 2.1 (skills/hooks/personas/docs/memory/plugins) and Section 3
|
|
1411
|
+
// (.mindforge/ engine, .planning/, bin/) never ran — both are gated `scope === 'local'` above — so
|
|
1412
|
+
// the panel announced "Personas (216 active)" / "Skill Packs (122 verified)" / a full PAYLOAD
|
|
1413
|
+
// MANIFEST for a run that deployed and verified none of them: a summary of the repository
|
|
1414
|
+
// presenting itself as an installation report. Gating on scope too is the honest minimum. Making
|
|
1368
1415
|
// the panel report MEASURED counts on every path is a larger change and is deliberately not
|
|
1369
1416
|
// attempted here — it would need the install to return what it wrote.
|
|
1370
|
-
if (isSelfInstall()) {
|
|
1417
|
+
if (isSelfInstall() && scope === 'local') {
|
|
1371
1418
|
Theme.printResolved(c.bold('Self-install complete — no framework files were written'));
|
|
1372
1419
|
Theme.printStatus(c.dim('This repository IS the framework: its committed .claude/ and .agent/ '
|
|
1373
1420
|
+ 'trees are the source, so there was nothing to deploy.'), 'info');
|
|
1421
|
+
} else if (scope !== 'local') {
|
|
1422
|
+
Theme.printResolved(c.bold('Global install complete'));
|
|
1423
|
+
Theme.printStatus(c.dim('A --global install writes only the entry file, slash commands, and '
|
|
1424
|
+
+ 'native subagents into your home directory. Skills, personas, hooks, and the .mindforge/ '
|
|
1425
|
+
+ 'framework engine are NOT part of a global install by design — run a --local install in a '
|
|
1426
|
+
+ 'project directory to get those.'), 'info');
|
|
1374
1427
|
} else {
|
|
1375
1428
|
const stats = collectManifestStats();
|
|
1376
1429
|
Theme.printSuccessV2(runtime, scope, stats);
|
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',
|