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,372 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Real Token Usage Tracking for Claude API Calls
|
|
3
|
+
* Tracks actual token consumption from Claude Code interactions
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { promises as fs } from 'fs';
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { fileURLToPath } from 'url';
|
|
9
|
+
import { dirname } from 'path';
|
|
10
|
+
|
|
11
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
12
|
+
const __dirname = dirname(__filename);
|
|
13
|
+
|
|
14
|
+
// Token tracking cache
|
|
15
|
+
let tokenCache = {
|
|
16
|
+
sessions: {},
|
|
17
|
+
totals: {
|
|
18
|
+
input: 0,
|
|
19
|
+
output: 0,
|
|
20
|
+
total: 0,
|
|
21
|
+
},
|
|
22
|
+
byAgent: {},
|
|
23
|
+
byCommand: {},
|
|
24
|
+
history: [],
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// Get metrics directory
|
|
28
|
+
function getMetricsDir() {
|
|
29
|
+
return path.join(process.cwd(), '.claude-flow', 'metrics');
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Get token file path
|
|
33
|
+
function getTokenFilePath() {
|
|
34
|
+
return path.join(getMetricsDir(), 'token-usage.json');
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Load existing token data
|
|
38
|
+
export async function loadTokenData() {
|
|
39
|
+
try {
|
|
40
|
+
const filePath = getTokenFilePath();
|
|
41
|
+
const data = await fs.readFile(filePath, 'utf-8');
|
|
42
|
+
tokenCache = JSON.parse(data);
|
|
43
|
+
return tokenCache;
|
|
44
|
+
} catch (error) {
|
|
45
|
+
// File doesn't exist or is invalid, use default
|
|
46
|
+
return tokenCache;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Save token data to disk
|
|
51
|
+
export async function saveTokenData() {
|
|
52
|
+
try {
|
|
53
|
+
const dir = getMetricsDir();
|
|
54
|
+
await fs.mkdir(dir, { recursive: true });
|
|
55
|
+
|
|
56
|
+
const filePath = getTokenFilePath();
|
|
57
|
+
await fs.writeFile(filePath, JSON.stringify(tokenCache, null, 2));
|
|
58
|
+
} catch (error) {
|
|
59
|
+
console.error('Failed to save token data:', error.message);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Track tokens from a Claude interaction
|
|
65
|
+
* @param {Object} params Token tracking parameters
|
|
66
|
+
*/
|
|
67
|
+
export async function trackTokens(params) {
|
|
68
|
+
const {
|
|
69
|
+
sessionId,
|
|
70
|
+
agentType = 'general',
|
|
71
|
+
command = 'unknown',
|
|
72
|
+
inputTokens = 0,
|
|
73
|
+
outputTokens = 0,
|
|
74
|
+
metadata = {},
|
|
75
|
+
} = params;
|
|
76
|
+
|
|
77
|
+
// Update totals
|
|
78
|
+
tokenCache.totals.input += inputTokens;
|
|
79
|
+
tokenCache.totals.output += outputTokens;
|
|
80
|
+
tokenCache.totals.total += inputTokens + outputTokens;
|
|
81
|
+
|
|
82
|
+
// Track by agent type
|
|
83
|
+
if (!tokenCache.byAgent[agentType]) {
|
|
84
|
+
tokenCache.byAgent[agentType] = {
|
|
85
|
+
input: 0,
|
|
86
|
+
output: 0,
|
|
87
|
+
total: 0,
|
|
88
|
+
count: 0,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
tokenCache.byAgent[agentType].input += inputTokens;
|
|
92
|
+
tokenCache.byAgent[agentType].output += outputTokens;
|
|
93
|
+
tokenCache.byAgent[agentType].total += inputTokens + outputTokens;
|
|
94
|
+
tokenCache.byAgent[agentType].count++;
|
|
95
|
+
|
|
96
|
+
// Track by command
|
|
97
|
+
if (!tokenCache.byCommand[command]) {
|
|
98
|
+
tokenCache.byCommand[command] = {
|
|
99
|
+
input: 0,
|
|
100
|
+
output: 0,
|
|
101
|
+
total: 0,
|
|
102
|
+
count: 0,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
tokenCache.byCommand[command].input += inputTokens;
|
|
106
|
+
tokenCache.byCommand[command].output += outputTokens;
|
|
107
|
+
tokenCache.byCommand[command].total += inputTokens + outputTokens;
|
|
108
|
+
tokenCache.byCommand[command].count++;
|
|
109
|
+
|
|
110
|
+
// Add to history
|
|
111
|
+
tokenCache.history.push({
|
|
112
|
+
timestamp: Date.now(),
|
|
113
|
+
sessionId,
|
|
114
|
+
agentType,
|
|
115
|
+
command,
|
|
116
|
+
inputTokens,
|
|
117
|
+
outputTokens,
|
|
118
|
+
metadata,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
// Keep only last 1000 entries in history
|
|
122
|
+
if (tokenCache.history.length > 1000) {
|
|
123
|
+
tokenCache.history = tokenCache.history.slice(-1000);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Save to disk
|
|
127
|
+
await saveTokenData();
|
|
128
|
+
|
|
129
|
+
return {
|
|
130
|
+
sessionTotal: inputTokens + outputTokens,
|
|
131
|
+
grandTotal: tokenCache.totals.total,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Get real token usage data
|
|
137
|
+
* @param {string} agentFilter Filter by agent type
|
|
138
|
+
*/
|
|
139
|
+
export async function getRealTokenUsage(agentFilter = 'all') {
|
|
140
|
+
await loadTokenData();
|
|
141
|
+
|
|
142
|
+
// If no data tracked yet, check for Claude API logs
|
|
143
|
+
if (tokenCache.totals.total === 0) {
|
|
144
|
+
// Try to read from Claude Code's own tracking if available
|
|
145
|
+
const claudeTokens = await getClaudeCodeTokenUsage();
|
|
146
|
+
if (claudeTokens) {
|
|
147
|
+
return claudeTokens;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Filter by agent if specified
|
|
152
|
+
if (agentFilter !== 'all' && tokenCache.byAgent[agentFilter]) {
|
|
153
|
+
const agentData = tokenCache.byAgent[agentFilter];
|
|
154
|
+
return {
|
|
155
|
+
total: agentData.total,
|
|
156
|
+
input: agentData.input,
|
|
157
|
+
output: agentData.output,
|
|
158
|
+
byAgent: { [agentFilter]: agentData.total },
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Return all data
|
|
163
|
+
const byAgent = {};
|
|
164
|
+
Object.entries(tokenCache.byAgent).forEach(([type, data]) => {
|
|
165
|
+
byAgent[type] = data.total;
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
return {
|
|
169
|
+
total: tokenCache.totals.total,
|
|
170
|
+
input: tokenCache.totals.input,
|
|
171
|
+
output: tokenCache.totals.output,
|
|
172
|
+
byAgent,
|
|
173
|
+
byCommand: tokenCache.byCommand,
|
|
174
|
+
history: tokenCache.history,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Try to get token usage from Claude Code's own tracking
|
|
180
|
+
*/
|
|
181
|
+
async function getClaudeCodeTokenUsage() {
|
|
182
|
+
try {
|
|
183
|
+
// Check common locations for Claude token logs
|
|
184
|
+
const possiblePaths = [
|
|
185
|
+
path.join(process.env.HOME, '.config', 'claude', 'usage.json'),
|
|
186
|
+
path.join(process.env.HOME, '.claude', 'metrics.json'),
|
|
187
|
+
path.join(process.cwd(), '.claude', 'usage.json'),
|
|
188
|
+
];
|
|
189
|
+
|
|
190
|
+
for (const logPath of possiblePaths) {
|
|
191
|
+
try {
|
|
192
|
+
const data = await fs.readFile(logPath, 'utf-8');
|
|
193
|
+
const usage = JSON.parse(data);
|
|
194
|
+
|
|
195
|
+
// Convert Claude's format to our format
|
|
196
|
+
if (usage.tokens || usage.usage) {
|
|
197
|
+
const tokens = usage.tokens || usage.usage;
|
|
198
|
+
return {
|
|
199
|
+
total: tokens.total || 0,
|
|
200
|
+
input: tokens.input || tokens.prompt_tokens || 0,
|
|
201
|
+
output: tokens.output || tokens.completion_tokens || 0,
|
|
202
|
+
byAgent: {},
|
|
203
|
+
source: 'claude-code',
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
} catch (e) {
|
|
207
|
+
// Continue to next path
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
} catch (error) {
|
|
211
|
+
// No Claude tracking found
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Return empty if no data found
|
|
215
|
+
return {
|
|
216
|
+
total: 0,
|
|
217
|
+
input: 0,
|
|
218
|
+
output: 0,
|
|
219
|
+
byAgent: {},
|
|
220
|
+
source: 'none',
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Calculate cost based on token usage
|
|
226
|
+
* Using Claude 3 pricing (as of 2024)
|
|
227
|
+
*/
|
|
228
|
+
export function calculateCost(tokenData) {
|
|
229
|
+
// Claude 3 Opus pricing (per 1M tokens)
|
|
230
|
+
const INPUT_COST_PER_1M = 15.0; // $15 per 1M input tokens
|
|
231
|
+
const OUTPUT_COST_PER_1M = 75.0; // $75 per 1M output tokens
|
|
232
|
+
|
|
233
|
+
const inputCost = (tokenData.input / 1000000) * INPUT_COST_PER_1M;
|
|
234
|
+
const outputCost = (tokenData.output / 1000000) * OUTPUT_COST_PER_1M;
|
|
235
|
+
|
|
236
|
+
return {
|
|
237
|
+
input: inputCost,
|
|
238
|
+
output: outputCost,
|
|
239
|
+
total: inputCost + outputCost,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Generate optimization suggestions based on real usage
|
|
245
|
+
*/
|
|
246
|
+
export function generateOptimizationSuggestions(tokenData) {
|
|
247
|
+
const suggestions = [];
|
|
248
|
+
|
|
249
|
+
// Check if there's actual data
|
|
250
|
+
if (tokenData.total === 0) {
|
|
251
|
+
return ['No token usage data available. Start using Claude Code to track tokens.'];
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// Analyze input/output ratio
|
|
255
|
+
const outputRatio = tokenData.output / tokenData.total;
|
|
256
|
+
if (outputRatio > 0.6) {
|
|
257
|
+
suggestions.push(
|
|
258
|
+
'High output ratio detected. Consider more concise prompts to reduce generation.',
|
|
259
|
+
);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// Analyze by agent type
|
|
263
|
+
if (tokenData.byAgent) {
|
|
264
|
+
const sortedAgents = Object.entries(tokenData.byAgent).sort((a, b) => b[1] - a[1]);
|
|
265
|
+
|
|
266
|
+
if (sortedAgents.length > 0) {
|
|
267
|
+
const [topAgent, topUsage] = sortedAgents[0];
|
|
268
|
+
const percentage = (topUsage / tokenData.total) * 100;
|
|
269
|
+
|
|
270
|
+
if (percentage > 50) {
|
|
271
|
+
suggestions.push(
|
|
272
|
+
`${topAgent} agents consume ${percentage.toFixed(0)}% of tokens. Consider optimization or caching.`,
|
|
273
|
+
);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// Check for repeated patterns in history
|
|
279
|
+
if (tokenData.history && tokenData.history.length > 10) {
|
|
280
|
+
const recentCommands = tokenData.history.slice(-20).map((h) => h.command);
|
|
281
|
+
const duplicates = recentCommands.filter((cmd, i) => recentCommands.indexOf(cmd) !== i);
|
|
282
|
+
|
|
283
|
+
if (duplicates.length > 5) {
|
|
284
|
+
suggestions.push('Repeated commands detected. Consider implementing result caching.');
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Cost optimization
|
|
289
|
+
if (tokenData.total > 100000) {
|
|
290
|
+
suggestions.push('Consider using Claude Haiku for non-critical tasks to reduce costs by ~90%.');
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
// General suggestions based on volume
|
|
294
|
+
if (tokenData.total > 50000) {
|
|
295
|
+
suggestions.push('Implement prompt templates to reduce input token usage.');
|
|
296
|
+
suggestions.push('Use streaming responses to optimize output generation.');
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return suggestions.length > 0 ? suggestions : ['Token usage is within optimal range.'];
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* Generate detailed token usage report
|
|
304
|
+
*/
|
|
305
|
+
export async function generateTokenUsageReport(tokenData, agentFilter) {
|
|
306
|
+
const reportDir = path.join(process.cwd(), 'analysis-reports');
|
|
307
|
+
await fs.mkdir(reportDir, { recursive: true });
|
|
308
|
+
|
|
309
|
+
const timestamp = Date.now();
|
|
310
|
+
const csvPath = path.join(reportDir, `token-usage-${timestamp}.csv`);
|
|
311
|
+
|
|
312
|
+
// Create CSV content
|
|
313
|
+
let csv = 'Timestamp,Session,Agent,Command,Input Tokens,Output Tokens,Total\n';
|
|
314
|
+
|
|
315
|
+
if (tokenData.history) {
|
|
316
|
+
tokenData.history.forEach((entry) => {
|
|
317
|
+
const date = new Date(entry.timestamp).toISOString();
|
|
318
|
+
const total = entry.inputTokens + entry.outputTokens;
|
|
319
|
+
csv += `${date},${entry.sessionId},${entry.agentType},${entry.command},${entry.inputTokens},${entry.outputTokens},${total}\n`;
|
|
320
|
+
});
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Add summary at the end
|
|
324
|
+
csv += '\nSUMMARY\n';
|
|
325
|
+
csv += `Total Input Tokens,${tokenData.input}\n`;
|
|
326
|
+
csv += `Total Output Tokens,${tokenData.output}\n`;
|
|
327
|
+
csv += `Total Tokens,${tokenData.total}\n`;
|
|
328
|
+
|
|
329
|
+
if (tokenData.byAgent) {
|
|
330
|
+
csv += '\nBY AGENT TYPE\n';
|
|
331
|
+
Object.entries(tokenData.byAgent).forEach(([type, usage]) => {
|
|
332
|
+
csv += `${type},${usage}\n`;
|
|
333
|
+
});
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
await fs.writeFile(csvPath, csv);
|
|
337
|
+
return csvPath;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Get icon for agent type
|
|
342
|
+
*/
|
|
343
|
+
export function getAgentIcon(agentType) {
|
|
344
|
+
const icons = {
|
|
345
|
+
coordinator: '๐ฏ',
|
|
346
|
+
developer: '๐จโ๐ป',
|
|
347
|
+
researcher: '๐',
|
|
348
|
+
analyzer: '๐',
|
|
349
|
+
tester: '๐งช',
|
|
350
|
+
architect: '๐๏ธ',
|
|
351
|
+
general: '๐ค',
|
|
352
|
+
};
|
|
353
|
+
return icons[agentType] || '๐ค';
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
/**
|
|
357
|
+
* Reset token tracking (for testing)
|
|
358
|
+
*/
|
|
359
|
+
export async function resetTokenTracking() {
|
|
360
|
+
tokenCache = {
|
|
361
|
+
sessions: {},
|
|
362
|
+
totals: {
|
|
363
|
+
input: 0,
|
|
364
|
+
output: 0,
|
|
365
|
+
total: 0,
|
|
366
|
+
},
|
|
367
|
+
byAgent: {},
|
|
368
|
+
byCommand: {},
|
|
369
|
+
history: [],
|
|
370
|
+
};
|
|
371
|
+
await saveTokenData();
|
|
372
|
+
}
|