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,195 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import {
4
+ getPayloadsGroupedBySession,
5
+ getTodayPayloads,
6
+ type PayloadLogEntry,
7
+ readPayloadLogs,
8
+ rotatePayloadLogs,
9
+ } from "./lib/features/spend/payload-logger";
10
+ import { colors } from "./lib/formatters";
11
+
12
+ function formatCost(cost: number): string {
13
+ return `$${cost.toFixed(4)}`;
14
+ }
15
+
16
+ function formatDuration(ms: number): string {
17
+ const minutes = Math.floor(ms / 60000);
18
+ const hours = Math.floor(minutes / 60);
19
+ if (hours > 0) {
20
+ return `${hours}h${minutes % 60}m`;
21
+ }
22
+ return `${minutes}m`;
23
+ }
24
+
25
+ function analyzeSessionProgression(entries: PayloadLogEntry[]): void {
26
+ if (entries.length === 0) return;
27
+
28
+ const sorted = [...entries].sort(
29
+ (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),
30
+ );
31
+
32
+ console.log(
33
+ ` ${colors.gray("Events:")} ${sorted.length} | ${colors.gray("First:")} ${sorted[0].timestamp.split("T")[1].split(".")[0]} | ${colors.gray("Last:")} ${sorted[sorted.length - 1].timestamp.split("T")[1].split(".")[0]}`,
34
+ );
35
+
36
+ let prevCost = 0;
37
+ let anomalies = 0;
38
+
39
+ for (const entry of sorted) {
40
+ const costDelta = entry.total_cost_usd - prevCost;
41
+ const ctx = entry.context;
42
+
43
+ if (ctx) {
44
+ const flags = [];
45
+ if (ctx.is_new_session) flags.push(colors.yellow("NEW"));
46
+ if (ctx.is_clear_continuation) flags.push(colors.red("CLEAR"));
47
+ if (ctx.delta_cost && ctx.delta_cost < 0) {
48
+ flags.push(colors.red("NEG_DELTA"));
49
+ anomalies++;
50
+ }
51
+ if (costDelta < 0) {
52
+ flags.push(colors.red("COST_DROP"));
53
+ anomalies++;
54
+ }
55
+
56
+ if (flags.length > 0 || costDelta > 1) {
57
+ console.log(
58
+ ` ${entry.timestamp.split("T")[1].split(".")[0]} | ${formatCost(entry.total_cost_usd)} (Δ${formatCost(costDelta)}) | ctx_delta: ${formatCost(ctx.delta_cost ?? 0)} | ${flags.join(" ")}`,
59
+ );
60
+ }
61
+ }
62
+
63
+ prevCost = entry.total_cost_usd;
64
+ }
65
+
66
+ if (anomalies > 0) {
67
+ console.log(colors.red(` ⚠ ${anomalies} anomalies detected`));
68
+ }
69
+ }
70
+
71
+ function showTodaySummary(): void {
72
+ const entries = getTodayPayloads();
73
+
74
+ console.log(`\n${colors.lightGray("Today's Payload Summary")}\n`);
75
+ console.log(`${colors.gray("Total events:")} ${entries.length}`);
76
+
77
+ if (entries.length === 0) {
78
+ console.log(colors.yellow("No payloads logged today yet."));
79
+ return;
80
+ }
81
+
82
+ const grouped = new Map<string, PayloadLogEntry[]>();
83
+ for (const entry of entries) {
84
+ const existing = grouped.get(entry.session_id) || [];
85
+ existing.push(entry);
86
+ grouped.set(entry.session_id, existing);
87
+ }
88
+
89
+ console.log(`${colors.gray("Unique sessions:")} ${grouped.size}\n`);
90
+
91
+ const sessions = Array.from(grouped.entries())
92
+ .map(([id, entries]) => ({
93
+ id,
94
+ entries,
95
+ lastCost: entries[entries.length - 1].total_cost_usd,
96
+ eventCount: entries.length,
97
+ }))
98
+ .sort((a, b) => b.lastCost - a.lastCost);
99
+
100
+ console.log(colors.gray("Sessions by cost (descending):"));
101
+
102
+ for (const session of sessions.slice(0, 20)) {
103
+ const firstEntry = session.entries[0];
104
+ const cwdShort = firstEntry.cwd.split("/").slice(-2).join("/");
105
+
106
+ console.log(
107
+ `\n${colors.lightGray(session.id.slice(0, 8))} | ${colors.gray(cwdShort)} | ${formatCost(session.lastCost)}`,
108
+ );
109
+ analyzeSessionProgression(session.entries);
110
+ }
111
+ }
112
+
113
+ function showAllSessions(): void {
114
+ const grouped = getPayloadsGroupedBySession();
115
+
116
+ console.log(`\n${colors.lightGray("All Sessions Analysis")}\n`);
117
+ console.log(`${colors.gray("Total unique sessions:")} ${grouped.size}`);
118
+
119
+ const totalEntries = readPayloadLogs().length;
120
+ console.log(`${colors.gray("Total logged events:")} ${totalEntries}\n`);
121
+
122
+ const sessions = Array.from(grouped.entries())
123
+ .map(([id, entries]) => ({
124
+ id,
125
+ entries,
126
+ lastCost: entries[entries.length - 1].total_cost_usd,
127
+ firstTimestamp: entries[0].timestamp,
128
+ }))
129
+ .sort(
130
+ (a, b) =>
131
+ new Date(b.firstTimestamp).getTime() -
132
+ new Date(a.firstTimestamp).getTime(),
133
+ );
134
+
135
+ console.log(colors.gray("Recent sessions:"));
136
+
137
+ for (const session of sessions.slice(0, 10)) {
138
+ const firstEntry = session.entries[0];
139
+ const cwdShort = firstEntry.cwd.split("/").slice(-2).join("/");
140
+ const date = session.firstTimestamp.split("T")[0];
141
+
142
+ console.log(
143
+ `\n${colors.lightGray(session.id.slice(0, 8))} | ${date} | ${colors.gray(cwdShort)} | ${formatCost(session.lastCost)}`,
144
+ );
145
+ analyzeSessionProgression(session.entries);
146
+ }
147
+ }
148
+
149
+ function showHelp(): void {
150
+ console.log(`
151
+ ${colors.lightGray("Statusline Payload Debug Tool")}
152
+
153
+ ${colors.gray("Usage:")}
154
+ bun run statusline:debug [command]
155
+
156
+ ${colors.gray("Commands:")}
157
+ today Show today's payload summary (default)
158
+ all Show all sessions analysis
159
+ rotate Rotate log file (keep last 10000 entries)
160
+ help Show this help
161
+
162
+ ${colors.gray("Examples:")}
163
+ bun run statusline:debug
164
+ bun run statusline:debug today
165
+ bun run statusline:debug all
166
+ bun run statusline:debug rotate
167
+ `);
168
+ }
169
+
170
+ async function main(): Promise<void> {
171
+ const command = process.argv[2] || "today";
172
+
173
+ switch (command) {
174
+ case "today":
175
+ showTodaySummary();
176
+ break;
177
+ case "all":
178
+ showAllSessions();
179
+ break;
180
+ case "rotate":
181
+ rotatePayloadLogs();
182
+ console.log(colors.green("✓ Log file rotated"));
183
+ break;
184
+ case "help":
185
+ case "--help":
186
+ case "-h":
187
+ showHelp();
188
+ break;
189
+ default:
190
+ console.log(colors.red(`Unknown command: ${command}`));
191
+ showHelp();
192
+ }
193
+ }
194
+
195
+ main();
@@ -0,0 +1,224 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { readFile, writeFile } from "node:fs/promises";
4
+ import { join } from "node:path";
5
+ import { defaultConfig, type StatuslineConfig } from "./lib/config";
6
+ import { getContextData } from "./lib/context";
7
+ import {
8
+ colors,
9
+ formatBranch,
10
+ formatCost,
11
+ formatDuration,
12
+ formatPath,
13
+ } from "./lib/formatters";
14
+ import { getGitStatus } from "./lib/git";
15
+ import {
16
+ renderStatusline,
17
+ type StatuslineData,
18
+ type UsageLimit,
19
+ } from "./lib/render-pure";
20
+ import type { HookInput } from "./lib/types";
21
+
22
+ // Optional feature imports - just delete the folder to disable!
23
+ let getUsageLimits: any = null;
24
+ let normalizeResetsAt: any = null;
25
+ let getPeriodCost: any = null;
26
+ let getTodayCostV2: any = null;
27
+ let saveSessionV2: any = null;
28
+
29
+ try {
30
+ const limitsModule = await import("./lib/features/limits");
31
+ getUsageLimits = limitsModule.getUsageLimits;
32
+ } catch {
33
+ // Limits feature not available - that's OK!
34
+ }
35
+
36
+ try {
37
+ const utilsModule = await import("./lib/utils");
38
+ normalizeResetsAt = utilsModule.normalizeResetsAt;
39
+ } catch {
40
+ // Fallback normalizeResetsAt
41
+ normalizeResetsAt = (resetsAt: string) => resetsAt;
42
+ }
43
+
44
+ let getTodayRealCost: (() => number) | null = null;
45
+ try {
46
+ const spendModule = await import("./lib/features/spend");
47
+ getPeriodCost = spendModule.getPeriodCost;
48
+ getTodayCostV2 = spendModule.getTodayCostV2;
49
+ saveSessionV2 = spendModule.saveSessionV2;
50
+ } catch {
51
+ // Spend tracking feature not available - that's OK!
52
+ }
53
+
54
+ try {
55
+ const loggerModule = await import("./lib/features/spend/payload-logger");
56
+ getTodayRealCost = loggerModule.getTodayRealCost;
57
+ } catch {
58
+ // Payload logger not available
59
+ }
60
+
61
+ // Re-export from render-pure for backwards compatibility
62
+ export {
63
+ renderStatusline,
64
+ type StatuslineData,
65
+ type UsageLimit,
66
+ } from "./lib/render-pure";
67
+
68
+ const CONFIG_FILE_PATH = join(import.meta.dir, "..", "statusline.config.json");
69
+ const LAST_PAYLOAD_PATH = join(
70
+ import.meta.dir,
71
+ "..",
72
+ "data",
73
+ "last_payload.txt",
74
+ );
75
+ const CLAUDE_SETTINGS_PATH = join(
76
+ process.env.HOME || "",
77
+ ".claude",
78
+ "settings.json",
79
+ );
80
+
81
+ interface ClaudeSettings {
82
+ alwaysThinkingEnabled?: boolean;
83
+ }
84
+
85
+ async function loadClaudeSettings(): Promise<ClaudeSettings> {
86
+ try {
87
+ const content = await readFile(CLAUDE_SETTINGS_PATH, "utf-8");
88
+ return JSON.parse(content);
89
+ } catch {
90
+ return {};
91
+ }
92
+ }
93
+
94
+ async function loadConfig(): Promise<StatuslineConfig> {
95
+ try {
96
+ const content = await readFile(CONFIG_FILE_PATH, "utf-8");
97
+ return JSON.parse(content);
98
+ } catch {
99
+ return defaultConfig;
100
+ }
101
+ }
102
+
103
+ async function main() {
104
+ try {
105
+ const input: HookInput = await Bun.stdin.json();
106
+
107
+ // Save last payload for debugging
108
+ await writeFile(LAST_PAYLOAD_PATH, JSON.stringify(input, null, 2));
109
+
110
+ const config = await loadConfig();
111
+ const claudeSettings = await loadClaudeSettings();
112
+
113
+ // Get usage limits (if feature exists)
114
+ const usageLimits = getUsageLimits
115
+ ? await getUsageLimits()
116
+ : { five_hour: null, seven_day: null };
117
+ const currentResetsAt = usageLimits.five_hour?.resets_at ?? undefined;
118
+
119
+ // Save session with current period context (if feature exists)
120
+ if (saveSessionV2) {
121
+ await saveSessionV2(input, currentResetsAt);
122
+ }
123
+
124
+ const git = await getGitStatus();
125
+
126
+ let contextTokens: number | null;
127
+ let contextPercentage: number | null;
128
+
129
+ const usePayloadContext =
130
+ config.context.usePayloadContextWindow && input.context_window;
131
+
132
+ if (usePayloadContext) {
133
+ const current = input.context_window?.current_usage;
134
+ if (current) {
135
+ contextTokens =
136
+ (current.input_tokens || 0) +
137
+ (current.cache_creation_input_tokens || 0) +
138
+ (current.cache_read_input_tokens || 0);
139
+ const maxTokens =
140
+ input.context_window?.context_window_size ||
141
+ config.context.maxContextTokens;
142
+ contextPercentage = Math.min(
143
+ 100,
144
+ Math.round((contextTokens / maxTokens) * 100),
145
+ );
146
+ } else {
147
+ // No context data yet - session not started
148
+ contextTokens = null;
149
+ contextPercentage = null;
150
+ }
151
+ } else {
152
+ const contextData = await getContextData({
153
+ transcriptPath: input.transcript_path,
154
+ maxContextTokens: config.context.maxContextTokens,
155
+ autocompactBufferTokens: config.context.autocompactBufferTokens,
156
+ useUsableContextOnly: config.context.useUsableContextOnly,
157
+ overheadTokens: config.context.overheadTokens,
158
+ });
159
+ contextTokens = contextData.tokens;
160
+ contextPercentage = contextData.percentage;
161
+ }
162
+
163
+ // Get period cost from SQLite (if feature exists)
164
+ let periodCost: number | undefined;
165
+ let todayCost: number | undefined;
166
+
167
+ if (getPeriodCost && normalizeResetsAt) {
168
+ const normalizedPeriodId = currentResetsAt
169
+ ? normalizeResetsAt(currentResetsAt)
170
+ : null;
171
+ periodCost = normalizedPeriodId ? getPeriodCost(normalizedPeriodId) : 0;
172
+ }
173
+
174
+ // Get today's cost from payloads (more accurate than DB)
175
+ if (getTodayRealCost) {
176
+ todayCost = getTodayRealCost();
177
+ } else if (getTodayCostV2) {
178
+ todayCost = getTodayCostV2();
179
+ }
180
+
181
+ const data: StatuslineData = {
182
+ branch: formatBranch(git, config.git),
183
+ dirPath: formatPath(input.workspace.current_dir, config.pathDisplayMode),
184
+ modelName: input.model.display_name,
185
+ sessionCost: formatCost(
186
+ input.cost.total_cost_usd,
187
+ config.session.cost.format,
188
+ ),
189
+ sessionDuration: formatDuration(input.cost.total_duration_ms),
190
+ contextTokens,
191
+ contextPercentage,
192
+ ...(getUsageLimits && {
193
+ usageLimits: {
194
+ five_hour: usageLimits.five_hour
195
+ ? {
196
+ utilization: usageLimits.five_hour.utilization,
197
+ resets_at: usageLimits.five_hour.resets_at,
198
+ }
199
+ : null,
200
+ seven_day: usageLimits.seven_day
201
+ ? {
202
+ utilization: usageLimits.seven_day.utilization,
203
+ resets_at: usageLimits.seven_day.resets_at,
204
+ }
205
+ : null,
206
+ },
207
+ }),
208
+ ...((getPeriodCost || getTodayCostV2) && { periodCost, todayCost }),
209
+ thinkingEnabled: claudeSettings.alwaysThinkingEnabled ?? true,
210
+ };
211
+
212
+ const output = renderStatusline(data, config);
213
+ console.log(output);
214
+ if (config.oneLine) {
215
+ console.log("");
216
+ }
217
+ } catch (error) {
218
+ const errorMessage = error instanceof Error ? error.message : String(error);
219
+ console.log(`${colors.red("Error:")} ${errorMessage}`);
220
+ console.log(colors.gray("Check statusline configuration"));
221
+ }
222
+ }
223
+
224
+ main();
@@ -0,0 +1,110 @@
1
+ export type Separator =
2
+ | "|"
3
+ | "•"
4
+ | "·"
5
+ | "⋅"
6
+ | "●"
7
+ | "◆"
8
+ | "▪"
9
+ | "▸"
10
+ | "›"
11
+ | "→";
12
+
13
+ export type CostFormat = "integer" | "decimal1" | "decimal2";
14
+ export type ProgressBarStyle = "filled" | "rectangle" | "braille";
15
+ export type ProgressBarColor =
16
+ | "progressive"
17
+ | "green"
18
+ | "yellow"
19
+ | "red"
20
+ | "peach"
21
+ | "black"
22
+ | "white"
23
+ | "purple"
24
+ | "blue"
25
+ | "cyan";
26
+ export type ProgressBarBackground =
27
+ | "none"
28
+ | "dark"
29
+ | "gray"
30
+ | "light"
31
+ | "blue"
32
+ | "purple"
33
+ | "cyan"
34
+ | "peach";
35
+
36
+ export interface CostConfig {
37
+ enabled: boolean;
38
+ format: CostFormat;
39
+ }
40
+
41
+ export interface ProgressBarConfig {
42
+ enabled: boolean;
43
+ length: 5 | 10 | 15;
44
+ style: ProgressBarStyle;
45
+ color: ProgressBarColor;
46
+ background: ProgressBarBackground;
47
+ }
48
+
49
+ export interface PercentageConfig {
50
+ enabled: boolean;
51
+ showValue: boolean;
52
+ progressBar: ProgressBarConfig;
53
+ }
54
+
55
+ export interface StatuslineConfig {
56
+ features?: {
57
+ usageLimits?: boolean;
58
+ spendTracking?: boolean;
59
+ };
60
+ oneLine: boolean;
61
+ showSonnetModel: boolean;
62
+ pathDisplayMode: "full" | "truncated" | "basename";
63
+ git: {
64
+ enabled: boolean;
65
+ showBranch: boolean;
66
+ showDirtyIndicator: boolean;
67
+ showChanges: boolean;
68
+ showStaged: boolean;
69
+ showUnstaged: boolean;
70
+ };
71
+ separator: Separator;
72
+ session: {
73
+ infoSeparator: Separator | null;
74
+ cost: CostConfig;
75
+ duration: { enabled: boolean };
76
+ tokens: {
77
+ enabled: boolean;
78
+ showMax: boolean;
79
+ showDecimals: boolean;
80
+ };
81
+ percentage: PercentageConfig;
82
+ };
83
+ context: {
84
+ usePayloadContextWindow: boolean;
85
+ maxContextTokens: number;
86
+ autocompactBufferTokens: number;
87
+ useUsableContextOnly: boolean;
88
+ overheadTokens: number;
89
+ };
90
+ limits: {
91
+ enabled: boolean;
92
+ showTimeLeft: boolean;
93
+ showPacingDelta: boolean;
94
+ cost: CostConfig;
95
+ percentage: PercentageConfig;
96
+ };
97
+ weeklyUsage: {
98
+ enabled: boolean | "90%";
99
+ showTimeLeft: boolean;
100
+ showPacingDelta: boolean;
101
+ cost: CostConfig;
102
+ percentage: PercentageConfig;
103
+ };
104
+ dailySpend: {
105
+ cost: CostConfig;
106
+ };
107
+ thinking: {
108
+ showDisabledWarning: boolean;
109
+ };
110
+ }
@@ -0,0 +1,21 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import type { StatuslineConfig } from "./config-types";
4
+
5
+ const CONFIG_DIR = join(import.meta.dir, "..", "..");
6
+ const DEFAULTS_PATH = join(CONFIG_DIR, "defaults.json");
7
+ const CONFIG_PATH = join(CONFIG_DIR, "statusline.config.json");
8
+
9
+ export const defaultConfig: StatuslineConfig = JSON.parse(
10
+ readFileSync(DEFAULTS_PATH, "utf-8"),
11
+ );
12
+
13
+ export function loadConfig(): StatuslineConfig {
14
+ try {
15
+ return JSON.parse(readFileSync(CONFIG_PATH, "utf-8"));
16
+ } catch {
17
+ return JSON.parse(JSON.stringify(defaultConfig));
18
+ }
19
+ }
20
+
21
+ export type { StatuslineConfig } from "./config-types";
@@ -0,0 +1,103 @@
1
+ import { existsSync } from "node:fs";
2
+
3
+ export interface TokenUsage {
4
+ input_tokens: number;
5
+ output_tokens: number;
6
+ cache_creation_input_tokens?: number;
7
+ cache_read_input_tokens?: number;
8
+ }
9
+
10
+ export interface TranscriptLine {
11
+ message?: { usage?: TokenUsage };
12
+ timestamp?: string;
13
+ isSidechain?: boolean;
14
+ isApiErrorMessage?: boolean;
15
+ }
16
+
17
+ export interface ContextResult {
18
+ tokens: number;
19
+ percentage: number;
20
+ }
21
+
22
+ export async function getContextLength(
23
+ transcriptPath: string,
24
+ ): Promise<number> {
25
+ try {
26
+ const content = await Bun.file(transcriptPath).text();
27
+ const lines = content.trim().split("\n");
28
+
29
+ if (lines.length === 0) return 0;
30
+
31
+ let mostRecentMainChainEntry: TranscriptLine | null = null;
32
+ let mostRecentTimestamp: Date | null = null;
33
+
34
+ for (const line of lines) {
35
+ try {
36
+ const data = JSON.parse(line) as TranscriptLine;
37
+
38
+ if (!data.message?.usage) continue;
39
+ if (data.isSidechain === true) continue;
40
+ if (data.isApiErrorMessage === true) continue;
41
+ if (!data.timestamp) continue;
42
+
43
+ const entryTime = new Date(data.timestamp);
44
+
45
+ if (!mostRecentTimestamp || entryTime > mostRecentTimestamp) {
46
+ mostRecentTimestamp = entryTime;
47
+ mostRecentMainChainEntry = data;
48
+ }
49
+ } catch {}
50
+ }
51
+
52
+ if (!mostRecentMainChainEntry?.message?.usage) {
53
+ return 0;
54
+ }
55
+
56
+ const usage = mostRecentMainChainEntry.message.usage;
57
+
58
+ return (
59
+ (usage.input_tokens || 0) +
60
+ (usage.cache_read_input_tokens ?? 0) +
61
+ (usage.cache_creation_input_tokens ?? 0)
62
+ );
63
+ } catch {
64
+ return 0;
65
+ }
66
+ }
67
+
68
+ export interface ContextDataParams {
69
+ transcriptPath: string;
70
+ maxContextTokens: number;
71
+ autocompactBufferTokens: number;
72
+ useUsableContextOnly?: boolean;
73
+ overheadTokens?: number;
74
+ }
75
+
76
+ export async function getContextData({
77
+ transcriptPath,
78
+ maxContextTokens,
79
+ autocompactBufferTokens,
80
+ useUsableContextOnly = false,
81
+ overheadTokens = 0,
82
+ }: ContextDataParams): Promise<ContextResult> {
83
+ if (!transcriptPath || !existsSync(transcriptPath)) {
84
+ return { tokens: 0, percentage: 0 };
85
+ }
86
+
87
+ const contextLength = await getContextLength(transcriptPath);
88
+ let totalTokens = contextLength + overheadTokens;
89
+
90
+ // If useUsableContextOnly is true, add the autocompact buffer to displayed tokens
91
+ if (useUsableContextOnly) {
92
+ totalTokens += autocompactBufferTokens;
93
+ }
94
+
95
+ // Always calculate percentage based on max context window
96
+ // (matching /context display behavior)
97
+ const percentage = Math.min(100, (totalTokens / maxContextTokens) * 100);
98
+
99
+ return {
100
+ tokens: totalTokens,
101
+ percentage: Math.round(percentage),
102
+ };
103
+ }