@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,445 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Database performance analysis tool for MongoDB and PostgreSQL.
|
|
4
|
+
Analyzes slow queries, recommends indexes, and generates reports.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import argparse
|
|
8
|
+
import json
|
|
9
|
+
import sys
|
|
10
|
+
from dataclasses import dataclass, asdict
|
|
11
|
+
from datetime import datetime
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
from typing import Dict, List, Optional
|
|
14
|
+
|
|
15
|
+
try:
|
|
16
|
+
from pymongo import MongoClient
|
|
17
|
+
MONGO_AVAILABLE = True
|
|
18
|
+
except ImportError:
|
|
19
|
+
MONGO_AVAILABLE = False
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
import psycopg2
|
|
23
|
+
from psycopg2.extras import RealDictCursor
|
|
24
|
+
POSTGRES_AVAILABLE = True
|
|
25
|
+
except ImportError:
|
|
26
|
+
POSTGRES_AVAILABLE = False
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
@dataclass
|
|
30
|
+
class SlowQuery:
|
|
31
|
+
"""Represents a slow query."""
|
|
32
|
+
|
|
33
|
+
query: str
|
|
34
|
+
execution_time_ms: float
|
|
35
|
+
count: int
|
|
36
|
+
collection_or_table: Optional[str] = None
|
|
37
|
+
index_used: Optional[str] = None
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclass
|
|
41
|
+
class IndexRecommendation:
|
|
42
|
+
"""Index recommendation."""
|
|
43
|
+
|
|
44
|
+
collection_or_table: str
|
|
45
|
+
fields: List[str]
|
|
46
|
+
reason: str
|
|
47
|
+
estimated_benefit: str
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
@dataclass
|
|
51
|
+
class PerformanceReport:
|
|
52
|
+
"""Performance analysis report."""
|
|
53
|
+
|
|
54
|
+
database_type: str
|
|
55
|
+
database_name: str
|
|
56
|
+
timestamp: datetime
|
|
57
|
+
slow_queries: List[SlowQuery]
|
|
58
|
+
index_recommendations: List[IndexRecommendation]
|
|
59
|
+
database_metrics: Dict[str, any]
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class PerformanceAnalyzer:
|
|
63
|
+
"""Analyzes database performance."""
|
|
64
|
+
|
|
65
|
+
def __init__(self, db_type: str, connection_string: str, threshold_ms: int = 100):
|
|
66
|
+
"""
|
|
67
|
+
Initialize performance analyzer.
|
|
68
|
+
|
|
69
|
+
Args:
|
|
70
|
+
db_type: Database type ('mongodb' or 'postgres')
|
|
71
|
+
connection_string: Database connection string
|
|
72
|
+
threshold_ms: Slow query threshold in milliseconds
|
|
73
|
+
"""
|
|
74
|
+
self.db_type = db_type.lower()
|
|
75
|
+
self.connection_string = connection_string
|
|
76
|
+
self.threshold_ms = threshold_ms
|
|
77
|
+
|
|
78
|
+
self.client = None
|
|
79
|
+
self.db = None
|
|
80
|
+
self.conn = None
|
|
81
|
+
|
|
82
|
+
def connect(self) -> bool:
|
|
83
|
+
"""Connect to database."""
|
|
84
|
+
try:
|
|
85
|
+
if self.db_type == "mongodb":
|
|
86
|
+
if not MONGO_AVAILABLE:
|
|
87
|
+
print("Error: pymongo not installed")
|
|
88
|
+
return False
|
|
89
|
+
self.client = MongoClient(self.connection_string)
|
|
90
|
+
self.db = self.client.get_default_database()
|
|
91
|
+
self.client.server_info()
|
|
92
|
+
return True
|
|
93
|
+
|
|
94
|
+
elif self.db_type == "postgres":
|
|
95
|
+
if not POSTGRES_AVAILABLE:
|
|
96
|
+
print("Error: psycopg2 not installed")
|
|
97
|
+
return False
|
|
98
|
+
self.conn = psycopg2.connect(self.connection_string)
|
|
99
|
+
return True
|
|
100
|
+
|
|
101
|
+
else:
|
|
102
|
+
print(f"Error: Unsupported database type: {self.db_type}")
|
|
103
|
+
return False
|
|
104
|
+
|
|
105
|
+
except Exception as e:
|
|
106
|
+
print(f"Connection error: {e}")
|
|
107
|
+
return False
|
|
108
|
+
|
|
109
|
+
def disconnect(self):
|
|
110
|
+
"""Disconnect from database."""
|
|
111
|
+
try:
|
|
112
|
+
if self.client:
|
|
113
|
+
self.client.close()
|
|
114
|
+
if self.conn:
|
|
115
|
+
self.conn.close()
|
|
116
|
+
except Exception as e:
|
|
117
|
+
print(f"Disconnect error: {e}")
|
|
118
|
+
|
|
119
|
+
def analyze(self) -> Optional[PerformanceReport]:
|
|
120
|
+
"""
|
|
121
|
+
Analyze database performance.
|
|
122
|
+
|
|
123
|
+
Returns:
|
|
124
|
+
PerformanceReport if successful, None otherwise
|
|
125
|
+
"""
|
|
126
|
+
try:
|
|
127
|
+
if self.db_type == "mongodb":
|
|
128
|
+
return self._analyze_mongodb()
|
|
129
|
+
elif self.db_type == "postgres":
|
|
130
|
+
return self._analyze_postgres()
|
|
131
|
+
else:
|
|
132
|
+
return None
|
|
133
|
+
|
|
134
|
+
except Exception as e:
|
|
135
|
+
print(f"Analysis error: {e}")
|
|
136
|
+
return None
|
|
137
|
+
|
|
138
|
+
def _analyze_mongodb(self) -> PerformanceReport:
|
|
139
|
+
"""Analyze MongoDB performance."""
|
|
140
|
+
slow_queries = []
|
|
141
|
+
index_recommendations = []
|
|
142
|
+
|
|
143
|
+
# Enable profiling if not enabled
|
|
144
|
+
profiling_level = self.db.command("profile", -1)
|
|
145
|
+
if profiling_level.get("was", 0) == 0:
|
|
146
|
+
self.db.command("profile", 1, slowms=self.threshold_ms)
|
|
147
|
+
|
|
148
|
+
# Get slow queries from system.profile
|
|
149
|
+
for doc in self.db.system.profile.find(
|
|
150
|
+
{"millis": {"$gte": self.threshold_ms}},
|
|
151
|
+
limit=50
|
|
152
|
+
).sort("millis", -1):
|
|
153
|
+
|
|
154
|
+
query_str = json.dumps(doc.get("command", {}), default=str)
|
|
155
|
+
|
|
156
|
+
slow_queries.append(SlowQuery(
|
|
157
|
+
query=query_str,
|
|
158
|
+
execution_time_ms=doc.get("millis", 0),
|
|
159
|
+
count=1,
|
|
160
|
+
collection_or_table=doc.get("ns", "").split(".")[-1] if "ns" in doc else None,
|
|
161
|
+
index_used=doc.get("planSummary")
|
|
162
|
+
))
|
|
163
|
+
|
|
164
|
+
# Analyze collections for index recommendations
|
|
165
|
+
for coll_name in self.db.list_collection_names():
|
|
166
|
+
if coll_name.startswith("system."):
|
|
167
|
+
continue
|
|
168
|
+
|
|
169
|
+
coll = self.db[coll_name]
|
|
170
|
+
|
|
171
|
+
# Check for collections scans
|
|
172
|
+
stats = coll.aggregate([
|
|
173
|
+
{"$collStats": {"storageStats": {}}}
|
|
174
|
+
]).next()
|
|
175
|
+
|
|
176
|
+
# Check if collection has indexes
|
|
177
|
+
indexes = list(coll.list_indexes())
|
|
178
|
+
|
|
179
|
+
if len(indexes) <= 1: # Only _id index
|
|
180
|
+
# Recommend indexes based on common patterns
|
|
181
|
+
# Sample documents to find frequently queried fields
|
|
182
|
+
sample = list(coll.find().limit(100))
|
|
183
|
+
|
|
184
|
+
if sample:
|
|
185
|
+
# Find fields that appear in most documents
|
|
186
|
+
field_freq = {}
|
|
187
|
+
for doc in sample:
|
|
188
|
+
for field in doc.keys():
|
|
189
|
+
if field != "_id":
|
|
190
|
+
field_freq[field] = field_freq.get(field, 0) + 1
|
|
191
|
+
|
|
192
|
+
# Recommend index on most common field
|
|
193
|
+
if field_freq:
|
|
194
|
+
top_field = max(field_freq.items(), key=lambda x: x[1])[0]
|
|
195
|
+
index_recommendations.append(IndexRecommendation(
|
|
196
|
+
collection_or_table=coll_name,
|
|
197
|
+
fields=[top_field],
|
|
198
|
+
reason="Frequently queried field without index",
|
|
199
|
+
estimated_benefit="High"
|
|
200
|
+
))
|
|
201
|
+
|
|
202
|
+
# Get database metrics
|
|
203
|
+
server_status = self.client.admin.command("serverStatus")
|
|
204
|
+
db_stats = self.db.command("dbStats")
|
|
205
|
+
|
|
206
|
+
metrics = {
|
|
207
|
+
"connections": server_status.get("connections", {}).get("current", 0),
|
|
208
|
+
"operations_per_sec": server_status.get("opcounters", {}).get("query", 0),
|
|
209
|
+
"database_size_mb": db_stats.get("dataSize", 0) / (1024 * 1024),
|
|
210
|
+
"index_size_mb": db_stats.get("indexSize", 0) / (1024 * 1024),
|
|
211
|
+
"collections": db_stats.get("collections", 0)
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return PerformanceReport(
|
|
215
|
+
database_type="mongodb",
|
|
216
|
+
database_name=self.db.name,
|
|
217
|
+
timestamp=datetime.now(),
|
|
218
|
+
slow_queries=slow_queries[:10], # Top 10
|
|
219
|
+
index_recommendations=index_recommendations,
|
|
220
|
+
database_metrics=metrics
|
|
221
|
+
)
|
|
222
|
+
|
|
223
|
+
def _analyze_postgres(self) -> PerformanceReport:
|
|
224
|
+
"""Analyze PostgreSQL performance."""
|
|
225
|
+
slow_queries = []
|
|
226
|
+
index_recommendations = []
|
|
227
|
+
|
|
228
|
+
with self.conn.cursor(cursor_factory=RealDictCursor) as cur:
|
|
229
|
+
# Check if pg_stat_statements extension is available
|
|
230
|
+
cur.execute("""
|
|
231
|
+
SELECT EXISTS (
|
|
232
|
+
SELECT 1 FROM pg_extension WHERE extname = 'pg_stat_statements'
|
|
233
|
+
) AS has_extension
|
|
234
|
+
""")
|
|
235
|
+
has_pg_stat_statements = cur.fetchone()["has_extension"]
|
|
236
|
+
|
|
237
|
+
if has_pg_stat_statements:
|
|
238
|
+
# Get slow queries from pg_stat_statements
|
|
239
|
+
cur.execute("""
|
|
240
|
+
SELECT
|
|
241
|
+
query,
|
|
242
|
+
mean_exec_time,
|
|
243
|
+
calls,
|
|
244
|
+
total_exec_time
|
|
245
|
+
FROM pg_stat_statements
|
|
246
|
+
WHERE mean_exec_time >= %s
|
|
247
|
+
ORDER BY mean_exec_time DESC
|
|
248
|
+
LIMIT 10
|
|
249
|
+
""", (self.threshold_ms,))
|
|
250
|
+
|
|
251
|
+
for row in cur.fetchall():
|
|
252
|
+
slow_queries.append(SlowQuery(
|
|
253
|
+
query=row["query"],
|
|
254
|
+
execution_time_ms=row["mean_exec_time"],
|
|
255
|
+
count=row["calls"]
|
|
256
|
+
))
|
|
257
|
+
|
|
258
|
+
# Find tables with sequential scans (potential index candidates)
|
|
259
|
+
cur.execute("""
|
|
260
|
+
SELECT
|
|
261
|
+
schemaname,
|
|
262
|
+
tablename,
|
|
263
|
+
seq_scan,
|
|
264
|
+
seq_tup_read,
|
|
265
|
+
idx_scan
|
|
266
|
+
FROM pg_stat_user_tables
|
|
267
|
+
WHERE seq_scan > 1000
|
|
268
|
+
AND (idx_scan IS NULL OR seq_scan > idx_scan * 2)
|
|
269
|
+
ORDER BY seq_tup_read DESC
|
|
270
|
+
LIMIT 10
|
|
271
|
+
""")
|
|
272
|
+
|
|
273
|
+
for row in cur.fetchall():
|
|
274
|
+
index_recommendations.append(IndexRecommendation(
|
|
275
|
+
collection_or_table=f"{row['schemaname']}.{row['tablename']}",
|
|
276
|
+
fields=["<analyze query patterns>"],
|
|
277
|
+
reason=f"High sequential scans ({row['seq_scan']}) vs index scans ({row['idx_scan'] or 0})",
|
|
278
|
+
estimated_benefit="High" if row["seq_tup_read"] > 100000 else "Medium"
|
|
279
|
+
))
|
|
280
|
+
|
|
281
|
+
# Find unused indexes
|
|
282
|
+
cur.execute("""
|
|
283
|
+
SELECT
|
|
284
|
+
schemaname,
|
|
285
|
+
tablename,
|
|
286
|
+
indexname,
|
|
287
|
+
idx_scan
|
|
288
|
+
FROM pg_stat_user_indexes
|
|
289
|
+
WHERE idx_scan = 0
|
|
290
|
+
AND indexname NOT LIKE '%_pkey'
|
|
291
|
+
ORDER BY pg_relation_size(indexrelid) DESC
|
|
292
|
+
""")
|
|
293
|
+
|
|
294
|
+
unused_indexes = []
|
|
295
|
+
for row in cur.fetchall():
|
|
296
|
+
unused_indexes.append(
|
|
297
|
+
f"{row['schemaname']}.{row['tablename']}.{row['indexname']}"
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
# Database metrics
|
|
301
|
+
cur.execute("""
|
|
302
|
+
SELECT
|
|
303
|
+
sum(numbackends) AS connections,
|
|
304
|
+
sum(xact_commit) AS commits,
|
|
305
|
+
sum(xact_rollback) AS rollbacks
|
|
306
|
+
FROM pg_stat_database
|
|
307
|
+
WHERE datname = current_database()
|
|
308
|
+
""")
|
|
309
|
+
stats = cur.fetchone()
|
|
310
|
+
|
|
311
|
+
cur.execute("""
|
|
312
|
+
SELECT pg_database_size(current_database()) AS db_size
|
|
313
|
+
""")
|
|
314
|
+
db_size = cur.fetchone()["db_size"]
|
|
315
|
+
|
|
316
|
+
cur.execute("""
|
|
317
|
+
SELECT
|
|
318
|
+
sum(heap_blks_hit) / NULLIF(sum(heap_blks_hit) + sum(heap_blks_read), 0) AS cache_hit_ratio
|
|
319
|
+
FROM pg_statio_user_tables
|
|
320
|
+
""")
|
|
321
|
+
cache_ratio = cur.fetchone()["cache_hit_ratio"] or 0
|
|
322
|
+
|
|
323
|
+
metrics = {
|
|
324
|
+
"connections": stats["connections"],
|
|
325
|
+
"commits": stats["commits"],
|
|
326
|
+
"rollbacks": stats["rollbacks"],
|
|
327
|
+
"database_size_mb": db_size / (1024 * 1024),
|
|
328
|
+
"cache_hit_ratio": float(cache_ratio),
|
|
329
|
+
"unused_indexes": unused_indexes
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
return PerformanceReport(
|
|
333
|
+
database_type="postgres",
|
|
334
|
+
database_name=self.conn.info.dbname,
|
|
335
|
+
timestamp=datetime.now(),
|
|
336
|
+
slow_queries=slow_queries,
|
|
337
|
+
index_recommendations=index_recommendations,
|
|
338
|
+
database_metrics=metrics
|
|
339
|
+
)
|
|
340
|
+
|
|
341
|
+
def print_report(self, report: PerformanceReport):
|
|
342
|
+
"""Print performance report."""
|
|
343
|
+
print("=" * 80)
|
|
344
|
+
print(f"Database Performance Report - {report.database_type.upper()}")
|
|
345
|
+
print(f"Database: {report.database_name}")
|
|
346
|
+
print(f"Timestamp: {report.timestamp}")
|
|
347
|
+
print("=" * 80)
|
|
348
|
+
|
|
349
|
+
print("\n## Database Metrics")
|
|
350
|
+
print("-" * 80)
|
|
351
|
+
for key, value in report.database_metrics.items():
|
|
352
|
+
if isinstance(value, float):
|
|
353
|
+
print(f"{key}: {value:.2f}")
|
|
354
|
+
else:
|
|
355
|
+
print(f"{key}: {value}")
|
|
356
|
+
|
|
357
|
+
print("\n## Slow Queries")
|
|
358
|
+
print("-" * 80)
|
|
359
|
+
if report.slow_queries:
|
|
360
|
+
for i, query in enumerate(report.slow_queries, 1):
|
|
361
|
+
print(f"\n{i}. Execution Time: {query.execution_time_ms:.2f}ms | Count: {query.count}")
|
|
362
|
+
if query.collection_or_table:
|
|
363
|
+
print(f" Collection/Table: {query.collection_or_table}")
|
|
364
|
+
if query.index_used:
|
|
365
|
+
print(f" Index Used: {query.index_used}")
|
|
366
|
+
print(f" Query: {query.query[:200]}...")
|
|
367
|
+
else:
|
|
368
|
+
print("No slow queries found")
|
|
369
|
+
|
|
370
|
+
print("\n## Index Recommendations")
|
|
371
|
+
print("-" * 80)
|
|
372
|
+
if report.index_recommendations:
|
|
373
|
+
for i, rec in enumerate(report.index_recommendations, 1):
|
|
374
|
+
print(f"\n{i}. {rec.collection_or_table}")
|
|
375
|
+
print(f" Fields: {', '.join(rec.fields)}")
|
|
376
|
+
print(f" Reason: {rec.reason}")
|
|
377
|
+
print(f" Estimated Benefit: {rec.estimated_benefit}")
|
|
378
|
+
|
|
379
|
+
if report.database_type == "mongodb":
|
|
380
|
+
index_spec = {field: 1 for field in rec.fields}
|
|
381
|
+
print(f" Command: db.{rec.collection_or_table}.createIndex({json.dumps(index_spec)})")
|
|
382
|
+
elif report.database_type == "postgres":
|
|
383
|
+
fields_str = ", ".join(rec.fields)
|
|
384
|
+
print(f" Command: CREATE INDEX idx_{rec.collection_or_table.replace('.', '_')}_{rec.fields[0]} ON {rec.collection_or_table}({fields_str});")
|
|
385
|
+
else:
|
|
386
|
+
print("No index recommendations")
|
|
387
|
+
|
|
388
|
+
print("\n" + "=" * 80)
|
|
389
|
+
|
|
390
|
+
def save_report(self, report: PerformanceReport, filename: str):
|
|
391
|
+
"""Save report to JSON file."""
|
|
392
|
+
# Convert dataclasses to dict
|
|
393
|
+
report_dict = {
|
|
394
|
+
"database_type": report.database_type,
|
|
395
|
+
"database_name": report.database_name,
|
|
396
|
+
"timestamp": report.timestamp.isoformat(),
|
|
397
|
+
"slow_queries": [asdict(q) for q in report.slow_queries],
|
|
398
|
+
"index_recommendations": [asdict(r) for r in report.index_recommendations],
|
|
399
|
+
"database_metrics": report.database_metrics
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
with open(filename, "w") as f:
|
|
403
|
+
json.dump(report_dict, f, indent=2, default=str)
|
|
404
|
+
|
|
405
|
+
print(f"\nReport saved to: {filename}")
|
|
406
|
+
|
|
407
|
+
|
|
408
|
+
def main():
|
|
409
|
+
"""Main entry point."""
|
|
410
|
+
parser = argparse.ArgumentParser(description="Database performance analysis tool")
|
|
411
|
+
parser.add_argument("--db", required=True, choices=["mongodb", "postgres"],
|
|
412
|
+
help="Database type")
|
|
413
|
+
parser.add_argument("--uri", required=True, help="Database connection string")
|
|
414
|
+
parser.add_argument("--threshold", type=int, default=100,
|
|
415
|
+
help="Slow query threshold in milliseconds (default: 100)")
|
|
416
|
+
parser.add_argument("--output", help="Save report to JSON file")
|
|
417
|
+
|
|
418
|
+
args = parser.parse_args()
|
|
419
|
+
|
|
420
|
+
analyzer = PerformanceAnalyzer(args.db, args.uri, args.threshold)
|
|
421
|
+
|
|
422
|
+
if not analyzer.connect():
|
|
423
|
+
sys.exit(1)
|
|
424
|
+
|
|
425
|
+
try:
|
|
426
|
+
print(f"Analyzing {args.db} performance (threshold: {args.threshold}ms)...")
|
|
427
|
+
report = analyzer.analyze()
|
|
428
|
+
|
|
429
|
+
if report:
|
|
430
|
+
analyzer.print_report(report)
|
|
431
|
+
|
|
432
|
+
if args.output:
|
|
433
|
+
analyzer.save_report(report, args.output)
|
|
434
|
+
|
|
435
|
+
sys.exit(0)
|
|
436
|
+
else:
|
|
437
|
+
print("Analysis failed")
|
|
438
|
+
sys.exit(1)
|
|
439
|
+
|
|
440
|
+
finally:
|
|
441
|
+
analyzer.disconnect()
|
|
442
|
+
|
|
443
|
+
|
|
444
|
+
if __name__ == "__main__":
|
|
445
|
+
main()
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: Debugging
|
|
3
|
+
description: Systematic debugging framework ensuring root cause investigation before fixes. Includes four-phase debugging process, backward call stack tracing, multi-layer validation, and verification protocols. Use when encountering bugs, test failures, unexpected behavior, performance issues, or before claiming work complete. Prevents random fixes, masks over symptoms, and false completion claims.
|
|
4
|
+
version: 3.0.0
|
|
5
|
+
languages: all
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Debugging
|
|
9
|
+
|
|
10
|
+
Comprehensive debugging framework combining systematic investigation, root cause tracing, defense-in-depth validation, and verification protocols.
|
|
11
|
+
|
|
12
|
+
## Core Principle
|
|
13
|
+
|
|
14
|
+
**NO FIXES WITHOUT ROOT CAUSE INVESTIGATION FIRST**
|
|
15
|
+
|
|
16
|
+
Random fixes waste time and create new bugs. Find the root cause, fix at source, validate at every layer, verify before claiming success.
|
|
17
|
+
|
|
18
|
+
## When to Use
|
|
19
|
+
|
|
20
|
+
**Always use for:** Test failures, bugs, unexpected behavior, performance issues, build failures, integration problems, before claiming work complete
|
|
21
|
+
|
|
22
|
+
**Especially when:** Under time pressure, "quick fix" seems obvious, tried multiple fixes, don't fully understand issue, about to claim success
|
|
23
|
+
|
|
24
|
+
## The Four Techniques
|
|
25
|
+
|
|
26
|
+
### 1. Systematic Debugging (`references/systematic-debugging.md`)
|
|
27
|
+
|
|
28
|
+
Four-phase framework ensuring proper investigation:
|
|
29
|
+
- Phase 1: Root Cause Investigation (read errors, reproduce, check changes, gather evidence)
|
|
30
|
+
- Phase 2: Pattern Analysis (find working examples, compare, identify differences)
|
|
31
|
+
- Phase 3: Hypothesis and Testing (form theory, test minimally, verify)
|
|
32
|
+
- Phase 4: Implementation (create test, fix once, verify)
|
|
33
|
+
|
|
34
|
+
**Key rule:** Complete each phase before proceeding. No fixes without Phase 1.
|
|
35
|
+
|
|
36
|
+
**Load when:** Any bug/issue requiring investigation and fix
|
|
37
|
+
|
|
38
|
+
### 2. Root Cause Tracing (`references/root-cause-tracing.md`)
|
|
39
|
+
|
|
40
|
+
Trace bugs backward through call stack to find original trigger.
|
|
41
|
+
|
|
42
|
+
**Technique:** When error appears deep in execution, trace backward level-by-level until finding source where invalid data originated. Fix at source, not at symptom.
|
|
43
|
+
|
|
44
|
+
**Includes:** `scripts/find-polluter.sh` for bisecting test pollution
|
|
45
|
+
|
|
46
|
+
**Load when:** Error deep in call stack, unclear where invalid data originated
|
|
47
|
+
|
|
48
|
+
### 3. Defense-in-Depth (`references/defense-in-depth.md`)
|
|
49
|
+
|
|
50
|
+
Validate at every layer data passes through. Make bugs impossible.
|
|
51
|
+
|
|
52
|
+
**Four layers:** Entry validation → Business logic → Environment guards → Debug instrumentation
|
|
53
|
+
|
|
54
|
+
**Load when:** After finding root cause, need to add comprehensive validation
|
|
55
|
+
|
|
56
|
+
### 4. Verification (`references/verification.md`)
|
|
57
|
+
|
|
58
|
+
Run verification commands and confirm output before claiming success.
|
|
59
|
+
|
|
60
|
+
**Iron law:** NO COMPLETION CLAIMS WITHOUT FRESH VERIFICATION EVIDENCE
|
|
61
|
+
|
|
62
|
+
Run the command. Read the output. Then claim the result.
|
|
63
|
+
|
|
64
|
+
**Load when:** About to claim work complete, fixed, or passing
|
|
65
|
+
|
|
66
|
+
## Quick Reference
|
|
67
|
+
|
|
68
|
+
```
|
|
69
|
+
Bug → systematic-debugging.md (Phase 1-4)
|
|
70
|
+
Error deep in stack? → root-cause-tracing.md (trace backward)
|
|
71
|
+
Found root cause? → defense-in-depth.md (add layers)
|
|
72
|
+
About to claim success? → verification.md (verify first)
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Red Flags
|
|
76
|
+
|
|
77
|
+
Stop and follow process if thinking:
|
|
78
|
+
- "Quick fix for now, investigate later"
|
|
79
|
+
- "Just try changing X and see if it works"
|
|
80
|
+
- "It's probably X, let me fix that"
|
|
81
|
+
- "Should work now" / "Seems fixed"
|
|
82
|
+
- "Tests pass, we're done"
|
|
83
|
+
|
|
84
|
+
**All mean:** Return to systematic process.
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# Defense-in-Depth Validation
|
|
2
|
+
|
|
3
|
+
Validate at every layer data passes through to make bugs impossible.
|
|
4
|
+
|
|
5
|
+
## Core Principle
|
|
6
|
+
|
|
7
|
+
**Validate at EVERY layer data passes through. Make bug structurally impossible.**
|
|
8
|
+
|
|
9
|
+
When fix bug caused by invalid data, adding validation at one place feels sufficient. But single check can be bypassed by different code paths, refactoring, or mocks.
|
|
10
|
+
|
|
11
|
+
## Why Multiple Layers
|
|
12
|
+
|
|
13
|
+
Single validation: "We fixed bug"
|
|
14
|
+
Multiple layers: "We made bug impossible"
|
|
15
|
+
|
|
16
|
+
Different layers catch different cases:
|
|
17
|
+
- Entry validation catches most bugs
|
|
18
|
+
- Business logic catches edge cases
|
|
19
|
+
- Environment guards prevent context-specific dangers
|
|
20
|
+
- Debug logging helps when other layers fail
|
|
21
|
+
|
|
22
|
+
## The Four Layers
|
|
23
|
+
|
|
24
|
+
### Layer 1: Entry Point Validation
|
|
25
|
+
**Purpose:** Reject obviously invalid input at API boundary
|
|
26
|
+
|
|
27
|
+
```typescript
|
|
28
|
+
function createProject(name: string, workingDirectory: string) {
|
|
29
|
+
if (!workingDirectory || workingDirectory.trim() === '') {
|
|
30
|
+
throw new Error('workingDirectory cannot be empty');
|
|
31
|
+
}
|
|
32
|
+
if (!existsSync(workingDirectory)) {
|
|
33
|
+
throw new Error(`workingDirectory does not exist: ${workingDirectory}`);
|
|
34
|
+
}
|
|
35
|
+
if (!statSync(workingDirectory).isDirectory()) {
|
|
36
|
+
throw new Error(`workingDirectory is not a directory: ${workingDirectory}`);
|
|
37
|
+
}
|
|
38
|
+
// proceed
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
### Layer 2: Business Logic Validation
|
|
43
|
+
**Purpose:** Ensure data makes sense for this operation
|
|
44
|
+
|
|
45
|
+
```typescript
|
|
46
|
+
function initializeWorkspace(projectDir: string, sessionId: string) {
|
|
47
|
+
if (!projectDir) {
|
|
48
|
+
throw new Error('projectDir required for workspace initialization');
|
|
49
|
+
}
|
|
50
|
+
// proceed
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### Layer 3: Environment Guards
|
|
55
|
+
**Purpose:** Prevent dangerous operations in specific contexts
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
async function gitInit(directory: string) {
|
|
59
|
+
// In tests, refuse git init outside temp directories
|
|
60
|
+
if (process.env.NODE_ENV === 'test') {
|
|
61
|
+
const normalized = normalize(resolve(directory));
|
|
62
|
+
const tmpDir = normalize(resolve(tmpdir()));
|
|
63
|
+
|
|
64
|
+
if (!normalized.startsWith(tmpDir)) {
|
|
65
|
+
throw new Error(
|
|
66
|
+
`Refusing git init outside temp dir during tests: ${directory}`
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
// proceed
|
|
71
|
+
}
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Layer 4: Debug Instrumentation
|
|
75
|
+
**Purpose:** Capture context for forensics
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
async function gitInit(directory: string) {
|
|
79
|
+
const stack = new Error().stack;
|
|
80
|
+
logger.debug('About to git init', {
|
|
81
|
+
directory,
|
|
82
|
+
cwd: process.cwd(),
|
|
83
|
+
stack,
|
|
84
|
+
});
|
|
85
|
+
// proceed
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Applying the Pattern
|
|
90
|
+
|
|
91
|
+
When find bug:
|
|
92
|
+
|
|
93
|
+
1. **Trace data flow** - Where does bad value originate? Where used?
|
|
94
|
+
2. **Map all checkpoints** - List every point data passes through
|
|
95
|
+
3. **Add validation at each layer** - Entry, business, environment, debug
|
|
96
|
+
4. **Test each layer** - Try to bypass layer 1, verify layer 2 catches it
|
|
97
|
+
|
|
98
|
+
## Example from Real Session
|
|
99
|
+
|
|
100
|
+
Bug: Empty `projectDir` caused `git init` in source code
|
|
101
|
+
|
|
102
|
+
**Data flow:**
|
|
103
|
+
1. Test setup → empty string
|
|
104
|
+
2. `Project.create(name, '')`
|
|
105
|
+
3. `WorkspaceManager.createWorkspace('')`
|
|
106
|
+
4. `git init` runs in `process.cwd()`
|
|
107
|
+
|
|
108
|
+
**Four layers added:**
|
|
109
|
+
- Layer 1: `Project.create()` validates not empty/exists/writable
|
|
110
|
+
- Layer 2: `WorkspaceManager` validates projectDir not empty
|
|
111
|
+
- Layer 3: `WorktreeManager` refuses git init outside tmpdir in tests
|
|
112
|
+
- Layer 4: Stack trace logging before git init
|
|
113
|
+
|
|
114
|
+
**Result:** All 1847 tests passed, bug impossible to reproduce
|
|
115
|
+
|
|
116
|
+
## Key Insight
|
|
117
|
+
|
|
118
|
+
All four layers were necessary. During testing, each layer caught bugs others missed:
|
|
119
|
+
- Different code paths bypassed entry validation
|
|
120
|
+
- Mocks bypassed business logic checks
|
|
121
|
+
- Edge cases on different platforms needed environment guards
|
|
122
|
+
- Debug logging identified structural misuse
|
|
123
|
+
|
|
124
|
+
**Don't stop at one validation point.** Add checks at every layer.
|