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.
- package/.claude-flow-novice/preferences/generation.json +147 -0
- package/.claude-flow-novice/preferences/language-configs/javascript.json +51 -0
- package/.claude-flow-novice/preferences/language-configs/python.json +50 -0
- package/.claude-flow-novice/preferences/language-configs/rust.json +237 -0
- package/.claude-flow-novice/preferences/language-configs/typescript.json +54 -0
- package/.claude-flow-novice/preferences/project-local.json +91 -0
- package/.claude-flow-novice/preferences/resource-delegation.json +120 -0
- package/.claude-flow-novice/preferences/team-shared.json +195 -0
- package/.claude-flow-novice/preferences/user-global.json +247 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-JAVASCRIPT.md +769 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-PYTHON.md +1214 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-RUST.md +475 -0
- package/.claude-flow-novice/templates/claude-md-templates/CLAUDE-TYPESCRIPT.md +851 -0
- package/.claude-flow-novice/templates/claude-md-templates/README.md +263 -0
- package/CLAUDE.md +81 -0
- package/README-NPM.md +0 -0
- package/package.json +11 -7
- package/scripts/build/README.md +167 -0
- package/scripts/build/build-config.js +27 -0
- package/scripts/build/build-prompt-copier.sh +30 -0
- package/scripts/build/performance-monitor.js +869 -0
- package/scripts/build/prepare-publish.js +150 -0
- package/scripts/build/typescript-fixer.js +621 -0
- package/scripts/build/unified-builder.sh +428 -0
- package/scripts/build/update-bin-version.js +32 -0
- package/scripts/dev/README.md +264 -0
- package/scripts/dev/claude-flow-wrapper.sh +35 -0
- package/scripts/dev/claude-monitor.py +419 -0
- package/scripts/dev/claude-sparc.sh +562 -0
- package/scripts/dev/claude-wrapper.sh +17 -0
- package/scripts/dev/demo-phase3-compliance.js +172 -0
- package/scripts/dev/demo-task-system.ts +224 -0
- package/scripts/dev/deployment-validator.js +315 -0
- package/scripts/dev/spawn-claude-terminal.sh +32 -0
- package/scripts/dev/start-portal.sh +506 -0
- package/scripts/dev/start-web-ui.js +15 -0
- package/scripts/dev/stop-portal.sh +311 -0
- package/scripts/dev/validate-examples.ts +288 -0
- package/scripts/dev/validate-phase2.cjs +451 -0
- package/scripts/dev/validate-phase2.js +785 -0
- package/scripts/dev/validate-phase3.cjs +208 -0
- package/scripts/dev/validate-security-remediation.js +1 -0
- package/scripts/legacy/README.md +272 -0
- package/scripts/legacy/batch-fix-ts.sh +54 -0
- package/scripts/legacy/build-migration.sh +105 -0
- package/scripts/legacy/build-monitor.js +209 -0
- package/scripts/legacy/build-with-filter.sh +84 -0
- package/scripts/legacy/build-workaround.sh +71 -0
- package/scripts/legacy/fix-ts-advanced.js +358 -0
- package/scripts/legacy/fix-ts-final.sh +50 -0
- package/scripts/legacy/fix-ts-targeted.sh +49 -0
- package/scripts/legacy/fix-typescript-errors.js +305 -0
- package/scripts/legacy/force-build.sh +63 -0
- package/scripts/legacy/optimize-performance.js +400 -0
- package/scripts/legacy/performance-monitor.js +263 -0
- package/scripts/legacy/performance-monitoring.js +532 -0
- package/scripts/legacy/performance-test-runner.js +645 -0
- package/scripts/legacy/quick-fix-ts.js +281 -0
- package/scripts/legacy/safe-build.sh +63 -0
- package/scripts/migration/README.md +434 -0
- package/scripts/migration/install-arm64.js +78 -0
- package/scripts/migration/install.js +83 -0
- package/scripts/migration/migrate-hooks.js +173 -0
- package/scripts/migration/migration-examples.ts +318 -0
- package/scripts/optimization/build-optimizer.js +438 -0
- package/scripts/optimization/config-validator.js +761 -0
- package/scripts/optimization/test-optimization.js +432 -0
- package/scripts/optimization/unified-activation.js +839 -0
- package/scripts/performance/ACTIVATION_COMMANDS.md +292 -0
- package/scripts/performance/sqlite-enhanced-activation.sh +583 -0
- package/scripts/performance/test-enhanced-backend.sh +504 -0
- package/scripts/performance-test-runner.js +698 -0
- package/scripts/security/README.md +339 -0
- package/scripts/security/install-git-hooks.sh +132 -0
- package/scripts/security/ruv-swarm-safe.js +74 -0
- package/scripts/test/README.md +236 -0
- package/scripts/test/check-links.ts +274 -0
- package/scripts/test/check-performance-regression.ts +168 -0
- package/scripts/test/coverage-report.ts +692 -0
- package/scripts/test/generate-swarm-tests.js +633 -0
- package/scripts/test/integration-test-validation.cjs +253 -0
- package/scripts/test/load-test-swarm.js +576 -0
- package/scripts/test/run-phase3-compliance-tests.js +427 -0
- package/scripts/test/test-batch-tasks.ts +29 -0
- package/scripts/test/test-byzantine-resolution.js +246 -0
- package/scripts/test/test-claude-spawn-options.sh +63 -0
- package/scripts/test/test-cli-wizard.js +331 -0
- package/scripts/test/test-comprehensive.js +401 -0
- package/scripts/test/test-coordination-features.ts +238 -0
- package/scripts/test/test-fallback-systems.js +276 -0
- package/scripts/test/test-init-command.ts +302 -0
- package/scripts/test/test-mcp.ts +251 -0
- package/scripts/test/test-runner.ts +568 -0
- package/scripts/test/test-swarm-integration.sh +92 -0
- package/scripts/test/test-swarm.ts +142 -0
- package/scripts/test/validation-summary.ts +408 -0
- package/scripts/utils/README.md +261 -0
- package/scripts/utils/clean-build-artifacts.sh +94 -0
- package/scripts/utils/cleanup-root.sh +69 -0
- package/scripts/utils/fix-cliffy-imports.js +307 -0
- package/scripts/utils/fix-duplicate-imports.js +114 -0
- package/scripts/utils/fix-error-handling.cjs +70 -0
- package/scripts/utils/fix-import-paths.js +104 -0
- package/scripts/utils/fix-imports.js +116 -0
- package/scripts/utils/fix-shebang.js +78 -0
- package/scripts/utils/fix-test-modules.js +27 -0
- package/scripts/utils/fix-timezone-issue-246.js +200 -0
- package/scripts/utils/fix-ts-comprehensive.py +182 -0
- package/scripts/utils/fix-ts-targeted-batch.js +250 -0
- package/scripts/utils/remove-benchmark-conflicts.sh +140 -0
- package/scripts/utils/simple-test-fixer.js +190 -0
- package/scripts/utils/validate-metrics-structure.cjs +144 -0
- package/scripts/verify-mcp-server.js +86 -0
- package/src/cli/simple-commands/__tests__/agent.test.js +291 -0
- package/src/cli/simple-commands/__tests__/memory.test.js +8 -0
- package/src/cli/simple-commands/__tests__/swarm.test.js +371 -0
- package/src/cli/simple-commands/__tests__/task.test.js +8 -0
- package/src/cli/simple-commands/agent.js +216 -0
- package/src/cli/simple-commands/analysis.js +570 -0
- package/src/cli/simple-commands/automation-executor.js +1603 -0
- package/src/cli/simple-commands/automation.js +627 -0
- package/src/cli/simple-commands/batch-manager.js +338 -0
- package/src/cli/simple-commands/claude-telemetry.js +311 -0
- package/src/cli/simple-commands/claude-track.js +102 -0
- package/src/cli/simple-commands/concurrent-display.js +348 -0
- package/src/cli/simple-commands/config.js +319 -0
- package/src/cli/simple-commands/coordination.js +307 -0
- package/src/cli/simple-commands/enhanced-ui-views.js +654 -0
- package/src/cli/simple-commands/enhanced-webui-complete.js +1038 -0
- package/src/cli/simple-commands/fix-hook-variables.js +363 -0
- package/src/cli/simple-commands/github/gh-coordinator.js +605 -0
- package/src/cli/simple-commands/github/github-api.js +624 -0
- package/src/cli/simple-commands/github/init.js +543 -0
- package/src/cli/simple-commands/github.js +377 -0
- package/src/cli/simple-commands/goal.js +145 -0
- package/src/cli/simple-commands/hive-mind/auto-save-middleware.js +311 -0
- package/src/cli/simple-commands/hive-mind/communication.js +740 -0
- package/src/cli/simple-commands/hive-mind/core.js +1031 -0
- package/src/cli/simple-commands/hive-mind/db-optimizer.js +872 -0
- package/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1364 -0
- package/src/cli/simple-commands/hive-mind/memory.js +1292 -0
- package/src/cli/simple-commands/hive-mind/performance-optimizer.js +618 -0
- package/src/cli/simple-commands/hive-mind/performance-test.js +373 -0
- package/src/cli/simple-commands/hive-mind/queen.js +809 -0
- package/src/cli/simple-commands/hive-mind/session-manager.js +1223 -0
- package/src/cli/simple-commands/hive-mind-optimize.js +361 -0
- package/src/cli/simple-commands/hive-mind-wizard.js +281 -0
- package/src/cli/simple-commands/hive-mind.js +3112 -0
- package/src/cli/simple-commands/hive.js +140 -0
- package/src/cli/simple-commands/hook-safety.js +671 -0
- package/src/cli/simple-commands/hooks.js +1268 -0
- package/src/cli/simple-commands/init/.claude/checkpoints/1756224542.json +7 -0
- package/src/cli/simple-commands/init/.claude/checkpoints/1756224544.json +8 -0
- package/src/cli/simple-commands/init/README.md +106 -0
- package/src/cli/simple-commands/init/VALIDATION_ROLLBACK.md +488 -0
- package/src/cli/simple-commands/init/agent-copier.js +347 -0
- package/src/cli/simple-commands/init/batch-init.js +663 -0
- package/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +438 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +876 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +356 -0
- package/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +501 -0
- package/src/cli/simple-commands/init/claude-commands/slash-commands.js +57 -0
- package/src/cli/simple-commands/init/claude-commands/sparc-commands.js +296 -0
- package/src/cli/simple-commands/init/copy-revised-templates.js +175 -0
- package/src/cli/simple-commands/init/executable-wrapper.js +122 -0
- package/src/cli/simple-commands/init/gitignore-updater.js +137 -0
- package/src/cli/simple-commands/init/help.js +110 -0
- package/src/cli/simple-commands/init/hive-mind-init.js +749 -0
- package/src/cli/simple-commands/init/index.js +1953 -0
- package/src/cli/simple-commands/init/performance-monitor.js +344 -0
- package/src/cli/simple-commands/init/rollback/backup-manager.js +542 -0
- package/src/cli/simple-commands/init/rollback/index.js +399 -0
- package/src/cli/simple-commands/init/rollback/recovery-manager.js +778 -0
- package/src/cli/simple-commands/init/rollback/rollback-executor.js +521 -0
- package/src/cli/simple-commands/init/rollback/state-tracker.js +486 -0
- package/src/cli/simple-commands/init/sparc/roo-readme.js +61 -0
- package/src/cli/simple-commands/init/sparc/roomodes-config.js +102 -0
- package/src/cli/simple-commands/init/sparc/workflows.js +40 -0
- package/src/cli/simple-commands/init/sparc-structure.js +68 -0
- package/src/cli/simple-commands/init/template-copier.js +640 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md +1185 -0
- package/src/cli/simple-commands/init/templates/CLAUDE.md.optimized +265 -0
- package/src/cli/simple-commands/init/templates/claude-flow-universal +81 -0
- package/src/cli/simple-commands/init/templates/claude-flow.bat +18 -0
- package/src/cli/simple-commands/init/templates/claude-flow.ps1 +24 -0
- package/src/cli/simple-commands/init/templates/claude-md.js +1101 -0
- package/src/cli/simple-commands/init/templates/commands/analysis/bottleneck-detect.md +162 -0
- package/src/cli/simple-commands/init/templates/commands/automation/auto-agent.md +122 -0
- package/src/cli/simple-commands/init/templates/commands/coordination/swarm-init.md +85 -0
- package/src/cli/simple-commands/init/templates/commands/github/github-swarm.md +121 -0
- package/src/cli/simple-commands/init/templates/commands/helpers/standard-checkpoint-hooks.sh +179 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/notification.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-command.md +116 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-edit.md +117 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/post-task.md +112 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-command.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-edit.md +113 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-search.md +112 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/pre-task.md +111 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-end.md +118 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-restore.md +118 -0
- package/src/cli/simple-commands/init/templates/commands/hooks/session-start.md +117 -0
- package/src/cli/simple-commands/init/templates/coordination-md.js +340 -0
- package/src/cli/simple-commands/init/templates/coordination.md +16 -0
- package/src/cli/simple-commands/init/templates/enhanced-templates.js +2347 -0
- package/src/cli/simple-commands/init/templates/github-safe-enhanced.js +331 -0
- package/src/cli/simple-commands/init/templates/github-safe.js +106 -0
- package/src/cli/simple-commands/init/templates/memory-bank-md.js +259 -0
- package/src/cli/simple-commands/init/templates/memory-bank.md +16 -0
- package/src/cli/simple-commands/init/templates/readme-files.js +72 -0
- package/src/cli/simple-commands/init/templates/safe-hook-patterns.js +430 -0
- package/src/cli/simple-commands/init/templates/settings.json +109 -0
- package/src/cli/simple-commands/init/templates/settings.json.enhanced +35 -0
- package/src/cli/simple-commands/init/templates/sparc-modes.js +1401 -0
- package/src/cli/simple-commands/init/templates/verification-claude-md.js +432 -0
- package/src/cli/simple-commands/init/validation/config-validator.js +354 -0
- package/src/cli/simple-commands/init/validation/health-checker.js +599 -0
- package/src/cli/simple-commands/init/validation/index.js +388 -0
- package/src/cli/simple-commands/init/validation/mode-validator.js +387 -0
- package/src/cli/simple-commands/init/validation/post-init-validator.js +390 -0
- package/src/cli/simple-commands/init/validation/pre-init-validator.js +290 -0
- package/src/cli/simple-commands/init/validation/test-runner.js +488 -0
- package/src/cli/simple-commands/init.js +4 -0
- package/src/cli/simple-commands/mcp-health.js +163 -0
- package/src/cli/simple-commands/mcp-integration-layer.js +689 -0
- package/src/cli/simple-commands/mcp.js +420 -0
- package/src/cli/simple-commands/memory-consolidation.js +631 -0
- package/src/cli/simple-commands/memory.js +345 -0
- package/src/cli/simple-commands/migrate-hooks.js +63 -0
- package/src/cli/simple-commands/monitor.js +417 -0
- package/src/cli/simple-commands/neural.js +148 -0
- package/src/cli/simple-commands/pair-autofix-only.js +755 -0
- package/src/cli/simple-commands/pair-basic.js +751 -0
- package/src/cli/simple-commands/pair-old.js +623 -0
- package/src/cli/simple-commands/pair-working.js +849 -0
- package/src/cli/simple-commands/pair.js +849 -0
- package/src/cli/simple-commands/performance-hooks.js +149 -0
- package/src/cli/simple-commands/performance-metrics.js +601 -0
- package/src/cli/simple-commands/process-ui-enhanced.js +821 -0
- package/src/cli/simple-commands/process-ui.js +274 -0
- package/src/cli/simple-commands/realtime-update-system.js +659 -0
- package/src/cli/simple-commands/sparc/architecture.js +1750 -0
- package/src/cli/simple-commands/sparc/commands.js +575 -0
- package/src/cli/simple-commands/sparc/completion.js +1831 -0
- package/src/cli/simple-commands/sparc/coordinator.js +1045 -0
- package/src/cli/simple-commands/sparc/index.js +321 -0
- package/src/cli/simple-commands/sparc/phase-base.js +430 -0
- package/src/cli/simple-commands/sparc/pseudocode.js +984 -0
- package/src/cli/simple-commands/sparc/refinement.js +1856 -0
- package/src/cli/simple-commands/sparc/specification.js +736 -0
- package/src/cli/simple-commands/sparc-modes/architect.js +125 -0
- package/src/cli/simple-commands/sparc-modes/ask.js +126 -0
- package/src/cli/simple-commands/sparc-modes/code.js +148 -0
- package/src/cli/simple-commands/sparc-modes/debug.js +112 -0
- package/src/cli/simple-commands/sparc-modes/devops.js +137 -0
- package/src/cli/simple-commands/sparc-modes/docs-writer.js +38 -0
- package/src/cli/simple-commands/sparc-modes/generic.js +34 -0
- package/src/cli/simple-commands/sparc-modes/index.js +201 -0
- package/src/cli/simple-commands/sparc-modes/integration.js +55 -0
- package/src/cli/simple-commands/sparc-modes/mcp.js +38 -0
- package/src/cli/simple-commands/sparc-modes/monitoring.js +38 -0
- package/src/cli/simple-commands/sparc-modes/optimization.js +38 -0
- package/src/cli/simple-commands/sparc-modes/security-review.js +130 -0
- package/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +167 -0
- package/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +38 -0
- package/src/cli/simple-commands/sparc-modes/supabase-admin.js +149 -0
- package/src/cli/simple-commands/sparc-modes/swarm.js +436 -0
- package/src/cli/simple-commands/sparc-modes/tdd.js +112 -0
- package/src/cli/simple-commands/sparc-modes/tutorial.js +277 -0
- package/src/cli/simple-commands/sparc.js +530 -0
- package/src/cli/simple-commands/start-ui.js +147 -0
- package/src/cli/simple-commands/start-wrapper.js +285 -0
- package/src/cli/simple-commands/start.js +2 -0
- package/src/cli/simple-commands/status.js +303 -0
- package/src/cli/simple-commands/stream-chain-clean.js +221 -0
- package/src/cli/simple-commands/stream-chain-fixed.js +89 -0
- package/src/cli/simple-commands/stream-chain-real.js +408 -0
- package/src/cli/simple-commands/stream-chain-working.js +323 -0
- package/src/cli/simple-commands/stream-chain.js +491 -0
- package/src/cli/simple-commands/stream-processor.js +340 -0
- package/src/cli/simple-commands/swarm-executor.js +253 -0
- package/src/cli/simple-commands/swarm-metrics-integration.js +371 -0
- package/src/cli/simple-commands/swarm-ui.js +741 -0
- package/src/cli/simple-commands/swarm-webui-integration.js +311 -0
- package/src/cli/simple-commands/swarm.js +2277 -0
- package/src/cli/simple-commands/task.js +228 -0
- package/src/cli/simple-commands/templates/mle-star-workflow.json +294 -0
- package/src/cli/simple-commands/timestamp-fix.js +104 -0
- package/src/cli/simple-commands/token-tracker.js +372 -0
- package/src/cli/simple-commands/tool-execution-framework.js +555 -0
- package/src/cli/simple-commands/train-and-stream.js +354 -0
- package/src/cli/simple-commands/training-pipeline.js +874 -0
- package/src/cli/simple-commands/training.js +288 -0
- package/src/cli/simple-commands/verification-hooks.js +336 -0
- package/src/cli/simple-commands/verification-integration.js +464 -0
- package/src/cli/simple-commands/verification-training-integration.js +646 -0
- package/src/cli/simple-commands/verification.js +551 -0
- package/src/cli/simple-commands/web-server.js +929 -0
- package/src/cli/simple-commands/webui-validator.js +136 -0
- package/src/language/README.md +503 -0
- package/src/language/claude-md-generator.js +618 -0
- package/src/language/cli.js +422 -0
- package/src/language/example.js +347 -0
- package/src/language/integration-system.js +619 -0
- package/src/language/language-detector.js +581 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Fix hook variable interpolation in Claude Code settings.json files
|
|
5
|
+
* Addresses issue #249 - ${file} and ${command} variables not working
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import fs from 'fs/promises';
|
|
9
|
+
import path from 'path';
|
|
10
|
+
import { existsSync } from 'fs';
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
import { printSuccess, printError, printWarning } from '../utils.js';
|
|
13
|
+
|
|
14
|
+
// Known working variable syntaxes based on Claude Code version
|
|
15
|
+
const VARIABLE_SYNTAXES = {
|
|
16
|
+
legacy: {
|
|
17
|
+
pattern: /\$\{(\w+)\}/g,
|
|
18
|
+
example: '${file}',
|
|
19
|
+
description: 'Legacy syntax (not working in 1.0.51+)',
|
|
20
|
+
},
|
|
21
|
+
environment: {
|
|
22
|
+
pattern: /\$(\w+)/g,
|
|
23
|
+
example: '$CLAUDE_FILE',
|
|
24
|
+
description: 'Environment variable syntax (unverified)',
|
|
25
|
+
},
|
|
26
|
+
jq: {
|
|
27
|
+
pattern: null,
|
|
28
|
+
example: 'jq parsing of JSON input',
|
|
29
|
+
description: 'Official Claude Code approach using jq',
|
|
30
|
+
},
|
|
31
|
+
wrapper: {
|
|
32
|
+
pattern: null,
|
|
33
|
+
example: 'Use wrapper script',
|
|
34
|
+
description: 'Wrapper script approach',
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
// Mapping of our variables to Claude Code environment variables
|
|
39
|
+
const VARIABLE_MAPPINGS = {
|
|
40
|
+
file: ['CLAUDE_EDITED_FILE', 'CLAUDE_FILE', 'EDITED_FILE'],
|
|
41
|
+
command: ['CLAUDE_COMMAND', 'COMMAND', 'CMD'],
|
|
42
|
+
tool: ['CLAUDE_TOOL', 'TOOL_NAME', 'TOOL'],
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Detect which variable syntax works with current Claude Code version
|
|
47
|
+
*/
|
|
48
|
+
async function detectWorkingSyntax() {
|
|
49
|
+
// Based on official Claude Code documentation and testing,
|
|
50
|
+
// JQ parsing is the recommended approach for Claude Code 1.0.51+
|
|
51
|
+
return 'jq';
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Transform hook command to use working variable syntax
|
|
56
|
+
*/
|
|
57
|
+
function transformHookCommand(command, fromSyntax, toSyntax) {
|
|
58
|
+
if (fromSyntax === 'legacy' && toSyntax === 'environment') {
|
|
59
|
+
// Replace ${file} with $CLAUDE_EDITED_FILE
|
|
60
|
+
return command.replace(/\$\{(\w+)\}/g, (match, varName) => {
|
|
61
|
+
const mappings = VARIABLE_MAPPINGS[varName];
|
|
62
|
+
if (mappings && mappings[0]) {
|
|
63
|
+
return `$${mappings[0]}`;
|
|
64
|
+
}
|
|
65
|
+
return match; // Keep unchanged if no mapping
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (fromSyntax === 'legacy' && toSyntax === 'jq') {
|
|
70
|
+
// Transform to use jq parsing of JSON input
|
|
71
|
+
// Extract the actual command and wrap it with jq parsing
|
|
72
|
+
const fileVarMatch = command.match(/\$\{file\}/);
|
|
73
|
+
const commandVarMatch = command.match(/\$\{command\}/);
|
|
74
|
+
|
|
75
|
+
if (fileVarMatch) {
|
|
76
|
+
// Replace ${file} with jq extraction
|
|
77
|
+
const baseCommand = command.replace(/\$\{file\}/g, '{}');
|
|
78
|
+
return `cat | jq -r '.tool_input.file_path // .tool_input.path // ""' | xargs -I {} ${baseCommand}`;
|
|
79
|
+
} else if (commandVarMatch) {
|
|
80
|
+
// Replace ${command} with jq extraction
|
|
81
|
+
const baseCommand = command.replace(/\$\{command\}/g, '{}');
|
|
82
|
+
return `cat | jq -r '.tool_input.command // ""' | xargs -I {} ${baseCommand}`;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Fallback for other variables
|
|
86
|
+
return `cat | jq -r '.' | xargs -I {} ${command.replace(/\$\{(\w+)\}/g, '{}')}`;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (toSyntax === 'wrapper') {
|
|
90
|
+
// Generate wrapper script path
|
|
91
|
+
const scriptName = command.includes('post-edit')
|
|
92
|
+
? 'post-edit-hook.sh'
|
|
93
|
+
: command.includes('pre-edit')
|
|
94
|
+
? 'pre-edit-hook.sh'
|
|
95
|
+
: 'generic-hook.sh';
|
|
96
|
+
return `.claude/hooks/${scriptName}`;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return command;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Create wrapper scripts for hooks
|
|
104
|
+
*/
|
|
105
|
+
async function createWrapperScripts(commands) {
|
|
106
|
+
const hooksDir = '.claude/hooks';
|
|
107
|
+
await fs.mkdir(hooksDir, { recursive: true });
|
|
108
|
+
|
|
109
|
+
const wrapperScripts = new Map();
|
|
110
|
+
|
|
111
|
+
for (const command of commands) {
|
|
112
|
+
if (command.includes('post-edit')) {
|
|
113
|
+
const script = `#!/bin/bash
|
|
114
|
+
# Post-edit hook wrapper
|
|
115
|
+
# Handles variable interpolation for Claude Code hooks
|
|
116
|
+
|
|
117
|
+
# Try to get file from various sources
|
|
118
|
+
FILE="$CLAUDE_EDITED_FILE"
|
|
119
|
+
[ -z "$FILE" ] && FILE="$CLAUDE_FILE"
|
|
120
|
+
[ -z "$FILE" ] && FILE="$1"
|
|
121
|
+
|
|
122
|
+
if [ -n "$FILE" ]; then
|
|
123
|
+
${command.replace('${file}', '"$FILE"')}
|
|
124
|
+
else
|
|
125
|
+
echo "Warning: No file information available for hook" >&2
|
|
126
|
+
fi
|
|
127
|
+
`;
|
|
128
|
+
await fs.writeFile(path.join(hooksDir, 'post-edit-hook.sh'), script, { mode: 0o755 });
|
|
129
|
+
wrapperScripts.set('post-edit', '.claude/hooks/post-edit-hook.sh');
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
return wrapperScripts;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Fix hook variables in a settings.json file
|
|
138
|
+
*/
|
|
139
|
+
async function fixHookVariables(settingsPath, options = {}) {
|
|
140
|
+
const { backup = true, syntax = 'auto' } = options;
|
|
141
|
+
|
|
142
|
+
try {
|
|
143
|
+
// Read settings
|
|
144
|
+
const content = await fs.readFile(settingsPath, 'utf8');
|
|
145
|
+
const settings = JSON.parse(content);
|
|
146
|
+
|
|
147
|
+
if (!settings.hooks) {
|
|
148
|
+
printWarning('No hooks found in settings.json');
|
|
149
|
+
return { success: true, changes: 0 };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Backup if requested
|
|
153
|
+
if (backup) {
|
|
154
|
+
const backupPath = `${settingsPath}.backup-${Date.now()}`;
|
|
155
|
+
await fs.writeFile(backupPath, content);
|
|
156
|
+
console.log(chalk.gray(` Created backup: ${backupPath}`));
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Detect working syntax
|
|
160
|
+
const targetSyntax = syntax === 'auto' ? await detectWorkingSyntax() : syntax;
|
|
161
|
+
console.log(chalk.blue(` Using ${targetSyntax} syntax`));
|
|
162
|
+
|
|
163
|
+
// Collect all commands that need transformation
|
|
164
|
+
const commands = [];
|
|
165
|
+
let changes = 0;
|
|
166
|
+
|
|
167
|
+
// Transform hooks
|
|
168
|
+
const transformHooks = (hooks) => {
|
|
169
|
+
if (Array.isArray(hooks)) {
|
|
170
|
+
return hooks.map((hook) => {
|
|
171
|
+
if (hook.hooks && Array.isArray(hook.hooks)) {
|
|
172
|
+
hook.hooks = hook.hooks.map((h) => {
|
|
173
|
+
if (h.command && h.command.includes('${')) {
|
|
174
|
+
commands.push(h.command);
|
|
175
|
+
const newCommand = transformHookCommand(h.command, 'legacy', targetSyntax);
|
|
176
|
+
if (newCommand !== h.command) {
|
|
177
|
+
changes++;
|
|
178
|
+
return { ...h, command: newCommand };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return h;
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
return hook;
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
return hooks;
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
// Process all hook types
|
|
191
|
+
for (const [hookType, hooks] of Object.entries(settings.hooks)) {
|
|
192
|
+
settings.hooks[hookType] = transformHooks(hooks);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Create wrapper scripts if needed
|
|
196
|
+
if (targetSyntax === 'wrapper' && commands.length > 0) {
|
|
197
|
+
console.log(chalk.blue(' Creating wrapper scripts...'));
|
|
198
|
+
const scripts = await createWrapperScripts(commands);
|
|
199
|
+
console.log(chalk.green(` Created ${scripts.size} wrapper scripts`));
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// Save updated settings
|
|
203
|
+
await fs.writeFile(settingsPath, JSON.stringify(settings, null, 2));
|
|
204
|
+
|
|
205
|
+
return { success: true, changes };
|
|
206
|
+
} catch (error) {
|
|
207
|
+
return { success: false, error: error.message };
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Find all settings.json files
|
|
213
|
+
*/
|
|
214
|
+
async function findSettingsFiles() {
|
|
215
|
+
const locations = [
|
|
216
|
+
'.claude/settings.json',
|
|
217
|
+
'settings.json',
|
|
218
|
+
'.vscode/.claude/settings.json',
|
|
219
|
+
path.join(process.env.HOME || '', '.claude', 'settings.json'),
|
|
220
|
+
];
|
|
221
|
+
|
|
222
|
+
const found = [];
|
|
223
|
+
for (const loc of locations) {
|
|
224
|
+
if (existsSync(loc)) {
|
|
225
|
+
found.push(loc);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return found;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Main command handler
|
|
234
|
+
*/
|
|
235
|
+
export async function fixHookVariablesCommand(args = [], flags = {}) {
|
|
236
|
+
console.log(chalk.bold('\n🔧 Fixing Claude Code Hook Variables\n'));
|
|
237
|
+
|
|
238
|
+
const options = {
|
|
239
|
+
backup: !flags['no-backup'],
|
|
240
|
+
syntax: flags.syntax || 'auto',
|
|
241
|
+
test: flags.test || false,
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
// Find files to fix
|
|
245
|
+
let files = args.length > 0 ? args : await findSettingsFiles();
|
|
246
|
+
|
|
247
|
+
if (files.length === 0) {
|
|
248
|
+
printError('No settings.json files found');
|
|
249
|
+
console.log('\nSearched locations:');
|
|
250
|
+
console.log(' - .claude/settings.json');
|
|
251
|
+
console.log(' - settings.json');
|
|
252
|
+
console.log(' - .vscode/.claude/settings.json');
|
|
253
|
+
console.log(` - ${path.join(process.env.HOME || '', '.claude', 'settings.json')}`);
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
console.log(`Found ${files.length} settings file(s) to process:\n`);
|
|
258
|
+
|
|
259
|
+
let totalChanges = 0;
|
|
260
|
+
let successCount = 0;
|
|
261
|
+
|
|
262
|
+
for (const file of files) {
|
|
263
|
+
console.log(chalk.cyan(`Processing: ${file}`));
|
|
264
|
+
|
|
265
|
+
const result = await fixHookVariables(file, options);
|
|
266
|
+
|
|
267
|
+
if (result.success) {
|
|
268
|
+
successCount++;
|
|
269
|
+
totalChanges += result.changes;
|
|
270
|
+
console.log(chalk.green(` ✅ Fixed ${result.changes} hook commands`));
|
|
271
|
+
} else {
|
|
272
|
+
console.log(chalk.red(` ❌ Error: ${result.error}`));
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
console.log();
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Summary
|
|
279
|
+
console.log(chalk.bold('Summary:'));
|
|
280
|
+
console.log(` Files processed: ${files.length}`);
|
|
281
|
+
console.log(` Successful: ${successCount}`);
|
|
282
|
+
console.log(` Total changes: ${totalChanges}`);
|
|
283
|
+
|
|
284
|
+
if (totalChanges > 0) {
|
|
285
|
+
console.log(chalk.yellow('\n⚠️ Important:'));
|
|
286
|
+
console.log(' 1. Restart Claude Code for changes to take effect');
|
|
287
|
+
console.log(' 2. Test your hooks to ensure they work correctly');
|
|
288
|
+
console.log(' 3. Report any issues to: https://github.com/ruvnet/claude-flow/issues');
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Test mode
|
|
292
|
+
if (options.test) {
|
|
293
|
+
console.log(chalk.blue('\n🧪 Test Mode - Creating test hook...'));
|
|
294
|
+
await createTestHook();
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
/**
|
|
299
|
+
* Create a test hook to verify variables work
|
|
300
|
+
*/
|
|
301
|
+
async function createTestHook() {
|
|
302
|
+
const testSettings = {
|
|
303
|
+
hooks: {
|
|
304
|
+
PostToolUse: [
|
|
305
|
+
{
|
|
306
|
+
matcher: 'Write',
|
|
307
|
+
hooks: [
|
|
308
|
+
{
|
|
309
|
+
type: 'command',
|
|
310
|
+
command:
|
|
311
|
+
'cat | jq -r \'.tool_input.file_path // .tool_input.path // ""\' | xargs -I {} echo "Hook test - File: {}" >> .claude/hook-test.log',
|
|
312
|
+
},
|
|
313
|
+
],
|
|
314
|
+
},
|
|
315
|
+
],
|
|
316
|
+
},
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
await fs.mkdir('.claude', { recursive: true });
|
|
320
|
+
await fs.writeFile('.claude/test-settings.json', JSON.stringify(testSettings, null, 2));
|
|
321
|
+
|
|
322
|
+
console.log('Created test configuration at: .claude/test-settings.json');
|
|
323
|
+
console.log('\nTo test:');
|
|
324
|
+
console.log(' 1. Copy .claude/test-settings.json to .claude/settings.json');
|
|
325
|
+
console.log(' 2. Open Claude Code');
|
|
326
|
+
console.log(' 3. Create or edit any file');
|
|
327
|
+
console.log(' 4. Check .claude/hook-test.log for output');
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// Export command configuration
|
|
331
|
+
export const fixHookVariablesCommandConfig = {
|
|
332
|
+
description: 'Fix variable interpolation in Claude Code hooks (${file} syntax)',
|
|
333
|
+
usage: 'fix-hook-variables [settings-file...]',
|
|
334
|
+
options: [
|
|
335
|
+
{ flag: '--no-backup', description: 'Skip creating backup files' },
|
|
336
|
+
{ flag: '--syntax <type>', description: 'Force specific syntax: environment, jq, wrapper' },
|
|
337
|
+
{ flag: '--test', description: 'Create test hook configuration' },
|
|
338
|
+
],
|
|
339
|
+
examples: [
|
|
340
|
+
'claude-flow fix-hook-variables',
|
|
341
|
+
'claude-flow fix-hook-variables .claude/settings.json',
|
|
342
|
+
'claude-flow fix-hook-variables --syntax wrapper',
|
|
343
|
+
'claude-flow fix-hook-variables --test',
|
|
344
|
+
],
|
|
345
|
+
details: `
|
|
346
|
+
Fixes the \${file} and \${command} variable interpolation issue in Claude Code hooks.
|
|
347
|
+
|
|
348
|
+
This command will:
|
|
349
|
+
• Detect your Claude Code version
|
|
350
|
+
• Transform hook commands to use working variable syntax
|
|
351
|
+
• Create wrapper scripts if needed
|
|
352
|
+
• Backup original settings files
|
|
353
|
+
|
|
354
|
+
Available syntaxes:
|
|
355
|
+
• environment: Use environment variables like $CLAUDE_EDITED_FILE (unverified)
|
|
356
|
+
• jq: Use official jq JSON parsing approach (recommended)
|
|
357
|
+
• wrapper: Create wrapper scripts to handle variables
|
|
358
|
+
|
|
359
|
+
Note: The 'jq' syntax is based on official Claude Code documentation and is likely
|
|
360
|
+
the most reliable approach for Claude Code 1.0.51+.
|
|
361
|
+
|
|
362
|
+
For more information: https://github.com/ruvnet/claude-flow/issues/249`,
|
|
363
|
+
};
|