@monoes/monomindcli 1.10.47 → 1.10.55

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 (573) 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/commands/monomind/do.md +52 -0
  41. package/.claude/commands/monomind/improve.md +2 -0
  42. package/.claude/helpers/handlers/graph-status-handler.cjs +2 -1
  43. package/.claude/helpers/handlers/route-handler.cjs +61 -11
  44. package/.claude/helpers/hook-handler.cjs +19 -0
  45. package/.claude/helpers/skill-registry.json +122 -51
  46. package/.claude/helpers/statusline.cjs +1 -1
  47. package/.claude/skills/agent-browser-testing/SKILL.md +522 -152
  48. package/.claude/skills/github-issue-triage/SKILL.md +354 -0
  49. package/.claude/skills/github-repo-recap/SKILL.md +207 -0
  50. package/.claude/skills/mastermind/_delegation.md +83 -0
  51. package/.claude/skills/mastermind/_protocol.md +14 -0
  52. package/.claude/skills/mastermind/approve.md +15 -7
  53. package/.claude/skills/mastermind/autodev.md +534 -0
  54. package/.claude/skills/mastermind/createorg.md +21 -5
  55. package/.claude/skills/mastermind/debug.md +232 -0
  56. package/.claude/skills/mastermind/design.md +187 -0
  57. package/.claude/skills/mastermind/execute.md +104 -0
  58. package/.claude/skills/mastermind/finish.md +251 -0
  59. package/.claude/skills/mastermind/plan.md +180 -0
  60. package/.claude/skills/mastermind/receive-review.md +213 -0
  61. package/.claude/skills/mastermind/runorg.md +23 -8
  62. package/.claude/skills/mastermind/skill-builder.md +274 -0
  63. package/.claude/skills/mastermind/taskdev.md +307 -0
  64. package/.claude/skills/mastermind/tdd.md +394 -0
  65. package/.claude/skills/mastermind/verify.md +196 -0
  66. package/.claude/skills/mastermind/worktree.md +160 -132
  67. package/README.md +320 -253
  68. package/dist/src/commands/analyze.d.ts.map +1 -1
  69. package/dist/src/commands/analyze.js +9 -2
  70. package/dist/src/commands/analyze.js.map +1 -1
  71. package/dist/src/commands/benchmark.js.map +1 -1
  72. package/dist/src/commands/completions.js +1 -1
  73. package/dist/src/commands/guidance.js +7 -7
  74. package/dist/src/commands/hooks.d.ts.map +1 -1
  75. package/dist/src/commands/hooks.js +16 -3
  76. package/dist/src/commands/hooks.js.map +1 -1
  77. package/dist/src/commands/index.d.ts +3 -2
  78. package/dist/src/commands/index.d.ts.map +1 -1
  79. package/dist/src/commands/index.js +7 -0
  80. package/dist/src/commands/index.js.map +1 -1
  81. package/dist/src/commands/init.d.ts.map +1 -1
  82. package/dist/src/commands/init.js +47 -13
  83. package/dist/src/commands/init.js.map +1 -1
  84. package/dist/src/commands/neural.d.ts.map +1 -1
  85. package/dist/src/commands/neural.js +100 -14
  86. package/dist/src/commands/neural.js.map +1 -1
  87. package/dist/src/commands/platforms.d.ts +11 -0
  88. package/dist/src/commands/platforms.d.ts.map +1 -0
  89. package/dist/src/commands/platforms.js +195 -0
  90. package/dist/src/commands/platforms.js.map +1 -0
  91. package/dist/src/commands/ruvector/backup.js.map +1 -1
  92. package/dist/src/commands/ruvector/benchmark.js.map +1 -1
  93. package/dist/src/commands/ruvector/init.js.map +1 -1
  94. package/dist/src/commands/ruvector/migrate.js.map +1 -1
  95. package/dist/src/commands/ruvector/optimize.js.map +1 -1
  96. package/dist/src/commands/ruvector/status.js.map +1 -1
  97. package/dist/src/commands/update.js +6 -6
  98. package/dist/src/init/executor.d.ts.map +1 -1
  99. package/dist/src/init/executor.js +28 -0
  100. package/dist/src/init/executor.js.map +1 -1
  101. package/dist/src/init/statusline-generator.js +1 -1
  102. package/dist/src/init/types.d.ts +1 -0
  103. package/dist/src/init/types.d.ts.map +1 -1
  104. package/dist/src/mcp-server.d.ts.map +1 -1
  105. package/dist/src/mcp-server.js +92 -0
  106. package/dist/src/mcp-server.js.map +1 -1
  107. package/dist/src/mcp-tools/hive-mind-tools.d.ts.map +1 -1
  108. package/dist/src/mcp-tools/hive-mind-tools.js +52 -0
  109. package/dist/src/mcp-tools/hive-mind-tools.js.map +1 -1
  110. package/dist/src/mcp-tools/hooks-tools.d.ts.map +1 -1
  111. package/dist/src/mcp-tools/hooks-tools.js +106 -5
  112. package/dist/src/mcp-tools/hooks-tools.js.map +1 -1
  113. package/dist/src/mcp-tools/index.d.ts +0 -5
  114. package/dist/src/mcp-tools/index.d.ts.map +1 -1
  115. package/dist/src/mcp-tools/index.js +0 -5
  116. package/dist/src/mcp-tools/index.js.map +1 -1
  117. package/dist/src/mcp-tools/monograph-tools.d.ts.map +1 -1
  118. package/dist/src/mcp-tools/monograph-tools.js +507 -5587
  119. package/dist/src/mcp-tools/monograph-tools.js.map +1 -1
  120. package/dist/src/mcp-tools/neural-tools.d.ts.map +1 -1
  121. package/dist/src/mcp-tools/neural-tools.js +64 -4
  122. package/dist/src/mcp-tools/neural-tools.js.map +1 -1
  123. package/dist/src/mcp-tools/security-tools.js +4 -4
  124. package/dist/src/memory/intelligence.d.ts +2 -2
  125. package/dist/src/memory/intelligence.d.ts.map +1 -1
  126. package/dist/src/memory/intelligence.js +108 -3
  127. package/dist/src/memory/intelligence.js.map +1 -1
  128. package/dist/src/memory/memory-bridge.js +1 -1
  129. package/dist/src/memory/memory-bridge.js.map +1 -1
  130. package/dist/src/memory/sona-optimizer.d.ts +1 -10
  131. package/dist/src/memory/sona-optimizer.d.ts.map +1 -1
  132. package/dist/src/memory/sona-optimizer.js +0 -46
  133. package/dist/src/memory/sona-optimizer.js.map +1 -1
  134. package/dist/src/runtime/headless.js +3 -3
  135. package/dist/src/ruvector/diff-classifier.d.ts +0 -2
  136. package/dist/src/ruvector/diff-classifier.d.ts.map +1 -1
  137. package/dist/src/ruvector/diff-classifier.js +2 -14
  138. package/dist/src/ruvector/diff-classifier.js.map +1 -1
  139. package/dist/src/ruvector/index.d.ts +26 -9
  140. package/dist/src/ruvector/index.d.ts.map +1 -1
  141. package/dist/src/ruvector/index.js +3 -21
  142. package/dist/src/ruvector/index.js.map +1 -1
  143. package/dist/src/ruvector/ruvllm-wasm.js +2 -2
  144. package/dist/src/ruvector/ruvllm-wasm.js.map +1 -1
  145. package/dist/src/types.d.ts +0 -15
  146. package/dist/src/types.d.ts.map +1 -1
  147. package/dist/src/types.js +0 -18
  148. package/dist/src/types.js.map +1 -1
  149. package/dist/src/ui/dashboard.html +8763 -9765
  150. package/dist/src/ui/data/agent-avatars.html +763 -0
  151. package/dist/src/ui/data/agent-avatars.json +966 -0
  152. package/dist/src/ui/data/avatars/account-strategist.svg +58 -0
  153. package/dist/src/ui/data/avatars/accounts-payable.svg +54 -0
  154. package/dist/src/ui/data/avatars/adaptive-coordinator.svg +55 -0
  155. package/dist/src/ui/data/avatars/adaptive-coordinator2.svg +54 -0
  156. package/dist/src/ui/data/avatars/ai-citation.svg +57 -0
  157. package/dist/src/ui/data/avatars/ai-engineer.svg +61 -0
  158. package/dist/src/ui/data/avatars/analytics-reporter.svg +53 -0
  159. package/dist/src/ui/data/avatars/api-tester.svg +53 -0
  160. package/dist/src/ui/data/avatars/architecture.svg +54 -0
  161. package/dist/src/ui/data/avatars/automation-governance.svg +55 -0
  162. package/dist/src/ui/data/avatars/backend-dev.svg +53 -0
  163. package/dist/src/ui/data/avatars/benchmarker.svg +54 -0
  164. package/dist/src/ui/data/avatars/blockchain-auditor.svg +53 -0
  165. package/dist/src/ui/data/avatars/byzantine-coord.svg +57 -0
  166. package/dist/src/ui/data/avatars/case-analyst.svg +57 -0
  167. package/dist/src/ui/data/avatars/cicd-engineer.svg +55 -0
  168. package/dist/src/ui/data/avatars/cloud-architect.svg +54 -0
  169. package/dist/src/ui/data/avatars/code-review-swarm.svg +57 -0
  170. package/dist/src/ui/data/avatars/coder-v119.svg +57 -0
  171. package/dist/src/ui/data/avatars/coder.svg +58 -0
  172. package/dist/src/ui/data/avatars/collective-coord.svg +54 -0
  173. package/dist/src/ui/data/avatars/compliance-auditor.svg +58 -0
  174. package/dist/src/ui/data/avatars/consensus-coordinator.svg +54 -0
  175. package/dist/src/ui/data/avatars/content-creator.svg +54 -0
  176. package/dist/src/ui/data/avatars/crdt-synchronizer.svg +53 -0
  177. package/dist/src/ui/data/avatars/cro-specialist.svg +58 -0
  178. package/dist/src/ui/data/avatars/data-consolidator.svg +54 -0
  179. package/dist/src/ui/data/avatars/data-engineer.svg +53 -0
  180. package/dist/src/ui/data/avatars/database-optimizer.svg +61 -0
  181. package/dist/src/ui/data/avatars/deal-strategist.svg +54 -0
  182. package/dist/src/ui/data/avatars/defender.svg +53 -0
  183. package/dist/src/ui/data/avatars/devops-automator.svg +56 -0
  184. package/dist/src/ui/data/avatars/discovery-coach.svg +54 -0
  185. package/dist/src/ui/data/avatars/email-marketing.svg +57 -0
  186. package/dist/src/ui/data/avatars/embedded-firmware.svg +61 -0
  187. package/dist/src/ui/data/avatars/evidence-collector.svg +57 -0
  188. package/dist/src/ui/data/avatars/experiment-tracker.svg +53 -0
  189. package/dist/src/ui/data/avatars/feedback-synthesizer.svg +54 -0
  190. package/dist/src/ui/data/avatars/finance-tracker.svg +54 -0
  191. package/dist/src/ui/data/avatars/frontend-developer.svg +54 -0
  192. package/dist/src/ui/data/avatars/game-audio-engineer.svg +59 -0
  193. package/dist/src/ui/data/avatars/game-designer.svg +54 -0
  194. package/dist/src/ui/data/avatars/gossip-coordinator.svg +54 -0
  195. package/dist/src/ui/data/avatars/hierarchical-coord.svg +54 -0
  196. package/dist/src/ui/data/avatars/incident-commander.svg +57 -0
  197. package/dist/src/ui/data/avatars/infrastructure.svg +54 -0
  198. package/dist/src/ui/data/avatars/input-validator.svg +53 -0
  199. package/dist/src/ui/data/avatars/ios-developer.svg +54 -0
  200. package/dist/src/ui/data/avatars/issue-tracker.svg +53 -0
  201. package/dist/src/ui/data/avatars/judge.svg +55 -0
  202. package/dist/src/ui/data/avatars/launch-strategist.svg +54 -0
  203. package/dist/src/ui/data/avatars/legal-compliance.svg +53 -0
  204. package/dist/src/ui/data/avatars/level-designer.svg +53 -0
  205. package/dist/src/ui/data/avatars/load-balancer.svg +57 -0
  206. package/dist/src/ui/data/avatars/mcp-builder.svg +53 -0
  207. package/dist/src/ui/data/avatars/memory-coordinator.svg +55 -0
  208. package/dist/src/ui/data/avatars/mesh-coordinator.svg +55 -0
  209. package/dist/src/ui/data/avatars/ml-developer.svg +58 -0
  210. package/dist/src/ui/data/avatars/mobile-app-builder.svg +53 -0
  211. package/dist/src/ui/data/avatars/mobile-dev.svg +54 -0
  212. package/dist/src/ui/data/avatars/model-qa.svg +58 -0
  213. package/dist/src/ui/data/avatars/narrative-designer.svg +58 -0
  214. package/dist/src/ui/data/avatars/outbound-strategist.svg +55 -0
  215. package/dist/src/ui/data/avatars/path-validator.svg +54 -0
  216. package/dist/src/ui/data/avatars/payment-agent.svg +53 -0
  217. package/dist/src/ui/data/avatars/perf-analyzer.svg +58 -0
  218. package/dist/src/ui/data/avatars/pipeline-analyst.svg +54 -0
  219. package/dist/src/ui/data/avatars/planner.svg +55 -0
  220. package/dist/src/ui/data/avatars/pr-manager.svg +54 -0
  221. package/dist/src/ui/data/avatars/pricing-strategist.svg +54 -0
  222. package/dist/src/ui/data/avatars/product-manager.svg +54 -0
  223. package/dist/src/ui/data/avatars/production-validator.svg +54 -0
  224. package/dist/src/ui/data/avatars/project-shepherd.svg +54 -0
  225. package/dist/src/ui/data/avatars/proposal-strategist.svg +54 -0
  226. package/dist/src/ui/data/avatars/prosecutor.svg +57 -0
  227. package/dist/src/ui/data/avatars/pseudocode.svg +53 -0
  228. package/dist/src/ui/data/avatars/queen-coordinator.svg +55 -0
  229. package/dist/src/ui/data/avatars/quorum-manager.svg +53 -0
  230. package/dist/src/ui/data/avatars/raft-manager.svg +53 -0
  231. package/dist/src/ui/data/avatars/reality-checker.svg +58 -0
  232. package/dist/src/ui/data/avatars/recruitment.svg +58 -0
  233. package/dist/src/ui/data/avatars/refinement.svg +53 -0
  234. package/dist/src/ui/data/avatars/release-manager.svg +54 -0
  235. package/dist/src/ui/data/avatars/repo-architect.svg +54 -0
  236. package/dist/src/ui/data/avatars/researcher.svg +58 -0
  237. package/dist/src/ui/data/avatars/resource-allocator.svg +53 -0
  238. package/dist/src/ui/data/avatars/reviewer.svg +53 -0
  239. package/dist/src/ui/data/avatars/safe-executor.svg +53 -0
  240. package/dist/src/ui/data/avatars/sales-coach.svg +53 -0
  241. package/dist/src/ui/data/avatars/sales-engineer.svg +58 -0
  242. package/dist/src/ui/data/avatars/scout-explorer.svg +58 -0
  243. package/dist/src/ui/data/avatars/security-architect.svg +54 -0
  244. package/dist/src/ui/data/avatars/security-auditor.svg +55 -0
  245. package/dist/src/ui/data/avatars/senior-developer.svg +58 -0
  246. package/dist/src/ui/data/avatars/senior-pm.svg +58 -0
  247. package/dist/src/ui/data/avatars/seo-specialist.svg +57 -0
  248. package/dist/src/ui/data/avatars/social-media.svg +54 -0
  249. package/dist/src/ui/data/avatars/solidity-engineer.svg +58 -0
  250. package/dist/src/ui/data/avatars/sparc-coder.svg +58 -0
  251. package/dist/src/ui/data/avatars/sparc-coord.svg +56 -0
  252. package/dist/src/ui/data/avatars/specification.svg +57 -0
  253. package/dist/src/ui/data/avatars/sprint-prioritizer.svg +53 -0
  254. package/dist/src/ui/data/avatars/sre.svg +54 -0
  255. package/dist/src/ui/data/avatars/studio-operations.svg +53 -0
  256. package/dist/src/ui/data/avatars/studio-producer.svg +55 -0
  257. package/dist/src/ui/data/avatars/support-responder.svg +56 -0
  258. package/dist/src/ui/data/avatars/system-architect.svg +54 -0
  259. package/dist/src/ui/data/avatars/task-orchestrator.svg +56 -0
  260. package/dist/src/ui/data/avatars/technical-artist.svg +53 -0
  261. package/dist/src/ui/data/avatars/technical-writer.svg +59 -0
  262. package/dist/src/ui/data/avatars/tester.svg +53 -0
  263. package/dist/src/ui/data/avatars/threat-detection.svg +61 -0
  264. package/dist/src/ui/data/avatars/trend-researcher.svg +54 -0
  265. package/dist/src/ui/data/avatars/trial-director.svg +55 -0
  266. package/dist/src/ui/data/avatars/unity-architect.svg +54 -0
  267. package/dist/src/ui/data/avatars/visionos-engineer.svg +57 -0
  268. package/dist/src/ui/data/avatars/worker-specialist.svg +55 -0
  269. package/dist/src/ui/data/avatars/workflow-architect.svg +57 -0
  270. package/dist/src/ui/data/avatars/workflow-automation.svg +54 -0
  271. package/dist/src/ui/data/avatars/zk-steward.svg +54 -0
  272. package/dist/src/ui/data/known-projects.json +1 -1
  273. package/dist/src/ui/data/mastermind-events.jsonl +28 -0
  274. package/dist/src/ui/orgs.html +1171 -0
  275. package/dist/src/ui/server.mjs +529 -43
  276. package/dist/src/update/index.js +1 -1
  277. package/dist/src/update/validator.js +8 -8
  278. package/dist/tsconfig.tsbuildinfo +1 -1
  279. package/package.json +2 -2
  280. package/.claude/agents/academic/academic-anthropologist.md +0 -126
  281. package/.claude/agents/academic/academic-geographer.md +0 -128
  282. package/.claude/agents/academic/academic-historian.md +0 -124
  283. package/.claude/agents/academic/academic-narratologist.md +0 -119
  284. package/.claude/agents/academic/academic-psychologist.md +0 -119
  285. package/.claude/agents/analysis/analyze-code-quality.md +0 -58
  286. package/.claude/agents/analysis/code-analyzer.md +0 -189
  287. package/.claude/agents/analysis/code-review/analyze-code-quality.md +0 -58
  288. package/.claude/agents/consensus/performance-benchmarker.md +0 -831
  289. package/.claude/agents/data/ml/data-ml-model.md +0 -76
  290. package/.claude/agents/development/dev-backend-api.md +0 -178
  291. package/.claude/agents/devops/ci-cd/ops-cicd-github.md +0 -52
  292. package/.claude/agents/documentation/api-docs/docs-api-openapi.md +0 -63
  293. package/.claude/agents/game-development/blender/blender-addon-engineer.md +0 -235
  294. package/.claude/agents/game-development/game-audio-engineer.md +0 -265
  295. package/.claude/agents/game-development/game-designer.md +0 -168
  296. package/.claude/agents/game-development/godot/godot-gameplay-scripter.md +0 -335
  297. package/.claude/agents/game-development/godot/godot-multiplayer-engineer.md +0 -298
  298. package/.claude/agents/game-development/godot/godot-shader-developer.md +0 -267
  299. package/.claude/agents/game-development/level-designer.md +0 -209
  300. package/.claude/agents/game-development/narrative-designer.md +0 -244
  301. package/.claude/agents/game-development/roblox-studio/roblox-avatar-creator.md +0 -298
  302. package/.claude/agents/game-development/roblox-studio/roblox-experience-designer.md +0 -306
  303. package/.claude/agents/game-development/roblox-studio/roblox-systems-scripter.md +0 -326
  304. package/.claude/agents/game-development/technical-artist.md +0 -230
  305. package/.claude/agents/game-development/unity/unity-architect.md +0 -272
  306. package/.claude/agents/game-development/unity/unity-editor-tool-developer.md +0 -311
  307. package/.claude/agents/game-development/unity/unity-multiplayer-engineer.md +0 -322
  308. package/.claude/agents/game-development/unity/unity-shader-graph-artist.md +0 -270
  309. package/.claude/agents/game-development/unreal-engine/unreal-multiplayer-architect.md +0 -314
  310. package/.claude/agents/game-development/unreal-engine/unreal-systems-engineer.md +0 -311
  311. package/.claude/agents/game-development/unreal-engine/unreal-technical-artist.md +0 -257
  312. package/.claude/agents/game-development/unreal-engine/unreal-world-builder.md +0 -274
  313. package/.claude/agents/github/release-swarm.md +0 -597
  314. package/.claude/agents/goal/agent.md +0 -804
  315. package/.claude/agents/goal/code-goal-planner.md +0 -445
  316. package/.claude/agents/marketing/marketing-ai-citation-strategist.md +0 -171
  317. package/.claude/agents/marketing/marketing-app-store-optimizer.md +0 -322
  318. package/.claude/agents/marketing/marketing-baidu-seo-specialist.md +0 -227
  319. package/.claude/agents/marketing/marketing-bilibili-content-strategist.md +0 -200
  320. package/.claude/agents/marketing/marketing-book-co-author.md +0 -111
  321. package/.claude/agents/marketing/marketing-carousel-growth-engine.md +0 -200
  322. package/.claude/agents/marketing/marketing-china-ecommerce-operator.md +0 -284
  323. package/.claude/agents/marketing/marketing-content-creator.md +0 -67
  324. package/.claude/agents/marketing/marketing-cross-border-ecommerce.md +0 -260
  325. package/.claude/agents/marketing/marketing-douyin-strategist.md +0 -150
  326. package/.claude/agents/marketing/marketing-growth-hacker.md +0 -54
  327. package/.claude/agents/marketing/marketing-instagram-curator.md +0 -114
  328. package/.claude/agents/marketing/marketing-kuaishou-strategist.md +0 -224
  329. package/.claude/agents/marketing/marketing-linkedin-content-creator.md +0 -215
  330. package/.claude/agents/marketing/marketing-livestream-commerce-coach.md +0 -306
  331. package/.claude/agents/marketing/marketing-podcast-strategist.md +0 -278
  332. package/.claude/agents/marketing/marketing-private-domain-operator.md +0 -309
  333. package/.claude/agents/marketing/marketing-reddit-community-builder.md +0 -124
  334. package/.claude/agents/marketing/marketing-seo-specialist.md +0 -279
  335. package/.claude/agents/marketing/marketing-short-video-editing-coach.md +0 -413
  336. package/.claude/agents/marketing/marketing-social-media-strategist.md +0 -125
  337. package/.claude/agents/marketing/marketing-tiktok-strategist.md +0 -126
  338. package/.claude/agents/marketing/marketing-twitter-engager.md +0 -127
  339. package/.claude/agents/marketing/marketing-wechat-official-account.md +0 -146
  340. package/.claude/agents/marketing/marketing-weibo-strategist.md +0 -241
  341. package/.claude/agents/marketing/marketing-xiaohongshu-specialist.md +0 -139
  342. package/.claude/agents/marketing/marketing-zhihu-strategist.md +0 -163
  343. package/.claude/agents/neural/safla-neural.md +0 -74
  344. package/.claude/agents/paid-media/paid-media-auditor.md +0 -71
  345. package/.claude/agents/paid-media/paid-media-creative-strategist.md +0 -71
  346. package/.claude/agents/paid-media/paid-media-paid-social-strategist.md +0 -71
  347. package/.claude/agents/paid-media/paid-media-ppc-strategist.md +0 -71
  348. package/.claude/agents/paid-media/paid-media-programmatic-buyer.md +0 -71
  349. package/.claude/agents/paid-media/paid-media-search-query-analyst.md +0 -71
  350. package/.claude/agents/paid-media/paid-media-tracking-specialist.md +0 -71
  351. package/.claude/agents/payments/agentic-payments.md +0 -126
  352. package/.claude/agents/product/product-behavioral-nudge-engine.md +0 -81
  353. package/.claude/agents/product/product-feedback-synthesizer.md +0 -119
  354. package/.claude/agents/product/product-manager.md +0 -469
  355. package/.claude/agents/product/product-sprint-prioritizer.md +0 -154
  356. package/.claude/agents/product/product-trend-researcher.md +0 -159
  357. package/.claude/agents/project-management/project-management-experiment-tracker.md +0 -199
  358. package/.claude/agents/project-management/project-management-jira-workflow-steward.md +0 -231
  359. package/.claude/agents/project-management/project-management-project-shepherd.md +0 -195
  360. package/.claude/agents/project-management/project-management-studio-operations.md +0 -201
  361. package/.claude/agents/project-management/project-management-studio-producer.md +0 -204
  362. package/.claude/agents/project-management/project-manager-senior.md +0 -136
  363. package/.claude/agents/reasoning/agent.md +0 -804
  364. package/.claude/agents/reasoning/goal-planner.md +0 -73
  365. package/.claude/agents/sales/sales-account-strategist.md +0 -228
  366. package/.claude/agents/sales/sales-coach.md +0 -272
  367. package/.claude/agents/sales/sales-deal-strategist.md +0 -181
  368. package/.claude/agents/sales/sales-discovery-coach.md +0 -226
  369. package/.claude/agents/sales/sales-engineer.md +0 -183
  370. package/.claude/agents/sales/sales-outbound-strategist.md +0 -202
  371. package/.claude/agents/sales/sales-pipeline-analyst.md +0 -268
  372. package/.claude/agents/sales/sales-proposal-strategist.md +0 -218
  373. package/.claude/agents/sona/sona-learning-optimizer.md +0 -65
  374. package/.claude/agents/spatial-computing/macos-spatial-metal-engineer.md +0 -338
  375. package/.claude/agents/spatial-computing/terminal-integration-specialist.md +0 -71
  376. package/.claude/agents/spatial-computing/visionos-spatial-engineer.md +0 -55
  377. package/.claude/agents/specialists/memory-specialist.md +0 -298
  378. package/.claude/agents/specialists/performance-engineer.md +0 -387
  379. package/.claude/agents/specialists/queen-coordinator.md +0 -67
  380. package/.claude/agents/specialists/security-architect.md +0 -154
  381. package/.claude/agents/specialized/accounts-payable-agent.md +0 -186
  382. package/.claude/agents/specialized/corporate-training-designer.md +0 -193
  383. package/.claude/agents/specialized/data-consolidation-agent.md +0 -61
  384. package/.claude/agents/specialized/government-digital-presales-consultant.md +0 -364
  385. package/.claude/agents/specialized/healthcare-marketing-compliance.md +0 -396
  386. package/.claude/agents/specialized/recruitment-specialist.md +0 -510
  387. package/.claude/agents/specialized/report-distribution-agent.md +0 -66
  388. package/.claude/agents/specialized/sales-data-extraction-agent.md +0 -68
  389. package/.claude/agents/specialized/specialized-french-consulting-market.md +0 -193
  390. package/.claude/agents/specialized/specialized-korean-business-navigator.md +0 -217
  391. package/.claude/agents/specialized/specialized-salesforce-architect.md +0 -181
  392. package/.claude/agents/specialized/study-abroad-advisor.md +0 -283
  393. package/.claude/agents/specialized/supply-chain-strategist.md +0 -583
  394. package/.claude/agents/sublinear/consensus-coordinator.md +0 -333
  395. package/.claude/agents/sublinear/matrix-optimizer.md +0 -180
  396. package/.claude/agents/sublinear/pagerank-analyzer.md +0 -295
  397. package/.claude/agents/sublinear/performance-optimizer.md +0 -363
  398. package/.claude/agents/sublinear/trading-predictor.md +0 -242
  399. package/.claude/agents/support/support-analytics-reporter.md +0 -366
  400. package/.claude/agents/support/support-executive-summary-generator.md +0 -213
  401. package/.claude/agents/support/support-finance-tracker.md +0 -443
  402. package/.claude/agents/support/support-infrastructure-maintainer.md +0 -619
  403. package/.claude/agents/support/support-legal-compliance-checker.md +0 -589
  404. package/.claude/agents/support/support-support-responder.md +0 -586
  405. package/.claude/agents/swarm/adaptive-coordinator.md +0 -364
  406. package/.claude/agents/swarm/hierarchical-coordinator.md +0 -318
  407. package/.claude/agents/templates/github-pr-manager.md +0 -155
  408. package/.claude/agents/templates/memory-coordinator.md +0 -163
  409. package/.claude/agents/templates/migration-plan.md +0 -724
  410. package/.claude/agents/templates/orchestrator-task.md +0 -120
  411. package/.claude/agents/templates/performance-analyzer.md +0 -179
  412. package/.claude/agents/templates/sparc-coordinator.md +0 -163
  413. package/.claude/agents/testing/testing-reality-checker.md +0 -237
  414. package/.claude/commands/analysis/token-efficiency.md +0 -42
  415. package/.claude/commands/optimization/README.md +0 -73
  416. package/.claude/commands/optimization/parallel-execution.md +0 -76
  417. package/.claude/commands/swarm/swarm-analysis.md +0 -62
  418. package/.claude/commands/swarm/swarm-background.md +0 -65
  419. package/.claude/commands/swarm/swarm-modes.md +0 -67
  420. package/.claude/commands/swarm/swarm-monitor.md +0 -54
  421. package/.claude/commands/swarm/swarm-status.md +0 -44
  422. package/.claude/commands/swarm/swarm-strategies.md +0 -76
  423. package/.claude/commands/training/model-update.md +0 -78
  424. package/.claude/commands/training/pattern-learn.md +0 -69
  425. package/.claude/commands/training/specialization.md +0 -92
  426. package/.claude/commands/verify/check.md +0 -106
  427. package/.claude/commands/verify/start.md +0 -105
  428. package/.claude/helpers/README.md +0 -105
  429. package/.claude/helpers/context-persistence-hook.mjs +0 -1988
  430. package/.claude/helpers/intelligence.cjs +0 -247
  431. package/.claude/helpers/learning-service.mjs +0 -1302
  432. package/.claude/helpers/memory-palace.cjs +0 -461
  433. package/.claude/helpers/memory.cjs +0 -84
  434. package/.claude/helpers/metrics-db.mjs +0 -488
  435. package/.claude/helpers/router.cjs +0 -559
  436. package/.claude/helpers/session.cjs +0 -126
  437. package/.claude/helpers/swarm-hooks.sh +0 -761
  438. package/.claude/helpers/toggle-statusline.cjs +0 -58
  439. package/.claude/helpers/token-tracker.cjs +0 -934
  440. package/.claude/skills/agentdb-advanced/SKILL.md +0 -549
  441. package/.claude/skills/agentdb-learning/SKILL.md +0 -544
  442. package/.claude/skills/agentdb-memory-patterns/SKILL.md +0 -337
  443. package/.claude/skills/agentdb-optimization/SKILL.md +0 -508
  444. package/.claude/skills/agentdb-vector-search/SKILL.md +0 -335
  445. package/.claude/skills/agentic-integration/SKILL.md +0 -265
  446. package/.claude/skills/cli-modernization/SKILL.md +0 -950
  447. package/.claude/skills/core-implementation/SKILL.md +0 -892
  448. package/.claude/skills/ddd-architecture/SKILL.md +0 -444
  449. package/.claude/skills/github-code-review/SKILL.md +0 -1147
  450. package/.claude/skills/github-multi-repo/SKILL.md +0 -912
  451. package/.claude/skills/github-project-management/SKILL.md +0 -1245
  452. package/.claude/skills/github-release-management/SKILL.md +0 -1118
  453. package/.claude/skills/github-workflow-automation/SKILL.md +0 -1107
  454. package/.claude/skills/mcp-optimization/SKILL.md +0 -837
  455. package/.claude/skills/memory-unification/SKILL.md +0 -196
  456. package/.claude/skills/performance-optimization/SKILL.md +0 -416
  457. package/.claude/skills/reasoningbank-agentdb/SKILL.md +0 -444
  458. package/.claude/skills/reasoningbank-intelligence/SKILL.md +0 -199
  459. package/.claude/skills/security-hardening/SKILL.md +0 -101
  460. package/.claude/skills/stream-chain/SKILL.md +0 -560
  461. package/.claude/skills/swarm-coordination/SKILL.md +0 -451
  462. package/bundled-graph/dist/src/analyze.d.ts +0 -32
  463. package/bundled-graph/dist/src/analyze.d.ts.map +0 -1
  464. package/bundled-graph/dist/src/analyze.js +0 -297
  465. package/bundled-graph/dist/src/analyze.js.map +0 -1
  466. package/bundled-graph/dist/src/build.d.ts +0 -8
  467. package/bundled-graph/dist/src/build.d.ts.map +0 -1
  468. package/bundled-graph/dist/src/build.js.map +0 -1
  469. package/bundled-graph/dist/src/cache.d.ts +0 -12
  470. package/bundled-graph/dist/src/cache.d.ts.map +0 -1
  471. package/bundled-graph/dist/src/cache.js +0 -43
  472. package/bundled-graph/dist/src/cache.js.map +0 -1
  473. package/bundled-graph/dist/src/cluster.d.ts +0 -5
  474. package/bundled-graph/dist/src/cluster.d.ts.map +0 -1
  475. package/bundled-graph/dist/src/cluster.js.map +0 -1
  476. package/bundled-graph/dist/src/detect.d.ts +0 -21
  477. package/bundled-graph/dist/src/detect.d.ts.map +0 -1
  478. package/bundled-graph/dist/src/detect.js +0 -195
  479. package/bundled-graph/dist/src/detect.js.map +0 -1
  480. package/bundled-graph/dist/src/export.d.ts +0 -21
  481. package/bundled-graph/dist/src/export.d.ts.map +0 -1
  482. package/bundled-graph/dist/src/export.js +0 -68
  483. package/bundled-graph/dist/src/export.js.map +0 -1
  484. package/bundled-graph/dist/src/extract/index.d.ts +0 -20
  485. package/bundled-graph/dist/src/extract/index.d.ts.map +0 -1
  486. package/bundled-graph/dist/src/extract/index.js +0 -158
  487. package/bundled-graph/dist/src/extract/index.js.map +0 -1
  488. package/bundled-graph/dist/src/extract/languages/c.d.ts +0 -3
  489. package/bundled-graph/dist/src/extract/languages/c.d.ts.map +0 -1
  490. package/bundled-graph/dist/src/extract/languages/c.js +0 -88
  491. package/bundled-graph/dist/src/extract/languages/c.js.map +0 -1
  492. package/bundled-graph/dist/src/extract/languages/cpp.d.ts +0 -3
  493. package/bundled-graph/dist/src/extract/languages/cpp.d.ts.map +0 -1
  494. package/bundled-graph/dist/src/extract/languages/cpp.js +0 -121
  495. package/bundled-graph/dist/src/extract/languages/cpp.js.map +0 -1
  496. package/bundled-graph/dist/src/extract/languages/csharp.d.ts +0 -3
  497. package/bundled-graph/dist/src/extract/languages/csharp.d.ts.map +0 -1
  498. package/bundled-graph/dist/src/extract/languages/csharp.js +0 -121
  499. package/bundled-graph/dist/src/extract/languages/csharp.js.map +0 -1
  500. package/bundled-graph/dist/src/extract/languages/go.d.ts +0 -3
  501. package/bundled-graph/dist/src/extract/languages/go.d.ts.map +0 -1
  502. package/bundled-graph/dist/src/extract/languages/go.js +0 -181
  503. package/bundled-graph/dist/src/extract/languages/go.js.map +0 -1
  504. package/bundled-graph/dist/src/extract/languages/java.d.ts +0 -3
  505. package/bundled-graph/dist/src/extract/languages/java.d.ts.map +0 -1
  506. package/bundled-graph/dist/src/extract/languages/java.js +0 -117
  507. package/bundled-graph/dist/src/extract/languages/java.js.map +0 -1
  508. package/bundled-graph/dist/src/extract/languages/kotlin.d.ts +0 -3
  509. package/bundled-graph/dist/src/extract/languages/kotlin.d.ts.map +0 -1
  510. package/bundled-graph/dist/src/extract/languages/kotlin.js +0 -112
  511. package/bundled-graph/dist/src/extract/languages/kotlin.js.map +0 -1
  512. package/bundled-graph/dist/src/extract/languages/php.d.ts +0 -3
  513. package/bundled-graph/dist/src/extract/languages/php.d.ts.map +0 -1
  514. package/bundled-graph/dist/src/extract/languages/php.js +0 -130
  515. package/bundled-graph/dist/src/extract/languages/php.js.map +0 -1
  516. package/bundled-graph/dist/src/extract/languages/python.d.ts +0 -3
  517. package/bundled-graph/dist/src/extract/languages/python.d.ts.map +0 -1
  518. package/bundled-graph/dist/src/extract/languages/python.js +0 -230
  519. package/bundled-graph/dist/src/extract/languages/python.js.map +0 -1
  520. package/bundled-graph/dist/src/extract/languages/ruby.d.ts +0 -3
  521. package/bundled-graph/dist/src/extract/languages/ruby.d.ts.map +0 -1
  522. package/bundled-graph/dist/src/extract/languages/ruby.js +0 -120
  523. package/bundled-graph/dist/src/extract/languages/ruby.js.map +0 -1
  524. package/bundled-graph/dist/src/extract/languages/rust.d.ts +0 -3
  525. package/bundled-graph/dist/src/extract/languages/rust.d.ts.map +0 -1
  526. package/bundled-graph/dist/src/extract/languages/rust.js +0 -195
  527. package/bundled-graph/dist/src/extract/languages/rust.js.map +0 -1
  528. package/bundled-graph/dist/src/extract/languages/scala.d.ts +0 -3
  529. package/bundled-graph/dist/src/extract/languages/scala.d.ts.map +0 -1
  530. package/bundled-graph/dist/src/extract/languages/scala.js +0 -110
  531. package/bundled-graph/dist/src/extract/languages/scala.js.map +0 -1
  532. package/bundled-graph/dist/src/extract/languages/swift.d.ts +0 -3
  533. package/bundled-graph/dist/src/extract/languages/swift.d.ts.map +0 -1
  534. package/bundled-graph/dist/src/extract/languages/swift.js +0 -122
  535. package/bundled-graph/dist/src/extract/languages/swift.js.map +0 -1
  536. package/bundled-graph/dist/src/extract/languages/typescript.d.ts +0 -3
  537. package/bundled-graph/dist/src/extract/languages/typescript.d.ts.map +0 -1
  538. package/bundled-graph/dist/src/extract/languages/typescript.js +0 -295
  539. package/bundled-graph/dist/src/extract/languages/typescript.js.map +0 -1
  540. package/bundled-graph/dist/src/extract/semantic.d.ts +0 -38
  541. package/bundled-graph/dist/src/extract/semantic.d.ts.map +0 -1
  542. package/bundled-graph/dist/src/extract/semantic.js +0 -242
  543. package/bundled-graph/dist/src/extract/semantic.js.map +0 -1
  544. package/bundled-graph/dist/src/extract/tree-sitter-runner.d.ts +0 -48
  545. package/bundled-graph/dist/src/extract/tree-sitter-runner.d.ts.map +0 -1
  546. package/bundled-graph/dist/src/extract/tree-sitter-runner.js +0 -137
  547. package/bundled-graph/dist/src/extract/tree-sitter-runner.js.map +0 -1
  548. package/bundled-graph/dist/src/extract/types.d.ts +0 -7
  549. package/bundled-graph/dist/src/extract/types.d.ts.map +0 -1
  550. package/bundled-graph/dist/src/extract/types.js +0 -2
  551. package/bundled-graph/dist/src/extract/types.js.map +0 -1
  552. package/bundled-graph/dist/src/index.d.ts +0 -28
  553. package/bundled-graph/dist/src/index.d.ts.map +0 -1
  554. package/bundled-graph/dist/src/index.js +0 -26
  555. package/bundled-graph/dist/src/index.js.map +0 -1
  556. package/bundled-graph/dist/src/pipeline.d.ts +0 -27
  557. package/bundled-graph/dist/src/pipeline.d.ts.map +0 -1
  558. package/bundled-graph/dist/src/pipeline.js +0 -269
  559. package/bundled-graph/dist/src/pipeline.js.map +0 -1
  560. package/bundled-graph/dist/src/report.d.ts +0 -26
  561. package/bundled-graph/dist/src/report.d.ts.map +0 -1
  562. package/bundled-graph/dist/src/report.js +0 -214
  563. package/bundled-graph/dist/src/report.js.map +0 -1
  564. package/bundled-graph/dist/src/types.d.ts +0 -124
  565. package/bundled-graph/dist/src/types.d.ts.map +0 -1
  566. package/bundled-graph/dist/src/types.js +0 -2
  567. package/bundled-graph/dist/src/types.js.map +0 -1
  568. package/bundled-graph/dist/src/visualize.d.ts +0 -4
  569. package/bundled-graph/dist/src/visualize.d.ts.map +0 -1
  570. package/bundled-graph/dist/src/visualize.js +0 -574
  571. package/bundled-graph/dist/src/visualize.js.map +0 -1
  572. package/bundled-graph/dist/tsconfig.tsbuildinfo +0 -1
  573. package/dist/src/ui/dashboard-v2.html +0 -4576
@@ -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
- }