claude-flow-novice 2.0.4 → 2.0.5
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/dist/src/cli/commands/guidance.js +668 -487
- package/dist/src/cli/commands/index-validate.js +29 -18
- package/dist/src/cli/commands/mcp-troubleshoot.js +282 -230
- package/dist/src/cli/commands/neural-goal-init.js +125 -92
- package/dist/src/cli/commands/swarm-exec.js +393 -317
- package/dist/src/cli/commands/validate-framework.js +1100 -983
- package/dist/src/cli/commands/validate.js +223 -144
- package/dist/src/cli/main.js +1 -1
- package/dist/src/cli/simple-commands/__tests__/agent.test.js +277 -265
- package/dist/src/cli/simple-commands/__tests__/memory.test.js +7 -6
- package/dist/src/cli/simple-commands/__tests__/swarm.test.js +356 -373
- package/dist/src/cli/simple-commands/__tests__/task.test.js +7 -6
- package/dist/src/cli/simple-commands/agent.js +193 -157
- package/dist/src/cli/simple-commands/analysis.js +446 -336
- package/dist/src/cli/simple-commands/automation-executor.js +1339 -1095
- package/dist/src/cli/simple-commands/automation.js +469 -481
- package/dist/src/cli/simple-commands/batch-manager.js +313 -261
- package/dist/src/cli/simple-commands/claude-telemetry.js +267 -241
- package/dist/src/cli/simple-commands/claude-track.js +90 -68
- package/dist/src/cli/simple-commands/concurrent-display.js +320 -266
- package/dist/src/cli/simple-commands/config.js +290 -245
- package/dist/src/cli/simple-commands/coordination.js +234 -182
- package/dist/src/cli/simple-commands/enhanced-ui-views.js +615 -812
- package/dist/src/cli/simple-commands/enhanced-webui-complete.js +981 -922
- package/dist/src/cli/simple-commands/fix-hook-variables.js +294 -274
- package/dist/src/cli/simple-commands/github/gh-coordinator.js +457 -378
- package/dist/src/cli/simple-commands/github/github-api.js +574 -535
- package/dist/src/cli/simple-commands/github/init.js +303 -276
- package/dist/src/cli/simple-commands/github.js +247 -222
- package/dist/src/cli/simple-commands/goal.js +63 -51
- package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +278 -208
- package/dist/src/cli/simple-commands/hive-mind/communication.js +696 -601
- package/dist/src/cli/simple-commands/hive-mind/core.js +979 -907
- package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +655 -406
- package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1245 -1125
- package/dist/src/cli/simple-commands/hive-mind/memory.js +1090 -854
- package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +574 -459
- package/dist/src/cli/simple-commands/hive-mind/performance-test.js +347 -263
- package/dist/src/cli/simple-commands/hive-mind/queen.js +768 -727
- package/dist/src/cli/simple-commands/hive-mind/session-manager.js +1049 -745
- package/dist/src/cli/simple-commands/hive-mind-optimize.js +283 -227
- package/dist/src/cli/simple-commands/hive-mind-wizard.js +217 -174
- package/dist/src/cli/simple-commands/hive-mind.js +2282 -1841
- package/dist/src/cli/simple-commands/hive.js +79 -90
- package/dist/src/cli/simple-commands/hook-safety.js +521 -431
- package/dist/src/cli/simple-commands/hooks/session-start-soul.js +254 -203
- package/dist/src/cli/simple-commands/hooks.js +1204 -1064
- package/dist/src/cli/simple-commands/init/agent-copier.js +319 -294
- package/dist/src/cli/simple-commands/init/batch-init.js +562 -496
- package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +19 -13
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +19 -13
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +88 -61
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +150 -125
- package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +49 -42
- package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +61 -43
- package/dist/src/cli/simple-commands/init/copy-revised-templates.js +147 -141
- package/dist/src/cli/simple-commands/init/executable-wrapper.js +44 -31
- package/dist/src/cli/simple-commands/init/gitignore-updater.js +90 -64
- package/dist/src/cli/simple-commands/init/help.js +107 -104
- package/dist/src/cli/simple-commands/init/hive-mind-init.js +528 -509
- package/dist/src/cli/simple-commands/init/index.js +1759 -1510
- package/dist/src/cli/simple-commands/init/performance-monitor.js +317 -234
- package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +504 -441
- package/dist/src/cli/simple-commands/init/rollback/index.js +364 -289
- package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +728 -652
- package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +481 -416
- package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +448 -369
- package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +2 -1
- package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +99 -122
- package/dist/src/cli/simple-commands/init/sparc/workflows.js +37 -32
- package/dist/src/cli/simple-commands/init/sparc-structure.js +62 -55
- package/dist/src/cli/simple-commands/init/template-copier.js +533 -421
- package/dist/src/cli/simple-commands/init/templates/coordination-md.js +6 -3
- package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +318 -344
- package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +218 -173
- package/dist/src/cli/simple-commands/init/templates/github-safe.js +75 -65
- package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +6 -3
- package/dist/src/cli/simple-commands/init/templates/readme-files.js +4 -2
- package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +230 -187
- package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +80 -53
- package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +85 -101
- package/dist/src/cli/simple-commands/init/validation/config-validator.js +330 -283
- package/dist/src/cli/simple-commands/init/validation/health-checker.js +561 -495
- package/dist/src/cli/simple-commands/init/validation/index.js +358 -302
- package/dist/src/cli/simple-commands/init/validation/mode-validator.js +359 -308
- package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +366 -389
- package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +268 -270
- package/dist/src/cli/simple-commands/init/validation/test-runner.js +447 -427
- package/dist/src/cli/simple-commands/init.js +2 -1
- package/dist/src/cli/simple-commands/mcp-health.js +158 -131
- package/dist/src/cli/simple-commands/mcp-integration-layer.js +634 -533
- package/dist/src/cli/simple-commands/mcp.js +400 -345
- package/dist/src/cli/simple-commands/memory-consolidation.js +537 -426
- package/dist/src/cli/simple-commands/memory.js +311 -247
- package/dist/src/cli/simple-commands/migrate-hooks.js +46 -39
- package/dist/src/cli/simple-commands/monitor.js +363 -294
- package/dist/src/cli/simple-commands/neural.js +65 -51
- package/dist/src/cli/simple-commands/pair-autofix-only.js +662 -538
- package/dist/src/cli/simple-commands/pair-basic.js +656 -528
- package/dist/src/cli/simple-commands/pair-old.js +543 -430
- package/dist/src/cli/simple-commands/pair-working.js +751 -615
- package/dist/src/cli/simple-commands/pair.js +751 -615
- package/dist/src/cli/simple-commands/performance-hooks.js +111 -83
- package/dist/src/cli/simple-commands/performance-metrics.js +433 -348
- package/dist/src/cli/simple-commands/process-ui-enhanced.js +787 -708
- package/dist/src/cli/simple-commands/process-ui.js +254 -230
- package/dist/src/cli/simple-commands/realtime-update-system.js +611 -525
- package/dist/src/cli/simple-commands/sparc/architecture.js +1530 -1704
- package/dist/src/cli/simple-commands/sparc/commands.js +516 -438
- package/dist/src/cli/simple-commands/sparc/completion.js +1481 -1224
- package/dist/src/cli/simple-commands/sparc/coordinator.js +978 -913
- package/dist/src/cli/simple-commands/sparc/index.js +298 -241
- package/dist/src/cli/simple-commands/sparc/phase-base.js +390 -314
- package/dist/src/cli/simple-commands/sparc/pseudocode.js +869 -965
- package/dist/src/cli/simple-commands/sparc/refinement.js +1273 -980
- package/dist/src/cli/simple-commands/sparc/specification.js +645 -559
- package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/index.js +55 -47
- package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/swarm.js +87 -101
- package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
- package/dist/src/cli/simple-commands/sparc.js +493 -465
- package/dist/src/cli/simple-commands/start-ui.js +132 -108
- package/dist/src/cli/simple-commands/start-wrapper.js +268 -240
- package/dist/src/cli/simple-commands/start.js +1 -1
- package/dist/src/cli/simple-commands/status.js +275 -254
- package/dist/src/cli/simple-commands/stream-chain-clean.js +171 -128
- package/dist/src/cli/simple-commands/stream-chain-fixed.js +82 -61
- package/dist/src/cli/simple-commands/stream-chain-real.js +331 -267
- package/dist/src/cli/simple-commands/stream-chain-working.js +263 -211
- package/dist/src/cli/simple-commands/stream-chain.js +318 -260
- package/dist/src/cli/simple-commands/stream-processor.js +315 -290
- package/dist/src/cli/simple-commands/swarm-executor.js +222 -189
- package/dist/src/cli/simple-commands/swarm-metrics-integration.js +300 -208
- package/dist/src/cli/simple-commands/swarm-ui.js +703 -623
- package/dist/src/cli/simple-commands/swarm-webui-integration.js +286 -258
- package/dist/src/cli/simple-commands/swarm.js +1082 -887
- package/dist/src/cli/simple-commands/task.js +206 -161
- package/dist/src/cli/simple-commands/timestamp-fix.js +89 -59
- package/dist/src/cli/simple-commands/token-tracker.js +316 -258
- package/dist/src/cli/simple-commands/tool-execution-framework.js +519 -433
- package/dist/src/cli/simple-commands/train-and-stream.js +331 -275
- package/dist/src/cli/simple-commands/training-pipeline.js +725 -619
- package/dist/src/cli/simple-commands/training.js +227 -170
- package/dist/src/cli/simple-commands/verification-hooks.js +284 -261
- package/dist/src/cli/simple-commands/verification-integration.js +417 -389
- package/dist/src/cli/simple-commands/verification-training-integration.js +606 -486
- package/dist/src/cli/simple-commands/verification.js +513 -493
- package/dist/src/cli/simple-commands/web-server.js +836 -766
- package/dist/src/cli/simple-commands/webui-validator.js +124 -106
- package/dist/src/coordination/byzantine-memory-channels.js +25 -1
- package/dist/src/coordination/event-bus/demo-wasm-integration.js +251 -212
- package/dist/src/coordination/event-bus/qe-event-bus.js +748 -608
- package/dist/src/coordination/event-bus/qe-event-bus.test.js +454 -379
- package/dist/src/coordination/iteration-tracker.js +454 -363
- package/dist/src/index.js +384 -35
- package/dist/src/mcp/DEPRECATED.js +60 -46
- package/dist/src/mcp/fixes/mcp-error-fixes.js +134 -115
- package/dist/src/mcp/implementations/agent-tracker.js +128 -114
- package/dist/src/mcp/implementations/daa-tools.js +350 -292
- package/dist/src/mcp/implementations/workflow-tools.js +361 -329
- package/dist/src/mcp/mcp-config-manager.js +1331 -1183
- package/dist/src/mcp/mcp-server-novice-simplified.js +17 -11
- package/dist/src/mcp/mcp-server-novice.js +17 -11
- package/dist/src/mcp/mcp-server-sdk.js +17 -11
- package/dist/src/mcp/mcp-server.js +1484 -1620
- package/dist/src/mcp/ruv-swarm-wrapper.js +239 -209
- package/dist/src/memory/advanced-serializer.js +589 -609
- package/dist/src/memory/enhanced-examples.js +305 -220
- package/dist/src/memory/enhanced-memory.js +336 -295
- package/dist/src/memory/enhanced-session-serializer.js +492 -408
- package/dist/src/memory/fallback-memory-system.js +1021 -900
- package/dist/src/memory/fallback-store.js +131 -93
- package/dist/src/memory/high-performance-serialization.js +730 -592
- package/dist/src/memory/in-memory-store.js +213 -161
- package/dist/src/memory/index.js +157 -123
- package/dist/src/memory/lock-free-structures.js +764 -578
- package/dist/src/memory/memory-mapped-persistence.js +766 -585
- package/dist/src/memory/memory-pressure-manager.js +707 -569
- package/dist/src/memory/migration.js +445 -358
- package/dist/src/memory/shared-memory.js +768 -641
- package/dist/src/memory/sqlite-store.js +325 -245
- package/dist/src/memory/sqlite-wrapper.js +151 -122
- package/dist/src/memory/swarm-memory.js +603 -470
- package/dist/src/memory/test-example.js +134 -126
- package/dist/src/memory/ultra-fast-memory-store.js +821 -622
- package/dist/src/memory/unified-memory-manager.js +437 -356
- package/dist/src/swarm/CodeRefactoringSwarm.js +952 -777
- package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +400 -332
- package/dist/src/utils/error-handler.js +2 -36
- package/dist/src/utils/github-cli-safe.js +64 -56
- package/dist/src/utils/github-cli-safety-wrapper.js +546 -451
- package/dist/src/utils/npx-isolated-cache.js +119 -104
- package/dist/src/utils/preference-manager.js +652 -622
- package/dist/src/utils/timezone-utils.js +105 -86
- package/dist/src/web/api/apm-routes.js +353 -0
- package/dist/src/web/api/config/api-config.js +184 -0
- package/dist/src/web/api/middleware/auth.js +203 -0
- package/dist/src/web/api/middleware/cache.js +273 -0
- package/dist/src/web/api/middleware/error-handler.js +257 -0
- package/dist/src/web/api/middleware/request-logger.js +215 -0
- package/dist/src/web/api/middleware/validation.js +323 -0
- package/dist/src/web/api/routes/events.js +463 -0
- package/dist/src/web/api/routes/hierarchy.js +300 -0
- package/dist/src/web/api/routes/index.js +12 -0
- package/dist/src/web/api/routes/metrics.js +559 -0
- package/dist/src/web/api/routes/parallel-status.js +359 -0
- package/dist/src/web/api/routes/status.js +448 -0
- package/dist/src/web/api/server.js +462 -0
- package/dist/src/web/dashboard/hooks/useWebSocket.js +383 -0
- package/dist/src/web/dashboard/index.js +85 -0
- package/dist/src/web/dashboard/realtime/CustomSyncManager.js +439 -0
- package/dist/src/web/dashboard/realtime/NativeWebSocketManager.js +323 -0
- package/dist/src/web/dashboard/realtime/PerformanceBenchmark.js +527 -0
- package/dist/src/web/dashboard/realtime/RealtimeCommunicationManager.js +474 -0
- package/dist/src/web/dashboard/realtime/RealtimeServer.js +666 -0
- package/dist/src/web/dashboard/realtime/SSEManager.js +426 -0
- package/dist/src/web/dashboard/types.js +4 -0
- package/dist/src/web/messaging/agent-status-tracker.js +453 -0
- package/dist/src/web/messaging/human-intervention-system.js +305 -0
- package/dist/src/web/messaging/message-filter.js +302 -0
- package/dist/src/web/messaging/swarm-message-router.js +324 -0
- package/dist/src/web/messaging/transparency-logger.js +421 -0
- package/dist/src/web/portal-server.js +460 -0
- package/dist/src/web/server.js +322 -0
- package/dist/src/web/websocket/apm-websocket-handler.js +453 -0
- package/dist/src/web/websocket/websocket-manager.js +780 -0
- package/package.json +5 -3
- package/dist/src/cli/minimal-main.js +0 -22
- package/dist/src/enterprise/analytics-manager.js +0 -1135
- package/dist/src/enterprise/audit-manager.js +0 -1115
- package/dist/src/enterprise/cloud-manager.js +0 -891
- package/dist/src/enterprise/deployment-manager.js +0 -966
- package/dist/src/enterprise/index.js +0 -6
- package/dist/src/enterprise/project-manager.js +0 -584
- package/dist/src/enterprise/security-manager.js +0 -991
- package/dist/src/migration/index.js +0 -92
- package/dist/src/migration/logger.js +0 -121
- package/dist/src/migration/migration-analyzer.js +0 -268
- package/dist/src/migration/migration-runner.js +0 -522
- package/dist/src/migration/migration-validator.js +0 -285
- package/dist/src/migration/progress-reporter.js +0 -150
- package/dist/src/migration/rollback-manager.js +0 -321
- package/dist/src/migration/tests/migration-system.test.js +0 -7
- package/dist/src/migration/types.js +0 -3
- package/dist/src/swarm/__tests__/integration.test.js +0 -227
- package/dist/src/swarm/__tests__/prompt-copier.test.js +0 -344
- package/dist/src/swarm/advanced-orchestrator.js +0 -1095
- package/dist/src/swarm/claude-code-interface.js +0 -961
- package/dist/src/swarm/claude-flow-executor.js +0 -229
- package/dist/src/swarm/consensus-coordinator.js +0 -475
- package/dist/src/swarm/coordinator.js +0 -2993
- package/dist/src/swarm/direct-executor.js +0 -1180
- package/dist/src/swarm/error-recovery/advanced-error-detection.js +0 -691
- package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +0 -998
- package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +0 -1197
- package/dist/src/swarm/error-recovery/recovery-monitoring.js +0 -772
- package/dist/src/swarm/error-recovery/resilience-architecture.js +0 -714
- package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +0 -1319
- package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +0 -808
- package/dist/src/swarm/executor-v2.js +0 -322
- package/dist/src/swarm/executor.js +0 -815
- package/dist/src/swarm/hive-mind-integration.js +0 -703
- package/dist/src/swarm/index.js +0 -41
- package/dist/src/swarm/json-output-aggregator.js +0 -267
- package/dist/src/swarm/large-scale-coordinator.js +0 -542
- package/dist/src/swarm/mcp-integration-wrapper.js +0 -628
- package/dist/src/swarm/memory.js +0 -1117
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +0 -348
- package/dist/src/swarm/optimizations/async-file-manager.js +0 -285
- package/dist/src/swarm/optimizations/circular-buffer.js +0 -162
- package/dist/src/swarm/optimizations/connection-pool.js +0 -244
- package/dist/src/swarm/optimizations/index.js +0 -28
- package/dist/src/swarm/optimizations/optimized-executor.js +0 -320
- package/dist/src/swarm/optimizations/ttl-map.js +0 -234
- package/dist/src/swarm/prompt-cli.js +0 -200
- package/dist/src/swarm/prompt-copier-enhanced.js +0 -202
- package/dist/src/swarm/prompt-copier.js +0 -381
- package/dist/src/swarm/prompt-manager.js +0 -295
- package/dist/src/swarm/prompt-utils.js +0 -310
- package/dist/src/swarm/result-aggregator.js +0 -718
- package/dist/src/swarm/sparc-executor.js +0 -1568
- package/dist/src/swarm/strategies/auto.js +0 -758
- package/dist/src/swarm/strategies/base.js +0 -128
- package/dist/src/swarm/strategies/research.js +0 -914
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +0 -2
- package/dist/src/swarm/types.js +0 -52
- package/dist/src/swarm/workers/copy-worker.js +0 -56
- package/dist/src/validators/epic-config-schema.js +0 -214
- package/dist/src/validators/index.js +0 -10
- package/dist/src/validators/swarm-init-validator.js +0 -259
- package/dist/src/validators/todowrite-batching-validator.js +0 -215
- package/dist/src/validators/todowrite-integration.js +0 -187
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/documentSymbols/browser/documentSymbols.js +0 -23
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteContribution.js +0 -57
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/dropOrPasteInto/browser/copyPasteController.js +0 -401
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/dropOrPasteInto/browser/defaultProviders.js +0 -181
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorContribution.js +0 -44
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/dropOrPasteInto/browser/dropIntoEditorController.js +0 -157
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/dropOrPasteInto/browser/edit.js +0 -71
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/editorState/browser/editorState.js +0 -112
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/find/browser/findController.js +0 -990
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/find/browser/findDecorations.js +0 -296
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/find/browser/findModel.js +0 -488
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/find/browser/findOptionsWidget.js +0 -138
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/find/browser/findState.js +0 -243
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/find/browser/findWidget.js +0 -1177
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/folding/browser/folding.js +0 -1093
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/folding/browser/foldingDecorations.js +0 -133
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/folding/browser/foldingModel.js +0 -538
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/folding/browser/foldingRanges.js +0 -351
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/fontZoom/browser/fontZoom.js +0 -49
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/format/browser/format.js +0 -360
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/format/browser/formatActions.js +0 -263
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/format/browser/formattingEdit.js +0 -54
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/gotoSymbol/browser/link/clickLinkGesture.js +0 -149
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/hover/browser/contentHover.js +0 -874
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/inlineCompletions/browser/commandIds.js +0 -7
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/inlineCompletions/browser/commands.js +0 -199
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/linesOperations/browser/copyLinesCommand.js +0 -70
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/quickAccess/browser/commandsQuickAccess.js +0 -26
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/quickAccess/browser/editorNavigationQuickAccess.js +0 -153
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/readOnlyMessage/browser/contribution.js +0 -33
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/semanticTokens/browser/documentSemanticTokens.js +0 -354
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/smartSelect/browser/bracketSelections.js +0 -146
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/suggest/browser/completionModel.js +0 -224
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/contrib/unicodeHighlighter/browser/bannerController.js +0 -119
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/edcore.main.js +0 -14
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/editor.all.js +0 -63
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/editor.api.js +0 -55
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/editor.main.js +0 -7
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/editor.worker.js +0 -25
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/editor/standalone/browser/colorizer.js +0 -118
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/language/css/css.worker.js +0 -36869
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/language/css/cssMode.js +0 -2035
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/accessibility/browser/accessibilityService.js +0 -88
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/accessibility/common/accessibility.js +0 -9
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/action/common/action.js +0 -7
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/action/common/actionCommonCategories.js +0 -13
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/actionWidget/browser/actionList.js +0 -276
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/actionWidget/browser/actionWidget.js +0 -248
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/actionWidget/common/actionWidget.js +0 -5
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/actions/common/actions.js +0 -409
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/audioCues/browser/audioCueService.js +0 -176
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/clipboard/browser/clipboardService.js +0 -141
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/clipboard/common/clipboardService.js +0 -6
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/commands/common/commands.js +0 -80
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/configuration/common/configuration.js +0 -86
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/configuration/common/configurationModels.js +0 -554
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/configuration/common/configurationRegistry.js +0 -317
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/configuration/common/configurations.js +0 -41
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextkey/browser/contextKeyService.js +0 -432
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextkey/common/contextkey.js +0 -1547
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextkey/common/contextkeys.js +0 -18
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextview/browser/contextMenuHandler.js +0 -124
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextview/browser/contextMenuService.js +0 -101
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextview/browser/contextView.js +0 -7
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/contextview/browser/contextViewService.js +0 -72
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/dialogs/common/dialogs.js +0 -2
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/dnd/browser/dnd.js +0 -36
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/editor/common/editor.js +0 -17
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/environment/common/environment.js +0 -2
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/extensions/common/extensions.js +0 -47
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/files/common/files.js +0 -9
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/history/browser/contextScopedHistoryWidget.js +0 -105
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/instantiation/common/descriptors.js +0 -11
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/instantiation/common/extensions.js +0 -15
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/keybinding/common/abstractKeybindingService.js +0 -277
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/keybinding/common/baseResolvedKeybinding.js +0 -53
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/quickinput/browser/commandsQuickAccess.js +0 -354
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/theme/browser/defaultStyles.js +0 -162
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/esm/vs/platform/theme/common/colorRegistry.js +0 -482
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/abap/abap.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/apex/apex.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/azcli/azcli.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/bat/bat.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/bicep/bicep.js +0 -11
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/cameligo/cameligo.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/clojure/clojure.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/coffee/coffee.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/cpp/cpp.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/csharp/csharp.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/csp/csp.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/css/css.js +0 -12
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/cypher/cypher.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/dart/dart.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/dockerfile/dockerfile.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/ecl/ecl.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/elixir/elixir.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/basic-languages/flow9/flow9.js +0 -10
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.js +0 -745
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.de.js +0 -31
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.es.js +0 -31
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.fr.js +0 -29
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.it.js +0 -29
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.ja.js +0 -31
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.js +0 -29
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.ko.js +0 -29
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.ru.js +0 -31
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.zh-cn.js +0 -31
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/editor/editor.main.nls.zh-tw.js +0 -29
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/language/css/cssMode.js +0 -13
- package/dist/src/web/frontend/node_modules/.monaco-editor-MndU045b/min/vs/language/css/cssWorker.js +0 -81
- package/dist/src/web/frontend/node_modules/.multicast-dns-iKseM9bB/cli.js +0 -64
- package/dist/src/web/frontend/node_modules/.multicast-dns-iKseM9bB/example.js +0 -36
- package/dist/src/web/frontend/node_modules/.multicast-dns-iKseM9bB/index.js +0 -205
- package/dist/src/web/frontend/node_modules/.multicast-dns-iKseM9bB/test.js +0 -260
- package/dist/src/web/frontend/node_modules/.nanoid-PAMEV9Hd/async/index.browser.js +0 -34
- package/dist/src/web/frontend/node_modules/.nanoid-PAMEV9Hd/async/index.js +0 -35
- package/dist/src/web/frontend/node_modules/.nanoid-PAMEV9Hd/async/index.native.js +0 -26
- package/dist/src/web/frontend/node_modules/.nanoid-PAMEV9Hd/index.browser.js +0 -34
- package/dist/src/web/frontend/node_modules/.nanoid-PAMEV9Hd/index.js +0 -45
- package/dist/src/web/frontend/node_modules/.nanoid-PAMEV9Hd/nanoid.js +0 -1
- package/dist/src/web/frontend/node_modules/.nanoid-PAMEV9Hd/non-secure/index.js +0 -21
- package/dist/src/web/frontend/node_modules/.nanoid-PAMEV9Hd/url-alphabet/index.js +0 -3
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/bin/nodemon.js +0 -16
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/cli/index.js +0 -49
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/cli/parse.js +0 -230
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/config/command.js +0 -43
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/config/defaults.js +0 -34
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/config/exec.js +0 -234
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/config/index.js +0 -93
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/config/load.js +0 -225
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/help/index.js +0 -27
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/index.js +0 -1
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/monitor/index.js +0 -4
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/monitor/match.js +0 -287
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/monitor/run.js +0 -562
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/monitor/signals.js +0 -34
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/monitor/watch.js +0 -244
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/nodemon.js +0 -317
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/rules/add.js +0 -89
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/rules/index.js +0 -53
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/rules/parse.js +0 -43
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/spawn.js +0 -74
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/utils/bus.js +0 -44
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/utils/clone.js +0 -40
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/utils/colour.js +0 -26
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/utils/index.js +0 -103
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/utils/log.js +0 -82
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/utils/merge.js +0 -47
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/lib/version.js +0 -100
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/node_modules/brace-expansion/index.js +0 -201
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/node_modules/has-flag/index.js +0 -8
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/node_modules/minimatch/minimatch.js +0 -947
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/node_modules/supports-color/browser.js +0 -5
- package/dist/src/web/frontend/node_modules/.nodemon-QcvNKhKT/node_modules/supports-color/index.js +0 -131
- package/dist/src/web/frontend/node_modules/.pidtree-icfat3SQ/bin/pidtree.js +0 -128
- package/dist/src/web/frontend/node_modules/.pidtree-icfat3SQ/index.js +0 -49
- package/dist/src/web/frontend/node_modules/.pidtree-icfat3SQ/lib/bin.js +0 -61
- package/dist/src/web/frontend/node_modules/.pidtree-icfat3SQ/lib/get.js +0 -45
- package/dist/src/web/frontend/node_modules/.pidtree-icfat3SQ/lib/pidtree.js +0 -104
- package/dist/src/web/frontend/node_modules/.pidtree-icfat3SQ/lib/ps.js +0 -47
- package/dist/src/web/frontend/node_modules/.pidtree-icfat3SQ/lib/wmic.js +0 -49
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/doc.js +0 -1270
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/acorn.js +0 -15
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/angular.js +0 -2
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/babel.js +0 -15
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/estree.js +0 -36
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/flow.js +0 -19
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/glimmer.js +0 -29
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/graphql.js +0 -29
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/html.js +0 -22
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/markdown.js +0 -63
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/meriyah.js +0 -4
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/postcss.js +0 -54
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/typescript.js +0 -20
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/plugins/yaml.js +0 -160
- package/dist/src/web/frontend/node_modules/.prettier-ApZm3b7s/standalone.js +0 -34
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/bin/react-scripts.js +0 -58
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/env.js +0 -112
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/getHttpsConfig.js +0 -74
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/jest/babelTransform.js +0 -37
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/jest/cssTransform.js +0 -22
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/jest/fileTransform.js +0 -40
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/modules.js +0 -142
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/paths.js +0 -153
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/webpack/persistentCache/createEnvironmentHash.js +0 -9
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/webpack.config.js +0 -796
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/config/webpackDevServer.config.js +0 -135
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/scripts/build.js +0 -225
- package/dist/src/web/frontend/node_modules/.react-scripts-OTANyoRb/scripts/eject.js +0 -340
|
@@ -10,296 +10,361 @@
|
|
|
10
10
|
* - Circuit breaker for Stop hooks
|
|
11
11
|
* - Configuration validation
|
|
12
12
|
* - Emergency override flags
|
|
13
|
-
*/
|
|
14
|
-
|
|
15
|
-
import
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { printError, printWarning, printSuccess } from '../utils.js';
|
|
16
|
+
import { existsSync, readFileSync } from 'fs';
|
|
17
|
+
import path from 'path';
|
|
18
|
+
|
|
16
19
|
/**
|
|
17
20
|
* Hook Safety Configuration
|
|
18
|
-
*/
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
+
},
|
|
33
40
|
};
|
|
41
|
+
|
|
34
42
|
/**
|
|
35
43
|
* Global hook execution tracking
|
|
36
|
-
*/
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
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
|
+
|
|
65
81
|
// Global instance
|
|
66
82
|
const executionTracker = new HookExecutionTracker();
|
|
83
|
+
|
|
67
84
|
/**
|
|
68
85
|
* Hook Context Manager - Tracks hook execution context
|
|
69
|
-
*/
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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];
|
|
98
119
|
}
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
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];
|
|
105
127
|
}
|
|
128
|
+
}
|
|
106
129
|
}
|
|
130
|
+
|
|
107
131
|
/**
|
|
108
132
|
* Command Validator - Validates commands for hook safety
|
|
109
|
-
*/
|
|
110
|
-
|
|
133
|
+
*/
|
|
134
|
+
export class HookCommandValidator {
|
|
135
|
+
/**
|
|
111
136
|
* Validate if a command is safe to execute from a hook
|
|
112
|
-
*/
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
message: `🚨 Hook recursion limit exceeded! (Depth: ${depth})\n` + `Hook type: ${context.type}\n` + 'Blocking execution to prevent infinite loop.'
|
|
130
|
-
});
|
|
131
|
-
} else {
|
|
132
|
-
warnings.push({
|
|
133
|
-
type: 'POTENTIAL_RECURSION',
|
|
134
|
-
message: `⚠️ WARNING: Claude command in ${context.type} hook (depth: ${depth})\n` + 'This could create recursion. Consider using --skip-hooks flag.'
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
// Check for other dangerous patterns
|
|
139
|
-
if (this.isDangerousPattern(command, hookType)) {
|
|
140
|
-
warnings.push({
|
|
141
|
-
type: 'DANGEROUS_PATTERN',
|
|
142
|
-
message: `⚠️ WARNING: Potentially dangerous hook pattern detected.\n` + 'Review the command and consider safer alternatives.'
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
return {
|
|
146
|
-
warnings,
|
|
147
|
-
errors,
|
|
148
|
-
safe: errors.length === 0
|
|
149
|
-
};
|
|
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
|
+
});
|
|
150
154
|
}
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
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
|
+
}
|
|
161
176
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
/bash.*hook/,
|
|
172
|
-
/sh.*hook/
|
|
173
|
-
];
|
|
174
|
-
return dangerousPatterns.some((pattern)=>pattern.test(command));
|
|
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
|
+
});
|
|
175
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
|
+
}
|
|
176
219
|
}
|
|
220
|
+
|
|
177
221
|
/**
|
|
178
222
|
* Circuit Breaker - Prevents runaway hook execution
|
|
179
|
-
*/
|
|
180
|
-
|
|
223
|
+
*/
|
|
224
|
+
export class HookCircuitBreaker {
|
|
225
|
+
/**
|
|
181
226
|
* Check if hook execution should be allowed
|
|
182
|
-
*/
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
}
|
|
196
|
-
return true;
|
|
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
|
+
);
|
|
197
240
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
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
|
+
);
|
|
201
249
|
}
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
const [sessionId, hookType] = key.split(':');
|
|
207
|
-
return {
|
|
208
|
-
hookType,
|
|
209
|
-
count
|
|
210
|
-
};
|
|
211
|
-
})
|
|
212
|
-
};
|
|
250
|
+
|
|
251
|
+
// Log warnings for concerning patterns
|
|
252
|
+
if (hookType === 'Stop' && executionCount > 1) {
|
|
253
|
+
printWarning(`⚠️ Stop hook execution #${executionCount} detected. Monitor for recursion.`);
|
|
213
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
|
+
}
|
|
214
273
|
}
|
|
274
|
+
|
|
215
275
|
/**
|
|
216
276
|
* Configuration Validator - Validates hook configurations for safety
|
|
217
|
-
*/
|
|
218
|
-
|
|
277
|
+
*/
|
|
278
|
+
export class HookConfigValidator {
|
|
279
|
+
/**
|
|
219
280
|
* Validate Claude Code settings.json for dangerous hook configurations
|
|
220
|
-
*/
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
}
|
|
236
|
-
try {
|
|
237
|
-
const config = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
238
|
-
const validation = this.validateHooksConfig(config.hooks || {});
|
|
239
|
-
return {
|
|
240
|
-
safe: validation.errors.length === 0,
|
|
241
|
-
configPath,
|
|
242
|
-
...validation
|
|
243
|
-
};
|
|
244
|
-
} catch (err) {
|
|
245
|
-
return {
|
|
246
|
-
safe: false,
|
|
247
|
-
error: `Failed to validate configuration: ${err.message}`,
|
|
248
|
-
configPath
|
|
249
|
-
};
|
|
250
|
-
}
|
|
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
|
+
}
|
|
251
296
|
}
|
|
252
|
-
|
|
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
|
+
/**
|
|
253
317
|
* Validate hooks configuration object
|
|
254
|
-
*/
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
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
|
+
}
|
|
268
332
|
}
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
}
|
|
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);
|
|
285
346
|
}
|
|
347
|
+
}
|
|
286
348
|
}
|
|
287
|
-
|
|
288
|
-
warnings,
|
|
289
|
-
errors
|
|
290
|
-
};
|
|
349
|
+
}
|
|
291
350
|
}
|
|
292
|
-
|
|
351
|
+
|
|
352
|
+
return { warnings, errors };
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/**
|
|
293
356
|
* Generate safe configuration recommendations
|
|
294
|
-
*/
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
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: `
|
|
303
368
|
// Instead of this DANGEROUS pattern:
|
|
304
369
|
{
|
|
305
370
|
"Stop": [{
|
|
@@ -315,13 +380,14 @@ const executionTracker = new HookExecutionTracker();
|
|
|
315
380
|
}
|
|
316
381
|
|
|
317
382
|
// Then manually run: claude -c -p "Update history" when needed
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
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: `
|
|
325
391
|
// SAFER: Use PostToolUse for specific operations
|
|
326
392
|
{
|
|
327
393
|
"PostToolUse": [{
|
|
@@ -329,177 +395,195 @@ const executionTracker = new HookExecutionTracker();
|
|
|
329
395
|
"hooks": [{"type": "command", "command": "echo 'File modified' >> ~/.claude/changes.log"}]
|
|
330
396
|
}]
|
|
331
397
|
}
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
}
|
|
335
|
-
return alternatives;
|
|
398
|
+
`,
|
|
399
|
+
});
|
|
336
400
|
}
|
|
401
|
+
|
|
402
|
+
return alternatives;
|
|
403
|
+
}
|
|
337
404
|
}
|
|
405
|
+
|
|
338
406
|
/**
|
|
339
407
|
* Safe Hook Execution Wrapper
|
|
340
|
-
*/
|
|
341
|
-
|
|
408
|
+
*/
|
|
409
|
+
export class SafeHookExecutor {
|
|
410
|
+
/**
|
|
342
411
|
* Safely execute a hook command with all safety checks
|
|
343
|
-
*/
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
success: false,
|
|
368
|
-
blocked: true,
|
|
369
|
-
errors: validation.errors
|
|
370
|
-
};
|
|
371
|
-
}
|
|
372
|
-
// Set hook context for nested calls
|
|
373
|
-
const currentContext = HookContextManager.getContext();
|
|
374
|
-
const newDepth = currentContext.depth + 1;
|
|
375
|
-
HookContextManager.setContext(hookType, newDepth);
|
|
376
|
-
// Execute the command with safety context
|
|
377
|
-
const result = await this.executeCommand(command, options);
|
|
378
|
-
return {
|
|
379
|
-
success: true,
|
|
380
|
-
result
|
|
381
|
-
};
|
|
382
|
-
} catch (err) {
|
|
383
|
-
printError(`Hook execution failed: ${err.message}`);
|
|
384
|
-
return {
|
|
385
|
-
success: false,
|
|
386
|
-
error: err.message
|
|
387
|
-
};
|
|
388
|
-
} finally{
|
|
389
|
-
// Clear context
|
|
390
|
-
HookContextManager.clearContext();
|
|
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);
|
|
391
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();
|
|
392
455
|
}
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
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
|
+
}
|
|
405
468
|
}
|
|
469
|
+
|
|
406
470
|
/**
|
|
407
471
|
* Hook Safety CLI Commands
|
|
408
|
-
*/
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
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
|
+
}
|
|
422
488
|
}
|
|
489
|
+
|
|
423
490
|
async function validateConfigCommand(subArgs, flags) {
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
console.log(`\n${warning.message}`);
|
|
444
|
-
}
|
|
445
|
-
}
|
|
446
|
-
console.log('\n💡 RECOMMENDATIONS:');
|
|
447
|
-
console.log('1. Remove claude commands from Stop hooks');
|
|
448
|
-
console.log('2. Use PostToolUse hooks for specific tools');
|
|
449
|
-
console.log('3. Implement flag-based update patterns');
|
|
450
|
-
console.log('4. Use claude --skip-hooks for manual updates');
|
|
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
|
+
}
|
|
451
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
|
+
}
|
|
452
525
|
}
|
|
526
|
+
|
|
453
527
|
async function statusCommand(subArgs, flags) {
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
console.log('
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
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`);
|
|
476
551
|
}
|
|
552
|
+
} else {
|
|
553
|
+
console.log(' ✅ No hook executions in current session');
|
|
554
|
+
}
|
|
477
555
|
}
|
|
556
|
+
|
|
478
557
|
async function resetCommand(subArgs, flags) {
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
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.');
|
|
484
565
|
}
|
|
566
|
+
|
|
485
567
|
async function safeModeCommand(subArgs, flags) {
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
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
|
+
}
|
|
500
583
|
}
|
|
584
|
+
|
|
501
585
|
function showHookSafetyHelp() {
|
|
502
|
-
|
|
586
|
+
console.log(`
|
|
503
587
|
🛡️ Hook Safety System - Prevent Infinite Loops & Financial Damage
|
|
504
588
|
|
|
505
589
|
USAGE:
|
|
@@ -551,31 +635,37 @@ SAFE ALTERNATIVES:
|
|
|
551
635
|
For more information: https://github.com/ruvnet/claude-flow/issues/166
|
|
552
636
|
`);
|
|
553
637
|
}
|
|
638
|
+
|
|
554
639
|
/**
|
|
555
640
|
* Emergency CLI flags for Claude commands
|
|
556
|
-
*/
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
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';
|
|
564
650
|
}
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
if (context.safeMode) {
|
|
654
|
+
// Add additional safety flags in safe mode
|
|
655
|
+
if (!command.includes('--dry-run')) {
|
|
656
|
+
command += ' --dry-run';
|
|
570
657
|
}
|
|
571
|
-
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
return command;
|
|
572
661
|
}
|
|
662
|
+
|
|
573
663
|
export default {
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
664
|
+
HookContextManager,
|
|
665
|
+
HookCommandValidator,
|
|
666
|
+
HookCircuitBreaker,
|
|
667
|
+
HookConfigValidator,
|
|
668
|
+
SafeHookExecutor,
|
|
669
|
+
hookSafetyCommand,
|
|
670
|
+
addSafetyFlags,
|
|
581
671
|
};
|