@macpaw/cctk 1.0.0-beta.1
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 +142 -0
- package/bin/index.js +5 -0
- package/dist/index.js +1 -0
- package/package.json +65 -0
- package/templates/claude/agents/brainstormer.md +113 -0
- package/templates/claude/agents/code-reviewer.md +157 -0
- package/templates/claude/agents/copywriter.md +110 -0
- package/templates/claude/agents/database-admin.md +92 -0
- package/templates/claude/agents/debugger.md +137 -0
- package/templates/claude/agents/docs-manager.md +208 -0
- package/templates/claude/agents/fullstack-developer.md +95 -0
- package/templates/claude/agents/git-manager.md +394 -0
- package/templates/claude/agents/journal-writer.md +113 -0
- package/templates/claude/agents/mcp-manager.md +89 -0
- package/templates/claude/agents/planner.md +108 -0
- package/templates/claude/agents/project-manager.md +125 -0
- package/templates/claude/agents/registry.json +304 -0
- package/templates/claude/agents/researcher.md +37 -0
- package/templates/claude/agents/scout-external.md +140 -0
- package/templates/claude/agents/scout.md +106 -0
- package/templates/claude/agents/tester.md +105 -0
- package/templates/claude/agents/ui-ux-designer.md +208 -0
- package/templates/claude/commands/ask.md +56 -0
- package/templates/claude/commands/bootstrap/auto/fast.md +106 -0
- package/templates/claude/commands/bootstrap/auto/parallel.md +64 -0
- package/templates/claude/commands/bootstrap/auto.md +110 -0
- package/templates/claude/commands/bootstrap.md +130 -0
- package/templates/claude/commands/brainstorm.md +75 -0
- package/templates/claude/commands/code/auto.md +198 -0
- package/templates/claude/commands/code/no-test.md +172 -0
- package/templates/claude/commands/code/parallel.md +100 -0
- package/templates/claude/commands/code.md +197 -0
- package/templates/claude/commands/coding-level.md +37 -0
- package/templates/claude/commands/content/cro.md +41 -0
- package/templates/claude/commands/content/enhance.md +12 -0
- package/templates/claude/commands/content/fast.md +11 -0
- package/templates/claude/commands/content/good.md +14 -0
- package/templates/claude/commands/cook/auto/fast.md +26 -0
- package/templates/claude/commands/cook/auto/parallel.md +49 -0
- package/templates/claude/commands/cook/auto.md +15 -0
- package/templates/claude/commands/cook.md +101 -0
- package/templates/claude/commands/debug.md +13 -0
- package/templates/claude/commands/docs/init.md +37 -0
- package/templates/claude/commands/docs/summarize.md +22 -0
- package/templates/claude/commands/docs/update.md +78 -0
- package/templates/claude/commands/fix/ci.md +17 -0
- package/templates/claude/commands/fix/fast.md +18 -0
- package/templates/claude/commands/fix/hard.md +35 -0
- package/templates/claude/commands/fix/logs.md +26 -0
- package/templates/claude/commands/fix/parallel.md +54 -0
- package/templates/claude/commands/fix/test.md +20 -0
- package/templates/claude/commands/fix/types.md +9 -0
- package/templates/claude/commands/fix/ui.md +33 -0
- package/templates/claude/commands/fix.md +43 -0
- package/templates/claude/commands/git/cm.md +5 -0
- package/templates/claude/commands/git/cp.md +4 -0
- package/templates/claude/commands/git/merge.md +40 -0
- package/templates/claude/commands/git/pr.md +50 -0
- package/templates/claude/commands/journal.md +7 -0
- package/templates/claude/commands/kanban.md +99 -0
- package/templates/claude/commands/plan/archive.md +57 -0
- package/templates/claude/commands/plan/ci.md +33 -0
- package/templates/claude/commands/plan/cro.md +67 -0
- package/templates/claude/commands/plan/fast.md +66 -0
- package/templates/claude/commands/plan/hard.md +92 -0
- package/templates/claude/commands/plan/parallel.md +129 -0
- package/templates/claude/commands/plan/two.md +45 -0
- package/templates/claude/commands/plan/validate.md +117 -0
- package/templates/claude/commands/plan.md +30 -0
- package/templates/claude/commands/preview.md +87 -0
- package/templates/claude/commands/registry.json +313 -0
- package/templates/claude/commands/review/codebase/parallel.md +122 -0
- package/templates/claude/commands/review/codebase.md +47 -0
- package/templates/claude/commands/scout/ext.md +35 -0
- package/templates/claude/commands/scout.md +28 -0
- package/templates/claude/commands/skill/add.md +36 -0
- package/templates/claude/commands/skill/create.md +29 -0
- package/templates/claude/commands/skill/fix-logs.md +22 -0
- package/templates/claude/commands/skill/optimize/auto.md +25 -0
- package/templates/claude/commands/skill/optimize.md +34 -0
- package/templates/claude/commands/skill/plan.md +45 -0
- package/templates/claude/commands/test/ui.md +91 -0
- package/templates/claude/commands/test.md +8 -0
- package/templates/claude/commands/use-mcp.md +34 -0
- package/templates/claude/commands/watzup.md +8 -0
- package/templates/claude/commands/worktree.md +126 -0
- package/templates/claude/hooks/dev-rules-reminder.cjs +258 -0
- package/templates/claude/hooks/docs/README.md +42 -0
- package/templates/claude/hooks/lib/cctk-config-utils.cjs +751 -0
- package/templates/claude/hooks/lib/cctk-paths.cjs +106 -0
- package/templates/claude/hooks/lib/context-tracker.cjs +346 -0
- package/templates/claude/hooks/privacy-block.cjs +289 -0
- package/templates/claude/hooks/registry.json +77 -0
- package/templates/claude/hooks/scout-block/broad-pattern-detector.cjs +293 -0
- package/templates/claude/hooks/scout-block/error-formatter.cjs +156 -0
- package/templates/claude/hooks/scout-block/path-extractor.cjs +359 -0
- package/templates/claude/hooks/scout-block/pattern-matcher.cjs +184 -0
- package/templates/claude/hooks/scout-block/vendor/ignore.js +626 -0
- package/templates/claude/hooks/scout-block.cjs +167 -0
- package/templates/claude/hooks/session-end.cjs +35 -0
- package/templates/claude/hooks/session-init.cjs +214 -0
- package/templates/claude/hooks/subagent-init.cjs +161 -0
- package/templates/claude/hooks/write-compact-marker.cjs +153 -0
- package/templates/claude/output-styles/coding-level-1.md +148 -0
- package/templates/claude/output-styles/coding-level-2.md +159 -0
- package/templates/claude/output-styles/coding-level-3.md +91 -0
- package/templates/claude/scripts/README.md +33 -0
- package/templates/claude/scripts/generate-catalogs.cjs +318 -0
- package/templates/claude/scripts/registry.json +48 -0
- package/templates/claude/scripts/set-active-plan.cjs +45 -0
- package/templates/claude/scripts/validate-docs.cjs +447 -0
- package/templates/claude/scripts/worktree.cjs +658 -0
- package/templates/claude/skills/README.md +112 -0
- package/templates/claude/skills/ai-artist/SKILL.md +75 -0
- package/templates/claude/skills/ai-artist/references/advanced-techniques.md +184 -0
- package/templates/claude/skills/ai-artist/references/domain-code.md +66 -0
- package/templates/claude/skills/ai-artist/references/domain-data.md +72 -0
- package/templates/claude/skills/ai-artist/references/domain-marketing.md +66 -0
- package/templates/claude/skills/ai-artist/references/domain-patterns.md +33 -0
- package/templates/claude/skills/ai-artist/references/domain-writing.md +68 -0
- package/templates/claude/skills/ai-artist/references/image-prompting.md +141 -0
- package/templates/claude/skills/ai-artist/references/llm-prompting.md +165 -0
- package/templates/claude/skills/ai-artist/references/nano-banana.md +59 -0
- package/templates/claude/skills/ai-artist/references/reasoning-techniques.md +201 -0
- package/templates/claude/skills/backend-development/SKILL.md +95 -0
- package/templates/claude/skills/backend-development/references/backend-api-design.md +495 -0
- package/templates/claude/skills/backend-development/references/backend-architecture.md +454 -0
- package/templates/claude/skills/backend-development/references/backend-authentication.md +338 -0
- package/templates/claude/skills/backend-development/references/backend-code-quality.md +659 -0
- package/templates/claude/skills/backend-development/references/backend-debugging.md +904 -0
- package/templates/claude/skills/backend-development/references/backend-devops.md +494 -0
- package/templates/claude/skills/backend-development/references/backend-mindset.md +387 -0
- package/templates/claude/skills/backend-development/references/backend-performance.md +397 -0
- package/templates/claude/skills/backend-development/references/backend-security.md +290 -0
- package/templates/claude/skills/backend-development/references/backend-technologies.md +256 -0
- package/templates/claude/skills/backend-development/references/backend-testing.md +429 -0
- package/templates/claude/skills/better-auth/SKILL.md +204 -0
- package/templates/claude/skills/better-auth/references/advanced-features.md +553 -0
- package/templates/claude/skills/better-auth/references/database-integration.md +577 -0
- package/templates/claude/skills/better-auth/references/email-password-auth.md +416 -0
- package/templates/claude/skills/better-auth/references/oauth-providers.md +430 -0
- package/templates/claude/skills/better-auth/scripts/better_auth_init.py +521 -0
- package/templates/claude/skills/chrome-devtools/SKILL.md +473 -0
- package/templates/claude/skills/chrome-devtools/references/cdp-domains.md +694 -0
- package/templates/claude/skills/chrome-devtools/references/performance-guide.md +940 -0
- package/templates/claude/skills/chrome-devtools/references/puppeteer-reference.md +953 -0
- package/templates/claude/skills/chrome-devtools/scripts/README.md +288 -0
- package/templates/claude/skills/chrome-devtools/scripts/aria-snapshot.js +368 -0
- package/templates/claude/skills/chrome-devtools/scripts/click.js +92 -0
- package/templates/claude/skills/chrome-devtools/scripts/console.js +85 -0
- package/templates/claude/skills/chrome-devtools/scripts/evaluate.js +59 -0
- package/templates/claude/skills/chrome-devtools/scripts/fill.js +84 -0
- package/templates/claude/skills/chrome-devtools/scripts/inject-auth.js +247 -0
- package/templates/claude/skills/chrome-devtools/scripts/install-deps.sh +11 -0
- package/templates/claude/skills/chrome-devtools/scripts/install.sh +36 -0
- package/templates/claude/skills/chrome-devtools/scripts/lib/browser.js +335 -0
- package/templates/claude/skills/chrome-devtools/scripts/lib/selector.js +183 -0
- package/templates/claude/skills/chrome-devtools/scripts/navigate.js +60 -0
- package/templates/claude/skills/chrome-devtools/scripts/network.js +113 -0
- package/templates/claude/skills/chrome-devtools/scripts/package.json +16 -0
- package/templates/claude/skills/chrome-devtools/scripts/performance.js +159 -0
- package/templates/claude/skills/chrome-devtools/scripts/screenshot.js +212 -0
- package/templates/claude/skills/chrome-devtools/scripts/select-ref.js +151 -0
- package/templates/claude/skills/chrome-devtools/scripts/snapshot.js +143 -0
- package/templates/claude/skills/chrome-devtools/scripts/ws-debug.js +47 -0
- package/templates/claude/skills/chrome-devtools/scripts/ws-full-debug.js +115 -0
- package/templates/claude/skills/claude-code/references/advanced-features.md +399 -0
- package/templates/claude/skills/claude-code/references/agent-skills.md +399 -0
- package/templates/claude/skills/claude-code/references/api-reference.md +498 -0
- package/templates/claude/skills/claude-code/references/best-practices.md +447 -0
- package/templates/claude/skills/claude-code/references/cicd-integration.md +428 -0
- package/templates/claude/skills/claude-code/references/common-workflows.md +107 -0
- package/templates/claude/skills/claude-code/references/configuration.md +480 -0
- package/templates/claude/skills/claude-code/references/enterprise-features.md +472 -0
- package/templates/claude/skills/claude-code/references/getting-started.md +244 -0
- package/templates/claude/skills/claude-code/references/hooks-and-plugins.md +444 -0
- package/templates/claude/skills/claude-code/references/hooks-comprehensive.md +622 -0
- package/templates/claude/skills/claude-code/references/ide-integration.md +316 -0
- package/templates/claude/skills/claude-code/references/mcp-integration.md +386 -0
- package/templates/claude/skills/claude-code/references/slash-commands.md +460 -0
- package/templates/claude/skills/claude-code/references/troubleshooting.md +455 -0
- package/templates/claude/skills/claude-code/skill.md +60 -0
- package/templates/claude/skills/code-review/SKILL.md +143 -0
- package/templates/claude/skills/code-review/references/code-review-reception.md +209 -0
- package/templates/claude/skills/code-review/references/requesting-code-review.md +105 -0
- package/templates/claude/skills/code-review/references/verification-before-completion.md +139 -0
- package/templates/claude/skills/context-engineering/SKILL.md +86 -0
- package/templates/claude/skills/context-engineering/references/context-compression.md +84 -0
- package/templates/claude/skills/context-engineering/references/context-degradation.md +93 -0
- package/templates/claude/skills/context-engineering/references/context-fundamentals.md +75 -0
- package/templates/claude/skills/context-engineering/references/context-optimization.md +82 -0
- package/templates/claude/skills/context-engineering/references/evaluation.md +89 -0
- package/templates/claude/skills/context-engineering/references/memory-systems.md +88 -0
- package/templates/claude/skills/context-engineering/references/multi-agent-patterns.md +90 -0
- package/templates/claude/skills/context-engineering/references/project-development.md +97 -0
- package/templates/claude/skills/context-engineering/references/tool-design.md +86 -0
- package/templates/claude/skills/context-engineering/scripts/compression_evaluator.py +329 -0
- package/templates/claude/skills/context-engineering/scripts/context_analyzer.py +294 -0
- package/templates/claude/skills/databases/SKILL.md +232 -0
- package/templates/claude/skills/databases/references/mongodb-aggregation.md +447 -0
- package/templates/claude/skills/databases/references/mongodb-atlas.md +465 -0
- package/templates/claude/skills/databases/references/mongodb-crud.md +408 -0
- package/templates/claude/skills/databases/references/mongodb-indexing.md +442 -0
- package/templates/claude/skills/databases/references/postgresql-administration.md +594 -0
- package/templates/claude/skills/databases/references/postgresql-performance.md +527 -0
- package/templates/claude/skills/databases/references/postgresql-psql-cli.md +467 -0
- package/templates/claude/skills/databases/references/postgresql-queries.md +475 -0
- package/templates/claude/skills/databases/scripts/db_backup.py +502 -0
- package/templates/claude/skills/databases/scripts/db_migrate.py +414 -0
- package/templates/claude/skills/databases/scripts/db_performance_check.py +445 -0
- package/templates/claude/skills/debugging/SKILL.md +84 -0
- package/templates/claude/skills/debugging/references/defense-in-depth.md +124 -0
- package/templates/claude/skills/debugging/references/root-cause-tracing.md +122 -0
- package/templates/claude/skills/debugging/references/systematic-debugging.md +102 -0
- package/templates/claude/skills/debugging/references/verification.md +123 -0
- package/templates/claude/skills/debugging/scripts/find-polluter.sh +63 -0
- package/templates/claude/skills/debugging/scripts/find-polluter.test.md +102 -0
- package/templates/claude/skills/devops/SKILL.md +293 -0
- package/templates/claude/skills/devops/references/browser-rendering.md +305 -0
- package/templates/claude/skills/devops/references/cloudflare-d1-kv.md +123 -0
- package/templates/claude/skills/devops/references/cloudflare-platform.md +271 -0
- package/templates/claude/skills/devops/references/cloudflare-r2-storage.md +280 -0
- package/templates/claude/skills/devops/references/cloudflare-workers-advanced.md +312 -0
- package/templates/claude/skills/devops/references/cloudflare-workers-apis.md +309 -0
- package/templates/claude/skills/devops/references/cloudflare-workers-basics.md +418 -0
- package/templates/claude/skills/devops/references/docker-basics.md +297 -0
- package/templates/claude/skills/devops/references/docker-compose.md +292 -0
- package/templates/claude/skills/devops/references/gcloud-platform.md +307 -0
- package/templates/claude/skills/devops/references/gcloud-services.md +304 -0
- package/templates/claude/skills/devops/scripts/cloudflare_deploy.py +269 -0
- package/templates/claude/skills/devops/scripts/docker_optimize.py +320 -0
- package/templates/claude/skills/docs-seeker/SKILL.md +95 -0
- package/templates/claude/skills/docs-seeker/package.json +24 -0
- package/templates/claude/skills/docs-seeker/references/advanced.md +78 -0
- package/templates/claude/skills/docs-seeker/references/context7-patterns.md +68 -0
- package/templates/claude/skills/docs-seeker/references/errors.md +68 -0
- package/templates/claude/skills/docs-seeker/scripts/analyze-llms-txt.js +245 -0
- package/templates/claude/skills/docs-seeker/scripts/detect-topic.js +172 -0
- package/templates/claude/skills/docs-seeker/scripts/fetch-docs.js +212 -0
- package/templates/claude/skills/docs-seeker/workflows/library-search.md +87 -0
- package/templates/claude/skills/docs-seeker/workflows/repo-analysis.md +91 -0
- package/templates/claude/skills/docs-seeker/workflows/topic-search.md +77 -0
- package/templates/claude/skills/frontend-design/SKILL.md +85 -0
- package/templates/claude/skills/frontend-design/references/analysis-best-practices.md +80 -0
- package/templates/claude/skills/frontend-design/references/analysis-prompts.md +141 -0
- package/templates/claude/skills/frontend-design/references/analysis-techniques.md +118 -0
- package/templates/claude/skills/frontend-design/references/animejs.md +396 -0
- package/templates/claude/skills/frontend-design/references/design-extraction-overview.md +71 -0
- package/templates/claude/skills/frontend-design/references/extraction-best-practices.md +141 -0
- package/templates/claude/skills/frontend-design/references/extraction-output-templates.md +162 -0
- package/templates/claude/skills/frontend-design/references/extraction-prompts.md +127 -0
- package/templates/claude/skills/frontend-design/references/technical-accessibility.md +119 -0
- package/templates/claude/skills/frontend-design/references/technical-best-practices.md +97 -0
- package/templates/claude/skills/frontend-design/references/technical-optimization.md +44 -0
- package/templates/claude/skills/frontend-design/references/technical-overview.md +90 -0
- package/templates/claude/skills/frontend-design/references/technical-workflows.md +150 -0
- package/templates/claude/skills/frontend-design/references/visual-analysis-overview.md +95 -0
- package/templates/claude/skills/frontend-development/SKILL.md +399 -0
- package/templates/claude/skills/frontend-development/resources/common-patterns.md +331 -0
- package/templates/claude/skills/frontend-development/resources/complete-examples.md +872 -0
- package/templates/claude/skills/frontend-development/resources/component-patterns.md +502 -0
- package/templates/claude/skills/frontend-development/resources/data-fetching.md +767 -0
- package/templates/claude/skills/frontend-development/resources/file-organization.md +502 -0
- package/templates/claude/skills/frontend-development/resources/loading-and-error-states.md +501 -0
- package/templates/claude/skills/frontend-development/resources/performance.md +406 -0
- package/templates/claude/skills/frontend-development/resources/routing-guide.md +364 -0
- package/templates/claude/skills/frontend-development/resources/styling-guide.md +428 -0
- package/templates/claude/skills/frontend-development/resources/typescript-standards.md +418 -0
- package/templates/claude/skills/markdown-novel-viewer/SKILL.md +272 -0
- package/templates/claude/skills/markdown-novel-viewer/assets/directory-browser.css +215 -0
- package/templates/claude/skills/markdown-novel-viewer/assets/favicon.png +0 -0
- package/templates/claude/skills/markdown-novel-viewer/assets/novel-theme.css +872 -0
- package/templates/claude/skills/markdown-novel-viewer/assets/reader.js +378 -0
- package/templates/claude/skills/markdown-novel-viewer/assets/template.html +85 -0
- package/templates/claude/skills/markdown-novel-viewer/package.json +15 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/lib/http-server.cjs +434 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/lib/markdown-renderer.cjs +335 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/lib/plan-navigator.cjs +509 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/lib/port-finder.cjs +49 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/lib/process-mgr.cjs +150 -0
- package/templates/claude/skills/markdown-novel-viewer/scripts/server.cjs +398 -0
- package/templates/claude/skills/mcp-builder/SKILL.md +328 -0
- package/templates/claude/skills/mcp-builder/reference/evaluation.md +602 -0
- package/templates/claude/skills/mcp-builder/reference/mcp_best_practices.md +915 -0
- package/templates/claude/skills/mcp-builder/reference/node_mcp_server.md +916 -0
- package/templates/claude/skills/mcp-builder/reference/python_mcp_server.md +752 -0
- package/templates/claude/skills/mcp-builder/scripts/connections.py +151 -0
- package/templates/claude/skills/mcp-builder/scripts/evaluation.py +381 -0
- package/templates/claude/skills/mcp-builder/scripts/example_evaluation.xml +22 -0
- package/templates/claude/skills/mcp-builder/scripts/requirements.txt +2 -0
- package/templates/claude/skills/mcp-management/README.md +219 -0
- package/templates/claude/skills/mcp-management/SKILL.md +209 -0
- package/templates/claude/skills/mcp-management/assets/tools.json +3146 -0
- package/templates/claude/skills/mcp-management/references/configuration.md +114 -0
- package/templates/claude/skills/mcp-management/references/gemini-cli-integration.md +209 -0
- package/templates/claude/skills/mcp-management/references/mcp-protocol.md +116 -0
- package/templates/claude/skills/mcp-management/scripts/.env.example +10 -0
- package/templates/claude/skills/mcp-management/scripts/cli.ts +202 -0
- package/templates/claude/skills/mcp-management/scripts/mcp-client.ts +247 -0
- package/templates/claude/skills/mcp-management/scripts/package.json +20 -0
- package/templates/claude/skills/mcp-management/scripts/tsconfig.json +15 -0
- package/templates/claude/skills/media-processing/SKILL.md +91 -0
- package/templates/claude/skills/media-processing/references/common-workflows.md +132 -0
- package/templates/claude/skills/media-processing/references/ffmpeg-encoding.md +358 -0
- package/templates/claude/skills/media-processing/references/ffmpeg-filters.md +503 -0
- package/templates/claude/skills/media-processing/references/ffmpeg-streaming.md +395 -0
- package/templates/claude/skills/media-processing/references/format-compatibility.md +375 -0
- package/templates/claude/skills/media-processing/references/imagemagick-batch.md +612 -0
- package/templates/claude/skills/media-processing/references/imagemagick-editing.md +623 -0
- package/templates/claude/skills/media-processing/references/rmbg-background-removal.md +66 -0
- package/templates/claude/skills/media-processing/references/troubleshooting.md +109 -0
- package/templates/claude/skills/media-processing/scripts/README.md +102 -0
- package/templates/claude/skills/media-processing/scripts/batch-remove-background.sh +124 -0
- package/templates/claude/skills/media-processing/scripts/batch_resize.py +342 -0
- package/templates/claude/skills/media-processing/scripts/media_convert.py +311 -0
- package/templates/claude/skills/media-processing/scripts/remove-background.sh +96 -0
- package/templates/claude/skills/media-processing/scripts/remove-bg-node.js +181 -0
- package/templates/claude/skills/mermaidjs-v11/SKILL.md +115 -0
- package/templates/claude/skills/mermaidjs-v11/references/cli-usage.md +228 -0
- package/templates/claude/skills/mermaidjs-v11/references/configuration.md +232 -0
- package/templates/claude/skills/mermaidjs-v11/references/diagram-types.md +315 -0
- package/templates/claude/skills/mermaidjs-v11/references/examples.md +344 -0
- package/templates/claude/skills/mermaidjs-v11/references/integration.md +310 -0
- package/templates/claude/skills/planning/SKILL.md +115 -0
- package/templates/claude/skills/planning/references/codebase-understanding.md +62 -0
- package/templates/claude/skills/planning/references/output-standards.md +127 -0
- package/templates/claude/skills/planning/references/plan-organization.md +150 -0
- package/templates/claude/skills/planning/references/research-phase.md +49 -0
- package/templates/claude/skills/planning/references/solution-design.md +63 -0
- package/templates/claude/skills/plans-kanban/SKILL.md +157 -0
- package/templates/claude/skills/plans-kanban/assets/dashboard-template.html +119 -0
- package/templates/claude/skills/plans-kanban/assets/dashboard.css +1594 -0
- package/templates/claude/skills/plans-kanban/assets/dashboard.js +659 -0
- package/templates/claude/skills/plans-kanban/assets/favicon.png +0 -0
- package/templates/claude/skills/plans-kanban/package.json +13 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/dashboard-renderer.cjs +941 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/http-server.cjs +310 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/plan-metadata-extractor.cjs +489 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/plan-parser.cjs +194 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/plan-scanner.cjs +277 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/port-finder.cjs +49 -0
- package/templates/claude/skills/plans-kanban/scripts/lib/process-mgr.cjs +128 -0
- package/templates/claude/skills/plans-kanban/scripts/server.cjs +249 -0
- package/templates/claude/skills/problem-solving/SKILL.md +96 -0
- package/templates/claude/skills/problem-solving/references/attribution.md +69 -0
- package/templates/claude/skills/problem-solving/references/collision-zone-thinking.md +79 -0
- package/templates/claude/skills/problem-solving/references/inversion-exercise.md +91 -0
- package/templates/claude/skills/problem-solving/references/meta-pattern-recognition.md +87 -0
- package/templates/claude/skills/problem-solving/references/scale-game.md +95 -0
- package/templates/claude/skills/problem-solving/references/simplification-cascades.md +80 -0
- package/templates/claude/skills/problem-solving/references/when-stuck.md +72 -0
- package/templates/claude/skills/registry.json +258 -0
- package/templates/claude/skills/repomix/SKILL.md +247 -0
- package/templates/claude/skills/repomix/references/configuration.md +211 -0
- package/templates/claude/skills/repomix/references/usage-patterns.md +232 -0
- package/templates/claude/skills/repomix/scripts/README.md +179 -0
- package/templates/claude/skills/repomix/scripts/repomix_batch.py +455 -0
- package/templates/claude/skills/repomix/scripts/repos.example.json +15 -0
- package/templates/claude/skills/research/SKILL.md +168 -0
- package/templates/claude/skills/sequential-thinking/.env.example +8 -0
- package/templates/claude/skills/sequential-thinking/README.md +183 -0
- package/templates/claude/skills/sequential-thinking/SKILL.md +94 -0
- package/templates/claude/skills/sequential-thinking/package.json +31 -0
- package/templates/claude/skills/sequential-thinking/references/advanced-strategies.md +79 -0
- package/templates/claude/skills/sequential-thinking/references/advanced-techniques.md +76 -0
- package/templates/claude/skills/sequential-thinking/references/core-patterns.md +95 -0
- package/templates/claude/skills/sequential-thinking/references/examples-api.md +88 -0
- package/templates/claude/skills/sequential-thinking/references/examples-architecture.md +94 -0
- package/templates/claude/skills/sequential-thinking/references/examples-debug.md +90 -0
- package/templates/claude/skills/sequential-thinking/scripts/format-thought.js +182 -0
- package/templates/claude/skills/sequential-thinking/scripts/process-thought.js +252 -0
- package/templates/claude/skills/skill-creator/LICENSE.txt +202 -0
- package/templates/claude/skills/skill-creator/SKILL.md +266 -0
- package/templates/claude/skills/skill-creator/references/agent-skills-spec.md +51 -0
- package/templates/claude/skills/skill-creator/scripts/encoding_utils.py +21 -0
- package/templates/claude/skills/skill-creator/scripts/init_skill.py +304 -0
- package/templates/claude/skills/skill-creator/scripts/package_skill.py +110 -0
- package/templates/claude/skills/skill-creator/scripts/quick_validate.py +66 -0
- package/templates/claude/skills/template-skill/SKILL.md +6 -0
- package/templates/claude/skills/vitest/SKILL.md +595 -0
- package/templates/claude/skills/vitest/references/async-patterns.md +82 -0
- package/templates/claude/skills/vitest/references/mock-patterns.md +78 -0
- package/templates/claude/skills/vitest/references/monorepo-setup.md +185 -0
- package/templates/claude/skills/vitest/references/turborepo-setup.md +332 -0
- package/templates/claude/skills/web-frameworks/SKILL.md +324 -0
- package/templates/claude/skills/web-frameworks/references/nextjs-app-router.md +465 -0
- package/templates/claude/skills/web-frameworks/references/nextjs-data-fetching.md +459 -0
- package/templates/claude/skills/web-frameworks/references/nextjs-optimization.md +511 -0
- package/templates/claude/skills/web-frameworks/references/nextjs-server-components.md +495 -0
- package/templates/claude/skills/web-frameworks/references/remix-icon-integration.md +603 -0
- package/templates/claude/skills/web-frameworks/references/turborepo-caching.md +551 -0
- package/templates/claude/skills/web-frameworks/references/turborepo-pipelines.md +517 -0
- package/templates/claude/skills/web-frameworks/references/turborepo-setup.md +542 -0
- package/templates/claude/skills/web-frameworks/scripts/nextjs_init.py +547 -0
- package/templates/claude/skills/web-frameworks/scripts/turborepo_migrate.py +394 -0
- package/templates/claude/workflows/development-rules.md +40 -0
- package/templates/claude/workflows/documentation-management.md +121 -0
- package/templates/claude/workflows/orchestration-protocol.md +16 -0
- package/templates/claude/workflows/primary-workflow.md +45 -0
- package/templates/claude/workflows/registry.json +37 -0
- package/templates/common/.cct.json +41 -0
- package/templates/common/.cctkignore +22 -0
- package/templates/common/.env.example +39 -0
- package/templates/common/.mcp.json.example +16 -0
- package/templates/common/metadata.json +15 -0
- package/templates/common/settings.json +79 -0
- package/templates/common/statusline.cjs +271 -0
- package/templates/config/.repomixignore +22 -0
- package/templates/config/AGENTS.md +55 -0
- package/templates/config/CLAUDE.md +87 -0
- package/templates/plans/bug-fix-template.md +69 -0
- package/templates/plans/feature-implementation-template.md +84 -0
- package/templates/plans/refactor-template.md +82 -0
- package/templates/plans/template-usage-guide.md +58 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* error-formatter.cjs - Rich, actionable error messages for scout-block
|
|
4
|
+
*
|
|
5
|
+
* Follows CLI UX best practices: Problem + Reason + Solution
|
|
6
|
+
* Supports ANSI colors with NO_COLOR env var respect.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const path = require('node:path');
|
|
10
|
+
|
|
11
|
+
// ANSI color codes
|
|
12
|
+
const COLORS = {
|
|
13
|
+
red: '\u001B[31m',
|
|
14
|
+
yellow: '\u001B[33m',
|
|
15
|
+
blue: '\u001B[34m',
|
|
16
|
+
cyan: '\u001B[36m',
|
|
17
|
+
bold: '\u001B[1m',
|
|
18
|
+
dim: '\u001B[2m',
|
|
19
|
+
reset: '\u001B[0m',
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Check if terminal supports colors
|
|
24
|
+
* Respects NO_COLOR standard and FORCE_COLOR
|
|
25
|
+
*
|
|
26
|
+
* @returns {boolean}
|
|
27
|
+
*/
|
|
28
|
+
function supportsColor() {
|
|
29
|
+
// Respect NO_COLOR standard (https://no-color.org/)
|
|
30
|
+
if (process.env.NO_COLOR !== undefined) return false;
|
|
31
|
+
|
|
32
|
+
// Respect FORCE_COLOR
|
|
33
|
+
if (process.env.FORCE_COLOR !== undefined) return true;
|
|
34
|
+
|
|
35
|
+
// Check if stderr is TTY (we output errors to stderr)
|
|
36
|
+
return process.stderr.isTTY || false;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Apply color to text if supported
|
|
41
|
+
*
|
|
42
|
+
* @param {string} text - Text to colorize
|
|
43
|
+
* @param {string} color - Color name from COLORS
|
|
44
|
+
* @returns {string}
|
|
45
|
+
*/
|
|
46
|
+
function colorize(text, color) {
|
|
47
|
+
if (!supportsColor()) return text;
|
|
48
|
+
const colorCode = COLORS[color] || '';
|
|
49
|
+
|
|
50
|
+
return `${colorCode}${text}${COLORS.reset}`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Get .cctkignore config path
|
|
55
|
+
*
|
|
56
|
+
* @param {string} claudeDir - Path to .claude directory
|
|
57
|
+
* @returns {string}
|
|
58
|
+
*/
|
|
59
|
+
function formatConfigPath(claudeDir) {
|
|
60
|
+
if (claudeDir) {
|
|
61
|
+
return path.join(claudeDir, '.cctkignore');
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return '.claude/.cctkignore';
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Format a blocked path error with actionable guidance
|
|
69
|
+
*
|
|
70
|
+
* Pattern: What went wrong → Why → How to fix → Where to configure
|
|
71
|
+
*
|
|
72
|
+
* @param {Object} details - Error details
|
|
73
|
+
* @param {string} details.path - The blocked path
|
|
74
|
+
* @param {string} details.pattern - The pattern that matched
|
|
75
|
+
* @param {string} details.tool - The tool that was blocked
|
|
76
|
+
* @param {string} details.claudeDir - Path to .claude directory
|
|
77
|
+
* @returns {string}
|
|
78
|
+
*/
|
|
79
|
+
function formatBlockedError(details) {
|
|
80
|
+
const { path: blockedPath, pattern, tool, claudeDir } = details;
|
|
81
|
+
const configPath = formatConfigPath(claudeDir);
|
|
82
|
+
|
|
83
|
+
// Truncate path if too long
|
|
84
|
+
const displayPath = blockedPath.length > 60 ? `...${blockedPath.slice(-57)}` : blockedPath;
|
|
85
|
+
|
|
86
|
+
const lines = [
|
|
87
|
+
'',
|
|
88
|
+
`${colorize('NOTE:', 'cyan')} This is not an error - this block is intentional to optimize context.`,
|
|
89
|
+
'',
|
|
90
|
+
`${colorize('BLOCKED', 'red')}: Access to '${displayPath}' denied`,
|
|
91
|
+
'',
|
|
92
|
+
` ${colorize('Pattern:', 'yellow')} ${pattern}`,
|
|
93
|
+
` ${colorize('Tool:', 'yellow')} ${tool || 'unknown'}`,
|
|
94
|
+
'',
|
|
95
|
+
` ${colorize('To allow, add to', 'blue')} ${configPath}:`,
|
|
96
|
+
` !${pattern}`,
|
|
97
|
+
'',
|
|
98
|
+
` ${colorize('Config:', 'dim')} ${configPath}`,
|
|
99
|
+
'',
|
|
100
|
+
];
|
|
101
|
+
|
|
102
|
+
return lines.join('\n');
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Format a simple error message (one line, for piped output)
|
|
107
|
+
*
|
|
108
|
+
* @param {string} pattern - The pattern that matched
|
|
109
|
+
* @param {string} blockedPath - The path that was blocked
|
|
110
|
+
* @returns {string}
|
|
111
|
+
*/
|
|
112
|
+
function formatSimpleError(pattern, blockedPath) {
|
|
113
|
+
return `ERROR: Blocked pattern '${pattern}' matched path: ${blockedPath}`;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Format error for machine-readable output (exit code 2)
|
|
118
|
+
* Used when stderr is not a TTY
|
|
119
|
+
*
|
|
120
|
+
* @param {Object} details - Error details
|
|
121
|
+
* @returns {string}
|
|
122
|
+
*/
|
|
123
|
+
function formatMachineError(details) {
|
|
124
|
+
const { path: blockedPath, pattern, tool, claudeDir } = details;
|
|
125
|
+
const configPath = formatConfigPath(claudeDir);
|
|
126
|
+
|
|
127
|
+
return JSON.stringify({
|
|
128
|
+
error: 'BLOCKED',
|
|
129
|
+
path: blockedPath,
|
|
130
|
+
pattern,
|
|
131
|
+
tool,
|
|
132
|
+
config: configPath,
|
|
133
|
+
fix: `Add '!${pattern}' to ${configPath} to allow this path`,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Format a warning message (non-blocking)
|
|
139
|
+
*
|
|
140
|
+
* @param {string} message - Warning message
|
|
141
|
+
* @returns {string}
|
|
142
|
+
*/
|
|
143
|
+
function formatWarning(message) {
|
|
144
|
+
return `${colorize('WARN:', 'yellow')} ${message}`;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
module.exports = {
|
|
148
|
+
formatBlockedError,
|
|
149
|
+
formatSimpleError,
|
|
150
|
+
formatMachineError,
|
|
151
|
+
formatWarning,
|
|
152
|
+
formatConfigPath,
|
|
153
|
+
supportsColor,
|
|
154
|
+
colorize,
|
|
155
|
+
COLORS,
|
|
156
|
+
};
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* path-extractor.cjs - Extract paths from Claude Code tool inputs
|
|
4
|
+
*
|
|
5
|
+
* Extracts file_path, path, pattern params and parses Bash commands
|
|
6
|
+
* to find all path-like arguments.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Extract all paths from a tool_input object
|
|
11
|
+
* Handles: file_path, path, pattern params and command strings
|
|
12
|
+
*
|
|
13
|
+
* @param {Object} toolInput - The tool_input from hook JSON
|
|
14
|
+
* @returns {string[]} Array of extracted paths
|
|
15
|
+
*/
|
|
16
|
+
function extractFromToolInput(toolInput) {
|
|
17
|
+
const paths = [];
|
|
18
|
+
|
|
19
|
+
if (!toolInput || typeof toolInput !== 'object') {
|
|
20
|
+
return paths;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Direct path params (Read, Edit, Write, Grep, Glob tools)
|
|
24
|
+
const directParams = ['file_path', 'path', 'pattern'];
|
|
25
|
+
|
|
26
|
+
for (const param of directParams) {
|
|
27
|
+
if (toolInput[param] && typeof toolInput[param] === 'string') {
|
|
28
|
+
const normalized = normalizeExtractedPath(toolInput[param]);
|
|
29
|
+
|
|
30
|
+
if (normalized) paths.push(normalized);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Extract from Bash command if present
|
|
35
|
+
if (toolInput.command && typeof toolInput.command === 'string') {
|
|
36
|
+
const cmdPaths = extractFromCommand(toolInput.command);
|
|
37
|
+
|
|
38
|
+
paths.push(...cmdPaths);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return paths.filter(Boolean);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Extract path-like segments from a Bash command string
|
|
46
|
+
* Handles quoted paths and filters out non-path tokens
|
|
47
|
+
*
|
|
48
|
+
* @param {string} command - The command string
|
|
49
|
+
* @returns {string[]} Array of extracted paths
|
|
50
|
+
*/
|
|
51
|
+
function extractFromCommand(command) {
|
|
52
|
+
if (!command || typeof command !== 'string') {
|
|
53
|
+
return [];
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const paths = [];
|
|
57
|
+
|
|
58
|
+
// First, extract quoted strings (preserve spaces in paths)
|
|
59
|
+
const quotedPattern = /["']([^"']+)["']/g;
|
|
60
|
+
let match;
|
|
61
|
+
|
|
62
|
+
while ((match = quotedPattern.exec(command)) !== null) {
|
|
63
|
+
if (looksLikePath(match[1])) {
|
|
64
|
+
paths.push(normalizeExtractedPath(match[1]));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Remove quoted strings for unquoted path extraction
|
|
69
|
+
const withoutQuotes = command.replaceAll(/["'][^"']*["']/g, ' ');
|
|
70
|
+
|
|
71
|
+
// Split on whitespace and extract path-like tokens
|
|
72
|
+
const tokens = withoutQuotes.split(/\s+/).filter(Boolean);
|
|
73
|
+
|
|
74
|
+
for (const token of tokens) {
|
|
75
|
+
// Skip flags and shell operators
|
|
76
|
+
if (isSkippableToken(token)) continue;
|
|
77
|
+
|
|
78
|
+
// Priority check: if token IS a blocked directory name exactly, include it
|
|
79
|
+
// This handles cases like "cd build" where "build" is both a command word
|
|
80
|
+
// and a blocked directory name
|
|
81
|
+
if (isBlockedDirName(token)) {
|
|
82
|
+
paths.push(normalizeExtractedPath(token));
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Skip common non-path command words
|
|
87
|
+
if (isCommandKeyword(token)) continue;
|
|
88
|
+
|
|
89
|
+
// Check if it looks like a path
|
|
90
|
+
if (looksLikePath(token)) {
|
|
91
|
+
paths.push(normalizeExtractedPath(token));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
return paths;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// Common blocked directory names that should be extracted even if they
|
|
99
|
+
// match command keywords (e.g., "build" is both a subcommand and a dir name)
|
|
100
|
+
// Keep in sync with DEFAULT_PATTERNS in pattern-matcher.cjs
|
|
101
|
+
const BLOCKED_DIR_NAMES = [
|
|
102
|
+
'node_modules',
|
|
103
|
+
'__pycache__',
|
|
104
|
+
'.git',
|
|
105
|
+
'dist',
|
|
106
|
+
'build',
|
|
107
|
+
'.next',
|
|
108
|
+
'.nuxt',
|
|
109
|
+
'.venv',
|
|
110
|
+
'venv',
|
|
111
|
+
'vendor',
|
|
112
|
+
'target',
|
|
113
|
+
'coverage',
|
|
114
|
+
];
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Check if token is exactly a blocked directory name
|
|
118
|
+
* This takes priority over command keyword filtering
|
|
119
|
+
*
|
|
120
|
+
* @param {string} token - Token to check
|
|
121
|
+
* @returns {boolean}
|
|
122
|
+
*/
|
|
123
|
+
function isBlockedDirName(token) {
|
|
124
|
+
return BLOCKED_DIR_NAMES.includes(token);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Check if a string looks like a file path
|
|
129
|
+
*
|
|
130
|
+
* @param {string} str - String to check
|
|
131
|
+
* @returns {boolean}
|
|
132
|
+
*/
|
|
133
|
+
function looksLikePath(str) {
|
|
134
|
+
if (!str || str.length < 2) return false;
|
|
135
|
+
|
|
136
|
+
// Contains path separator
|
|
137
|
+
if (str.includes('/') || str.includes('\\')) return true;
|
|
138
|
+
|
|
139
|
+
// Starts with relative path indicator
|
|
140
|
+
if (str.startsWith('./') || str.startsWith('../')) return true;
|
|
141
|
+
|
|
142
|
+
// Has file extension (likely a file)
|
|
143
|
+
if (/\.\w{1,6}$/.test(str)) return true;
|
|
144
|
+
|
|
145
|
+
// Contains common blocked directory names
|
|
146
|
+
if (/node_modules|__pycache__|\.git|dist|build/.test(str)) return true;
|
|
147
|
+
|
|
148
|
+
// Looks like a directory path
|
|
149
|
+
if (/^[a-zA-Z0-9_-]+\//.test(str)) return true;
|
|
150
|
+
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Check if token should be skipped (flags, operators)
|
|
156
|
+
*
|
|
157
|
+
* @param {string} token - Token to check
|
|
158
|
+
* @returns {boolean}
|
|
159
|
+
*/
|
|
160
|
+
function isSkippableToken(token) {
|
|
161
|
+
// Flags
|
|
162
|
+
if (token.startsWith('-')) return true;
|
|
163
|
+
|
|
164
|
+
// Shell operators
|
|
165
|
+
if (['|', '||', '&&', '>', '>>', '<', '<<', '&', ';'].includes(token)) return true;
|
|
166
|
+
if (token.startsWith('|') || token.startsWith('>') || token.startsWith('<')) return true;
|
|
167
|
+
if (token.startsWith('&')) return true;
|
|
168
|
+
|
|
169
|
+
// Numeric values
|
|
170
|
+
if (/^\d+$/.test(token)) return true;
|
|
171
|
+
|
|
172
|
+
return false;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Check if token is a common command keyword (not a path)
|
|
177
|
+
*
|
|
178
|
+
* @param {string} token - Token to check
|
|
179
|
+
* @returns {boolean}
|
|
180
|
+
*/
|
|
181
|
+
function isCommandKeyword(token) {
|
|
182
|
+
const keywords = [
|
|
183
|
+
// Shell commands
|
|
184
|
+
'echo',
|
|
185
|
+
'cat',
|
|
186
|
+
'ls',
|
|
187
|
+
'cd',
|
|
188
|
+
'rm',
|
|
189
|
+
'cp',
|
|
190
|
+
'mv',
|
|
191
|
+
'find',
|
|
192
|
+
'grep',
|
|
193
|
+
'head',
|
|
194
|
+
'tail',
|
|
195
|
+
'wc',
|
|
196
|
+
'du',
|
|
197
|
+
'tree',
|
|
198
|
+
'touch',
|
|
199
|
+
'mkdir',
|
|
200
|
+
'rmdir',
|
|
201
|
+
'pwd',
|
|
202
|
+
'which',
|
|
203
|
+
'env',
|
|
204
|
+
'export',
|
|
205
|
+
'source',
|
|
206
|
+
'bash',
|
|
207
|
+
'sh',
|
|
208
|
+
'zsh',
|
|
209
|
+
'true',
|
|
210
|
+
'false',
|
|
211
|
+
'test',
|
|
212
|
+
'xargs',
|
|
213
|
+
'tee',
|
|
214
|
+
'sort',
|
|
215
|
+
'uniq',
|
|
216
|
+
'cut',
|
|
217
|
+
'tr',
|
|
218
|
+
'sed',
|
|
219
|
+
'awk',
|
|
220
|
+
'diff',
|
|
221
|
+
'chmod',
|
|
222
|
+
'chown',
|
|
223
|
+
'ln',
|
|
224
|
+
'file',
|
|
225
|
+
|
|
226
|
+
// Package managers and their subcommands
|
|
227
|
+
'npm',
|
|
228
|
+
'pnpm',
|
|
229
|
+
'yarn',
|
|
230
|
+
'bun',
|
|
231
|
+
'npx',
|
|
232
|
+
'pnpx',
|
|
233
|
+
'bunx',
|
|
234
|
+
'node',
|
|
235
|
+
'run',
|
|
236
|
+
'build',
|
|
237
|
+
'test',
|
|
238
|
+
'lint',
|
|
239
|
+
'dev',
|
|
240
|
+
'start',
|
|
241
|
+
'install',
|
|
242
|
+
'ci',
|
|
243
|
+
'exec',
|
|
244
|
+
'add',
|
|
245
|
+
'remove',
|
|
246
|
+
'update',
|
|
247
|
+
'publish',
|
|
248
|
+
'pack',
|
|
249
|
+
'init',
|
|
250
|
+
'create',
|
|
251
|
+
|
|
252
|
+
// Build tools
|
|
253
|
+
'tsc',
|
|
254
|
+
'esbuild',
|
|
255
|
+
'vite',
|
|
256
|
+
'webpack',
|
|
257
|
+
'rollup',
|
|
258
|
+
'turbo',
|
|
259
|
+
'nx',
|
|
260
|
+
'jest',
|
|
261
|
+
'vitest',
|
|
262
|
+
'mocha',
|
|
263
|
+
'eslint',
|
|
264
|
+
'prettier',
|
|
265
|
+
|
|
266
|
+
// Git
|
|
267
|
+
'git',
|
|
268
|
+
'commit',
|
|
269
|
+
'push',
|
|
270
|
+
'pull',
|
|
271
|
+
'merge',
|
|
272
|
+
'rebase',
|
|
273
|
+
'checkout',
|
|
274
|
+
'branch',
|
|
275
|
+
'status',
|
|
276
|
+
'log',
|
|
277
|
+
'diff',
|
|
278
|
+
'add',
|
|
279
|
+
'reset',
|
|
280
|
+
'stash',
|
|
281
|
+
'fetch',
|
|
282
|
+
'clone',
|
|
283
|
+
|
|
284
|
+
// Docker
|
|
285
|
+
'docker',
|
|
286
|
+
'compose',
|
|
287
|
+
'up',
|
|
288
|
+
'down',
|
|
289
|
+
'ps',
|
|
290
|
+
'logs',
|
|
291
|
+
'exec',
|
|
292
|
+
'container',
|
|
293
|
+
'image',
|
|
294
|
+
|
|
295
|
+
// Misc
|
|
296
|
+
'sudo',
|
|
297
|
+
'time',
|
|
298
|
+
'timeout',
|
|
299
|
+
'watch',
|
|
300
|
+
'make',
|
|
301
|
+
'cargo',
|
|
302
|
+
'python',
|
|
303
|
+
'python3',
|
|
304
|
+
'pip',
|
|
305
|
+
'ruby',
|
|
306
|
+
'gem',
|
|
307
|
+
'go',
|
|
308
|
+
'rust',
|
|
309
|
+
'java',
|
|
310
|
+
'javac',
|
|
311
|
+
'mvn',
|
|
312
|
+
'gradle',
|
|
313
|
+
];
|
|
314
|
+
|
|
315
|
+
return keywords.includes(token.toLowerCase());
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Normalize an extracted path
|
|
320
|
+
* - Remove surrounding quotes
|
|
321
|
+
* - Normalize path separators to forward slash
|
|
322
|
+
*
|
|
323
|
+
* @param {string} path - Path to normalize
|
|
324
|
+
* @returns {string} Normalized path
|
|
325
|
+
*/
|
|
326
|
+
function normalizeExtractedPath(path) {
|
|
327
|
+
if (!path) return '';
|
|
328
|
+
|
|
329
|
+
let normalized = path.trim();
|
|
330
|
+
|
|
331
|
+
// Remove surrounding quotes
|
|
332
|
+
if (
|
|
333
|
+
(normalized.startsWith('"') && normalized.endsWith('"')) ||
|
|
334
|
+
(normalized.startsWith("'") && normalized.endsWith("'"))
|
|
335
|
+
) {
|
|
336
|
+
normalized = normalized.slice(1, -1);
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
// Normalize path separators to forward slash
|
|
340
|
+
normalized = normalized.replaceAll('\\', '/');
|
|
341
|
+
|
|
342
|
+
// Remove trailing slash for consistency
|
|
343
|
+
if (normalized.endsWith('/') && normalized.length > 1) {
|
|
344
|
+
normalized = normalized.slice(0, -1);
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
return normalized;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
module.exports = {
|
|
351
|
+
extractFromToolInput,
|
|
352
|
+
extractFromCommand,
|
|
353
|
+
looksLikePath,
|
|
354
|
+
isSkippableToken,
|
|
355
|
+
isCommandKeyword,
|
|
356
|
+
isBlockedDirName,
|
|
357
|
+
normalizeExtractedPath,
|
|
358
|
+
BLOCKED_DIR_NAMES,
|
|
359
|
+
};
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* pattern-matcher.cjs - Gitignore-spec compliant pattern matching
|
|
4
|
+
*
|
|
5
|
+
* Uses 'ignore' package for .cctkignore parsing and path matching.
|
|
6
|
+
* Supports negation patterns (!) for allowlisting.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
const fs = require('node:fs');
|
|
10
|
+
const path = require('node:path');
|
|
11
|
+
const Ignore = require('./vendor/ignore');
|
|
12
|
+
|
|
13
|
+
// Default patterns if .cctkignore doesn't exist or is empty
|
|
14
|
+
// Only includes directories with HEAVY file counts (1000+ files typical)
|
|
15
|
+
const DEFAULT_PATTERNS = [
|
|
16
|
+
// JavaScript/TypeScript - package dependencies & build outputs
|
|
17
|
+
'node_modules',
|
|
18
|
+
'dist',
|
|
19
|
+
'build',
|
|
20
|
+
'.next',
|
|
21
|
+
'.nuxt',
|
|
22
|
+
// Python - virtualenvs & cache
|
|
23
|
+
'__pycache__',
|
|
24
|
+
'.venv',
|
|
25
|
+
'venv',
|
|
26
|
+
// Go/PHP - vendor dependencies
|
|
27
|
+
'vendor',
|
|
28
|
+
// Rust/Java - compiled outputs
|
|
29
|
+
'target',
|
|
30
|
+
// Version control
|
|
31
|
+
'.git',
|
|
32
|
+
// Test coverage (can be large with reports)
|
|
33
|
+
'coverage',
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Load patterns from .cctkignore file
|
|
38
|
+
* Falls back to DEFAULT_PATTERNS if file doesn't exist or is empty
|
|
39
|
+
*
|
|
40
|
+
* @param {string} ckignorePath - Path to .cctkignore file
|
|
41
|
+
* @returns {string[]} Array of patterns
|
|
42
|
+
*/
|
|
43
|
+
function loadPatterns(ckignorePath) {
|
|
44
|
+
if (!ckignorePath || !fs.existsSync(ckignorePath)) {
|
|
45
|
+
return DEFAULT_PATTERNS;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
try {
|
|
49
|
+
const content = fs.readFileSync(ckignorePath, 'utf8');
|
|
50
|
+
const patterns = content
|
|
51
|
+
.split('\n')
|
|
52
|
+
.map((line) => line.trim())
|
|
53
|
+
.filter((line) => line && !line.startsWith('#'));
|
|
54
|
+
|
|
55
|
+
return patterns.length > 0 ? patterns : DEFAULT_PATTERNS;
|
|
56
|
+
} catch (error) {
|
|
57
|
+
console.error('WARN: Failed to read .cctkignore:', error.message);
|
|
58
|
+
|
|
59
|
+
return DEFAULT_PATTERNS;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Create a matcher from patterns
|
|
65
|
+
* Normalizes patterns to match anywhere in the path tree
|
|
66
|
+
*
|
|
67
|
+
* @param {string[]} patterns - Array of patterns from .cctkignore
|
|
68
|
+
* @returns {Object} Matcher object with ig instance and pattern info
|
|
69
|
+
*/
|
|
70
|
+
function createMatcher(patterns) {
|
|
71
|
+
const ig = Ignore();
|
|
72
|
+
|
|
73
|
+
// Normalize patterns to match anywhere in path tree
|
|
74
|
+
// e.g., "node_modules" becomes "**\/node_modules" and "**\/node_modules/**"
|
|
75
|
+
const normalizedPatterns = [];
|
|
76
|
+
|
|
77
|
+
for (const p of patterns) {
|
|
78
|
+
if (p.startsWith('!')) {
|
|
79
|
+
// Negation pattern - un-ignore
|
|
80
|
+
const inner = p.slice(1);
|
|
81
|
+
|
|
82
|
+
if (inner.includes('/') || inner.includes('*')) {
|
|
83
|
+
// Already has path or glob - use as-is
|
|
84
|
+
normalizedPatterns.push(p);
|
|
85
|
+
} else {
|
|
86
|
+
// Simple dir name - match anywhere
|
|
87
|
+
normalizedPatterns.push(`!**/${inner}`, `!**/${inner}/**`);
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
// Block pattern
|
|
91
|
+
if (p.includes('/') || p.includes('*')) {
|
|
92
|
+
// Already has path or glob - use as-is
|
|
93
|
+
normalizedPatterns.push(p);
|
|
94
|
+
} else {
|
|
95
|
+
// Simple dir name - match the dir and contents anywhere
|
|
96
|
+
normalizedPatterns.push(`**/${p}`, `**/${p}/**`, p, `${p}/**`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
ig.add(normalizedPatterns);
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
ig,
|
|
105
|
+
patterns: normalizedPatterns,
|
|
106
|
+
original: patterns,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Check if a path should be blocked
|
|
112
|
+
*
|
|
113
|
+
* @param {Object} matcher - Matcher object from createMatcher
|
|
114
|
+
* @param {string} testPath - Path to test
|
|
115
|
+
* @returns {Object} { blocked: boolean, pattern?: string }
|
|
116
|
+
*/
|
|
117
|
+
function matchPath(matcher, testPath) {
|
|
118
|
+
if (!testPath || typeof testPath !== 'string') {
|
|
119
|
+
return { blocked: false };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Normalize path separators (Windows backslash to forward slash)
|
|
123
|
+
let normalized = testPath.replaceAll('\\', '/');
|
|
124
|
+
|
|
125
|
+
// Remove leading ./ if present
|
|
126
|
+
if (normalized.startsWith('./')) {
|
|
127
|
+
normalized = normalized.slice(2);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Check if path is ignored (blocked)
|
|
131
|
+
const blocked = matcher.ig.ignores(normalized);
|
|
132
|
+
|
|
133
|
+
if (blocked) {
|
|
134
|
+
// Find which original pattern matched for error message
|
|
135
|
+
const matchedPattern = findMatchingPattern(matcher.original, normalized);
|
|
136
|
+
|
|
137
|
+
return { blocked: true, pattern: matchedPattern };
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return { blocked: false };
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Find which original pattern matched (for error messages)
|
|
145
|
+
*
|
|
146
|
+
* @param {string[]} originalPatterns - Original patterns from .cctkignore
|
|
147
|
+
* @param {string} path - The path that was blocked
|
|
148
|
+
* @returns {string} The pattern that matched
|
|
149
|
+
*/
|
|
150
|
+
function findMatchingPattern(originalPatterns, path) {
|
|
151
|
+
for (const p of originalPatterns) {
|
|
152
|
+
if (p.startsWith('!')) continue; // Skip negations
|
|
153
|
+
|
|
154
|
+
// Simple substring check for common cases
|
|
155
|
+
const pattern = p.replaceAll('**', '').replaceAll('*', '');
|
|
156
|
+
|
|
157
|
+
if (pattern && path.includes(pattern)) {
|
|
158
|
+
return p;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// For more complex patterns, use ignore to test individually
|
|
162
|
+
const tempIg = Ignore();
|
|
163
|
+
|
|
164
|
+
if (p.includes('/') || p.includes('*')) {
|
|
165
|
+
tempIg.add(p);
|
|
166
|
+
} else {
|
|
167
|
+
tempIg.add([`**/${p}`, `**/${p}/**`, p, `${p}/**`]);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
if (tempIg.ignores(path)) {
|
|
171
|
+
return p;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return originalPatterns.find((p) => !p.startsWith('!')) || 'unknown';
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
module.exports = {
|
|
179
|
+
loadPatterns,
|
|
180
|
+
createMatcher,
|
|
181
|
+
matchPath,
|
|
182
|
+
findMatchingPattern,
|
|
183
|
+
DEFAULT_PATTERNS,
|
|
184
|
+
};
|