claude-flow-novice 1.3.0 → 1.3.2

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 (305) hide show
  1. package/.claude-flow-novice/preferences/generation.json +147 -0
  2. package/.claude-flow-novice/preferences/language-configs/javascript.json +51 -0
  3. package/.claude-flow-novice/preferences/language-configs/python.json +50 -0
  4. package/.claude-flow-novice/preferences/language-configs/rust.json +237 -0
  5. package/.claude-flow-novice/preferences/language-configs/typescript.json +54 -0
  6. package/.claude-flow-novice/preferences/project-local.json +91 -0
  7. package/.claude-flow-novice/preferences/resource-delegation.json +120 -0
  8. package/.claude-flow-novice/preferences/team-shared.json +195 -0
  9. package/.claude-flow-novice/preferences/user-global.json +247 -0
  10. package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-JAVASCRIPT.md +769 -0
  11. package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-PYTHON.md +1214 -0
  12. package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-RUST.md +475 -0
  13. package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-TYPESCRIPT.md +851 -0
  14. package/.claude-flow-novice/templates/claude-md-templates/README.md +263 -0
  15. package/CLAUDE.md +81 -0
  16. package/README-NPM.md +0 -0
  17. package/package.json +11 -7
  18. package/scripts/build/README.md +167 -0
  19. package/scripts/build/build-config.js +27 -0
  20. package/scripts/build/build-prompt-copier.sh +30 -0
  21. package/scripts/build/performance-monitor.js +869 -0
  22. package/scripts/build/prepare-publish.js +150 -0
  23. package/scripts/build/typescript-fixer.js +621 -0
  24. package/scripts/build/unified-builder.sh +428 -0
  25. package/scripts/build/update-bin-version.js +32 -0
  26. package/scripts/dev/README.md +264 -0
  27. package/scripts/dev/claude-flow-wrapper.sh +35 -0
  28. package/scripts/dev/claude-monitor.py +419 -0
  29. package/scripts/dev/claude-sparc.sh +562 -0
  30. package/scripts/dev/claude-wrapper.sh +17 -0
  31. package/scripts/dev/demo-phase3-compliance.js +172 -0
  32. package/scripts/dev/demo-task-system.ts +224 -0
  33. package/scripts/dev/deployment-validator.js +315 -0
  34. package/scripts/dev/spawn-claude-terminal.sh +32 -0
  35. package/scripts/dev/start-portal.sh +506 -0
  36. package/scripts/dev/start-web-ui.js +15 -0
  37. package/scripts/dev/stop-portal.sh +311 -0
  38. package/scripts/dev/validate-examples.ts +288 -0
  39. package/scripts/dev/validate-phase2.cjs +451 -0
  40. package/scripts/dev/validate-phase2.js +785 -0
  41. package/scripts/dev/validate-phase3.cjs +208 -0
  42. package/scripts/dev/validate-security-remediation.js +1 -0
  43. package/scripts/legacy/README.md +272 -0
  44. package/scripts/legacy/batch-fix-ts.sh +54 -0
  45. package/scripts/legacy/build-migration.sh +105 -0
  46. package/scripts/legacy/build-monitor.js +209 -0
  47. package/scripts/legacy/build-with-filter.sh +84 -0
  48. package/scripts/legacy/build-workaround.sh +71 -0
  49. package/scripts/legacy/fix-ts-advanced.js +358 -0
  50. package/scripts/legacy/fix-ts-final.sh +50 -0
  51. package/scripts/legacy/fix-ts-targeted.sh +49 -0
  52. package/scripts/legacy/fix-typescript-errors.js +305 -0
  53. package/scripts/legacy/force-build.sh +63 -0
  54. package/scripts/legacy/optimize-performance.js +400 -0
  55. package/scripts/legacy/performance-monitor.js +263 -0
  56. package/scripts/legacy/performance-monitoring.js +532 -0
  57. package/scripts/legacy/performance-test-runner.js +645 -0
  58. package/scripts/legacy/quick-fix-ts.js +281 -0
  59. package/scripts/legacy/safe-build.sh +63 -0
  60. package/scripts/migration/README.md +434 -0
  61. package/scripts/migration/install-arm64.js +78 -0
  62. package/scripts/migration/install.js +83 -0
  63. package/scripts/migration/migrate-hooks.js +173 -0
  64. package/scripts/migration/migration-examples.ts +318 -0
  65. package/scripts/optimization/build-optimizer.js +438 -0
  66. package/scripts/optimization/config-validator.js +761 -0
  67. package/scripts/optimization/test-optimization.js +432 -0
  68. package/scripts/optimization/unified-activation.js +839 -0
  69. package/scripts/performance/ACTIVATION_COMMANDS.md +292 -0
  70. package/scripts/performance/sqlite-enhanced-activation.sh +583 -0
  71. package/scripts/performance/test-enhanced-backend.sh +504 -0
  72. package/scripts/performance-test-runner.js +698 -0
  73. package/scripts/security/README.md +339 -0
  74. package/scripts/security/install-git-hooks.sh +132 -0
  75. package/scripts/security/ruv-swarm-safe.js +74 -0
  76. package/scripts/test/README.md +236 -0
  77. package/scripts/test/check-links.ts +274 -0
  78. package/scripts/test/check-performance-regression.ts +168 -0
  79. package/scripts/test/coverage-report.ts +692 -0
  80. package/scripts/test/generate-swarm-tests.js +633 -0
  81. package/scripts/test/integration-test-validation.cjs +253 -0
  82. package/scripts/test/load-test-swarm.js +576 -0
  83. package/scripts/test/run-phase3-compliance-tests.js +427 -0
  84. package/scripts/test/test-batch-tasks.ts +29 -0
  85. package/scripts/test/test-byzantine-resolution.js +246 -0
  86. package/scripts/test/test-claude-spawn-options.sh +63 -0
  87. package/scripts/test/test-cli-wizard.js +331 -0
  88. package/scripts/test/test-comprehensive.js +401 -0
  89. package/scripts/test/test-coordination-features.ts +238 -0
  90. package/scripts/test/test-fallback-systems.js +276 -0
  91. package/scripts/test/test-init-command.ts +302 -0
  92. package/scripts/test/test-mcp.ts +251 -0
  93. package/scripts/test/test-runner.ts +568 -0
  94. package/scripts/test/test-swarm-integration.sh +92 -0
  95. package/scripts/test/test-swarm.ts +142 -0
  96. package/scripts/test/validation-summary.ts +408 -0
  97. package/scripts/utils/README.md +261 -0
  98. package/scripts/utils/clean-build-artifacts.sh +94 -0
  99. package/scripts/utils/cleanup-root.sh +69 -0
  100. package/scripts/utils/fix-cliffy-imports.js +307 -0
  101. package/scripts/utils/fix-duplicate-imports.js +114 -0
  102. package/scripts/utils/fix-error-handling.cjs +70 -0
  103. package/scripts/utils/fix-import-paths.js +104 -0
  104. package/scripts/utils/fix-imports.js +116 -0
  105. package/scripts/utils/fix-shebang.js +78 -0
  106. package/scripts/utils/fix-test-modules.js +27 -0
  107. package/scripts/utils/fix-timezone-issue-246.js +200 -0
  108. package/scripts/utils/fix-ts-comprehensive.py +182 -0
  109. package/scripts/utils/fix-ts-targeted-batch.js +250 -0
  110. package/scripts/utils/remove-benchmark-conflicts.sh +140 -0
  111. package/scripts/utils/simple-test-fixer.js +190 -0
  112. package/scripts/utils/validate-metrics-structure.cjs +144 -0
  113. package/scripts/verify-mcp-server.js +86 -0
  114. package/src/cli/simple-commands/__tests__/agent.test.js +291 -0
  115. package/src/cli/simple-commands/__tests__/memory.test.js +8 -0
  116. package/src/cli/simple-commands/__tests__/swarm.test.js +371 -0
  117. package/src/cli/simple-commands/__tests__/task.test.js +8 -0
  118. package/src/cli/simple-commands/agent.js +216 -0
  119. package/src/cli/simple-commands/analysis.js +570 -0
  120. package/src/cli/simple-commands/automation-executor.js +1603 -0
  121. package/src/cli/simple-commands/automation.js +627 -0
  122. package/src/cli/simple-commands/batch-manager.js +338 -0
  123. package/src/cli/simple-commands/claude-telemetry.js +311 -0
  124. package/src/cli/simple-commands/claude-track.js +102 -0
  125. package/src/cli/simple-commands/concurrent-display.js +348 -0
  126. package/src/cli/simple-commands/config.js +319 -0
  127. package/src/cli/simple-commands/coordination.js +307 -0
  128. package/src/cli/simple-commands/enhanced-ui-views.js +654 -0
  129. package/src/cli/simple-commands/enhanced-webui-complete.js +1038 -0
  130. package/src/cli/simple-commands/fix-hook-variables.js +363 -0
  131. package/src/cli/simple-commands/github/gh-coordinator.js +605 -0
  132. package/src/cli/simple-commands/github/github-api.js +624 -0
  133. package/src/cli/simple-commands/github/init.js +543 -0
  134. package/src/cli/simple-commands/github.js +377 -0
  135. package/src/cli/simple-commands/goal.js +145 -0
  136. package/src/cli/simple-commands/hive-mind/auto-save-middleware.js +311 -0
  137. package/src/cli/simple-commands/hive-mind/communication.js +740 -0
  138. package/src/cli/simple-commands/hive-mind/core.js +1031 -0
  139. package/src/cli/simple-commands/hive-mind/db-optimizer.js +872 -0
  140. package/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1364 -0
  141. package/src/cli/simple-commands/hive-mind/memory.js +1292 -0
  142. package/src/cli/simple-commands/hive-mind/performance-optimizer.js +618 -0
  143. package/src/cli/simple-commands/hive-mind/performance-test.js +373 -0
  144. package/src/cli/simple-commands/hive-mind/queen.js +809 -0
  145. package/src/cli/simple-commands/hive-mind/session-manager.js +1223 -0
  146. package/src/cli/simple-commands/hive-mind-optimize.js +361 -0
  147. package/src/cli/simple-commands/hive-mind-wizard.js +281 -0
  148. package/src/cli/simple-commands/hive-mind.js +3112 -0
  149. package/src/cli/simple-commands/hive.js +140 -0
  150. package/src/cli/simple-commands/hook-safety.js +671 -0
  151. package/src/cli/simple-commands/hooks.js +1268 -0
  152. package/src/cli/simple-commands/init/.claude/checkpoints/1756224542.json +7 -0
  153. package/src/cli/simple-commands/init/.claude/checkpoints/1756224544.json +8 -0
  154. package/src/cli/simple-commands/init/README.md +106 -0
  155. package/src/cli/simple-commands/init/VALIDATION_ROLLBACK.md +488 -0
  156. package/src/cli/simple-commands/init/agent-copier.js +347 -0
  157. package/src/cli/simple-commands/init/batch-init.js +663 -0
  158. package/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +438 -0
  159. package/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +876 -0
  160. package/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +356 -0
  161. package/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +501 -0
  162. package/src/cli/simple-commands/init/claude-commands/slash-commands.js +57 -0
  163. package/src/cli/simple-commands/init/claude-commands/sparc-commands.js +296 -0
  164. package/src/cli/simple-commands/init/copy-revised-templates.js +175 -0
  165. package/src/cli/simple-commands/init/executable-wrapper.js +122 -0
  166. package/src/cli/simple-commands/init/gitignore-updater.js +137 -0
  167. package/src/cli/simple-commands/init/help.js +110 -0
  168. package/src/cli/simple-commands/init/hive-mind-init.js +749 -0
  169. package/src/cli/simple-commands/init/index.js +1953 -0
  170. package/src/cli/simple-commands/init/performance-monitor.js +344 -0
  171. package/src/cli/simple-commands/init/rollback/backup-manager.js +542 -0
  172. package/src/cli/simple-commands/init/rollback/index.js +399 -0
  173. package/src/cli/simple-commands/init/rollback/recovery-manager.js +778 -0
  174. package/src/cli/simple-commands/init/rollback/rollback-executor.js +521 -0
  175. package/src/cli/simple-commands/init/rollback/state-tracker.js +486 -0
  176. package/src/cli/simple-commands/init/sparc/roo-readme.js +61 -0
  177. package/src/cli/simple-commands/init/sparc/roomodes-config.js +102 -0
  178. package/src/cli/simple-commands/init/sparc/workflows.js +40 -0
  179. package/src/cli/simple-commands/init/sparc-structure.js +68 -0
  180. package/src/cli/simple-commands/init/template-copier.js +640 -0
  181. package/src/cli/simple-commands/init/templates/CLAUDE.md +1185 -0
  182. package/src/cli/simple-commands/init/templates/CLAUDE.md.optimized +265 -0
  183. package/src/cli/simple-commands/init/templates/claude-flow-universal +81 -0
  184. package/src/cli/simple-commands/init/templates/claude-flow.bat +18 -0
  185. package/src/cli/simple-commands/init/templates/claude-flow.ps1 +24 -0
  186. package/src/cli/simple-commands/init/templates/claude-md.js +1101 -0
  187. package/src/cli/simple-commands/init/templates/commands/analysis/bottleneck-detect.md +162 -0
  188. package/src/cli/simple-commands/init/templates/commands/automation/auto-agent.md +122 -0
  189. package/src/cli/simple-commands/init/templates/commands/coordination/swarm-init.md +85 -0
  190. package/src/cli/simple-commands/init/templates/commands/github/github-swarm.md +121 -0
  191. package/src/cli/simple-commands/init/templates/commands/helpers/standard-checkpoint-hooks.sh +179 -0
  192. package/src/cli/simple-commands/init/templates/commands/hooks/notification.md +113 -0
  193. package/src/cli/simple-commands/init/templates/commands/hooks/post-command.md +116 -0
  194. package/src/cli/simple-commands/init/templates/commands/hooks/post-edit.md +117 -0
  195. package/src/cli/simple-commands/init/templates/commands/hooks/post-task.md +112 -0
  196. package/src/cli/simple-commands/init/templates/commands/hooks/pre-command.md +113 -0
  197. package/src/cli/simple-commands/init/templates/commands/hooks/pre-edit.md +113 -0
  198. package/src/cli/simple-commands/init/templates/commands/hooks/pre-search.md +112 -0
  199. package/src/cli/simple-commands/init/templates/commands/hooks/pre-task.md +111 -0
  200. package/src/cli/simple-commands/init/templates/commands/hooks/session-end.md +118 -0
  201. package/src/cli/simple-commands/init/templates/commands/hooks/session-restore.md +118 -0
  202. package/src/cli/simple-commands/init/templates/commands/hooks/session-start.md +117 -0
  203. package/src/cli/simple-commands/init/templates/coordination-md.js +340 -0
  204. package/src/cli/simple-commands/init/templates/coordination.md +16 -0
  205. package/src/cli/simple-commands/init/templates/enhanced-templates.js +2347 -0
  206. package/src/cli/simple-commands/init/templates/github-safe-enhanced.js +331 -0
  207. package/src/cli/simple-commands/init/templates/github-safe.js +106 -0
  208. package/src/cli/simple-commands/init/templates/memory-bank-md.js +259 -0
  209. package/src/cli/simple-commands/init/templates/memory-bank.md +16 -0
  210. package/src/cli/simple-commands/init/templates/readme-files.js +72 -0
  211. package/src/cli/simple-commands/init/templates/safe-hook-patterns.js +430 -0
  212. package/src/cli/simple-commands/init/templates/settings.json +109 -0
  213. package/src/cli/simple-commands/init/templates/settings.json.enhanced +35 -0
  214. package/src/cli/simple-commands/init/templates/sparc-modes.js +1401 -0
  215. package/src/cli/simple-commands/init/templates/verification-claude-md.js +432 -0
  216. package/src/cli/simple-commands/init/validation/config-validator.js +354 -0
  217. package/src/cli/simple-commands/init/validation/health-checker.js +599 -0
  218. package/src/cli/simple-commands/init/validation/index.js +388 -0
  219. package/src/cli/simple-commands/init/validation/mode-validator.js +387 -0
  220. package/src/cli/simple-commands/init/validation/post-init-validator.js +390 -0
  221. package/src/cli/simple-commands/init/validation/pre-init-validator.js +290 -0
  222. package/src/cli/simple-commands/init/validation/test-runner.js +488 -0
  223. package/src/cli/simple-commands/init.js +4 -0
  224. package/src/cli/simple-commands/mcp-health.js +163 -0
  225. package/src/cli/simple-commands/mcp-integration-layer.js +689 -0
  226. package/src/cli/simple-commands/mcp.js +420 -0
  227. package/src/cli/simple-commands/memory-consolidation.js +631 -0
  228. package/src/cli/simple-commands/memory.js +345 -0
  229. package/src/cli/simple-commands/migrate-hooks.js +63 -0
  230. package/src/cli/simple-commands/monitor.js +417 -0
  231. package/src/cli/simple-commands/neural.js +148 -0
  232. package/src/cli/simple-commands/pair-autofix-only.js +755 -0
  233. package/src/cli/simple-commands/pair-basic.js +751 -0
  234. package/src/cli/simple-commands/pair-old.js +623 -0
  235. package/src/cli/simple-commands/pair-working.js +849 -0
  236. package/src/cli/simple-commands/pair.js +849 -0
  237. package/src/cli/simple-commands/performance-hooks.js +149 -0
  238. package/src/cli/simple-commands/performance-metrics.js +601 -0
  239. package/src/cli/simple-commands/process-ui-enhanced.js +821 -0
  240. package/src/cli/simple-commands/process-ui.js +274 -0
  241. package/src/cli/simple-commands/realtime-update-system.js +659 -0
  242. package/src/cli/simple-commands/sparc/architecture.js +1750 -0
  243. package/src/cli/simple-commands/sparc/commands.js +575 -0
  244. package/src/cli/simple-commands/sparc/completion.js +1831 -0
  245. package/src/cli/simple-commands/sparc/coordinator.js +1045 -0
  246. package/src/cli/simple-commands/sparc/index.js +321 -0
  247. package/src/cli/simple-commands/sparc/phase-base.js +430 -0
  248. package/src/cli/simple-commands/sparc/pseudocode.js +984 -0
  249. package/src/cli/simple-commands/sparc/refinement.js +1856 -0
  250. package/src/cli/simple-commands/sparc/specification.js +736 -0
  251. package/src/cli/simple-commands/sparc-modes/architect.js +125 -0
  252. package/src/cli/simple-commands/sparc-modes/ask.js +126 -0
  253. package/src/cli/simple-commands/sparc-modes/code.js +148 -0
  254. package/src/cli/simple-commands/sparc-modes/debug.js +112 -0
  255. package/src/cli/simple-commands/sparc-modes/devops.js +137 -0
  256. package/src/cli/simple-commands/sparc-modes/docs-writer.js +38 -0
  257. package/src/cli/simple-commands/sparc-modes/generic.js +34 -0
  258. package/src/cli/simple-commands/sparc-modes/index.js +201 -0
  259. package/src/cli/simple-commands/sparc-modes/integration.js +55 -0
  260. package/src/cli/simple-commands/sparc-modes/mcp.js +38 -0
  261. package/src/cli/simple-commands/sparc-modes/monitoring.js +38 -0
  262. package/src/cli/simple-commands/sparc-modes/optimization.js +38 -0
  263. package/src/cli/simple-commands/sparc-modes/security-review.js +130 -0
  264. package/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +167 -0
  265. package/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +38 -0
  266. package/src/cli/simple-commands/sparc-modes/supabase-admin.js +149 -0
  267. package/src/cli/simple-commands/sparc-modes/swarm.js +436 -0
  268. package/src/cli/simple-commands/sparc-modes/tdd.js +112 -0
  269. package/src/cli/simple-commands/sparc-modes/tutorial.js +277 -0
  270. package/src/cli/simple-commands/sparc.js +530 -0
  271. package/src/cli/simple-commands/start-ui.js +147 -0
  272. package/src/cli/simple-commands/start-wrapper.js +285 -0
  273. package/src/cli/simple-commands/start.js +2 -0
  274. package/src/cli/simple-commands/status.js +303 -0
  275. package/src/cli/simple-commands/stream-chain-clean.js +221 -0
  276. package/src/cli/simple-commands/stream-chain-fixed.js +89 -0
  277. package/src/cli/simple-commands/stream-chain-real.js +408 -0
  278. package/src/cli/simple-commands/stream-chain-working.js +323 -0
  279. package/src/cli/simple-commands/stream-chain.js +491 -0
  280. package/src/cli/simple-commands/stream-processor.js +340 -0
  281. package/src/cli/simple-commands/swarm-executor.js +253 -0
  282. package/src/cli/simple-commands/swarm-metrics-integration.js +371 -0
  283. package/src/cli/simple-commands/swarm-ui.js +741 -0
  284. package/src/cli/simple-commands/swarm-webui-integration.js +311 -0
  285. package/src/cli/simple-commands/swarm.js +2277 -0
  286. package/src/cli/simple-commands/task.js +228 -0
  287. package/src/cli/simple-commands/templates/mle-star-workflow.json +294 -0
  288. package/src/cli/simple-commands/timestamp-fix.js +104 -0
  289. package/src/cli/simple-commands/token-tracker.js +372 -0
  290. package/src/cli/simple-commands/tool-execution-framework.js +555 -0
  291. package/src/cli/simple-commands/train-and-stream.js +354 -0
  292. package/src/cli/simple-commands/training-pipeline.js +874 -0
  293. package/src/cli/simple-commands/training.js +288 -0
  294. package/src/cli/simple-commands/verification-hooks.js +336 -0
  295. package/src/cli/simple-commands/verification-integration.js +464 -0
  296. package/src/cli/simple-commands/verification-training-integration.js +646 -0
  297. package/src/cli/simple-commands/verification.js +551 -0
  298. package/src/cli/simple-commands/web-server.js +929 -0
  299. package/src/cli/simple-commands/webui-validator.js +136 -0
  300. package/src/language/README.md +503 -0
  301. package/src/language/claude-md-generator.js +618 -0
  302. package/src/language/cli.js +422 -0
  303. package/src/language/example.js +347 -0
  304. package/src/language/integration-system.js +619 -0
  305. package/src/language/language-detector.js +581 -0
