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.
Files changed (240) hide show
  1. package/.claude/agents/analysis/analyze-code-quality.md +0 -121
  2. package/.claude/agents/analysis/code-analyzer.md +5 -26
  3. package/.claude/agents/architecture/system-design/arch-system-design.md +0 -119
  4. package/.claude/agents/base-template-generator.md +0 -1
  5. package/.claude/agents/core/coder.md +0 -22
  6. package/.claude/agents/core/planner.md +0 -16
  7. package/.claude/agents/core/researcher.md +0 -16
  8. package/.claude/agents/core/reviewer.md +0 -17
  9. package/.claude/agents/core/tester.md +0 -19
  10. package/.claude/agents/custom/test-long-runner.md +0 -2
  11. package/.claude/agents/development/dev-backend-api.md +0 -167
  12. package/.claude/agents/development/dev-database.md +43 -0
  13. package/.claude/agents/development/dev-frontend.md +42 -0
  14. package/.claude/agents/devops/ci-cd/ops-cicd-github.md +0 -112
  15. package/.claude/agents/documentation/api-docs/docs-api-openapi.md +0 -111
  16. package/.claude/agents/security/security-auditor.md +45 -0
  17. package/.claude/guidance/shipped/moflo-agent-rules.md +172 -0
  18. package/.claude/guidance/shipped/moflo-claude-swarm-cohesion.md +73 -265
  19. package/.claude/guidance/shipped/moflo-cli-reference.md +6 -6
  20. package/.claude/guidance/shipped/moflo-core-guidance.md +66 -184
  21. package/.claude/guidance/shipped/moflo-cross-platform.md +1 -1
  22. package/.claude/guidance/shipped/moflo-error-handling.md +3 -3
  23. package/.claude/guidance/shipped/moflo-guidance-rules.md +17 -7
  24. package/.claude/guidance/shipped/moflo-memory-strategy.md +76 -182
  25. package/.claude/guidance/shipped/moflo-memorydb-maintenance.md +6 -8
  26. package/.claude/guidance/shipped/moflo-settings-injection.md +7 -9
  27. package/.claude/guidance/shipped/moflo-source-hygiene.md +5 -5
  28. package/.claude/guidance/shipped/moflo-spell-connectors.md +3 -4
  29. package/.claude/guidance/shipped/moflo-spell-custom-steps.md +3 -4
  30. package/.claude/guidance/shipped/moflo-spell-engine.md +40 -162
  31. package/.claude/guidance/shipped/moflo-spell-runner.md +134 -0
  32. package/.claude/guidance/shipped/moflo-spell-sandboxing.md +10 -57
  33. package/.claude/guidance/shipped/moflo-spell-troubleshooting.md +149 -0
  34. package/.claude/guidance/shipped/moflo-subagents.md +43 -114
  35. package/.claude/guidance/shipped/moflo-task-icons.md +4 -4
  36. package/.claude/guidance/shipped/moflo-user-facing-language.md +3 -3
  37. package/.claude/guidance/shipped/moflo-verbose-command-filtering.md +3 -3
  38. package/.claude/guidance/shipped/moflo-yaml-reference.md +4 -5
  39. package/.claude/helpers/gate.cjs +192 -15
  40. package/.claude/helpers/prompt-hook.mjs +4 -38
  41. package/.claude/helpers/simplify-classify.cjs +32 -11
  42. package/.claude/helpers/subagent-bootstrap.json +1 -1
  43. package/.claude/helpers/subagent-start.cjs +1 -1
  44. package/.claude/skills/connector-builder/SKILL.md +42 -429
  45. package/.claude/skills/connector-builder/templates/connector.md +189 -0
  46. package/.claude/skills/connector-builder/templates/step-command.md +176 -0
  47. package/.claude/skills/eldar/SKILL.md +7 -7
  48. package/.claude/skills/fl/SKILL.md +3 -3
  49. package/.claude/skills/fl/execution-modes.md +39 -16
  50. package/.claude/skills/fl/phases.md +3 -3
  51. package/.claude/skills/{simplify → flo-simplify}/SKILL.md +11 -11
  52. package/.claude/skills/guidance/SKILL.md +17 -9
  53. package/.claude/skills/memory-patterns/SKILL.md +1 -1
  54. package/.claude/skills/publish/SKILL.md +121 -36
  55. package/.claude/skills/reset-epic/SKILL.md +2 -2
  56. package/.claude/skills/spell-builder/SKILL.md +39 -226
  57. package/.claude/skills/spell-builder/architecture.md +1 -1
  58. package/.claude/skills/spell-builder/permissions.md +107 -0
  59. package/.claude/skills/spell-builder/preflight.md +101 -0
  60. package/.claude/skills/spell-schedule/SKILL.md +2 -3
  61. package/bin/gate.cjs +192 -15
  62. package/bin/lib/retired-files.mjs +146 -0
  63. package/bin/prompt-hook.mjs +4 -38
  64. package/bin/session-start-launcher.mjs +120 -1
  65. package/bin/setup-project.mjs +63 -69
  66. package/bin/simplify-classify.cjs +32 -11
  67. package/dist/src/cli/appliance/rvfa-builder.js +1 -1
  68. package/dist/src/cli/commands/agent.js +3 -9
  69. package/dist/src/cli/commands/doctor-checks-deep.js +4 -0
  70. package/dist/src/cli/commands/hooks.js +1 -3
  71. package/dist/src/cli/commands/index.js +2 -0
  72. package/dist/src/cli/commands/retire.js +111 -0
  73. package/dist/src/cli/hooks/reasoningbank/index.js +7 -7
  74. package/dist/src/cli/init/claudemd-generator.js +30 -33
  75. package/dist/src/cli/init/executor.js +53 -69
  76. package/dist/src/cli/init/helpers-generator.js +165 -52
  77. package/dist/src/cli/init/moflo-init.js +41 -114
  78. package/dist/src/cli/init/settings-generator.js +44 -14
  79. package/dist/src/cli/mcp-tools/agent-tools.js +9 -27
  80. package/dist/src/cli/mcp-tools/hooks-tools.js +23 -21
  81. package/dist/src/cli/memory/controllers/semantic-router.js +18 -12
  82. package/dist/src/cli/memory/sona-optimizer.js +6 -6
  83. package/dist/src/cli/neural/domain/services/learning-service.js +3 -3
  84. package/dist/src/cli/services/agent-router.js +2 -5
  85. package/dist/src/cli/services/hook-block-hash.js +11 -2
  86. package/dist/src/cli/services/hook-wiring.js +86 -3
  87. package/dist/src/cli/services/subagent-bootstrap.js +1 -1
  88. package/dist/src/cli/shared/events/example-usage.js +6 -6
  89. package/dist/src/cli/shared/hooks/task-hooks.js +8 -8
  90. package/dist/src/cli/version.js +1 -1
  91. package/package.json +3 -2
  92. package/retired-files.json +1989 -0
  93. package/scripts/post-install-bootstrap.mjs +19 -0
  94. package/src/cli/data/model-registry.json +2 -2
  95. package/.claude/agents/consensus/byzantine-coordinator.md +0 -63
  96. package/.claude/agents/consensus/crdt-synchronizer.md +0 -997
  97. package/.claude/agents/consensus/gossip-coordinator.md +0 -63
  98. package/.claude/agents/consensus/performance-benchmarker.md +0 -851
  99. package/.claude/agents/consensus/quorum-manager.md +0 -823
  100. package/.claude/agents/consensus/raft-manager.md +0 -63
  101. package/.claude/agents/consensus/security-manager.md +0 -622
  102. package/.claude/agents/data/ml/data-ml-model.md +0 -193
  103. package/.claude/agents/github/code-review-swarm.md +0 -538
  104. package/.claude/agents/github/github-modes.md +0 -172
  105. package/.claude/agents/github/issue-tracker.md +0 -311
  106. package/.claude/agents/github/multi-repo-swarm.md +0 -551
  107. package/.claude/agents/github/pr-manager.md +0 -183
  108. package/.claude/agents/github/project-board-sync.md +0 -508
  109. package/.claude/agents/github/release-manager.md +0 -360
  110. package/.claude/agents/github/release-swarm.md +0 -580
  111. package/.claude/agents/github/repo-architect.md +0 -391
  112. package/.claude/agents/github/swarm-issue.md +0 -566
  113. package/.claude/agents/github/swarm-pr.md +0 -414
  114. package/.claude/agents/github/sync-coordinator.md +0 -426
  115. package/.claude/agents/github/workflow-automation.md +0 -606
  116. package/.claude/agents/goal/code-goal-planner.md +0 -440
  117. package/.claude/agents/goal/goal-planner.md +0 -168
  118. package/.claude/agents/hive-mind/collective-intelligence-coordinator.md +0 -127
  119. package/.claude/agents/hive-mind/queen-coordinator.md +0 -198
  120. package/.claude/agents/hive-mind/scout-explorer.md +0 -233
  121. package/.claude/agents/hive-mind/swarm-memory-manager.md +0 -184
  122. package/.claude/agents/hive-mind/worker-specialist.md +0 -208
  123. package/.claude/agents/neural/safla-neural.md +0 -73
  124. package/.claude/agents/optimization/benchmark-suite.md +0 -665
  125. package/.claude/agents/optimization/load-balancer.md +0 -431
  126. package/.claude/agents/optimization/performance-monitor.md +0 -672
  127. package/.claude/agents/optimization/resource-allocator.md +0 -674
  128. package/.claude/agents/optimization/topology-optimizer.md +0 -808
  129. package/.claude/agents/reasoning/goal-planner.md +0 -67
  130. package/.claude/agents/sona/sona-learning-optimizer.md +0 -74
  131. package/.claude/agents/sparc/architecture.md +0 -472
  132. package/.claude/agents/sparc/pseudocode.md +0 -318
  133. package/.claude/agents/sparc/refinement.md +0 -525
  134. package/.claude/agents/sparc/specification.md +0 -276
  135. package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +0 -225
  136. package/.claude/agents/swarm/adaptive-coordinator.md +0 -391
  137. package/.claude/agents/swarm/hierarchical-coordinator.md +0 -321
  138. package/.claude/agents/swarm/mesh-coordinator.md +0 -383
  139. package/.claude/agents/testing/production-validator.md +0 -395
  140. package/.claude/agents/testing/tdd-london-swarm.md +0 -244
  141. package/.claude/agents/v3/adr-architect.md +0 -184
  142. package/.claude/agents/v3/aidefence-guardian.md +0 -277
  143. package/.claude/agents/v3/claims-authorizer.md +0 -208
  144. package/.claude/agents/v3/collective-intelligence-coordinator.md +0 -988
  145. package/.claude/agents/v3/ddd-domain-expert.md +0 -220
  146. package/.claude/agents/v3/injection-analyst.md +0 -232
  147. package/.claude/agents/v3/memory-specialist.md +0 -987
  148. package/.claude/agents/v3/performance-engineer.md +0 -1225
  149. package/.claude/agents/v3/pii-detector.md +0 -146
  150. package/.claude/agents/v3/reasoningbank-learner.md +0 -213
  151. package/.claude/agents/v3/security-architect-aidefence.md +0 -405
  152. package/.claude/agents/v3/security-architect.md +0 -865
  153. package/.claude/agents/v3/security-auditor.md +0 -771
  154. package/.claude/agents/v3/sparc-orchestrator.md +0 -182
  155. package/.claude/agents/v3/swarm-memory-manager.md +0 -142
  156. package/.claude/agents/v3/v3-integration-architect.md +0 -205
  157. package/.claude/commands/claude-flow-help.md +0 -103
  158. package/.claude/commands/claude-flow-memory.md +0 -107
  159. package/.claude/commands/claude-flow-swarm.md +0 -205
  160. package/.claude/commands/github/README.md +0 -11
  161. package/.claude/commands/github/code-review-swarm.md +0 -514
  162. package/.claude/commands/github/code-review.md +0 -25
  163. package/.claude/commands/github/github-modes.md +0 -146
  164. package/.claude/commands/github/github-swarm.md +0 -113
  165. package/.claude/commands/github/issue-tracker.md +0 -284
  166. package/.claude/commands/github/issue-triage.md +0 -25
  167. package/.claude/commands/github/multi-repo-swarm.md +0 -519
  168. package/.claude/commands/github/pr-enhance.md +0 -26
  169. package/.claude/commands/github/pr-manager.md +0 -164
  170. package/.claude/commands/github/project-board-sync.md +0 -471
  171. package/.claude/commands/github/release-manager.md +0 -332
  172. package/.claude/commands/github/release-swarm.md +0 -544
  173. package/.claude/commands/github/repo-analyze.md +0 -25
  174. package/.claude/commands/github/repo-architect.md +0 -361
  175. package/.claude/commands/github/swarm-issue.md +0 -482
  176. package/.claude/commands/github/swarm-pr.md +0 -285
  177. package/.claude/commands/github/sync-coordinator.md +0 -294
  178. package/.claude/commands/github/workflow-automation.md +0 -442
  179. package/.claude/commands/hooks/README.md +0 -11
  180. package/.claude/commands/hooks/overview.md +0 -58
  181. package/.claude/commands/hooks/post-edit.md +0 -117
  182. package/.claude/commands/hooks/post-task.md +0 -112
  183. package/.claude/commands/hooks/pre-edit.md +0 -113
  184. package/.claude/commands/hooks/pre-task.md +0 -111
  185. package/.claude/commands/hooks/session-end.md +0 -118
  186. package/.claude/commands/hooks/setup.md +0 -103
  187. package/.claude/commands/simplify.md +0 -101
  188. package/.claude/commands/sparc/analyzer.md +0 -42
  189. package/.claude/commands/sparc/architect.md +0 -43
  190. package/.claude/commands/sparc/ask.md +0 -86
  191. package/.claude/commands/sparc/batch-executor.md +0 -44
  192. package/.claude/commands/sparc/code.md +0 -78
  193. package/.claude/commands/sparc/coder.md +0 -44
  194. package/.claude/commands/sparc/debug.md +0 -72
  195. package/.claude/commands/sparc/debugger.md +0 -44
  196. package/.claude/commands/sparc/designer.md +0 -43
  197. package/.claude/commands/sparc/devops.md +0 -98
  198. package/.claude/commands/sparc/docs-writer.md +0 -69
  199. package/.claude/commands/sparc/documenter.md +0 -44
  200. package/.claude/commands/sparc/innovator.md +0 -44
  201. package/.claude/commands/sparc/integration.md +0 -72
  202. package/.claude/commands/sparc/mcp.md +0 -106
  203. package/.claude/commands/sparc/memory-manager.md +0 -44
  204. package/.claude/commands/sparc/optimizer.md +0 -44
  205. package/.claude/commands/sparc/orchestrator.md +0 -116
  206. package/.claude/commands/sparc/post-deployment-monitoring-mode.md +0 -72
  207. package/.claude/commands/sparc/refinement-optimization-mode.md +0 -72
  208. package/.claude/commands/sparc/researcher.md +0 -44
  209. package/.claude/commands/sparc/reviewer.md +0 -44
  210. package/.claude/commands/sparc/security-review.md +0 -69
  211. package/.claude/commands/sparc/sparc-modes.md +0 -139
  212. package/.claude/commands/sparc/sparc.md +0 -99
  213. package/.claude/commands/sparc/spec-pseudocode.md +0 -69
  214. package/.claude/commands/sparc/spell-manager.md +0 -44
  215. package/.claude/commands/sparc/supabase-admin.md +0 -337
  216. package/.claude/commands/sparc/swarm-coordinator.md +0 -44
  217. package/.claude/commands/sparc/tdd.md +0 -44
  218. package/.claude/commands/sparc/tester.md +0 -44
  219. package/.claude/commands/sparc/tutorial.md +0 -68
  220. package/.claude/commands/sparc.md +0 -151
  221. package/.claude/guidance/shipped/moflo-session-start.md +0 -154
  222. package/.claude/guidance/shipped/moflo-spell-engine-architecture.md +0 -145
  223. package/.claude/skills/browser/SKILL.md +0 -204
  224. package/.claude/skills/github-code-review/SKILL.md +0 -1140
  225. package/.claude/skills/github-multi-repo/SKILL.md +0 -866
  226. package/.claude/skills/github-project-management/SKILL.md +0 -1272
  227. package/.claude/skills/github-release-management/SKILL.md +0 -1074
  228. package/.claude/skills/github-workflow-automation/SKILL.md +0 -1060
  229. package/.claude/skills/hive-mind-advanced/SKILL.md +0 -712
  230. package/.claude/skills/hooks-automation/SKILL.md +0 -1193
  231. package/.claude/skills/pair-programming/SKILL.md +0 -1202
  232. package/.claude/skills/performance-analysis/SKILL.md +0 -563
  233. package/.claude/skills/skill-builder/SKILL.md +0 -910
  234. package/.claude/skills/sparc-methodology/SKILL.md +0 -904
  235. package/.claude/skills/stream-chain/SKILL.md +0 -563
  236. package/.claude/skills/swarm-advanced/SKILL.md +0 -811
  237. package/.claude/skills/swarm-orchestration/SKILL.md +0 -179
  238. package/.claude/skills/verification-quality/SKILL.md +0 -649
  239. package/.claude/skills/worker-benchmarks/skill.md +0 -135
  240. 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
