claude-flow-novice 2.0.3 โ 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/cli/commands/guidance.js +487 -668
- package/dist/src/cli/commands/index-validate.js +18 -29
- package/dist/src/cli/commands/mcp-troubleshoot.js +230 -282
- package/dist/src/cli/commands/neural-goal-init.js +92 -125
- package/dist/src/cli/commands/swarm-exec.js +317 -393
- package/dist/src/cli/commands/swarm.js +1 -1
- package/dist/src/cli/commands/validate-framework.js +983 -1100
- package/dist/src/cli/commands/validate.js +144 -223
- package/dist/src/cli/simple-commands/__tests__/agent.test.js +265 -277
- package/dist/src/cli/simple-commands/__tests__/memory.test.js +6 -7
- package/dist/src/cli/simple-commands/__tests__/swarm.test.js +373 -356
- package/dist/src/cli/simple-commands/__tests__/task.test.js +6 -7
- package/dist/src/cli/simple-commands/agent.js +157 -193
- package/dist/src/cli/simple-commands/analysis.js +336 -446
- package/dist/src/cli/simple-commands/automation-executor.js +1095 -1339
- package/dist/src/cli/simple-commands/automation.js +481 -469
- package/dist/src/cli/simple-commands/batch-manager.js +261 -313
- package/dist/src/cli/simple-commands/claude-telemetry.js +241 -267
- package/dist/src/cli/simple-commands/claude-track.js +68 -90
- package/dist/src/cli/simple-commands/concurrent-display.js +266 -320
- package/dist/src/cli/simple-commands/config.js +245 -290
- package/dist/src/cli/simple-commands/coordination.js +182 -234
- package/dist/src/cli/simple-commands/enhanced-ui-views.js +812 -615
- package/dist/src/cli/simple-commands/enhanced-webui-complete.js +922 -981
- package/dist/src/cli/simple-commands/fix-hook-variables.js +274 -294
- package/dist/src/cli/simple-commands/github/gh-coordinator.js +378 -457
- package/dist/src/cli/simple-commands/github/github-api.js +535 -574
- package/dist/src/cli/simple-commands/github/init.js +276 -303
- package/dist/src/cli/simple-commands/github.js +222 -247
- package/dist/src/cli/simple-commands/goal.js +51 -63
- package/dist/src/cli/simple-commands/hive-mind/auto-save-middleware.js +208 -278
- package/dist/src/cli/simple-commands/hive-mind/communication.js +601 -696
- package/dist/src/cli/simple-commands/hive-mind/core.js +907 -979
- package/dist/src/cli/simple-commands/hive-mind/db-optimizer.js +406 -655
- package/dist/src/cli/simple-commands/hive-mind/mcp-wrapper.js +1125 -1245
- package/dist/src/cli/simple-commands/hive-mind/memory.js +854 -1090
- package/dist/src/cli/simple-commands/hive-mind/performance-optimizer.js +459 -574
- package/dist/src/cli/simple-commands/hive-mind/performance-test.js +263 -347
- package/dist/src/cli/simple-commands/hive-mind/queen.js +727 -768
- package/dist/src/cli/simple-commands/hive-mind/session-manager.js +745 -1049
- package/dist/src/cli/simple-commands/hive-mind-optimize.js +227 -283
- package/dist/src/cli/simple-commands/hive-mind-wizard.js +174 -217
- package/dist/src/cli/simple-commands/hive-mind.js +1842 -2283
- package/dist/src/cli/simple-commands/hive.js +90 -79
- package/dist/src/cli/simple-commands/hook-safety.js +431 -521
- package/dist/src/cli/simple-commands/hooks/session-start-soul.js +203 -254
- package/dist/src/cli/simple-commands/hooks.js +1064 -1204
- package/dist/src/cli/simple-commands/init/agent-copier.js +294 -319
- package/dist/src/cli/simple-commands/init/batch-init.js +496 -562
- package/dist/src/cli/simple-commands/init/claude-commands/claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-claude-flow-commands.js +13 -19
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-slash-commands.js +61 -88
- package/dist/src/cli/simple-commands/init/claude-commands/optimized-sparc-commands.js +125 -150
- package/dist/src/cli/simple-commands/init/claude-commands/slash-commands.js +42 -49
- package/dist/src/cli/simple-commands/init/claude-commands/sparc-commands.js +43 -61
- package/dist/src/cli/simple-commands/init/copy-revised-templates.js +141 -147
- package/dist/src/cli/simple-commands/init/executable-wrapper.js +31 -44
- package/dist/src/cli/simple-commands/init/gitignore-updater.js +64 -90
- package/dist/src/cli/simple-commands/init/help.js +104 -107
- package/dist/src/cli/simple-commands/init/hive-mind-init.js +509 -528
- package/dist/src/cli/simple-commands/init/index.js +1510 -1759
- package/dist/src/cli/simple-commands/init/performance-monitor.js +234 -317
- package/dist/src/cli/simple-commands/init/rollback/backup-manager.js +441 -504
- package/dist/src/cli/simple-commands/init/rollback/index.js +289 -364
- package/dist/src/cli/simple-commands/init/rollback/recovery-manager.js +652 -728
- package/dist/src/cli/simple-commands/init/rollback/rollback-executor.js +416 -481
- package/dist/src/cli/simple-commands/init/rollback/state-tracker.js +369 -448
- package/dist/src/cli/simple-commands/init/sparc/roo-readme.js +1 -2
- package/dist/src/cli/simple-commands/init/sparc/roomodes-config.js +122 -99
- package/dist/src/cli/simple-commands/init/sparc/workflows.js +32 -37
- package/dist/src/cli/simple-commands/init/sparc-structure.js +55 -62
- package/dist/src/cli/simple-commands/init/template-copier.js +421 -533
- package/dist/src/cli/simple-commands/init/templates/coordination-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/enhanced-templates.js +344 -318
- package/dist/src/cli/simple-commands/init/templates/github-safe-enhanced.js +173 -218
- package/dist/src/cli/simple-commands/init/templates/github-safe.js +65 -75
- package/dist/src/cli/simple-commands/init/templates/memory-bank-md.js +3 -6
- package/dist/src/cli/simple-commands/init/templates/readme-files.js +2 -4
- package/dist/src/cli/simple-commands/init/templates/safe-hook-patterns.js +187 -230
- package/dist/src/cli/simple-commands/init/templates/sparc-modes.js +53 -80
- package/dist/src/cli/simple-commands/init/templates/verification-claude-md.js +101 -85
- package/dist/src/cli/simple-commands/init/validation/config-validator.js +283 -330
- package/dist/src/cli/simple-commands/init/validation/health-checker.js +495 -561
- package/dist/src/cli/simple-commands/init/validation/index.js +302 -358
- package/dist/src/cli/simple-commands/init/validation/mode-validator.js +308 -359
- package/dist/src/cli/simple-commands/init/validation/post-init-validator.js +389 -366
- package/dist/src/cli/simple-commands/init/validation/pre-init-validator.js +270 -268
- package/dist/src/cli/simple-commands/init/validation/test-runner.js +427 -447
- package/dist/src/cli/simple-commands/init.js +1 -2
- package/dist/src/cli/simple-commands/mcp-health.js +131 -158
- package/dist/src/cli/simple-commands/mcp-integration-layer.js +533 -634
- package/dist/src/cli/simple-commands/mcp.js +345 -400
- package/dist/src/cli/simple-commands/memory-consolidation.js +426 -537
- package/dist/src/cli/simple-commands/memory.js +247 -311
- package/dist/src/cli/simple-commands/migrate-hooks.js +39 -46
- package/dist/src/cli/simple-commands/monitor.js +294 -363
- package/dist/src/cli/simple-commands/neural.js +51 -65
- package/dist/src/cli/simple-commands/pair-autofix-only.js +538 -662
- package/dist/src/cli/simple-commands/pair-basic.js +528 -656
- package/dist/src/cli/simple-commands/pair-old.js +430 -543
- package/dist/src/cli/simple-commands/pair-working.js +615 -751
- package/dist/src/cli/simple-commands/pair.js +615 -751
- package/dist/src/cli/simple-commands/performance-hooks.js +83 -111
- package/dist/src/cli/simple-commands/performance-metrics.js +348 -433
- package/dist/src/cli/simple-commands/process-ui-enhanced.js +708 -787
- package/dist/src/cli/simple-commands/process-ui.js +230 -254
- package/dist/src/cli/simple-commands/realtime-update-system.js +525 -611
- package/dist/src/cli/simple-commands/sparc/architecture.js +1704 -1530
- package/dist/src/cli/simple-commands/sparc/commands.js +438 -516
- package/dist/src/cli/simple-commands/sparc/completion.js +1224 -1481
- package/dist/src/cli/simple-commands/sparc/coordinator.js +913 -978
- package/dist/src/cli/simple-commands/sparc/index.js +241 -298
- package/dist/src/cli/simple-commands/sparc/phase-base.js +314 -390
- package/dist/src/cli/simple-commands/sparc/pseudocode.js +965 -869
- package/dist/src/cli/simple-commands/sparc/refinement.js +980 -1273
- package/dist/src/cli/simple-commands/sparc/specification.js +559 -645
- package/dist/src/cli/simple-commands/sparc-modes/architect.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/ask.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/code.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/debug.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/devops.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/docs-writer.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/generic.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/index.js +47 -55
- package/dist/src/cli/simple-commands/sparc-modes/integration.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/mcp.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/monitoring.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/optimization.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/security-review.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/sparc-orchestrator.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/spec-pseudocode.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/supabase-admin.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/swarm.js +101 -87
- package/dist/src/cli/simple-commands/sparc-modes/tdd.js +1 -1
- package/dist/src/cli/simple-commands/sparc-modes/tutorial.js +1 -1
- package/dist/src/cli/simple-commands/sparc.js +465 -493
- package/dist/src/cli/simple-commands/start-ui.js +108 -132
- package/dist/src/cli/simple-commands/start-wrapper.js +240 -268
- package/dist/src/cli/simple-commands/start.js +1 -1
- package/dist/src/cli/simple-commands/status.js +254 -275
- package/dist/src/cli/simple-commands/stream-chain-clean.js +128 -171
- package/dist/src/cli/simple-commands/stream-chain-fixed.js +61 -82
- package/dist/src/cli/simple-commands/stream-chain-real.js +267 -331
- package/dist/src/cli/simple-commands/stream-chain-working.js +211 -263
- package/dist/src/cli/simple-commands/stream-chain.js +260 -318
- package/dist/src/cli/simple-commands/stream-processor.js +290 -315
- package/dist/src/cli/simple-commands/swarm-executor.js +189 -222
- package/dist/src/cli/simple-commands/swarm-metrics-integration.js +208 -300
- package/dist/src/cli/simple-commands/swarm-ui.js +623 -703
- package/dist/src/cli/simple-commands/swarm-webui-integration.js +258 -286
- package/dist/src/cli/simple-commands/swarm.js +887 -1082
- package/dist/src/cli/simple-commands/task.js +161 -206
- package/dist/src/cli/simple-commands/timestamp-fix.js +59 -89
- package/dist/src/cli/simple-commands/token-tracker.js +258 -316
- package/dist/src/cli/simple-commands/tool-execution-framework.js +433 -519
- package/dist/src/cli/simple-commands/train-and-stream.js +275 -331
- package/dist/src/cli/simple-commands/training-pipeline.js +619 -725
- package/dist/src/cli/simple-commands/training.js +170 -227
- package/dist/src/cli/simple-commands/verification-hooks.js +261 -284
- package/dist/src/cli/simple-commands/verification-integration.js +389 -417
- package/dist/src/cli/simple-commands/verification-training-integration.js +486 -606
- package/dist/src/cli/simple-commands/verification.js +493 -513
- package/dist/src/cli/simple-commands/web-server.js +766 -836
- package/dist/src/cli/simple-commands/webui-validator.js +106 -124
- package/dist/src/coordination/event-bus/demo-wasm-integration.js +212 -251
- package/dist/src/coordination/event-bus/qe-event-bus.js +608 -748
- package/dist/src/coordination/event-bus/qe-event-bus.test.js +379 -454
- package/dist/src/coordination/iteration-tracker.js +363 -454
- package/dist/src/enterprise/analytics-manager.js +1135 -0
- package/dist/src/enterprise/audit-manager.js +1115 -0
- package/dist/src/enterprise/cloud-manager.js +891 -0
- package/dist/src/enterprise/deployment-manager.js +966 -0
- package/dist/src/enterprise/index.js +6 -0
- package/dist/src/enterprise/project-manager.js +584 -0
- package/dist/src/enterprise/security-manager.js +991 -0
- package/dist/src/index.js +1 -1
- package/dist/src/mcp/DEPRECATED.js +46 -60
- package/dist/src/mcp/fixes/mcp-error-fixes.js +115 -134
- package/dist/src/mcp/implementations/agent-tracker.js +114 -128
- package/dist/src/mcp/implementations/daa-tools.js +292 -350
- package/dist/src/mcp/implementations/workflow-tools.js +329 -361
- package/dist/src/mcp/mcp-config-manager.js +1183 -1331
- package/dist/src/mcp/mcp-server-novice-simplified.js +11 -17
- package/dist/src/mcp/mcp-server-novice.js +11 -17
- package/dist/src/mcp/mcp-server-sdk.js +11 -17
- package/dist/src/mcp/mcp-server.js +1620 -1484
- package/dist/src/mcp/ruv-swarm-wrapper.js +209 -239
- package/dist/src/memory/advanced-serializer.js +609 -589
- package/dist/src/memory/enhanced-examples.js +220 -305
- package/dist/src/memory/enhanced-memory.js +295 -336
- package/dist/src/memory/enhanced-session-serializer.js +408 -492
- package/dist/src/memory/fallback-memory-system.js +900 -1021
- package/dist/src/memory/fallback-store.js +93 -131
- package/dist/src/memory/high-performance-serialization.js +592 -730
- package/dist/src/memory/in-memory-store.js +161 -213
- package/dist/src/memory/index.js +123 -157
- package/dist/src/memory/lock-free-structures.js +578 -764
- package/dist/src/memory/memory-mapped-persistence.js +585 -766
- package/dist/src/memory/memory-pressure-manager.js +569 -707
- package/dist/src/memory/migration.js +358 -445
- package/dist/src/memory/shared-memory.js +641 -768
- package/dist/src/memory/sqlite-store.js +245 -325
- package/dist/src/memory/sqlite-wrapper.js +122 -151
- package/dist/src/memory/swarm-memory.js +470 -603
- package/dist/src/memory/test-example.js +126 -134
- package/dist/src/memory/ultra-fast-memory-store.js +622 -821
- package/dist/src/memory/unified-memory-manager.js +356 -437
- package/dist/src/migration/index.js +92 -0
- package/dist/src/migration/logger.js +121 -0
- package/dist/src/migration/migration-analyzer.js +268 -0
- package/dist/src/migration/migration-runner.js +522 -0
- package/dist/src/migration/migration-validator.js +285 -0
- package/dist/src/migration/progress-reporter.js +150 -0
- package/dist/src/migration/rollback-manager.js +321 -0
- package/dist/src/migration/tests/migration-system.test.js +7 -0
- package/dist/src/migration/types.js +3 -0
- package/dist/src/swarm/CodeRefactoringSwarm.js +777 -952
- package/dist/src/swarm/__tests__/integration.test.js +227 -0
- package/dist/src/swarm/__tests__/prompt-copier.test.js +344 -0
- package/dist/src/swarm/advanced-orchestrator.js +1095 -0
- package/dist/src/swarm/claude-code-interface.js +961 -0
- package/dist/src/swarm/claude-flow-executor.js +229 -0
- package/dist/src/swarm/consensus-coordinator.js +475 -0
- package/dist/src/swarm/coordinator.js +2993 -0
- package/dist/src/swarm/direct-executor.js +1180 -0
- package/dist/src/swarm/error-recovery/advanced-error-detection.js +691 -0
- package/dist/src/swarm/error-recovery/automated-recovery-workflows.js +998 -0
- package/dist/src/swarm/error-recovery/error-recovery-coordinator.js +1197 -0
- package/dist/src/swarm/error-recovery/recovery-monitoring.js +772 -0
- package/dist/src/swarm/error-recovery/resilience-architecture.js +714 -0
- package/dist/src/swarm/error-recovery/self-healing-mechanisms.js +1319 -0
- package/dist/src/swarm/error-recovery/test-error-recovery-effectiveness.js +808 -0
- package/dist/src/swarm/executor-v2.js +322 -0
- package/dist/src/swarm/executor.js +815 -0
- package/dist/src/swarm/hive-mind-integration.js +703 -0
- package/dist/src/swarm/index.js +41 -0
- package/dist/src/swarm/json-output-aggregator.js +267 -0
- package/dist/src/swarm/large-scale-coordinator.js +542 -0
- package/dist/src/swarm/mcp-integration-wrapper.js +628 -0
- package/dist/src/swarm/memory.js +1117 -0
- package/dist/src/swarm/optimizations/__tests__/optimization.test.js +348 -0
- package/dist/src/swarm/optimizations/async-file-manager.js +285 -0
- package/dist/src/swarm/optimizations/circular-buffer.js +162 -0
- package/dist/src/swarm/optimizations/connection-pool.js +244 -0
- package/dist/src/swarm/optimizations/index.js +28 -0
- package/dist/src/swarm/optimizations/optimized-executor.js +320 -0
- package/dist/src/swarm/optimizations/ttl-map.js +234 -0
- package/dist/src/swarm/prompt-cli.js +200 -0
- package/dist/src/swarm/prompt-copier-enhanced.js +202 -0
- package/dist/src/swarm/prompt-copier.js +381 -0
- package/dist/src/swarm/prompt-manager.js +295 -0
- package/dist/src/swarm/prompt-utils.js +310 -0
- package/dist/src/swarm/result-aggregator.js +718 -0
- package/dist/src/swarm/sparc-executor.js +1568 -0
- package/dist/src/swarm/strategies/auto.js +758 -0
- package/dist/src/swarm/strategies/base.js +128 -0
- package/dist/src/swarm/strategies/research.js +914 -0
- package/dist/src/swarm/strategies/strategy-metrics-patch.js +2 -0
- package/dist/src/swarm/types.js +52 -0
- package/dist/src/swarm/workers/copy-worker.js +56 -0
- package/dist/src/utils/__tests__/github-cli-safety-wrapper.test.js +332 -400
- package/dist/src/utils/github-cli-safe.js +56 -64
- package/dist/src/utils/github-cli-safety-wrapper.js +451 -546
- package/dist/src/utils/npx-isolated-cache.js +104 -119
- package/dist/src/utils/preference-manager.js +622 -652
- package/dist/src/utils/timezone-utils.js +86 -105
- package/dist/src/validators/epic-config-schema.js +214 -0
- package/dist/src/validators/index.js +10 -0
- package/dist/src/validators/swarm-init-validator.js +259 -0
- package/dist/src/validators/todowrite-batching-validator.js +215 -0
- package/dist/src/validators/todowrite-integration.js +187 -0
- package/package.json +2 -2
|
@@ -1,372 +1,314 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Real Token Usage Tracking for Claude API Calls
|
|
3
3
|
* Tracks actual token consumption from Claude Code interactions
|
|
4
|
-
*/
|
|
5
|
-
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import { fileURLToPath } from 'url';
|
|
9
|
-
import { dirname } from 'path';
|
|
10
|
-
|
|
4
|
+
*/ import { promises as fs } from "fs";
|
|
5
|
+
import path from "path";
|
|
6
|
+
import { fileURLToPath } from "url";
|
|
7
|
+
import { dirname } from "path";
|
|
11
8
|
const __filename = fileURLToPath(import.meta.url);
|
|
12
9
|
const __dirname = dirname(__filename);
|
|
13
|
-
|
|
14
10
|
// Token tracking cache
|
|
15
11
|
let tokenCache = {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
12
|
+
sessions: {},
|
|
13
|
+
totals: {
|
|
14
|
+
input: 0,
|
|
15
|
+
output: 0,
|
|
16
|
+
total: 0
|
|
17
|
+
},
|
|
18
|
+
byAgent: {},
|
|
19
|
+
byCommand: {},
|
|
20
|
+
history: []
|
|
25
21
|
};
|
|
26
|
-
|
|
27
22
|
// Get metrics directory
|
|
28
23
|
function getMetricsDir() {
|
|
29
|
-
|
|
24
|
+
return path.join(process.cwd(), '.claude-flow', 'metrics');
|
|
30
25
|
}
|
|
31
|
-
|
|
32
26
|
// Get token file path
|
|
33
27
|
function getTokenFilePath() {
|
|
34
|
-
|
|
28
|
+
return path.join(getMetricsDir(), 'token-usage.json');
|
|
35
29
|
}
|
|
36
|
-
|
|
37
30
|
// Load existing token data
|
|
38
31
|
export async function loadTokenData() {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
32
|
+
try {
|
|
33
|
+
const filePath = getTokenFilePath();
|
|
34
|
+
const data = await fs.readFile(filePath, 'utf-8');
|
|
35
|
+
tokenCache = JSON.parse(data);
|
|
36
|
+
return tokenCache;
|
|
37
|
+
} catch (error) {
|
|
38
|
+
// File doesn't exist or is invalid, use default
|
|
39
|
+
return tokenCache;
|
|
40
|
+
}
|
|
48
41
|
}
|
|
49
|
-
|
|
50
42
|
// Save token data to disk
|
|
51
43
|
export async function saveTokenData() {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
44
|
+
try {
|
|
45
|
+
const dir = getMetricsDir();
|
|
46
|
+
await fs.mkdir(dir, {
|
|
47
|
+
recursive: true
|
|
48
|
+
});
|
|
49
|
+
const filePath = getTokenFilePath();
|
|
50
|
+
await fs.writeFile(filePath, JSON.stringify(tokenCache, null, 2));
|
|
51
|
+
} catch (error) {
|
|
52
|
+
console.error('Failed to save token data:', error.message);
|
|
53
|
+
}
|
|
61
54
|
}
|
|
62
|
-
|
|
63
55
|
/**
|
|
64
56
|
* Track tokens from a Claude interaction
|
|
65
57
|
* @param {Object} params Token tracking parameters
|
|
66
|
-
*/
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
tokenCache.byAgent[agentType]
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
58
|
+
*/ export async function trackTokens(params) {
|
|
59
|
+
const { sessionId, agentType = 'general', command = 'unknown', inputTokens = 0, outputTokens = 0, metadata = {} } = params;
|
|
60
|
+
// Update totals
|
|
61
|
+
tokenCache.totals.input += inputTokens;
|
|
62
|
+
tokenCache.totals.output += outputTokens;
|
|
63
|
+
tokenCache.totals.total += inputTokens + outputTokens;
|
|
64
|
+
// Track by agent type
|
|
65
|
+
if (!tokenCache.byAgent[agentType]) {
|
|
66
|
+
tokenCache.byAgent[agentType] = {
|
|
67
|
+
input: 0,
|
|
68
|
+
output: 0,
|
|
69
|
+
total: 0,
|
|
70
|
+
count: 0
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
tokenCache.byAgent[agentType].input += inputTokens;
|
|
74
|
+
tokenCache.byAgent[agentType].output += outputTokens;
|
|
75
|
+
tokenCache.byAgent[agentType].total += inputTokens + outputTokens;
|
|
76
|
+
tokenCache.byAgent[agentType].count++;
|
|
77
|
+
// Track by command
|
|
78
|
+
if (!tokenCache.byCommand[command]) {
|
|
79
|
+
tokenCache.byCommand[command] = {
|
|
80
|
+
input: 0,
|
|
81
|
+
output: 0,
|
|
82
|
+
total: 0,
|
|
83
|
+
count: 0
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
tokenCache.byCommand[command].input += inputTokens;
|
|
87
|
+
tokenCache.byCommand[command].output += outputTokens;
|
|
88
|
+
tokenCache.byCommand[command].total += inputTokens + outputTokens;
|
|
89
|
+
tokenCache.byCommand[command].count++;
|
|
90
|
+
// Add to history
|
|
91
|
+
tokenCache.history.push({
|
|
92
|
+
timestamp: Date.now(),
|
|
93
|
+
sessionId,
|
|
94
|
+
agentType,
|
|
95
|
+
command,
|
|
96
|
+
inputTokens,
|
|
97
|
+
outputTokens,
|
|
98
|
+
metadata
|
|
99
|
+
});
|
|
100
|
+
// Keep only last 1000 entries in history
|
|
101
|
+
if (tokenCache.history.length > 1000) {
|
|
102
|
+
tokenCache.history = tokenCache.history.slice(-1000);
|
|
103
|
+
}
|
|
104
|
+
// Save to disk
|
|
105
|
+
await saveTokenData();
|
|
106
|
+
return {
|
|
107
|
+
sessionTotal: inputTokens + outputTokens,
|
|
108
|
+
grandTotal: tokenCache.totals.total
|
|
103
109
|
};
|
|
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
110
|
}
|
|
134
|
-
|
|
135
111
|
/**
|
|
136
112
|
* Get real token usage data
|
|
137
113
|
* @param {string} agentFilter Filter by agent type
|
|
138
|
-
*/
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
return claudeTokens;
|
|
114
|
+
*/ export async function getRealTokenUsage(agentFilter = 'all') {
|
|
115
|
+
await loadTokenData();
|
|
116
|
+
// If no data tracked yet, check for Claude API logs
|
|
117
|
+
if (tokenCache.totals.total === 0) {
|
|
118
|
+
// Try to read from Claude Code's own tracking if available
|
|
119
|
+
const claudeTokens = await getClaudeCodeTokenUsage();
|
|
120
|
+
if (claudeTokens) {
|
|
121
|
+
return claudeTokens;
|
|
122
|
+
}
|
|
148
123
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
124
|
+
// Filter by agent if specified
|
|
125
|
+
if (agentFilter !== 'all' && tokenCache.byAgent[agentFilter]) {
|
|
126
|
+
const agentData = tokenCache.byAgent[agentFilter];
|
|
127
|
+
return {
|
|
128
|
+
total: agentData.total,
|
|
129
|
+
input: agentData.input,
|
|
130
|
+
output: agentData.output,
|
|
131
|
+
byAgent: {
|
|
132
|
+
[agentFilter]: agentData.total
|
|
133
|
+
}
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
// Return all data
|
|
137
|
+
const byAgent = {};
|
|
138
|
+
Object.entries(tokenCache.byAgent).forEach(([type, data])=>{
|
|
139
|
+
byAgent[type] = data.total;
|
|
140
|
+
});
|
|
154
141
|
return {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
142
|
+
total: tokenCache.totals.total,
|
|
143
|
+
input: tokenCache.totals.input,
|
|
144
|
+
output: tokenCache.totals.output,
|
|
145
|
+
byAgent,
|
|
146
|
+
byCommand: tokenCache.byCommand,
|
|
147
|
+
history: tokenCache.history
|
|
159
148
|
};
|
|
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
149
|
}
|
|
177
|
-
|
|
178
150
|
/**
|
|
179
151
|
* Try to get token usage from Claude Code's own tracking
|
|
180
|
-
*/
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
152
|
+
*/ async function getClaudeCodeTokenUsage() {
|
|
153
|
+
try {
|
|
154
|
+
// Check common locations for Claude token logs
|
|
155
|
+
const possiblePaths = [
|
|
156
|
+
path.join(process.env.HOME, '.config', 'claude', 'usage.json'),
|
|
157
|
+
path.join(process.env.HOME, '.claude', 'metrics.json'),
|
|
158
|
+
path.join(process.cwd(), '.claude', 'usage.json')
|
|
159
|
+
];
|
|
160
|
+
for (const logPath of possiblePaths){
|
|
161
|
+
try {
|
|
162
|
+
const data = await fs.readFile(logPath, 'utf-8');
|
|
163
|
+
const usage = JSON.parse(data);
|
|
164
|
+
// Convert Claude's format to our format
|
|
165
|
+
if (usage.tokens || usage.usage) {
|
|
166
|
+
const tokens = usage.tokens || usage.usage;
|
|
167
|
+
return {
|
|
168
|
+
total: tokens.total || 0,
|
|
169
|
+
input: tokens.input || tokens.prompt_tokens || 0,
|
|
170
|
+
output: tokens.output || tokens.completion_tokens || 0,
|
|
171
|
+
byAgent: {},
|
|
172
|
+
source: 'claude-code'
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
} catch (e) {
|
|
176
|
+
// Continue to next path
|
|
177
|
+
}
|
|
205
178
|
}
|
|
206
|
-
|
|
207
|
-
// Continue to next path
|
|
208
|
-
}
|
|
209
|
-
}
|
|
210
|
-
} catch (error) {
|
|
179
|
+
} catch (error) {
|
|
211
180
|
// No Claude tracking found
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
};
|
|
181
|
+
}
|
|
182
|
+
// Return empty if no data found
|
|
183
|
+
return {
|
|
184
|
+
total: 0,
|
|
185
|
+
input: 0,
|
|
186
|
+
output: 0,
|
|
187
|
+
byAgent: {},
|
|
188
|
+
source: 'none'
|
|
189
|
+
};
|
|
222
190
|
}
|
|
223
|
-
|
|
224
191
|
/**
|
|
225
192
|
* Calculate cost based on token usage
|
|
226
193
|
* Using Claude 3 pricing (as of 2024)
|
|
227
|
-
*/
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
output: outputCost,
|
|
239
|
-
total: inputCost + outputCost,
|
|
240
|
-
};
|
|
194
|
+
*/ export function calculateCost(tokenData) {
|
|
195
|
+
// Claude 3 Opus pricing (per 1M tokens)
|
|
196
|
+
const INPUT_COST_PER_1M = 15.0; // $15 per 1M input tokens
|
|
197
|
+
const OUTPUT_COST_PER_1M = 75.0; // $75 per 1M output tokens
|
|
198
|
+
const inputCost = tokenData.input / 1000000 * INPUT_COST_PER_1M;
|
|
199
|
+
const outputCost = tokenData.output / 1000000 * OUTPUT_COST_PER_1M;
|
|
200
|
+
return {
|
|
201
|
+
input: inputCost,
|
|
202
|
+
output: outputCost,
|
|
203
|
+
total: inputCost + outputCost
|
|
204
|
+
};
|
|
241
205
|
}
|
|
242
|
-
|
|
243
206
|
/**
|
|
244
207
|
* Generate optimization suggestions based on real usage
|
|
245
|
-
*/
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
)
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
)
|
|
274
|
-
|
|
208
|
+
*/ export function generateOptimizationSuggestions(tokenData) {
|
|
209
|
+
const suggestions = [];
|
|
210
|
+
// Check if there's actual data
|
|
211
|
+
if (tokenData.total === 0) {
|
|
212
|
+
return [
|
|
213
|
+
'No token usage data available. Start using Claude Code to track tokens.'
|
|
214
|
+
];
|
|
215
|
+
}
|
|
216
|
+
// Analyze input/output ratio
|
|
217
|
+
const outputRatio = tokenData.output / tokenData.total;
|
|
218
|
+
if (outputRatio > 0.6) {
|
|
219
|
+
suggestions.push('High output ratio detected. Consider more concise prompts to reduce generation.');
|
|
220
|
+
}
|
|
221
|
+
// Analyze by agent type
|
|
222
|
+
if (tokenData.byAgent) {
|
|
223
|
+
const sortedAgents = Object.entries(tokenData.byAgent).sort((a, b)=>b[1] - a[1]);
|
|
224
|
+
if (sortedAgents.length > 0) {
|
|
225
|
+
const [topAgent, topUsage] = sortedAgents[0];
|
|
226
|
+
const percentage = topUsage / tokenData.total * 100;
|
|
227
|
+
if (percentage > 50) {
|
|
228
|
+
suggestions.push(`${topAgent} agents consume ${percentage.toFixed(0)}% of tokens. Consider optimization or caching.`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
// Check for repeated patterns in history
|
|
233
|
+
if (tokenData.history && tokenData.history.length > 10) {
|
|
234
|
+
const recentCommands = tokenData.history.slice(-20).map((h)=>h.command);
|
|
235
|
+
const duplicates = recentCommands.filter((cmd, i)=>recentCommands.indexOf(cmd) !== i);
|
|
236
|
+
if (duplicates.length > 5) {
|
|
237
|
+
suggestions.push('Repeated commands detected. Consider implementing result caching.');
|
|
238
|
+
}
|
|
275
239
|
}
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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.');
|
|
240
|
+
// Cost optimization
|
|
241
|
+
if (tokenData.total > 100000) {
|
|
242
|
+
suggestions.push('Consider using Claude Haiku for non-critical tasks to reduce costs by ~90%.');
|
|
285
243
|
}
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
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.'];
|
|
244
|
+
// General suggestions based on volume
|
|
245
|
+
if (tokenData.total > 50000) {
|
|
246
|
+
suggestions.push('Implement prompt templates to reduce input token usage.');
|
|
247
|
+
suggestions.push('Use streaming responses to optimize output generation.');
|
|
248
|
+
}
|
|
249
|
+
return suggestions.length > 0 ? suggestions : [
|
|
250
|
+
'Token usage is within optimal range.'
|
|
251
|
+
];
|
|
300
252
|
}
|
|
301
|
-
|
|
302
253
|
/**
|
|
303
254
|
* Generate detailed token usage report
|
|
304
|
-
*/
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
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`;
|
|
255
|
+
*/ export async function generateTokenUsageReport(tokenData, agentFilter) {
|
|
256
|
+
const reportDir = path.join(process.cwd(), 'analysis-reports');
|
|
257
|
+
await fs.mkdir(reportDir, {
|
|
258
|
+
recursive: true
|
|
320
259
|
});
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
260
|
+
const timestamp = Date.now();
|
|
261
|
+
const csvPath = path.join(reportDir, `token-usage-${timestamp}.csv`);
|
|
262
|
+
// Create CSV content
|
|
263
|
+
let csv = 'Timestamp,Session,Agent,Command,Input Tokens,Output Tokens,Total\n';
|
|
264
|
+
if (tokenData.history) {
|
|
265
|
+
tokenData.history.forEach((entry)=>{
|
|
266
|
+
const date = new Date(entry.timestamp).toISOString();
|
|
267
|
+
const total = entry.inputTokens + entry.outputTokens;
|
|
268
|
+
csv += `${date},${entry.sessionId},${entry.agentType},${entry.command},${entry.inputTokens},${entry.outputTokens},${total}\n`;
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
// Add summary at the end
|
|
272
|
+
csv += '\nSUMMARY\n';
|
|
273
|
+
csv += `Total Input Tokens,${tokenData.input}\n`;
|
|
274
|
+
csv += `Total Output Tokens,${tokenData.output}\n`;
|
|
275
|
+
csv += `Total Tokens,${tokenData.total}\n`;
|
|
276
|
+
if (tokenData.byAgent) {
|
|
277
|
+
csv += '\nBY AGENT TYPE\n';
|
|
278
|
+
Object.entries(tokenData.byAgent).forEach(([type, usage])=>{
|
|
279
|
+
csv += `${type},${usage}\n`;
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
await fs.writeFile(csvPath, csv);
|
|
283
|
+
return csvPath;
|
|
338
284
|
}
|
|
339
|
-
|
|
340
285
|
/**
|
|
341
286
|
* Get icon for agent type
|
|
342
|
-
*/
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
return icons[agentType] || '๐ค';
|
|
287
|
+
*/ export function getAgentIcon(agentType) {
|
|
288
|
+
const icons = {
|
|
289
|
+
coordinator: '๐ฏ',
|
|
290
|
+
developer: '๐จโ๐ป',
|
|
291
|
+
researcher: '๐',
|
|
292
|
+
analyzer: '๐',
|
|
293
|
+
tester: '๐งช',
|
|
294
|
+
architect: '๐๏ธ',
|
|
295
|
+
general: '๐ค'
|
|
296
|
+
};
|
|
297
|
+
return icons[agentType] || '๐ค';
|
|
354
298
|
}
|
|
355
|
-
|
|
356
299
|
/**
|
|
357
300
|
* Reset token tracking (for testing)
|
|
358
|
-
*/
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
await saveTokenData();
|
|
301
|
+
*/ export async function resetTokenTracking() {
|
|
302
|
+
tokenCache = {
|
|
303
|
+
sessions: {},
|
|
304
|
+
totals: {
|
|
305
|
+
input: 0,
|
|
306
|
+
output: 0,
|
|
307
|
+
total: 0
|
|
308
|
+
},
|
|
309
|
+
byAgent: {},
|
|
310
|
+
byCommand: {},
|
|
311
|
+
history: []
|
|
312
|
+
};
|
|
313
|
+
await saveTokenData();
|
|
372
314
|
}
|