nemonix-cli 1.0.0

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 (281) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +186 -0
  3. package/dist/cli.js +6870 -0
  4. package/package.json +48 -0
  5. package/src/config/claude-code-config/.claude/commands/setup-tmux.md +0 -0
  6. package/src/config/claude-code-config/CHANGELOG.md +261 -0
  7. package/src/config/claude-code-config/README.md +1 -0
  8. package/src/config/claude-code-config/agents/action.md +36 -0
  9. package/src/config/claude-code-config/agents/clean-code-runner.md +61 -0
  10. package/src/config/claude-code-config/agents/code-reviewer.md +172 -0
  11. package/src/config/claude-code-config/agents/code-simplifier.md +49 -0
  12. package/src/config/claude-code-config/agents/explore-codebase.md +65 -0
  13. package/src/config/claude-code-config/agents/explore-docs.md +65 -0
  14. package/src/config/claude-code-config/agents/explore-fast.md +22 -0
  15. package/src/config/claude-code-config/agents/implementer.md +181 -0
  16. package/src/config/claude-code-config/agents/snipper.md +36 -0
  17. package/src/config/claude-code-config/agents/websearch.md +42 -0
  18. package/src/config/claude-code-config/commands/prompts/create-vitejs-app.md +272 -0
  19. package/src/config/claude-code-config/commands/prompts/nextjs-add-prisma-db.md +136 -0
  20. package/src/config/claude-code-config/commands/prompts/nextjs-setup-better-auth.md +173 -0
  21. package/src/config/claude-code-config/commands/prompts/nextjs-setup-project.md +200 -0
  22. package/src/config/claude-code-config/commands/prompts/prompt.md +55 -0
  23. package/src/config/claude-code-config/commands/prompts/saas-challenge-idea.md +135 -0
  24. package/src/config/claude-code-config/commands/prompts/saas-create-architecture.md +242 -0
  25. package/src/config/claude-code-config/commands/prompts/saas-create-headline.md +132 -0
  26. package/src/config/claude-code-config/commands/prompts/saas-create-landing-copywritting.md +267 -0
  27. package/src/config/claude-code-config/commands/prompts/saas-create-legals-docs.md +176 -0
  28. package/src/config/claude-code-config/commands/prompts/saas-create-logos.md +240 -0
  29. package/src/config/claude-code-config/commands/prompts/saas-create-prd.md +195 -0
  30. package/src/config/claude-code-config/commands/prompts/saas-create-tasks.md +240 -0
  31. package/src/config/claude-code-config/commands/prompts/saas-define-pricing.md +293 -0
  32. package/src/config/claude-code-config/commands/prompts/saas-find-domain-name.md +190 -0
  33. package/src/config/claude-code-config/commands/prompts/saas-implement-landing-page.md +257 -0
  34. package/src/config/claude-code-config/commands/prompts/setup-tmux.md +160 -0
  35. package/src/config/claude-code-config/commands/prompts/tools.md +148 -0
  36. package/src/config/claude-code-config/hooks/hook-post-file.ts +162 -0
  37. package/src/config/claude-code-config/scripts/.claude/skills/fix-on-my-computer/SKILL.md +81 -0
  38. package/src/config/claude-code-config/scripts/CLAUDE.md +50 -0
  39. package/src/config/claude-code-config/scripts/auto-rename-session/CLAUDE.md +59 -0
  40. package/src/config/claude-code-config/scripts/auto-rename-session/__tests__/shared.test.ts +185 -0
  41. package/src/config/claude-code-config/scripts/auto-rename-session/__tests__/title-generation.test.ts +44 -0
  42. package/src/config/claude-code-config/scripts/auto-rename-session/fixtures/sample-transcript.jsonl +3 -0
  43. package/src/config/claude-code-config/scripts/auto-rename-session/fixtures/transcript-short-message.jsonl +2 -0
  44. package/src/config/claude-code-config/scripts/auto-rename-session/fixtures/transcript-with-title.jsonl +3 -0
  45. package/src/config/claude-code-config/scripts/auto-rename-session/src/index.ts +113 -0
  46. package/src/config/claude-code-config/scripts/auto-rename-session/src/rename-all.ts +148 -0
  47. package/src/config/claude-code-config/scripts/auto-rename-session/src/shared.ts +157 -0
  48. package/src/config/claude-code-config/scripts/auto-rename-session/src/worker.ts +58 -0
  49. package/src/config/claude-code-config/scripts/biome.json +37 -0
  50. package/src/config/claude-code-config/scripts/claude-code-ai/CLAUDE.md +84 -0
  51. package/src/config/claude-code-config/scripts/claude-code-ai/__tests__/claude.test.ts +19 -0
  52. package/src/config/claude-code-config/scripts/claude-code-ai/__tests__/paths.test.ts +68 -0
  53. package/src/config/claude-code-config/scripts/claude-code-ai/claude.ts +56 -0
  54. package/src/config/claude-code-config/scripts/claude-code-ai/cli.ts +46 -0
  55. package/src/config/claude-code-config/scripts/claude-code-ai/helper/credentials.ts +76 -0
  56. package/src/config/claude-code-config/scripts/claude-code-ai/helper/index.ts +9 -0
  57. package/src/config/claude-code-config/scripts/claude-code-ai/helper/paths.ts +51 -0
  58. package/src/config/claude-code-config/scripts/command-validator/CLAUDE.md +112 -0
  59. package/src/config/claude-code-config/scripts/command-validator/README.md +147 -0
  60. package/src/config/claude-code-config/scripts/command-validator/src/__tests__/validator.test.ts +99 -0
  61. package/src/config/claude-code-config/scripts/command-validator/src/cli.ts +121 -0
  62. package/src/config/claude-code-config/scripts/command-validator/src/lib/security-rules.ts +174 -0
  63. package/src/config/claude-code-config/scripts/command-validator/src/lib/types.ts +34 -0
  64. package/src/config/claude-code-config/scripts/command-validator/src/lib/validator.ts +90 -0
  65. package/src/config/claude-code-config/scripts/package.json +43 -0
  66. package/src/config/claude-code-config/scripts/statusline/CLAUDE.md +205 -0
  67. package/src/config/claude-code-config/scripts/statusline/README.md +193 -0
  68. package/src/config/claude-code-config/scripts/statusline/__tests__/context.test.ts +229 -0
  69. package/src/config/claude-code-config/scripts/statusline/__tests__/formatters.test.ts +108 -0
  70. package/src/config/claude-code-config/scripts/statusline/__tests__/statusline.test.ts +309 -0
  71. package/src/config/claude-code-config/scripts/statusline/data/.gitkeep +0 -0
  72. package/src/config/claude-code-config/scripts/statusline/defaults.json +82 -0
  73. package/src/config/claude-code-config/scripts/statusline/docs/ARCHITECTURE.md +166 -0
  74. package/src/config/claude-code-config/scripts/statusline/fixtures/mock-transcript.jsonl +4 -0
  75. package/src/config/claude-code-config/scripts/statusline/fixtures/test-input.json +35 -0
  76. package/src/config/claude-code-config/scripts/statusline/src/analyze-daily-usage.ts +151 -0
  77. package/src/config/claude-code-config/scripts/statusline/src/commands/interactive-config.ts +515 -0
  78. package/src/config/claude-code-config/scripts/statusline/src/debug-payloads.ts +195 -0
  79. package/src/config/claude-code-config/scripts/statusline/src/index.ts +224 -0
  80. package/src/config/claude-code-config/scripts/statusline/src/lib/config-types.ts +110 -0
  81. package/src/config/claude-code-config/scripts/statusline/src/lib/config.ts +21 -0
  82. package/src/config/claude-code-config/scripts/statusline/src/lib/context.ts +103 -0
  83. package/src/config/claude-code-config/scripts/statusline/src/lib/features/limits/commands/weekly-analysis.ts +108 -0
  84. package/src/config/claude-code-config/scripts/statusline/src/lib/features/limits/index.ts +111 -0
  85. package/src/config/claude-code-config/scripts/statusline/src/lib/features/limits/types.ts +15 -0
  86. package/src/config/claude-code-config/scripts/statusline/src/lib/features/spend/commands/migrate-to-sqlite.ts +136 -0
  87. package/src/config/claude-code-config/scripts/statusline/src/lib/features/spend/commands/spend-day.ts +79 -0
  88. package/src/config/claude-code-config/scripts/statusline/src/lib/features/spend/commands/spend-month.ts +66 -0
  89. package/src/config/claude-code-config/scripts/statusline/src/lib/features/spend/commands/spend-project.ts +85 -0
  90. package/src/config/claude-code-config/scripts/statusline/src/lib/features/spend/database.ts +395 -0
  91. package/src/config/claude-code-config/scripts/statusline/src/lib/features/spend/index.ts +178 -0
  92. package/src/config/claude-code-config/scripts/statusline/src/lib/features/spend/payload-logger.ts +161 -0
  93. package/src/config/claude-code-config/scripts/statusline/src/lib/features/spend/types.ts +37 -0
  94. package/src/config/claude-code-config/scripts/statusline/src/lib/formatters.ts +426 -0
  95. package/src/config/claude-code-config/scripts/statusline/src/lib/git.ts +100 -0
  96. package/src/config/claude-code-config/scripts/statusline/src/lib/menu-factories.ts +224 -0
  97. package/src/config/claude-code-config/scripts/statusline/src/lib/presets.ts +177 -0
  98. package/src/config/claude-code-config/scripts/statusline/src/lib/render-pure.ts +516 -0
  99. package/src/config/claude-code-config/scripts/statusline/src/lib/types.ts +36 -0
  100. package/src/config/claude-code-config/scripts/statusline/src/lib/utils.ts +15 -0
  101. package/src/config/claude-code-config/scripts/statusline/src/stats.ts +119 -0
  102. package/src/config/claude-code-config/scripts/statusline/src/tests/spend-v2.test.ts +377 -0
  103. package/src/config/claude-code-config/scripts/statusline/src/tools/fixed-cost-calc.ts +317 -0
  104. package/src/config/claude-code-config/scripts/statusline/statusline.config.free.json +79 -0
  105. package/src/config/claude-code-config/scripts/statusline/statusline.config.json +100 -0
  106. package/src/config/claude-code-config/scripts/statusline/test-with-fixtures.ts +37 -0
  107. package/src/config/claude-code-config/scripts/statusline/test.ts +20 -0
  108. package/src/config/claude-code-config/scripts/statusline/tsconfig.json +27 -0
  109. package/src/config/claude-code-config/scripts/tsconfig.json +27 -0
  110. package/src/config/claude-code-config/settings.json +92 -0
  111. package/src/config/claude-code-config/skills/aibuilder-create-saas/SKILL.md +176 -0
  112. package/src/config/claude-code-config/skills/aibuilder-create-saas/references/architecture-template.md +436 -0
  113. package/src/config/claude-code-config/skills/aibuilder-create-saas/references/challenge-framework.md +289 -0
  114. package/src/config/claude-code-config/skills/aibuilder-create-saas/references/discovery-framework.md +338 -0
  115. package/src/config/claude-code-config/skills/aibuilder-create-saas/references/prd-template.md +452 -0
  116. package/src/config/claude-code-config/skills/aibuilder-create-saas/references/task-template.md +263 -0
  117. package/src/config/claude-code-config/skills/aibuilder-create-saas/references/tools.md +132 -0
  118. package/src/config/claude-code-config/skills/aibuilder-create-saas/scripts/rename-project.sh +42 -0
  119. package/src/config/claude-code-config/skills/aibuilder-create-saas/scripts/setup.sh +104 -0
  120. package/src/config/claude-code-config/skills/aibuilder-create-saas/steps/step-00-init.md +174 -0
  121. package/src/config/claude-code-config/skills/aibuilder-create-saas/steps/step-01-discovery.md +342 -0
  122. package/src/config/claude-code-config/skills/aibuilder-create-saas/steps/step-02-brainstorm.md +230 -0
  123. package/src/config/claude-code-config/skills/aibuilder-create-saas/steps/step-03-validate.md +372 -0
  124. package/src/config/claude-code-config/skills/aibuilder-create-saas/steps/step-04-prd.md +364 -0
  125. package/src/config/claude-code-config/skills/aibuilder-create-saas/steps/step-05-architecture.md +904 -0
  126. package/src/config/claude-code-config/skills/aibuilder-create-saas/steps/step-06-tasks.md +446 -0
  127. package/src/config/claude-code-config/skills/explore/SKILL.md +119 -0
  128. package/src/config/claude-code-config/skills/frontend-design/LICENSE.txt +177 -0
  129. package/src/config/claude-code-config/skills/frontend-design/SKILL.md +42 -0
  130. package/src/config/claude-code-config/skills/git-commit/SKILL.md +42 -0
  131. package/src/config/claude-code-config/skills/git-create-pr/SKILL.md +53 -0
  132. package/src/config/claude-code-config/skills/git-fix-pr-comments/SKILL.md +51 -0
  133. package/src/config/claude-code-config/skills/git-merge/SKILL.md +68 -0
  134. package/src/config/claude-code-config/skills/marketing-copywriting/SKILL.md +72 -0
  135. package/src/config/claude-code-config/skills/meta-claude-memory/SKILL.md +694 -0
  136. package/src/config/claude-code-config/skills/meta-claude-memory/references/comprehensive-example.md +175 -0
  137. package/src/config/claude-code-config/skills/meta-claude-memory/references/project-patterns.md +334 -0
  138. package/src/config/claude-code-config/skills/meta-claude-memory/references/prompting-techniques.md +411 -0
  139. package/src/config/claude-code-config/skills/meta-claude-memory/references/rules-directory-guide.md +298 -0
  140. package/src/config/claude-code-config/skills/meta-claude-memory/references/section-templates.md +347 -0
  141. package/src/config/claude-code-config/skills/meta-hooks-creator/SKILL.md +357 -0
  142. package/src/config/claude-code-config/skills/meta-hooks-creator/references/command-vs-prompt.md +287 -0
  143. package/src/config/claude-code-config/skills/meta-hooks-creator/references/examples.md +689 -0
  144. package/src/config/claude-code-config/skills/meta-hooks-creator/references/hook-types.md +495 -0
  145. package/src/config/claude-code-config/skills/meta-hooks-creator/references/input-output-schemas.md +503 -0
  146. package/src/config/claude-code-config/skills/meta-hooks-creator/references/matchers.md +517 -0
  147. package/src/config/claude-code-config/skills/meta-hooks-creator/references/troubleshooting.md +653 -0
  148. package/src/config/claude-code-config/skills/meta-prompt-creator/SKILL.md +285 -0
  149. package/src/config/claude-code-config/skills/meta-prompt-creator/references/anthropic-best-practices.md +126 -0
  150. package/src/config/claude-code-config/skills/meta-prompt-creator/references/anti-patterns.md +57 -0
  151. package/src/config/claude-code-config/skills/meta-prompt-creator/references/clarity-principles.md +54 -0
  152. package/src/config/claude-code-config/skills/meta-prompt-creator/references/context-management.md +389 -0
  153. package/src/config/claude-code-config/skills/meta-prompt-creator/references/few-shot-patterns.md +47 -0
  154. package/src/config/claude-code-config/skills/meta-prompt-creator/references/openai-best-practices.md +50 -0
  155. package/src/config/claude-code-config/skills/meta-prompt-creator/references/prompt-templates.md +110 -0
  156. package/src/config/claude-code-config/skills/meta-prompt-creator/references/reasoning-techniques.md +52 -0
  157. package/src/config/claude-code-config/skills/meta-prompt-creator/references/system-prompt-patterns.md +48 -0
  158. package/src/config/claude-code-config/skills/meta-prompt-creator/references/xml-structure.md +36 -0
  159. package/src/config/claude-code-config/skills/meta-skill-creator/LICENSE.txt +202 -0
  160. package/src/config/claude-code-config/skills/meta-skill-creator/SKILL.md +421 -0
  161. package/src/config/claude-code-config/skills/meta-skill-creator/package.json +5 -0
  162. package/src/config/claude-code-config/skills/meta-skill-creator/references/output-patterns.md +82 -0
  163. package/src/config/claude-code-config/skills/meta-skill-creator/references/progressive-disclosure-patterns.md +374 -0
  164. package/src/config/claude-code-config/skills/meta-skill-creator/references/prompting-integration.md +363 -0
  165. package/src/config/claude-code-config/skills/meta-skill-creator/references/real-world-examples.md +513 -0
  166. package/src/config/claude-code-config/skills/meta-skill-creator/references/script-patterns.md +385 -0
  167. package/src/config/claude-code-config/skills/meta-skill-creator/references/workflows.md +28 -0
  168. package/src/config/claude-code-config/skills/meta-skill-creator/references/xml-tag-guide.md +606 -0
  169. package/src/config/claude-code-config/skills/meta-skill-creator/scripts/init-skill.ts +214 -0
  170. package/src/config/claude-code-config/skills/meta-skill-creator/scripts/package-skill.ts +146 -0
  171. package/src/config/claude-code-config/skills/meta-skill-creator/scripts/validate.ts +138 -0
  172. package/src/config/claude-code-config/skills/meta-skill-workflow-creator/SKILL.md +390 -0
  173. package/src/config/claude-code-config/skills/meta-skill-workflow-creator/references/ask-patterns.md +225 -0
  174. package/src/config/claude-code-config/skills/meta-skill-workflow-creator/references/prompt-engineering.md +377 -0
  175. package/src/config/claude-code-config/skills/meta-skill-workflow-creator/references/state-management.md +275 -0
  176. package/src/config/claude-code-config/skills/meta-skill-workflow-creator/references/step-template.md +334 -0
  177. package/src/config/claude-code-config/skills/meta-skill-workflow-creator/references/workflow-patterns.md +300 -0
  178. package/src/config/claude-code-config/skills/meta-subagent-creator/SKILL.md +451 -0
  179. package/src/config/claude-code-config/skills/meta-subagent-creator/references/context-management.md +567 -0
  180. package/src/config/claude-code-config/skills/meta-subagent-creator/references/debugging-agents.md +714 -0
  181. package/src/config/claude-code-config/skills/meta-subagent-creator/references/error-handling-and-recovery.md +502 -0
  182. package/src/config/claude-code-config/skills/meta-subagent-creator/references/evaluation-and-testing.md +374 -0
  183. package/src/config/claude-code-config/skills/meta-subagent-creator/references/orchestration-patterns.md +591 -0
  184. package/src/config/claude-code-config/skills/meta-subagent-creator/references/subagents.md +599 -0
  185. package/src/config/claude-code-config/skills/meta-subagent-creator/references/writing-subagent-prompts.md +513 -0
  186. package/src/config/claude-code-config/skills/ralph-loop/SKILL.md +117 -0
  187. package/src/config/claude-code-config/skills/ralph-loop/scripts/setup.sh +278 -0
  188. package/src/config/claude-code-config/skills/ralph-loop/steps/step-00-init.md +215 -0
  189. package/src/config/claude-code-config/skills/ralph-loop/steps/step-01-interactive-prd.md +366 -0
  190. package/src/config/claude-code-config/skills/ralph-loop/steps/step-02-create-stories.md +273 -0
  191. package/src/config/claude-code-config/skills/ralph-loop/steps/step-03-finish.md +245 -0
  192. package/src/config/claude-code-config/skills/ralph-tasks/SKILL.md +88 -0
  193. package/src/config/claude-code-config/skills/ralph-tasks/scripts/add-task.sh +36 -0
  194. package/src/config/claude-code-config/skills/ralph-tasks/scripts/list-tasks.sh +66 -0
  195. package/src/config/claude-code-config/skills/ralph-tasks/scripts/remove-task.sh +47 -0
  196. package/src/config/claude-code-config/skills/ralph-tasks/scripts/setup.sh +201 -0
  197. package/src/config/claude-code-config/skills/ralph-tasks/steps/action-add-search.md +131 -0
  198. package/src/config/claude-code-config/skills/ralph-tasks/steps/action-add.md +46 -0
  199. package/src/config/claude-code-config/skills/ralph-tasks/steps/action-init.md +123 -0
  200. package/src/config/claude-code-config/skills/ralph-tasks/steps/action-list.md +58 -0
  201. package/src/config/claude-code-config/skills/ralph-tasks/steps/action-remove.md +48 -0
  202. package/src/config/claude-code-config/skills/ralph-tasks/steps/action-setup.md +46 -0
  203. package/src/config/claude-code-config/skills/ralph-tasks/steps/action-wake-up.md +62 -0
  204. package/src/config/claude-code-config/skills/utils-fix-errors/SKILL.md +61 -0
  205. package/src/config/claude-code-config/skills/utils-fix-grammar/SKILL.md +59 -0
  206. package/src/config/claude-code-config/skills/utils-oneshot/SKILL.md +56 -0
  207. package/src/config/claude-code-config/skills/utils-refactor/SKILL.md +89 -0
  208. package/src/config/claude-code-config/skills/utils-save-docs/SKILL.md +74 -0
  209. package/src/config/claude-code-config/skills/utils-ultrathink/SKILL.md +42 -0
  210. package/src/config/claude-code-config/skills/workflow-apex/SKILL.md +116 -0
  211. package/src/config/claude-code-config/skills/workflow-apex/scripts/setup-templates.sh +144 -0
  212. package/src/config/claude-code-config/skills/workflow-apex/scripts/update-progress.sh +80 -0
  213. package/src/config/claude-code-config/skills/workflow-apex/steps/step-00-init.md +273 -0
  214. package/src/config/claude-code-config/skills/workflow-apex/steps/step-00b-branch.md +126 -0
  215. package/src/config/claude-code-config/skills/workflow-apex/steps/step-00b-economy.md +244 -0
  216. package/src/config/claude-code-config/skills/workflow-apex/steps/step-00b-interactive.md +165 -0
  217. package/src/config/claude-code-config/skills/workflow-apex/steps/step-00b-save.md +123 -0
  218. package/src/config/claude-code-config/skills/workflow-apex/steps/step-01-analyze.md +361 -0
  219. package/src/config/claude-code-config/skills/workflow-apex/steps/step-02-plan.md +422 -0
  220. package/src/config/claude-code-config/skills/workflow-apex/steps/step-02b-tasks.md +301 -0
  221. package/src/config/claude-code-config/skills/workflow-apex/steps/step-03-execute-teams.md +297 -0
  222. package/src/config/claude-code-config/skills/workflow-apex/steps/step-03-execute.md +239 -0
  223. package/src/config/claude-code-config/skills/workflow-apex/steps/step-04-validate.md +264 -0
  224. package/src/config/claude-code-config/skills/workflow-apex/steps/step-05-examine.md +294 -0
  225. package/src/config/claude-code-config/skills/workflow-apex/steps/step-06-resolve.md +237 -0
  226. package/src/config/claude-code-config/skills/workflow-apex/steps/step-07-tests.md +250 -0
  227. package/src/config/claude-code-config/skills/workflow-apex/steps/step-08-run-tests.md +308 -0
  228. package/src/config/claude-code-config/skills/workflow-apex/steps/step-09-finish.md +193 -0
  229. package/src/config/claude-code-config/skills/workflow-apex/templates/00-context.md +53 -0
  230. package/src/config/claude-code-config/skills/workflow-apex/templates/01-analyze.md +10 -0
  231. package/src/config/claude-code-config/skills/workflow-apex/templates/02-plan.md +10 -0
  232. package/src/config/claude-code-config/skills/workflow-apex/templates/03-execute.md +10 -0
  233. package/src/config/claude-code-config/skills/workflow-apex/templates/04-validate.md +10 -0
  234. package/src/config/claude-code-config/skills/workflow-apex/templates/05-examine.md +10 -0
  235. package/src/config/claude-code-config/skills/workflow-apex/templates/06-resolve.md +10 -0
  236. package/src/config/claude-code-config/skills/workflow-apex/templates/07-tests.md +10 -0
  237. package/src/config/claude-code-config/skills/workflow-apex/templates/08-run-tests.md +10 -0
  238. package/src/config/claude-code-config/skills/workflow-apex/templates/09-finish.md +10 -0
  239. package/src/config/claude-code-config/skills/workflow-apex/templates/README.md +195 -0
  240. package/src/config/claude-code-config/skills/workflow-apex/templates/step-complete.md +7 -0
  241. package/src/config/claude-code-config/skills/workflow-brainstorm/SKILL.md +127 -0
  242. package/src/config/claude-code-config/skills/workflow-brainstorm/steps/step-01-explore.md +230 -0
  243. package/src/config/claude-code-config/skills/workflow-brainstorm/steps/step-02-challenge.md +238 -0
  244. package/src/config/claude-code-config/skills/workflow-brainstorm/steps/step-03-synthesize.md +337 -0
  245. package/src/config/claude-code-config/skills/workflow-brainstorm/steps/step-04-action.md +285 -0
  246. package/src/config/claude-code-config/skills/workflow-ci-fixer/SKILL.md +150 -0
  247. package/src/config/claude-code-config/skills/workflow-ci-fixer/references/cli-commands.md +122 -0
  248. package/src/config/claude-code-config/skills/workflow-ci-fixer/references/github-cli.md +243 -0
  249. package/src/config/claude-code-config/skills/workflow-ci-fixer/references/troubleshooting.md +362 -0
  250. package/src/config/claude-code-config/skills/workflow-ci-fixer/references/vercel-cli.md +192 -0
  251. package/src/config/claude-code-config/skills/workflow-ci-fixer/steps/step-00-init.md +157 -0
  252. package/src/config/claude-code-config/skills/workflow-ci-fixer/steps/step-01-watch-ci.md +192 -0
  253. package/src/config/claude-code-config/skills/workflow-ci-fixer/steps/step-02-analyze-errors.md +263 -0
  254. package/src/config/claude-code-config/skills/workflow-ci-fixer/steps/step-03-fix-locally.md +312 -0
  255. package/src/config/claude-code-config/skills/workflow-ci-fixer/steps/step-04-commit-push.md +206 -0
  256. package/src/config/claude-code-config/skills/workflow-ci-fixer/steps/step-05-cleanup.md +196 -0
  257. package/src/config/claude-code-config/skills/workflow-clean-code/SKILL.md +129 -0
  258. package/src/config/claude-code-config/skills/workflow-clean-code/references/general-clean-code.md +347 -0
  259. package/src/config/claude-code-config/skills/workflow-clean-code/references/nextjs-clean-code.md +458 -0
  260. package/src/config/claude-code-config/skills/workflow-clean-code/references/react-clean-code.md +406 -0
  261. package/src/config/claude-code-config/skills/workflow-clean-code/references/tanstack-query-best-practices.md +516 -0
  262. package/src/config/claude-code-config/skills/workflow-clean-code/references/zustand-best-practices.md +491 -0
  263. package/src/config/claude-code-config/skills/workflow-clean-code/steps/step-01-scan.md +137 -0
  264. package/src/config/claude-code-config/skills/workflow-clean-code/steps/step-02-apply.md +152 -0
  265. package/src/config/claude-code-config/skills/workflow-clean-code/steps/step-03-verify.md +143 -0
  266. package/src/config/claude-code-config/skills/workflow-debug/SKILL.md +126 -0
  267. package/src/config/claude-code-config/skills/workflow-debug/references/log-technique.md +285 -0
  268. package/src/config/claude-code-config/skills/workflow-debug/steps/step-00-init.md +94 -0
  269. package/src/config/claude-code-config/skills/workflow-debug/steps/step-01-analyze.md +180 -0
  270. package/src/config/claude-code-config/skills/workflow-debug/steps/step-01b-log-instrumentation.md +271 -0
  271. package/src/config/claude-code-config/skills/workflow-debug/steps/step-02-find-solutions.md +141 -0
  272. package/src/config/claude-code-config/skills/workflow-debug/steps/step-03-propose.md +142 -0
  273. package/src/config/claude-code-config/skills/workflow-debug/steps/step-04-fix.md +176 -0
  274. package/src/config/claude-code-config/skills/workflow-debug/steps/step-05-verify.md +279 -0
  275. package/src/config/claude-code-config/skills/workflow-review-code/SKILL.md +219 -0
  276. package/src/config/claude-code-config/skills/workflow-review-code/references/clean-code-principles.md +140 -0
  277. package/src/config/claude-code-config/skills/workflow-review-code/references/code-quality-metrics.md +174 -0
  278. package/src/config/claude-code-config/skills/workflow-review-code/references/feedback-patterns.md +149 -0
  279. package/src/config/claude-code-config/skills/workflow-review-code/references/security-checklist.md +127 -0
  280. package/src/config/claude-code-config/song/finish.mp3 +0 -0
  281. package/src/config/claude-code-config/song/need-human.mp3 +0 -0
