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.
- package/LICENSE +21 -0
- package/README.md +186 -0
- package/dist/cli.js +6870 -0
- package/package.json +48 -0
- package/src/config/claude-code-config/.claude/commands/setup-tmux.md +0 -0
- package/src/config/claude-code-config/CHANGELOG.md +261 -0
- package/src/config/claude-code-config/README.md +1 -0
- package/src/config/claude-code-config/agents/action.md +36 -0
- package/src/config/claude-code-config/agents/clean-code-runner.md +61 -0
- package/src/config/claude-code-config/agents/code-reviewer.md +172 -0
- package/src/config/claude-code-config/agents/code-simplifier.md +49 -0
- package/src/config/claude-code-config/agents/explore-codebase.md +65 -0
- package/src/config/claude-code-config/agents/explore-docs.md +65 -0
- package/src/config/claude-code-config/agents/explore-fast.md +22 -0
- package/src/config/claude-code-config/agents/implementer.md +181 -0
- package/src/config/claude-code-config/agents/snipper.md +36 -0
- package/src/config/claude-code-config/agents/websearch.md +42 -0
- package/src/config/claude-code-config/commands/prompts/create-vitejs-app.md +272 -0
- package/src/config/claude-code-config/commands/prompts/nextjs-add-prisma-db.md +136 -0
- package/src/config/claude-code-config/commands/prompts/nextjs-setup-better-auth.md +173 -0
- package/src/config/claude-code-config/commands/prompts/nextjs-setup-project.md +200 -0
- package/src/config/claude-code-config/commands/prompts/prompt.md +55 -0
- package/src/config/claude-code-config/commands/prompts/saas-challenge-idea.md +135 -0
- package/src/config/claude-code-config/commands/prompts/saas-create-architecture.md +242 -0
- package/src/config/claude-code-config/commands/prompts/saas-create-headline.md +132 -0
- package/src/config/claude-code-config/commands/prompts/saas-create-landing-copywritting.md +267 -0
- package/src/config/claude-code-config/commands/prompts/saas-create-legals-docs.md +176 -0
- package/src/config/claude-code-config/commands/prompts/saas-create-logos.md +240 -0
- package/src/config/claude-code-config/commands/prompts/saas-create-prd.md +195 -0
- package/src/config/claude-code-config/commands/prompts/saas-create-tasks.md +240 -0
- package/src/config/claude-code-config/commands/prompts/saas-define-pricing.md +293 -0
- package/src/config/claude-code-config/commands/prompts/saas-find-domain-name.md +190 -0
- package/src/config/claude-code-config/commands/prompts/saas-implement-landing-page.md +257 -0
- package/src/config/claude-code-config/commands/prompts/setup-tmux.md +160 -0
- package/src/config/claude-code-config/commands/prompts/tools.md +148 -0
- package/src/config/claude-code-config/hooks/hook-post-file.ts +162 -0
- package/src/config/claude-code-config/scripts/.claude/skills/fix-on-my-computer/SKILL.md +81 -0
- package/src/config/claude-code-config/scripts/CLAUDE.md +50 -0
- package/src/config/claude-code-config/scripts/auto-rename-session/CLAUDE.md +59 -0
- package/src/config/claude-code-config/scripts/auto-rename-session/__tests__/shared.test.ts +185 -0
- package/src/config/claude-code-config/scripts/auto-rename-session/__tests__/title-generation.test.ts +44 -0
- package/src/config/claude-code-config/scripts/auto-rename-session/fixtures/sample-transcript.jsonl +3 -0
- package/src/config/claude-code-config/scripts/auto-rename-session/fixtures/transcript-short-message.jsonl +2 -0
- package/src/config/claude-code-config/scripts/auto-rename-session/fixtures/transcript-with-title.jsonl +3 -0
- package/src/config/claude-code-config/scripts/auto-rename-session/src/index.ts +113 -0
- package/src/config/claude-code-config/scripts/auto-rename-session/src/rename-all.ts +148 -0
- package/src/config/claude-code-config/scripts/auto-rename-session/src/shared.ts +157 -0
- package/src/config/claude-code-config/scripts/auto-rename-session/src/worker.ts +58 -0
- package/src/config/claude-code-config/scripts/biome.json +37 -0
- package/src/config/claude-code-config/scripts/claude-code-ai/CLAUDE.md +84 -0
- package/src/config/claude-code-config/scripts/claude-code-ai/__tests__/claude.test.ts +19 -0
- package/src/config/claude-code-config/scripts/claude-code-ai/__tests__/paths.test.ts +68 -0
- package/src/config/claude-code-config/scripts/claude-code-ai/claude.ts +56 -0
- package/src/config/claude-code-config/scripts/claude-code-ai/cli.ts +46 -0
- package/src/config/claude-code-config/scripts/claude-code-ai/helper/credentials.ts +76 -0
- package/src/config/claude-code-config/scripts/claude-code-ai/helper/index.ts +9 -0
- package/src/config/claude-code-config/scripts/claude-code-ai/helper/paths.ts +51 -0
- package/src/config/claude-code-config/scripts/command-validator/CLAUDE.md +112 -0
- package/src/config/claude-code-config/scripts/command-validator/README.md +147 -0
- package/src/config/claude-code-config/scripts/command-validator/src/__tests__/validator.test.ts +99 -0
- package/src/config/claude-code-config/scripts/command-validator/src/cli.ts +121 -0
- package/src/config/claude-code-config/scripts/command-validator/src/lib/security-rules.ts +174 -0
- package/src/config/claude-code-config/scripts/command-validator/src/lib/types.ts +34 -0
- package/src/config/claude-code-config/scripts/command-validator/src/lib/validator.ts +90 -0
- package/src/config/claude-code-config/scripts/package.json +43 -0
- package/src/config/claude-code-config/scripts/statusline/CLAUDE.md +205 -0
- package/src/config/claude-code-config/scripts/statusline/README.md +193 -0
- package/src/config/claude-code-config/scripts/statusline/__tests__/context.test.ts +229 -0
- package/src/config/claude-code-config/scripts/statusline/__tests__/formatters.test.ts +108 -0
- package/src/config/claude-code-config/scripts/statusline/__tests__/statusline.test.ts +309 -0
- package/src/config/claude-code-config/scripts/statusline/data/.gitkeep +0 -0
- package/src/config/claude-code-config/scripts/statusline/defaults.json +82 -0
- package/src/config/claude-code-config/scripts/statusline/docs/ARCHITECTURE.md +166 -0
- package/src/config/claude-code-config/scripts/statusline/fixtures/mock-transcript.jsonl +4 -0
- package/src/config/claude-code-config/scripts/statusline/fixtures/test-input.json +35 -0
- package/src/config/claude-code-config/scripts/statusline/src/analyze-daily-usage.ts +151 -0
- package/src/config/claude-code-config/scripts/statusline/src/commands/interactive-config.ts +515 -0
- package/src/config/claude-code-config/scripts/statusline/src/debug-payloads.ts +195 -0
- package/src/config/claude-code-config/scripts/statusline/src/index.ts +224 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/config-types.ts +110 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/config.ts +21 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/context.ts +103 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/features/limits/commands/weekly-analysis.ts +108 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/features/limits/index.ts +111 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/features/limits/types.ts +15 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/features/spend/commands/migrate-to-sqlite.ts +136 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/features/spend/commands/spend-day.ts +79 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/features/spend/commands/spend-month.ts +66 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/features/spend/commands/spend-project.ts +85 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/features/spend/database.ts +395 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/features/spend/index.ts +178 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/features/spend/payload-logger.ts +161 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/features/spend/types.ts +37 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/formatters.ts +426 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/git.ts +100 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/menu-factories.ts +224 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/presets.ts +177 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/render-pure.ts +516 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/types.ts +36 -0
- package/src/config/claude-code-config/scripts/statusline/src/lib/utils.ts +15 -0
- package/src/config/claude-code-config/scripts/statusline/src/stats.ts +119 -0
- package/src/config/claude-code-config/scripts/statusline/src/tests/spend-v2.test.ts +377 -0
- package/src/config/claude-code-config/scripts/statusline/src/tools/fixed-cost-calc.ts +317 -0
- package/src/config/claude-code-config/scripts/statusline/statusline.config.free.json +79 -0
- package/src/config/claude-code-config/scripts/statusline/statusline.config.json +100 -0
- package/src/config/claude-code-config/scripts/statusline/test-with-fixtures.ts +37 -0
- package/src/config/claude-code-config/scripts/statusline/test.ts +20 -0
- package/src/config/claude-code-config/scripts/statusline/tsconfig.json +27 -0
- package/src/config/claude-code-config/scripts/tsconfig.json +27 -0
- package/src/config/claude-code-config/settings.json +92 -0
- package/src/config/claude-code-config/skills/aibuilder-create-saas/SKILL.md +176 -0
- package/src/config/claude-code-config/skills/aibuilder-create-saas/references/architecture-template.md +436 -0
- package/src/config/claude-code-config/skills/aibuilder-create-saas/references/challenge-framework.md +289 -0
- package/src/config/claude-code-config/skills/aibuilder-create-saas/references/discovery-framework.md +338 -0
- package/src/config/claude-code-config/skills/aibuilder-create-saas/references/prd-template.md +452 -0
- package/src/config/claude-code-config/skills/aibuilder-create-saas/references/task-template.md +263 -0
- package/src/config/claude-code-config/skills/aibuilder-create-saas/references/tools.md +132 -0
- package/src/config/claude-code-config/skills/aibuilder-create-saas/scripts/rename-project.sh +42 -0
- package/src/config/claude-code-config/skills/aibuilder-create-saas/scripts/setup.sh +104 -0
- package/src/config/claude-code-config/skills/aibuilder-create-saas/steps/step-00-init.md +174 -0
- package/src/config/claude-code-config/skills/aibuilder-create-saas/steps/step-01-discovery.md +342 -0
- package/src/config/claude-code-config/skills/aibuilder-create-saas/steps/step-02-brainstorm.md +230 -0
- package/src/config/claude-code-config/skills/aibuilder-create-saas/steps/step-03-validate.md +372 -0
- package/src/config/claude-code-config/skills/aibuilder-create-saas/steps/step-04-prd.md +364 -0
- package/src/config/claude-code-config/skills/aibuilder-create-saas/steps/step-05-architecture.md +904 -0
- package/src/config/claude-code-config/skills/aibuilder-create-saas/steps/step-06-tasks.md +446 -0
- package/src/config/claude-code-config/skills/explore/SKILL.md +119 -0
- package/src/config/claude-code-config/skills/frontend-design/LICENSE.txt +177 -0
- package/src/config/claude-code-config/skills/frontend-design/SKILL.md +42 -0
- package/src/config/claude-code-config/skills/git-commit/SKILL.md +42 -0
- package/src/config/claude-code-config/skills/git-create-pr/SKILL.md +53 -0
- package/src/config/claude-code-config/skills/git-fix-pr-comments/SKILL.md +51 -0
- package/src/config/claude-code-config/skills/git-merge/SKILL.md +68 -0
- package/src/config/claude-code-config/skills/marketing-copywriting/SKILL.md +72 -0
- package/src/config/claude-code-config/skills/meta-claude-memory/SKILL.md +694 -0
- package/src/config/claude-code-config/skills/meta-claude-memory/references/comprehensive-example.md +175 -0
- package/src/config/claude-code-config/skills/meta-claude-memory/references/project-patterns.md +334 -0
- package/src/config/claude-code-config/skills/meta-claude-memory/references/prompting-techniques.md +411 -0
- package/src/config/claude-code-config/skills/meta-claude-memory/references/rules-directory-guide.md +298 -0
- package/src/config/claude-code-config/skills/meta-claude-memory/references/section-templates.md +347 -0
- package/src/config/claude-code-config/skills/meta-hooks-creator/SKILL.md +357 -0
- package/src/config/claude-code-config/skills/meta-hooks-creator/references/command-vs-prompt.md +287 -0
- package/src/config/claude-code-config/skills/meta-hooks-creator/references/examples.md +689 -0
- package/src/config/claude-code-config/skills/meta-hooks-creator/references/hook-types.md +495 -0
- package/src/config/claude-code-config/skills/meta-hooks-creator/references/input-output-schemas.md +503 -0
- package/src/config/claude-code-config/skills/meta-hooks-creator/references/matchers.md +517 -0
- package/src/config/claude-code-config/skills/meta-hooks-creator/references/troubleshooting.md +653 -0
- package/src/config/claude-code-config/skills/meta-prompt-creator/SKILL.md +285 -0
- package/src/config/claude-code-config/skills/meta-prompt-creator/references/anthropic-best-practices.md +126 -0
- package/src/config/claude-code-config/skills/meta-prompt-creator/references/anti-patterns.md +57 -0
- package/src/config/claude-code-config/skills/meta-prompt-creator/references/clarity-principles.md +54 -0
- package/src/config/claude-code-config/skills/meta-prompt-creator/references/context-management.md +389 -0
- package/src/config/claude-code-config/skills/meta-prompt-creator/references/few-shot-patterns.md +47 -0
- package/src/config/claude-code-config/skills/meta-prompt-creator/references/openai-best-practices.md +50 -0
- package/src/config/claude-code-config/skills/meta-prompt-creator/references/prompt-templates.md +110 -0
- package/src/config/claude-code-config/skills/meta-prompt-creator/references/reasoning-techniques.md +52 -0
- package/src/config/claude-code-config/skills/meta-prompt-creator/references/system-prompt-patterns.md +48 -0
- package/src/config/claude-code-config/skills/meta-prompt-creator/references/xml-structure.md +36 -0
- package/src/config/claude-code-config/skills/meta-skill-creator/LICENSE.txt +202 -0
- package/src/config/claude-code-config/skills/meta-skill-creator/SKILL.md +421 -0
- package/src/config/claude-code-config/skills/meta-skill-creator/package.json +5 -0
- package/src/config/claude-code-config/skills/meta-skill-creator/references/output-patterns.md +82 -0
- package/src/config/claude-code-config/skills/meta-skill-creator/references/progressive-disclosure-patterns.md +374 -0
- package/src/config/claude-code-config/skills/meta-skill-creator/references/prompting-integration.md +363 -0
- package/src/config/claude-code-config/skills/meta-skill-creator/references/real-world-examples.md +513 -0
- package/src/config/claude-code-config/skills/meta-skill-creator/references/script-patterns.md +385 -0
- package/src/config/claude-code-config/skills/meta-skill-creator/references/workflows.md +28 -0
- package/src/config/claude-code-config/skills/meta-skill-creator/references/xml-tag-guide.md +606 -0
- package/src/config/claude-code-config/skills/meta-skill-creator/scripts/init-skill.ts +214 -0
- package/src/config/claude-code-config/skills/meta-skill-creator/scripts/package-skill.ts +146 -0
- package/src/config/claude-code-config/skills/meta-skill-creator/scripts/validate.ts +138 -0
- package/src/config/claude-code-config/skills/meta-skill-workflow-creator/SKILL.md +390 -0
- package/src/config/claude-code-config/skills/meta-skill-workflow-creator/references/ask-patterns.md +225 -0
- package/src/config/claude-code-config/skills/meta-skill-workflow-creator/references/prompt-engineering.md +377 -0
- package/src/config/claude-code-config/skills/meta-skill-workflow-creator/references/state-management.md +275 -0
- package/src/config/claude-code-config/skills/meta-skill-workflow-creator/references/step-template.md +334 -0
- package/src/config/claude-code-config/skills/meta-skill-workflow-creator/references/workflow-patterns.md +300 -0
- package/src/config/claude-code-config/skills/meta-subagent-creator/SKILL.md +451 -0
- package/src/config/claude-code-config/skills/meta-subagent-creator/references/context-management.md +567 -0
- package/src/config/claude-code-config/skills/meta-subagent-creator/references/debugging-agents.md +714 -0
- package/src/config/claude-code-config/skills/meta-subagent-creator/references/error-handling-and-recovery.md +502 -0
- package/src/config/claude-code-config/skills/meta-subagent-creator/references/evaluation-and-testing.md +374 -0
- package/src/config/claude-code-config/skills/meta-subagent-creator/references/orchestration-patterns.md +591 -0
- package/src/config/claude-code-config/skills/meta-subagent-creator/references/subagents.md +599 -0
- package/src/config/claude-code-config/skills/meta-subagent-creator/references/writing-subagent-prompts.md +513 -0
- package/src/config/claude-code-config/skills/ralph-loop/SKILL.md +117 -0
- package/src/config/claude-code-config/skills/ralph-loop/scripts/setup.sh +278 -0
- package/src/config/claude-code-config/skills/ralph-loop/steps/step-00-init.md +215 -0
- package/src/config/claude-code-config/skills/ralph-loop/steps/step-01-interactive-prd.md +366 -0
- package/src/config/claude-code-config/skills/ralph-loop/steps/step-02-create-stories.md +273 -0
- package/src/config/claude-code-config/skills/ralph-loop/steps/step-03-finish.md +245 -0
- package/src/config/claude-code-config/skills/ralph-tasks/SKILL.md +88 -0
- package/src/config/claude-code-config/skills/ralph-tasks/scripts/add-task.sh +36 -0
- package/src/config/claude-code-config/skills/ralph-tasks/scripts/list-tasks.sh +66 -0
- package/src/config/claude-code-config/skills/ralph-tasks/scripts/remove-task.sh +47 -0
- package/src/config/claude-code-config/skills/ralph-tasks/scripts/setup.sh +201 -0
- package/src/config/claude-code-config/skills/ralph-tasks/steps/action-add-search.md +131 -0
- package/src/config/claude-code-config/skills/ralph-tasks/steps/action-add.md +46 -0
- package/src/config/claude-code-config/skills/ralph-tasks/steps/action-init.md +123 -0
- package/src/config/claude-code-config/skills/ralph-tasks/steps/action-list.md +58 -0
- package/src/config/claude-code-config/skills/ralph-tasks/steps/action-remove.md +48 -0
- package/src/config/claude-code-config/skills/ralph-tasks/steps/action-setup.md +46 -0
- package/src/config/claude-code-config/skills/ralph-tasks/steps/action-wake-up.md +62 -0
- package/src/config/claude-code-config/skills/utils-fix-errors/SKILL.md +61 -0
- package/src/config/claude-code-config/skills/utils-fix-grammar/SKILL.md +59 -0
- package/src/config/claude-code-config/skills/utils-oneshot/SKILL.md +56 -0
- package/src/config/claude-code-config/skills/utils-refactor/SKILL.md +89 -0
- package/src/config/claude-code-config/skills/utils-save-docs/SKILL.md +74 -0
- package/src/config/claude-code-config/skills/utils-ultrathink/SKILL.md +42 -0
- package/src/config/claude-code-config/skills/workflow-apex/SKILL.md +116 -0
- package/src/config/claude-code-config/skills/workflow-apex/scripts/setup-templates.sh +144 -0
- package/src/config/claude-code-config/skills/workflow-apex/scripts/update-progress.sh +80 -0
- package/src/config/claude-code-config/skills/workflow-apex/steps/step-00-init.md +273 -0
- package/src/config/claude-code-config/skills/workflow-apex/steps/step-00b-branch.md +126 -0
- package/src/config/claude-code-config/skills/workflow-apex/steps/step-00b-economy.md +244 -0
- package/src/config/claude-code-config/skills/workflow-apex/steps/step-00b-interactive.md +165 -0
- package/src/config/claude-code-config/skills/workflow-apex/steps/step-00b-save.md +123 -0
- package/src/config/claude-code-config/skills/workflow-apex/steps/step-01-analyze.md +361 -0
- package/src/config/claude-code-config/skills/workflow-apex/steps/step-02-plan.md +422 -0
- package/src/config/claude-code-config/skills/workflow-apex/steps/step-02b-tasks.md +301 -0
- package/src/config/claude-code-config/skills/workflow-apex/steps/step-03-execute-teams.md +297 -0
- package/src/config/claude-code-config/skills/workflow-apex/steps/step-03-execute.md +239 -0
- package/src/config/claude-code-config/skills/workflow-apex/steps/step-04-validate.md +264 -0
- package/src/config/claude-code-config/skills/workflow-apex/steps/step-05-examine.md +294 -0
- package/src/config/claude-code-config/skills/workflow-apex/steps/step-06-resolve.md +237 -0
- package/src/config/claude-code-config/skills/workflow-apex/steps/step-07-tests.md +250 -0
- package/src/config/claude-code-config/skills/workflow-apex/steps/step-08-run-tests.md +308 -0
- package/src/config/claude-code-config/skills/workflow-apex/steps/step-09-finish.md +193 -0
- package/src/config/claude-code-config/skills/workflow-apex/templates/00-context.md +53 -0
- package/src/config/claude-code-config/skills/workflow-apex/templates/01-analyze.md +10 -0
- package/src/config/claude-code-config/skills/workflow-apex/templates/02-plan.md +10 -0
- package/src/config/claude-code-config/skills/workflow-apex/templates/03-execute.md +10 -0
- package/src/config/claude-code-config/skills/workflow-apex/templates/04-validate.md +10 -0
- package/src/config/claude-code-config/skills/workflow-apex/templates/05-examine.md +10 -0
- package/src/config/claude-code-config/skills/workflow-apex/templates/06-resolve.md +10 -0
- package/src/config/claude-code-config/skills/workflow-apex/templates/07-tests.md +10 -0
- package/src/config/claude-code-config/skills/workflow-apex/templates/08-run-tests.md +10 -0
- package/src/config/claude-code-config/skills/workflow-apex/templates/09-finish.md +10 -0
- package/src/config/claude-code-config/skills/workflow-apex/templates/README.md +195 -0
- package/src/config/claude-code-config/skills/workflow-apex/templates/step-complete.md +7 -0
- package/src/config/claude-code-config/skills/workflow-brainstorm/SKILL.md +127 -0
- package/src/config/claude-code-config/skills/workflow-brainstorm/steps/step-01-explore.md +230 -0
- package/src/config/claude-code-config/skills/workflow-brainstorm/steps/step-02-challenge.md +238 -0
- package/src/config/claude-code-config/skills/workflow-brainstorm/steps/step-03-synthesize.md +337 -0
- package/src/config/claude-code-config/skills/workflow-brainstorm/steps/step-04-action.md +285 -0
- package/src/config/claude-code-config/skills/workflow-ci-fixer/SKILL.md +150 -0
- package/src/config/claude-code-config/skills/workflow-ci-fixer/references/cli-commands.md +122 -0
- package/src/config/claude-code-config/skills/workflow-ci-fixer/references/github-cli.md +243 -0
- package/src/config/claude-code-config/skills/workflow-ci-fixer/references/troubleshooting.md +362 -0
- package/src/config/claude-code-config/skills/workflow-ci-fixer/references/vercel-cli.md +192 -0
- package/src/config/claude-code-config/skills/workflow-ci-fixer/steps/step-00-init.md +157 -0
- package/src/config/claude-code-config/skills/workflow-ci-fixer/steps/step-01-watch-ci.md +192 -0
- package/src/config/claude-code-config/skills/workflow-ci-fixer/steps/step-02-analyze-errors.md +263 -0
- package/src/config/claude-code-config/skills/workflow-ci-fixer/steps/step-03-fix-locally.md +312 -0
- package/src/config/claude-code-config/skills/workflow-ci-fixer/steps/step-04-commit-push.md +206 -0
- package/src/config/claude-code-config/skills/workflow-ci-fixer/steps/step-05-cleanup.md +196 -0
- package/src/config/claude-code-config/skills/workflow-clean-code/SKILL.md +129 -0
- package/src/config/claude-code-config/skills/workflow-clean-code/references/general-clean-code.md +347 -0
- package/src/config/claude-code-config/skills/workflow-clean-code/references/nextjs-clean-code.md +458 -0
- package/src/config/claude-code-config/skills/workflow-clean-code/references/react-clean-code.md +406 -0
- package/src/config/claude-code-config/skills/workflow-clean-code/references/tanstack-query-best-practices.md +516 -0
- package/src/config/claude-code-config/skills/workflow-clean-code/references/zustand-best-practices.md +491 -0
- package/src/config/claude-code-config/skills/workflow-clean-code/steps/step-01-scan.md +137 -0
- package/src/config/claude-code-config/skills/workflow-clean-code/steps/step-02-apply.md +152 -0
- package/src/config/claude-code-config/skills/workflow-clean-code/steps/step-03-verify.md +143 -0
- package/src/config/claude-code-config/skills/workflow-debug/SKILL.md +126 -0
- package/src/config/claude-code-config/skills/workflow-debug/references/log-technique.md +285 -0
- package/src/config/claude-code-config/skills/workflow-debug/steps/step-00-init.md +94 -0
- package/src/config/claude-code-config/skills/workflow-debug/steps/step-01-analyze.md +180 -0
- package/src/config/claude-code-config/skills/workflow-debug/steps/step-01b-log-instrumentation.md +271 -0
- package/src/config/claude-code-config/skills/workflow-debug/steps/step-02-find-solutions.md +141 -0
- package/src/config/claude-code-config/skills/workflow-debug/steps/step-03-propose.md +142 -0
- package/src/config/claude-code-config/skills/workflow-debug/steps/step-04-fix.md +176 -0
- package/src/config/claude-code-config/skills/workflow-debug/steps/step-05-verify.md +279 -0
- package/src/config/claude-code-config/skills/workflow-review-code/SKILL.md +219 -0
- package/src/config/claude-code-config/skills/workflow-review-code/references/clean-code-principles.md +140 -0
- package/src/config/claude-code-config/skills/workflow-review-code/references/code-quality-metrics.md +174 -0
- package/src/config/claude-code-config/skills/workflow-review-code/references/feedback-patterns.md +149 -0
- package/src/config/claude-code-config/skills/workflow-review-code/references/security-checklist.md +127 -0
- package/src/config/claude-code-config/song/finish.mp3 +0 -0
- package/src/config/claude-code-config/song/need-human.mp3 +0 -0
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# Claude Code Statusline
|
|
2
|
+
|
|
3
|
+
Clean, modular statusline for Claude Code with TypeScript + Bun.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- 🌿 Git branch with changes (+added -deleted)
|
|
8
|
+
- 💰 Session cost and duration
|
|
9
|
+
- 🧩 Context tokens used
|
|
10
|
+
- 📊 Context percentage (0-100%)
|
|
11
|
+
- ⏱️ Five-hour usage limit with reset time
|
|
12
|
+
- 📅 Weekly usage limit with configurable threshold
|
|
13
|
+
- 📈 Daily usage percentage tracking and statistics
|
|
14
|
+
|
|
15
|
+
## Structure
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
src/
|
|
19
|
+
├── index.ts # Main entry point
|
|
20
|
+
└── lib/
|
|
21
|
+
├── types.ts # TypeScript interfaces
|
|
22
|
+
├── git.ts # Git status
|
|
23
|
+
├── context.ts # Context calculation from transcript
|
|
24
|
+
├── usage-limits.ts # Claude API usage limits
|
|
25
|
+
└── formatters.ts # Formatting utilities
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Development
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# Install dependencies
|
|
32
|
+
bun install
|
|
33
|
+
|
|
34
|
+
# Run the statusline (needs stdin JSON)
|
|
35
|
+
echo '{ ... }' | bun run start
|
|
36
|
+
|
|
37
|
+
# View today's spending
|
|
38
|
+
bun run spend:today
|
|
39
|
+
|
|
40
|
+
# View this month's spending
|
|
41
|
+
bun run spend:month
|
|
42
|
+
|
|
43
|
+
# View usage statistics
|
|
44
|
+
bun run stats
|
|
45
|
+
|
|
46
|
+
# Interactive config demo
|
|
47
|
+
bun run demo
|
|
48
|
+
|
|
49
|
+
# Format code
|
|
50
|
+
bun run format
|
|
51
|
+
|
|
52
|
+
# Lint code
|
|
53
|
+
bun run lint
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Tracking Features
|
|
57
|
+
|
|
58
|
+
### Spend Tracking
|
|
59
|
+
|
|
60
|
+
The statusline automatically saves session data to `data/spend.json`. You can view your spending with:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
# Today's sessions and cost
|
|
64
|
+
bun run spend:today
|
|
65
|
+
|
|
66
|
+
# This month's sessions grouped by date
|
|
67
|
+
bun run spend:month
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Each session tracks:
|
|
71
|
+
- Cost (USD)
|
|
72
|
+
- Duration
|
|
73
|
+
- Lines added/removed
|
|
74
|
+
- Working directory
|
|
75
|
+
|
|
76
|
+
### Usage Statistics
|
|
77
|
+
|
|
78
|
+
Daily usage percentages are automatically tracked in `data/daily-usage.json`. Each 5-hour rate limit period is tracked separately using the `resets_at` timestamp as a unique key.
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
bun run stats
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
This shows:
|
|
85
|
+
- Average daily usage percentage across all tracked days
|
|
86
|
+
- Total days and total 5-hour periods tracked
|
|
87
|
+
- Recent 7-day usage history with visual bars
|
|
88
|
+
- Per-day statistics: average, max, min across all 5-hour periods
|
|
89
|
+
- Data is kept for 90 days
|
|
90
|
+
|
|
91
|
+
**How it works:**
|
|
92
|
+
- Each `resets_at` value represents a unique 5-hour rate limit period
|
|
93
|
+
- Multiple 5-hour periods can occur in a single day
|
|
94
|
+
- If the API is called multiple times during the same 5-hour period, only the latest value is kept
|
|
95
|
+
- Daily statistics show the average, maximum, and minimum usage across all periods in that day
|
|
96
|
+
|
|
97
|
+
## Interactive Demo
|
|
98
|
+
|
|
99
|
+
Explore all configuration options with a live preview:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
bun run demo
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
This opens an interactive menu where you can:
|
|
106
|
+
- Toggle any config option with arrow keys and spacebar
|
|
107
|
+
- See instant preview of how the statusline changes
|
|
108
|
+
- Navigate through all available settings
|
|
109
|
+
- Reset to defaults with `R`
|
|
110
|
+
- Explore session, limits, weekly usage, and git display options
|
|
111
|
+
|
|
112
|
+
**Controls:**
|
|
113
|
+
- `↑↓` or `j/k` - Navigate options
|
|
114
|
+
- `Space` - Toggle selected option
|
|
115
|
+
- `R` - Reset to defaults
|
|
116
|
+
- `Q` - Quit
|
|
117
|
+
|
|
118
|
+
## Configuration
|
|
119
|
+
|
|
120
|
+
The statusline can be customized via `statusline.config.ts`. Key configuration options:
|
|
121
|
+
|
|
122
|
+
### Weekly Usage Display
|
|
123
|
+
|
|
124
|
+
```typescript
|
|
125
|
+
weeklyUsage: {
|
|
126
|
+
enabled: boolean | "90%", // true: always show, false: never, "90%": show when 5-hour usage >= 90%
|
|
127
|
+
showTimeLeft: boolean,
|
|
128
|
+
percentage: {
|
|
129
|
+
enabled: boolean,
|
|
130
|
+
progressBar: {
|
|
131
|
+
enabled: boolean,
|
|
132
|
+
length: 5 | 10 | 15,
|
|
133
|
+
style: "filled" | "rectangle" | "braille",
|
|
134
|
+
color: "progressive" | "green" | "yellow" | "red"
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
**Default:** `enabled: "90%"` - Weekly limits appear when your 5-hour usage reaches 90%
|
|
141
|
+
|
|
142
|
+
Display format: `W: ⣿⣿⣧⣀⣀⣀⣀⣀⣀⣀ 45% (6d12h)`
|
|
143
|
+
|
|
144
|
+
### Other Configuration Options
|
|
145
|
+
|
|
146
|
+
- **Session display**: Cost, tokens, context percentage
|
|
147
|
+
- **Limits display**: Five-hour usage limits
|
|
148
|
+
- **Git display**: Branch, changes, staged/unstaged files
|
|
149
|
+
- **Path display**: Full, truncated, or basename modes
|
|
150
|
+
- **Progress bars**: Multiple styles and color schemes
|
|
151
|
+
|
|
152
|
+
See `statusline.config.ts` for all available options and defaults.
|
|
153
|
+
|
|
154
|
+
## Usage in Claude Code
|
|
155
|
+
|
|
156
|
+
Update your `~/.claude/settings.json`:
|
|
157
|
+
|
|
158
|
+
```json
|
|
159
|
+
{
|
|
160
|
+
"statusLine": {
|
|
161
|
+
"type": "command",
|
|
162
|
+
"command": "bun /Users/melvynx/.claude/scripts/statusline/src/index.ts",
|
|
163
|
+
"padding": 0
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## Testing
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
echo '{
|
|
172
|
+
"session_id": "test",
|
|
173
|
+
"transcript_path": "/path/to/transcript.jsonl",
|
|
174
|
+
"cwd": "/path",
|
|
175
|
+
"model": {
|
|
176
|
+
"id": "claude-sonnet-4-5",
|
|
177
|
+
"display_name": "Sonnet 4.5"
|
|
178
|
+
},
|
|
179
|
+
"workspace": {
|
|
180
|
+
"current_dir": "/path",
|
|
181
|
+
"project_dir": "/path"
|
|
182
|
+
},
|
|
183
|
+
"version": "2.0.31",
|
|
184
|
+
"output_style": { "name": "default" },
|
|
185
|
+
"cost": {
|
|
186
|
+
"total_cost_usd": 0.15,
|
|
187
|
+
"total_duration_ms": 300000,
|
|
188
|
+
"total_api_duration_ms": 200000,
|
|
189
|
+
"total_lines_added": 100,
|
|
190
|
+
"total_lines_removed": 50
|
|
191
|
+
}
|
|
192
|
+
}' | bun run start
|
|
193
|
+
```
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
import { afterAll, beforeAll, describe, expect, it } from "bun:test";
|
|
2
|
+
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { getContextData, getContextLength } from "../src/lib/context";
|
|
5
|
+
|
|
6
|
+
const TEST_DIR = join(import.meta.dir, "..", "fixtures", "test-transcripts");
|
|
7
|
+
|
|
8
|
+
beforeAll(() => {
|
|
9
|
+
mkdirSync(TEST_DIR, { recursive: true });
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
afterAll(() => {
|
|
13
|
+
rmSync(TEST_DIR, { recursive: true, force: true });
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
function createTranscript(lines: object[]): string {
|
|
17
|
+
return lines.map((l) => JSON.stringify(l)).join("\n");
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
describe("getContextLength", () => {
|
|
21
|
+
it("should return 0 for empty transcript", async () => {
|
|
22
|
+
const path = join(TEST_DIR, "empty.jsonl");
|
|
23
|
+
writeFileSync(path, "");
|
|
24
|
+
expect(await getContextLength(path)).toBe(0);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it("should return 0 for transcript with no usage data", async () => {
|
|
28
|
+
const path = join(TEST_DIR, "no-usage.jsonl");
|
|
29
|
+
const content = createTranscript([
|
|
30
|
+
{ type: "user", message: { role: "user", content: "hello" } },
|
|
31
|
+
]);
|
|
32
|
+
writeFileSync(path, content);
|
|
33
|
+
expect(await getContextLength(path)).toBe(0);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("should calculate tokens from most recent entry", async () => {
|
|
37
|
+
const path = join(TEST_DIR, "with-usage.jsonl");
|
|
38
|
+
const content = createTranscript([
|
|
39
|
+
{
|
|
40
|
+
timestamp: "2025-01-01T10:00:00Z",
|
|
41
|
+
message: {
|
|
42
|
+
role: "assistant",
|
|
43
|
+
usage: { input_tokens: 1000, output_tokens: 100 },
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
timestamp: "2025-01-01T10:05:00Z",
|
|
48
|
+
message: {
|
|
49
|
+
role: "assistant",
|
|
50
|
+
usage: { input_tokens: 5000, output_tokens: 200 },
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
]);
|
|
54
|
+
writeFileSync(path, content);
|
|
55
|
+
expect(await getContextLength(path)).toBe(5000);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("should include cache tokens in calculation", async () => {
|
|
59
|
+
const path = join(TEST_DIR, "with-cache.jsonl");
|
|
60
|
+
const content = createTranscript([
|
|
61
|
+
{
|
|
62
|
+
timestamp: "2025-01-01T10:00:00Z",
|
|
63
|
+
message: {
|
|
64
|
+
role: "assistant",
|
|
65
|
+
usage: {
|
|
66
|
+
input_tokens: 1000,
|
|
67
|
+
cache_read_input_tokens: 2000,
|
|
68
|
+
cache_creation_input_tokens: 3000,
|
|
69
|
+
output_tokens: 100,
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
]);
|
|
74
|
+
writeFileSync(path, content);
|
|
75
|
+
expect(await getContextLength(path)).toBe(6000);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("should skip sidechain entries", async () => {
|
|
79
|
+
const path = join(TEST_DIR, "with-sidechain.jsonl");
|
|
80
|
+
const content = createTranscript([
|
|
81
|
+
{
|
|
82
|
+
timestamp: "2025-01-01T10:00:00Z",
|
|
83
|
+
message: {
|
|
84
|
+
role: "assistant",
|
|
85
|
+
usage: { input_tokens: 1000, output_tokens: 100 },
|
|
86
|
+
},
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
timestamp: "2025-01-01T10:05:00Z",
|
|
90
|
+
isSidechain: true,
|
|
91
|
+
message: {
|
|
92
|
+
role: "assistant",
|
|
93
|
+
usage: { input_tokens: 99999, output_tokens: 200 },
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
]);
|
|
97
|
+
writeFileSync(path, content);
|
|
98
|
+
expect(await getContextLength(path)).toBe(1000);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("should skip API error messages", async () => {
|
|
102
|
+
const path = join(TEST_DIR, "with-error.jsonl");
|
|
103
|
+
const content = createTranscript([
|
|
104
|
+
{
|
|
105
|
+
timestamp: "2025-01-01T10:00:00Z",
|
|
106
|
+
message: {
|
|
107
|
+
role: "assistant",
|
|
108
|
+
usage: { input_tokens: 1000, output_tokens: 100 },
|
|
109
|
+
},
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
timestamp: "2025-01-01T10:05:00Z",
|
|
113
|
+
isApiErrorMessage: true,
|
|
114
|
+
message: {
|
|
115
|
+
role: "assistant",
|
|
116
|
+
usage: { input_tokens: 99999, output_tokens: 200 },
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
]);
|
|
120
|
+
writeFileSync(path, content);
|
|
121
|
+
expect(await getContextLength(path)).toBe(1000);
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
it("should return 0 for non-existent file", async () => {
|
|
125
|
+
expect(await getContextLength("/non/existent/path.jsonl")).toBe(0);
|
|
126
|
+
});
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
describe("getContextData", () => {
|
|
130
|
+
it("should return zeros for non-existent file", async () => {
|
|
131
|
+
const result = await getContextData({
|
|
132
|
+
transcriptPath: "/non/existent/path.jsonl",
|
|
133
|
+
maxContextTokens: 200000,
|
|
134
|
+
autocompactBufferTokens: 45000,
|
|
135
|
+
});
|
|
136
|
+
expect(result).toEqual({ tokens: 0, percentage: 0 });
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
it("should calculate percentage correctly", async () => {
|
|
140
|
+
const path = join(TEST_DIR, "percentage.jsonl");
|
|
141
|
+
const content = createTranscript([
|
|
142
|
+
{
|
|
143
|
+
timestamp: "2025-01-01T10:00:00Z",
|
|
144
|
+
message: {
|
|
145
|
+
role: "assistant",
|
|
146
|
+
usage: { input_tokens: 100000, output_tokens: 100 },
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
]);
|
|
150
|
+
writeFileSync(path, content);
|
|
151
|
+
|
|
152
|
+
const result = await getContextData({
|
|
153
|
+
transcriptPath: path,
|
|
154
|
+
maxContextTokens: 200000,
|
|
155
|
+
autocompactBufferTokens: 45000,
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
expect(result.tokens).toBe(100000);
|
|
159
|
+
expect(result.percentage).toBe(50);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it("should add autocompact buffer when useUsableContextOnly is true", async () => {
|
|
163
|
+
const path = join(TEST_DIR, "usable.jsonl");
|
|
164
|
+
const content = createTranscript([
|
|
165
|
+
{
|
|
166
|
+
timestamp: "2025-01-01T10:00:00Z",
|
|
167
|
+
message: {
|
|
168
|
+
role: "assistant",
|
|
169
|
+
usage: { input_tokens: 50000, output_tokens: 100 },
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
]);
|
|
173
|
+
writeFileSync(path, content);
|
|
174
|
+
|
|
175
|
+
const result = await getContextData({
|
|
176
|
+
transcriptPath: path,
|
|
177
|
+
maxContextTokens: 200000,
|
|
178
|
+
autocompactBufferTokens: 45000,
|
|
179
|
+
useUsableContextOnly: true,
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
expect(result.tokens).toBe(95000);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
it("should add overhead tokens", async () => {
|
|
186
|
+
const path = join(TEST_DIR, "overhead.jsonl");
|
|
187
|
+
const content = createTranscript([
|
|
188
|
+
{
|
|
189
|
+
timestamp: "2025-01-01T10:00:00Z",
|
|
190
|
+
message: {
|
|
191
|
+
role: "assistant",
|
|
192
|
+
usage: { input_tokens: 50000, output_tokens: 100 },
|
|
193
|
+
},
|
|
194
|
+
},
|
|
195
|
+
]);
|
|
196
|
+
writeFileSync(path, content);
|
|
197
|
+
|
|
198
|
+
const result = await getContextData({
|
|
199
|
+
transcriptPath: path,
|
|
200
|
+
maxContextTokens: 200000,
|
|
201
|
+
autocompactBufferTokens: 45000,
|
|
202
|
+
overheadTokens: 20000,
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
expect(result.tokens).toBe(70000);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
it("should cap percentage at 100", async () => {
|
|
209
|
+
const path = join(TEST_DIR, "over100.jsonl");
|
|
210
|
+
const content = createTranscript([
|
|
211
|
+
{
|
|
212
|
+
timestamp: "2025-01-01T10:00:00Z",
|
|
213
|
+
message: {
|
|
214
|
+
role: "assistant",
|
|
215
|
+
usage: { input_tokens: 250000, output_tokens: 100 },
|
|
216
|
+
},
|
|
217
|
+
},
|
|
218
|
+
]);
|
|
219
|
+
writeFileSync(path, content);
|
|
220
|
+
|
|
221
|
+
const result = await getContextData({
|
|
222
|
+
transcriptPath: path,
|
|
223
|
+
maxContextTokens: 200000,
|
|
224
|
+
autocompactBufferTokens: 45000,
|
|
225
|
+
});
|
|
226
|
+
|
|
227
|
+
expect(result.percentage).toBe(100);
|
|
228
|
+
});
|
|
229
|
+
});
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { describe, expect, it } from "bun:test";
|
|
2
|
+
import {
|
|
3
|
+
formatCost,
|
|
4
|
+
formatDuration,
|
|
5
|
+
formatPath,
|
|
6
|
+
formatResetTime,
|
|
7
|
+
formatTokens,
|
|
8
|
+
} from "../src/lib/formatters";
|
|
9
|
+
|
|
10
|
+
describe("formatPath", () => {
|
|
11
|
+
it("should return basename for basename mode", () => {
|
|
12
|
+
expect(formatPath("/Users/test/project/src/file.ts", "basename")).toBe(
|
|
13
|
+
"file.ts",
|
|
14
|
+
);
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
it("should truncate long paths in truncated mode", () => {
|
|
18
|
+
const result = formatPath("/Users/test/deep/nested/path/file.ts");
|
|
19
|
+
expect(result).toContain("path");
|
|
20
|
+
expect(result).toContain("file.ts");
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("should handle Windows-style paths", () => {
|
|
24
|
+
expect(formatPath("C:\\Users\\test\\project\\file.ts", "basename")).toBe(
|
|
25
|
+
"file.ts",
|
|
26
|
+
);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it("should handle mixed separators", () => {
|
|
30
|
+
expect(formatPath("/Users/test\\mixed/path", "basename")).toBe("path");
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
describe("formatCost", () => {
|
|
35
|
+
it("should format with 1 decimal by default", () => {
|
|
36
|
+
expect(formatCost(1.234)).toBe("1.2");
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("should format as integer when specified", () => {
|
|
40
|
+
expect(formatCost(1.789, "integer")).toBe("2");
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("should format with 2 decimals when specified", () => {
|
|
44
|
+
expect(formatCost(1.789, "decimal2")).toBe("1.79");
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
describe("formatTokens", () => {
|
|
49
|
+
it("should format thousands with k suffix", () => {
|
|
50
|
+
const result = formatTokens(5000);
|
|
51
|
+
expect(result).toContain("5.0");
|
|
52
|
+
expect(result).toContain("k");
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("should format millions with m suffix", () => {
|
|
56
|
+
const result = formatTokens(1500000);
|
|
57
|
+
expect(result).toContain("1.5");
|
|
58
|
+
expect(result).toContain("m");
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("should return raw number for small values", () => {
|
|
62
|
+
const result = formatTokens(500);
|
|
63
|
+
expect(result).toContain("500");
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("should hide decimals when showDecimals is false", () => {
|
|
67
|
+
const result = formatTokens(5500, false);
|
|
68
|
+
expect(result).toContain("6");
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
describe("formatDuration", () => {
|
|
73
|
+
it("should format minutes only for short durations", () => {
|
|
74
|
+
expect(formatDuration(300000)).toBe("5m");
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("should format hours and minutes for long durations", () => {
|
|
78
|
+
expect(formatDuration(5400000)).toBe("1h 30m");
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
it("should handle zero duration", () => {
|
|
82
|
+
expect(formatDuration(0)).toBe("0m");
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
describe("formatResetTime", () => {
|
|
87
|
+
it("should return 'now' for past times", () => {
|
|
88
|
+
const pastTime = new Date(Date.now() - 60000).toISOString();
|
|
89
|
+
expect(formatResetTime(pastTime)).toBe("now");
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it("should format future times with hours and minutes", () => {
|
|
93
|
+
const futureTime = new Date(Date.now() + 3700000).toISOString();
|
|
94
|
+
const result = formatResetTime(futureTime);
|
|
95
|
+
expect(result).toContain("h");
|
|
96
|
+
expect(result).toContain("m");
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
it("should format minutes only for short durations", () => {
|
|
100
|
+
const futureTime = new Date(Date.now() + 1800000).toISOString();
|
|
101
|
+
const result = formatResetTime(futureTime);
|
|
102
|
+
expect(result).toMatch(/^\d+m$/);
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
it("should return N/A for invalid dates", () => {
|
|
106
|
+
expect(formatResetTime("invalid-date")).toBe("N/A");
|
|
107
|
+
});
|
|
108
|
+
});
|