moflo 4.9.20 → 4.9.22
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/.claude/agents/analysis/analyze-code-quality.md +0 -121
- package/.claude/agents/analysis/code-analyzer.md +5 -26
- package/.claude/agents/architecture/system-design/arch-system-design.md +0 -119
- package/.claude/agents/base-template-generator.md +0 -1
- package/.claude/agents/core/coder.md +0 -22
- package/.claude/agents/core/planner.md +0 -16
- package/.claude/agents/core/researcher.md +0 -16
- package/.claude/agents/core/reviewer.md +0 -17
- package/.claude/agents/core/tester.md +0 -19
- package/.claude/agents/custom/test-long-runner.md +0 -2
- package/.claude/agents/development/dev-backend-api.md +0 -167
- package/.claude/agents/development/dev-database.md +43 -0
- package/.claude/agents/development/dev-frontend.md +42 -0
- package/.claude/agents/devops/ci-cd/ops-cicd-github.md +0 -112
- package/.claude/agents/documentation/api-docs/docs-api-openapi.md +0 -111
- package/.claude/agents/security/security-auditor.md +45 -0
- package/.claude/guidance/shipped/moflo-agent-rules.md +172 -0
- package/.claude/guidance/shipped/moflo-claude-swarm-cohesion.md +73 -265
- package/.claude/guidance/shipped/moflo-cli-reference.md +6 -6
- package/.claude/guidance/shipped/moflo-core-guidance.md +66 -184
- package/.claude/guidance/shipped/moflo-cross-platform.md +1 -1
- package/.claude/guidance/shipped/moflo-error-handling.md +3 -3
- package/.claude/guidance/shipped/moflo-guidance-rules.md +17 -7
- package/.claude/guidance/shipped/moflo-memory-strategy.md +76 -182
- package/.claude/guidance/shipped/moflo-memorydb-maintenance.md +6 -8
- package/.claude/guidance/shipped/moflo-settings-injection.md +7 -9
- package/.claude/guidance/shipped/moflo-source-hygiene.md +5 -5
- package/.claude/guidance/shipped/moflo-spell-connectors.md +3 -4
- package/.claude/guidance/shipped/moflo-spell-custom-steps.md +3 -4
- package/.claude/guidance/shipped/moflo-spell-engine.md +40 -162
- package/.claude/guidance/shipped/moflo-spell-runner.md +134 -0
- package/.claude/guidance/shipped/moflo-spell-sandboxing.md +10 -57
- package/.claude/guidance/shipped/moflo-spell-troubleshooting.md +149 -0
- package/.claude/guidance/shipped/moflo-subagents.md +43 -114
- package/.claude/guidance/shipped/moflo-task-icons.md +4 -4
- package/.claude/guidance/shipped/moflo-user-facing-language.md +3 -3
- package/.claude/guidance/shipped/moflo-verbose-command-filtering.md +3 -3
- package/.claude/guidance/shipped/moflo-yaml-reference.md +4 -5
- package/.claude/helpers/gate.cjs +192 -15
- package/.claude/helpers/prompt-hook.mjs +4 -38
- package/.claude/helpers/simplify-classify.cjs +32 -11
- package/.claude/helpers/subagent-bootstrap.json +1 -1
- package/.claude/helpers/subagent-start.cjs +1 -1
- package/.claude/skills/connector-builder/SKILL.md +42 -429
- package/.claude/skills/connector-builder/templates/connector.md +189 -0
- package/.claude/skills/connector-builder/templates/step-command.md +176 -0
- package/.claude/skills/eldar/SKILL.md +7 -7
- package/.claude/skills/fl/SKILL.md +3 -3
- package/.claude/skills/fl/execution-modes.md +39 -16
- package/.claude/skills/fl/phases.md +3 -3
- package/.claude/skills/{simplify → flo-simplify}/SKILL.md +11 -11
- package/.claude/skills/guidance/SKILL.md +17 -9
- package/.claude/skills/memory-patterns/SKILL.md +1 -1
- package/.claude/skills/publish/SKILL.md +121 -36
- package/.claude/skills/reset-epic/SKILL.md +2 -2
- package/.claude/skills/spell-builder/SKILL.md +39 -226
- package/.claude/skills/spell-builder/architecture.md +1 -1
- package/.claude/skills/spell-builder/permissions.md +107 -0
- package/.claude/skills/spell-builder/preflight.md +101 -0
- package/.claude/skills/spell-schedule/SKILL.md +2 -3
- package/bin/gate.cjs +192 -15
- package/bin/lib/retired-files.mjs +146 -0
- package/bin/prompt-hook.mjs +4 -38
- package/bin/session-start-launcher.mjs +120 -1
- package/bin/setup-project.mjs +63 -69
- package/bin/simplify-classify.cjs +32 -11
- package/dist/src/cli/appliance/rvfa-builder.js +1 -1
- package/dist/src/cli/commands/agent.js +3 -9
- package/dist/src/cli/commands/doctor-checks-deep.js +4 -0
- package/dist/src/cli/commands/hooks.js +1 -3
- package/dist/src/cli/commands/index.js +2 -0
- package/dist/src/cli/commands/retire.js +111 -0
- package/dist/src/cli/hooks/reasoningbank/index.js +7 -7
- package/dist/src/cli/init/claudemd-generator.js +30 -33
- package/dist/src/cli/init/executor.js +53 -69
- package/dist/src/cli/init/helpers-generator.js +165 -52
- package/dist/src/cli/init/moflo-init.js +41 -114
- package/dist/src/cli/init/settings-generator.js +44 -14
- package/dist/src/cli/mcp-tools/agent-tools.js +9 -27
- package/dist/src/cli/mcp-tools/hooks-tools.js +23 -21
- package/dist/src/cli/memory/controllers/semantic-router.js +18 -12
- package/dist/src/cli/memory/sona-optimizer.js +6 -6
- package/dist/src/cli/neural/domain/services/learning-service.js +3 -3
- package/dist/src/cli/services/agent-router.js +2 -5
- package/dist/src/cli/services/hook-block-hash.js +11 -2
- package/dist/src/cli/services/hook-wiring.js +86 -3
- package/dist/src/cli/services/subagent-bootstrap.js +1 -1
- package/dist/src/cli/shared/events/example-usage.js +6 -6
- package/dist/src/cli/shared/hooks/task-hooks.js +8 -8
- package/dist/src/cli/version.js +1 -1
- package/package.json +3 -2
- package/retired-files.json +1989 -0
- package/scripts/post-install-bootstrap.mjs +19 -0
- package/src/cli/data/model-registry.json +2 -2
- package/.claude/agents/consensus/byzantine-coordinator.md +0 -63
- package/.claude/agents/consensus/crdt-synchronizer.md +0 -997
- package/.claude/agents/consensus/gossip-coordinator.md +0 -63
- package/.claude/agents/consensus/performance-benchmarker.md +0 -851
- package/.claude/agents/consensus/quorum-manager.md +0 -823
- package/.claude/agents/consensus/raft-manager.md +0 -63
- package/.claude/agents/consensus/security-manager.md +0 -622
- package/.claude/agents/data/ml/data-ml-model.md +0 -193
- package/.claude/agents/github/code-review-swarm.md +0 -538
- package/.claude/agents/github/github-modes.md +0 -172
- package/.claude/agents/github/issue-tracker.md +0 -311
- package/.claude/agents/github/multi-repo-swarm.md +0 -551
- package/.claude/agents/github/pr-manager.md +0 -183
- package/.claude/agents/github/project-board-sync.md +0 -508
- package/.claude/agents/github/release-manager.md +0 -360
- package/.claude/agents/github/release-swarm.md +0 -580
- package/.claude/agents/github/repo-architect.md +0 -391
- package/.claude/agents/github/swarm-issue.md +0 -566
- package/.claude/agents/github/swarm-pr.md +0 -414
- package/.claude/agents/github/sync-coordinator.md +0 -426
- package/.claude/agents/github/workflow-automation.md +0 -606
- package/.claude/agents/goal/code-goal-planner.md +0 -440
- package/.claude/agents/goal/goal-planner.md +0 -168
- package/.claude/agents/hive-mind/collective-intelligence-coordinator.md +0 -127
- package/.claude/agents/hive-mind/queen-coordinator.md +0 -198
- package/.claude/agents/hive-mind/scout-explorer.md +0 -233
- package/.claude/agents/hive-mind/swarm-memory-manager.md +0 -184
- package/.claude/agents/hive-mind/worker-specialist.md +0 -208
- package/.claude/agents/neural/safla-neural.md +0 -73
- package/.claude/agents/optimization/benchmark-suite.md +0 -665
- package/.claude/agents/optimization/load-balancer.md +0 -431
- package/.claude/agents/optimization/performance-monitor.md +0 -672
- package/.claude/agents/optimization/resource-allocator.md +0 -674
- package/.claude/agents/optimization/topology-optimizer.md +0 -808
- package/.claude/agents/reasoning/goal-planner.md +0 -67
- package/.claude/agents/sona/sona-learning-optimizer.md +0 -74
- package/.claude/agents/sparc/architecture.md +0 -472
- package/.claude/agents/sparc/pseudocode.md +0 -318
- package/.claude/agents/sparc/refinement.md +0 -525
- package/.claude/agents/sparc/specification.md +0 -276
- package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +0 -225
- package/.claude/agents/swarm/adaptive-coordinator.md +0 -391
- package/.claude/agents/swarm/hierarchical-coordinator.md +0 -321
- package/.claude/agents/swarm/mesh-coordinator.md +0 -383
- package/.claude/agents/testing/production-validator.md +0 -395
- package/.claude/agents/testing/tdd-london-swarm.md +0 -244
- package/.claude/agents/v3/adr-architect.md +0 -184
- package/.claude/agents/v3/aidefence-guardian.md +0 -277
- package/.claude/agents/v3/claims-authorizer.md +0 -208
- package/.claude/agents/v3/collective-intelligence-coordinator.md +0 -988
- package/.claude/agents/v3/ddd-domain-expert.md +0 -220
- package/.claude/agents/v3/injection-analyst.md +0 -232
- package/.claude/agents/v3/memory-specialist.md +0 -987
- package/.claude/agents/v3/performance-engineer.md +0 -1225
- package/.claude/agents/v3/pii-detector.md +0 -146
- package/.claude/agents/v3/reasoningbank-learner.md +0 -213
- package/.claude/agents/v3/security-architect-aidefence.md +0 -405
- package/.claude/agents/v3/security-architect.md +0 -865
- package/.claude/agents/v3/security-auditor.md +0 -771
- package/.claude/agents/v3/sparc-orchestrator.md +0 -182
- package/.claude/agents/v3/swarm-memory-manager.md +0 -142
- package/.claude/agents/v3/v3-integration-architect.md +0 -205
- package/.claude/commands/claude-flow-help.md +0 -103
- package/.claude/commands/claude-flow-memory.md +0 -107
- package/.claude/commands/claude-flow-swarm.md +0 -205
- package/.claude/commands/github/README.md +0 -11
- package/.claude/commands/github/code-review-swarm.md +0 -514
- package/.claude/commands/github/code-review.md +0 -25
- package/.claude/commands/github/github-modes.md +0 -146
- package/.claude/commands/github/github-swarm.md +0 -113
- package/.claude/commands/github/issue-tracker.md +0 -284
- package/.claude/commands/github/issue-triage.md +0 -25
- package/.claude/commands/github/multi-repo-swarm.md +0 -519
- package/.claude/commands/github/pr-enhance.md +0 -26
- package/.claude/commands/github/pr-manager.md +0 -164
- package/.claude/commands/github/project-board-sync.md +0 -471
- package/.claude/commands/github/release-manager.md +0 -332
- package/.claude/commands/github/release-swarm.md +0 -544
- package/.claude/commands/github/repo-analyze.md +0 -25
- package/.claude/commands/github/repo-architect.md +0 -361
- package/.claude/commands/github/swarm-issue.md +0 -482
- package/.claude/commands/github/swarm-pr.md +0 -285
- package/.claude/commands/github/sync-coordinator.md +0 -294
- package/.claude/commands/github/workflow-automation.md +0 -442
- package/.claude/commands/hooks/README.md +0 -11
- package/.claude/commands/hooks/overview.md +0 -58
- package/.claude/commands/hooks/post-edit.md +0 -117
- package/.claude/commands/hooks/post-task.md +0 -112
- package/.claude/commands/hooks/pre-edit.md +0 -113
- package/.claude/commands/hooks/pre-task.md +0 -111
- package/.claude/commands/hooks/session-end.md +0 -118
- package/.claude/commands/hooks/setup.md +0 -103
- package/.claude/commands/simplify.md +0 -101
- package/.claude/commands/sparc/analyzer.md +0 -42
- package/.claude/commands/sparc/architect.md +0 -43
- package/.claude/commands/sparc/ask.md +0 -86
- package/.claude/commands/sparc/batch-executor.md +0 -44
- package/.claude/commands/sparc/code.md +0 -78
- package/.claude/commands/sparc/coder.md +0 -44
- package/.claude/commands/sparc/debug.md +0 -72
- package/.claude/commands/sparc/debugger.md +0 -44
- package/.claude/commands/sparc/designer.md +0 -43
- package/.claude/commands/sparc/devops.md +0 -98
- package/.claude/commands/sparc/docs-writer.md +0 -69
- package/.claude/commands/sparc/documenter.md +0 -44
- package/.claude/commands/sparc/innovator.md +0 -44
- package/.claude/commands/sparc/integration.md +0 -72
- package/.claude/commands/sparc/mcp.md +0 -106
- package/.claude/commands/sparc/memory-manager.md +0 -44
- package/.claude/commands/sparc/optimizer.md +0 -44
- package/.claude/commands/sparc/orchestrator.md +0 -116
- package/.claude/commands/sparc/post-deployment-monitoring-mode.md +0 -72
- package/.claude/commands/sparc/refinement-optimization-mode.md +0 -72
- package/.claude/commands/sparc/researcher.md +0 -44
- package/.claude/commands/sparc/reviewer.md +0 -44
- package/.claude/commands/sparc/security-review.md +0 -69
- package/.claude/commands/sparc/sparc-modes.md +0 -139
- package/.claude/commands/sparc/sparc.md +0 -99
- package/.claude/commands/sparc/spec-pseudocode.md +0 -69
- package/.claude/commands/sparc/spell-manager.md +0 -44
- package/.claude/commands/sparc/supabase-admin.md +0 -337
- package/.claude/commands/sparc/swarm-coordinator.md +0 -44
- package/.claude/commands/sparc/tdd.md +0 -44
- package/.claude/commands/sparc/tester.md +0 -44
- package/.claude/commands/sparc/tutorial.md +0 -68
- package/.claude/commands/sparc.md +0 -151
- package/.claude/guidance/shipped/moflo-session-start.md +0 -154
- package/.claude/guidance/shipped/moflo-spell-engine-architecture.md +0 -145
- package/.claude/skills/browser/SKILL.md +0 -204
- package/.claude/skills/github-code-review/SKILL.md +0 -1140
- package/.claude/skills/github-multi-repo/SKILL.md +0 -866
- package/.claude/skills/github-project-management/SKILL.md +0 -1272
- package/.claude/skills/github-release-management/SKILL.md +0 -1074
- package/.claude/skills/github-workflow-automation/SKILL.md +0 -1060
- package/.claude/skills/hive-mind-advanced/SKILL.md +0 -712
- package/.claude/skills/hooks-automation/SKILL.md +0 -1193
- package/.claude/skills/pair-programming/SKILL.md +0 -1202
- package/.claude/skills/performance-analysis/SKILL.md +0 -563
- package/.claude/skills/skill-builder/SKILL.md +0 -910
- package/.claude/skills/sparc-methodology/SKILL.md +0 -904
- package/.claude/skills/stream-chain/SKILL.md +0 -563
- package/.claude/skills/swarm-advanced/SKILL.md +0 -811
- package/.claude/skills/swarm-orchestration/SKILL.md +0 -179
- package/.claude/skills/verification-quality/SKILL.md +0 -649
- package/.claude/skills/worker-benchmarks/skill.md +0 -135
- package/.claude/skills/worker-integration/skill.md +0 -154
|
@@ -23,65 +23,64 @@ import { errorDetail } from '../shared/utils/error-detail.js';
|
|
|
23
23
|
/**
|
|
24
24
|
* Skills to copy based on configuration. Exported for integrity tests.
|
|
25
25
|
*/
|
|
26
|
+
// Skills installed into a consumer's `<root>/.claude/skills/` by `flo init`.
|
|
27
|
+
// Every entry must be a moflo-quality, consumer-runnable skill — verified to
|
|
28
|
+
// reference moflo CLI/MCP tools (not upstream `claude-flow` / `agentic-flow`
|
|
29
|
+
// cruft). New additions MUST pass the same audit, otherwise the drift-guard
|
|
30
|
+
// test (skills-classification-drift.test.ts) fails. See INTERNAL_SKILLS for
|
|
31
|
+
// skills that ship in the tarball but are deliberately NOT installed.
|
|
26
32
|
export const SKILLS_MAP = {
|
|
27
33
|
core: [
|
|
28
|
-
'
|
|
29
|
-
'
|
|
30
|
-
'
|
|
31
|
-
'hooks-automation',
|
|
32
|
-
'pair-programming',
|
|
33
|
-
'verification-quality',
|
|
34
|
-
'stream-chain',
|
|
35
|
-
'skill-builder',
|
|
34
|
+
'eldar',
|
|
35
|
+
'guidance',
|
|
36
|
+
'flo-simplify',
|
|
36
37
|
'reasoningbank-intelligence',
|
|
37
38
|
],
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
'
|
|
41
|
-
'
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
'
|
|
39
|
+
memory: [
|
|
40
|
+
'memory-patterns',
|
|
41
|
+
'memory-optimization',
|
|
42
|
+
'vector-search',
|
|
43
|
+
],
|
|
44
|
+
spells: [
|
|
45
|
+
'spell-builder',
|
|
46
|
+
'spell-schedule',
|
|
47
|
+
'connector-builder',
|
|
45
48
|
],
|
|
46
49
|
};
|
|
50
|
+
// Skills that ship in the npm tarball (under `node_modules/moflo/.claude/skills/`)
|
|
51
|
+
// but are deliberately NOT copied into consumer projects by `flo init`. Strictly
|
|
52
|
+
// moflo-internal dev tooling. The drift-guard test asserts every dir under
|
|
53
|
+
// `.claude/skills/` is classified in either SKILLS_MAP or INTERNAL_SKILLS (plus
|
|
54
|
+
// the special `flo` + `fl` install path handled in moflo-init.ts).
|
|
55
|
+
export const INTERNAL_SKILLS = [
|
|
56
|
+
'publish', // moflo's own /publish workflow — not consumer-relevant
|
|
57
|
+
'reset-epic', // moflo's own epic test-data reset — would torch a consumer's repo
|
|
58
|
+
];
|
|
47
59
|
/**
|
|
48
60
|
* Commands to copy based on configuration
|
|
49
61
|
*/
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
monitoring: [],
|
|
57
|
-
optimization: [],
|
|
58
|
-
sparc: ['sparc'],
|
|
59
|
-
};
|
|
62
|
+
// Empty after #949 retired the last shipped slash commands. moflo's user-facing
|
|
63
|
+
// functionality now lives entirely in `.claude/skills/` (canonical) and
|
|
64
|
+
// `.claude/agents/` (subagent surface). Kept as an empty-record placeholder
|
|
65
|
+
// because callers iterate `Object.entries(COMMANDS_MAP)` to gate per-category
|
|
66
|
+
// install — see init-copy-maps.test.ts for the iteration contract.
|
|
67
|
+
const COMMANDS_MAP = {};
|
|
60
68
|
/**
|
|
61
69
|
* Agents to copy based on configuration. Exported for integrity tests.
|
|
70
|
+
*
|
|
71
|
+
* Each value is a directory name under `.claude/agents/` that ships in the
|
|
72
|
+
* moflo package. After #932 retired ~50 ruflo-aspirational agents, the set
|
|
73
|
+
* is narrowed to actual development specialties Claude is likely to invoke.
|
|
62
74
|
*/
|
|
63
75
|
export const AGENTS_MAP = {
|
|
64
76
|
core: ['core'],
|
|
65
|
-
consensus: ['consensus'],
|
|
66
|
-
github: ['github'],
|
|
67
|
-
hiveMind: ['hive-mind'],
|
|
68
|
-
sparc: ['sparc'],
|
|
69
|
-
swarm: ['swarm'],
|
|
70
|
-
browser: ['browser'], // agent-browser integration
|
|
71
|
-
// V3-specific agents
|
|
72
|
-
v3: ['v3'],
|
|
73
|
-
optimization: ['optimization'],
|
|
74
|
-
testing: ['testing'],
|
|
75
77
|
analysis: ['analysis'],
|
|
76
78
|
architecture: ['architecture'],
|
|
79
|
+
custom: ['custom'],
|
|
77
80
|
development: ['development'],
|
|
78
81
|
devops: ['devops'],
|
|
79
82
|
documentation: ['documentation'],
|
|
80
|
-
|
|
81
|
-
goal: ['goal'],
|
|
82
|
-
sona: ['sona'],
|
|
83
|
-
data: ['data'],
|
|
84
|
-
custom: ['custom'],
|
|
83
|
+
security: ['security'],
|
|
85
84
|
};
|
|
86
85
|
/**
|
|
87
86
|
* Directory structure to create
|
|
@@ -1509,39 +1508,24 @@ npx moflo swarm monitor
|
|
|
1509
1508
|
### Core Development (5)
|
|
1510
1509
|
\`coder\`, \`reviewer\`, \`tester\`, \`planner\`, \`researcher\`
|
|
1511
1510
|
|
|
1512
|
-
###
|
|
1513
|
-
\`
|
|
1514
|
-
|
|
1515
|
-
### Swarm Coordination (5)
|
|
1516
|
-
\`hierarchical-coordinator\`, \`mesh-coordinator\`, \`adaptive-coordinator\`, \`collective-intelligence-coordinator\`, \`swarm-memory-manager\`
|
|
1517
|
-
|
|
1518
|
-
### Consensus & Distributed (7)
|
|
1519
|
-
\`byzantine-coordinator\`, \`raft-manager\`, \`gossip-coordinator\`, \`consensus-builder\`, \`crdt-synchronizer\`, \`quorum-manager\`, \`security-manager\`
|
|
1520
|
-
|
|
1521
|
-
### Performance & Optimization (5)
|
|
1522
|
-
\`perf-analyzer\`, \`performance-benchmarker\`, \`task-orchestrator\`, \`memory-coordinator\`, \`smart-agent\`
|
|
1523
|
-
|
|
1524
|
-
### GitHub & Repository (9)
|
|
1525
|
-
\`github-modes\`, \`pr-manager\`, \`code-review-swarm\`, \`issue-tracker\`, \`release-manager\`, \`workflow-automation\`, \`project-board-sync\`, \`repo-architect\`, \`multi-repo-swarm\`
|
|
1526
|
-
|
|
1527
|
-
### SPARC Methodology (6)
|
|
1528
|
-
\`sparc-coord\`, \`sparc-coder\`, \`specification\`, \`pseudocode\`, \`architecture\`, \`refinement\`
|
|
1511
|
+
### Code Analysis (2)
|
|
1512
|
+
\`code-analyzer\`, \`analyst\`
|
|
1529
1513
|
|
|
1530
|
-
### Specialized Development (
|
|
1531
|
-
\`backend-dev\`, \`
|
|
1514
|
+
### Specialized Development (5)
|
|
1515
|
+
\`backend-dev\`, \`frontend-dev\`, \`database-dev\`, \`cicd-engineer\`, \`api-docs\`
|
|
1532
1516
|
|
|
1533
|
-
###
|
|
1534
|
-
\`
|
|
1517
|
+
### Security (1)
|
|
1518
|
+
\`security-auditor\`
|
|
1535
1519
|
|
|
1536
1520
|
### Agent Routing by Task
|
|
1537
|
-
| Task Type | Recommended Agents |
|
|
1538
|
-
|
|
1539
|
-
| Bug Fix | researcher, coder, tester |
|
|
1540
|
-
| New Feature |
|
|
1541
|
-
| Refactoring |
|
|
1542
|
-
|
|
|
1543
|
-
|
|
|
1544
|
-
| Docs | researcher, api-docs |
|
|
1521
|
+
| Task Type | Recommended Agents |
|
|
1522
|
+
|-----------|--------------------|
|
|
1523
|
+
| Bug Fix | researcher, coder, tester |
|
|
1524
|
+
| New Feature | planner, coder, tester, reviewer |
|
|
1525
|
+
| Refactoring | coder, reviewer |
|
|
1526
|
+
| Security | security-auditor, reviewer |
|
|
1527
|
+
| GitHub workflow | coder, reviewer (with \`gh\` CLI) |
|
|
1528
|
+
| Docs | researcher, api-docs |
|
|
1545
1529
|
|
|
1546
1530
|
---
|
|
1547
1531
|
|
|
@@ -207,7 +207,7 @@ var path = require('path');
|
|
|
207
207
|
var PROJECT_DIR = (process.env.CLAUDE_PROJECT_DIR || process.cwd()).replace(/^\\/([a-z])\\//i, '$1:/');
|
|
208
208
|
var STATE_FILE = path.join(PROJECT_DIR, '.claude', 'workflow-state.json');
|
|
209
209
|
|
|
210
|
-
var STATE_DEFAULTS = { tasksCreated: false, taskCount: 0, memorySearched: false, memorySearchedBy: {}, memoryRequired: true, learningsStored: false, testsRun: false, simplifyRun: false, interactionCount: 0, sessionStart: null, lastBlockedAt: null };
|
|
210
|
+
var STATE_DEFAULTS = { tasksCreated: false, taskCount: 0, memorySearched: false, memorySearchedBy: {}, memoryRequired: true, learningsStored: false, testsRun: false, simplifyRun: false, interactionCount: 0, sessionStart: null, lastBlockedAt: null, lastNamespaceHint: '', lastNamespaceHintEmittedBy: {}, flMode: null, swarmInitialized: false, hiveInitialized: false };
|
|
211
211
|
|
|
212
212
|
function readState() {
|
|
213
213
|
try {
|
|
@@ -255,7 +255,7 @@ function writeState(s) {
|
|
|
255
255
|
|
|
256
256
|
// Load moflo.yaml gate config (defaults: all enabled)
|
|
257
257
|
function loadGateConfig() {
|
|
258
|
-
var defaults = { memory_first: true, task_create_first: true, context_tracking: true, testing_gate: true, simplify_gate: true, learnings_gate: true };
|
|
258
|
+
var defaults = { memory_first: true, task_create_first: true, context_tracking: true, testing_gate: true, simplify_gate: true, learnings_gate: true, swarm_invocation_gate: true };
|
|
259
259
|
try {
|
|
260
260
|
var yamlPath = path.join(PROJECT_DIR, 'moflo.yaml');
|
|
261
261
|
if (fs.existsSync(yamlPath)) {
|
|
@@ -266,6 +266,7 @@ function loadGateConfig() {
|
|
|
266
266
|
if (/testing_gate:\\s*false/i.test(content)) defaults.testing_gate = false;
|
|
267
267
|
if (/simplify_gate:\\s*false/i.test(content)) defaults.simplify_gate = false;
|
|
268
268
|
if (/learnings_gate:\\s*false/i.test(content)) defaults.learnings_gate = false;
|
|
269
|
+
if (/swarm_invocation_gate:\\s*false/i.test(content)) defaults.swarm_invocation_gate = false;
|
|
269
270
|
}
|
|
270
271
|
} catch (e) { /* use defaults */ }
|
|
271
272
|
return defaults;
|
|
@@ -278,6 +279,83 @@ var EXEMPT = ['.claude/', '.claude\\\\', 'CLAUDE.md', 'MEMORY.md', 'workflow-sta
|
|
|
278
279
|
var DANGEROUS = ['rm -rf /', 'format c:', 'del /s /q c:\\\\', ':(){:|:&};:', 'mkfs.', '> /dev/sda'];
|
|
279
280
|
var DIRECTIVE_RE = /^(yes|no|yeah|yep|nope|sure|ok|okay|correct|right|exactly|perfect)\\b/i;
|
|
280
281
|
var TASK_RE = /\\b(fix|bug|error|implement|add|create|build|write|refactor|debug|test|feature|issue|security|optimi)\\b/i;
|
|
282
|
+
|
|
283
|
+
// Namespace classification (#931). Hint stored on workflow-state and emitted
|
|
284
|
+
// once by check-before-agent at Agent-spawn time — was emitted on every prompt
|
|
285
|
+
// before, costing ~40 tokens × every prompt × every consumer.
|
|
286
|
+
//
|
|
287
|
+
// SYNC: these regexes + classifyNamespaceHint + applyPromptStateReset are
|
|
288
|
+
// duplicated verbatim in bin/gate.cjs (canonical, synced to consumer
|
|
289
|
+
// .claude/helpers/gate.cjs by post-install-bootstrap). Any edit MUST be
|
|
290
|
+
// applied to both — this template is the fallback for the flo-init path
|
|
291
|
+
// where source helpers cannot be located, so it must keep parity.
|
|
292
|
+
var NS_LEARNINGS_RE = /\\b(remember|recall|insight|lesson learned|gotcha|post.?mortem)\\b|we (decid|agree|chose|said)/;
|
|
293
|
+
var NS_TEST_RE = /\\b(test|spec|coverage|tested|test case|test cases|tests for|spec for)\\b/;
|
|
294
|
+
var NS_EXPLICIT = [
|
|
295
|
+
{ pattern: /\\b(pattern|convention|best practice|style|coding rule)\\b/, ns: 'patterns', label: 'code patterns and conventions' },
|
|
296
|
+
{ pattern: /\\b(code.?map|file structure|project structure|directory)\\b/, ns: 'code-map', label: 'codebase navigation' },
|
|
297
|
+
];
|
|
298
|
+
var NS_PATTERN_RES = [/\\b(template|example|similar to|how do we|how should)\\b/];
|
|
299
|
+
var NS_DOMAIN_RES = [
|
|
300
|
+
/\\b(guidance|guide|docs|documentation|rules|how-to)\\b/,
|
|
301
|
+
/\\b(architecture|design|domain|tenant|migrat|schema|deploy)/,
|
|
302
|
+
/\\b(rule|requirement|constraint|compliance)\\b/,
|
|
303
|
+
];
|
|
304
|
+
var NS_NAV_RES = [
|
|
305
|
+
/\\b(find|where|which file|look up|locate|endpoint|route|url|path)\\b/,
|
|
306
|
+
/\\b(class|function|method|component|service|entity|module)\\b/,
|
|
307
|
+
];
|
|
308
|
+
|
|
309
|
+
// Detect whether the current prompt invoked /fl or /flo with a swarm/hive flag
|
|
310
|
+
// (#952). When set, check-before-agent BLOCKS the Agent spawn until the matching
|
|
311
|
+
// MCP init has been recorded — the user explicitly opted in to the protected
|
|
312
|
+
// coordination surface, so falling back to raw Agent dispatch silently regresses
|
|
313
|
+
// headline moflo product capability.
|
|
314
|
+
//
|
|
315
|
+
// SYNC: duplicated verbatim in bin/gate.cjs.
|
|
316
|
+
function detectFlMode(promptText) {
|
|
317
|
+
var p = promptText || '';
|
|
318
|
+
if (!/^\\s*\\/(?:fl|flo)\\b/i.test(p)) return null;
|
|
319
|
+
if (/(?:^|\\s)(?:-s|--swarm)\\b/.test(p)) return 'swarm';
|
|
320
|
+
if (/(?:^|\\s)(?:-h|--hive)\\b/.test(p)) return 'hive';
|
|
321
|
+
return null;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
function classifyNamespaceHint(promptText) {
|
|
325
|
+
var lower = (promptText || '').toLowerCase();
|
|
326
|
+
if (NS_TEST_RE.test(lower)) return 'Memory namespace hint: use "tests" for test inventory and coverage lookups.';
|
|
327
|
+
if (NS_LEARNINGS_RE.test(lower)) return 'Memory namespace hint: use "learnings" for user-directed decisions and distilled insights.';
|
|
328
|
+
for (var i = 0; i < NS_EXPLICIT.length; i++) {
|
|
329
|
+
if (NS_EXPLICIT[i].pattern.test(lower)) return 'Memory namespace hint: use "' + NS_EXPLICIT[i].ns + '" for ' + NS_EXPLICIT[i].label + '.';
|
|
330
|
+
}
|
|
331
|
+
for (var j = 0; j < NS_DOMAIN_RES.length; j++) {
|
|
332
|
+
if (NS_DOMAIN_RES[j].test(lower)) return 'Memory namespace hint: search "guidance" and "learnings" for domain rules and project decisions.';
|
|
333
|
+
}
|
|
334
|
+
for (var k = 0; k < NS_PATTERN_RES.length; k++) {
|
|
335
|
+
if (NS_PATTERN_RES[k].test(lower)) return 'Memory namespace hint: use "patterns" for code patterns and conventions.';
|
|
336
|
+
}
|
|
337
|
+
for (var m = 0; m < NS_NAV_RES.length; m++) {
|
|
338
|
+
if (NS_NAV_RES[m].test(lower)) return 'Memory namespace hint: use "code-map" for codebase navigation.';
|
|
339
|
+
}
|
|
340
|
+
return '';
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
function applyPromptStateReset(state, promptText) {
|
|
344
|
+
state.memorySearched = false;
|
|
345
|
+
state.memorySearchedBy = {};
|
|
346
|
+
var DIRECTIVE_MAX_LEN = 20;
|
|
347
|
+
var escaped = /^@@\\s*/.test(promptText || '');
|
|
348
|
+
state.memoryRequired = !escaped && (promptText || '').length >= 4 && (TASK_RE.test(promptText || '') || (promptText || '').length > DIRECTIVE_MAX_LEN);
|
|
349
|
+
state.lastNamespaceHint = classifyNamespaceHint(promptText);
|
|
350
|
+
// Per-actor emission tracking — fresh window each prompt so subagents that
|
|
351
|
+
// spawn their own agents still see the hint on their first check-before-agent.
|
|
352
|
+
state.lastNamespaceHintEmittedBy = {};
|
|
353
|
+
// #952 — derive flMode from the user prompt and reset the matching init
|
|
354
|
+
// flag. Each /fl invocation must call its protected MCP init.
|
|
355
|
+
state.flMode = detectFlMode(promptText);
|
|
356
|
+
state.swarmInitialized = false;
|
|
357
|
+
state.hiveInitialized = false;
|
|
358
|
+
}
|
|
281
359
|
var TEST_RUNNER_RE = /(?:^|[^a-z])(?:npm|yarn|pnpm|bun)\\s+(?:run\\s+)?(?:test|t)(?:[:\\s]|$)|\\b(?:npx|pnpx)\\s+(?:vitest|jest|mocha|ava|tap|jasmine|pytest)\\b|(?:^|;|&&|\\|\\|)\\s*(?:vitest|jest|pytest|mocha|jasmine|tap|ava)\\s|\\b(?:cargo|go|deno|dotnet|mvn)\\s+test\\b|\\bgradle\\w*\\s+test\\b/i;
|
|
282
360
|
var EDIT_RESET_SKIP_BOTH_RE = /\\.(md|markdown|txt|rst|adoc|lock|gitignore)$|(?:^|[\\\\\\/])(CHANGELOG(?:\\.md)?|\\.env\\.example|package-lock\\.json|pnpm-lock\\.yaml|yarn\\.lock|bun\\.lockb)$/i;
|
|
283
361
|
// Test files: invalidate testsRun but preserve simplifyRun (#908) — /simplify
|
|
@@ -290,6 +368,8 @@ switch (command) {
|
|
|
290
368
|
// Advisory only — agent spawning is never blocked.
|
|
291
369
|
// Memory-first enforcement happens at the scan/read gate layer.
|
|
292
370
|
// SubagentStart hook injects guidance directive into subagent context.
|
|
371
|
+
// #931 — TaskCreate REMINDER + namespace hint moved here from
|
|
372
|
+
// prompt-reminder so they emit only when Claude is about to spawn an Agent.
|
|
293
373
|
var s = readState();
|
|
294
374
|
if (config.task_create_first && !s.tasksCreated) {
|
|
295
375
|
process.stdout.write('REMINDER: Use TaskCreate before spawning agents. Task tool is blocked until then.\\n');
|
|
@@ -297,6 +377,63 @@ switch (command) {
|
|
|
297
377
|
if (config.memory_first && s.memoryRequired && !s.memorySearched) {
|
|
298
378
|
process.stdout.write('REMINDER: Search memory (mcp__moflo__memory_search) before spawning agents.\\n');
|
|
299
379
|
}
|
|
380
|
+
if (s.lastNamespaceHint) {
|
|
381
|
+
// Per-actor single-shot — each session_id emits the hint at most once
|
|
382
|
+
// per prompt. Subagents that spawn their own agents still see it on
|
|
383
|
+
// their first check-before-agent because their session_id is its own
|
|
384
|
+
// bucket. Falls back to a _legacy_ bucket when HOOK_SESSION_ID is
|
|
385
|
+
// missing (older Claude Code, direct CLI). The map clears on every
|
|
386
|
+
// new prompt via applyPromptStateReset.
|
|
387
|
+
var sid = process.env.HOOK_SESSION_ID || '';
|
|
388
|
+
var emittedBy = s.lastNamespaceHintEmittedBy || {};
|
|
389
|
+
var bucket = sid || '_legacy_';
|
|
390
|
+
if (!emittedBy[bucket]) {
|
|
391
|
+
process.stdout.write(s.lastNamespaceHint + '\\n');
|
|
392
|
+
emittedBy[bucket] = true;
|
|
393
|
+
s.lastNamespaceHintEmittedBy = emittedBy;
|
|
394
|
+
writeState(s);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
// #952 — when /fl was invoked with -s/-h, the protected MCP init must run
|
|
398
|
+
// BEFORE any Agent spawn. Hard block: the user explicitly opted in to
|
|
399
|
+
// moflo's coordination surface, so silently dispatching Agent calls
|
|
400
|
+
// without mcp__moflo__swarm_init / mcp__moflo__hive-mind_init is the
|
|
401
|
+
// failure mode this gate exists to prevent (CLAUDE.md "⛔ Protected
|
|
402
|
+
// functionality"). Other Agent uses remain advisory.
|
|
403
|
+
if (config.swarm_invocation_gate) {
|
|
404
|
+
if (s.flMode === 'swarm' && !s.swarmInitialized) {
|
|
405
|
+
process.stderr.write('BLOCKED: /fl was invoked with -s/--swarm but mcp__moflo__swarm_init has not been called.\\n');
|
|
406
|
+
process.stderr.write('Run mcp__moflo__swarm_init first, then mcp__moflo__agent_spawn for each role, then dispatch Agent.\\n');
|
|
407
|
+
process.stderr.write('See .claude/skills/fl/execution-modes.md "SWARM mode" and CLAUDE.md "⛔ Protected functionality".\\n');
|
|
408
|
+
process.stderr.write('Disable via moflo.yaml: gates: swarm_invocation_gate: false\\n');
|
|
409
|
+
process.exit(2);
|
|
410
|
+
}
|
|
411
|
+
if (s.flMode === 'hive' && !s.hiveInitialized) {
|
|
412
|
+
process.stderr.write('BLOCKED: /fl was invoked with -h/--hive but mcp__moflo__hive-mind_init has not been called.\\n');
|
|
413
|
+
process.stderr.write('Run mcp__moflo__hive-mind_init first, then dispatch Agent or hive-mind workers.\\n');
|
|
414
|
+
process.stderr.write('See .claude/skills/fl/execution-modes.md "HIVE-MIND mode" and CLAUDE.md "⛔ Protected functionality".\\n');
|
|
415
|
+
process.stderr.write('Disable via moflo.yaml: gates: swarm_invocation_gate: false\\n');
|
|
416
|
+
process.exit(2);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
break;
|
|
420
|
+
}
|
|
421
|
+
case 'record-swarm-init': {
|
|
422
|
+
// #952 — wired to mcp__moflo__swarm_init PostToolUse.
|
|
423
|
+
var s = readState();
|
|
424
|
+
if (!s.swarmInitialized) {
|
|
425
|
+
s.swarmInitialized = true;
|
|
426
|
+
writeState(s);
|
|
427
|
+
}
|
|
428
|
+
break;
|
|
429
|
+
}
|
|
430
|
+
case 'record-hive-init': {
|
|
431
|
+
// #952 — wired to mcp__moflo__hive-mind_init PostToolUse.
|
|
432
|
+
var s = readState();
|
|
433
|
+
if (!s.hiveInitialized) {
|
|
434
|
+
s.hiveInitialized = true;
|
|
435
|
+
writeState(s);
|
|
436
|
+
}
|
|
300
437
|
break;
|
|
301
438
|
}
|
|
302
439
|
case 'check-before-scan': {
|
|
@@ -363,7 +500,8 @@ switch (command) {
|
|
|
363
500
|
break;
|
|
364
501
|
}
|
|
365
502
|
case 'record-skill-run': {
|
|
366
|
-
|
|
503
|
+
var skName = (process.env.TOOL_INPUT_skill || '');
|
|
504
|
+
if (skName === 'simplify' || skName === 'flo-simplify') {
|
|
367
505
|
var s = readState();
|
|
368
506
|
if (!s.simplifyRun) {
|
|
369
507
|
s.simplifyRun = true;
|
|
@@ -397,7 +535,7 @@ switch (command) {
|
|
|
397
535
|
var s = readState();
|
|
398
536
|
var missing = [];
|
|
399
537
|
if (config.testing_gate && !s.testsRun) missing.push('tests have not run since the last code edit (run npm test, vitest, jest, pytest, or similar)');
|
|
400
|
-
if (config.simplify_gate && !s.simplifyRun) missing.push('/simplify has not run since the last code edit');
|
|
538
|
+
if (config.simplify_gate && !s.simplifyRun) missing.push('/flo-simplify has not run since the last code edit');
|
|
401
539
|
if (config.learnings_gate && !s.learningsStored) missing.push('learnings have not been stored (call mcp__moflo__memory_store)');
|
|
402
540
|
if (missing.length === 0) break;
|
|
403
541
|
process.stderr.write('BLOCKED: gh pr create requires the following before opening a PR:\\n');
|
|
@@ -422,18 +560,14 @@ switch (command) {
|
|
|
422
560
|
break;
|
|
423
561
|
}
|
|
424
562
|
case 'prompt-reminder': {
|
|
563
|
+
// Full per-prompt reset (first UserPromptSubmit hook via prompt-hook.mjs).
|
|
564
|
+
// Owns interactionCount + Context warnings. TaskCreate REMINDER and
|
|
565
|
+
// namespace hint moved to check-before-agent (#931).
|
|
425
566
|
var s = readState();
|
|
426
|
-
s.memorySearched = false;
|
|
427
|
-
// Wipe per-actor memory tracking too — a new user prompt is a fresh window
|
|
428
|
-
// for both parent AND any subagents the parent may spawn during this turn.
|
|
429
|
-
s.memorySearchedBy = {};
|
|
430
|
-
// learningsStored is session-scoped — once stored, it stays true until session reset.
|
|
431
|
-
// Resetting per-prompt caused false blocks when PR creation was on a later prompt.
|
|
432
567
|
var prompt = process.env.CLAUDE_USER_PROMPT || '';
|
|
433
|
-
s
|
|
568
|
+
applyPromptStateReset(s, prompt);
|
|
434
569
|
s.interactionCount = (s.interactionCount || 0) + 1;
|
|
435
570
|
writeState(s);
|
|
436
|
-
if (!s.tasksCreated) console.log('REMINDER: Use TaskCreate before spawning agents. Task tool is blocked until then.');
|
|
437
571
|
if (config.context_tracking) {
|
|
438
572
|
var ic = s.interactionCount;
|
|
439
573
|
if (ic > 30) console.log('Context: CRITICAL. Commit, store learnings, suggest new session.');
|
|
@@ -442,12 +576,27 @@ switch (command) {
|
|
|
442
576
|
}
|
|
443
577
|
break;
|
|
444
578
|
}
|
|
579
|
+
case 'prompt-state-reset': {
|
|
580
|
+
// Defensive safety-net (second UserPromptSubmit hook). Idempotent state
|
|
581
|
+
// reset only — no interactionCount increment, no emission. Ensures the
|
|
582
|
+
// per-prompt reset still happens if prompt-hook.mjs throws (#931). Skip
|
|
583
|
+
// the disk write when prompt-reminder already wrote the byte-identical
|
|
584
|
+
// post-reset state (the normal no-exception path).
|
|
585
|
+
var s = readState();
|
|
586
|
+
var prompt = process.env.CLAUDE_USER_PROMPT || '';
|
|
587
|
+
var before = JSON.stringify(s);
|
|
588
|
+
applyPromptStateReset(s, prompt);
|
|
589
|
+
if (JSON.stringify(s) !== before) writeState(s);
|
|
590
|
+
break;
|
|
591
|
+
}
|
|
445
592
|
case 'compact-guidance': {
|
|
446
593
|
console.log('Pre-Compact: Check CLAUDE.md for rules. Use memory search to recover context after compact.');
|
|
447
594
|
break;
|
|
448
595
|
}
|
|
449
596
|
case 'session-reset': {
|
|
450
|
-
|
|
597
|
+
// Derive from STATE_DEFAULTS so adding a new state field requires only one
|
|
598
|
+
// edit (the defaults object).
|
|
599
|
+
writeState(Object.assign({}, STATE_DEFAULTS, { sessionStart: new Date().toISOString() }));
|
|
451
600
|
break;
|
|
452
601
|
}
|
|
453
602
|
default:
|
|
@@ -560,45 +709,9 @@ try {
|
|
|
560
709
|
});
|
|
561
710
|
} catch (err) { output = (err && err.stdout) || ''; }
|
|
562
711
|
|
|
563
|
-
//
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
var LEARNINGS_HINTS = /\\b(remember|recall|insight|lesson learned|gotcha|post.?mortem)\\b|we (decid|agree|chose|said)/;
|
|
567
|
-
var TEST_HINTS = /\\b(test|spec|coverage|tested|test case|test cases|tests for|spec for)\\b/;
|
|
568
|
-
var EXPLICIT_NS = [
|
|
569
|
-
{ pattern: /\\b(pattern|convention|best practice|style|coding rule)\\b/, ns: 'patterns', label: 'code patterns and conventions' },
|
|
570
|
-
{ pattern: /\\b(code.?map|file structure|project structure|directory)\\b/, ns: 'code-map', label: 'codebase navigation' },
|
|
571
|
-
];
|
|
572
|
-
var PATTERN_HINTS = [/\\b(template|example|similar to|how do we|how should)\\b/];
|
|
573
|
-
var DOMAIN_HINTS = [
|
|
574
|
-
/\\b(guidance|guide|docs|documentation|rules|how-to)\\b/,
|
|
575
|
-
/\\b(architecture|design|domain|tenant|migrat|schema|deploy)/,
|
|
576
|
-
/\\b(rule|requirement|constraint|compliance)\\b/,
|
|
577
|
-
];
|
|
578
|
-
var NAV_PATTERNS = [
|
|
579
|
-
/\\b(find|where|which file|look up|locate|endpoint|route|url|path)\\b/,
|
|
580
|
-
/\\b(class|function|method|component|service|entity|module)\\b/,
|
|
581
|
-
];
|
|
582
|
-
|
|
583
|
-
var nsHint = '';
|
|
584
|
-
if (TEST_HINTS.test(lower)) {
|
|
585
|
-
nsHint = 'Memory namespace hint: use "tests" for test inventory and coverage lookups.';
|
|
586
|
-
} else if (LEARNINGS_HINTS.test(lower)) {
|
|
587
|
-
nsHint = 'Memory namespace hint: use "learnings" for user-directed decisions and distilled insights.';
|
|
588
|
-
} else {
|
|
589
|
-
var found = EXPLICIT_NS.find(function(e) { return e.pattern.test(lower); });
|
|
590
|
-
if (found) {
|
|
591
|
-
nsHint = 'Memory namespace hint: use "' + found.ns + '" for ' + found.label + '.';
|
|
592
|
-
} else if (DOMAIN_HINTS.some(function(p) { return p.test(lower); })) {
|
|
593
|
-
nsHint = 'Memory namespace hint: search "guidance" and "learnings" for domain rules and project decisions.';
|
|
594
|
-
} else if (PATTERN_HINTS.some(function(p) { return p.test(lower); })) {
|
|
595
|
-
nsHint = 'Memory namespace hint: use "patterns" for code patterns and conventions.';
|
|
596
|
-
} else if (NAV_PATTERNS.some(function(p) { return p.test(lower); })) {
|
|
597
|
-
nsHint = 'Memory namespace hint: use "code-map" for codebase navigation.';
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
var parts = [output.trim(), nsHint].filter(Boolean);
|
|
712
|
+
// #931 — Namespace hint classification moved into gate.cjs (computed by
|
|
713
|
+
// prompt-reminder, stored on workflow-state, emitted once by check-before-agent).
|
|
714
|
+
var parts = [output.trim()].filter(Boolean);
|
|
602
715
|
if (parts.length) process.stdout.write(parts.join('\\n') + '\\n');
|
|
603
716
|
process.exit(0);
|
|
604
717
|
`;
|