@@ -0,0 +1,516 @@
1
+ /**
2
+ * Pure statusline renderer - no I/O, no side effects
3
+ *
4
+ * ARCHITECTURE: Raw data in, formatted string out.
5
+ * ALL config decisions happen here, not in data preparation.
6
+ */
7
+
8
+ import type { StatuslineConfig } from "./config-types";
9
+ import {
10
+ colors,
11
+ formatCost,
12
+ formatDuration,
13
+ formatPath,
14
+ formatProgressBar,
15
+ formatResetTime,
16
+ formatTokens,
17
+ } from "./formatters";
18
+
19
+ const WEEKLY_HOURS = 168; // 7 days * 24 hours
20
+ const FIVE_HOUR_MINUTES = 300; // 5 hours * 60 minutes
21
+
22
+ // ─────────────────────────────────────────────────────────────
23
+ // RAW DATA TYPES - No pre-formatting, just raw values
24
+ // ─────────────────────────────────────────────────────────────
25
+
26
+ export interface GitChanges {
27
+ files: number;
28
+ added: number;
29
+ deleted: number;
30
+ }
31
+
32
+ export interface RawGitData {
33
+ branch: string;
34
+ dirty: boolean;
35
+ staged: GitChanges;
36
+ unstaged: GitChanges;
37
+ }
38
+
39
+ export interface UsageLimit {
40
+ utilization: number;
41
+ resets_at: string | null;
42
+ }
43
+
44
+ export interface RawStatuslineData {
45
+ git: RawGitData | null;
46
+ path: string;
47
+ modelName: string;
48
+ cost: number;
49
+ durationMs: number;
50
+ contextTokens: number | null;
51
+ contextPercentage: number | null;
52
+ usageLimits?: {
53
+ five_hour: UsageLimit | null;
54
+ seven_day: UsageLimit | null;
55
+ };
56
+ periodCost?: number;
57
+ todayCost?: number;
58
+ thinkingEnabled?: boolean;
59
+ }
60
+
61
+ // Legacy interface for backwards compatibility
62
+ export interface StatuslineData {
63
+ branch: string;
64
+ dirPath: string;
65
+ modelName: string;
66
+ sessionCost: string;
67
+ sessionDuration: string;
68
+ contextTokens: number | null;
69
+ contextPercentage: number | null;
70
+ usageLimits?: {
71
+ five_hour: UsageLimit | null;
72
+ seven_day: UsageLimit | null;
73
+ };
74
+ periodCost?: number;
75
+ todayCost?: number;
76
+ thinkingEnabled?: boolean;
77
+ }
78
+
79
+ // ─────────────────────────────────────────────────────────────
80
+ // FORMATTING - All config-aware formatting in one place
81
+ // ─────────────────────────────────────────────────────────────
82
+
83
+ function formatGitPart(
84
+ git: RawGitData | null,
85
+ config: StatuslineConfig["git"],
86
+ ): string {
87
+ if (!git || !config.enabled) return "";
88
+
89
+ const parts: string[] = [];
90
+
91
+ if (config.showBranch) {
92
+ parts.push(colors.lightGray(git.branch));
93
+ }
94
+
95
+ if (git.dirty && config.showDirtyIndicator) {
96
+ // Append to branch name without space
97
+ if (parts.length > 0) {
98
+ parts[parts.length - 1] += colors.purple("*");
99
+ } else {
100
+ parts.push(colors.purple("*"));
101
+ }
102
+ }
103
+
104
+ const changeParts: string[] = [];
105
+
106
+ if (config.showChanges) {
107
+ const totalAdded = git.staged.added + git.unstaged.added;
108
+ const totalDeleted = git.staged.deleted + git.unstaged.deleted;
109
+ if (totalAdded > 0) changeParts.push(colors.green(`+${totalAdded}`));
110
+ if (totalDeleted > 0) changeParts.push(colors.red(`-${totalDeleted}`));
111
+ }
112
+
113
+ if (config.showStaged && git.staged.files > 0) {
114
+ changeParts.push(colors.gray(`~${git.staged.files}`));
115
+ }
116
+
117
+ if (config.showUnstaged && git.unstaged.files > 0) {
118
+ changeParts.push(colors.yellow(`~${git.unstaged.files}`));
119
+ }
120
+
121
+ if (changeParts.length > 0) {
122
+ parts.push(changeParts.join(" "));
123
+ }
124
+
125
+ return parts.join(" ");
126
+ }
127
+
128
+ function formatSessionPart(
129
+ cost: number,
130
+ durationMs: number,
131
+ contextTokens: number | null,
132
+ contextPercentage: number | null,
133
+ maxTokens: number,
134
+ config: StatuslineConfig["session"],
135
+ ): string {
136
+ // No context data yet - show placeholder
137
+ if (contextTokens === null || contextPercentage === null) {
138
+ return `${colors.gray("S:")} ${colors.gray("-")}`;
139
+ }
140
+
141
+ const items: string[] = [];
142
+
143
+ if (config.cost.enabled) {
144
+ const formattedCost = formatCost(cost, config.cost.format);
145
+ items.push(`${colors.gray("$")}${colors.dimWhite(formattedCost)}`);
146
+ }
147
+
148
+ if (config.tokens.enabled) {
149
+ const formattedUsed = formatTokens(
150
+ contextTokens,
151
+ config.tokens.showDecimals,
152
+ );
153
+ if (config.tokens.showMax) {
154
+ const formattedMax = formatTokens(maxTokens, config.tokens.showDecimals);
155
+ items.push(`${formattedUsed}${colors.gray("/")}${formattedMax}`);
156
+ } else {
157
+ items.push(formattedUsed);
158
+ }
159
+ }
160
+
161
+ if (config.percentage.enabled) {
162
+ const pctParts: string[] = [];
163
+
164
+ if (config.percentage.progressBar.enabled) {
165
+ pctParts.push(
166
+ formatProgressBar({
167
+ percentage: contextPercentage,
168
+ length: config.percentage.progressBar.length,
169
+ style: config.percentage.progressBar.style,
170
+ colorMode: config.percentage.progressBar.color,
171
+ background: config.percentage.progressBar.background,
172
+ }),
173
+ );
174
+ }
175
+
176
+ if (config.percentage.showValue) {
177
+ pctParts.push(
178
+ `${colors.lightGray(contextPercentage.toString())}${colors.gray("%")}`,
179
+ );
180
+ }
181
+
182
+ if (pctParts.length > 0) {
183
+ items.push(pctParts.join(" "));
184
+ }
185
+ }
186
+
187
+ if (config.duration.enabled) {
188
+ items.push(colors.gray(`(${formatDuration(durationMs)})`));
189
+ }
190
+
191
+ if (items.length === 0) return "";
192
+
193
+ const sep = config.infoSeparator
194
+ ? ` ${colors.gray(config.infoSeparator)} `
195
+ : " ";
196
+ return `${colors.gray("S:")} ${items.join(sep)}`;
197
+ }
198
+
199
+ function formatLimitsPart(
200
+ fiveHour: UsageLimit | null,
201
+ periodCost: number,
202
+ config: StatuslineConfig["limits"],
203
+ ): string {
204
+ if (!config.enabled || !fiveHour) return "";
205
+
206
+ const parts: string[] = [];
207
+
208
+ if (config.cost.enabled && periodCost > 0) {
209
+ parts.push(
210
+ `${colors.gray("$")}${colors.dimWhite(formatCost(periodCost, config.cost.format))}`,
211
+ );
212
+ }
213
+
214
+ if (config.percentage.enabled) {
215
+ if (config.percentage.progressBar.enabled) {
216
+ parts.push(
217
+ formatProgressBar({
218
+ percentage: fiveHour.utilization,
219
+ length: config.percentage.progressBar.length,
220
+ style: config.percentage.progressBar.style,
221
+ colorMode: config.percentage.progressBar.color,
222
+ background: config.percentage.progressBar.background,
223
+ }),
224
+ );
225
+ }
226
+
227
+ if (config.percentage.showValue) {
228
+ parts.push(
229
+ `${colors.lightGray(fiveHour.utilization.toString())}${colors.gray("%")}`,
230
+ );
231
+ }
232
+ }
233
+
234
+ if (config.showPacingDelta && fiveHour.resets_at) {
235
+ const delta = calculateFiveHourDelta(
236
+ fiveHour.utilization,
237
+ fiveHour.resets_at,
238
+ );
239
+ parts.push(
240
+ `${colors.gray("(")}${formatPacingDelta(delta)}${colors.gray(")")}`,
241
+ );
242
+ }
243
+
244
+ if (config.showTimeLeft && fiveHour.resets_at) {
245
+ parts.push(colors.gray(`(${formatResetTime(fiveHour.resets_at)})`));
246
+ }
247
+
248
+ return parts.length > 0 ? `${colors.gray("L:")} ${parts.join(" ")}` : "";
249
+ }
250
+
251
+ function shouldShowWeekly(
252
+ config: StatuslineConfig["weeklyUsage"],
253
+ fiveHourUtilization: number | null,
254
+ ): boolean {
255
+ if (config.enabled === true) return true;
256
+ if (config.enabled === false) return false;
257
+ if (config.enabled === "90%" && fiveHourUtilization !== null) {
258
+ return fiveHourUtilization >= 90;
259
+ }
260
+ return false;
261
+ }
262
+
263
+ function calculateWeeklyDelta(
264
+ utilization: number,
265
+ resetsAt: string | null,
266
+ ): number {
267
+ if (!resetsAt) return 0;
268
+
269
+ const resetDate = new Date(resetsAt);
270
+ const now = new Date();
271
+ const diffMs = resetDate.getTime() - now.getTime();
272
+ const hoursRemaining = Math.max(0, diffMs / 3600000);
273
+ const timeElapsedPercent =
274
+ ((WEEKLY_HOURS - hoursRemaining) / WEEKLY_HOURS) * 100;
275
+
276
+ return utilization - timeElapsedPercent;
277
+ }
278
+
279
+ function formatPacingDelta(delta: number): string {
280
+ const inverted = -delta;
281
+ const sign = inverted >= 0 ? "+" : "";
282
+ const value = `${sign}${inverted.toFixed(1)}%`;
283
+
284
+ if (inverted > 5) return colors.green(value);
285
+ if (inverted > 0) return colors.lightGray(value);
286
+ if (inverted > -10) return colors.yellow(value);
287
+ return colors.red(value);
288
+ }
289
+
290
+ function calculateFiveHourDelta(
291
+ utilization: number,
292
+ resetsAt: string | null,
293
+ ): number {
294
+ if (!resetsAt) return 0;
295
+
296
+ const resetDate = new Date(resetsAt);
297
+ const now = new Date();
298
+ const diffMs = resetDate.getTime() - now.getTime();
299
+ const minutesRemaining = Math.max(0, diffMs / 60000);
300
+ const timeElapsedPercent =
301
+ ((FIVE_HOUR_MINUTES - minutesRemaining) / FIVE_HOUR_MINUTES) * 100;
302
+
303
+ return utilization - timeElapsedPercent;
304
+ }
305
+
306
+ function formatWeeklyPart(
307
+ sevenDay: UsageLimit | null,
308
+ fiveHourUtilization: number | null,
309
+ periodCost: number,
310
+ config: StatuslineConfig["weeklyUsage"],
311
+ ): string {
312
+ if (!shouldShowWeekly(config, fiveHourUtilization) || !sevenDay) return "";
313
+
314
+ const parts: string[] = [];
315
+
316
+ if (config.cost.enabled && periodCost > 0) {
317
+ parts.push(
318
+ `${colors.gray("$")}${colors.dimWhite(formatCost(periodCost, config.cost.format))}`,
319
+ );
320
+ }
321
+
322
+ if (config.percentage.enabled) {
323
+ if (config.percentage.progressBar.enabled) {
324
+ parts.push(
325
+ formatProgressBar({
326
+ percentage: sevenDay.utilization,
327
+ length: config.percentage.progressBar.length,
328
+ style: config.percentage.progressBar.style,
329
+ colorMode: config.percentage.progressBar.color,
330
+ background: config.percentage.progressBar.background,
331
+ }),
332
+ );
333
+ }
334
+
335
+ if (config.percentage.showValue) {
336
+ parts.push(
337
+ `${colors.lightGray(sevenDay.utilization.toString())}${colors.gray("%")}`,
338
+ );
339
+ }
340
+ }
341
+
342
+ if (config.showPacingDelta && sevenDay.resets_at) {
343
+ const delta = calculateWeeklyDelta(
344
+ sevenDay.utilization,
345
+ sevenDay.resets_at,
346
+ );
347
+ parts.push(
348
+ `${colors.gray("(")}${formatPacingDelta(delta)}${colors.gray(")")}`,
349
+ );
350
+ }
351
+
352
+ if (config.showTimeLeft && sevenDay.resets_at) {
353
+ parts.push(colors.gray(`(${formatResetTime(sevenDay.resets_at)})`));
354
+ }
355
+
356
+ return parts.length > 0 ? `${colors.gray("W:")} ${parts.join(" ")}` : "";
357
+ }
358
+
359
+ function formatDailyPart(
360
+ todayCost: number,
361
+ config: StatuslineConfig["dailySpend"],
362
+ ): string {
363
+ if (!config.cost.enabled || todayCost <= 0) return "";
364
+ return `${colors.gray("D:")} ${colors.gray("$")}${colors.dimWhite(formatCost(todayCost, config.cost.format))}`;
365
+ }
366
+
367
+ function formatThinkingPart(
368
+ thinkingEnabled: boolean,
369
+ config: StatuslineConfig["thinking"],
370
+ ): string {
371
+ if (!config.showDisabledWarning || thinkingEnabled) return "";
372
+ return colors.red("Thinking: OFF");
373
+ }
374
+
375
+ // ─────────────────────────────────────────────────────────────
376
+ // MAIN RENDER FUNCTION - Raw data + config = output
377
+ // ─────────────────────────────────────────────────────────────
378
+
379
+ export function renderStatuslineRaw(
380
+ data: RawStatuslineData,
381
+ config: StatuslineConfig,
382
+ ): string {
383
+ const sep = colors.gray(config.separator);
384
+ const sections: string[] = [];
385
+
386
+ // Line 1: Git + Path + Model
387
+ const line1Parts: string[] = [];
388
+
389
+ const gitPart = formatGitPart(data.git, config.git);
390
+ if (gitPart) line1Parts.push(gitPart);
391
+
392
+ const pathPart = formatPath(data.path, config.pathDisplayMode);
393
+ line1Parts.push(colors.gray(pathPart));
394
+
395
+ const isSonnet = data.modelName.toLowerCase().includes("sonnet");
396
+ if (!isSonnet || config.showSonnetModel) {
397
+ line1Parts.push(colors.peach(data.modelName));
398
+ }
399
+
400
+ sections.push(line1Parts.join(` ${sep} `));
401
+
402
+ // Line 2: Session info
403
+ const sessionPart = formatSessionPart(
404
+ data.cost,
405
+ data.durationMs,
406
+ data.contextTokens,
407
+ data.contextPercentage,
408
+ config.context.maxContextTokens,
409
+ config.session,
410
+ );
411
+ if (sessionPart) sections.push(sessionPart);
412
+
413
+ // Limits
414
+ const limitsPart = formatLimitsPart(
415
+ data.usageLimits?.five_hour ?? null,
416
+ data.periodCost ?? 0,
417
+ config.limits,
418
+ );
419
+ if (limitsPart) sections.push(limitsPart);
420
+
421
+ // Weekly
422
+ const weeklyPart = formatWeeklyPart(
423
+ data.usageLimits?.seven_day ?? null,
424
+ data.usageLimits?.five_hour?.utilization ?? null,
425
+ data.periodCost ?? 0,
426
+ config.weeklyUsage,
427
+ );
428
+ if (weeklyPart) sections.push(weeklyPart);
429
+
430
+ // Daily
431
+ const dailyPart = formatDailyPart(data.todayCost ?? 0, config.dailySpend);
432
+ if (dailyPart) sections.push(dailyPart);
433
+
434
+ // Thinking warning (last position)
435
+ const thinkingPart = formatThinkingPart(
436
+ data.thinkingEnabled ?? true,
437
+ config.thinking,
438
+ );
439
+ if (thinkingPart) sections.push(thinkingPart);
440
+
441
+ const output = sections.join(` ${sep} `);
442
+
443
+ if (config.oneLine) return output;
444
+
445
+ // Two-line mode: break after line1
446
+ const line1 = sections[0];
447
+ const rest = sections.slice(1).join(` ${sep} `);
448
+ return rest ? `${line1}\n${rest}` : line1;
449
+ }
450
+
451
+ // ─────────────────────────────────────────────────────────────
452
+ // LEGACY SUPPORT - For backwards compatibility with old data format
453
+ // ─────────────────────────────────────────────────────────────
454
+
455
+ export function renderStatusline(
456
+ data: StatuslineData,
457
+ config: StatuslineConfig,
458
+ ): string {
459
+ // Convert legacy format to raw format
460
+ // Parse pre-formatted values back to raw (best effort)
461
+ const rawData: RawStatuslineData = {
462
+ git: parseGitFromBranch(data.branch),
463
+ path: data.dirPath.startsWith("~") ? data.dirPath : data.dirPath,
464
+ modelName: data.modelName,
465
+ cost: parseFloat(data.sessionCost.replace(/[$,]/g, "")) || 0,
466
+ durationMs: parseDurationToMs(data.sessionDuration),
467
+ contextTokens: data.contextTokens,
468
+ contextPercentage: data.contextPercentage,
469
+ usageLimits: data.usageLimits,
470
+ periodCost: data.periodCost,
471
+ todayCost: data.todayCost,
472
+ thinkingEnabled: data.thinkingEnabled,
473
+ };
474
+
475
+ return renderStatuslineRaw(rawData, config);
476
+ }
477
+
478
+ // Helper to parse legacy branch string back to git data
479
+ function parseGitFromBranch(branch: string): RawGitData | null {
480
+ if (!branch) return null;
481
+
482
+ // Parse "main* +10 -5" format
483
+ const dirty = branch.includes("*");
484
+ const branchName =
485
+ branch.replace(/\*.*$/, "").replace(/\*/, "").trim() || "main";
486
+
487
+ const addMatch = branch.match(/\+(\d+)/);
488
+ const delMatch = branch.match(/-(\d+)/);
489
+ const added = addMatch ? parseInt(addMatch[1], 10) : 0;
490
+ const deleted = delMatch ? parseInt(delMatch[1], 10) : 0;
491
+
492
+ return {
493
+ branch: branchName,
494
+ dirty,
495
+ staged: {
496
+ files: 0,
497
+ added: Math.floor(added / 2),
498
+ deleted: Math.floor(deleted / 2),
499
+ },
500
+ unstaged: {
501
+ files: 0,
502
+ added: Math.ceil(added / 2),
503
+ deleted: Math.ceil(deleted / 2),
504
+ },
505
+ };
506
+ }
507
+
508
+ // Helper to parse "12m" or "1h 30m" back to ms
509
+ function parseDurationToMs(duration: string): number {
510
+ let ms = 0;
511
+ const hourMatch = duration.match(/(\d+)h/);
512
+ const minMatch = duration.match(/(\d+)m/);
513
+ if (hourMatch) ms += parseInt(hourMatch[1], 10) * 3600000;
514
+ if (minMatch) ms += parseInt(minMatch[1], 10) * 60000;
515
+ return ms || 720000; // Default 12 minutes
516
+ }
@@ -0,0 +1,36 @@
1
+ export interface HookInput {
2
+ session_id: string;
3
+ transcript_path: string;
4
+ cwd: string;
5
+ model: {
6
+ id: string;
7
+ display_name: string;
8
+ };
9
+ workspace: {
10
+ current_dir: string;
11
+ project_dir: string;
12
+ };
13
+ version: string;
14
+ output_style: {
15
+ name: string;
16
+ };
17
+ cost: {
18
+ total_cost_usd: number;
19
+ total_duration_ms: number;
20
+ total_api_duration_ms: number;
21
+ total_lines_added: number;
22
+ total_lines_removed: number;
23
+ };
24
+ context_window?: {
25
+ total_input_tokens: number;
26
+ total_output_tokens: number;
27
+ context_window_size: number;
28
+ current_usage?: {
29
+ input_tokens: number;
30
+ output_tokens: number;
31
+ cache_creation_input_tokens?: number;
32
+ cache_read_input_tokens?: number;
33
+ };
34
+ };
35
+ exceeds_200k_tokens?: boolean;
36
+ }
@@ -0,0 +1,15 @@
1
+ export function normalizeResetsAt(resetsAt: string): string {
2
+ try {
3
+ const date = new Date(resetsAt);
4
+ const minutes = date.getMinutes();
5
+ const roundedMinutes = Math.round(minutes / 5) * 5;
6
+
7
+ date.setMinutes(roundedMinutes);
8
+ date.setSeconds(0);
9
+ date.setMilliseconds(0);
10
+
11
+ return date.toISOString();
12
+ } catch {
13
+ return resetsAt;
14
+ }
15
+ }
@@ -0,0 +1,119 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { getDb } from "./lib/features/spend/database";
4
+ import { colors, formatProgressBar } from "./lib/formatters";
5
+
6
+ interface DailyStats {
7
+ date: string;
8
+ sessionCount: number;
9
+ totalCost: number;
10
+ totalDuration: number;
11
+ }
12
+
13
+ function getDailyStats(): DailyStats[] {
14
+ const db = getDb();
15
+
16
+ const rows = db
17
+ .query<
18
+ {
19
+ date: string;
20
+ session_count: number;
21
+ total_cost: number;
22
+ total_duration: number;
23
+ },
24
+ []
25
+ >(
26
+ `SELECT
27
+ date,
28
+ COUNT(*) as session_count,
29
+ SUM(total_cost) as total_cost,
30
+ SUM(duration_ms) as total_duration
31
+ FROM sessions
32
+ GROUP BY date
33
+ ORDER BY date DESC
34
+ LIMIT 30`,
35
+ )
36
+ .all();
37
+
38
+ return rows.map((row) => ({
39
+ date: row.date,
40
+ sessionCount: row.session_count,
41
+ totalCost: row.total_cost,
42
+ totalDuration: row.total_duration,
43
+ }));
44
+ }
45
+
46
+ function getTotalStats(): {
47
+ totalSessions: number;
48
+ totalCost: number;
49
+ totalDays: number;
50
+ } {
51
+ const db = getDb();
52
+
53
+ const result = db
54
+ .query<
55
+ { total_sessions: number; total_cost: number; total_days: number },
56
+ []
57
+ >(
58
+ `SELECT
59
+ COUNT(*) as total_sessions,
60
+ COALESCE(SUM(total_cost), 0) as total_cost,
61
+ COUNT(DISTINCT date) as total_days
62
+ FROM sessions`,
63
+ )
64
+ .get();
65
+
66
+ return {
67
+ totalSessions: result?.total_sessions ?? 0,
68
+ totalCost: result?.total_cost ?? 0,
69
+ totalDays: result?.total_days ?? 0,
70
+ };
71
+ }
72
+
73
+ async function main() {
74
+ const totals = getTotalStats();
75
+ const dailyStats = getDailyStats();
76
+
77
+ if (totals.totalDays === 0) {
78
+ console.log(colors.yellow("No usage data available yet."));
79
+ console.log(colors.gray("Data will be collected as you use Claude Code."));
80
+ return;
81
+ }
82
+
83
+ const avgCostPerDay = totals.totalCost / totals.totalDays;
84
+
85
+ console.log(`${colors.lightGray("Daily Usage Statistics")}\n`);
86
+ console.log(`${colors.gray("Total days:")} ${totals.totalDays}`);
87
+ console.log(`${colors.gray("Total sessions:")} ${totals.totalSessions}`);
88
+ console.log(`${colors.gray("Total cost:")} $${totals.totalCost.toFixed(2)}`);
89
+ console.log(`${colors.gray("Avg cost/day:")} $${avgCostPerDay.toFixed(2)}\n`);
90
+
91
+ console.log(colors.gray("Recent usage (last 7 days):"));
92
+ const recent = dailyStats.slice(0, 7);
93
+
94
+ const maxCost = Math.max(...recent.map((d) => d.totalCost), 1);
95
+
96
+ for (const day of recent) {
97
+ const date = new Date(day.date).toLocaleDateString("en-US", {
98
+ month: "short",
99
+ day: "numeric",
100
+ });
101
+
102
+ const percentage = (day.totalCost / maxCost) * 100;
103
+ const bar = formatProgressBar({
104
+ percentage,
105
+ length: 10,
106
+ style: "braille",
107
+ colorMode: "progressive",
108
+ background: "none",
109
+ });
110
+
111
+ const info = colors.gray(
112
+ `(${day.sessionCount} sessions | $${day.totalCost.toFixed(2)})`,
113
+ );
114
+
115
+ console.log(` ${colors.gray(date.padEnd(8))} ${bar} ${info}`);
116
+ }
117
+ }
118
+
119
+ main();