@monoes/monomindcli 1.10.54 → 1.10.56

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.
Files changed (441) hide show
  1. package/.claude/agents/optimization/benchmark-suite.md +2 -0
  2. package/.claude/agents/optimization/load-balancer.md +2 -0
  3. package/.claude/agents/optimization/performance-monitor.md +2 -0
  4. package/.claude/agents/optimization/resource-allocator.md +3 -1
  5. package/.claude/agents/optimization/topology-optimizer.md +2 -0
  6. package/.claude/commands/mastermind/_repeat.md +21 -0
  7. package/.claude/commands/mastermind/_taskfile.md +235 -0
  8. package/.claude/commands/mastermind/adr.md +11 -0
  9. package/.claude/commands/mastermind/approve.md +94 -0
  10. package/.claude/commands/mastermind/autodev.md +32 -0
  11. package/.claude/commands/mastermind/budget.md +7 -0
  12. package/.claude/commands/mastermind/code-review.md +317 -0
  13. package/.claude/commands/mastermind/createorg.md +40 -1
  14. package/.claude/commands/mastermind/createtask.md +383 -0
  15. package/.claude/commands/mastermind/debug.md +22 -0
  16. package/.claude/commands/mastermind/design.md +20 -0
  17. package/.claude/commands/mastermind/do.md +526 -0
  18. package/.claude/commands/mastermind/execute.md +20 -0
  19. package/.claude/commands/mastermind/finish.md +20 -0
  20. package/.claude/commands/mastermind/graph-status.md +7 -0
  21. package/.claude/commands/mastermind/help.md +118 -0
  22. package/.claude/commands/mastermind/ideate.md +261 -0
  23. package/.claude/commands/mastermind/improve.md +345 -0
  24. package/.claude/commands/mastermind/loops.md +7 -0
  25. package/.claude/commands/mastermind/master.md +186 -6
  26. package/.claude/commands/mastermind/memory.md +230 -0
  27. package/.claude/commands/mastermind/plan.md +26 -0
  28. package/.claude/commands/mastermind/receive-review.md +20 -0
  29. package/.claude/commands/mastermind/repeat.md +257 -0
  30. package/.claude/commands/mastermind/runorg.md +3 -0
  31. package/.claude/commands/mastermind/skill-builder.md +20 -0
  32. package/.claude/commands/mastermind/specialagents.md +125 -0
  33. package/.claude/commands/mastermind/swarm.md +161 -0
  34. package/.claude/commands/mastermind/taskdev.md +26 -0
  35. package/.claude/commands/mastermind/tdd.md +22 -0
  36. package/.claude/commands/mastermind/techport.md +4 -0
  37. package/.claude/commands/mastermind/understand.md +139 -0
  38. package/.claude/commands/mastermind/verify.md +22 -0
  39. package/.claude/commands/mastermind/worktree.md +20 -0
  40. package/.claude/helpers/handlers/graph-status-handler.cjs +2 -1
  41. package/.claude/helpers/hook-handler.cjs +19 -0
  42. package/.claude/helpers/skill-registry.json +23 -0
  43. package/.claude/helpers/statusline.cjs +1 -1
  44. package/.claude/skills/mastermind/approve.md +15 -7
  45. package/.claude/skills/mastermind/autodev.md +534 -0
  46. package/.claude/skills/mastermind/createorg.md +21 -5
  47. package/.claude/skills/mastermind/debug.md +232 -0
  48. package/.claude/skills/mastermind/design.md +187 -0
  49. package/.claude/skills/mastermind/execute.md +104 -0
  50. package/.claude/skills/mastermind/finish.md +251 -0
  51. package/.claude/skills/mastermind/plan.md +180 -0
  52. package/.claude/skills/mastermind/receive-review.md +213 -0
  53. package/.claude/skills/mastermind/runorg.md +23 -8
  54. package/.claude/skills/mastermind/skill-builder.md +274 -0
  55. package/.claude/skills/mastermind/taskdev.md +307 -0
  56. package/.claude/skills/mastermind/tdd.md +394 -0
  57. package/.claude/skills/mastermind/verify.md +196 -0
  58. package/.claude/skills/mastermind/worktree.md +160 -132
  59. package/README.md +320 -253
  60. package/dist/src/commands/analyze.d.ts.map +1 -1
  61. package/dist/src/commands/analyze.js +9 -2
  62. package/dist/src/commands/analyze.js.map +1 -1
  63. package/dist/src/commands/benchmark.js.map +1 -1
  64. package/dist/src/commands/completions.js +1 -1
  65. package/dist/src/commands/guidance.js +7 -7
  66. package/dist/src/commands/hooks.d.ts.map +1 -1
  67. package/dist/src/commands/hooks.js +16 -3
  68. package/dist/src/commands/hooks.js.map +1 -1
  69. package/dist/src/commands/index.d.ts +3 -2
  70. package/dist/src/commands/index.d.ts.map +1 -1
  71. package/dist/src/commands/index.js +7 -0
  72. package/dist/src/commands/index.js.map +1 -1
  73. package/dist/src/commands/init.d.ts.map +1 -1
  74. package/dist/src/commands/init.js +47 -13
  75. package/dist/src/commands/init.js.map +1 -1
  76. package/dist/src/commands/neural.d.ts.map +1 -1
  77. package/dist/src/commands/neural.js +100 -14
  78. package/dist/src/commands/neural.js.map +1 -1
  79. package/dist/src/commands/platforms.d.ts +11 -0
  80. package/dist/src/commands/platforms.d.ts.map +1 -0
  81. package/dist/src/commands/platforms.js +195 -0
  82. package/dist/src/commands/platforms.js.map +1 -0
  83. package/dist/src/commands/ruvector/backup.js.map +1 -1
  84. package/dist/src/commands/ruvector/benchmark.js.map +1 -1
  85. package/dist/src/commands/ruvector/init.js.map +1 -1
  86. package/dist/src/commands/ruvector/migrate.js.map +1 -1
  87. package/dist/src/commands/ruvector/optimize.js.map +1 -1
  88. package/dist/src/commands/ruvector/status.js.map +1 -1
  89. package/dist/src/commands/update.js +6 -6
  90. package/dist/src/init/executor.d.ts.map +1 -1
  91. package/dist/src/init/executor.js +28 -0
  92. package/dist/src/init/executor.js.map +1 -1
  93. package/dist/src/init/statusline-generator.js +1 -1
  94. package/dist/src/init/types.d.ts +1 -0
  95. package/dist/src/init/types.d.ts.map +1 -1
  96. package/dist/src/mcp-server.d.ts.map +1 -1
  97. package/dist/src/mcp-server.js +92 -0
  98. package/dist/src/mcp-server.js.map +1 -1
  99. package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
  100. package/dist/src/mcp-tools/hive-mind-tools.js +52 -0
  101. package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
  102. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  103. package/dist/src/mcp-tools/hooks-tools.js +106 -5
  104. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  105. package/dist/src/mcp-tools/index.d.ts +0 -5
  106. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  107. package/dist/src/mcp-tools/index.js +0 -5
  108. package/dist/src/mcp-tools/index.js.map +1 -1
  109. package/dist/src/mcp-tools/monograph-tools.d.ts.map +1 -1
  110. package/dist/src/mcp-tools/monograph-tools.js +507 -5587
  111. package/dist/src/mcp-tools/monograph-tools.js.map +1 -1
  112. package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
  113. package/dist/src/mcp-tools/neural-tools.js +64 -4
  114. package/dist/src/mcp-tools/neural-tools.js.map +1 -1
  115. package/dist/src/mcp-tools/security-tools.js +4 -4
  116. package/dist/src/memory/intelligence.d.ts +2 -2
  117. package/dist/src/memory/intelligence.d.ts.map +1 -1
  118. package/dist/src/memory/intelligence.js +108 -3
  119. package/dist/src/memory/intelligence.js.map +1 -1
  120. package/dist/src/memory/memory-bridge.js +1 -1
  121. package/dist/src/memory/memory-bridge.js.map +1 -1
  122. package/dist/src/memory/sona-optimizer.d.ts +1 -10
  123. package/dist/src/memory/sona-optimizer.d.ts.map +1 -1
  124. package/dist/src/memory/sona-optimizer.js +0 -46
  125. package/dist/src/memory/sona-optimizer.js.map +1 -1
  126. package/dist/src/runtime/headless.js +3 -3
  127. package/dist/src/ruvector/diff-classifier.d.ts +0 -2
  128. package/dist/src/ruvector/diff-classifier.d.ts.map +1 -1
  129. package/dist/src/ruvector/diff-classifier.js +2 -14
  130. package/dist/src/ruvector/diff-classifier.js.map +1 -1
  131. package/dist/src/ruvector/index.d.ts +26 -9
  132. package/dist/src/ruvector/index.d.ts.map +1 -1
  133. package/dist/src/ruvector/index.js +3 -21
  134. package/dist/src/ruvector/index.js.map +1 -1
  135. package/dist/src/ruvector/ruvllm-wasm.js +2 -2
  136. package/dist/src/ruvector/ruvllm-wasm.js.map +1 -1
  137. package/dist/src/types.d.ts +0 -15
  138. package/dist/src/types.d.ts.map +1 -1
  139. package/dist/src/types.js +0 -18
  140. package/dist/src/types.js.map +1 -1
  141. package/dist/src/ui/dashboard.html +8763 -9766
  142. package/dist/src/ui/orgs.html +1 -1
  143. package/dist/src/ui/server.mjs +504 -35
  144. package/dist/src/update/index.js +1 -1
  145. package/dist/src/update/validator.js +8 -8
  146. package/dist/tsconfig.tsbuildinfo +1 -1
  147. package/package.json +2 -2
  148. package/.claude/agents/academic/academic-anthropologist.md +0 -126
  149. package/.claude/agents/academic/academic-geographer.md +0 -128
  150. package/.claude/agents/academic/academic-historian.md +0 -124
  151. package/.claude/agents/academic/academic-narratologist.md +0 -119
  152. package/.claude/agents/academic/academic-psychologist.md +0 -119
  153. package/.claude/agents/analysis/analyze-code-quality.md +0 -58
  154. package/.claude/agents/analysis/code-analyzer.md +0 -189
  155. package/.claude/agents/analysis/code-review/analyze-code-quality.md +0 -58
  156. package/.claude/agents/consensus/performance-benchmarker.md +0 -831
  157. package/.claude/agents/data/ml/data-ml-model.md +0 -76
  158. package/.claude/agents/development/dev-backend-api.md +0 -178
  159. package/.claude/agents/devops/ci-cd/ops-cicd-github.md +0 -52
  160. package/.claude/agents/documentation/api-docs/docs-api-openapi.md +0 -63
  161. package/.claude/agents/game-development/blender/blender-addon-engineer.md +0 -235
  162. package/.claude/agents/game-development/game-audio-engineer.md +0 -265
  163. package/.claude/agents/game-development/game-designer.md +0 -168
  164. package/.claude/agents/game-development/godot/godot-gameplay-scripter.md +0 -335
  165. package/.claude/agents/game-development/godot/godot-multiplayer-engineer.md +0 -298
  166. package/.claude/agents/game-development/godot/godot-shader-developer.md +0 -267
  167. package/.claude/agents/game-development/level-designer.md +0 -209
  168. package/.claude/agents/game-development/narrative-designer.md +0 -244
  169. package/.claude/agents/game-development/roblox-studio/roblox-avatar-creator.md +0 -298
  170. package/.claude/agents/game-development/roblox-studio/roblox-experience-designer.md +0 -306
  171. package/.claude/agents/game-development/roblox-studio/roblox-systems-scripter.md +0 -326
  172. package/.claude/agents/game-development/technical-artist.md +0 -230
  173. package/.claude/agents/game-development/unity/unity-architect.md +0 -272
  174. package/.claude/agents/game-development/unity/unity-editor-tool-developer.md +0 -311
  175. package/.claude/agents/game-development/unity/unity-multiplayer-engineer.md +0 -322
  176. package/.claude/agents/game-development/unity/unity-shader-graph-artist.md +0 -270
  177. package/.claude/agents/game-development/unreal-engine/unreal-multiplayer-architect.md +0 -314
  178. package/.claude/agents/game-development/unreal-engine/unreal-systems-engineer.md +0 -311
  179. package/.claude/agents/game-development/unreal-engine/unreal-technical-artist.md +0 -257
  180. package/.claude/agents/game-development/unreal-engine/unreal-world-builder.md +0 -274
  181. package/.claude/agents/github/release-swarm.md +0 -597
  182. package/.claude/agents/goal/agent.md +0 -804
  183. package/.claude/agents/goal/code-goal-planner.md +0 -445
  184. package/.claude/agents/marketing/marketing-ai-citation-strategist.md +0 -171
  185. package/.claude/agents/marketing/marketing-app-store-optimizer.md +0 -322
  186. package/.claude/agents/marketing/marketing-baidu-seo-specialist.md +0 -227
  187. package/.claude/agents/marketing/marketing-bilibili-content-strategist.md +0 -200
  188. package/.claude/agents/marketing/marketing-book-co-author.md +0 -111
  189. package/.claude/agents/marketing/marketing-carousel-growth-engine.md +0 -200
  190. package/.claude/agents/marketing/marketing-china-ecommerce-operator.md +0 -284
  191. package/.claude/agents/marketing/marketing-content-creator.md +0 -67
  192. package/.claude/agents/marketing/marketing-cross-border-ecommerce.md +0 -260
  193. package/.claude/agents/marketing/marketing-douyin-strategist.md +0 -150
  194. package/.claude/agents/marketing/marketing-growth-hacker.md +0 -54
  195. package/.claude/agents/marketing/marketing-instagram-curator.md +0 -114
  196. package/.claude/agents/marketing/marketing-kuaishou-strategist.md +0 -224
  197. package/.claude/agents/marketing/marketing-linkedin-content-creator.md +0 -215
  198. package/.claude/agents/marketing/marketing-livestream-commerce-coach.md +0 -306
  199. package/.claude/agents/marketing/marketing-podcast-strategist.md +0 -278
  200. package/.claude/agents/marketing/marketing-private-domain-operator.md +0 -309
  201. package/.claude/agents/marketing/marketing-reddit-community-builder.md +0 -124
  202. package/.claude/agents/marketing/marketing-seo-specialist.md +0 -279
  203. package/.claude/agents/marketing/marketing-short-video-editing-coach.md +0 -413
  204. package/.claude/agents/marketing/marketing-social-media-strategist.md +0 -125
  205. package/.claude/agents/marketing/marketing-tiktok-strategist.md +0 -126
  206. package/.claude/agents/marketing/marketing-twitter-engager.md +0 -127
  207. package/.claude/agents/marketing/marketing-wechat-official-account.md +0 -146
  208. package/.claude/agents/marketing/marketing-weibo-strategist.md +0 -241
  209. package/.claude/agents/marketing/marketing-xiaohongshu-specialist.md +0 -139
  210. package/.claude/agents/marketing/marketing-zhihu-strategist.md +0 -163
  211. package/.claude/agents/neural/safla-neural.md +0 -74
  212. package/.claude/agents/paid-media/paid-media-auditor.md +0 -71
  213. package/.claude/agents/paid-media/paid-media-creative-strategist.md +0 -71
  214. package/.claude/agents/paid-media/paid-media-paid-social-strategist.md +0 -71
  215. package/.claude/agents/paid-media/paid-media-ppc-strategist.md +0 -71
  216. package/.claude/agents/paid-media/paid-media-programmatic-buyer.md +0 -71
  217. package/.claude/agents/paid-media/paid-media-search-query-analyst.md +0 -71
  218. package/.claude/agents/paid-media/paid-media-tracking-specialist.md +0 -71
  219. package/.claude/agents/payments/agentic-payments.md +0 -126
  220. package/.claude/agents/product/product-behavioral-nudge-engine.md +0 -81
  221. package/.claude/agents/product/product-feedback-synthesizer.md +0 -119
  222. package/.claude/agents/product/product-manager.md +0 -469
  223. package/.claude/agents/product/product-sprint-prioritizer.md +0 -154
  224. package/.claude/agents/product/product-trend-researcher.md +0 -159
  225. package/.claude/agents/project-management/project-management-experiment-tracker.md +0 -199
  226. package/.claude/agents/project-management/project-management-jira-workflow-steward.md +0 -231
  227. package/.claude/agents/project-management/project-management-project-shepherd.md +0 -195
  228. package/.claude/agents/project-management/project-management-studio-operations.md +0 -201
  229. package/.claude/agents/project-management/project-management-studio-producer.md +0 -204
  230. package/.claude/agents/project-management/project-manager-senior.md +0 -136
  231. package/.claude/agents/reasoning/agent.md +0 -804
  232. package/.claude/agents/reasoning/goal-planner.md +0 -73
  233. package/.claude/agents/sales/sales-account-strategist.md +0 -228
  234. package/.claude/agents/sales/sales-coach.md +0 -272
  235. package/.claude/agents/sales/sales-deal-strategist.md +0 -181
  236. package/.claude/agents/sales/sales-discovery-coach.md +0 -226
  237. package/.claude/agents/sales/sales-engineer.md +0 -183
  238. package/.claude/agents/sales/sales-outbound-strategist.md +0 -202
  239. package/.claude/agents/sales/sales-pipeline-analyst.md +0 -268
  240. package/.claude/agents/sales/sales-proposal-strategist.md +0 -218
  241. package/.claude/agents/sona/sona-learning-optimizer.md +0 -65
  242. package/.claude/agents/spatial-computing/macos-spatial-metal-engineer.md +0 -338
  243. package/.claude/agents/spatial-computing/terminal-integration-specialist.md +0 -71
  244. package/.claude/agents/spatial-computing/visionos-spatial-engineer.md +0 -55
  245. package/.claude/agents/specialists/memory-specialist.md +0 -298
  246. package/.claude/agents/specialists/performance-engineer.md +0 -387
  247. package/.claude/agents/specialists/queen-coordinator.md +0 -67
  248. package/.claude/agents/specialists/security-architect.md +0 -154
  249. package/.claude/agents/specialized/accounts-payable-agent.md +0 -186
  250. package/.claude/agents/specialized/corporate-training-designer.md +0 -193
  251. package/.claude/agents/specialized/data-consolidation-agent.md +0 -61
  252. package/.claude/agents/specialized/government-digital-presales-consultant.md +0 -364
  253. package/.claude/agents/specialized/healthcare-marketing-compliance.md +0 -396
  254. package/.claude/agents/specialized/recruitment-specialist.md +0 -510
  255. package/.claude/agents/specialized/report-distribution-agent.md +0 -66
  256. package/.claude/agents/specialized/sales-data-extraction-agent.md +0 -68
  257. package/.claude/agents/specialized/specialized-french-consulting-market.md +0 -193
  258. package/.claude/agents/specialized/specialized-korean-business-navigator.md +0 -217
  259. package/.claude/agents/specialized/specialized-salesforce-architect.md +0 -181
  260. package/.claude/agents/specialized/study-abroad-advisor.md +0 -283
  261. package/.claude/agents/specialized/supply-chain-strategist.md +0 -583
  262. package/.claude/agents/sublinear/consensus-coordinator.md +0 -333
  263. package/.claude/agents/sublinear/matrix-optimizer.md +0 -180
  264. package/.claude/agents/sublinear/pagerank-analyzer.md +0 -295
  265. package/.claude/agents/sublinear/performance-optimizer.md +0 -363
  266. package/.claude/agents/sublinear/trading-predictor.md +0 -242
  267. package/.claude/agents/support/support-analytics-reporter.md +0 -366
  268. package/.claude/agents/support/support-executive-summary-generator.md +0 -213
  269. package/.claude/agents/support/support-finance-tracker.md +0 -443
  270. package/.claude/agents/support/support-infrastructure-maintainer.md +0 -619
  271. package/.claude/agents/support/support-legal-compliance-checker.md +0 -589
  272. package/.claude/agents/support/support-support-responder.md +0 -586
  273. package/.claude/agents/swarm/adaptive-coordinator.md +0 -364
  274. package/.claude/agents/swarm/hierarchical-coordinator.md +0 -318
  275. package/.claude/agents/templates/github-pr-manager.md +0 -155
  276. package/.claude/agents/templates/memory-coordinator.md +0 -163
  277. package/.claude/agents/templates/migration-plan.md +0 -724
  278. package/.claude/agents/templates/orchestrator-task.md +0 -120
  279. package/.claude/agents/templates/performance-analyzer.md +0 -179
  280. package/.claude/agents/templates/sparc-coordinator.md +0 -163
  281. package/.claude/agents/testing/testing-reality-checker.md +0 -237
  282. package/.claude/commands/analysis/token-efficiency.md +0 -42
  283. package/.claude/commands/optimization/README.md +0 -73
  284. package/.claude/commands/optimization/parallel-execution.md +0 -76
  285. package/.claude/commands/swarm/swarm-analysis.md +0 -62
  286. package/.claude/commands/swarm/swarm-background.md +0 -65
  287. package/.claude/commands/swarm/swarm-modes.md +0 -67
  288. package/.claude/commands/swarm/swarm-monitor.md +0 -54
  289. package/.claude/commands/swarm/swarm-status.md +0 -44
  290. package/.claude/commands/swarm/swarm-strategies.md +0 -76
  291. package/.claude/commands/training/model-update.md +0 -78
  292. package/.claude/commands/training/pattern-learn.md +0 -69
  293. package/.claude/commands/training/specialization.md +0 -92
  294. package/.claude/commands/verify/check.md +0 -106
  295. package/.claude/commands/verify/start.md +0 -105
  296. package/.claude/helpers/README.md +0 -105
  297. package/.claude/helpers/context-persistence-hook.mjs +0 -1988
  298. package/.claude/helpers/intelligence.cjs +0 -247
  299. package/.claude/helpers/learning-service.mjs +0 -1302
  300. package/.claude/helpers/memory-palace.cjs +0 -461
  301. package/.claude/helpers/memory.cjs +0 -84
  302. package/.claude/helpers/metrics-db.mjs +0 -488
  303. package/.claude/helpers/router.cjs +0 -559
  304. package/.claude/helpers/session.cjs +0 -126
  305. package/.claude/helpers/swarm-hooks.sh +0 -761
  306. package/.claude/helpers/toggle-statusline.cjs +0 -58
  307. package/.claude/helpers/token-tracker.cjs +0 -934
  308. package/.claude/skills/agentdb-advanced/SKILL.md +0 -549
  309. package/.claude/skills/agentdb-learning/SKILL.md +0 -544
  310. package/.claude/skills/agentdb-memory-patterns/SKILL.md +0 -337
  311. package/.claude/skills/agentdb-optimization/SKILL.md +0 -508
  312. package/.claude/skills/agentdb-vector-search/SKILL.md +0 -335
  313. package/.claude/skills/agentic-integration/SKILL.md +0 -265
  314. package/.claude/skills/cli-modernization/SKILL.md +0 -950
  315. package/.claude/skills/core-implementation/SKILL.md +0 -892
  316. package/.claude/skills/ddd-architecture/SKILL.md +0 -444
  317. package/.claude/skills/github-code-review/SKILL.md +0 -1147
  318. package/.claude/skills/github-multi-repo/SKILL.md +0 -912
  319. package/.claude/skills/github-project-management/SKILL.md +0 -1245
  320. package/.claude/skills/github-release-management/SKILL.md +0 -1118
  321. package/.claude/skills/github-workflow-automation/SKILL.md +0 -1107
  322. package/.claude/skills/mcp-optimization/SKILL.md +0 -837
  323. package/.claude/skills/memory-unification/SKILL.md +0 -196
  324. package/.claude/skills/performance-optimization/SKILL.md +0 -416
  325. package/.claude/skills/reasoningbank-agentdb/SKILL.md +0 -444
  326. package/.claude/skills/reasoningbank-intelligence/SKILL.md +0 -199
  327. package/.claude/skills/security-hardening/SKILL.md +0 -101
  328. package/.claude/skills/stream-chain/SKILL.md +0 -560
  329. package/.claude/skills/swarm-coordination/SKILL.md +0 -451
  330. package/bundled-graph/dist/src/analyze.d.ts +0 -32
  331. package/bundled-graph/dist/src/analyze.d.ts.map +0 -1
  332. package/bundled-graph/dist/src/analyze.js +0 -297
  333. package/bundled-graph/dist/src/analyze.js.map +0 -1
  334. package/bundled-graph/dist/src/build.d.ts +0 -8
  335. package/bundled-graph/dist/src/build.d.ts.map +0 -1
  336. package/bundled-graph/dist/src/build.js.map +0 -1
  337. package/bundled-graph/dist/src/cache.d.ts +0 -12
  338. package/bundled-graph/dist/src/cache.d.ts.map +0 -1
  339. package/bundled-graph/dist/src/cache.js +0 -43
  340. package/bundled-graph/dist/src/cache.js.map +0 -1
  341. package/bundled-graph/dist/src/cluster.d.ts +0 -5
  342. package/bundled-graph/dist/src/cluster.d.ts.map +0 -1
  343. package/bundled-graph/dist/src/cluster.js.map +0 -1
  344. package/bundled-graph/dist/src/detect.d.ts +0 -21
  345. package/bundled-graph/dist/src/detect.d.ts.map +0 -1
  346. package/bundled-graph/dist/src/detect.js +0 -195
  347. package/bundled-graph/dist/src/detect.js.map +0 -1
  348. package/bundled-graph/dist/src/export.d.ts +0 -21
  349. package/bundled-graph/dist/src/export.d.ts.map +0 -1
  350. package/bundled-graph/dist/src/export.js +0 -68
  351. package/bundled-graph/dist/src/export.js.map +0 -1
  352. package/bundled-graph/dist/src/extract/index.d.ts +0 -20
  353. package/bundled-graph/dist/src/extract/index.d.ts.map +0 -1
  354. package/bundled-graph/dist/src/extract/index.js +0 -158
  355. package/bundled-graph/dist/src/extract/index.js.map +0 -1
  356. package/bundled-graph/dist/src/extract/languages/c.d.ts +0 -3
  357. package/bundled-graph/dist/src/extract/languages/c.d.ts.map +0 -1
  358. package/bundled-graph/dist/src/extract/languages/c.js +0 -88
  359. package/bundled-graph/dist/src/extract/languages/c.js.map +0 -1
  360. package/bundled-graph/dist/src/extract/languages/cpp.d.ts +0 -3
  361. package/bundled-graph/dist/src/extract/languages/cpp.d.ts.map +0 -1
  362. package/bundled-graph/dist/src/extract/languages/cpp.js +0 -121
  363. package/bundled-graph/dist/src/extract/languages/cpp.js.map +0 -1
  364. package/bundled-graph/dist/src/extract/languages/csharp.d.ts +0 -3
  365. package/bundled-graph/dist/src/extract/languages/csharp.d.ts.map +0 -1
  366. package/bundled-graph/dist/src/extract/languages/csharp.js +0 -121
  367. package/bundled-graph/dist/src/extract/languages/csharp.js.map +0 -1
  368. package/bundled-graph/dist/src/extract/languages/go.d.ts +0 -3
  369. package/bundled-graph/dist/src/extract/languages/go.d.ts.map +0 -1
  370. package/bundled-graph/dist/src/extract/languages/go.js +0 -181
  371. package/bundled-graph/dist/src/extract/languages/go.js.map +0 -1
  372. package/bundled-graph/dist/src/extract/languages/java.d.ts +0 -3
  373. package/bundled-graph/dist/src/extract/languages/java.d.ts.map +0 -1
  374. package/bundled-graph/dist/src/extract/languages/java.js +0 -117
  375. package/bundled-graph/dist/src/extract/languages/java.js.map +0 -1
  376. package/bundled-graph/dist/src/extract/languages/kotlin.d.ts +0 -3
  377. package/bundled-graph/dist/src/extract/languages/kotlin.d.ts.map +0 -1
  378. package/bundled-graph/dist/src/extract/languages/kotlin.js +0 -112
  379. package/bundled-graph/dist/src/extract/languages/kotlin.js.map +0 -1
  380. package/bundled-graph/dist/src/extract/languages/php.d.ts +0 -3
  381. package/bundled-graph/dist/src/extract/languages/php.d.ts.map +0 -1
  382. package/bundled-graph/dist/src/extract/languages/php.js +0 -130
  383. package/bundled-graph/dist/src/extract/languages/php.js.map +0 -1
  384. package/bundled-graph/dist/src/extract/languages/python.d.ts +0 -3
  385. package/bundled-graph/dist/src/extract/languages/python.d.ts.map +0 -1
  386. package/bundled-graph/dist/src/extract/languages/python.js +0 -230
  387. package/bundled-graph/dist/src/extract/languages/python.js.map +0 -1
  388. package/bundled-graph/dist/src/extract/languages/ruby.d.ts +0 -3
  389. package/bundled-graph/dist/src/extract/languages/ruby.d.ts.map +0 -1
  390. package/bundled-graph/dist/src/extract/languages/ruby.js +0 -120
  391. package/bundled-graph/dist/src/extract/languages/ruby.js.map +0 -1
  392. package/bundled-graph/dist/src/extract/languages/rust.d.ts +0 -3
  393. package/bundled-graph/dist/src/extract/languages/rust.d.ts.map +0 -1
  394. package/bundled-graph/dist/src/extract/languages/rust.js +0 -195
  395. package/bundled-graph/dist/src/extract/languages/rust.js.map +0 -1
  396. package/bundled-graph/dist/src/extract/languages/scala.d.ts +0 -3
  397. package/bundled-graph/dist/src/extract/languages/scala.d.ts.map +0 -1
  398. package/bundled-graph/dist/src/extract/languages/scala.js +0 -110
  399. package/bundled-graph/dist/src/extract/languages/scala.js.map +0 -1
  400. package/bundled-graph/dist/src/extract/languages/swift.d.ts +0 -3
  401. package/bundled-graph/dist/src/extract/languages/swift.d.ts.map +0 -1
  402. package/bundled-graph/dist/src/extract/languages/swift.js +0 -122
  403. package/bundled-graph/dist/src/extract/languages/swift.js.map +0 -1
  404. package/bundled-graph/dist/src/extract/languages/typescript.d.ts +0 -3
  405. package/bundled-graph/dist/src/extract/languages/typescript.d.ts.map +0 -1
  406. package/bundled-graph/dist/src/extract/languages/typescript.js +0 -295
  407. package/bundled-graph/dist/src/extract/languages/typescript.js.map +0 -1
  408. package/bundled-graph/dist/src/extract/semantic.d.ts +0 -38
  409. package/bundled-graph/dist/src/extract/semantic.d.ts.map +0 -1
  410. package/bundled-graph/dist/src/extract/semantic.js +0 -242
  411. package/bundled-graph/dist/src/extract/semantic.js.map +0 -1
  412. package/bundled-graph/dist/src/extract/tree-sitter-runner.d.ts +0 -48
  413. package/bundled-graph/dist/src/extract/tree-sitter-runner.d.ts.map +0 -1
  414. package/bundled-graph/dist/src/extract/tree-sitter-runner.js +0 -137
  415. package/bundled-graph/dist/src/extract/tree-sitter-runner.js.map +0 -1
  416. package/bundled-graph/dist/src/extract/types.d.ts +0 -7
  417. package/bundled-graph/dist/src/extract/types.d.ts.map +0 -1
  418. package/bundled-graph/dist/src/extract/types.js +0 -2
  419. package/bundled-graph/dist/src/extract/types.js.map +0 -1
  420. package/bundled-graph/dist/src/index.d.ts +0 -28
  421. package/bundled-graph/dist/src/index.d.ts.map +0 -1
  422. package/bundled-graph/dist/src/index.js +0 -26
  423. package/bundled-graph/dist/src/index.js.map +0 -1
  424. package/bundled-graph/dist/src/pipeline.d.ts +0 -27
  425. package/bundled-graph/dist/src/pipeline.d.ts.map +0 -1
  426. package/bundled-graph/dist/src/pipeline.js +0 -269
  427. package/bundled-graph/dist/src/pipeline.js.map +0 -1
  428. package/bundled-graph/dist/src/report.d.ts +0 -26
  429. package/bundled-graph/dist/src/report.d.ts.map +0 -1
  430. package/bundled-graph/dist/src/report.js +0 -214
  431. package/bundled-graph/dist/src/report.js.map +0 -1
  432. package/bundled-graph/dist/src/types.d.ts +0 -124
  433. package/bundled-graph/dist/src/types.d.ts.map +0 -1
  434. package/bundled-graph/dist/src/types.js +0 -2
  435. package/bundled-graph/dist/src/types.js.map +0 -1
  436. package/bundled-graph/dist/src/visualize.d.ts +0 -4
  437. package/bundled-graph/dist/src/visualize.d.ts.map +0 -1
  438. package/bundled-graph/dist/src/visualize.js +0 -574
  439. package/bundled-graph/dist/src/visualize.js.map +0 -1
  440. package/bundled-graph/dist/tsconfig.tsbuildinfo +0 -1
  441. package/dist/src/ui/dashboard-v2.html +0 -5316
