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,338 @@
|
|
|
1
|
+
// batch-manager.js - Batch configuration management utility
|
|
2
|
+
import { printSuccess, printError, printInfo, printWarning } from '../utils.js';
|
|
3
|
+
import { promises as fs } from 'fs';
|
|
4
|
+
import { PROJECT_TEMPLATES, ENVIRONMENT_CONFIGS } from './init/batch-init.js';
|
|
5
|
+
import { cwd, exit, existsSync } from '../node-compat.js';
|
|
6
|
+
|
|
7
|
+
export async function batchManagerCommand(subArgs, flags) {
|
|
8
|
+
const command = subArgs[0];
|
|
9
|
+
|
|
10
|
+
switch (command) {
|
|
11
|
+
case 'create-config':
|
|
12
|
+
return await createBatchConfig(subArgs.slice(1), flags);
|
|
13
|
+
case 'validate-config':
|
|
14
|
+
return await validateBatchConfig(subArgs.slice(1), flags);
|
|
15
|
+
case 'list-templates':
|
|
16
|
+
return listTemplates();
|
|
17
|
+
case 'list-environments':
|
|
18
|
+
return listEnvironments();
|
|
19
|
+
case 'estimate':
|
|
20
|
+
return await estimateBatchOperation(subArgs.slice(1), flags);
|
|
21
|
+
case 'help':
|
|
22
|
+
default:
|
|
23
|
+
return showBatchManagerHelp();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function createBatchConfig(args, flags) {
|
|
28
|
+
const outputFile = args[0] || 'batch-config.json';
|
|
29
|
+
const interactive = flags.interactive || flags.i;
|
|
30
|
+
|
|
31
|
+
if (interactive) {
|
|
32
|
+
return await createInteractiveConfig(outputFile);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Create basic template
|
|
36
|
+
const config = {
|
|
37
|
+
projects: ['project1', 'project2', 'project3'],
|
|
38
|
+
baseOptions: {
|
|
39
|
+
sparc: true,
|
|
40
|
+
parallel: true,
|
|
41
|
+
maxConcurrency: 5,
|
|
42
|
+
template: 'web-api',
|
|
43
|
+
environments: ['dev'],
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
await fs.writeFile(outputFile, JSON.stringify(config, null, 2, 'utf8'));
|
|
49
|
+
printSuccess(`Created batch configuration template: ${outputFile}`);
|
|
50
|
+
console.log('Edit the file to customize your batch initialization setup.');
|
|
51
|
+
} catch (error) {
|
|
52
|
+
printError(`Failed to create config file: ${error.message}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
async function createInteractiveConfig(outputFile) {
|
|
57
|
+
console.log('š Interactive Batch Configuration Creator');
|
|
58
|
+
console.log('==========================================\n');
|
|
59
|
+
|
|
60
|
+
// This would require a proper CLI prompt library in a real implementation
|
|
61
|
+
// For now, we'll create a comprehensive template with comments
|
|
62
|
+
const config = {
|
|
63
|
+
_comment: 'Batch initialization configuration',
|
|
64
|
+
_templates: Object.keys(PROJECT_TEMPLATES),
|
|
65
|
+
_environments: Object.keys(ENVIRONMENT_CONFIGS),
|
|
66
|
+
|
|
67
|
+
baseOptions: {
|
|
68
|
+
sparc: true,
|
|
69
|
+
parallel: true,
|
|
70
|
+
maxConcurrency: 5,
|
|
71
|
+
force: false,
|
|
72
|
+
minimal: false,
|
|
73
|
+
progressTracking: true,
|
|
74
|
+
},
|
|
75
|
+
|
|
76
|
+
projects: {
|
|
77
|
+
_simple_list: ['project1', 'project2', 'project3'],
|
|
78
|
+
_or_use_projectConfigs_below: 'for individual customization',
|
|
79
|
+
},
|
|
80
|
+
|
|
81
|
+
projectConfigs: {
|
|
82
|
+
'example-api': {
|
|
83
|
+
template: 'web-api',
|
|
84
|
+
environment: 'dev',
|
|
85
|
+
customConfig: {
|
|
86
|
+
database: 'postgresql',
|
|
87
|
+
auth: 'jwt',
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
'example-frontend': {
|
|
91
|
+
template: 'react-app',
|
|
92
|
+
environment: 'dev',
|
|
93
|
+
customConfig: {
|
|
94
|
+
ui: 'material-ui',
|
|
95
|
+
state: 'redux',
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
try {
|
|
102
|
+
await fs.writeFile(outputFile, JSON.stringify(config, null, 2, 'utf8'));
|
|
103
|
+
printSuccess(`Created interactive batch configuration: ${outputFile}`);
|
|
104
|
+
console.log('\nNext steps:');
|
|
105
|
+
console.log('1. Edit the configuration file to match your needs');
|
|
106
|
+
console.log('2. Remove the "_comment" and example entries');
|
|
107
|
+
console.log('3. Use either "projects" array OR "projectConfigs" object');
|
|
108
|
+
console.log(`4. Run: claude-flow init --config ${outputFile}`);
|
|
109
|
+
} catch (error) {
|
|
110
|
+
printError(`Failed to create interactive config: ${error.message}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function validateBatchConfig(args, flags) {
|
|
115
|
+
const configFile = args[0];
|
|
116
|
+
|
|
117
|
+
if (!configFile) {
|
|
118
|
+
printError('Please specify a configuration file to validate');
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
try {
|
|
123
|
+
const content = await fs.readFile(configFile, 'utf8');
|
|
124
|
+
const config = JSON.parse(content);
|
|
125
|
+
|
|
126
|
+
console.log(`š Validating batch configuration: ${configFile}`);
|
|
127
|
+
console.log('================================================\n');
|
|
128
|
+
|
|
129
|
+
const issues = [];
|
|
130
|
+
const warnings = [];
|
|
131
|
+
|
|
132
|
+
// Validate structure
|
|
133
|
+
if (!config.projects && !config.projectConfigs) {
|
|
134
|
+
issues.push('Missing "projects" array or "projectConfigs" object');
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (config.projects && config.projectConfigs) {
|
|
138
|
+
warnings.push(
|
|
139
|
+
'Both "projects" and "projectConfigs" specified. "projectConfigs" will take precedence.',
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Validate base options
|
|
144
|
+
if (config.baseOptions) {
|
|
145
|
+
const { maxConcurrency, template, environments } = config.baseOptions;
|
|
146
|
+
|
|
147
|
+
if (maxConcurrency && (maxConcurrency < 1 || maxConcurrency > 20)) {
|
|
148
|
+
issues.push('maxConcurrency must be between 1 and 20');
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (template && !PROJECT_TEMPLATES[template]) {
|
|
152
|
+
issues.push(
|
|
153
|
+
`Unknown template: ${template}. Available: ${Object.keys(PROJECT_TEMPLATES).join(', ')}`,
|
|
154
|
+
);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (environments) {
|
|
158
|
+
for (const env of environments) {
|
|
159
|
+
if (!ENVIRONMENT_CONFIGS[env]) {
|
|
160
|
+
issues.push(
|
|
161
|
+
`Unknown environment: ${env}. Available: ${Object.keys(ENVIRONMENT_CONFIGS).join(', ')}`,
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Validate project configs
|
|
169
|
+
if (config.projectConfigs) {
|
|
170
|
+
for (const [projectName, projectConfig] of Object.entries(config.projectConfigs)) {
|
|
171
|
+
if (projectConfig.template && !PROJECT_TEMPLATES[projectConfig.template]) {
|
|
172
|
+
issues.push(`Project ${projectName}: Unknown template ${projectConfig.template}`);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
if (projectConfig.environment && !ENVIRONMENT_CONFIGS[projectConfig.environment]) {
|
|
176
|
+
issues.push(`Project ${projectName}: Unknown environment ${projectConfig.environment}`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// Report results
|
|
182
|
+
if (issues.length === 0) {
|
|
183
|
+
printSuccess('ā
Configuration is valid!');
|
|
184
|
+
|
|
185
|
+
if (warnings.length > 0) {
|
|
186
|
+
console.log('\nā ļø Warnings:');
|
|
187
|
+
warnings.forEach((warning) => console.log(` - ${warning}`));
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Summary
|
|
191
|
+
console.log('\nš Configuration Summary:');
|
|
192
|
+
const projectCount = config.projects
|
|
193
|
+
? config.projects.length
|
|
194
|
+
: config.projectConfigs
|
|
195
|
+
? Object.keys(config.projectConfigs).length
|
|
196
|
+
: 0;
|
|
197
|
+
console.log(` Projects: ${projectCount}`);
|
|
198
|
+
|
|
199
|
+
if (config.baseOptions) {
|
|
200
|
+
console.log(` Parallel: ${config.baseOptions.parallel ? 'Yes' : 'No'}`);
|
|
201
|
+
console.log(` Max Concurrency: ${config.baseOptions.maxConcurrency || 5}`);
|
|
202
|
+
console.log(` SPARC: ${config.baseOptions.sparc ? 'Enabled' : 'Disabled'}`);
|
|
203
|
+
console.log(` Template: ${config.baseOptions.template || 'default'}`);
|
|
204
|
+
}
|
|
205
|
+
} else {
|
|
206
|
+
printError('ā Configuration has issues:');
|
|
207
|
+
issues.forEach((issue) => console.error(` - ${issue}`));
|
|
208
|
+
|
|
209
|
+
if (warnings.length > 0) {
|
|
210
|
+
console.log('\nā ļø Warnings:');
|
|
211
|
+
warnings.forEach((warning) => console.log(` - ${warning}`));
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
} catch (error) {
|
|
215
|
+
if (error instanceof Deno.errors.NotFound) {
|
|
216
|
+
printError(`Configuration file not found: ${configFile}`);
|
|
217
|
+
} else if (error instanceof SyntaxError) {
|
|
218
|
+
printError(`Invalid JSON in configuration file: ${error.message}`);
|
|
219
|
+
} else {
|
|
220
|
+
printError(`Failed to validate configuration: ${error.message}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function listTemplates() {
|
|
226
|
+
console.log('š Available Project Templates');
|
|
227
|
+
console.log('==============================\n');
|
|
228
|
+
|
|
229
|
+
for (const [key, template] of Object.entries(PROJECT_TEMPLATES)) {
|
|
230
|
+
console.log(`šļø ${key}`);
|
|
231
|
+
console.log(` Name: ${template.name}`);
|
|
232
|
+
console.log(` Description: ${template.description}`);
|
|
233
|
+
console.log(` Extra Directories: ${template.extraDirs ? template.extraDirs.length : 0}`);
|
|
234
|
+
console.log(
|
|
235
|
+
` Extra Files: ${template.extraFiles ? Object.keys(template.extraFiles).length : 0}`,
|
|
236
|
+
);
|
|
237
|
+
console.log();
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function listEnvironments() {
|
|
242
|
+
console.log('š Available Environment Configurations');
|
|
243
|
+
console.log('=======================================\n');
|
|
244
|
+
|
|
245
|
+
for (const [key, env] of Object.entries(ENVIRONMENT_CONFIGS)) {
|
|
246
|
+
console.log(`āļø ${key}`);
|
|
247
|
+
console.log(` Name: ${env.name}`);
|
|
248
|
+
console.log(` Features: ${env.features.join(', ')}`);
|
|
249
|
+
console.log(` Config Variables: ${Object.keys(env.config).length}`);
|
|
250
|
+
console.log();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
async function estimateBatchOperation(args, flags) {
|
|
255
|
+
const configFile = args[0];
|
|
256
|
+
|
|
257
|
+
if (!configFile) {
|
|
258
|
+
printError('Please specify a configuration file to estimate');
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
try {
|
|
263
|
+
const content = await fs.readFile(configFile, 'utf8');
|
|
264
|
+
const config = JSON.parse(content);
|
|
265
|
+
|
|
266
|
+
console.log('ā±ļø Batch Operation Estimation');
|
|
267
|
+
console.log('=============================\n');
|
|
268
|
+
|
|
269
|
+
let projectCount = 0;
|
|
270
|
+
let totalEnvironments = 0;
|
|
271
|
+
|
|
272
|
+
if (config.projects) {
|
|
273
|
+
projectCount = config.projects.length;
|
|
274
|
+
const environments = config.baseOptions?.environments || ['dev'];
|
|
275
|
+
totalEnvironments = projectCount * environments.length;
|
|
276
|
+
} else if (config.projectConfigs) {
|
|
277
|
+
projectCount = Object.keys(config.projectConfigs).length;
|
|
278
|
+
totalEnvironments = projectCount; // Each project has its own environment
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
const parallel = config.baseOptions?.parallel !== false;
|
|
282
|
+
const maxConcurrency = config.baseOptions?.maxConcurrency || 5;
|
|
283
|
+
const avgTimePerProject = 15; // seconds estimate
|
|
284
|
+
|
|
285
|
+
const sequentialTime = totalEnvironments * avgTimePerProject;
|
|
286
|
+
const parallelTime = parallel
|
|
287
|
+
? Math.ceil(totalEnvironments / maxConcurrency) * avgTimePerProject
|
|
288
|
+
: sequentialTime;
|
|
289
|
+
|
|
290
|
+
console.log(`š Project Count: ${projectCount}`);
|
|
291
|
+
console.log(`š Total Environments: ${totalEnvironments}`);
|
|
292
|
+
console.log(`ā” Parallel Processing: ${parallel ? 'Enabled' : 'Disabled'}`);
|
|
293
|
+
console.log(`š Max Concurrency: ${maxConcurrency}`);
|
|
294
|
+
console.log();
|
|
295
|
+
console.log(`ā±ļø Estimated Time:`);
|
|
296
|
+
console.log(` Sequential: ~${Math.ceil(sequentialTime / 60)} minutes`);
|
|
297
|
+
console.log(` Parallel: ~${Math.ceil(parallelTime / 60)} minutes`);
|
|
298
|
+
console.log(` Time Savings: ${Math.ceil((sequentialTime - parallelTime) / 60)} minutes`);
|
|
299
|
+
console.log();
|
|
300
|
+
console.log(`š¾ Estimated Disk Usage:`);
|
|
301
|
+
console.log(` Per Project: ~50-200 MB`);
|
|
302
|
+
console.log(` Total: ~${Math.ceil((totalEnvironments * 125) / 1024)} GB`);
|
|
303
|
+
} catch (error) {
|
|
304
|
+
printError(`Failed to estimate batch operation: ${error.message}`);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
function showBatchManagerHelp() {
|
|
309
|
+
console.log('š ļø Batch Manager - Configuration and Estimation Tools');
|
|
310
|
+
console.log('====================================================\n');
|
|
311
|
+
|
|
312
|
+
console.log('USAGE:');
|
|
313
|
+
console.log(' claude-flow batch <command> [options]\n');
|
|
314
|
+
|
|
315
|
+
console.log('COMMANDS:');
|
|
316
|
+
console.log(' create-config [file] Create batch configuration template');
|
|
317
|
+
console.log(' validate-config <file> Validate batch configuration file');
|
|
318
|
+
console.log(' list-templates Show available project templates');
|
|
319
|
+
console.log(' list-environments Show available environment configs');
|
|
320
|
+
console.log(' estimate <config> Estimate time and resources for batch operation');
|
|
321
|
+
console.log(' help Show this help message\n');
|
|
322
|
+
|
|
323
|
+
console.log('OPTIONS:');
|
|
324
|
+
console.log(' --interactive, -i Create interactive configuration');
|
|
325
|
+
console.log(' --help, -h Show command help\n');
|
|
326
|
+
|
|
327
|
+
console.log('EXAMPLES:');
|
|
328
|
+
console.log(' claude-flow batch create-config my-batch.json');
|
|
329
|
+
console.log(' claude-flow batch create-config --interactive');
|
|
330
|
+
console.log(' claude-flow batch validate-config my-batch.json');
|
|
331
|
+
console.log(' claude-flow batch estimate my-batch.json');
|
|
332
|
+
console.log(' claude-flow batch list-templates');
|
|
333
|
+
console.log(' claude-flow batch list-environments\n');
|
|
334
|
+
|
|
335
|
+
console.log('INTEGRATION:');
|
|
336
|
+
console.log(' Use created configs with: claude-flow init --config <file>');
|
|
337
|
+
console.log(' Or batch init directly: claude-flow init --batch-init project1,project2');
|
|
338
|
+
}
|
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Claude Code Telemetry Integration
|
|
5
|
+
* Captures real token usage from Claude Code CLI
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { spawn } from 'child_process';
|
|
9
|
+
import fs from 'fs/promises';
|
|
10
|
+
import path from 'path';
|
|
11
|
+
import os from 'os';
|
|
12
|
+
import readline from 'readline';
|
|
13
|
+
import { trackTokens } from './token-tracker.js';
|
|
14
|
+
|
|
15
|
+
// Claude session data locations (platform-specific)
|
|
16
|
+
const CLAUDE_DATA_PATHS = [
|
|
17
|
+
path.join(os.homedir(), '.claude', 'sessions'),
|
|
18
|
+
path.join(os.homedir(), '.config', 'claude', 'sessions'),
|
|
19
|
+
path.join(os.homedir(), 'Library', 'Application Support', 'Claude', 'sessions'),
|
|
20
|
+
];
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Parse Claude session JSONL files for token usage
|
|
24
|
+
*/
|
|
25
|
+
async function parseClaudeSessionData(sessionId) {
|
|
26
|
+
for (const dataPath of CLAUDE_DATA_PATHS) {
|
|
27
|
+
try {
|
|
28
|
+
const sessionFile = path.join(dataPath, `${sessionId}.jsonl`);
|
|
29
|
+
const exists = await fs
|
|
30
|
+
.access(sessionFile)
|
|
31
|
+
.then(() => true)
|
|
32
|
+
.catch(() => false);
|
|
33
|
+
|
|
34
|
+
if (!exists) continue;
|
|
35
|
+
|
|
36
|
+
const content = await fs.readFile(sessionFile, 'utf-8');
|
|
37
|
+
const lines = content.trim().split('\n');
|
|
38
|
+
|
|
39
|
+
let totalInput = 0;
|
|
40
|
+
let totalOutput = 0;
|
|
41
|
+
|
|
42
|
+
for (const line of lines) {
|
|
43
|
+
try {
|
|
44
|
+
const data = JSON.parse(line);
|
|
45
|
+
if (data.usage) {
|
|
46
|
+
totalInput += data.usage.input_tokens || 0;
|
|
47
|
+
totalOutput += data.usage.output_tokens || 0;
|
|
48
|
+
}
|
|
49
|
+
} catch (e) {
|
|
50
|
+
// Skip invalid JSON lines
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
return { inputTokens: totalInput, outputTokens: totalOutput };
|
|
55
|
+
} catch (error) {
|
|
56
|
+
// Continue to next path
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Extract token usage from Claude CLI output
|
|
65
|
+
*/
|
|
66
|
+
function parseClaudeOutput(output) {
|
|
67
|
+
const tokenRegex = /(\d+)\s+tokens?\s+\((input|output|total)\)/gi;
|
|
68
|
+
const costRegex = /\$(\d+\.\d+)/g;
|
|
69
|
+
|
|
70
|
+
const tokens = { input: 0, output: 0, total: 0 };
|
|
71
|
+
const costs = [];
|
|
72
|
+
|
|
73
|
+
let match;
|
|
74
|
+
while ((match = tokenRegex.exec(output)) !== null) {
|
|
75
|
+
const count = parseInt(match[1]);
|
|
76
|
+
const type = match[2].toLowerCase();
|
|
77
|
+
tokens[type] = count;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
while ((match = costRegex.exec(output)) !== null) {
|
|
81
|
+
costs.push(parseFloat(match[1]));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
return { tokens, costs };
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Wrap Claude CLI execution with telemetry
|
|
89
|
+
*/
|
|
90
|
+
export async function runClaudeWithTelemetry(args, options = {}) {
|
|
91
|
+
const sessionId = options.sessionId || `claude-${Date.now()}`;
|
|
92
|
+
const agentType = options.agentType || 'claude-cli';
|
|
93
|
+
const command = args.join(' ');
|
|
94
|
+
|
|
95
|
+
// Enable telemetry environment variables
|
|
96
|
+
const env = {
|
|
97
|
+
...process.env,
|
|
98
|
+
CLAUDE_CODE_ENABLE_TELEMETRY: '1',
|
|
99
|
+
OTEL_METRICS_EXPORTER: process.env.OTEL_METRICS_EXPORTER || 'console',
|
|
100
|
+
OTEL_LOGS_EXPORTER: process.env.OTEL_LOGS_EXPORTER || 'console',
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
return new Promise((resolve, reject) => {
|
|
104
|
+
const claude = spawn('claude', args, {
|
|
105
|
+
env,
|
|
106
|
+
stdio: ['inherit', 'pipe', 'pipe'],
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
let stdout = '';
|
|
110
|
+
let stderr = '';
|
|
111
|
+
|
|
112
|
+
// Create readline interface for real-time output
|
|
113
|
+
const rlOut = readline.createInterface({
|
|
114
|
+
input: claude.stdout,
|
|
115
|
+
terminal: false,
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
const rlErr = readline.createInterface({
|
|
119
|
+
input: claude.stderr,
|
|
120
|
+
terminal: false,
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
rlOut.on('line', (line) => {
|
|
124
|
+
console.log(line);
|
|
125
|
+
stdout += line + '\n';
|
|
126
|
+
|
|
127
|
+
// Look for token usage in real-time
|
|
128
|
+
const usage = parseClaudeOutput(line);
|
|
129
|
+
if (usage.tokens.input > 0 || usage.tokens.output > 0) {
|
|
130
|
+
trackTokens({
|
|
131
|
+
sessionId,
|
|
132
|
+
agentType,
|
|
133
|
+
command,
|
|
134
|
+
inputTokens: usage.tokens.input,
|
|
135
|
+
outputTokens: usage.tokens.output,
|
|
136
|
+
metadata: { costs: usage.costs },
|
|
137
|
+
}).catch(console.error);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
rlErr.on('line', (line) => {
|
|
142
|
+
console.error(line);
|
|
143
|
+
stderr += line + '\n';
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
claude.on('exit', async (code) => {
|
|
147
|
+
// Try to parse session data after completion
|
|
148
|
+
const sessionData = await parseClaudeSessionData(sessionId);
|
|
149
|
+
if (sessionData) {
|
|
150
|
+
await trackTokens({
|
|
151
|
+
sessionId,
|
|
152
|
+
agentType,
|
|
153
|
+
command,
|
|
154
|
+
inputTokens: sessionData.inputTokens,
|
|
155
|
+
outputTokens: sessionData.outputTokens,
|
|
156
|
+
metadata: { source: 'session_file' },
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Also parse full output for any missed tokens
|
|
161
|
+
const fullUsage = parseClaudeOutput(stdout + stderr);
|
|
162
|
+
if (fullUsage.tokens.input > 0 || fullUsage.tokens.output > 0) {
|
|
163
|
+
await trackTokens({
|
|
164
|
+
sessionId,
|
|
165
|
+
agentType,
|
|
166
|
+
command,
|
|
167
|
+
inputTokens: fullUsage.tokens.input,
|
|
168
|
+
outputTokens: fullUsage.tokens.output,
|
|
169
|
+
metadata: { source: 'output_parse', costs: fullUsage.costs },
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
resolve({ code, stdout, stderr });
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
claude.on('error', reject);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Monitor Claude session for token usage
|
|
182
|
+
*/
|
|
183
|
+
export async function monitorClaudeSession(sessionId, interval = 5000) {
|
|
184
|
+
console.log(`š Monitoring Claude session: ${sessionId}`);
|
|
185
|
+
console.log(` Checking every ${interval / 1000} seconds for token updates...\n`);
|
|
186
|
+
|
|
187
|
+
let lastTokens = { input: 0, output: 0 };
|
|
188
|
+
|
|
189
|
+
const monitor = setInterval(async () => {
|
|
190
|
+
const data = await parseClaudeSessionData(sessionId);
|
|
191
|
+
|
|
192
|
+
if (data) {
|
|
193
|
+
const inputDiff = data.inputTokens - lastTokens.input;
|
|
194
|
+
const outputDiff = data.outputTokens - lastTokens.output;
|
|
195
|
+
|
|
196
|
+
if (inputDiff > 0 || outputDiff > 0) {
|
|
197
|
+
console.log(`š Token Update Detected:`);
|
|
198
|
+
console.log(` Input: +${inputDiff} (Total: ${data.inputTokens})`);
|
|
199
|
+
console.log(` Output: +${outputDiff} (Total: ${data.outputTokens})`);
|
|
200
|
+
|
|
201
|
+
await trackTokens({
|
|
202
|
+
sessionId,
|
|
203
|
+
agentType: 'claude-monitor',
|
|
204
|
+
command: 'session_monitor',
|
|
205
|
+
inputTokens: inputDiff,
|
|
206
|
+
outputTokens: outputDiff,
|
|
207
|
+
metadata: {
|
|
208
|
+
totalInput: data.inputTokens,
|
|
209
|
+
totalOutput: data.outputTokens,
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
lastTokens = data;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}, interval);
|
|
217
|
+
|
|
218
|
+
// Return stop function
|
|
219
|
+
return () => {
|
|
220
|
+
clearInterval(monitor);
|
|
221
|
+
console.log(`\nā
Stopped monitoring session: ${sessionId}`);
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Extract token usage from /cost command
|
|
227
|
+
*/
|
|
228
|
+
export async function extractCostCommand() {
|
|
229
|
+
return new Promise((resolve, reject) => {
|
|
230
|
+
const claude = spawn('claude', ['/cost'], {
|
|
231
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
claude.stdin.write('\n');
|
|
235
|
+
claude.stdin.end();
|
|
236
|
+
|
|
237
|
+
let output = '';
|
|
238
|
+
|
|
239
|
+
claude.stdout.on('data', (data) => {
|
|
240
|
+
output += data.toString();
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
claude.stderr.on('data', (data) => {
|
|
244
|
+
output += data.toString();
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
claude.on('exit', () => {
|
|
248
|
+
const usage = parseClaudeOutput(output);
|
|
249
|
+
resolve(usage);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
claude.on('error', reject);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// CLI interface
|
|
257
|
+
if (import.meta.url === `file://${process.argv[1]}`) {
|
|
258
|
+
const command = process.argv[2];
|
|
259
|
+
|
|
260
|
+
switch (command) {
|
|
261
|
+
case 'wrap':
|
|
262
|
+
// Wrap Claude command with telemetry
|
|
263
|
+
const claudeArgs = process.argv.slice(3);
|
|
264
|
+
runClaudeWithTelemetry(claudeArgs)
|
|
265
|
+
.then((result) => process.exit(result.code))
|
|
266
|
+
.catch((error) => {
|
|
267
|
+
console.error('Error:', error);
|
|
268
|
+
process.exit(1);
|
|
269
|
+
});
|
|
270
|
+
break;
|
|
271
|
+
|
|
272
|
+
case 'monitor':
|
|
273
|
+
// Monitor a session
|
|
274
|
+
const sessionId = process.argv[3] || 'current';
|
|
275
|
+
const stopMonitor = await monitorClaudeSession(sessionId);
|
|
276
|
+
|
|
277
|
+
// Handle graceful shutdown
|
|
278
|
+
process.on('SIGINT', () => {
|
|
279
|
+
stopMonitor();
|
|
280
|
+
process.exit(0);
|
|
281
|
+
});
|
|
282
|
+
break;
|
|
283
|
+
|
|
284
|
+
case 'cost':
|
|
285
|
+
// Extract current session cost
|
|
286
|
+
const costData = await extractCostCommand();
|
|
287
|
+
console.log('\nš Current Session Usage:');
|
|
288
|
+
console.log(` Input Tokens: ${costData.tokens.input || 0}`);
|
|
289
|
+
console.log(` Output Tokens: ${costData.tokens.output || 0}`);
|
|
290
|
+
console.log(` Total Tokens: ${costData.tokens.total || 0}`);
|
|
291
|
+
if (costData.costs.length > 0) {
|
|
292
|
+
console.log(` Estimated Cost: $${costData.costs[0]}`);
|
|
293
|
+
}
|
|
294
|
+
break;
|
|
295
|
+
|
|
296
|
+
default:
|
|
297
|
+
console.log(`
|
|
298
|
+
Claude Telemetry Integration
|
|
299
|
+
|
|
300
|
+
Usage:
|
|
301
|
+
claude-telemetry wrap <claude-args> Run Claude with telemetry
|
|
302
|
+
claude-telemetry monitor [session-id] Monitor session for tokens
|
|
303
|
+
claude-telemetry cost Get current session cost
|
|
304
|
+
|
|
305
|
+
Examples:
|
|
306
|
+
claude-telemetry wrap chat "Hello"
|
|
307
|
+
claude-telemetry monitor claude-123456
|
|
308
|
+
claude-telemetry cost
|
|
309
|
+
`);
|
|
310
|
+
}
|
|
311
|
+
}
|