@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,167 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* scout-block.cjs - Hook for blocking directory access
|
|
4
|
+
*
|
|
5
|
+
* Blocks access to directories listed in .claude/.cctkignore
|
|
6
|
+
* Uses gitignore-spec compliant pattern matching via 'ignore' package
|
|
7
|
+
*
|
|
8
|
+
* Blocking Rules:
|
|
9
|
+
* - File paths: Blocks any file_path/path/pattern containing blocked directories
|
|
10
|
+
* - Bash commands: Blocks directory access (cd, ls, cat, etc.) but ALLOWS build commands
|
|
11
|
+
* - Blocked: cd node_modules, ls packages/web/node_modules, cat dist/file.js
|
|
12
|
+
* - Allowed: npm build, go build, cargo build, make, mvn, gradle, docker build, kubectl, terraform
|
|
13
|
+
*
|
|
14
|
+
* Configuration:
|
|
15
|
+
* - Edit .claude/.cctkignore to customize blocked patterns (one per line, # for comments)
|
|
16
|
+
* - Supports negation patterns (!) to allow specific paths
|
|
17
|
+
*
|
|
18
|
+
* Exit Codes:
|
|
19
|
+
* - 0: Command allowed
|
|
20
|
+
* - 2: Command blocked
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
const fs = require('node:fs');
|
|
24
|
+
const path = require('node:path');
|
|
25
|
+
|
|
26
|
+
// Import modules
|
|
27
|
+
const { loadPatterns, createMatcher, matchPath } = require('./scout-block/pattern-matcher.cjs');
|
|
28
|
+
const { extractFromToolInput } = require('./scout-block/path-extractor.cjs');
|
|
29
|
+
const { formatBlockedError } = require('./scout-block/error-formatter.cjs');
|
|
30
|
+
const { detectBroadPatternIssue, formatBroadPatternError } = require('./scout-block/broad-pattern-detector.cjs');
|
|
31
|
+
|
|
32
|
+
// Build command allowlist - these are allowed even if they contain blocked paths
|
|
33
|
+
// Handles flags and filters: npm build, pnpm --filter web run build, yarn workspace app build
|
|
34
|
+
// Also allows: go, cargo, make, mvn/mvnw, gradle/gradlew, dotnet, docker, bazel, cmake, sbt, flutter, swift, ant, ninja, meson
|
|
35
|
+
const BUILD_COMMAND_PATTERN =
|
|
36
|
+
/^(npm|pnpm|yarn|bun)\s+([^\s]+\s+)*(run\s+)?(build|test|lint|dev|start|install|ci|add|remove|update|publish|pack|init|create|exec)/;
|
|
37
|
+
const TOOL_COMMAND_PATTERN =
|
|
38
|
+
/^(\.\/)?(npx|pnpx|bunx|tsc|esbuild|vite|webpack|rollup|turbo|nx|jest|vitest|mocha|eslint|prettier|go|cargo|make|mvn|mvnw|gradle|gradlew|dotnet|docker|podman|kubectl|helm|terraform|ansible|bazel|cmake|sbt|flutter|swift|ant|ninja|meson)/;
|
|
39
|
+
|
|
40
|
+
// Allow execution from .venv/bin/ or venv/bin/ (Unix)
|
|
41
|
+
// Blocks exploration (cat, ls, grep) but allows running venv executables
|
|
42
|
+
const VENV_EXECUTABLE_PATTERN = /(^|[\/\\])\.?venv[\/\\](bin)[\/\\]/;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Check if a command is a build/tooling command (should be allowed)
|
|
46
|
+
*
|
|
47
|
+
* @param {string} command - The command to check
|
|
48
|
+
* @returns {boolean}
|
|
49
|
+
*/
|
|
50
|
+
function isBuildCommand(command) {
|
|
51
|
+
if (!command || typeof command !== 'string') return false;
|
|
52
|
+
const trimmed = command.trim();
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
return BUILD_COMMAND_PATTERN.test(trimmed) || TOOL_COMMAND_PATTERN.test(trimmed);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Check if command executes from a .venv bin directory
|
|
61
|
+
* Allows: ~/.claude/skills/.venv/bin/python3 script.py
|
|
62
|
+
* Allows: .venv/Scripts/python.exe script.py
|
|
63
|
+
*
|
|
64
|
+
* @param {string} command - The command to check
|
|
65
|
+
* @returns {boolean}
|
|
66
|
+
*/
|
|
67
|
+
function isVenvExecutable(command) {
|
|
68
|
+
if (!command || typeof command !== 'string') return false;
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
return VENV_EXECUTABLE_PATTERN.test(command);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
try {
|
|
75
|
+
// Read stdin synchronously
|
|
76
|
+
const hookInput = fs.readFileSync(0, 'utf8');
|
|
77
|
+
|
|
78
|
+
// Validate input not empty
|
|
79
|
+
if (!hookInput || hookInput.trim().length === 0) {
|
|
80
|
+
console.error('ERROR: Empty input');
|
|
81
|
+
process.exit(2);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// Parse JSON
|
|
85
|
+
let data;
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
try {
|
|
89
|
+
data = JSON.parse(hookInput);
|
|
90
|
+
} catch {
|
|
91
|
+
// Fail-open for unparseable input
|
|
92
|
+
console.error('WARN: JSON parse failed, allowing operation');
|
|
93
|
+
process.exit(0);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Validate structure
|
|
97
|
+
if (!data.tool_input || typeof data.tool_input !== 'object') {
|
|
98
|
+
// Fail-open for invalid structure
|
|
99
|
+
console.error('WARN: Invalid JSON structure, allowing operation');
|
|
100
|
+
process.exit(0);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const toolInput = data.tool_input;
|
|
104
|
+
const toolName = data.tool_name || 'unknown';
|
|
105
|
+
|
|
106
|
+
// Check if it's a build command or venv executable (allowed regardless of paths)
|
|
107
|
+
if (toolInput.command && (isBuildCommand(toolInput.command) || isVenvExecutable(toolInput.command))) {
|
|
108
|
+
process.exit(0);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Check for overly broad glob patterns (Glob tool)
|
|
112
|
+
// This prevents LLMs from filling context with **/*.ts at project root
|
|
113
|
+
if (toolName === 'Glob' || toolInput.pattern) {
|
|
114
|
+
const broadResult = detectBroadPatternIssue(toolInput);
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
if (broadResult.blocked) {
|
|
118
|
+
const errorMsg = formatBroadPatternError(broadResult, path.dirname(__dirname));
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
console.error(errorMsg);
|
|
122
|
+
process.exit(2);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Load patterns from .cctkignore
|
|
127
|
+
const scriptDir = __dirname;
|
|
128
|
+
const claudeDir = path.dirname(scriptDir); // Go up from hooks/ to .claude/
|
|
129
|
+
const ckignorePath = path.join(claudeDir, '.cctkignore');
|
|
130
|
+
const patterns = loadPatterns(ckignorePath);
|
|
131
|
+
const matcher = createMatcher(patterns);
|
|
132
|
+
|
|
133
|
+
// Extract paths from tool input
|
|
134
|
+
const extractedPaths = extractFromToolInput(toolInput);
|
|
135
|
+
|
|
136
|
+
// If no paths extracted, allow operation
|
|
137
|
+
if (extractedPaths.length === 0) {
|
|
138
|
+
process.exit(0);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// Check each path against patterns
|
|
142
|
+
for (const extractedPath of extractedPaths) {
|
|
143
|
+
const result = matchPath(matcher, extractedPath);
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
if (result.blocked) {
|
|
147
|
+
// Output rich error message
|
|
148
|
+
const errorMsg = formatBlockedError({
|
|
149
|
+
path: extractedPath,
|
|
150
|
+
pattern: result.pattern,
|
|
151
|
+
tool: toolName,
|
|
152
|
+
claudeDir
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
console.error(errorMsg);
|
|
157
|
+
process.exit(2);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// All paths allowed
|
|
162
|
+
process.exit(0);
|
|
163
|
+
} catch (error) {
|
|
164
|
+
// Fail-open for unexpected errors
|
|
165
|
+
console.error('WARN: Hook error, allowing operation -', error.message);
|
|
166
|
+
process.exit(0);
|
|
167
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SessionEnd Hook - Cleanup on session end
|
|
4
|
+
*
|
|
5
|
+
* Fires: When session ends (clear, compact, user exit)
|
|
6
|
+
* Purpose: Delete compact marker files to reset context baseline on /clear
|
|
7
|
+
*
|
|
8
|
+
* Exit Codes:
|
|
9
|
+
* 0 - Success (non-blocking)
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const fs = require('node:fs');
|
|
13
|
+
const { deleteMarker } = require('./lib/context-tracker.cjs');
|
|
14
|
+
|
|
15
|
+
async function main() {
|
|
16
|
+
try {
|
|
17
|
+
const stdin = fs.readFileSync(0, 'utf8').trim();
|
|
18
|
+
const data = stdin ? JSON.parse(stdin) : {};
|
|
19
|
+
const reason = data.reason || 'unknown';
|
|
20
|
+
const sessionId = data.session_id || null;
|
|
21
|
+
|
|
22
|
+
// Delete marker on /clear to reset context baseline
|
|
23
|
+
// SessionEnd fires with OLD session_id before new session starts
|
|
24
|
+
// This ensures clean slate for the next session
|
|
25
|
+
if (reason === 'clear' && sessionId) {
|
|
26
|
+
deleteMarker(sessionId);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
process.exit(0);
|
|
30
|
+
} catch {
|
|
31
|
+
process.exit(0);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
main();
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SessionStart Hook - Initializes session environment with project detection
|
|
4
|
+
*
|
|
5
|
+
* Fires: Once per session (startup, resume, clear, compact)
|
|
6
|
+
* Purpose: Load config, detect project info, persist to env vars, output context
|
|
7
|
+
*
|
|
8
|
+
* Exit Codes:
|
|
9
|
+
* 0 - Success (non-blocking, allows continuation)
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
const { execSync } = require('child_process');
|
|
15
|
+
const {
|
|
16
|
+
loadConfig,
|
|
17
|
+
writeEnv,
|
|
18
|
+
writeSessionState,
|
|
19
|
+
resolvePlanPath,
|
|
20
|
+
} = require('./lib/cctk-config-utils.cjs');
|
|
21
|
+
const { writeResetMarker } = require('./lib/context-tracker.cjs');
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Safely execute shell command with optional timeout
|
|
25
|
+
* @param {string} cmd - Command to execute
|
|
26
|
+
* @param {number} timeoutMs - Timeout in milliseconds (default: 5000)
|
|
27
|
+
*/
|
|
28
|
+
function execSafe(cmd, timeoutMs = 5000) {
|
|
29
|
+
try {
|
|
30
|
+
return execSync(cmd, {
|
|
31
|
+
encoding: 'utf8',
|
|
32
|
+
timeout: timeoutMs,
|
|
33
|
+
stdio: ['pipe', 'pipe', 'pipe']
|
|
34
|
+
}).trim();
|
|
35
|
+
} catch (e) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Detect project type based on workspace indicators
|
|
42
|
+
*/
|
|
43
|
+
function detectProjectType(configOverride) {
|
|
44
|
+
if (configOverride && configOverride !== 'auto') return configOverride;
|
|
45
|
+
|
|
46
|
+
if (fs.existsSync('pnpm-workspace.yaml')) return 'monorepo';
|
|
47
|
+
if (fs.existsSync('lerna.json')) return 'monorepo';
|
|
48
|
+
|
|
49
|
+
if (fs.existsSync('package.json')) {
|
|
50
|
+
try {
|
|
51
|
+
const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
|
|
52
|
+
if (pkg.workspaces) return 'monorepo';
|
|
53
|
+
if (pkg.main || pkg.exports) return 'library';
|
|
54
|
+
} catch (e) { /* ignore */ }
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return 'single-repo';
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Detect package manager from lock files
|
|
62
|
+
*/
|
|
63
|
+
function detectPackageManager(configOverride) {
|
|
64
|
+
if (configOverride && configOverride !== 'auto') return configOverride;
|
|
65
|
+
|
|
66
|
+
if (fs.existsSync('bun.lockb')) return 'bun';
|
|
67
|
+
if (fs.existsSync('pnpm-lock.yaml')) return 'pnpm';
|
|
68
|
+
if (fs.existsSync('yarn.lock')) return 'yarn';
|
|
69
|
+
if (fs.existsSync('package-lock.json')) return 'npm';
|
|
70
|
+
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Get coding level guidelines by reading from output-styles/coding-level.md
|
|
76
|
+
* Single file approach - users can customize the .md file directly
|
|
77
|
+
* @param {number} level - Whether coding level guidelines are enabled
|
|
78
|
+
* @returns {string|null} Guidelines text (frontmatter stripped) or null if disabled
|
|
79
|
+
*/
|
|
80
|
+
function getCodingLevelGuidelines(level) {
|
|
81
|
+
if (typeof level !== 'number' || level <=0 || level > 3) return null;
|
|
82
|
+
|
|
83
|
+
const stylePath = path.join(__dirname, '..', 'output-styles', `coding-level-${level}.md`);
|
|
84
|
+
|
|
85
|
+
try {
|
|
86
|
+
if (!fs.existsSync(stylePath)) return null;
|
|
87
|
+
|
|
88
|
+
const content = fs.readFileSync(stylePath, 'utf8');
|
|
89
|
+
// Strip YAML frontmatter (between --- markers at start of file)
|
|
90
|
+
const withoutFrontmatter = content.replace(/^---[\s\S]*?---\n*/, '').trim();
|
|
91
|
+
return withoutFrontmatter;
|
|
92
|
+
} catch {
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* Build context summary for output (compact, single line)
|
|
99
|
+
* @param {Object} config - Loaded config
|
|
100
|
+
* @param {Object} detections - Project detections
|
|
101
|
+
* @param {{ path: string|null, resolvedBy: string|null }} resolved - Plan resolution result
|
|
102
|
+
* @param {string|null} gitRoot - Git repository root path
|
|
103
|
+
*/
|
|
104
|
+
function buildContextOutput(config, detections, resolved, gitRoot) {
|
|
105
|
+
const lines = [`Project: ${detections.type || 'unknown'}`];
|
|
106
|
+
if (detections.pm) lines.push(`PM: ${detections.pm}`);
|
|
107
|
+
lines.push(`Plan naming: ${config.plan.namingFormat}`);
|
|
108
|
+
|
|
109
|
+
// Show git root when different from CWD (subdirectory scenario)
|
|
110
|
+
if (gitRoot && gitRoot !== process.cwd()) {
|
|
111
|
+
lines.push(`Root: ${gitRoot}`);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Show plan status with resolution context
|
|
115
|
+
if (resolved.path) {
|
|
116
|
+
if (resolved.resolvedBy === 'session') {
|
|
117
|
+
lines.push(`Plan: ${resolved.path}`);
|
|
118
|
+
} else {
|
|
119
|
+
lines.push(`Suggested: ${resolved.path}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return lines.join(' | ');
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Main hook execution
|
|
128
|
+
*/
|
|
129
|
+
async function main() {
|
|
130
|
+
try {
|
|
131
|
+
const stdin = fs.readFileSync(0, 'utf-8').trim();
|
|
132
|
+
const data = stdin ? JSON.parse(stdin) : {};
|
|
133
|
+
const envFile = process.env.CLAUDE_ENV_FILE;
|
|
134
|
+
const source = data.source || 'unknown';
|
|
135
|
+
const sessionId = data.session_id || null;
|
|
136
|
+
|
|
137
|
+
const config = loadConfig();
|
|
138
|
+
|
|
139
|
+
// Layer 3: Write reset marker on /clear to signal statusline to reset baseline
|
|
140
|
+
// This ensures context window percentage resets to 0% on fresh sessions
|
|
141
|
+
if (source === 'clear' && sessionId) {
|
|
142
|
+
writeResetMarker(sessionId, 'clear');
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const detections = {
|
|
146
|
+
type: detectProjectType(config.project?.type),
|
|
147
|
+
pm: detectPackageManager(config.project?.packageManager),
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
// Resolve plan - now returns { path, resolvedBy }
|
|
151
|
+
const resolved = resolvePlanPath(null, config);
|
|
152
|
+
|
|
153
|
+
// CRITICAL FIX: Only persist explicitly-set plans to session state
|
|
154
|
+
// Branch-matched plans are "suggested" - stored separately, not as activePlan
|
|
155
|
+
// This prevents stale plan pollution on fresh sessions
|
|
156
|
+
if (sessionId) {
|
|
157
|
+
writeSessionState(sessionId, {
|
|
158
|
+
sessionOrigin: process.cwd(),
|
|
159
|
+
// Only session-resolved plans are truly "active"
|
|
160
|
+
activePlan: resolved.resolvedBy === 'session' ? resolved.path : null,
|
|
161
|
+
// Track suggested plan separately (for UI hints, not for report paths)
|
|
162
|
+
suggestedPlan: resolved.resolvedBy === 'branch' ? resolved.path : null,
|
|
163
|
+
timestamp: Date.now(),
|
|
164
|
+
source
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Git context needed for output and subdirectory detection
|
|
169
|
+
const gitRoot = execSafe('git rev-parse --show-toplevel');
|
|
170
|
+
|
|
171
|
+
if (envFile) {
|
|
172
|
+
writeEnv(envFile, 'CCTK_SESSION_ID', sessionId || '');
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
console.log(`Session ${source}. ${buildContextOutput(config, detections, resolved, gitRoot)}`);
|
|
176
|
+
|
|
177
|
+
// Warn user if running from subdirectory (CWD != git root)
|
|
178
|
+
if (gitRoot && gitRoot !== process.cwd()) {
|
|
179
|
+
console.log(`⚠️ Running from subdirectory. Plans/docs created at git root: ${gitRoot}`);
|
|
180
|
+
console.log(` To avoid this, run Claude from: cd ${gitRoot}`);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Auto-compact can bypass AskUserQuestion approval gates
|
|
184
|
+
// When context is compacted mid-workflow, the summarization may lose "pending approval" state.
|
|
185
|
+
// This warning reminds Claude to verify if user approval was pending before proceeding.
|
|
186
|
+
if (source === 'compact') {
|
|
187
|
+
console.log(`\n⚠️ CONTEXT COMPACTED - APPROVAL STATE CHECK:`);
|
|
188
|
+
console.log(`If you were waiting for user approval via AskUserQuestion (e.g., Step 4 review gate),`);
|
|
189
|
+
console.log(`you MUST re-confirm with the user before proceeding. Do NOT assume approval was given.`);
|
|
190
|
+
console.log(`Use AskUserQuestion to verify: "Context was compacted. Please confirm approval to continue."`);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// Auto-inject coding level guidelines (if enabled)
|
|
194
|
+
const guidelines = getCodingLevelGuidelines(config.codingLevel)
|
|
195
|
+
|
|
196
|
+
if (guidelines) {
|
|
197
|
+
console.log(`\n${guidelines}`);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
if (config.assertions?.length > 0) {
|
|
201
|
+
console.log(`\nUser Assertions:`);
|
|
202
|
+
config.assertions.forEach((assertion, i) => {
|
|
203
|
+
console.log(` ${i + 1}. ${assertion}`);
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
process.exit(0);
|
|
208
|
+
} catch (error) {
|
|
209
|
+
console.error(`SessionStart hook error: ${error.message}`);
|
|
210
|
+
process.exit(0);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
main();
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SubagentStart Hook - Injects context to subagents (Optimized)
|
|
4
|
+
*
|
|
5
|
+
* Fires: When a subagent (Task tool call) is started
|
|
6
|
+
* Purpose: Inject minimal context using env vars from SessionStart
|
|
7
|
+
* Target: ~200 tokens (down from ~350)
|
|
8
|
+
*
|
|
9
|
+
* Exit Codes:
|
|
10
|
+
* 0 - Success (non-blocking, allows continuation)
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const fs = require('fs');
|
|
14
|
+
const path = require('path');
|
|
15
|
+
const {
|
|
16
|
+
loadConfig,
|
|
17
|
+
resolveNamingPattern,
|
|
18
|
+
getGitBranch,
|
|
19
|
+
getGitRoot,
|
|
20
|
+
resolvePlanPath,
|
|
21
|
+
getReportsPath,
|
|
22
|
+
normalizePath
|
|
23
|
+
} = require('./lib/cctk-config-utils.cjs');
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Get agent-specific context from config
|
|
27
|
+
*/
|
|
28
|
+
function getAgentContext(agentType, config) {
|
|
29
|
+
const agentConfig = config.subagent?.agents?.[agentType];
|
|
30
|
+
if (!agentConfig?.contextPrefix) return null;
|
|
31
|
+
return agentConfig.contextPrefix;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Build trust verification section if enabled
|
|
36
|
+
*/
|
|
37
|
+
function buildTrustVerification(config) {
|
|
38
|
+
if (!config.trust?.enabled || !config.trust?.passphrase) return [];
|
|
39
|
+
return [
|
|
40
|
+
``,
|
|
41
|
+
`## Trust Verification`,
|
|
42
|
+
`Passphrase: "${config.trust.passphrase}"`
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Main hook execution
|
|
48
|
+
*/
|
|
49
|
+
async function main() {
|
|
50
|
+
try {
|
|
51
|
+
const stdin = fs.readFileSync(0, 'utf-8').trim();
|
|
52
|
+
if (!stdin) process.exit(0);
|
|
53
|
+
|
|
54
|
+
const payload = JSON.parse(stdin);
|
|
55
|
+
const agentType = payload.agent_type || 'unknown';
|
|
56
|
+
const agentId = payload.agent_id || 'unknown';
|
|
57
|
+
|
|
58
|
+
// Load config for trust verification, naming, and agent-specific context
|
|
59
|
+
const config = loadConfig({ includeProject: false, includeAssertions: false });
|
|
60
|
+
|
|
61
|
+
// Use payload.cwd if provided for git operations (monorepo support)
|
|
62
|
+
// This ensures subagent resolves paths relative to its own CWD, not process.cwd()
|
|
63
|
+
const effectiveCwd = payload.cwd || process.cwd();
|
|
64
|
+
|
|
65
|
+
// Compute naming pattern directly (don't rely on env vars which may not propagate)
|
|
66
|
+
// Pass effectiveCwd to git commands to support monorepo/submodule scenarios
|
|
67
|
+
const gitBranch = getGitBranch(effectiveCwd);
|
|
68
|
+
const gitRoot = getGitRoot(effectiveCwd);
|
|
69
|
+
const baseDir = gitRoot || effectiveCwd;
|
|
70
|
+
|
|
71
|
+
// Debug logging for path resolution troubleshooting
|
|
72
|
+
if (process.env.CCTK_DEBUG) {
|
|
73
|
+
console.error(`[subagent-init] effectiveCwd=${effectiveCwd}, gitRoot=${gitRoot}, baseDir=${baseDir}`);
|
|
74
|
+
}
|
|
75
|
+
const namePattern = resolveNamingPattern(config.plan, gitBranch);
|
|
76
|
+
|
|
77
|
+
const resolved = resolvePlanPath(null, config);
|
|
78
|
+
const reportsPath = getReportsPath(resolved.path, resolved.resolvedBy, config.plan, config.paths, baseDir);
|
|
79
|
+
const activePlan = resolved.resolvedBy === 'session' ? resolved.path : '';
|
|
80
|
+
const suggestedPlan = resolved.resolvedBy === 'branch' ? resolved.path : '';
|
|
81
|
+
const plansPath = path.join(baseDir, normalizePath(config.paths?.plans) || 'plans');
|
|
82
|
+
const docsPath = path.join(baseDir, normalizePath(config.paths?.docs) || 'docs');
|
|
83
|
+
const thinkingLanguage = config.locale?.thinkingLanguage || '';
|
|
84
|
+
const responseLanguage = config.locale?.responseLanguage || '';
|
|
85
|
+
// Auto-default thinkingLanguage to 'en' when only responseLanguage is set
|
|
86
|
+
const effectiveThinking = thinkingLanguage || (responseLanguage ? 'en' : '');
|
|
87
|
+
|
|
88
|
+
// Build compact context (~200 tokens)
|
|
89
|
+
const lines = [];
|
|
90
|
+
|
|
91
|
+
// Subagent identification
|
|
92
|
+
lines.push(`## Subagent: ${agentType}`);
|
|
93
|
+
lines.push(`ID: ${agentId} | CWD: ${effectiveCwd}`);
|
|
94
|
+
lines.push(``);
|
|
95
|
+
|
|
96
|
+
// Plan context (from env vars)
|
|
97
|
+
lines.push(`## Context`);
|
|
98
|
+
if (activePlan) {
|
|
99
|
+
lines.push(`- Plan: ${activePlan}`);
|
|
100
|
+
} else if (suggestedPlan) {
|
|
101
|
+
lines.push(`- Plan: none | Suggested: ${suggestedPlan}`);
|
|
102
|
+
} else {
|
|
103
|
+
lines.push(`- Plan: none`);
|
|
104
|
+
}
|
|
105
|
+
lines.push(`- Reports: ${reportsPath}`);
|
|
106
|
+
lines.push(`- Paths: ${plansPath}/ | ${docsPath}/`);
|
|
107
|
+
lines.push(``);
|
|
108
|
+
|
|
109
|
+
// Language (thinking + response, if configured)
|
|
110
|
+
const hasThinking = effectiveThinking && effectiveThinking !== responseLanguage;
|
|
111
|
+
if (hasThinking || responseLanguage) {
|
|
112
|
+
lines.push(`## Language`);
|
|
113
|
+
if (hasThinking) {
|
|
114
|
+
lines.push(`- Thinking: Use ${effectiveThinking} for reasoning (logic, precision).`);
|
|
115
|
+
}
|
|
116
|
+
if (responseLanguage) {
|
|
117
|
+
lines.push(`- Response: Respond in ${responseLanguage} (natural, fluent).`);
|
|
118
|
+
}
|
|
119
|
+
lines.push(``);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Core rules (minimal)
|
|
123
|
+
lines.push(`## Rules`);
|
|
124
|
+
lines.push(`- Reports → ${reportsPath}`);
|
|
125
|
+
lines.push(`- YAGNI / KISS / DRY`);
|
|
126
|
+
lines.push(`- Concise, list unresolved Qs at end`);
|
|
127
|
+
|
|
128
|
+
// Naming templates (computed directly for reliable injection)
|
|
129
|
+
lines.push(``);
|
|
130
|
+
lines.push(`## Naming`);
|
|
131
|
+
lines.push(`- Report: ${path.join(reportsPath, `${agentType}-${namePattern}.md`)}`);
|
|
132
|
+
lines.push(`- Plan dir: ${path.join(plansPath, namePattern)}/`);
|
|
133
|
+
|
|
134
|
+
// Trust verification (if enabled)
|
|
135
|
+
lines.push(...buildTrustVerification(config));
|
|
136
|
+
|
|
137
|
+
// Agent-specific context (if configured)
|
|
138
|
+
const agentContext = getAgentContext(agentType, config);
|
|
139
|
+
if (agentContext) {
|
|
140
|
+
lines.push(``);
|
|
141
|
+
lines.push(`## Agent Instructions`);
|
|
142
|
+
lines.push(agentContext);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// CRITICAL: SubagentStart requires hookSpecificOutput.additionalContext format
|
|
146
|
+
const output = {
|
|
147
|
+
hookSpecificOutput: {
|
|
148
|
+
hookEventName: "SubagentStart",
|
|
149
|
+
additionalContext: lines.join('\n')
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
console.log(JSON.stringify(output));
|
|
154
|
+
process.exit(0);
|
|
155
|
+
} catch (error) {
|
|
156
|
+
console.error(`SubagentStart hook error: ${error.message}`);
|
|
157
|
+
process.exit(0); // Fail-open
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
main();
|