@@ -1,934 +0,0 @@
1
- #!/usr/bin/env node
2
- 'use strict';
3
- /**
4
- * Token Tracker — Monomind port of codeburn
5
- * Parses ~/.claude/projects/**\/*.jsonl to aggregate token usage and costs.
6
- * Pure Node.js built-ins only (fs, os, path).
7
- */
8
-
9
- const fs = require('fs');
10
- const os = require('os');
11
- const path = require('path');
12
-
13
- // ── Pricing (mirrored from codeburn models.ts) ────────────────────────────────
14
- const WEB_SEARCH_COST = 0.01;
15
-
16
- const FALLBACK_PRICING = {
17
- 'claude-opus-4-6': { in: 5e-6, out: 25e-6, cw: 6.25e-6, cr: 0.5e-6, fast: 6 },
18
- 'claude-opus-4-5': { in: 5e-6, out: 25e-6, cw: 6.25e-6, cr: 0.5e-6, fast: 1 },
19
- 'claude-opus-4-1': { in: 15e-6, out: 75e-6, cw: 18.75e-6, cr: 1.5e-6, fast: 1 },
20
- 'claude-opus-4': { in: 15e-6, out: 75e-6, cw: 18.75e-6, cr: 1.5e-6, fast: 1 },
21
- 'claude-sonnet-4-6':{ in: 3e-6, out: 15e-6, cw: 3.75e-6, cr: 0.3e-6, fast: 1 },
22
- 'claude-sonnet-4-5':{ in: 3e-6, out: 15e-6, cw: 3.75e-6, cr: 0.3e-6, fast: 1 },
23
- 'claude-sonnet-4': { in: 3e-6, out: 15e-6, cw: 3.75e-6, cr: 0.3e-6, fast: 1 },
24
- 'claude-3-7-sonnet':{ in: 3e-6, out: 15e-6, cw: 3.75e-6, cr: 0.3e-6, fast: 1 },
25
- 'claude-3-5-sonnet':{ in: 3e-6, out: 15e-6, cw: 3.75e-6, cr: 0.3e-6, fast: 1 },
26
- 'claude-haiku-4-5': { in: 1e-6, out: 5e-6, cw: 1.25e-6, cr: 0.1e-6, fast: 1 },
27
- 'claude-3-5-haiku': { in: 0.8e-6, out: 4e-6, cw: 1e-6, cr: 0.08e-6, fast: 1 },
28
- 'gpt-4o': { in: 2.5e-6, out: 10e-6, cw: 2.5e-6, cr: 1.25e-6, fast: 1 },
29
- 'gpt-4o-mini': { in: 0.15e-6, out: 0.6e-6, cw: 0.15e-6, cr: 0.075e-6, fast: 1 },
30
- 'gemini-2.5-pro': { in: 1.25e-6, out: 10e-6, cw: 1.25e-6, cr: 0.315e-6, fast: 1 },
31
- 'gpt-5': { in: 2.5e-6, out: 10e-6, cw: 2.5e-6, cr: 1.25e-6, fast: 1 },
32
- };
33
-
34
- const SHORT_MODEL_NAMES = {
35
- 'claude-opus-4-6': 'Opus 4.6',
36
- 'claude-opus-4-5': 'Opus 4.5',
37
- 'claude-opus-4-1': 'Opus 4.1',
38
- 'claude-opus-4': 'Opus 4',
39
- 'claude-sonnet-4-6': 'Sonnet 4.6',
40
- 'claude-sonnet-4-5': 'Sonnet 4.5',
41
- 'claude-sonnet-4': 'Sonnet 4',
42
- 'claude-3-7-sonnet': 'Sonnet 3.7',
43
- 'claude-3-5-sonnet': 'Sonnet 3.5',
44
- 'claude-haiku-4-5': 'Haiku 4.5',
45
- 'claude-3-5-haiku': 'Haiku 3.5',
46
- 'gpt-4o-mini': 'GPT-4o Mini',
47
- 'gpt-4o': 'GPT-4o',
48
- 'gpt-5': 'GPT-5',
49
- 'gemini-2.5-pro': 'Gemini 2.5 Pro',
50
- };
51
-
52
- function getCanonical(model) {
53
- return model.replace(/@.*$/, '').replace(/-\d{8}$/, '');
54
- }
55
-
56
- function getModelCosts(model) {
57
- var canonical = getCanonical(model);
58
- // Exact match
59
- if (FALLBACK_PRICING[canonical]) return FALLBACK_PRICING[canonical];
60
- // Prefix match
61
- for (var key in FALLBACK_PRICING) {
62
- if (canonical.startsWith(key)) return FALLBACK_PRICING[key];
63
- }
64
- // Suffix match (model contains key)
65
- for (var key in FALLBACK_PRICING) {
66
- if (canonical.indexOf(key) !== -1) return FALLBACK_PRICING[key];
67
- }
68
- return null;
69
- }
70
-
71
- function getShortModelName(model) {
72
- var canonical = getCanonical(model);
73
- for (var key in SHORT_MODEL_NAMES) {
74
- if (canonical === key || canonical.startsWith(key)) return SHORT_MODEL_NAMES[key];
75
- }
76
- return canonical;
77
- }
78
-
79
- function calculateCost(model, inputTokens, outputTokens, cacheWrite, cacheRead, webSearch, speed) {
80
- var costs = getModelCosts(model);
81
- if (!costs) return 0;
82
- var multiplier = (speed === 'fast') ? costs.fast : 1;
83
- return multiplier * (
84
- inputTokens * costs.in +
85
- outputTokens * costs.out +
86
- cacheWrite * costs.cw +
87
- cacheRead * costs.cr +
88
- (webSearch || 0) * WEB_SEARCH_COST
89
- );
90
- }
91
-
92
- // ── Classifier (ported from codeburn classifier.ts) ──────────────────────────
93
- var TEST_RE = /\b(test|pytest|vitest|jest|mocha|spec|coverage|npm\s+test|npx\s+vitest|npx\s+jest)\b/i;
94
- var GIT_RE = /\bgit\s+(push|pull|commit|merge|rebase|checkout|branch|stash|log|diff|status|add|reset|cherry-pick|tag)\b/i;
95
- var BUILD_RE = /\b(npm\s+run\s+build|npm\s+publish|pip\s+install|docker|deploy|make\s+build|npm\s+run\s+dev|npm\s+start|pm2|systemctl|brew|cargo\s+build)\b/i;
96
- var INSTALL_RE = /\b(npm\s+install|pip\s+install|brew\s+install|apt\s+install|cargo\s+add)\b/i;
97
-
98
- var DEBUG_RE = /\b(fix|bug|error|broken|failing|crash|issue|debug|traceback|exception|stack\s*trace|not\s+working|wrong|unexpected)\b/i;
99
- var FEATURE_RE = /\b(add|create|implement|new|build|feature|introduce|set\s*up|scaffold|generate)\b/i;
100
- var REFACTOR_RE = /\b(refactor|clean\s*up|rename|reorganize|simplify|extract|restructure|move|migrate|split)\b/i;
101
- var BRAINSTORM_RE = /\b(brainstorm|idea|what\s+if|explore|think\s+about|approach|strategy|design|consider|how\s+should|what\s+would|opinion|suggest|recommend)\b/i;
102
- var RESEARCH_RE = /\b(research|investigate|look\s+into|find\s+out|check|search|analyze|review|understand|explain|how\s+does|what\s+is|show\s+me|list|compare)\b/i;
103
-
104
- var EDIT_TOOLS = new Set(['Edit', 'Write', 'FileEditTool', 'FileWriteTool', 'NotebookEdit', 'MultiEdit']);
105
- var BASH_TOOLS = new Set(['Bash', 'BashTool', 'PowerShellTool']);
106
- var READ_TOOLS = new Set(['Read', 'Grep', 'Glob', 'FileReadTool', 'GrepTool', 'GlobTool']);
107
- var TASK_TOOLS = new Set(['TaskCreate', 'TaskUpdate', 'TaskGet', 'TaskList', 'TaskOutput', 'TaskStop', 'TodoWrite']);
108
- var SEARCH_TOOLS = new Set(['WebSearch', 'WebFetch', 'ToolSearch']);
109
-
110
- function classifyTurn(turn) {
111
- var tools = [];
112
- for (var i = 0; i < turn.calls.length; i++) {
113
- for (var j = 0; j < turn.calls[i].tools.length; j++) {
114
- tools.push(turn.calls[i].tools[j]);
115
- }
116
- }
117
-
118
- var hasPlan = turn.calls.some(function(c) { return c.hasPlanMode; });
119
- var hasAgent = turn.calls.some(function(c) { return c.hasAgentSpawn; });
120
- var hasEdit = tools.some(function(t) { return EDIT_TOOLS.has(t); });
121
- var hasBash = tools.some(function(t) { return BASH_TOOLS.has(t); });
122
- var hasRead = tools.some(function(t) { return READ_TOOLS.has(t); });
123
- var hasTask = tools.some(function(t) { return TASK_TOOLS.has(t); });
124
- var hasSearch = tools.some(function(t) { return SEARCH_TOOLS.has(t); });
125
- var hasMcp = tools.some(function(t) { return t.startsWith('mcp__'); });
126
- var hasSkill = tools.some(function(t) { return t === 'Skill'; });
127
- var msg = turn.userMessage || '';
128
-
129
- if (tools.length === 0) {
130
- if (BRAINSTORM_RE.test(msg)) return 'brainstorming';
131
- if (RESEARCH_RE.test(msg)) return 'exploration';
132
- if (DEBUG_RE.test(msg)) return 'debugging';
133
- if (FEATURE_RE.test(msg)) return 'feature';
134
- return 'conversation';
135
- }
136
-
137
- if (hasPlan) return 'planning';
138
- if (hasAgent) return 'delegation';
139
-
140
- if (hasBash && !hasEdit) {
141
- if (TEST_RE.test(msg)) return 'testing';
142
- if (GIT_RE.test(msg)) return 'git';
143
- if (BUILD_RE.test(msg)) return 'build/deploy';
144
- if (INSTALL_RE.test(msg)) return 'build/deploy';
145
- }
146
-
147
- if (hasEdit) {
148
- if (DEBUG_RE.test(msg)) return 'debugging';
149
- if (REFACTOR_RE.test(msg)) return 'refactoring';
150
- if (FEATURE_RE.test(msg)) return 'feature';
151
- return 'coding';
152
- }
153
-
154
- if (hasBash && hasRead) return 'exploration';
155
- if (hasBash) return 'coding';
156
- if (hasSearch || hasMcp) return 'exploration';
157
- if (hasRead && !hasEdit) return 'exploration';
158
- if (hasTask && !hasEdit) return 'planning';
159
- if (hasSkill) return 'general';
160
-
161
- if (BRAINSTORM_RE.test(msg)) return 'brainstorming';
162
- if (RESEARCH_RE.test(msg)) return 'exploration';
163
- return 'general';
164
- }
165
-
166
- // ── JSONL Parser ──────────────────────────────────────────────────────────────
167
- function parseJsonlLine(line) {
168
- try { return JSON.parse(line); } catch (e) { return null; }
169
- }
170
-
171
- function extractToolNames(content) {
172
- if (!Array.isArray(content)) return [];
173
- return content
174
- .filter(function(b) { return b && b.type === 'tool_use'; })
175
- .map(function(b) { return b.name || ''; });
176
- }
177
-
178
- function getUserText(message) {
179
- if (!message || message.role !== 'user') return '';
180
- var c = message.content;
181
- if (typeof c === 'string') return c;
182
- if (Array.isArray(c)) {
183
- return c.filter(function(b) { return b && b.type === 'text'; })
184
- .map(function(b) { return b.text || ''; })
185
- .join(' ');
186
- }
187
- return '';
188
- }
189
-
190
- function parseApiCall(entry) {
191
- if (entry.type !== 'assistant') return null;
192
- var msg = entry.message;
193
- if (!msg || !msg.usage || !msg.model) return null;
194
- var u = msg.usage;
195
- var tools = extractToolNames(msg.content || []);
196
- var inputTokens = u.input_tokens || 0;
197
- var outputTokens = u.output_tokens || 0;
198
- var cacheWrite = u.cache_creation_input_tokens || 0;
199
- var cacheRead = u.cache_read_input_tokens || 0;
200
- var webSearch = (u.server_tool_use && u.server_tool_use.web_search_requests) || 0;
201
- var speed = u.speed || 'standard';
202
- var cost = calculateCost(msg.model, inputTokens, outputTokens, cacheWrite, cacheRead, webSearch, speed);
203
- return {
204
- model: msg.model,
205
- inputTokens: inputTokens,
206
- outputTokens: outputTokens,
207
- cacheWrite: cacheWrite,
208
- cacheRead: cacheRead,
209
- webSearch: webSearch,
210
- cost: cost,
211
- tools: tools,
212
- hasAgentSpawn: tools.indexOf('Agent') !== -1,
213
- hasPlanMode: tools.indexOf('EnterPlanMode') !== -1,
214
- speed: speed,
215
- timestamp: entry.timestamp || '',
216
- msgId: (msg.id || null),
217
- };
218
- }
219
-
220
- function groupAndClassify(entries, seenMsgIds) {
221
- var turns = [];
222
- var curMsg = '';
223
- var curCalls = [];
224
- var curTs = '';
225
-
226
- for (var i = 0; i < entries.length; i++) {
227
- var e = entries[i];
228
- if (e.type === 'user') {
229
- var text = getUserText(e.message);
230
- if (text.trim()) {
231
- if (curCalls.length > 0) {
232
- turns.push({ userMessage: curMsg, calls: curCalls, timestamp: curTs });
233
- }
234
- curMsg = text;
235
- curCalls = [];
236
- curTs = e.timestamp || '';
237
- }
238
- } else if (e.type === 'assistant') {
239
- var id = e.message && e.message.id;
240
- if (id && seenMsgIds.has(id)) continue;
241
- if (id) seenMsgIds.add(id);
242
- var call = parseApiCall(e);
243
- if (call) curCalls.push(call);
244
- }
245
- }
246
- if (curCalls.length > 0) {
247
- turns.push({ userMessage: curMsg, calls: curCalls, timestamp: curTs });
248
- }
249
-
250
- return turns.map(function(t) {
251
- return Object.assign({}, t, { category: classifyTurn(t) });
252
- });
253
- }
254
-
255
- function parseSessionFile(filePath, project, seenMsgIds, dateStart, dateEnd) {
256
- var content;
257
- try { content = fs.readFileSync(filePath, 'utf-8'); } catch (e) { return null; }
258
- var lines = content.split('\n').filter(function(l) { return l.trim(); });
259
- var entries = [];
260
- for (var i = 0; i < lines.length; i++) {
261
- var e = parseJsonlLine(lines[i]);
262
- if (e) {
263
- if (dateStart || dateEnd) {
264
- if (e.timestamp) {
265
- var ts = new Date(e.timestamp);
266
- if (dateStart && ts < dateStart) continue;
267
- if (dateEnd && ts > dateEnd) continue;
268
- } else if (e.type === 'assistant') {
269
- continue; // skip undated assistant entries when filtering
270
- }
271
- }
272
- entries.push(e);
273
- }
274
- }
275
- if (entries.length === 0) return null;
276
-
277
- var turns = groupAndClassify(entries, seenMsgIds);
278
- if (turns.length === 0) return null;
279
-
280
- // Build summary
281
- var totalCost = 0, totalIn = 0, totalOut = 0, totalCR = 0, totalCW = 0, totalCalls = 0;
282
- var modelBreakdown = {}, categoryBreakdown = {}, toolBreakdown = {}, mcpBreakdown = {};
283
- var firstTs = '', lastTs = '';
284
-
285
- for (var i = 0; i < turns.length; i++) {
286
- var t = turns[i];
287
- if (!categoryBreakdown[t.category]) categoryBreakdown[t.category] = { turns: 0, cost: 0 };
288
- categoryBreakdown[t.category].turns++;
289
- for (var j = 0; j < t.calls.length; j++) {
290
- var c = t.calls[j];
291
- totalCost += c.cost;
292
- totalIn += c.inputTokens;
293
- totalOut += c.outputTokens;
294
- totalCR += c.cacheRead;
295
- totalCW += c.cacheWrite;
296
- totalCalls++;
297
- categoryBreakdown[t.category].cost += c.cost;
298
- var mn = getShortModelName(c.model);
299
- if (!modelBreakdown[mn]) modelBreakdown[mn] = { calls: 0, cost: 0, tokens: 0 };
300
- modelBreakdown[mn].calls++;
301
- modelBreakdown[mn].cost += c.cost;
302
- modelBreakdown[mn].tokens += c.inputTokens + c.outputTokens;
303
- for (var k = 0; k < c.tools.length; k++) {
304
- var tool = c.tools[k];
305
- if (tool.startsWith('mcp__')) {
306
- var srv = tool.split('__')[1] || tool;
307
- if (!mcpBreakdown[srv]) mcpBreakdown[srv] = { calls: 0 };
308
- mcpBreakdown[srv].calls++;
309
- } else {
310
- if (!toolBreakdown[tool]) toolBreakdown[tool] = { calls: 0 };
311
- toolBreakdown[tool].calls++;
312
- }
313
- }
314
- if (!firstTs || c.timestamp < firstTs) firstTs = c.timestamp;
315
- if (!lastTs || c.timestamp > lastTs) lastTs = c.timestamp;
316
- }
317
- }
318
-
319
- if (totalCalls === 0) return null;
320
-
321
- return {
322
- sessionId: path.basename(filePath, '.jsonl'),
323
- project: project,
324
- firstTimestamp: firstTs || (turns[0] && turns[0].timestamp) || '',
325
- lastTimestamp: lastTs || '',
326
- totalCost: totalCost,
327
- totalInputTokens: totalIn,
328
- totalOutputTokens: totalOut,
329
- totalCacheRead: totalCR,
330
- totalCacheWrite: totalCW,
331
- apiCalls: totalCalls,
332
- turns: turns,
333
- modelBreakdown: modelBreakdown,
334
- categoryBreakdown: categoryBreakdown,
335
- toolBreakdown: toolBreakdown,
336
- mcpBreakdown: mcpBreakdown,
337
- };
338
- }
339
-
340
- // ── Directory scanning ────────────────────────────────────────────────────────
341
- function collectJsonlFiles(dirPath) {
342
- var files = [];
343
- var entries;
344
- try { entries = fs.readdirSync(dirPath); } catch (e) { return files; }
345
- for (var i = 0; i < entries.length; i++) {
346
- var e = entries[i];
347
- if (e.endsWith('.jsonl')) {
348
- files.push(path.join(dirPath, e));
349
- } else {
350
- // Check subagents
351
- var subDir = path.join(dirPath, e, 'subagents');
352
- var subFiles;
353
- try { subFiles = fs.readdirSync(subDir); } catch (_) { continue; }
354
- for (var j = 0; j < subFiles.length; j++) {
355
- if (subFiles[j].endsWith('.jsonl')) {
356
- files.push(path.join(subDir, subFiles[j]));
357
- }
358
- }
359
- }
360
- }
361
- return files;
362
- }
363
-
364
- function getClaudeProjectsDir() {
365
- var base = process.env.CLAUDE_CONFIG_DIR || path.join(os.homedir(), '.claude');
366
- return path.join(base, 'projects');
367
- }
368
-
369
- function unsanitize(name) {
370
- return name.replace(/-/g, '/');
371
- }
372
-
373
- /**
374
- * Scan all Claude Code projects and return aggregated data.
375
- * @param {Date|null} dateStart
376
- * @param {Date|null} dateEnd
377
- * @returns {Object[]} Array of project summaries
378
- */
379
- function parseAllSessions(dateStart, dateEnd) {
380
- var projectsDir = getClaudeProjectsDir();
381
- var projectDirs;
382
- try { projectDirs = fs.readdirSync(projectsDir); } catch (e) { return []; }
383
-
384
- var seenMsgIds = new Set();
385
- var projectMap = {};
386
-
387
- for (var i = 0; i < projectDirs.length; i++) {
388
- var dirName = projectDirs[i];
389
- var dirPath = path.join(projectsDir, dirName);
390
- var stat;
391
- try { stat = fs.statSync(dirPath); } catch (e) { continue; }
392
- if (!stat.isDirectory()) continue;
393
-
394
- var jsonlFiles = collectJsonlFiles(dirPath);
395
- for (var j = 0; j < jsonlFiles.length; j++) {
396
- var session = parseSessionFile(jsonlFiles[j], dirName, seenMsgIds, dateStart, dateEnd);
397
- if (session && session.apiCalls > 0) {
398
- if (!projectMap[dirName]) {
399
- projectMap[dirName] = {
400
- project: dirName,
401
- projectPath: unsanitize(dirName),
402
- sessions: [],
403
- totalCost: 0,
404
- totalApiCalls: 0,
405
- };
406
- }
407
- projectMap[dirName].sessions.push(session);
408
- projectMap[dirName].totalCost += session.totalCost;
409
- projectMap[dirName].totalApiCalls += session.apiCalls;
410
- }
411
- }
412
- }
413
-
414
- return Object.values(projectMap).sort(function(a, b) { return b.totalCost - a.totalCost; });
415
- }
416
-
417
- // ── Aggregation helpers ───────────────────────────────────────────────────────
418
- function getDateRange(period) {
419
- var now = new Date();
420
- // Use UTC to match JSONL timestamps (which are stored in UTC ISO strings)
421
- var y = now.getUTCFullYear(), m = now.getUTCMonth(), d = now.getUTCDate();
422
- var end = new Date(Date.UTC(y, m, d, 23, 59, 59, 999));
423
- var start;
424
- if (period === 'today') {
425
- start = new Date(Date.UTC(y, m, d));
426
- } else if (period === 'week') {
427
- start = new Date(Date.UTC(y, m, d - 6));
428
- } else if (period === '30days') {
429
- start = new Date(Date.UTC(y, m, d - 29));
430
- } else { // month
431
- start = new Date(Date.UTC(y, m, 1));
432
- }
433
- return { start: start, end: end };
434
- }
435
-
436
- function aggregateProjects(projects) {
437
- var totalCost = 0, totalIn = 0, totalOut = 0, totalCR = 0, totalCW = 0, totalCalls = 0;
438
- var modelBreakdown = {}, categoryBreakdown = {}, toolBreakdown = {}, mcpBreakdown = {};
439
- var dailyCosts = {};
440
-
441
- for (var i = 0; i < projects.length; i++) {
442
- var p = projects[i];
443
- totalCost += p.totalCost;
444
- for (var j = 0; j < p.sessions.length; j++) {
445
- var s = p.sessions[j];
446
- totalIn += s.totalInputTokens;
447
- totalOut += s.totalOutputTokens;
448
- totalCR += s.totalCacheRead;
449
- totalCW += s.totalCacheWrite;
450
- totalCalls += s.apiCalls;
451
- for (var mn in s.modelBreakdown) {
452
- if (!modelBreakdown[mn]) modelBreakdown[mn] = { calls: 0, cost: 0, tokens: 0 };
453
- modelBreakdown[mn].calls += s.modelBreakdown[mn].calls;
454
- modelBreakdown[mn].cost += s.modelBreakdown[mn].cost;
455
- modelBreakdown[mn].tokens += s.modelBreakdown[mn].tokens;
456
- }
457
- for (var cat in s.categoryBreakdown) {
458
- if (!categoryBreakdown[cat]) categoryBreakdown[cat] = { turns: 0, cost: 0 };
459
- categoryBreakdown[cat].turns += s.categoryBreakdown[cat].turns;
460
- categoryBreakdown[cat].cost += s.categoryBreakdown[cat].cost;
461
- }
462
- for (var tool in s.toolBreakdown) {
463
- if (!toolBreakdown[tool]) toolBreakdown[tool] = { calls: 0 };
464
- toolBreakdown[tool].calls += s.toolBreakdown[tool].calls;
465
- }
466
- for (var srv in s.mcpBreakdown) {
467
- if (!mcpBreakdown[srv]) mcpBreakdown[srv] = { calls: 0 };
468
- mcpBreakdown[srv].calls += s.mcpBreakdown[srv].calls;
469
- }
470
- // Daily costs
471
- for (var t = 0; t < s.turns.length; t++) {
472
- var turn = s.turns[t];
473
- var day = (turn.timestamp || '').slice(0, 10);
474
- if (!day) continue;
475
- if (!dailyCosts[day]) dailyCosts[day] = { cost: 0, calls: 0 };
476
- for (var c = 0; c < turn.calls.length; c++) {
477
- dailyCosts[day].cost += turn.calls[c].cost;
478
- dailyCosts[day].calls++;
479
- }
480
- }
481
- }
482
- }
483
-
484
- return { totalCost, totalIn, totalOut, totalCR, totalCW, totalCalls, modelBreakdown, categoryBreakdown, toolBreakdown, mcpBreakdown, dailyCosts };
485
- }
486
-
487
- // ── Format helpers ────────────────────────────────────────────────────────────
488
- function fmt$(n) {
489
- if (n >= 100) return '$' + n.toFixed(2);
490
- if (n >= 1) return '$' + n.toFixed(3);
491
- if (n >= 0.01) return '$' + n.toFixed(4);
492
- return '$' + n.toFixed(5);
493
- }
494
-
495
- function fmtK(n) {
496
- if (n >= 1e6) return (n / 1e6).toFixed(1) + 'M';
497
- if (n >= 1e3) return (n / 1e3).toFixed(1) + 'K';
498
- return n.toString();
499
- }
500
-
501
- // ── Quick summary (for session-restore hook) ──────────────────────────────────
502
- function _computeQuickTotals() {
503
- var now = new Date();
504
- var nowIso = now.toISOString();
505
- var todayStr = nowIso.slice(0, 10);
506
- var monthStr = nowIso.slice(0, 7);
507
- var y = now.getUTCFullYear(), m = now.getUTCMonth(), d = now.getUTCDate();
508
- var monthStart = new Date(Date.UTC(y, m, 1));
509
- var end = new Date(Date.UTC(y, m, d, 23, 59, 59, 999));
510
-
511
- var projects;
512
- try { projects = parseAllSessions(monthStart, end); } catch (e) { return null; }
513
- if (!projects || projects.length === 0) return null;
514
-
515
- var todayCost = 0, todayCalls = 0, monthCost = 0, monthCalls = 0;
516
- for (var i = 0; i < projects.length; i++) {
517
- var p = projects[i];
518
- for (var j = 0; j < p.sessions.length; j++) {
519
- var s = p.sessions[j];
520
- for (var t = 0; t < s.turns.length; t++) {
521
- var turn = s.turns[t];
522
- var ts = turn.timestamp || '';
523
- if (!ts) continue;
524
- for (var c = 0; c < turn.calls.length; c++) {
525
- var cost = turn.calls[c].cost;
526
- if (ts.slice(0, 7) === monthStr) { monthCost += cost; monthCalls++; }
527
- if (ts.slice(0, 10) === todayStr) { todayCost += cost; todayCalls++; }
528
- }
529
- }
530
- }
531
- }
532
- if (monthCalls === 0) return null;
533
- return { todayCost: todayCost, todayCalls: todayCalls, monthCost: monthCost, monthCalls: monthCalls };
534
- }
535
-
536
- /**
537
- * Returns a one-line token usage summary for the current day and month.
538
- * Called at session-restore.
539
- */
540
- function quickSummary() {
541
- var d = _computeQuickTotals();
542
- if (!d) return null;
543
- return '[TOKEN_USAGE] Today: ' + fmt$(d.todayCost) + ' (' + d.todayCalls + ' calls) | Month: ' + fmt$(d.monthCost) + ' (' + d.monthCalls + ' calls)';
544
- }
545
-
546
- /**
547
- * Same computation as quickSummary() but returns raw numbers for caching.
548
- * Used by hook-handler to write .monomind/metrics/token-summary.json
549
- */
550
- function quickSummaryData() {
551
- return _computeQuickTotals();
552
- }
553
-
554
- // ── ANSI Dashboard ────────────────────────────────────────────────────────────
555
- var RESET = '\x1b[0m';
556
- var BOLD = '\x1b[1m';
557
- var DIM = '\x1b[2m';
558
-
559
- function rgb(r, g, b) { return '\x1b[38;2;' + r + ';' + g + ';' + b + 'm'; }
560
- function bgRgb(r, g, b) { return '\x1b[48;2;' + r + ';' + g + ';' + b + 'm'; }
561
-
562
- var ORANGE = rgb(255, 140, 66);
563
- var GOLD = rgb(255, 215, 0);
564
- var CYAN = rgb(91, 158, 245);
565
- var GREEN = rgb(91, 245, 160);
566
- var PURPLE = rgb(224, 91, 245);
567
- var YELLOW = rgb(245, 200, 91);
568
- var TEAL = rgb(91, 245, 224);
569
- var WHITE = rgb(220, 220, 220);
570
-
571
- function gradColor(pct) {
572
- function lerp(a, b, t) { return Math.round(a + t * (b - a)); }
573
- if (pct <= 0.33) {
574
- var t = pct / 0.33;
575
- return rgb(lerp(91, 245, t), lerp(158, 200, t), lerp(245, 91, t));
576
- }
577
- if (pct <= 0.66) {
578
- var t = (pct - 0.33) / 0.33;
579
- return rgb(lerp(245, 255, t), lerp(200, 140, t), lerp(91, 66, t));
580
- }
581
- var t = (pct - 0.66) / 0.34;
582
- return rgb(lerp(255, 245, t), lerp(140, 91, t), lerp(66, 91, t));
583
- }
584
-
585
- var CATEGORY_COLORS = {
586
- coding: CYAN, debugging: rgb(245, 91, 91), feature: GREEN,
587
- refactoring: YELLOW, testing: PURPLE, exploration: TEAL,
588
- planning: rgb(123, 158, 245), delegation: rgb(245, 200, 91),
589
- git: rgb(204, 204, 204), 'build/deploy': GREEN,
590
- conversation: rgb(136, 136, 136), brainstorming: rgb(245, 91, 224),
591
- general: rgb(102, 102, 102),
592
- };
593
-
594
- function hbar(value, max, width, color) {
595
- if (max === 0) return DIM + '░'.repeat(width) + RESET;
596
- var filled = Math.round((value / max) * width);
597
- var empty = width - filled;
598
- var bar = '';
599
- for (var i = 0; i < filled; i++) {
600
- var pct = (i + 1) / width;
601
- bar += (color || gradColor(pct)) + '█';
602
- }
603
- bar += DIM + '░'.repeat(Math.max(0, empty)) + RESET;
604
- return bar;
605
- }
606
-
607
- function pad(s, n, right) {
608
- var str = String(s);
609
- if (str.length >= n) return str.slice(0, n);
610
- var pad = ' '.repeat(n - str.length);
611
- return right ? pad + str : str + pad;
612
- }
613
-
614
- function stripAnsi(s) {
615
- return s.replace(/\x1b\[[0-9;]*m/g, '');
616
- }
617
-
618
- function padAnsi(s, n, right) {
619
- var vis = stripAnsi(String(s));
620
- var needed = n - vis.length;
621
- if (needed <= 0) return s;
622
- var p = ' '.repeat(needed);
623
- return right ? p + s : s + p;
624
- }
625
-
626
- function box(title, lines, color, width) {
627
- var c = color || ORANGE;
628
- var innerW = width - 2;
629
- var top = c + '┌' + '─'.repeat(innerW) + '┐' + RESET;
630
- var titleLine = c + '│' + RESET + ' ' + BOLD + title + RESET + ' '.repeat(Math.max(0, innerW - 2 - stripAnsi(title).length)) + c + '│' + RESET;
631
- var sep = c + '├' + '─'.repeat(innerW) + '┤' + RESET;
632
- var body = lines.map(function(l) {
633
- var vis = stripAnsi(l);
634
- var pad = Math.max(0, innerW - 2 - vis.length);
635
- return c + '│' + RESET + ' ' + l + ' '.repeat(pad) + ' ' + c + '│' + RESET;
636
- });
637
- var bot = c + '└' + '─'.repeat(innerW) + '┘' + RESET;
638
- return [top, titleLine, sep].concat(body).concat([bot]).join('\n');
639
- }
640
-
641
- /**
642
- * Render a full ANSI dashboard to stdout.
643
- * @param {string} period 'today'|'week'|'30days'|'month'
644
- */
645
- function renderDashboard(period) {
646
- var range = getDateRange(period || 'today');
647
- var projects;
648
- try { projects = parseAllSessions(range.start, range.end); } catch (e) {
649
- process.stdout.write('Error reading sessions: ' + e.message + '\n');
650
- return;
651
- }
652
-
653
- var W = Math.min(160, process.stdout.columns || 80);
654
- var HALF = Math.floor(W / 2);
655
- var BAR_W = Math.max(6, Math.min(12, HALF - 35));
656
- var wide = W >= 90;
657
-
658
- // ── aggregate ──────────────────────────────────────────────────────────────
659
- var totalCost = 0, totalIn = 0, totalOut = 0, totalCR = 0, totalCW = 0, totalCalls = 0;
660
- var modelBreakdown = {}, categoryBreakdown = {}, toolBreakdown = {}, mcpBreakdown = {};
661
- var dailyCosts = {};
662
-
663
- for (var i = 0; i < projects.length; i++) {
664
- var p = projects[i];
665
- totalCost += p.totalCost;
666
- totalCalls += p.totalApiCalls;
667
- for (var j = 0; j < p.sessions.length; j++) {
668
- var s = p.sessions[j];
669
- totalIn += s.totalInputTokens;
670
- totalOut += s.totalOutputTokens;
671
- totalCR += s.totalCacheRead;
672
- totalCW += s.totalCacheWrite;
673
- for (var mn in s.modelBreakdown) {
674
- if (!modelBreakdown[mn]) modelBreakdown[mn] = { calls: 0, cost: 0, tokens: 0 };
675
- modelBreakdown[mn].calls += s.modelBreakdown[mn].calls;
676
- modelBreakdown[mn].cost += s.modelBreakdown[mn].cost;
677
- modelBreakdown[mn].tokens += s.modelBreakdown[mn].tokens;
678
- }
679
- for (var cat in s.categoryBreakdown) {
680
- if (!categoryBreakdown[cat]) categoryBreakdown[cat] = { turns: 0, cost: 0 };
681
- categoryBreakdown[cat].turns += s.categoryBreakdown[cat].turns;
682
- categoryBreakdown[cat].cost += s.categoryBreakdown[cat].cost;
683
- }
684
- for (var tool in s.toolBreakdown) {
685
- if (!toolBreakdown[tool]) toolBreakdown[tool] = { calls: 0 };
686
- toolBreakdown[tool].calls += s.toolBreakdown[tool].calls;
687
- }
688
- for (var srv in s.mcpBreakdown) {
689
- if (!mcpBreakdown[srv]) mcpBreakdown[srv] = { calls: 0 };
690
- mcpBreakdown[srv].calls += s.mcpBreakdown[srv].calls;
691
- }
692
- for (var t = 0; t < s.turns.length; t++) {
693
- var turn = s.turns[t];
694
- var day = (turn.timestamp || '').slice(0, 10);
695
- if (!day) continue;
696
- if (!dailyCosts[day]) dailyCosts[day] = { cost: 0, calls: 0 };
697
- for (var c = 0; c < turn.calls.length; c++) {
698
- dailyCosts[day].cost += turn.calls[c].cost;
699
- dailyCosts[day].calls++;
700
- }
701
- }
702
- }
703
- }
704
-
705
- var lines = [];
706
-
707
- // ── Header ──────────────────────────────────────────────────────────────────
708
- var PERIOD_LABELS = { today: 'Today', week: '7 Days', '30days': '30 Days', month: 'This Month' };
709
- var periodLabel = PERIOD_LABELS[period] || period;
710
- lines.push('');
711
- lines.push(ORANGE + BOLD + ' Monomind Token Usage — ' + periodLabel + RESET);
712
- lines.push(DIM + ' ' + range.start.toISOString().slice(0, 10) + ' → ' + range.end.toISOString().slice(0, 10) + RESET);
713
- lines.push('');
714
-
715
- // ── Overview ────────────────────────────────────────────────────────────────
716
- var overviewLines = [
717
- GOLD + BOLD + fmt$(totalCost) + RESET + DIM + ' total cost' + RESET,
718
- WHITE + fmtK(totalIn) + RESET + DIM + ' in ' + RESET + WHITE + fmtK(totalOut) + RESET + DIM + ' out ' + RESET + CYAN + fmtK(totalCR) + RESET + DIM + ' cached' + RESET,
719
- DIM + totalCalls + ' API calls across ' + projects.length + ' project' + (projects.length !== 1 ? 's' : '') + RESET,
720
- DIM + 'Cache efficiency: ' + RESET + TEAL + (totalIn + totalCR > 0 ? Math.round(totalCR / (totalIn + totalCR) * 100) : 0) + '%' + RESET,
721
- ];
722
- lines.push(box('Overview', overviewLines, ORANGE, W));
723
-
724
- // ── Projects ────────────────────────────────────────────────────────────────
725
- var maxProjCost = projects.reduce(function(m, p) { return Math.max(m, p.totalCost); }, 0);
726
- var projLines = projects.slice(0, 10).map(function(p) {
727
- var name = p.projectPath.split('/').pop() || p.project;
728
- if (name.length > 24) name = name.slice(0, 21) + '…';
729
- var bar = hbar(p.totalCost, maxProjCost, BAR_W, null);
730
- return padAnsi(GREEN + name + RESET, 26) + ' ' + bar + ' ' + padAnsi(GOLD + fmt$(p.totalCost) + RESET, 12, true) + DIM + ' ' + p.totalApiCalls + ' calls' + RESET;
731
- });
732
- if (projLines.length === 0) projLines = [DIM + 'No data for this period' + RESET];
733
- lines.push(box('Projects', projLines, GREEN, W));
734
-
735
- // ── Models + Activities (side by side on wide) ───────────────────────────────
736
- var modelEntries = Object.entries(modelBreakdown).sort(function(a, b) { return b[1].cost - a[1].cost; });
737
- var maxMCost = modelEntries.reduce(function(m, e) { return Math.max(m, e[1].cost); }, 0);
738
- var modelLines = modelEntries.slice(0, 8).map(function(e) {
739
- var mn = e[0]; var data = e[1];
740
- if (mn.length > 14) mn = mn.slice(0, 12) + '…';
741
- var bar = hbar(data.cost, maxMCost, BAR_W, PURPLE);
742
- return padAnsi(PURPLE + mn + RESET, 16) + ' ' + bar + ' ' + padAnsi(GOLD + fmt$(data.cost) + RESET, 12, true) + DIM + ' ' + data.calls + 'x' + RESET;
743
- });
744
- if (modelLines.length === 0) modelLines = [DIM + 'No data' + RESET];
745
-
746
- var catEntries = Object.entries(categoryBreakdown).sort(function(a, b) { return b[1].turns - a[1].turns; });
747
- var maxCat = catEntries.reduce(function(m, e) { return Math.max(m, e[1].turns); }, 0);
748
- var catLines = catEntries.slice(0, 8).map(function(e) {
749
- var cat = e[0]; var data = e[1];
750
- var col = CATEGORY_COLORS[cat] || WHITE;
751
- var label = cat.charAt(0).toUpperCase() + cat.slice(1);
752
- if (label.length > 13) label = label.slice(0, 11) + '…';
753
- var bar = hbar(data.turns, maxCat, BAR_W, col);
754
- return padAnsi(col + label + RESET, 15) + ' ' + bar + ' ' + padAnsi(DIM + data.turns + ' turns' + RESET, 12, true);
755
- });
756
- if (catLines.length === 0) catLines = [DIM + 'No data' + RESET];
757
-
758
- if (wide) {
759
- var mBox = box('Models', modelLines, PURPLE, HALF - 1);
760
- var aBox = box('Activity', catLines, YELLOW, W - HALF);
761
- var mBoxLines = mBox.split('\n');
762
- var aBoxLines = aBox.split('\n');
763
- var len = Math.max(mBoxLines.length, aBoxLines.length);
764
- for (var r = 0; r < len; r++) {
765
- var ml = mBoxLines[r] || '';
766
- var al = aBoxLines[r] || '';
767
- var mlVis = stripAnsi(ml);
768
- var mlPad = ml + ' '.repeat(Math.max(0, HALF - 1 - mlVis.length));
769
- lines.push(mlPad + ' ' + al);
770
- }
771
- } else {
772
- lines.push(box('Models', modelLines, PURPLE, W));
773
- lines.push(box('Activity', catLines, YELLOW, W));
774
- }
775
-
776
- // ── Daily Chart ─────────────────────────────────────────────────────────────
777
- var days = Object.keys(dailyCosts).sort().slice(-14);
778
- var maxDayCost = days.reduce(function(m, d) { return Math.max(m, dailyCosts[d].cost); }, 0);
779
- var dailyLines = [];
780
- if (days.length > 0) {
781
- var CHART_H = 5;
782
- var chartW = Math.min(days.length * 4, W - 8);
783
- var colW = Math.max(3, Math.floor(chartW / days.length));
784
-
785
- // Render chart rows top-down
786
- for (var row = CHART_H; row >= 1; row--) {
787
- var rowStr = DIM + ' ';
788
- for (var d = 0; d < days.length; d++) {
789
- var pct = maxDayCost > 0 ? dailyCosts[days[d]].cost / maxDayCost : 0;
790
- var colFill = Math.round(pct * CHART_H);
791
- var ch = colFill >= row ? gradColor(pct) + '▓' : DIM + '░';
792
- rowStr += ch + ' '.repeat(Math.max(0, colW - 1));
793
- }
794
- rowStr += RESET;
795
- dailyLines.push(rowStr);
796
- }
797
- // X-axis labels (just last dates)
798
- var labelRow = DIM + ' ';
799
- for (var d = 0; d < days.length; d++) {
800
- var lbl = days[d].slice(8); // day digits
801
- labelRow += lbl + ' '.repeat(Math.max(0, colW - lbl.length));
802
- }
803
- dailyLines.push(labelRow + RESET);
804
- dailyLines.push('');
805
- // Cost row
806
- dailyLines.push(DIM + ' max: ' + GOLD + fmt$(maxDayCost) + RESET + DIM + ' per day' + RESET);
807
- } else {
808
- dailyLines = [DIM + 'No daily data' + RESET];
809
- }
810
- lines.push(box('Daily Spend', dailyLines, CYAN, W));
811
-
812
- // ── Top Tools + MCP ────────────────────────────────────────────────────────
813
- var toolEntries = Object.entries(toolBreakdown).sort(function(a, b) { return b[1].calls - a[1].calls; }).slice(0, 8);
814
- var maxTool = toolEntries.reduce(function(m, e) { return Math.max(m, e[1].calls); }, 0);
815
- var toolLines = toolEntries.map(function(e) {
816
- var name = e[0];
817
- if (name.length > 16) name = name.slice(0, 14) + '…';
818
- var bar = hbar(e[1].calls, maxTool, BAR_W, TEAL);
819
- return padAnsi(TEAL + name + RESET, 18) + ' ' + bar + ' ' + padAnsi(DIM + e[1].calls + 'x' + RESET, 8, true);
820
- });
821
- if (toolLines.length === 0) toolLines = [DIM + 'No data' + RESET];
822
-
823
- var mcpEntries = Object.entries(mcpBreakdown).sort(function(a, b) { return b[1].calls - a[1].calls; }).slice(0, 8);
824
- var maxMcp = mcpEntries.reduce(function(m, e) { return Math.max(m, e[1].calls); }, 0);
825
- var mcpLines = mcpEntries.map(function(e) {
826
- var name = e[0];
827
- if (name.length > 16) name = name.slice(0, 14) + '…';
828
- var bar = hbar(e[1].calls, maxMcp, BAR_W, rgb(245, 91, 224));
829
- return padAnsi(rgb(245, 91, 224) + name + RESET, 18) + ' ' + bar + ' ' + padAnsi(DIM + e[1].calls + 'x' + RESET, 8, true);
830
- });
831
- if (mcpLines.length === 0) mcpLines = [DIM + 'No MCP calls' + RESET];
832
-
833
- if (wide) {
834
- var tBox = box('Top Tools', toolLines, TEAL, HALF - 1);
835
- var mBox2 = box('MCP Servers', mcpLines, rgb(245, 91, 224), W - HALF);
836
- var tLines = tBox.split('\n');
837
- var mLines = mBox2.split('\n');
838
- var len2 = Math.max(tLines.length, mLines.length);
839
- for (var r = 0; r < len2; r++) {
840
- var tl = tLines[r] || '';
841
- var ml2 = mLines[r] || '';
842
- var tlVis = stripAnsi(tl);
843
- var tlPad = tl + ' '.repeat(Math.max(0, HALF - 1 - tlVis.length));
844
- lines.push(tlPad + ' ' + ml2);
845
- }
846
- } else {
847
- lines.push(box('Top Tools', toolLines, TEAL, W));
848
- lines.push(box('MCP Servers', mcpLines, rgb(245, 91, 224), W));
849
- }
850
-
851
- lines.push('');
852
- lines.push(DIM + ' Press q to quit. Refresh with r.' + RESET);
853
- lines.push('');
854
-
855
- process.stdout.write(lines.join('\n') + '\n');
856
- }
857
-
858
- /**
859
- * Run interactive dashboard with keyboard controls.
860
- */
861
- function runInteractive() {
862
- var period = 'today';
863
- var periods = ['today', 'week', '30days', 'month'];
864
-
865
- function draw() {
866
- process.stdout.write('\x1b[2J\x1b[H'); // clear + home
867
- renderDashboard(period);
868
- process.stdout.write(
869
- '\n' + DIM + ' [1] Today [2] Week [3] 30 Days [4] Month [p] Prev [n] Next [r] Refresh [q] Quit' + RESET + '\n'
870
- );
871
- }
872
-
873
- if (process.stdin.isTTY) {
874
- process.stdin.setRawMode(true);
875
- process.stdin.resume();
876
- process.stdin.setEncoding('utf8');
877
- process.stdin.on('data', function(key) {
878
- if (key === 'q' || key === '\u0003') { // q or Ctrl+C
879
- process.stdin.setRawMode(false);
880
- process.stdout.write('\n');
881
- process.exit(0);
882
- } else if (key === '1') { period = 'today'; draw(); }
883
- else if (key === '2') { period = 'week'; draw(); }
884
- else if (key === '3') { period = '30days'; draw(); }
885
- else if (key === '4') { period = 'month'; draw(); }
886
- else if (key === 'r') { draw(); }
887
- else if (key === 'p') {
888
- var idx = periods.indexOf(period);
889
- period = periods[Math.max(0, idx - 1)];
890
- draw();
891
- } else if (key === 'n') {
892
- var idx = periods.indexOf(period);
893
- period = periods[Math.min(periods.length - 1, idx + 1)];
894
- draw();
895
- }
896
- });
897
- }
898
-
899
- draw();
900
- }
901
-
902
- // ── Exports ───────────────────────────────────────────────────────────────────
903
- module.exports = {
904
- parseAllSessions: parseAllSessions,
905
- quickSummary: quickSummary,
906
- quickSummaryData: quickSummaryData,
907
- renderDashboard: renderDashboard,
908
- runInteractive: runInteractive,
909
- getDateRange: getDateRange,
910
- fmt$: fmt$,
911
- fmtK: fmtK,
912
- };
913
-
914
- // Allow direct execution
915
- if (require.main === module) {
916
- var args = process.argv.slice(2);
917
- var cmd = args[0] || 'dashboard';
918
- if (cmd === 'summary') {
919
- var s = quickSummary();
920
- process.stdout.write((s || 'No token data available') + '\n');
921
- } else if (cmd === 'report') {
922
- // Non-interactive one-shot dashboard — safe to pipe, safe inside Claude Code
923
- var period = args[1] || 'today';
924
- renderDashboard(period);
925
- } else if (cmd === 'json') {
926
- var period = args[1] || 'today';
927
- var range = getDateRange(period);
928
- var projects = parseAllSessions(range.start, range.end);
929
- process.stdout.write(JSON.stringify(projects, null, 2) + '\n');
930
- } else {
931
- var period = args[0] && periods && periods.indexOf(args[0]) !== -1 ? args[0] : (args[1] || 'today');
932
- runInteractive();
933
- }
934
- }