- 'swarm-orchestration',
29
- 'swarm-advanced',
30
- 'sparc-methodology',
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
- browser: ['browser'],
39
- github: [
40
- 'github-code-review',
41
- 'github-multi-repo',
42
- 'github-project-management',
43
- 'github-release-management',
44
- 'github-workflow-automation',
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
- const COMMANDS_MAP = {
51
- core: ['claude-flow-help.md', 'claude-flow-swarm.md', 'claude-flow-memory.md', 'simplify.md'],
52
- analysis: [],
53
- automation: [],
54
- github: ['github'],
55
- hooks: ['hooks'],
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
- specialized: ['specialized'],
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
- ### V3 Specialized (4)
1513
- \`security-architect\`, \`security-auditor\`, \`memory-specialist\`, \`performance-engineer\`
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 (8)
1531
- \`backend-dev\`, \`mobile-dev\`, \`ml-developer\`, \`cicd-engineer\`, \`api-docs\`, \`system-architect\`, \`code-analyzer\`, \`base-template-generator\`
1514
+ ### Specialized Development (5)
1515
+ \`backend-dev\`, \`frontend-dev\`, \`database-dev\`, \`cicd-engineer\`, \`api-docs\`
1532
1516
 
1533
- ### Testing & Validation (2)
1534
- \`tdd-london-swarm\`, \`production-validator\`
1517
+ ### Security (1)
1518
+ \`security-auditor\`
1535
1519
 
1536
1520
  ### Agent Routing by Task
1537
- | Task Type | Recommended Agents | Topology |
1538
- |-----------|-------------------|----------|
1539
- | Bug Fix | researcher, coder, tester | mesh |
1540
- | New Feature | coordinator, architect, coder, tester, reviewer | hierarchical |
1541
- | Refactoring | architect, coder, reviewer | mesh |
1542
- | Performance | researcher, perf-engineer, coder | hierarchical |
1543
- | Security | security-architect, auditor, reviewer | hierarchical |
1544
- | Docs | researcher, api-docs | mesh |
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
- if ((process.env.TOOL_INPUT_skill || '') === 'simplify') {
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.memoryRequired = prompt.length >= 4 && !DIRECTIVE_RE.test(prompt) && (TASK_RE.test(prompt) || prompt.length > 80);
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
- writeState({ tasksCreated: false, taskCount: 0, memorySearched: false, memorySearchedBy: {}, memoryRequired: true, learningsStored: false, testsRun: false, simplifyRun: false, interactionCount: 0, sessionStart: new Date().toISOString(), lastBlockedAt: null });
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
- // Classify prompt for namespace hint
564
- var lower = userPrompt.toLowerCase();
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
  `;