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,56 @@
|
|
|
1
|
+
import { createAnthropic } from "@ai-sdk/anthropic";
|
|
2
|
+
import { generateText } from "ai";
|
|
3
|
+
import { getClaudeCodeToken } from "./helper/credentials";
|
|
4
|
+
|
|
5
|
+
export {
|
|
6
|
+
getClaudeCodeToken,
|
|
7
|
+
getClaudeCodeTokenSafe,
|
|
8
|
+
} from "./helper/credentials";
|
|
9
|
+
|
|
10
|
+
const SYSTEM_PROMPT =
|
|
11
|
+
"You are Claude Code, Anthropic's official CLI for Claude.";
|
|
12
|
+
|
|
13
|
+
export type Model = "haiku" | "sonnet" | "opus";
|
|
14
|
+
|
|
15
|
+
const MODEL_MAP: Record<Model, string> = {
|
|
16
|
+
haiku: "claude-haiku-4-5-20251001",
|
|
17
|
+
sonnet: "claude-sonnet-4-5-20250929",
|
|
18
|
+
opus: "claude-opus-4-5-20251101",
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export async function generateTextCC({
|
|
22
|
+
prompt,
|
|
23
|
+
system,
|
|
24
|
+
model = "sonnet",
|
|
25
|
+
}: {
|
|
26
|
+
prompt: string;
|
|
27
|
+
system?: string;
|
|
28
|
+
model?: Model;
|
|
29
|
+
}): Promise<string> {
|
|
30
|
+
const token = await getClaudeCodeToken();
|
|
31
|
+
|
|
32
|
+
const anthropic = createAnthropic({
|
|
33
|
+
apiKey: "oauth-token",
|
|
34
|
+
headers: {
|
|
35
|
+
"anthropic-beta":
|
|
36
|
+
"claude-code-20250219,oauth-2025-04-20,interleaved-thinking-2025-05-14",
|
|
37
|
+
"anthropic-dangerous-direct-browser-access": "true",
|
|
38
|
+
"x-app": "cli",
|
|
39
|
+
"User-Agent": "claude-cli/2.0.76 (external, cli)",
|
|
40
|
+
},
|
|
41
|
+
fetch: (async (url: RequestInfo | URL, options?: RequestInit) => {
|
|
42
|
+
const headers = new Headers(options?.headers);
|
|
43
|
+
headers.delete("x-api-key");
|
|
44
|
+
headers.set("Authorization", `Bearer ${token}`);
|
|
45
|
+
return fetch(url, { ...options, headers });
|
|
46
|
+
}) as typeof fetch,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
const result = await generateText({
|
|
50
|
+
model: anthropic(MODEL_MAP[model]),
|
|
51
|
+
system,
|
|
52
|
+
prompt,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
return result.text;
|
|
56
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env bun
|
|
2
|
+
import { parseArgs } from "util";
|
|
3
|
+
import { generateTextCC, type Model } from "./claude";
|
|
4
|
+
|
|
5
|
+
const { values, positionals } = parseArgs({
|
|
6
|
+
args: Bun.argv.slice(2),
|
|
7
|
+
options: {
|
|
8
|
+
model: {
|
|
9
|
+
type: "string",
|
|
10
|
+
short: "m",
|
|
11
|
+
default: "sonnet",
|
|
12
|
+
},
|
|
13
|
+
system: {
|
|
14
|
+
type: "string",
|
|
15
|
+
short: "s",
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
allowPositionals: true,
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const prompt = positionals.join(" ");
|
|
22
|
+
|
|
23
|
+
if (!prompt) {
|
|
24
|
+
console.error(
|
|
25
|
+
"Usage: bun run cli.ts <prompt> [-m opus|sonnet|haiku] [-s system_prompt]",
|
|
26
|
+
);
|
|
27
|
+
process.exit(1);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const model = values.model as Model;
|
|
31
|
+
if (!["haiku", "sonnet", "opus"].includes(model)) {
|
|
32
|
+
console.error(`Invalid model: ${model}. Use: opus, sonnet, or haiku`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
const response = await generateTextCC({
|
|
38
|
+
prompt,
|
|
39
|
+
model,
|
|
40
|
+
system: values.system,
|
|
41
|
+
});
|
|
42
|
+
console.log(response);
|
|
43
|
+
} catch (error) {
|
|
44
|
+
console.error("Error:", error);
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { homedir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { $ } from "bun";
|
|
6
|
+
|
|
7
|
+
interface Credentials {
|
|
8
|
+
claudeAiOauth: {
|
|
9
|
+
accessToken: string;
|
|
10
|
+
refreshToken: string;
|
|
11
|
+
expiresAt: number;
|
|
12
|
+
scopes: string[];
|
|
13
|
+
subscriptionType: string;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function getHomeDir(): string {
|
|
18
|
+
return homedir();
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function getCredentialsFilePath(): string {
|
|
22
|
+
const home = getHomeDir();
|
|
23
|
+
return join(home, ".claude", ".credentials.json");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async function getMacOSKeychainCredentials(): Promise<string> {
|
|
27
|
+
const result =
|
|
28
|
+
// ank-121221
|
|
29
|
+
await $`security find-generic-password -s "Claude Code-credentials" -w`
|
|
30
|
+
.quiet()
|
|
31
|
+
.text();
|
|
32
|
+
const creds: Credentials = JSON.parse(result.trim());
|
|
33
|
+
return creds.claudeAiOauth.accessToken;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function getFileCredentials(): Promise<string> {
|
|
37
|
+
const credentialsPath = getCredentialsFilePath();
|
|
38
|
+
|
|
39
|
+
if (!existsSync(credentialsPath)) {
|
|
40
|
+
throw new Error(`Credentials file not found at ${credentialsPath}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const content = await readFile(credentialsPath, "utf-8");
|
|
44
|
+
const creds: Credentials = JSON.parse(content);
|
|
45
|
+
return creds.claudeAiOauth.accessToken;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export async function getClaudeCodeToken(): Promise<string> {
|
|
49
|
+
const platform = process.platform;
|
|
50
|
+
|
|
51
|
+
if (platform === "darwin") {
|
|
52
|
+
try {
|
|
53
|
+
return await getMacOSKeychainCredentials();
|
|
54
|
+
} catch {
|
|
55
|
+
return await getFileCredentials();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (platform === "linux") {
|
|
60
|
+
return await getFileCredentials();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (platform === "win32") {
|
|
64
|
+
return await getFileCredentials();
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
throw new Error(`Unsupported platform: ${platform}`);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export async function getClaudeCodeTokenSafe(): Promise<string | null> {
|
|
71
|
+
try {
|
|
72
|
+
return await getClaudeCodeToken();
|
|
73
|
+
} catch {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
|
|
5
|
+
export function getHomeDir(): string {
|
|
6
|
+
return homedir();
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export function getClaudeConfigDir(): string {
|
|
10
|
+
const home = getHomeDir();
|
|
11
|
+
|
|
12
|
+
const newPath = join(home, ".config", "claude");
|
|
13
|
+
if (existsSync(newPath)) {
|
|
14
|
+
return newPath;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const legacyPath = join(home, ".claude");
|
|
18
|
+
if (existsSync(legacyPath)) {
|
|
19
|
+
return legacyPath;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
return newPath;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function getClaudeCredentialsPath(): string {
|
|
26
|
+
const home = getHomeDir();
|
|
27
|
+
return join(home, ".claude", ".credentials.json");
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function getClaudeSettingsPath(): string {
|
|
31
|
+
return join(getClaudeConfigDir(), "settings.json");
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function getClaudeProjectsDir(): string {
|
|
35
|
+
return join(getClaudeConfigDir(), "projects");
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function encodeProjectPath(absolutePath: string): string {
|
|
39
|
+
const normalizedPath = absolutePath.replace(/[/\\]+$/, "");
|
|
40
|
+
|
|
41
|
+
const claudeProjectsDir = getClaudeProjectsDir();
|
|
42
|
+
if (normalizedPath.includes(join(".claude", "projects"))) {
|
|
43
|
+
return normalizedPath;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const encoded = normalizedPath
|
|
47
|
+
.replace(/[/\\]/g, "-")
|
|
48
|
+
.replace(/\./g, "-")
|
|
49
|
+
.replace(/:/g, "");
|
|
50
|
+
return join(claudeProjectsDir, encoded);
|
|
51
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# Command Validator - CLAUDE.md
|
|
2
|
+
|
|
3
|
+
This file provides guidance to Claude Code when working with the command-validator security package.
|
|
4
|
+
|
|
5
|
+
## Project Purpose
|
|
6
|
+
|
|
7
|
+
**Command Validator** is a security validation package for Claude Code's PreToolUse hook. It validates bash commands before execution to prevent dangerous operations like:
|
|
8
|
+
- System destruction (rm -rf /, dd, mkfs)
|
|
9
|
+
- Privilege escalation (sudo, chmod, passwd)
|
|
10
|
+
- Network attacks (nc, nmap, telnet)
|
|
11
|
+
- Malicious patterns (fork bombs, backdoors)
|
|
12
|
+
- Sensitive file access (/etc/passwd, /etc/shadow)
|
|
13
|
+
|
|
14
|
+
The validator is integrated as a hook in Claude Code settings and blocks dangerous commands while allowing safe operations.
|
|
15
|
+
|
|
16
|
+
## CRITICAL: This Project Uses BUN
|
|
17
|
+
|
|
18
|
+
**NEVER use npm or node commands. This project exclusively uses BUN.**
|
|
19
|
+
|
|
20
|
+
## Development Commands
|
|
21
|
+
|
|
22
|
+
**CRITICAL**: Only use these BUN commands:
|
|
23
|
+
|
|
24
|
+
### Testing (Primary Workflow)
|
|
25
|
+
- `bun test` - Run all tests with Vitest
|
|
26
|
+
- `bun test:ui` - Run tests with UI interface
|
|
27
|
+
- `bun run test` - Alternative test command
|
|
28
|
+
|
|
29
|
+
### Code Quality
|
|
30
|
+
- `bun run lint` - Run Biome linter and auto-fix
|
|
31
|
+
- `bun run format` - Format code with Biome
|
|
32
|
+
- `bunx tsc --noEmit` - TypeScript type checking (no build)
|
|
33
|
+
|
|
34
|
+
### Execution
|
|
35
|
+
- `bun src/cli.ts` - Run CLI validator directly
|
|
36
|
+
- `bun install` - Install dependencies
|
|
37
|
+
|
|
38
|
+
## Development Workflow
|
|
39
|
+
|
|
40
|
+
**CRITICAL**: The majority of work on this project follows this simple cycle:
|
|
41
|
+
|
|
42
|
+
### Test-Driven Development Cycle
|
|
43
|
+
1. **Run tests**: `bun test`
|
|
44
|
+
2. **Read errors**: Analyze test failures carefully
|
|
45
|
+
3. **Fix the problem**: Make minimal changes to pass tests
|
|
46
|
+
4. **Re-run tests**: `bun test` until ALL tests pass
|
|
47
|
+
5. **Repeat**: Continue cycle until all tests are green
|
|
48
|
+
|
|
49
|
+
**ALWAYS follow this workflow:**
|
|
50
|
+
```bash
|
|
51
|
+
bun test # See what's broken
|
|
52
|
+
# Fix the code
|
|
53
|
+
bun test # Verify fix works
|
|
54
|
+
# Repeat until green
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Architecture Overview
|
|
58
|
+
|
|
59
|
+
```
|
|
60
|
+
src/
|
|
61
|
+
├── cli.ts # CLI entry point (used by Claude Code hook)
|
|
62
|
+
├── lib/
|
|
63
|
+
│ ├── types.ts # TypeScript interfaces
|
|
64
|
+
│ ├── security-rules.ts # Security rules database
|
|
65
|
+
│ └── validator.ts # Core validation logic
|
|
66
|
+
└── __tests__/
|
|
67
|
+
└── validator.test.ts # Comprehensive test suite (82+ tests)
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Key Files
|
|
71
|
+
- **@scripts/command-validator/src/lib/validator.ts** - Core CommandValidator class
|
|
72
|
+
- **@scripts/command-validator/src/lib/security-rules.ts** - Security rules database
|
|
73
|
+
- **@scripts/command-validator/src/__tests__/validator.test.ts** - All test cases
|
|
74
|
+
|
|
75
|
+
## Code Conventions
|
|
76
|
+
|
|
77
|
+
- **TypeScript**: Strict mode enabled
|
|
78
|
+
- **Testing**: Vitest with comprehensive coverage (82+ tests)
|
|
79
|
+
- **Linting**: Biome for formatting and linting
|
|
80
|
+
- **Imports**: ESM module format only
|
|
81
|
+
|
|
82
|
+
## Security Test Categories
|
|
83
|
+
|
|
84
|
+
The test suite validates:
|
|
85
|
+
1. **Safe Commands**: ls, git, npm, cat, cp, mv, mkdir (must allow)
|
|
86
|
+
2. **Dangerous Commands**: rm -rf /, dd, sudo, passwd (must block)
|
|
87
|
+
3. **Special Cases**: rm -rf safety rules, protected paths, command chains
|
|
88
|
+
4. **Malicious Patterns**: Fork bombs, backdoors, log manipulation
|
|
89
|
+
|
|
90
|
+
## IMPORTANT: Workflow Rules
|
|
91
|
+
|
|
92
|
+
- **BEFORE making changes**: Run `bun test` to see current state
|
|
93
|
+
- **AFTER any code change**: Run `bun test` to verify
|
|
94
|
+
- **NEVER assume tests pass**: Always verify with `bun test`
|
|
95
|
+
- **Fix one test at a time**: Make minimal changes, then re-test
|
|
96
|
+
- **Use Bun ONLY**: No npm, node, or yarn commands
|
|
97
|
+
|
|
98
|
+
## Common Modifications
|
|
99
|
+
|
|
100
|
+
Most changes involve:
|
|
101
|
+
1. **Adding new security rules** → Update @scripts/command-validator/src/lib/security-rules.ts
|
|
102
|
+
2. **Modifying validation logic** → Update @scripts/command-validator/src/lib/validator.ts
|
|
103
|
+
3. **Adding test cases** → Update @scripts/command-validator/src/__tests__/validator.test.ts
|
|
104
|
+
4. **Run tests after each change** → `bun test`
|
|
105
|
+
|
|
106
|
+
## Test Execution Priority
|
|
107
|
+
|
|
108
|
+
**ALWAYS use the test-driven approach:**
|
|
109
|
+
- Tests define the requirements
|
|
110
|
+
- Code changes must make tests pass
|
|
111
|
+
- All 82+ tests must be green before committing
|
|
112
|
+
- Use `bun test` continuously during development
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# Command Validator
|
|
2
|
+
|
|
3
|
+
A secure command validation package for Claude Code's PreToolUse hook. This package validates bash commands before execution to prevent dangerous operations.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Comprehensive Security Rules**: Blocks dangerous commands (rm -rf /, dd, mkfs, etc.)
|
|
8
|
+
- **Pattern Matching**: Detects malicious patterns like fork bombs, backdoors, and data exfiltration
|
|
9
|
+
- **Path Protection**: Prevents writes to system directories (/etc, /usr, /bin, etc.)
|
|
10
|
+
- **Command Chaining**: Validates chained commands (&&, ||, ;)
|
|
11
|
+
- **Fully Tested**: 82+ tests with Vitest ensuring reliable validation
|
|
12
|
+
|
|
13
|
+
## Installation
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
bun install
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
### As a Claude Code Hook
|
|
22
|
+
|
|
23
|
+
The validator is configured as a PreToolUse hook in Claude Code settings:
|
|
24
|
+
|
|
25
|
+
```json
|
|
26
|
+
{
|
|
27
|
+
"hooks": {
|
|
28
|
+
"PreToolUse": [
|
|
29
|
+
{
|
|
30
|
+
"matcher": "Bash",
|
|
31
|
+
"hooks": [
|
|
32
|
+
{
|
|
33
|
+
"type": "command",
|
|
34
|
+
"command": "bun /Users/melvynx/.claude/scripts/command-validator/src/cli.ts"
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Programmatic Usage
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
import { CommandValidator } from "./src/lib/validator";
|
|
47
|
+
|
|
48
|
+
const validator = new CommandValidator();
|
|
49
|
+
const result = validator.validate("rm -rf /");
|
|
50
|
+
|
|
51
|
+
if (!result.isValid) {
|
|
52
|
+
console.log(`Blocked: ${result.violations.join(", ")}`);
|
|
53
|
+
console.log(`Severity: ${result.severity}`);
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Testing
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# Run all tests
|
|
61
|
+
bun test
|
|
62
|
+
|
|
63
|
+
# Run tests with UI
|
|
64
|
+
bun test:ui
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Test Coverage
|
|
68
|
+
|
|
69
|
+
The test suite includes:
|
|
70
|
+
|
|
71
|
+
### Safe Commands (Must Allow)
|
|
72
|
+
- Standard utilities: ls, git, npm, pnpm, node, python
|
|
73
|
+
- File operations: cat, cp, mv, mkdir, touch
|
|
74
|
+
- Safe command chains with &&
|
|
75
|
+
|
|
76
|
+
### Dangerous Commands (Must Block)
|
|
77
|
+
- System destruction: rm -rf /, dd, mkfs, fdisk
|
|
78
|
+
- Privilege escalation: sudo, chmod, chown, passwd
|
|
79
|
+
- Network attacks: nc, nmap, telnet
|
|
80
|
+
- Malicious patterns: fork bombs, backdoors, log manipulation
|
|
81
|
+
- Sensitive file access: /etc/passwd, /etc/shadow, /etc/sudoers
|
|
82
|
+
|
|
83
|
+
### Special Cases
|
|
84
|
+
- rm -rf safety: Allows deletions in safe paths (/Users/melvynx/Developer/, /tmp/)
|
|
85
|
+
- Protected paths: Blocks dangerous operations on /etc, /usr, /bin, etc.
|
|
86
|
+
- Binary content detection
|
|
87
|
+
- Command length limits
|
|
88
|
+
|
|
89
|
+
## Architecture
|
|
90
|
+
|
|
91
|
+
```
|
|
92
|
+
src/
|
|
93
|
+
├── cli.ts # CLI entry point (used by Claude Code hook)
|
|
94
|
+
├── lib/
|
|
95
|
+
│ ├── types.ts # TypeScript interfaces
|
|
96
|
+
│ ├── security-rules.ts # Security rules database
|
|
97
|
+
│ └── validator.ts # Core validation logic
|
|
98
|
+
└── __tests__/
|
|
99
|
+
└── validator.test.ts # Comprehensive test suite
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Security Rules
|
|
103
|
+
|
|
104
|
+
### Critical Commands
|
|
105
|
+
- `del`, `format`, `mkfs`, `shred`, `dd`, `fdisk`, `parted`
|
|
106
|
+
|
|
107
|
+
### Privilege Escalation
|
|
108
|
+
- `sudo`, `su`, `passwd`, `chpasswd`, `usermod`, `chmod`, `chown`
|
|
109
|
+
|
|
110
|
+
### Network Commands
|
|
111
|
+
- `nc`, `netcat`, `nmap`, `telnet`, `ssh-keygen`, `iptables`
|
|
112
|
+
|
|
113
|
+
### System Manipulation
|
|
114
|
+
- `systemctl`, `service`, `kill`, `killall`, `mount`, `umount`
|
|
115
|
+
|
|
116
|
+
### Protected Paths
|
|
117
|
+
- `/etc/`, `/usr/`, `/sbin/`, `/boot/`, `/sys/`, `/proc/`, `/dev/`, `/root/`
|
|
118
|
+
|
|
119
|
+
## Security Logs
|
|
120
|
+
|
|
121
|
+
Security events are logged to `data/security.log` inside the package directory. The log file contains:
|
|
122
|
+
- Timestamp
|
|
123
|
+
- Session ID
|
|
124
|
+
- Tool name
|
|
125
|
+
- Command (truncated to 500 chars)
|
|
126
|
+
- Blocked/allowed status
|
|
127
|
+
- Severity level
|
|
128
|
+
- Violations detected
|
|
129
|
+
|
|
130
|
+
The `data/` folder is gitignored to prevent committing sensitive log data.
|
|
131
|
+
|
|
132
|
+
## Development
|
|
133
|
+
|
|
134
|
+
```bash
|
|
135
|
+
# Run linter
|
|
136
|
+
bun run lint
|
|
137
|
+
|
|
138
|
+
# Format code
|
|
139
|
+
bun run format
|
|
140
|
+
|
|
141
|
+
# Type check
|
|
142
|
+
bunx tsc --noEmit
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## License
|
|
146
|
+
|
|
147
|
+
MIT
|
package/src/config/claude-code-config/scripts/command-validator/src/__tests__/validator.test.ts
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { describe, expect, it } from "bun:test";
|
|
2
|
+
import { CommandValidator } from "../lib/validator";
|
|
3
|
+
|
|
4
|
+
describe("CommandValidator", () => {
|
|
5
|
+
const validator = new CommandValidator();
|
|
6
|
+
|
|
7
|
+
describe("Commands that MUST be ALLOWED (action: allow)", () => {
|
|
8
|
+
const allowedCommands = [
|
|
9
|
+
"ls -la",
|
|
10
|
+
"pwd",
|
|
11
|
+
"git status",
|
|
12
|
+
"git add -A && git commit -m 'Clé API Google gérée côté client'",
|
|
13
|
+
"npm install",
|
|
14
|
+
"rm file.txt",
|
|
15
|
+
"rm -r folder",
|
|
16
|
+
"rm -f file.txt",
|
|
17
|
+
"echo 'éàù accents français'",
|
|
18
|
+
"git commit -m '🚀 emoji test'",
|
|
19
|
+
"cat /etc/passwd",
|
|
20
|
+
"curl http://example.com",
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
for (const command of allowedCommands) {
|
|
24
|
+
it(`should ALLOW: ${command}`, () => {
|
|
25
|
+
const result = validator.validate(command);
|
|
26
|
+
expect(result.isValid).toBe(true);
|
|
27
|
+
expect(result.action).toBe("allow");
|
|
28
|
+
expect(result.violations).toHaveLength(0);
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
describe("Commands that MUST be DENIED (action: deny) - rm -rf ONLY", () => {
|
|
34
|
+
const deniedCommands = [
|
|
35
|
+
"rm -rf /",
|
|
36
|
+
"rm -rf folder",
|
|
37
|
+
"rm -rf .",
|
|
38
|
+
"rm -rf /tmp/test",
|
|
39
|
+
"rm -fr folder",
|
|
40
|
+
"rm -r -f folder",
|
|
41
|
+
"rm -f -r folder",
|
|
42
|
+
"rm -rf /Users/test/.claude/skills",
|
|
43
|
+
"mkdir test && rm -rf test",
|
|
44
|
+
];
|
|
45
|
+
|
|
46
|
+
for (const command of deniedCommands) {
|
|
47
|
+
it(`should DENY: ${command}`, () => {
|
|
48
|
+
const result = validator.validate(command);
|
|
49
|
+
expect(result.isValid).toBe(false);
|
|
50
|
+
expect(result.action).toBe("deny");
|
|
51
|
+
expect(result.severity).toBe("CRITICAL");
|
|
52
|
+
expect(result.violations[0]).toContain("rm -rf is forbidden");
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
describe("Commands that MUST ASK permission (action: ask)", () => {
|
|
58
|
+
const askCommands = [
|
|
59
|
+
{ cmd: "sudo apt install", expected: "sudo" },
|
|
60
|
+
{ cmd: "sudo rm something", expected: "sudo" },
|
|
61
|
+
{ cmd: "chmod 777 file.txt", expected: "chmod" },
|
|
62
|
+
{ cmd: "chown root file.txt", expected: "chown" },
|
|
63
|
+
{ cmd: "dd if=/dev/zero of=test.img", expected: "dd" },
|
|
64
|
+
{ cmd: "kill -9 1234", expected: "kill" },
|
|
65
|
+
{ cmd: "killall node", expected: "killall" },
|
|
66
|
+
{ cmd: "su root", expected: "su" },
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
for (const { cmd, expected } of askCommands) {
|
|
70
|
+
it(`should ASK for: ${cmd}`, () => {
|
|
71
|
+
const result = validator.validate(cmd);
|
|
72
|
+
expect(result.isValid).toBe(false);
|
|
73
|
+
expect(result.action).toBe("ask");
|
|
74
|
+
expect(result.severity).toBe("HIGH");
|
|
75
|
+
expect(result.violations[0]).toContain(expected);
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
describe("Edge cases", () => {
|
|
81
|
+
it("should DENY empty commands", () => {
|
|
82
|
+
const result = validator.validate("");
|
|
83
|
+
expect(result.isValid).toBe(false);
|
|
84
|
+
expect(result.action).toBe("deny");
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it("should ALLOW commands with accented characters", () => {
|
|
88
|
+
const result = validator.validate("git commit -m 'éàùç accents'");
|
|
89
|
+
expect(result.isValid).toBe(true);
|
|
90
|
+
expect(result.action).toBe("allow");
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it("should ALLOW commands with emojis", () => {
|
|
94
|
+
const result = validator.validate("echo '🚀🎉'");
|
|
95
|
+
expect(result.isValid).toBe(true);
|
|
96
|
+
expect(result.action).toBe("allow");
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
});
|