@nforma.ai/nforma 0.2.1 → 0.28.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/README.md +2 -2
- package/agents/{qgsd-codebase-mapper.md → nf-codebase-mapper.md} +1 -1
- package/agents/{qgsd-debugger.md → nf-debugger.md} +3 -3
- package/agents/{qgsd-executor.md → nf-executor.md} +14 -14
- package/agents/{qgsd-integration-checker.md → nf-integration-checker.md} +1 -1
- package/agents/{qgsd-phase-researcher.md → nf-phase-researcher.md} +6 -6
- package/agents/{qgsd-plan-checker.md → nf-plan-checker.md} +9 -9
- package/agents/{qgsd-planner.md → nf-planner.md} +9 -9
- package/agents/{qgsd-project-researcher.md → nf-project-researcher.md} +2 -2
- package/agents/{qgsd-quorum-orchestrator.md → nf-quorum-orchestrator.md} +33 -33
- package/agents/{qgsd-quorum-slot-worker.md → nf-quorum-slot-worker.md} +3 -3
- package/agents/{qgsd-quorum-synthesizer.md → nf-quorum-synthesizer.md} +3 -3
- package/agents/{qgsd-quorum-test-worker.md → nf-quorum-test-worker.md} +1 -1
- package/agents/{qgsd-quorum-worker.md → nf-quorum-worker.md} +6 -6
- package/agents/{qgsd-research-synthesizer.md → nf-research-synthesizer.md} +5 -5
- package/agents/{qgsd-roadmapper.md → nf-roadmapper.md} +3 -3
- package/agents/{qgsd-verifier.md → nf-verifier.md} +8 -8
- package/bin/accept-debug-invariant.cjs +2 -2
- package/bin/account-manager.cjs +10 -10
- package/bin/aggregate-requirements.cjs +1 -1
- package/bin/analyze-assumptions.cjs +3 -3
- package/bin/analyze-state-space.cjs +14 -14
- package/bin/assumption-register.cjs +146 -0
- package/bin/attribute-trace-divergence.cjs +1 -1
- package/bin/auth-drivers/gh-cli.cjs +1 -1
- package/bin/auth-drivers/pool.cjs +1 -1
- package/bin/autoClosePtoF.cjs +3 -3
- package/bin/budget-tracker.cjs +77 -0
- package/bin/build-layer-manifest.cjs +153 -0
- package/bin/call-quorum-slot.cjs +3 -3
- package/bin/ccr-secure-config.cjs +5 -5
- package/bin/check-bundled-sdks.cjs +1 -1
- package/bin/check-mcp-health.cjs +1 -1
- package/bin/check-provider-health.cjs +6 -6
- package/bin/check-spec-sync.cjs +26 -26
- package/bin/check-trace-schema-drift.cjs +5 -5
- package/bin/conformance-schema.cjs +2 -2
- package/bin/cross-layer-dashboard.cjs +297 -0
- package/bin/design-impact.cjs +377 -0
- package/bin/detect-coverage-gaps.cjs +7 -7
- package/bin/failure-mode-catalog.cjs +227 -0
- package/bin/failure-taxonomy.cjs +177 -0
- package/bin/formal-scope-scan.cjs +179 -0
- package/bin/gate-a-grounding.cjs +334 -0
- package/bin/gate-b-abstraction.cjs +243 -0
- package/bin/gate-c-validation.cjs +166 -0
- package/bin/generate-formal-specs.cjs +17 -17
- package/bin/generate-petri-net.cjs +3 -3
- package/bin/generate-tla-cfg.cjs +5 -5
- package/bin/git-heatmap.cjs +571 -0
- package/bin/harness-diagnostic.cjs +326 -0
- package/bin/hazard-model.cjs +261 -0
- package/bin/install-formal-tools.cjs +1 -1
- package/bin/install.js +184 -139
- package/bin/instrumentation-map.cjs +178 -0
- package/bin/invariant-catalog.cjs +437 -0
- package/bin/issue-classifier.cjs +2 -2
- package/bin/load-baseline-requirements.cjs +4 -4
- package/bin/manage-agents-core.cjs +32 -32
- package/bin/migrate-to-slots.cjs +39 -39
- package/bin/mismatch-register.cjs +217 -0
- package/bin/nForma.cjs +176 -81
- package/bin/{qgsd-solve.cjs → nf-solve.cjs} +327 -14
- package/bin/observe-config.cjs +8 -0
- package/bin/observe-debt-writer.cjs +1 -1
- package/bin/observe-handler-deps.cjs +356 -0
- package/bin/observe-handler-grafana.cjs +2 -17
- package/bin/observe-handler-internal.cjs +5 -5
- package/bin/observe-handler-logstash.cjs +2 -17
- package/bin/observe-handler-prometheus.cjs +2 -17
- package/bin/observe-handler-upstream.cjs +251 -0
- package/bin/observe-handlers.cjs +12 -33
- package/bin/observe-render.cjs +68 -22
- package/bin/observe-utils.cjs +37 -0
- package/bin/observed-fsm.cjs +324 -0
- package/bin/planning-paths.cjs +6 -0
- package/bin/polyrepo.cjs +1 -1
- package/bin/probe-quorum-slots.cjs +1 -1
- package/bin/promote-gate-maturity.cjs +274 -0
- package/bin/promote-model.cjs +1 -1
- package/bin/propose-debug-invariants.cjs +1 -1
- package/bin/quorum-cache.cjs +144 -0
- package/bin/quorum-consensus-gate.cjs +1 -1
- package/bin/quorum-slot-dispatch.cjs +6 -6
- package/bin/requirements-core.cjs +1 -1
- package/bin/review-mcp-logs.cjs +1 -1
- package/bin/risk-heatmap.cjs +151 -0
- package/bin/run-account-manager-tlc.cjs +4 -4
- package/bin/run-account-pool-alloy.cjs +2 -2
- package/bin/run-alloy.cjs +2 -2
- package/bin/run-audit-alloy.cjs +2 -2
- package/bin/run-breaker-tlc.cjs +3 -3
- package/bin/run-formal-check.cjs +9 -9
- package/bin/run-formal-verify.cjs +30 -9
- package/bin/run-installer-alloy.cjs +2 -2
- package/bin/run-oscillation-tlc.cjs +4 -4
- package/bin/run-phase-tlc.cjs +1 -1
- package/bin/run-protocol-tlc.cjs +4 -4
- package/bin/run-quorum-composition-alloy.cjs +2 -2
- package/bin/run-sensitivity-sweep.cjs +2 -2
- package/bin/run-stop-hook-tlc.cjs +3 -3
- package/bin/run-tlc.cjs +21 -21
- package/bin/run-transcript-alloy.cjs +2 -2
- package/bin/secrets.cjs +5 -5
- package/bin/security-sweep.cjs +238 -0
- package/bin/sensitivity-report.cjs +3 -3
- package/bin/set-secret.cjs +5 -5
- package/bin/setup-telemetry-cron.sh +3 -3
- package/bin/stall-detector.cjs +126 -0
- package/bin/state-candidates.cjs +206 -0
- package/bin/sync-baseline-requirements.cjs +1 -1
- package/bin/telemetry-collector.cjs +1 -1
- package/bin/test-changed.cjs +111 -0
- package/bin/test-recipe-gen.cjs +250 -0
- package/bin/trace-corpus-stats.cjs +211 -0
- package/bin/unified-mcp-server.mjs +3 -3
- package/bin/update-scoreboard.cjs +1 -1
- package/bin/validate-memory.cjs +2 -2
- package/bin/validate-traces.cjs +10 -10
- package/bin/verify-quorum-health.cjs +66 -5
- package/bin/xstate-to-tla.cjs +4 -4
- package/bin/xstate-trace-walker.cjs +3 -3
- package/commands/{qgsd → nf}/add-phase.md +3 -3
- package/commands/{qgsd → nf}/add-requirement.md +3 -3
- package/commands/{qgsd → nf}/add-todo.md +3 -3
- package/commands/{qgsd → nf}/audit-milestone.md +4 -4
- package/commands/{qgsd → nf}/check-todos.md +3 -3
- package/commands/{qgsd → nf}/cleanup.md +3 -3
- package/commands/{qgsd → nf}/close-formal-gaps.md +2 -2
- package/commands/{qgsd → nf}/complete-milestone.md +9 -9
- package/commands/{qgsd → nf}/debug.md +9 -9
- package/commands/{qgsd → nf}/discuss-phase.md +3 -3
- package/commands/{qgsd → nf}/execute-phase.md +15 -15
- package/commands/{qgsd → nf}/fix-tests.md +3 -3
- package/commands/{qgsd → nf}/formal-test-sync.md +1 -1
- package/commands/{qgsd → nf}/health.md +3 -3
- package/commands/{qgsd → nf}/help.md +3 -3
- package/commands/{qgsd → nf}/insert-phase.md +3 -3
- package/commands/nf/join-discord.md +18 -0
- package/commands/{qgsd → nf}/list-phase-assumptions.md +2 -2
- package/commands/{qgsd → nf}/map-codebase.md +7 -7
- package/commands/{qgsd → nf}/map-requirements.md +3 -3
- package/commands/{qgsd → nf}/mcp-restart.md +3 -3
- package/commands/{qgsd → nf}/mcp-set-model.md +8 -8
- package/commands/{qgsd → nf}/mcp-setup.md +63 -63
- package/commands/{qgsd → nf}/mcp-status.md +3 -3
- package/commands/{qgsd → nf}/mcp-update.md +7 -7
- package/commands/{qgsd → nf}/new-milestone.md +8 -8
- package/commands/{qgsd → nf}/new-project.md +8 -8
- package/commands/{qgsd → nf}/observe.md +49 -16
- package/commands/{qgsd → nf}/pause-work.md +3 -3
- package/commands/{qgsd → nf}/plan-milestone-gaps.md +5 -5
- package/commands/{qgsd → nf}/plan-phase.md +6 -6
- package/commands/{qgsd → nf}/polyrepo.md +2 -2
- package/commands/{qgsd → nf}/progress.md +3 -3
- package/commands/{qgsd → nf}/queue.md +2 -2
- package/commands/{qgsd → nf}/quick.md +8 -8
- package/commands/{qgsd → nf}/quorum-test.md +10 -10
- package/commands/{qgsd → nf}/quorum.md +40 -40
- package/commands/{qgsd → nf}/reapply-patches.md +2 -2
- package/commands/{qgsd → nf}/remove-phase.md +3 -3
- package/commands/{qgsd → nf}/research-phase.md +12 -12
- package/commands/{qgsd → nf}/resume-work.md +3 -3
- package/commands/nf/review-requirements.md +31 -0
- package/commands/{qgsd → nf}/set-profile.md +3 -3
- package/commands/{qgsd → nf}/settings.md +6 -6
- package/commands/{qgsd → nf}/solve.md +35 -35
- package/commands/{qgsd → nf}/sync-baselines.md +4 -4
- package/commands/{qgsd → nf}/triage.md +10 -10
- package/commands/{qgsd → nf}/update.md +3 -3
- package/commands/{qgsd → nf}/verify-work.md +5 -5
- package/hooks/dist/config-loader.js +188 -32
- package/hooks/dist/conformance-schema.cjs +2 -2
- package/hooks/dist/gsd-context-monitor.js +118 -13
- package/hooks/dist/{qgsd-check-update.js → nf-check-update.js} +5 -5
- package/hooks/dist/{qgsd-circuit-breaker.js → nf-circuit-breaker.js} +35 -24
- package/hooks/dist/nf-circuit-breaker.test.js +1002 -0
- package/hooks/dist/{qgsd-precompact.js → nf-precompact.js} +13 -13
- package/hooks/dist/nf-precompact.test.js +227 -0
- package/hooks/dist/{qgsd-prompt.js → nf-prompt.js} +110 -33
- package/hooks/dist/nf-prompt.test.js +698 -0
- package/hooks/dist/nf-session-start.js +185 -0
- package/hooks/dist/nf-session-start.test.js +354 -0
- package/hooks/dist/{qgsd-slot-correlator.js → nf-slot-correlator.js} +13 -5
- package/hooks/dist/nf-slot-correlator.test.js +85 -0
- package/hooks/dist/{qgsd-spec-regen.js → nf-spec-regen.js} +17 -8
- package/hooks/dist/nf-spec-regen.test.js +73 -0
- package/hooks/dist/{qgsd-statusline.js → nf-statusline.js} +12 -3
- package/hooks/dist/nf-statusline.test.js +157 -0
- package/hooks/dist/{qgsd-stop.js → nf-stop.js} +152 -18
- package/hooks/dist/nf-stop.test.js +1388 -0
- package/hooks/dist/{qgsd-token-collector.js → nf-token-collector.js} +12 -4
- package/hooks/dist/nf-token-collector.test.js +262 -0
- package/hooks/dist/unified-mcp-server.mjs +2 -2
- package/package.json +4 -4
- package/scripts/build-hooks.js +13 -6
- package/scripts/secret-audit.sh +1 -1
- package/scripts/verify-hooks-sync.cjs +90 -0
- package/templates/{qgsd.json → nf.json} +4 -4
- package/commands/qgsd/join-discord.md +0 -18
- package/hooks/dist/qgsd-session-start.js +0 -122
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: nf:mcp-setup
|
|
3
3
|
description: Configure quorum agents — first-run linear onboarding for new installs, live-status agent menu for re-runs
|
|
4
4
|
allowed-tools:
|
|
5
5
|
- Bash
|
|
@@ -7,7 +7,7 @@ allowed-tools:
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
<objective>
|
|
10
|
-
Configure
|
|
10
|
+
Configure nForma quorum agents in `~/.claude.json`. Detects whether any MCP servers are configured and routes to the appropriate flow:
|
|
11
11
|
- **First-run** (zero configured entries): linear onboarding — select agent templates, collect API keys via keytar, write batch changes with backup, restart agents
|
|
12
12
|
- **Re-run** (existing entries): live-status agent roster menu — view model/provider/key status, select agent, choose action (set key / swap provider / remove)
|
|
13
13
|
</objective>
|
|
@@ -53,7 +53,7 @@ Display the welcome banner:
|
|
|
53
53
|
|
|
54
54
|
```
|
|
55
55
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
56
|
-
|
|
56
|
+
nForma ► MCP SETUP — FIRST RUN
|
|
57
57
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
58
58
|
|
|
59
59
|
No quorum agents configured. Let's set up your first agent.
|
|
@@ -83,12 +83,12 @@ Use AskUserQuestion:
|
|
|
83
83
|
- "3 — claude-3 (Together.xyz, Qwen3-Coder-480B)"
|
|
84
84
|
- "4 — claude-5 (Together.xyz, Llama-4-M)"
|
|
85
85
|
- "5 — claude-4 (Fireworks, kimi)"
|
|
86
|
-
- "Skip — configure later via /
|
|
86
|
+
- "Skip — configure later via /nf:mcp-setup"
|
|
87
87
|
|
|
88
88
|
If "Skip" is chosen, display:
|
|
89
89
|
|
|
90
90
|
```
|
|
91
|
-
⚠ No agents configured. Run /
|
|
91
|
+
⚠ No agents configured. Run /nf:mcp-setup when ready.
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
Stop.
|
|
@@ -116,7 +116,7 @@ Store the key using this Bash command (substitute AGENT_KEY and API_KEY):
|
|
|
116
116
|
|
|
117
117
|
```bash
|
|
118
118
|
KEY_RESULT=$(node -e "
|
|
119
|
-
const { set, SERVICE } = require('~/.claude/
|
|
119
|
+
const { set, SERVICE } = require('~/.claude/nf-bin/secrets.cjs');
|
|
120
120
|
const agentKey = process.env.AGENT_KEY;
|
|
121
121
|
const apiKey = process.env.API_KEY;
|
|
122
122
|
(async () => {
|
|
@@ -153,7 +153,7 @@ mkdir -p ~/.claude/debug
|
|
|
153
153
|
node -e "
|
|
154
154
|
const fs = require('fs');
|
|
155
155
|
const ts = new Date().toISOString();
|
|
156
|
-
const msg = ts + '
|
|
156
|
+
const msg = ts + ' nForma mcp-setup: keytar unavailable for ' + process.env.AGENT_KEY + ' — API key stored unencrypted in env block\n';
|
|
157
157
|
fs.appendFileSync(require('os').homedir() + '/.claude/debug/mcp-setup-audit.log', msg);
|
|
158
158
|
" AGENT_KEY="{agent-name}"
|
|
159
159
|
```
|
|
@@ -177,7 +177,7 @@ If "Finish setup": continue to Step 3.
|
|
|
177
177
|
If pending batch is empty (all skipped):
|
|
178
178
|
|
|
179
179
|
```
|
|
180
|
-
⚠ No agents configured. Run /
|
|
180
|
+
⚠ No agents configured. Run /nf:mcp-setup when ready.
|
|
181
181
|
```
|
|
182
182
|
|
|
183
183
|
Stop.
|
|
@@ -186,7 +186,7 @@ Display pending summary:
|
|
|
186
186
|
|
|
187
187
|
```
|
|
188
188
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
189
|
-
|
|
189
|
+
nForma ► REVIEW PENDING CHANGES
|
|
190
190
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
191
191
|
|
|
192
192
|
Agents to add to ~/.claude.json:
|
|
@@ -196,7 +196,7 @@ Agents to add to ~/.claude.json:
|
|
|
196
196
|
[repeat for each pending agent]
|
|
197
197
|
|
|
198
198
|
Skipped:
|
|
199
|
-
○ {agent-name} — run /
|
|
199
|
+
○ {agent-name} — run /nf:mcp-setup to configure later
|
|
200
200
|
```
|
|
201
201
|
|
|
202
202
|
Use AskUserQuestion:
|
|
@@ -298,7 +298,7 @@ process.stdout.write(JSON.stringify({ written: true, count: pendingAgents.length
|
|
|
298
298
|
|
|
299
299
|
```bash
|
|
300
300
|
node -e "
|
|
301
|
-
const { syncToClaudeJson, SERVICE } = require('~/.claude/
|
|
301
|
+
const { syncToClaudeJson, SERVICE } = require('~/.claude/nf-bin/secrets.cjs');
|
|
302
302
|
syncToClaudeJson(SERVICE)
|
|
303
303
|
.then(() => process.stdout.write('synced\n'))
|
|
304
304
|
.catch(e => process.stderr.write('sync warning: ' + e.message + '\n'));
|
|
@@ -309,20 +309,20 @@ syncToClaudeJson(SERVICE)
|
|
|
309
309
|
|
|
310
310
|
For each agent in the pending batch:
|
|
311
311
|
|
|
312
|
-
Invoke `/
|
|
312
|
+
Invoke `/nf:mcp-restart {agent-name}`.
|
|
313
313
|
|
|
314
314
|
If restart fails or times out, leave config in written state and display:
|
|
315
315
|
|
|
316
316
|
```
|
|
317
317
|
⚠ {agent-name}: restart failed. Config was written — agent will reload on next Claude Code restart.
|
|
318
|
-
Manual retry: /
|
|
318
|
+
Manual retry: /nf:mcp-restart {agent-name}
|
|
319
319
|
```
|
|
320
320
|
|
|
321
321
|
### Step 3f: Closing summary
|
|
322
322
|
|
|
323
323
|
```
|
|
324
324
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
325
|
-
|
|
325
|
+
nForma ► SETUP COMPLETE ✓
|
|
326
326
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
327
327
|
|
|
328
328
|
Changes applied and agents restarted.
|
|
@@ -330,10 +330,10 @@ Changes applied and agents restarted.
|
|
|
330
330
|
✓ {agent-name} — restarted
|
|
331
331
|
[repeat for each successfully restarted agent]
|
|
332
332
|
|
|
333
|
-
○ {agent-name} — skipped (run /
|
|
333
|
+
○ {agent-name} — skipped (run /nf:mcp-setup to configure later)
|
|
334
334
|
[repeat for each skipped agent]
|
|
335
335
|
|
|
336
|
-
Run /
|
|
336
|
+
Run /nf:mcp-status to verify agent health.
|
|
337
337
|
```
|
|
338
338
|
|
|
339
339
|
---
|
|
@@ -364,7 +364,7 @@ const os = require('os');
|
|
|
364
364
|
|
|
365
365
|
let keyStatus = 'no key';
|
|
366
366
|
try {
|
|
367
|
-
const { get, SERVICE } = require('~/.claude/
|
|
367
|
+
const { get, SERVICE } = require('~/.claude/nf-bin/secrets.cjs');
|
|
368
368
|
const keyName = 'ANTHROPIC_API_KEY_' + name.toUpperCase().replace(/-/g,'_');
|
|
369
369
|
const stored = await get(SERVICE, keyName);
|
|
370
370
|
keyStatus = stored ? 'key stored' : (env.ANTHROPIC_API_KEY ? 'key in env' : 'no key');
|
|
@@ -386,7 +386,7 @@ Display re-run banner:
|
|
|
386
386
|
|
|
387
387
|
```
|
|
388
388
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
389
|
-
|
|
389
|
+
nForma ► MCP SETUP — AGENT ROSTER
|
|
390
390
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
391
391
|
```
|
|
392
392
|
|
|
@@ -493,7 +493,7 @@ Store the key using bin/secrets.cjs (agent name and key passed via env vars —
|
|
|
493
493
|
|
|
494
494
|
```bash
|
|
495
495
|
KEY_RESULT=$(node -e "
|
|
496
|
-
const { set, SERVICE } = require('~/.claude/
|
|
496
|
+
const { set, SERVICE } = require('~/.claude/nf-bin/secrets.cjs');
|
|
497
497
|
const agentKey = process.env.AGENT_KEY;
|
|
498
498
|
const apiKey = process.env.API_KEY;
|
|
499
499
|
(async () => {
|
|
@@ -527,7 +527,7 @@ Parse KEY_RESULT:
|
|
|
527
527
|
node -e "
|
|
528
528
|
const fs = require('fs');
|
|
529
529
|
const ts = new Date().toISOString();
|
|
530
|
-
const msg = ts + '
|
|
530
|
+
const msg = ts + ' nForma mcp-setup: keytar unavailable for ' + process.env.AGENT_KEY + ' — API key stored unencrypted in env block\n';
|
|
531
531
|
fs.appendFileSync(require('os').homedir() + '/.claude/debug/mcp-setup-audit.log', msg);
|
|
532
532
|
" AGENT_KEY="{agent-name}"
|
|
533
533
|
```
|
|
@@ -538,7 +538,7 @@ Show pending summary:
|
|
|
538
538
|
|
|
539
539
|
```
|
|
540
540
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
541
|
-
|
|
541
|
+
nForma ► REVIEW PENDING CHANGES
|
|
542
542
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
543
543
|
|
|
544
544
|
◆ {agent-name} → {provider-name} ({base-url})
|
|
@@ -626,12 +626,12 @@ process.stdout.write(JSON.stringify({ written: true }) + '\n');
|
|
|
626
626
|
4. Sync keytar secrets to ~/.claude.json:
|
|
627
627
|
```bash
|
|
628
628
|
node -e "
|
|
629
|
-
const { syncToClaudeJson, SERVICE } = require('~/.claude/
|
|
629
|
+
const { syncToClaudeJson, SERVICE } = require('~/.claude/nf-bin/secrets.cjs');
|
|
630
630
|
syncToClaudeJson(SERVICE).then(() => process.stdout.write('synced\n')).catch(e => process.stderr.write(e.message + '\n'));
|
|
631
631
|
"
|
|
632
632
|
```
|
|
633
633
|
|
|
634
|
-
5. Invoke `/
|
|
634
|
+
5. Invoke `/nf:mcp-restart {agent-name}` to start the new agent process.
|
|
635
635
|
|
|
636
636
|
**Step D — Identity ping (AGENT-03)**
|
|
637
637
|
|
|
@@ -648,7 +648,7 @@ If identity responds:
|
|
|
648
648
|
Version: {identity.version}
|
|
649
649
|
Model: {identity.model}
|
|
650
650
|
|
|
651
|
-
Run /
|
|
651
|
+
Run /nf:mcp-status to see full agent roster.
|
|
652
652
|
```
|
|
653
653
|
|
|
654
654
|
If identity times out or errors:
|
|
@@ -657,7 +657,7 @@ If identity times out or errors:
|
|
|
657
657
|
|
|
658
658
|
◆ {agent-name} — added, restarted (identity ping timed out — agent may need a moment to start)
|
|
659
659
|
|
|
660
|
-
Run /
|
|
660
|
+
Run /nf:mcp-status to verify agent health.
|
|
661
661
|
```
|
|
662
662
|
|
|
663
663
|
**Return path:** If this add-slot flow was entered from the Composition Screen (via "Add new slot"), return to Composition Screen after identity ping. Otherwise, return to roster display (re-read roster to show new agent).
|
|
@@ -672,7 +672,7 @@ Show a confirmation screen:
|
|
|
672
672
|
|
|
673
673
|
```
|
|
674
674
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
675
|
-
|
|
675
|
+
nForma ► REVIEW PENDING CHANGES
|
|
676
676
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
677
677
|
|
|
678
678
|
◆ {new-slot-name} → copied from {source-slot-name}
|
|
@@ -718,18 +718,18 @@ process.stdout.write(JSON.stringify({ written: true, newSlot, sourceSlot: srcSlo
|
|
|
718
718
|
|
|
719
719
|
If `written: false`: display error and return to roster.
|
|
720
720
|
|
|
721
|
-
3. Append new slot to `quorum_active` in `~/.claude/
|
|
721
|
+
3. Append new slot to `quorum_active` in `~/.claude/nf.json`:
|
|
722
722
|
```bash
|
|
723
723
|
node -e "
|
|
724
724
|
const fs = require('fs'), os = require('os');
|
|
725
|
-
const
|
|
725
|
+
const nfPath = os.homedir() + '/.claude/nf.json';
|
|
726
726
|
let cfg = {};
|
|
727
|
-
try { cfg = JSON.parse(fs.readFileSync(
|
|
727
|
+
try { cfg = JSON.parse(fs.readFileSync(nfPath, 'utf8')); } catch(e) {}
|
|
728
728
|
const active = Array.isArray(cfg.quorum_active) ? cfg.quorum_active : [];
|
|
729
729
|
const newSlot = process.env.NEW_SLOT;
|
|
730
730
|
if (!active.includes(newSlot)) {
|
|
731
731
|
cfg.quorum_active = [...active, newSlot];
|
|
732
|
-
fs.writeFileSync(
|
|
732
|
+
fs.writeFileSync(nfPath, JSON.stringify(cfg, null, 2) + '\n');
|
|
733
733
|
process.stdout.write(JSON.stringify({ added: true, slot: newSlot }) + '\n');
|
|
734
734
|
} else {
|
|
735
735
|
process.stdout.write(JSON.stringify({ added: false, slot: newSlot, reason: 'already present' }) + '\n');
|
|
@@ -737,7 +737,7 @@ if (!active.includes(newSlot)) {
|
|
|
737
737
|
" NEW_SLOT="{new-slot-name}"
|
|
738
738
|
```
|
|
739
739
|
|
|
740
|
-
4. Invoke `/
|
|
740
|
+
4. Invoke `/nf:mcp-restart {new-slot-name}` to start the new agent process.
|
|
741
741
|
|
|
742
742
|
**Step D — Identity ping** (same as claude-mcp-server path):
|
|
743
743
|
|
|
@@ -754,7 +754,7 @@ If identity responds:
|
|
|
754
754
|
Version: {identity.version}
|
|
755
755
|
Model: {identity.model}
|
|
756
756
|
|
|
757
|
-
Run /
|
|
757
|
+
Run /nf:mcp-status to see full agent roster.
|
|
758
758
|
```
|
|
759
759
|
|
|
760
760
|
If identity times out or errors:
|
|
@@ -763,7 +763,7 @@ If identity times out or errors:
|
|
|
763
763
|
|
|
764
764
|
◆ {new-slot-name} — added, restarted (identity ping timed out — agent may need a moment to start)
|
|
765
765
|
|
|
766
|
-
Run /
|
|
766
|
+
Run /nf:mcp-status to verify agent health.
|
|
767
767
|
```
|
|
768
768
|
|
|
769
769
|
**Return path:** If this add-slot flow was entered from the Composition Screen (via "Add new slot"), return to Composition Screen after identity ping. Otherwise, return to roster display (re-read roster to show new agent).
|
|
@@ -790,14 +790,14 @@ try {
|
|
|
790
790
|
slots = Object.keys(cj.mcpServers || {});
|
|
791
791
|
} catch(e) {}
|
|
792
792
|
try {
|
|
793
|
-
const
|
|
794
|
-
active = Array.isArray(
|
|
793
|
+
const nfCfg = JSON.parse(fs.readFileSync(os.homedir() + '/.claude/nf.json', 'utf8'));
|
|
794
|
+
active = Array.isArray(nf.quorum_active) ? nf.quorum_active : [];
|
|
795
795
|
} catch(e) {}
|
|
796
796
|
process.stdout.write(JSON.stringify({ slots, active }) + '\n');
|
|
797
797
|
")
|
|
798
798
|
```
|
|
799
799
|
|
|
800
|
-
Parse `COMPOSITION_DATA` for `slots` (array of all slot names from `~/.claude.json`) and `active` (current `quorum_active` array from `~/.claude/
|
|
800
|
+
Parse `COMPOSITION_DATA` for `slots` (array of all slot names from `~/.claude.json`) and `active` (current `quorum_active` array from `~/.claude/nf.json`).
|
|
801
801
|
|
|
802
802
|
**Step CS-2: Display composition table**
|
|
803
803
|
|
|
@@ -805,7 +805,7 @@ Display banner:
|
|
|
805
805
|
|
|
806
806
|
```
|
|
807
807
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
808
|
-
|
|
808
|
+
nForma ► QUORUM COMPOSITION
|
|
809
809
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
810
810
|
```
|
|
811
811
|
|
|
@@ -838,7 +838,7 @@ Use AskUserQuestion:
|
|
|
838
838
|
- question: "Enter slot number to toggle ON/OFF, or choose an option:"
|
|
839
839
|
- options:
|
|
840
840
|
- "1 — {slot-name} [{current PENDING_ACTIVE status}]" (one per slot — show ● ON or ○ OFF based on current PENDING_ACTIVE state)
|
|
841
|
-
- "Apply — save changes to
|
|
841
|
+
- "Apply — save changes to nf.json"
|
|
842
842
|
- "Add new slot — add a slot to ~/.claude.json and quorum_active"
|
|
843
843
|
- "Cancel — discard changes"
|
|
844
844
|
|
|
@@ -857,11 +857,11 @@ Re-display the AskUserQuestion with updated statuses after each toggle.
|
|
|
857
857
|
```bash
|
|
858
858
|
node -e "
|
|
859
859
|
const fs = require('fs'), os = require('os');
|
|
860
|
-
const
|
|
860
|
+
const nfPath = os.homedir() + '/.claude/nf.json';
|
|
861
861
|
let cfg = {};
|
|
862
|
-
try { cfg = JSON.parse(fs.readFileSync(
|
|
862
|
+
try { cfg = JSON.parse(fs.readFileSync(nfPath, 'utf8')); } catch(e) {}
|
|
863
863
|
cfg.quorum_active = JSON.parse(process.env.PENDING_ACTIVE);
|
|
864
|
-
fs.writeFileSync(
|
|
864
|
+
fs.writeFileSync(nfPath, JSON.stringify(cfg, null, 2) + '\n');
|
|
865
865
|
process.stdout.write(JSON.stringify({ written: true, count: cfg.quorum_active.length }) + '\n');
|
|
866
866
|
" PENDING_ACTIVE="{JSON.stringify(PENDING_ACTIVE)}"
|
|
867
867
|
```
|
|
@@ -898,7 +898,7 @@ Display agent detail banner:
|
|
|
898
898
|
|
|
899
899
|
```
|
|
900
900
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
901
|
-
|
|
901
|
+
nForma ► {agent-name}
|
|
902
902
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
903
903
|
|
|
904
904
|
Model: {model}
|
|
@@ -923,7 +923,7 @@ Run an inline node script to check whether a key is already stored in keytar for
|
|
|
923
923
|
|
|
924
924
|
```bash
|
|
925
925
|
KEY_CHECK_RESULT=$(node -e "
|
|
926
|
-
const { get, SERVICE } = require('~/.claude/
|
|
926
|
+
const { get, SERVICE } = require('~/.claude/nf-bin/secrets.cjs');
|
|
927
927
|
(async () => {
|
|
928
928
|
try {
|
|
929
929
|
const agentName = process.env.AGENT_NAME;
|
|
@@ -985,7 +985,7 @@ Run inline node script using `set()` from `bin/secrets.cjs`. Pass key via enviro
|
|
|
985
985
|
|
|
986
986
|
```bash
|
|
987
987
|
KEY_STORE_RESULT=$(node -e "
|
|
988
|
-
const { set, SERVICE } = require('~/.claude/
|
|
988
|
+
const { set, SERVICE } = require('~/.claude/nf-bin/secrets.cjs');
|
|
989
989
|
(async () => {
|
|
990
990
|
try {
|
|
991
991
|
const agentName = process.env.AGENT_NAME;
|
|
@@ -1019,7 +1019,7 @@ Parse KEY_STORE_RESULT:
|
|
|
1019
1019
|
node -e "
|
|
1020
1020
|
const fs = require('fs');
|
|
1021
1021
|
const ts = new Date().toISOString();
|
|
1022
|
-
const msg = ts + '
|
|
1022
|
+
const msg = ts + ' nForma mcp-setup: keytar unavailable for ' + process.env.AGENT_KEY + ' — API key stored unencrypted in env block\n';
|
|
1023
1023
|
fs.appendFileSync(require('os').homedir() + '/.claude/debug/mcp-setup-audit.log', msg);
|
|
1024
1024
|
" AGENT_KEY="{agent-name}"
|
|
1025
1025
|
```
|
|
@@ -1030,7 +1030,7 @@ Show pending summary using the existing "Confirm + Apply + Restart Flow" pattern
|
|
|
1030
1030
|
|
|
1031
1031
|
```
|
|
1032
1032
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
1033
|
-
|
|
1033
|
+
nForma ► REVIEW PENDING CHANGES
|
|
1034
1034
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
1035
1035
|
|
|
1036
1036
|
◆ {agent-name} — API key updated (stored in system keychain)
|
|
@@ -1075,15 +1075,15 @@ process.stdout.write(JSON.stringify({ written: true }) + '\n');
|
|
|
1075
1075
|
3. Sync all keytar secrets back to ~/.claude.json:
|
|
1076
1076
|
```bash
|
|
1077
1077
|
node -e "
|
|
1078
|
-
const { syncToClaudeJson, SERVICE } = require('~/.claude/
|
|
1078
|
+
const { syncToClaudeJson, SERVICE } = require('~/.claude/nf-bin/secrets.cjs');
|
|
1079
1079
|
syncToClaudeJson(SERVICE).then(() => process.stdout.write('synced\n')).catch(e => process.stderr.write(e.message + '\n'));
|
|
1080
1080
|
"
|
|
1081
1081
|
```
|
|
1082
1082
|
|
|
1083
|
-
4. Invoke `/
|
|
1083
|
+
4. Invoke `/nf:mcp-restart {agent-name}` (sequential). If restart fails, leave config written and display:
|
|
1084
1084
|
```
|
|
1085
1085
|
⚠ {agent-name}: restart failed. Config applied — reload on next Claude Code restart.
|
|
1086
|
-
Manual retry: /
|
|
1086
|
+
Manual retry: /nf:mcp-restart {agent-name}
|
|
1087
1087
|
```
|
|
1088
1088
|
|
|
1089
1089
|
5. Display:
|
|
@@ -1092,7 +1092,7 @@ syncToClaudeJson(SERVICE).then(() => process.stdout.write('synced\n')).catch(e =
|
|
|
1092
1092
|
|
|
1093
1093
|
✓ {agent-name} — key updated, restarted
|
|
1094
1094
|
|
|
1095
|
-
Run /
|
|
1095
|
+
Run /nf:mcp-status to verify agent health.
|
|
1096
1096
|
```
|
|
1097
1097
|
|
|
1098
1098
|
Return to Agent Sub-Menu (user can make further changes or go Back).
|
|
@@ -1159,7 +1159,7 @@ Show pending summary:
|
|
|
1159
1159
|
|
|
1160
1160
|
```
|
|
1161
1161
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
1162
|
-
|
|
1162
|
+
nForma ► REVIEW PENDING CHANGES
|
|
1163
1163
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
1164
1164
|
|
|
1165
1165
|
◆ {agent-name} — provider changed to {NEW_PROVIDER_NAME} ({NEW_URL})
|
|
@@ -1204,15 +1204,15 @@ process.stdout.write(JSON.stringify({ written: true }) + '\n');
|
|
|
1204
1204
|
3. Sync keytar secrets to ~/.claude.json:
|
|
1205
1205
|
```bash
|
|
1206
1206
|
node -e "
|
|
1207
|
-
const { syncToClaudeJson, SERVICE } = require('~/.claude/
|
|
1207
|
+
const { syncToClaudeJson, SERVICE } = require('~/.claude/nf-bin/secrets.cjs');
|
|
1208
1208
|
syncToClaudeJson(SERVICE).then(() => process.stdout.write('synced\n')).catch(e => process.stderr.write(e.message + '\n'));
|
|
1209
1209
|
"
|
|
1210
1210
|
```
|
|
1211
1211
|
|
|
1212
|
-
4. Invoke `/
|
|
1212
|
+
4. Invoke `/nf:mcp-restart {agent-name}` (sequential). If restart fails, leave config written and display:
|
|
1213
1213
|
```
|
|
1214
1214
|
⚠ {agent-name}: restart failed. Config applied — reload on next Claude Code restart.
|
|
1215
|
-
Manual retry: /
|
|
1215
|
+
Manual retry: /nf:mcp-restart {agent-name}
|
|
1216
1216
|
```
|
|
1217
1217
|
|
|
1218
1218
|
5. Display:
|
|
@@ -1221,7 +1221,7 @@ syncToClaudeJson(SERVICE).then(() => process.stdout.write('synced\n')).catch(e =
|
|
|
1221
1221
|
|
|
1222
1222
|
✓ {agent-name} — provider changed to {NEW_PROVIDER_NAME}, restarted
|
|
1223
1223
|
|
|
1224
|
-
Run /
|
|
1224
|
+
Run /nf:mcp-status to verify agent health.
|
|
1225
1225
|
```
|
|
1226
1226
|
|
|
1227
1227
|
Return to Agent Sub-Menu (user can make further changes or go Back).
|
|
@@ -1234,7 +1234,7 @@ Display removal warning:
|
|
|
1234
1234
|
|
|
1235
1235
|
```
|
|
1236
1236
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
1237
|
-
|
|
1237
|
+
nForma ► REMOVE AGENT
|
|
1238
1238
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
1239
1239
|
|
|
1240
1240
|
⚠ This will permanently remove {agent-name} from
|
|
@@ -1285,7 +1285,7 @@ process.stdout.write(JSON.stringify({ removed: true, agent: agentName }) + '\n')
|
|
|
1285
1285
|
✓ {agent-name} — removed from ~/.claude.json
|
|
1286
1286
|
The agent will be deregistered on next Claude Code restart.
|
|
1287
1287
|
|
|
1288
|
-
Run /
|
|
1288
|
+
Run /nf:mcp-status to verify the updated agent roster.
|
|
1289
1289
|
```
|
|
1290
1290
|
|
|
1291
1291
|
Return to roster display (re-read roster — removed agent no longer appears).
|
|
@@ -1302,7 +1302,7 @@ Display pending summary:
|
|
|
1302
1302
|
|
|
1303
1303
|
```
|
|
1304
1304
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
1305
|
-
|
|
1305
|
+
nForma ► REVIEW PENDING CHANGES
|
|
1306
1306
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
1307
1307
|
|
|
1308
1308
|
◆ {agent-name} — {description of change}
|
|
@@ -1329,12 +1329,12 @@ cp ~/.claude.json ~/.claude.json.backup-$(date +%Y-%m-%d-%H%M%S) 2>/dev/null ||
|
|
|
1329
1329
|
3. Sync keytar secrets:
|
|
1330
1330
|
```bash
|
|
1331
1331
|
node -e "
|
|
1332
|
-
const { syncToClaudeJson, SERVICE } = require('~/.claude/
|
|
1332
|
+
const { syncToClaudeJson, SERVICE } = require('~/.claude/nf-bin/secrets.cjs');
|
|
1333
1333
|
syncToClaudeJson(SERVICE).then(() => process.stdout.write('synced\n')).catch(e => process.stderr.write(e.message + '\n'));
|
|
1334
1334
|
"
|
|
1335
1335
|
```
|
|
1336
1336
|
|
|
1337
|
-
4. For each affected agent (sequential, one at a time): invoke `/
|
|
1337
|
+
4. For each affected agent (sequential, one at a time): invoke `/nf:mcp-restart {agent-name}`.
|
|
1338
1338
|
|
|
1339
1339
|
5. Display:
|
|
1340
1340
|
```
|
|
@@ -1342,13 +1342,13 @@ syncToClaudeJson(SERVICE).then(() => process.stdout.write('synced\n')).catch(e =
|
|
|
1342
1342
|
|
|
1343
1343
|
✓ {agent-name} — restarted
|
|
1344
1344
|
|
|
1345
|
-
Run /
|
|
1345
|
+
Run /nf:mcp-status to verify agent health.
|
|
1346
1346
|
```
|
|
1347
1347
|
|
|
1348
1348
|
If a restart fails, leave config written and display:
|
|
1349
1349
|
```
|
|
1350
1350
|
⚠ {agent-name}: restart failed. Config applied — reload on next Claude Code restart.
|
|
1351
|
-
Manual retry: /
|
|
1351
|
+
Manual retry: /nf:mcp-restart {agent-name}
|
|
1352
1352
|
```
|
|
1353
1353
|
|
|
1354
1354
|
</process>
|
|
@@ -1366,6 +1366,6 @@ If a restart fails, leave config written and display:
|
|
|
1366
1366
|
- Keytar failure: warning + Linux hint + confirmation before env-block fallback + audit log
|
|
1367
1367
|
- Key value never appears in displayed text, log output, or shell history (passed via env var only)
|
|
1368
1368
|
- Edit Quorum Composition flow (WIZ-08): re-run menu option "Edit Quorum Composition" → routes to Composition Screen
|
|
1369
|
-
- Composition toggle flow (WIZ-09): slot list with ● ON / ○ OFF indicators → toggle updates PENDING_ACTIVE → apply writes quorum_active to ~/.claude/
|
|
1369
|
+
- Composition toggle flow (WIZ-09): slot list with ● ON / ○ OFF indicators → toggle updates PENDING_ACTIVE → apply writes quorum_active to ~/.claude/nf.json → no restart required
|
|
1370
1370
|
- Add slot from composition flow (WIZ-10): "Add new slot" → Step A/B/B-native → identity ping → return to Composition Screen showing new slot ● ON
|
|
1371
1371
|
</success_criteria>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: nf:mcp-status
|
|
3
3
|
description: Show status of all connected quorum agents — provider, model, health, and latency
|
|
4
4
|
allowed-tools:
|
|
5
5
|
- Read
|
|
@@ -116,7 +116,7 @@ Display as `sub` or `api` in the Auth column.
|
|
|
116
116
|
Print:
|
|
117
117
|
```
|
|
118
118
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
119
|
-
|
|
119
|
+
nForma ► MCP STATUS
|
|
120
120
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
121
121
|
|
|
122
122
|
Querying 4 CLI agents + 6 HTTP providers...
|
|
@@ -244,7 +244,7 @@ Scoreboard: 156 rounds recorded | Last update: 2026-02-23T14:23:52.301Z
|
|
|
244
244
|
|
|
245
245
|
If scoreboard file was absent, show instead:
|
|
246
246
|
```
|
|
247
|
-
Scoreboard: no data yet (run /
|
|
247
|
+
Scoreboard: no data yet (run /nf:quorum first to populate)
|
|
248
248
|
```
|
|
249
249
|
|
|
250
250
|
Health legend:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: nf:mcp-update
|
|
3
3
|
description: Update a quorum agent to its latest version — detects install method from ~/.claude.json and runs the correct update command
|
|
4
4
|
argument-hint: "<agent|all>"
|
|
5
5
|
allowed-tools:
|
|
@@ -7,7 +7,7 @@ allowed-tools:
|
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
<objective>
|
|
10
|
-
Update a named quorum agent (or all agents) to their latest version. The install method is detected from `~/.claude.json` mcpServers config: `npx`-based agents update via `npm install -g <package>`; `node`-based local repo agents update via `git pull && npm run build` in their repo directory. The running process is NOT killed — run `/
|
|
10
|
+
Update a named quorum agent (or all agents) to their latest version. The install method is detected from `~/.claude.json` mcpServers config: `npx`-based agents update via `npm install -g <package>`; `node`-based local repo agents update via `git pull && npm run build` in their repo directory. The running process is NOT killed — run `/nf:mcp-restart <agent>` after updating to load the new binary.
|
|
11
11
|
</objective>
|
|
12
12
|
|
|
13
13
|
<process>
|
|
@@ -18,7 +18,7 @@ Parse `$ARGUMENTS` as one token: `$TARGET`.
|
|
|
18
18
|
|
|
19
19
|
If `$TARGET` is missing, print usage and stop:
|
|
20
20
|
```
|
|
21
|
-
Usage: /
|
|
21
|
+
Usage: /nf:mcp-update <agent|all>
|
|
22
22
|
|
|
23
23
|
Valid agents:
|
|
24
24
|
codex-cli-1, gemini-cli-1, opencode-1, copilot-1,
|
|
@@ -143,7 +143,7 @@ Updated $TARGET
|
|
|
143
143
|
Result: <last line of npm/git output>
|
|
144
144
|
|
|
145
145
|
Note: The running agent process is still using the old version.
|
|
146
|
-
Run: /
|
|
146
|
+
Run: /nf:mcp-restart $TARGET to load the new binary.
|
|
147
147
|
```
|
|
148
148
|
|
|
149
149
|
## Step 6 — All-agent mode (if $TARGET = "all")
|
|
@@ -229,9 +229,9 @@ Update results:
|
|
|
229
229
|
claude-6 (shared repo) ⚡ SKIPPED
|
|
230
230
|
|
|
231
231
|
To load new binaries, restart updated agents:
|
|
232
|
-
/
|
|
233
|
-
/
|
|
234
|
-
/
|
|
232
|
+
/nf:mcp-restart codex-cli-1
|
|
233
|
+
/nf:mcp-restart gemini-cli-1
|
|
234
|
+
/nf:mcp-restart opencode-1
|
|
235
235
|
(etc. — list only agents that were UPDATED, not SKIPPED)
|
|
236
236
|
```
|
|
237
237
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: nf:new-milestone
|
|
3
3
|
description: Start a new milestone cycle — update PROJECT.md and route to requirements
|
|
4
4
|
argument-hint: "[milestone name, e.g., 'v1.1 Notifications']"
|
|
5
5
|
allowed-tools:
|
|
@@ -21,15 +21,15 @@ Brownfield equivalent of new-project. Project exists, PROJECT.md has history. Ga
|
|
|
21
21
|
- `.planning/ROADMAP.md` — phase structure (continues numbering)
|
|
22
22
|
- `.planning/STATE.md` — reset for new milestone
|
|
23
23
|
|
|
24
|
-
**After:** `/
|
|
24
|
+
**After:** `/nf:plan-phase [N]` to start execution.
|
|
25
25
|
</objective>
|
|
26
26
|
|
|
27
27
|
<execution_context>
|
|
28
|
-
@~/.claude/
|
|
29
|
-
@~/.claude/
|
|
30
|
-
@~/.claude/
|
|
31
|
-
@~/.claude/
|
|
32
|
-
@~/.claude/
|
|
28
|
+
@~/.claude/nf/workflows/new-milestone.md
|
|
29
|
+
@~/.claude/nf/references/questioning.md
|
|
30
|
+
@~/.claude/nf/references/ui-brand.md
|
|
31
|
+
@~/.claude/nf/templates/project.md
|
|
32
|
+
@~/.claude/nf/templates/requirements.md
|
|
33
33
|
</execution_context>
|
|
34
34
|
|
|
35
35
|
<context>
|
|
@@ -39,6 +39,6 @@ Project and milestone context files are resolved inside the workflow (`init new-
|
|
|
39
39
|
</context>
|
|
40
40
|
|
|
41
41
|
<process>
|
|
42
|
-
Execute the new-milestone workflow from @~/.claude/
|
|
42
|
+
Execute the new-milestone workflow from @~/.claude/nf/workflows/new-milestone.md end-to-end.
|
|
43
43
|
Preserve all workflow gates (validation, questioning, research, requirements, roadmap approval, commits).
|
|
44
44
|
</process>
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
2
|
+
name: nf:new-project
|
|
3
3
|
description: Initialize a new project with deep context gathering and PROJECT.md
|
|
4
4
|
argument-hint: "[--auto]"
|
|
5
5
|
allowed-tools:
|
|
@@ -25,18 +25,18 @@ Initialize a new project through unified flow: questioning → research (optiona
|
|
|
25
25
|
- `.planning/ROADMAP.md` — phase structure
|
|
26
26
|
- `.planning/STATE.md` — project memory
|
|
27
27
|
|
|
28
|
-
**After this command:** Run `/
|
|
28
|
+
**After this command:** Run `/nf:plan-phase 1` to start execution.
|
|
29
29
|
</objective>
|
|
30
30
|
|
|
31
31
|
<execution_context>
|
|
32
|
-
@~/.claude/
|
|
33
|
-
@~/.claude/
|
|
34
|
-
@~/.claude/
|
|
35
|
-
@~/.claude/
|
|
36
|
-
@~/.claude/
|
|
32
|
+
@~/.claude/nf/workflows/new-project.md
|
|
33
|
+
@~/.claude/nf/references/questioning.md
|
|
34
|
+
@~/.claude/nf/references/ui-brand.md
|
|
35
|
+
@~/.claude/nf/templates/project.md
|
|
36
|
+
@~/.claude/nf/templates/requirements.md
|
|
37
37
|
</execution_context>
|
|
38
38
|
|
|
39
39
|
<process>
|
|
40
|
-
Execute the new-project workflow from @~/.claude/
|
|
40
|
+
Execute the new-project workflow from @~/.claude/nf/workflows/new-project.md end-to-end.
|
|
41
41
|
Preserve all workflow gates (validation, approvals, commits, routing).
|
|
42
42
|
</process>
|