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,151 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { colors } from "./lib/formatters";
4
+ import {
5
+ readPayloadLogs,
6
+ type PayloadLogEntry,
7
+ } from "./lib/features/spend/payload-logger";
8
+
9
+ function formatCost(cost: number): string {
10
+ return `$${cost.toFixed(2)}`;
11
+ }
12
+
13
+ function getToday(): string {
14
+ return new Date().toISOString().split("T")[0];
15
+ }
16
+
17
+ function getTodayPayloads(): PayloadLogEntry[] {
18
+ const today = getToday();
19
+ return readPayloadLogs().filter((e) => e.timestamp.startsWith(today));
20
+ }
21
+
22
+ interface SessionAnalysis {
23
+ session_id: string;
24
+ cwd: string;
25
+ first_cost: number;
26
+ last_cost: number;
27
+ real_delta: number;
28
+ entries: number;
29
+ }
30
+
31
+ function analyzePayloads(entries: PayloadLogEntry[]): SessionAnalysis[] {
32
+ const sessions = new Map<string, PayloadLogEntry[]>();
33
+
34
+ for (const entry of entries) {
35
+ const existing = sessions.get(entry.session_id) || [];
36
+ existing.push(entry);
37
+ sessions.set(entry.session_id, existing);
38
+ }
39
+
40
+ const analyses: SessionAnalysis[] = [];
41
+
42
+ for (const [sessionId, sessionEntries] of sessions) {
43
+ const sorted = sessionEntries.sort(
44
+ (a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime(),
45
+ );
46
+
47
+ const first = sorted[0];
48
+ const last = sorted[sorted.length - 1];
49
+
50
+ // Real delta = last cost - first cost (what was ACTUALLY spent during observation)
51
+ const realDelta = last.total_cost_usd - first.total_cost_usd;
52
+
53
+ analyses.push({
54
+ session_id: sessionId,
55
+ cwd: first.cwd,
56
+ first_cost: first.total_cost_usd,
57
+ last_cost: last.total_cost_usd,
58
+ real_delta: realDelta,
59
+ entries: sorted.length,
60
+ });
61
+ }
62
+
63
+ return analyses.sort((a, b) => b.real_delta - a.real_delta);
64
+ }
65
+
66
+ function showTodayUsage(): void {
67
+ const today = getToday();
68
+ const entries = getTodayPayloads();
69
+
70
+ console.log(`\n${colors.lightGray(`Today's Usage (${today})`)}\n`);
71
+
72
+ if (entries.length === 0) {
73
+ console.log(colors.yellow("No payloads logged today."));
74
+ return;
75
+ }
76
+
77
+ const analyses = analyzePayloads(entries);
78
+
79
+ // Group by project
80
+ const byProject = new Map<string, SessionAnalysis[]>();
81
+ for (const a of analyses) {
82
+ const project = a.cwd.split("/").slice(-2).join("/");
83
+ const existing = byProject.get(project) || [];
84
+ existing.push(a);
85
+ byProject.set(project, existing);
86
+ }
87
+
88
+ let totalRealDelta = 0;
89
+
90
+ console.log(colors.gray("Sessions by cost spent today:"));
91
+ console.log(colors.gray("─".repeat(70)));
92
+
93
+ for (const [project, sessions] of [...byProject.entries()].sort(
94
+ (a, b) =>
95
+ b[1].reduce((s, x) => s + x.real_delta, 0) -
96
+ a[1].reduce((s, x) => s + x.real_delta, 0),
97
+ )) {
98
+ const projectTotal = sessions.reduce((s, x) => s + x.real_delta, 0);
99
+ totalRealDelta += projectTotal;
100
+
101
+ console.log(`\n${colors.lightGray(project)} ${colors.gray(`(${formatCost(projectTotal)})`)}`);
102
+
103
+ for (const s of sessions) {
104
+ const startInfo = s.first_cost > 0 ? colors.gray(` (started@${formatCost(s.first_cost)})`) : "";
105
+
106
+ console.log(
107
+ ` ${s.session_id.slice(0, 8)} | ${formatCost(s.real_delta).padStart(7)} | ${formatCost(s.first_cost)} → ${formatCost(s.last_cost)} | ${s.entries} events${startInfo}`,
108
+ );
109
+ }
110
+ }
111
+
112
+ console.log(`\n${colors.gray("─".repeat(70))}`);
113
+ console.log(
114
+ `${colors.lightGray("Total spent today:")} ${colors.green(formatCost(totalRealDelta))}`,
115
+ );
116
+ console.log(`${colors.gray(`Sessions: ${analyses.length} | Events: ${entries.length}`)}`);
117
+ }
118
+
119
+ function showHelp(): void {
120
+ console.log(`
121
+ ${colors.lightGray("Daily Usage Analyzer")}
122
+
123
+ ${colors.gray("Usage:")}
124
+ bun run statusline:usage
125
+
126
+ ${colors.gray("Shows:")}
127
+ - Today's real usage from payloads
128
+ - Per-session cost (last_cost - first_cost)
129
+ - Grouped by project
130
+ `);
131
+ }
132
+
133
+ async function main(): Promise<void> {
134
+ const command = process.argv[2] || "today";
135
+
136
+ switch (command) {
137
+ case "today":
138
+ case undefined:
139
+ showTodayUsage();
140
+ break;
141
+ case "help":
142
+ case "--help":
143
+ case "-h":
144
+ showHelp();
145
+ break;
146
+ default:
147
+ showTodayUsage();
148
+ }
149
+ }
150
+
151
+ main();
@@ -0,0 +1,515 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import { readFileSync, writeFileSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { defaultConfig, type StatuslineConfig } from "../lib/config";
6
+ import { colors } from "../lib/formatters";
7
+ import {
8
+ cycle,
9
+ type MenuOption,
10
+ PATH_DISPLAY_MODES,
11
+ PROGRESS_BAR_COLORS,
12
+ PROGRESS_BAR_LENGTHS,
13
+ SEPARATORS,
14
+ toggle,
15
+ } from "../lib/menu-factories";
16
+ import { PRESETS } from "../lib/presets";
17
+ import {
18
+ type RawStatuslineData,
19
+ renderStatuslineRaw,
20
+ } from "../lib/render-pure";
21
+
22
+ const CONFIG_FILE_PATH = join(
23
+ import.meta.dir,
24
+ "..",
25
+ "..",
26
+ "statusline.config.json",
27
+ );
28
+
29
+ // ─────────────────────────────────────────────────────────────
30
+ // RAW MOCK DATA
31
+ // ─────────────────────────────────────────────────────────────
32
+
33
+ const MOCK_DATA: RawStatuslineData = {
34
+ git: {
35
+ branch: "main",
36
+ dirty: true,
37
+ staged: { files: 2, added: 45, deleted: 12 },
38
+ unstaged: { files: 3, added: 23, deleted: 8 },
39
+ },
40
+ path: "/Users/dev/.claude/project",
41
+ modelName: "Sonnet 4.5",
42
+ cost: 0.24,
43
+ durationMs: 720000,
44
+ contextTokens: 75000,
45
+ contextPercentage: 38,
46
+ usageLimits: {
47
+ five_hour: {
48
+ utilization: 29,
49
+ resets_at: new Date(Date.now() + 3 * 60 * 60 * 1000).toISOString(),
50
+ },
51
+ seven_day: {
52
+ utilization: 45,
53
+ resets_at: new Date(Date.now() + 5 * 24 * 60 * 60 * 1000).toISOString(),
54
+ },
55
+ },
56
+ periodCost: 36,
57
+ todayCost: 12.5,
58
+ };
59
+
60
+ // ─────────────────────────────────────────────────────────────
61
+ // HELPER: Progress bar style cycle (includes "None")
62
+ // ─────────────────────────────────────────────────────────────
63
+
64
+ const PROGRESS_STYLES = ["None", "Braille", "Rectangle", "Filled"] as const;
65
+
66
+ function progressStyleCycle(
67
+ basePath: string,
68
+ parentHidden: (c: StatuslineConfig) => boolean,
69
+ ): MenuOption {
70
+ return {
71
+ path: `${basePath}.progressBar.style`,
72
+ label: "Progress bar",
73
+ type: "cycle",
74
+ choices: [...PROGRESS_STYLES],
75
+ getValue: (c) => {
76
+ const bar = getNestedValue(c, `${basePath}.progressBar`) as {
77
+ enabled: boolean;
78
+ style: string;
79
+ };
80
+ if (!bar.enabled) return "None";
81
+ return bar.style.charAt(0).toUpperCase() + bar.style.slice(1);
82
+ },
83
+ cycle: (c, dir) => {
84
+ const bar = getNestedValue(c, `${basePath}.progressBar`) as {
85
+ enabled: boolean;
86
+ style: string;
87
+ };
88
+ const current = bar.enabled
89
+ ? bar.style.charAt(0).toUpperCase() + bar.style.slice(1)
90
+ : "None";
91
+ const idx = PROGRESS_STYLES.indexOf(
92
+ current as (typeof PROGRESS_STYLES)[number],
93
+ );
94
+ const next =
95
+ PROGRESS_STYLES[
96
+ (idx + dir + PROGRESS_STYLES.length) % PROGRESS_STYLES.length
97
+ ];
98
+ if (next === "None") {
99
+ setNestedValue(c, `${basePath}.progressBar.enabled`, false);
100
+ } else {
101
+ setNestedValue(c, `${basePath}.progressBar.enabled`, true);
102
+ setNestedValue(c, `${basePath}.progressBar.style`, next.toLowerCase());
103
+ }
104
+ },
105
+ hidden: parentHidden,
106
+ };
107
+ }
108
+
109
+ function getNestedValue(obj: unknown, path: string): unknown {
110
+ return path.split(".").reduce((current, key) => {
111
+ if (current && typeof current === "object" && key in current) {
112
+ return (current as Record<string, unknown>)[key];
113
+ }
114
+ return undefined;
115
+ }, obj);
116
+ }
117
+
118
+ function setNestedValue(obj: unknown, path: string, value: unknown): void {
119
+ const keys = path.split(".");
120
+ const lastKey = keys.pop();
121
+ if (!lastKey) return;
122
+ let current = obj;
123
+ for (const key of keys) {
124
+ if (current && typeof current === "object" && key in current) {
125
+ current = (current as Record<string, unknown>)[key];
126
+ } else {
127
+ return;
128
+ }
129
+ }
130
+ if (current && typeof current === "object") {
131
+ (current as Record<string, unknown>)[lastKey] = value;
132
+ }
133
+ }
134
+
135
+ // ─────────────────────────────────────────────────────────────
136
+ // MENU STRUCTURE
137
+ // ─────────────────────────────────────────────────────────────
138
+
139
+ interface Tab {
140
+ id: string;
141
+ label: string;
142
+ options: MenuOption[];
143
+ }
144
+
145
+ const tabs: Tab[] = [
146
+ {
147
+ id: "presets",
148
+ label: "PRESETS",
149
+ options: PRESETS.map((preset, index) => ({
150
+ path: `preset.${index}`,
151
+ label: preset.name,
152
+ description: preset.description,
153
+ type: "boolean" as const,
154
+ getValue: () => false,
155
+ toggle: () => {},
156
+ isPreset: true,
157
+ presetIndex: index,
158
+ })),
159
+ },
160
+ {
161
+ id: "session",
162
+ label: "SESSION",
163
+ options: [
164
+ toggle("session.cost.enabled", "Cost display"),
165
+ toggle("session.duration.enabled", "Duration"),
166
+ toggle("session.tokens.enabled", "Token count"),
167
+ toggle("session.tokens.showMax", " Show max", {
168
+ hidden: (c) => !c.session.tokens.enabled,
169
+ }),
170
+ toggle("session.tokens.showDecimals", " Decimals", {
171
+ hidden: (c) => !c.session.tokens.enabled,
172
+ }),
173
+ toggle("session.percentage.enabled", "Context %"),
174
+ toggle("session.percentage.showValue", " Show value", {
175
+ hidden: (c) => !c.session.percentage.enabled,
176
+ }),
177
+ progressStyleCycle(
178
+ "session.percentage",
179
+ (c) => !c.session.percentage.enabled,
180
+ ),
181
+ cycle(
182
+ "session.percentage.progressBar.length",
183
+ " Length",
184
+ PROGRESS_BAR_LENGTHS,
185
+ {
186
+ hidden: (c) =>
187
+ !c.session.percentage.enabled ||
188
+ !c.session.percentage.progressBar.enabled,
189
+ },
190
+ ),
191
+ cycle(
192
+ "session.percentage.progressBar.color",
193
+ " Color",
194
+ PROGRESS_BAR_COLORS,
195
+ {
196
+ hidden: (c) =>
197
+ !c.session.percentage.enabled ||
198
+ !c.session.percentage.progressBar.enabled,
199
+ },
200
+ ),
201
+ toggle("context.useUsableContextOnly", "45k buffer"),
202
+ ],
203
+ },
204
+ {
205
+ id: "limits",
206
+ label: "5-HOUR",
207
+ options: [
208
+ {
209
+ path: "limits.enabled",
210
+ label: "5-hour limit",
211
+ type: "cycle" as const,
212
+ choices: ["Enabled", "Disabled"],
213
+ getValue: (c) => (c.limits.enabled ? "Enabled" : "Disabled"),
214
+ cycle: (c) => {
215
+ c.limits.enabled = !c.limits.enabled;
216
+ },
217
+ },
218
+ toggle("limits.showTimeLeft", " Time remaining", {
219
+ hidden: (c) => !c.limits.enabled,
220
+ }),
221
+ toggle("limits.showPacingDelta", " Pacing delta", {
222
+ hidden: (c) => !c.limits.enabled,
223
+ }),
224
+ toggle("limits.cost.enabled", " Period cost", {
225
+ hidden: (c) => !c.limits.enabled,
226
+ }),
227
+ toggle("limits.percentage.showValue", " Show % value", {
228
+ hidden: (c) => !c.limits.enabled,
229
+ }),
230
+ progressStyleCycle("limits.percentage", (c) => !c.limits.enabled),
231
+ cycle(
232
+ "limits.percentage.progressBar.length",
233
+ " Length",
234
+ PROGRESS_BAR_LENGTHS,
235
+ {
236
+ hidden: (c) =>
237
+ !c.limits.enabled || !c.limits.percentage.progressBar.enabled,
238
+ },
239
+ ),
240
+ cycle(
241
+ "limits.percentage.progressBar.color",
242
+ " Color",
243
+ PROGRESS_BAR_COLORS,
244
+ {
245
+ hidden: (c) =>
246
+ !c.limits.enabled || !c.limits.percentage.progressBar.enabled,
247
+ },
248
+ ),
249
+ ],
250
+ },
251
+ {
252
+ id: "weekly",
253
+ label: "WEEKLY",
254
+ options: [
255
+ {
256
+ path: "weeklyUsage.enabled",
257
+ label: "Weekly limit",
258
+ type: "cycle" as const,
259
+ choices: ["Always", "At 90%", "Never"],
260
+ getValue: (c) => {
261
+ if (c.weeklyUsage.enabled === true) return "Always";
262
+ if (c.weeklyUsage.enabled === "90%") return "At 90%";
263
+ return "Never";
264
+ },
265
+ cycle: (c, dir) => {
266
+ const modes = [true, "90%", false] as const;
267
+ const idx =
268
+ c.weeklyUsage.enabled === true
269
+ ? 0
270
+ : c.weeklyUsage.enabled === "90%"
271
+ ? 1
272
+ : 2;
273
+ c.weeklyUsage.enabled = modes[(idx + dir + 3) % 3];
274
+ },
275
+ },
276
+ toggle("weeklyUsage.showTimeLeft", " Time remaining", {
277
+ hidden: (c) => c.weeklyUsage.enabled === false,
278
+ }),
279
+ toggle("weeklyUsage.showPacingDelta", " Pacing delta", {
280
+ hidden: (c) => c.weeklyUsage.enabled === false,
281
+ }),
282
+ toggle("weeklyUsage.cost.enabled", " Cost", {
283
+ hidden: (c) => c.weeklyUsage.enabled === false,
284
+ }),
285
+ toggle("weeklyUsage.percentage.showValue", " Show % value", {
286
+ hidden: (c) => c.weeklyUsage.enabled === false,
287
+ }),
288
+ progressStyleCycle(
289
+ "weeklyUsage.percentage",
290
+ (c) => c.weeklyUsage.enabled === false,
291
+ ),
292
+ cycle(
293
+ "weeklyUsage.percentage.progressBar.length",
294
+ " Length",
295
+ PROGRESS_BAR_LENGTHS,
296
+ {
297
+ hidden: (c) =>
298
+ c.weeklyUsage.enabled === false ||
299
+ !c.weeklyUsage.percentage.progressBar.enabled,
300
+ },
301
+ ),
302
+ cycle(
303
+ "weeklyUsage.percentage.progressBar.color",
304
+ " Color",
305
+ PROGRESS_BAR_COLORS,
306
+ {
307
+ hidden: (c) =>
308
+ c.weeklyUsage.enabled === false ||
309
+ !c.weeklyUsage.percentage.progressBar.enabled,
310
+ },
311
+ ),
312
+ ],
313
+ },
314
+ {
315
+ id: "git",
316
+ label: "GIT",
317
+ options: [
318
+ {
319
+ path: "git.enabled",
320
+ label: "Git info",
321
+ type: "cycle" as const,
322
+ choices: ["Enabled", "Disabled"],
323
+ getValue: (c) => (c.git.enabled ? "Enabled" : "Disabled"),
324
+ cycle: (c) => {
325
+ c.git.enabled = !c.git.enabled;
326
+ },
327
+ },
328
+ toggle("git.showBranch", " Branch name", {
329
+ hidden: (c) => !c.git.enabled,
330
+ }),
331
+ toggle("git.showDirtyIndicator", " Dirty indicator (*)", {
332
+ hidden: (c) => !c.git.enabled,
333
+ }),
334
+ toggle("git.showChanges", " Line changes (+/-)", {
335
+ hidden: (c) => !c.git.enabled,
336
+ }),
337
+ toggle("git.showStaged", " Staged files", {
338
+ hidden: (c) => !c.git.enabled,
339
+ }),
340
+ toggle("git.showUnstaged", " Unstaged files", {
341
+ hidden: (c) => !c.git.enabled,
342
+ }),
343
+ ],
344
+ },
345
+ {
346
+ id: "global",
347
+ label: "GLOBAL",
348
+ options: [
349
+ cycle("separator", "Separator", SEPARATORS),
350
+ cycle("pathDisplayMode", "Path display", PATH_DISPLAY_MODES),
351
+ toggle("showSonnetModel", "Show Sonnet model"),
352
+ toggle("oneLine", "Single line mode"),
353
+ toggle("dailySpend.cost.enabled", "Daily spend"),
354
+ ],
355
+ },
356
+ ];
357
+
358
+ // ─────────────────────────────────────────────────────────────
359
+ // CONFIG I/O
360
+ // ─────────────────────────────────────────────────────────────
361
+
362
+ function loadConfig(): StatuslineConfig {
363
+ try {
364
+ return JSON.parse(readFileSync(CONFIG_FILE_PATH, "utf-8"));
365
+ } catch {
366
+ return JSON.parse(JSON.stringify(defaultConfig));
367
+ }
368
+ }
369
+
370
+ function saveConfig(config: StatuslineConfig): void {
371
+ writeFileSync(CONFIG_FILE_PATH, JSON.stringify(config, null, 2), "utf-8");
372
+ }
373
+
374
+ // ─────────────────────────────────────────────────────────────
375
+ // RENDERING
376
+ // ─────────────────────────────────────────────────────────────
377
+
378
+ function renderPreview(config: StatuslineConfig): string {
379
+ return renderStatuslineRaw(MOCK_DATA, config);
380
+ }
381
+
382
+ function renderTabs(activeIdx: number): string {
383
+ return tabs
384
+ .map((t, i) =>
385
+ i === activeIdx
386
+ ? colors.yellow(`[${t.label}]`)
387
+ : colors.gray(` ${t.label} `),
388
+ )
389
+ .join("");
390
+ }
391
+
392
+ function renderOptions(
393
+ config: StatuslineConfig,
394
+ tab: Tab,
395
+ selIdx: number,
396
+ ): string {
397
+ const visible = tab.options.filter((o) => !o.hidden || !o.hidden(config));
398
+ return visible
399
+ .map((opt, i) => {
400
+ const sel = i === selIdx;
401
+ const val = opt.getValue?.(config);
402
+ const isPreset = "isPreset" in opt;
403
+
404
+ let display: string;
405
+ if (isPreset) {
406
+ const desc =
407
+ "description" in opt ? colors.gray(` - ${opt.description}`) : "";
408
+ display = `${colors.cyan("◈")} ${opt.label}${desc}`;
409
+ } else if (opt.type === "boolean") {
410
+ display = `${val ? colors.green("●") : colors.gray("○")} ${opt.label}`;
411
+ } else {
412
+ display = `${opt.label}: ${colors.yellow(String(val))}`;
413
+ }
414
+
415
+ const cursor = sel ? colors.yellow("›") : " ";
416
+ return `${cursor} ${sel ? colors.white(display) : colors.lightGray(display)}`;
417
+ })
418
+ .join("\n");
419
+ }
420
+
421
+ function render(
422
+ config: StatuslineConfig,
423
+ tabIdx: number,
424
+ selIdx: number,
425
+ ): string {
426
+ const tab = tabs[tabIdx];
427
+ const preview = renderPreview(config);
428
+ const previewLines = preview.split("\n");
429
+
430
+ return [
431
+ colors.purple("━━━ PREVIEW ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"),
432
+ ...previewLines,
433
+ "",
434
+ renderTabs(tabIdx),
435
+ colors.gray("─".repeat(52)),
436
+ renderOptions(config, tab, selIdx),
437
+ "",
438
+ colors.gray("←→ tabs ↑↓ select Enter toggle s save r reset q quit"),
439
+ ].join("\n");
440
+ }
441
+
442
+ // ─────────────────────────────────────────────────────────────
443
+ // MAIN LOOP
444
+ // ─────────────────────────────────────────────────────────────
445
+
446
+ async function main() {
447
+ let config = loadConfig();
448
+ let tabIdx = 0;
449
+ let selIdx = 0;
450
+
451
+ process.stdout.write("\x1b[?25l");
452
+ process.stdin.setRawMode(true);
453
+ process.stdin.resume();
454
+
455
+ const draw = () => {
456
+ const visible = tabs[tabIdx].options.filter(
457
+ (o) => !o.hidden || !o.hidden(config),
458
+ );
459
+ if (selIdx >= visible.length) selIdx = Math.max(0, visible.length - 1);
460
+ process.stdout.write("\x1b[2J\x1b[H" + render(config, tabIdx, selIdx));
461
+ };
462
+
463
+ draw();
464
+
465
+ for await (const chunk of process.stdin) {
466
+ const key = chunk.toString();
467
+
468
+ if (key === "\u001b[D" || key === "h") {
469
+ tabIdx = (tabIdx - 1 + tabs.length) % tabs.length;
470
+ selIdx = 0;
471
+ } else if (key === "\u001b[C" || key === "l") {
472
+ tabIdx = (tabIdx + 1) % tabs.length;
473
+ selIdx = 0;
474
+ } else if (key === "\u001b[A" || key === "k") {
475
+ if (selIdx > 0) selIdx--;
476
+ } else if (key === "\u001b[B" || key === "j") {
477
+ const visible = tabs[tabIdx].options.filter(
478
+ (o) => !o.hidden || !o.hidden(config),
479
+ );
480
+ if (selIdx < visible.length - 1) selIdx++;
481
+ } else if (key === "\r" || key === " ") {
482
+ const visible = tabs[tabIdx].options.filter(
483
+ (o) => !o.hidden || !o.hidden(config),
484
+ );
485
+ const opt = visible[selIdx];
486
+ if ("isPreset" in opt && "presetIndex" in opt) {
487
+ config = JSON.parse(
488
+ JSON.stringify(PRESETS[opt.presetIndex as number].config),
489
+ );
490
+ } else if (opt.type === "cycle" && opt.cycle) {
491
+ opt.cycle(config, 1);
492
+ } else if (opt.toggle) {
493
+ opt.toggle(config);
494
+ }
495
+ } else if (key.toLowerCase() === "r") {
496
+ config = JSON.parse(JSON.stringify(defaultConfig));
497
+ } else if (key.toLowerCase() === "s") {
498
+ saveConfig(config);
499
+ process.stdout.write("\x1b[2J\x1b[H");
500
+ console.log(colors.green("✓ Config saved!"));
501
+ await Bun.sleep(400);
502
+ } else if (key.toLowerCase() === "q" || key === "\u0003") {
503
+ saveConfig(config);
504
+ process.stdin.setRawMode(false);
505
+ process.stdout.write("\x1b[?25h");
506
+ console.clear();
507
+ console.log(colors.green("✓ Config saved!\n"));
508
+ process.exit(0);
509
+ }
510
+
511
+ draw();
512
+ }
513
+ }
514
+
515
+ main();