@@ -0,0 +1,671 @@
1
+ /**
2
+ * Hook Safety System - Prevents recursive hook execution and financial damage
3
+ *
4
+ * This system protects against infinite loops where Claude Code hooks call
5
+ * 'claude' commands, which could bypass rate limits and cost thousands of dollars.
6
+ *
7
+ * Critical protections:
8
+ * - Environment variable context detection
9
+ * - Recursive call prevention
10
+ * - Circuit breaker for Stop hooks
11
+ * - Configuration validation
12
+ * - Emergency override flags
13
+ */
14
+
15
+ import { printError, printWarning, printSuccess } from '../utils.js';
16
+ import { existsSync, readFileSync } from 'fs';
17
+ import path from 'path';
18
+
19
+ /**
20
+ * Hook Safety Configuration
21
+ */
22
+ const HOOK_SAFETY_CONFIG = {
23
+ // Maximum hook execution depth before blocking
24
+ MAX_HOOK_DEPTH: 3,
25
+
26
+ // Maximum Stop hook executions per session
27
+ MAX_STOP_HOOK_EXECUTIONS: 2,
28
+
29
+ // Circuit breaker timeout (milliseconds)
30
+ CIRCUIT_BREAKER_TIMEOUT: 60000, // 1 minute
31
+
32
+ // Environment variables for context detection
33
+ ENV_VARS: {
34
+ CONTEXT: 'CLAUDE_HOOK_CONTEXT',
35
+ DEPTH: 'CLAUDE_HOOK_DEPTH',
36
+ SESSION_ID: 'CLAUDE_HOOK_SESSION_ID',
37
+ SKIP_HOOKS: 'CLAUDE_SKIP_HOOKS',
38
+ SAFE_MODE: 'CLAUDE_SAFE_MODE',
39
+ },
40
+ };
41
+
42
+ /**
43
+ * Global hook execution tracking
44
+ */
45
+ class HookExecutionTracker {
46
+ constructor() {
47
+ this.executions = new Map();
48
+ this.sessionId = this.generateSessionId();
49
+ this.resetTimeout = null;
50
+ }
51
+
52
+ generateSessionId() {
53
+ return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
54
+ }
55
+
56
+ track(hookType) {
57
+ const key = `${this.sessionId}:${hookType}`;
58
+ const count = this.executions.get(key) || 0;
59
+ this.executions.set(key, count + 1);
60
+
61
+ // Auto-reset after timeout
62
+ if (this.resetTimeout) clearTimeout(this.resetTimeout);
63
+ this.resetTimeout = setTimeout(() => {
64
+ this.executions.clear();
65
+ }, HOOK_SAFETY_CONFIG.CIRCUIT_BREAKER_TIMEOUT);
66
+
67
+ return count + 1;
68
+ }
69
+
70
+ getExecutionCount(hookType) {
71
+ const key = `${this.sessionId}:${hookType}`;
72
+ return this.executions.get(key) || 0;
73
+ }
74
+
75
+ reset() {
76
+ this.executions.clear();
77
+ this.sessionId = this.generateSessionId();
78
+ }
79
+ }
80
+
81
+ // Global instance
82
+ const executionTracker = new HookExecutionTracker();
83
+
84
+ /**
85
+ * Hook Context Manager - Tracks hook execution context
86
+ */
87
+ export class HookContextManager {
88
+ static setContext(hookType, depth = 1) {
89
+ process.env[HOOK_SAFETY_CONFIG.ENV_VARS.CONTEXT] = hookType;
90
+ process.env[HOOK_SAFETY_CONFIG.ENV_VARS.DEPTH] = depth.toString();
91
+ process.env[HOOK_SAFETY_CONFIG.ENV_VARS.SESSION_ID] = executionTracker.sessionId;
92
+ }
93
+
94
+ static getContext() {
95
+ return {
96
+ type: process.env[HOOK_SAFETY_CONFIG.ENV_VARS.CONTEXT],
97
+ depth: parseInt(process.env[HOOK_SAFETY_CONFIG.ENV_VARS.DEPTH] || '0'),
98
+ sessionId: process.env[HOOK_SAFETY_CONFIG.ENV_VARS.SESSION_ID],
99
+ skipHooks: process.env[HOOK_SAFETY_CONFIG.ENV_VARS.SKIP_HOOKS] === 'true',
100
+ safeMode: process.env[HOOK_SAFETY_CONFIG.ENV_VARS.SAFE_MODE] === 'true',
101
+ };
102
+ }
103
+
104
+ static clearContext() {
105
+ delete process.env[HOOK_SAFETY_CONFIG.ENV_VARS.CONTEXT];
106
+ delete process.env[HOOK_SAFETY_CONFIG.ENV_VARS.DEPTH];
107
+ delete process.env[HOOK_SAFETY_CONFIG.ENV_VARS.SESSION_ID];
108
+ }
109
+
110
+ static isInHookContext() {
111
+ return !!process.env[HOOK_SAFETY_CONFIG.ENV_VARS.CONTEXT];
112
+ }
113
+
114
+ static setSafeMode(enabled = true) {
115
+ if (enabled) {
116
+ process.env[HOOK_SAFETY_CONFIG.ENV_VARS.SAFE_MODE] = 'true';
117
+ } else {
118
+ delete process.env[HOOK_SAFETY_CONFIG.ENV_VARS.SAFE_MODE];
119
+ }
120
+ }
121
+
122
+ static setSkipHooks(enabled = true) {
123
+ if (enabled) {
124
+ process.env[HOOK_SAFETY_CONFIG.ENV_VARS.SKIP_HOOKS] = 'true';
125
+ } else {
126
+ delete process.env[HOOK_SAFETY_CONFIG.ENV_VARS.SKIP_HOOKS];
127
+ }
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Command Validator - Validates commands for hook safety
133
+ */
134
+ export class HookCommandValidator {
135
+ /**
136
+ * Validate if a command is safe to execute from a hook
137
+ */
138
+ static validateCommand(command, hookType) {
139
+ const context = HookContextManager.getContext();
140
+ const warnings = [];
141
+ const errors = [];
142
+
143
+ // Critical check: Claude commands in Stop hooks
144
+ if (hookType === 'Stop' && this.isClaudeCommand(command)) {
145
+ errors.push({
146
+ type: 'CRITICAL_RECURSION_RISK',
147
+ message:
148
+ '🚨 CRITICAL ERROR: Claude command detected in Stop hook!\n' +
149
+ 'This creates an INFINITE LOOP that can cost THOUSANDS OF DOLLARS.\n' +
150
+ 'Stop hooks that call "claude" commands bypass rate limits and\n' +
151
+ 'can result in massive unexpected API charges.\n\n' +
152
+ 'BLOCKED FOR SAFETY - Use alternative patterns instead.',
153
+ });
154
+ }
155
+
156
+ // General recursion detection
157
+ if (context.type && this.isClaudeCommand(command)) {
158
+ const depth = context.depth;
159
+
160
+ if (depth >= HOOK_SAFETY_CONFIG.MAX_HOOK_DEPTH) {
161
+ errors.push({
162
+ type: 'HOOK_RECURSION_LIMIT',
163
+ message:
164
+ `🚨 Hook recursion limit exceeded! (Depth: ${depth})\n` +
165
+ `Hook type: ${context.type}\n` +
166
+ 'Blocking execution to prevent infinite loop.',
167
+ });
168
+ } else {
169
+ warnings.push({
170
+ type: 'POTENTIAL_RECURSION',
171
+ message:
172
+ `āš ļø WARNING: Claude command in ${context.type} hook (depth: ${depth})\n` +
173
+ 'This could create recursion. Consider using --skip-hooks flag.',
174
+ });
175
+ }
176
+ }
177
+
178
+ // Check for other dangerous patterns
179
+ if (this.isDangerousPattern(command, hookType)) {
180
+ warnings.push({
181
+ type: 'DANGEROUS_PATTERN',
182
+ message:
183
+ `āš ļø WARNING: Potentially dangerous hook pattern detected.\n` +
184
+ 'Review the command and consider safer alternatives.',
185
+ });
186
+ }
187
+
188
+ return { warnings, errors, safe: errors.length === 0 };
189
+ }
190
+
191
+ static isClaudeCommand(command) {
192
+ // Match various forms of claude command invocation
193
+ const claudePatterns = [
194
+ /\bclaude\b/, // Direct claude command
195
+ /claude-code\b/, // claude-code command
196
+ /npx\s+claude\b/, // NPX claude
197
+ /\.\/claude\b/, // Local claude wrapper
198
+ /claude\.exe\b/, // Windows executable
199
+ ];
200
+
201
+ return claudePatterns.some((pattern) => pattern.test(command));
202
+ }
203
+
204
+ static isDangerousPattern(command, hookType) {
205
+ const dangerousPatterns = [
206
+ // Commands that could trigger more hooks
207
+ /git\s+commit.*--all/,
208
+ /git\s+add\s+\./,
209
+ // File operations that might trigger watchers
210
+ /watch\s+.*claude/,
211
+ /nodemon.*claude/,
212
+ // Recursive script execution
213
+ /bash.*hook/,
214
+ /sh.*hook/,
215
+ ];
216
+
217
+ return dangerousPatterns.some((pattern) => pattern.test(command));
218
+ }
219
+ }
220
+
221
+ /**
222
+ * Circuit Breaker - Prevents runaway hook execution
223
+ */
224
+ export class HookCircuitBreaker {
225
+ /**
226
+ * Check if hook execution should be allowed
227
+ */
228
+ static checkExecution(hookType) {
229
+ const executionCount = executionTracker.track(hookType);
230
+
231
+ // Stop hook protection - maximum 2 executions per session
232
+ if (hookType === 'Stop' && executionCount > HOOK_SAFETY_CONFIG.MAX_STOP_HOOK_EXECUTIONS) {
233
+ throw new Error(
234
+ `🚨 CIRCUIT BREAKER ACTIVATED!\n` +
235
+ `Stop hook has executed ${executionCount} times in this session.\n` +
236
+ `This indicates a potential infinite loop that could cost thousands of dollars.\n` +
237
+ `Execution blocked for financial protection.\n\n` +
238
+ `To reset: Use --reset-circuit-breaker flag or restart your session.`,
239
+ );
240
+ }
241
+
242
+ // General protection for any hook type
243
+ if (executionCount > 20) {
244
+ throw new Error(
245
+ `🚨 CIRCUIT BREAKER: ${hookType} hook executed ${executionCount} times!\n` +
246
+ `This is highly unusual and indicates a potential problem.\n` +
247
+ `Execution blocked to prevent system overload.`,
248
+ );
249
+ }
250
+
251
+ // Log warnings for concerning patterns
252
+ if (hookType === 'Stop' && executionCount > 1) {
253
+ printWarning(`āš ļø Stop hook execution #${executionCount} detected. Monitor for recursion.`);
254
+ }
255
+
256
+ return true;
257
+ }
258
+
259
+ static reset() {
260
+ executionTracker.reset();
261
+ printSuccess('Circuit breaker reset successfully.');
262
+ }
263
+
264
+ static getStatus() {
265
+ return {
266
+ sessionId: executionTracker.sessionId,
267
+ executions: Array.from(executionTracker.executions.entries()).map(([key, count]) => {
268
+ const [sessionId, hookType] = key.split(':');
269
+ return { hookType, count };
270
+ }),
271
+ };
272
+ }
273
+ }
274
+
275
+ /**
276
+ * Configuration Validator - Validates hook configurations for safety
277
+ */
278
+ export class HookConfigValidator {
279
+ /**
280
+ * Validate Claude Code settings.json for dangerous hook configurations
281
+ */
282
+ static validateClaudeCodeConfig(configPath = null) {
283
+ if (!configPath) {
284
+ // Try to find Claude Code settings
285
+ const possiblePaths = [
286
+ path.join(process.env.HOME || '.', '.claude', 'settings.json'),
287
+ path.join(process.cwd(), '.claude', 'settings.json'),
288
+ path.join(process.cwd(), 'settings.json'),
289
+ ];
290
+
291
+ configPath = possiblePaths.find((p) => existsSync(p));
292
+
293
+ if (!configPath) {
294
+ return { safe: true, message: 'No Claude Code configuration found.' };
295
+ }
296
+ }
297
+
298
+ try {
299
+ const config = JSON.parse(readFileSync(configPath, 'utf8'));
300
+ const validation = this.validateHooksConfig(config.hooks || {});
301
+
302
+ return {
303
+ safe: validation.errors.length === 0,
304
+ configPath,
305
+ ...validation,
306
+ };
307
+ } catch (err) {
308
+ return {
309
+ safe: false,
310
+ error: `Failed to validate configuration: ${err.message}`,
311
+ configPath,
312
+ };
313
+ }
314
+ }
315
+
316
+ /**
317
+ * Validate hooks configuration object
318
+ */
319
+ static validateHooksConfig(hooksConfig) {
320
+ const warnings = [];
321
+ const errors = [];
322
+
323
+ // Check Stop hooks specifically
324
+ if (hooksConfig.Stop) {
325
+ for (const hookGroup of hooksConfig.Stop) {
326
+ for (const hook of hookGroup.hooks || []) {
327
+ if (hook.type === 'command' && hook.command) {
328
+ const result = HookCommandValidator.validateCommand(hook.command, 'Stop');
329
+ warnings.push(...result.warnings);
330
+ errors.push(...result.errors);
331
+ }
332
+ }
333
+ }
334
+ }
335
+
336
+ // Check other dangerous hook types
337
+ const dangerousHookTypes = ['SubagentStop', 'PostToolUse'];
338
+ for (const hookType of dangerousHookTypes) {
339
+ if (hooksConfig[hookType]) {
340
+ for (const hookGroup of hooksConfig[hookType]) {
341
+ for (const hook of hookGroup.hooks || []) {
342
+ if (hook.type === 'command' && hook.command) {
343
+ const result = HookCommandValidator.validateCommand(hook.command, hookType);
344
+ warnings.push(...result.warnings);
345
+ errors.push(...result.errors);
346
+ }
347
+ }
348
+ }
349
+ }
350
+ }
351
+
352
+ return { warnings, errors };
353
+ }
354
+
355
+ /**
356
+ * Generate safe configuration recommendations
357
+ */
358
+ static generateSafeAlternatives(dangerousConfig) {
359
+ const alternatives = [];
360
+
361
+ // Example: Stop hook calling claude
362
+ if (dangerousConfig.includes('claude')) {
363
+ alternatives.push({
364
+ pattern: 'Stop hook with claude command',
365
+ problem: 'Creates infinite recursion loop',
366
+ solution: 'Use flag-based approach instead',
367
+ example: `
368
+ // Instead of this DANGEROUS pattern:
369
+ {
370
+ "Stop": [{
371
+ "hooks": [{"type": "command", "command": "claude -c -p 'Update history'"}]
372
+ }]
373
+ }
374
+
375
+ // Use this SAFE pattern:
376
+ {
377
+ "Stop": [{
378
+ "hooks": [{"type": "command", "command": "touch ~/.claude/needs_update"}]
379
+ }]
380
+ }
381
+
382
+ // Then manually run: claude -c -p "Update history" when needed
383
+ `,
384
+ });
385
+
386
+ alternatives.push({
387
+ pattern: 'PostToolUse hook alternative',
388
+ problem: 'Stop hooks execute too frequently',
389
+ solution: 'Use PostToolUse for specific tools',
390
+ example: `
391
+ // SAFER: Use PostToolUse for specific operations
392
+ {
393
+ "PostToolUse": [{
394
+ "matcher": "Write|Edit|MultiEdit",
395
+ "hooks": [{"type": "command", "command": "echo 'File modified' >> ~/.claude/changes.log"}]
396
+ }]
397
+ }
398
+ `,
399
+ });
400
+ }
401
+
402
+ return alternatives;
403
+ }
404
+ }
405
+
406
+ /**
407
+ * Safe Hook Execution Wrapper
408
+ */
409
+ export class SafeHookExecutor {
410
+ /**
411
+ * Safely execute a hook command with all safety checks
412
+ */
413
+ static async executeHookCommand(command, hookType, options = {}) {
414
+ try {
415
+ // Skip if hooks are disabled
416
+ if (HookContextManager.getContext().skipHooks) {
417
+ console.log(`ā­ļø Skipping ${hookType} hook (hooks disabled)`);
418
+ return { success: true, skipped: true };
419
+ }
420
+
421
+ // Circuit breaker check
422
+ HookCircuitBreaker.checkExecution(hookType);
423
+
424
+ // Command validation
425
+ const validation = HookCommandValidator.validateCommand(command, hookType);
426
+
427
+ // Show warnings
428
+ for (const warning of validation.warnings) {
429
+ printWarning(warning.message);
430
+ }
431
+
432
+ // Block on errors
433
+ if (!validation.safe) {
434
+ for (const error of validation.errors) {
435
+ printError(error.message);
436
+ }
437
+ return { success: false, blocked: true, errors: validation.errors };
438
+ }
439
+
440
+ // Set hook context for nested calls
441
+ const currentContext = HookContextManager.getContext();
442
+ const newDepth = currentContext.depth + 1;
443
+ HookContextManager.setContext(hookType, newDepth);
444
+
445
+ // Execute the command with safety context
446
+ const result = await this.executeCommand(command, options);
447
+
448
+ return { success: true, result };
449
+ } catch (err) {
450
+ printError(`Hook execution failed: ${err.message}`);
451
+ return { success: false, error: err.message };
452
+ } finally {
453
+ // Clear context
454
+ HookContextManager.clearContext();
455
+ }
456
+ }
457
+
458
+ static async executeCommand(command, options = {}) {
459
+ // This would integrate with the actual command execution system
460
+ // For now, just log what would be executed
461
+ console.log(`šŸ”— Executing hook command: ${command}`);
462
+
463
+ // Here you would actually execute the command
464
+ // return await execCommand(command, options);
465
+
466
+ return { stdout: '', stderr: '', exitCode: 0 };
467
+ }
468
+ }
469
+
470
+ /**
471
+ * Hook Safety CLI Commands
472
+ */
473
+ export async function hookSafetyCommand(subArgs, flags) {
474
+ const subcommand = subArgs[0];
475
+
476
+ switch (subcommand) {
477
+ case 'validate':
478
+ return await validateConfigCommand(subArgs, flags);
479
+ case 'status':
480
+ return await statusCommand(subArgs, flags);
481
+ case 'reset':
482
+ return await resetCommand(subArgs, flags);
483
+ case 'safe-mode':
484
+ return await safeModeCommand(subArgs, flags);
485
+ default:
486
+ showHookSafetyHelp();
487
+ }
488
+ }
489
+
490
+ async function validateConfigCommand(subArgs, flags) {
491
+ const configPath = flags.config || flags.c;
492
+
493
+ console.log('šŸ” Validating hook configuration for safety...\n');
494
+
495
+ const result = HookConfigValidator.validateClaudeCodeConfig(configPath);
496
+
497
+ if (result.safe) {
498
+ printSuccess('āœ… Hook configuration is safe!');
499
+ if (result.configPath) {
500
+ console.log(`šŸ“„ Validated: ${result.configPath}`);
501
+ }
502
+ } else {
503
+ printError('āŒ DANGEROUS hook configuration detected!');
504
+
505
+ if (result.errors) {
506
+ console.log('\n🚨 CRITICAL ERRORS:');
507
+ for (const error of result.errors) {
508
+ console.log(`\n${error.message}`);
509
+ }
510
+ }
511
+
512
+ if (result.warnings) {
513
+ console.log('\nāš ļø WARNINGS:');
514
+ for (const warning of result.warnings) {
515
+ console.log(`\n${warning.message}`);
516
+ }
517
+ }
518
+
519
+ console.log('\nšŸ’” RECOMMENDATIONS:');
520
+ console.log('1. Remove claude commands from Stop hooks');
521
+ console.log('2. Use PostToolUse hooks for specific tools');
522
+ console.log('3. Implement flag-based update patterns');
523
+ console.log('4. Use claude --skip-hooks for manual updates');
524
+ }
525
+ }
526
+
527
+ async function statusCommand(subArgs, flags) {
528
+ const context = HookContextManager.getContext();
529
+ const circuitStatus = HookCircuitBreaker.getStatus();
530
+
531
+ console.log('šŸ”— Hook Safety Status\n');
532
+
533
+ console.log('šŸ“Š Current Context:');
534
+ if (context.type) {
535
+ console.log(` šŸ”„ Hook Type: ${context.type}`);
536
+ console.log(` šŸ“ Depth: ${context.depth}`);
537
+ console.log(` šŸ†” Session: ${context.sessionId}`);
538
+ console.log(` ā­ļø Skip Hooks: ${context.skipHooks ? 'Yes' : 'No'}`);
539
+ console.log(` šŸ›”ļø Safe Mode: ${context.safeMode ? 'Yes' : 'No'}`);
540
+ } else {
541
+ console.log(' āœ… Not currently in hook context');
542
+ }
543
+
544
+ console.log('\n⚔ Circuit Breaker Status:');
545
+ console.log(` šŸ†” Session: ${circuitStatus.sessionId}`);
546
+
547
+ if (circuitStatus.executions.length > 0) {
548
+ console.log(' šŸ“Š Hook Executions:');
549
+ for (const exec of circuitStatus.executions) {
550
+ console.log(` • ${exec.hookType}: ${exec.count} times`);
551
+ }
552
+ } else {
553
+ console.log(' āœ… No hook executions in current session');
554
+ }
555
+ }
556
+
557
+ async function resetCommand(subArgs, flags) {
558
+ console.log('šŸ”„ Resetting hook safety systems...\n');
559
+
560
+ HookCircuitBreaker.reset();
561
+ HookContextManager.clearContext();
562
+
563
+ printSuccess('āœ… Hook safety systems reset successfully!');
564
+ console.log('All execution counters and context cleared.');
565
+ }
566
+
567
+ async function safeModeCommand(subArgs, flags) {
568
+ const enable = !flags.disable && !flags.off;
569
+
570
+ if (enable) {
571
+ HookContextManager.setSafeMode(true);
572
+ HookContextManager.setSkipHooks(true);
573
+ printSuccess('šŸ›”ļø Safe mode enabled!');
574
+ console.log('• All hooks will be skipped');
575
+ console.log('• Claude commands will show safety warnings');
576
+ console.log('• Additional validation will be performed');
577
+ } else {
578
+ HookContextManager.setSafeMode(false);
579
+ HookContextManager.setSkipHooks(false);
580
+ printSuccess('⚔ Safe mode disabled.');
581
+ console.log('Normal hook execution restored.');
582
+ }
583
+ }
584
+
585
+ function showHookSafetyHelp() {
586
+ console.log(`
587
+ šŸ›”ļø Hook Safety System - Prevent Infinite Loops & Financial Damage
588
+
589
+ USAGE:
590
+ claude-flow hook-safety <command> [options]
591
+
592
+ COMMANDS:
593
+ validate Validate hook configuration for dangerous patterns
594
+ status Show current hook safety status and context
595
+ reset Reset circuit breakers and execution counters
596
+ safe-mode Enable/disable safe mode (skips all hooks)
597
+
598
+ VALIDATE OPTIONS:
599
+ --config, -c <path> Path to Claude Code settings.json
600
+
601
+ SAFE-MODE OPTIONS:
602
+ --disable, --off Disable safe mode
603
+
604
+ EXAMPLES:
605
+ # Check your Claude Code hooks for dangerous patterns
606
+ claude-flow hook-safety validate
607
+
608
+ # Check specific configuration file
609
+ claude-flow hook-safety validate --config ~/.claude/settings.json
610
+
611
+ # View current safety status
612
+ claude-flow hook-safety status
613
+
614
+ # Reset if circuit breaker is triggered
615
+ claude-flow hook-safety reset
616
+
617
+ # Enable safe mode (skips all hooks)
618
+ claude-flow hook-safety safe-mode
619
+
620
+ # Disable safe mode
621
+ claude-flow hook-safety safe-mode --disable
622
+
623
+ 🚨 CRITICAL WARNING:
624
+ Stop hooks that call 'claude' commands create INFINITE LOOPS that can:
625
+ • Bypass API rate limits
626
+ • Cost thousands of dollars per day
627
+ • Make your system unresponsive
628
+
629
+ SAFE ALTERNATIVES:
630
+ • Use PostToolUse hooks instead of Stop hooks
631
+ • Implement flag-based update patterns
632
+ • Use 'claude --skip-hooks' for manual updates
633
+ • Create conditional execution scripts
634
+
635
+ For more information: https://github.com/ruvnet/claude-flow/issues/166
636
+ `);
637
+ }
638
+
639
+ /**
640
+ * Emergency CLI flags for Claude commands
641
+ */
642
+ export function addSafetyFlags(command) {
643
+ // Add safety flags to any claude command
644
+ const context = HookContextManager.getContext();
645
+
646
+ if (context.type) {
647
+ // Automatically add --skip-hooks if in hook context
648
+ if (!command.includes('--skip-hooks')) {
649
+ command += ' --skip-hooks';
650
+ }
651
+ }
652
+
653
+ if (context.safeMode) {
654
+ // Add additional safety flags in safe mode
655
+ if (!command.includes('--dry-run')) {
656
+ command += ' --dry-run';
657
+ }
658
+ }
659
+
660
+ return command;
661
+ }
662
+
663
+ export default {
664
+ HookContextManager,
665
+ HookCommandValidator,
666
+ HookCircuitBreaker,
667
+ HookConfigValidator,
668
+ SafeHookExecutor,
669
+ hookSafetyCommand,
670
+ addSafetyFlags,
671
+ };