@trieungoctam/vibekit 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +85 -0
- package/agents/debugger.md +158 -0
- package/agents/docs-manager.md +220 -0
- package/agents/planner.md +129 -0
- package/agents/researcher.md +58 -0
- package/agents/reviewer.md +152 -0
- package/agents/tester.md +126 -0
- package/bin/vibekit.js +18 -0
- package/hooks/lib/ck-config-utils.cjs +831 -0
- package/hooks/lib/colors.cjs +95 -0
- package/hooks/lib/config-counter.cjs +103 -0
- package/hooks/lib/context-builder.cjs +616 -0
- package/hooks/lib/git-info-cache.cjs +143 -0
- package/hooks/lib/hook-logger.cjs +92 -0
- package/hooks/lib/privacy-checker.cjs +297 -0
- package/hooks/lib/project-detector.cjs +474 -0
- package/hooks/lib/scout-checker.cjs +263 -0
- package/hooks/lib/transcript-parser.cjs +181 -0
- package/hooks/post-edit-simplify-reminder.cjs +156 -0
- package/hooks/privacy-block.cjs +166 -0
- package/hooks/scout-block.cjs +147 -0
- package/hooks/session-init.cjs +360 -0
- package/package.json +41 -0
- package/rules/development-rules.md +52 -0
- package/rules/documentation-management.md +121 -0
- package/rules/orchestration-protocol.md +43 -0
- package/rules/primary-workflow.md +57 -0
- package/rules/team-coordination-rules.md +90 -0
- package/skills/ai/agent-browser/SKILL.md +294 -0
- package/skills/ai/agent-browser/references/.gitkeep +0 -0
- package/skills/ai/agent-browser/references/agent-browser-vs-chrome-devtools.md +112 -0
- package/skills/ai/agent-browser/references/browserbase-cloud-setup.md +161 -0
- package/skills/ai/ai-artist/SKILL.md +122 -0
- package/skills/ai/ai-artist/data/awesome-prompts.csv +3592 -0
- package/skills/ai/ai-artist/data/lighting.csv +19 -0
- package/skills/ai/ai-artist/data/nano-banana-templates.csv +17 -0
- package/skills/ai/ai-artist/data/platforms.csv +11 -0
- package/skills/ai/ai-artist/data/styles.csv +26 -0
- package/skills/ai/ai-artist/data/techniques.csv +19 -0
- package/skills/ai/ai-artist/data/use-cases.csv +16 -0
- package/skills/ai/ai-artist/references/advanced-techniques.md +184 -0
- package/skills/ai/ai-artist/references/awesome-nano-banana-pro-prompts.md +8575 -0
- package/skills/ai/ai-artist/references/domain-code.md +66 -0
- package/skills/ai/ai-artist/references/domain-data.md +72 -0
- package/skills/ai/ai-artist/references/domain-marketing.md +66 -0
- package/skills/ai/ai-artist/references/domain-patterns.md +33 -0
- package/skills/ai/ai-artist/references/domain-writing.md +68 -0
- package/skills/ai/ai-artist/references/image-prompting.md +141 -0
- package/skills/ai/ai-artist/references/llm-prompting.md +165 -0
- package/skills/ai/ai-artist/references/nano-banana.md +136 -0
- package/skills/ai/ai-artist/references/reasoning-techniques.md +201 -0
- package/skills/ai/ai-artist/references/validation-workflow.md +117 -0
- package/skills/ai/ai-artist/scripts/core.py +197 -0
- package/skills/ai/ai-artist/scripts/extract_prompts.py +102 -0
- package/skills/ai/ai-artist/scripts/generate.py +370 -0
- package/skills/ai/ai-artist/scripts/search.py +147 -0
- package/skills/ai/ai-multimodal/.env.example +204 -0
- package/skills/ai/ai-multimodal/SKILL.md +110 -0
- package/skills/ai/ai-multimodal/references/audio-processing.md +387 -0
- package/skills/ai/ai-multimodal/references/image-generation.md +939 -0
- package/skills/ai/ai-multimodal/references/music-generation.md +311 -0
- package/skills/ai/ai-multimodal/references/video-analysis.md +515 -0
- package/skills/ai/ai-multimodal/references/video-generation.md +457 -0
- package/skills/ai/ai-multimodal/references/vision-understanding.md +492 -0
- package/skills/ai/ai-multimodal/scripts/.coverage +0 -0
- package/skills/ai/ai-multimodal/scripts/check_setup.py +315 -0
- package/skills/ai/ai-multimodal/scripts/document_converter.py +395 -0
- package/skills/ai/ai-multimodal/scripts/gemini_batch_process.py +1185 -0
- package/skills/ai/ai-multimodal/scripts/media_optimizer.py +506 -0
- package/skills/ai/ai-multimodal/scripts/requirements.txt +26 -0
- package/skills/ai/ai-multimodal/scripts/tests/.coverage +0 -0
- package/skills/ai/ai-multimodal/scripts/tests/requirements.txt +20 -0
- package/skills/ai/ai-multimodal/scripts/tests/test_document_converter.py +74 -0
- package/skills/ai/ai-multimodal/scripts/tests/test_gemini_batch_process.py +362 -0
- package/skills/ai/ai-multimodal/scripts/tests/test_media_optimizer.py +373 -0
- package/skills/ai/mcp-management/README.md +219 -0
- package/skills/ai/mcp-management/SKILL.md +210 -0
- package/skills/ai/mcp-management/assets/tools.json +3146 -0
- package/skills/ai/mcp-management/references/configuration.md +114 -0
- package/skills/ai/mcp-management/references/gemini-cli-integration.md +221 -0
- package/skills/ai/mcp-management/references/mcp-protocol.md +116 -0
- package/skills/ai/mcp-management/scripts/.env.example +10 -0
- package/skills/ai/mcp-management/scripts/cli.ts +195 -0
- package/skills/ai/mcp-management/scripts/dist/analyze-tools.js +70 -0
- package/skills/ai/mcp-management/scripts/dist/cli.js +160 -0
- package/skills/ai/mcp-management/scripts/dist/mcp-client.js +183 -0
- package/skills/ai/mcp-management/scripts/mcp-client.ts +230 -0
- package/skills/ai/mcp-management/scripts/package.json +20 -0
- package/skills/ai/mcp-management/scripts/tsconfig.json +15 -0
- package/skills/core/brainstorm/SKILL.md +164 -0
- package/skills/core/brainstorm/scripts/frame-template.html +214 -0
- package/skills/core/brainstorm/scripts/helper.js +88 -0
- package/skills/core/brainstorm/scripts/server.cjs +338 -0
- package/skills/core/brainstorm/scripts/start-server.sh +153 -0
- package/skills/core/brainstorm/scripts/stop-server.sh +55 -0
- package/skills/core/brainstorm/spec-document-reviewer-prompt.md +49 -0
- package/skills/core/brainstorm/visual-companion.md +286 -0
- package/skills/core/code-review/SKILL.md +147 -0
- package/skills/core/code-review/references/code-review-reception.md +113 -0
- package/skills/core/code-review/references/codebase-scan-workflow.md +29 -0
- package/skills/core/code-review/references/edge-case-scouting.md +119 -0
- package/skills/core/code-review/references/parallel-review-workflow.md +69 -0
- package/skills/core/code-review/references/requesting-code-review.md +116 -0
- package/skills/core/code-review/references/task-management-reviews.md +140 -0
- package/skills/core/code-review/references/verification-before-completion.md +139 -0
- package/skills/core/cook/README.md +86 -0
- package/skills/core/cook/SKILL.md +113 -0
- package/skills/core/cook/references/intent-detection.md +101 -0
- package/skills/core/cook/references/review-cycle.md +75 -0
- package/skills/core/cook/references/subagent-patterns.md +75 -0
- package/skills/core/cook/references/workflow-steps.md +172 -0
- package/skills/core/debug/SKILL.md +121 -0
- package/skills/core/debug/references/defense-in-depth.md +124 -0
- package/skills/core/debug/references/frontend-verification.md +103 -0
- package/skills/core/debug/references/investigation-methodology.md +101 -0
- package/skills/core/debug/references/log-and-ci-analysis.md +97 -0
- package/skills/core/debug/references/performance-diagnostics.md +113 -0
- package/skills/core/debug/references/reporting-standards.md +122 -0
- package/skills/core/debug/references/root-cause-tracing.md +122 -0
- package/skills/core/debug/references/systematic-debugging.md +102 -0
- package/skills/core/debug/references/task-management-debugging.md +155 -0
- package/skills/core/debug/references/verification.md +123 -0
- package/skills/core/debug/scripts/find-polluter.sh +63 -0
- package/skills/core/debug/scripts/find-polluter.test.md +102 -0
- package/skills/core/execute/SKILL.md +70 -0
- package/skills/core/fix/SKILL.md +111 -0
- package/skills/core/fix/references/complexity-assessment.md +72 -0
- package/skills/core/fix/references/mode-selection.md +46 -0
- package/skills/core/fix/references/parallel-exploration.md +100 -0
- package/skills/core/fix/references/review-cycle.md +77 -0
- package/skills/core/fix/references/skill-activation-matrix.md +78 -0
- package/skills/core/fix/references/task-orchestration.md +103 -0
- package/skills/core/fix/references/workflow-ci.md +28 -0
- package/skills/core/fix/references/workflow-deep.md +122 -0
- package/skills/core/fix/references/workflow-logs.md +72 -0
- package/skills/core/fix/references/workflow-quick.md +59 -0
- package/skills/core/fix/references/workflow-standard.md +111 -0
- package/skills/core/fix/references/workflow-test.md +75 -0
- package/skills/core/fix/references/workflow-types.md +33 -0
- package/skills/core/fix/references/workflow-ui.md +75 -0
- package/skills/core/plan/SKILL.md +145 -0
- package/skills/core/plan/plan-document-reviewer-prompt.md +49 -0
- package/skills/core/subagent-dev/SKILL.md +277 -0
- package/skills/core/subagent-dev/code-quality-reviewer-prompt.md +26 -0
- package/skills/core/subagent-dev/implementer-prompt.md +113 -0
- package/skills/core/subagent-dev/spec-reviewer-prompt.md +61 -0
- package/skills/core/tdd/SKILL.md +371 -0
- package/skills/core/tdd/testing-anti-patterns.md +299 -0
- package/skills/core/test/SKILL.md +109 -0
- package/skills/core/test/references/report-format.md +58 -0
- package/skills/core/test/references/test-execution-workflow.md +103 -0
- package/skills/core/test/references/ui-testing-workflow.md +65 -0
- package/skills/core/verify/SKILL.md +139 -0
- package/skills/dev/backend-dev/SKILL.md +96 -0
- package/skills/dev/backend-dev/references/backend-api-design.md +495 -0
- package/skills/dev/backend-dev/references/backend-architecture.md +454 -0
- package/skills/dev/backend-dev/references/backend-authentication.md +338 -0
- package/skills/dev/backend-dev/references/backend-code-quality.md +659 -0
- package/skills/dev/backend-dev/references/backend-debugging.md +904 -0
- package/skills/dev/backend-dev/references/backend-devops.md +494 -0
- package/skills/dev/backend-dev/references/backend-mindset.md +387 -0
- package/skills/dev/backend-dev/references/backend-performance.md +397 -0
- package/skills/dev/backend-dev/references/backend-security.md +290 -0
- package/skills/dev/backend-dev/references/backend-technologies.md +256 -0
- package/skills/dev/backend-dev/references/backend-testing.md +429 -0
- package/skills/dev/context-engineering/SKILL.md +108 -0
- package/skills/dev/context-engineering/references/context-compression.md +84 -0
- package/skills/dev/context-engineering/references/context-degradation.md +93 -0
- package/skills/dev/context-engineering/references/context-fundamentals.md +75 -0
- package/skills/dev/context-engineering/references/context-optimization.md +82 -0
- package/skills/dev/context-engineering/references/evaluation.md +89 -0
- package/skills/dev/context-engineering/references/memory-systems.md +88 -0
- package/skills/dev/context-engineering/references/multi-agent-patterns.md +90 -0
- package/skills/dev/context-engineering/references/project-development.md +97 -0
- package/skills/dev/context-engineering/references/runtime-awareness.md +202 -0
- package/skills/dev/context-engineering/references/tool-design.md +86 -0
- package/skills/dev/context-engineering/scripts/compression_evaluator.py +349 -0
- package/skills/dev/context-engineering/scripts/context_analyzer.py +317 -0
- package/skills/dev/context-engineering/scripts/tests/test_edge_cases.py +246 -0
- package/skills/dev/databases/SKILL.md +84 -0
- package/skills/dev/databases/analytics.md +198 -0
- package/skills/dev/databases/db-design.md +188 -0
- package/skills/dev/databases/incremental-etl.md +213 -0
- package/skills/dev/databases/references/mongodb-aggregation.md +447 -0
- package/skills/dev/databases/references/mongodb-atlas.md +465 -0
- package/skills/dev/databases/references/mongodb-crud.md +408 -0
- package/skills/dev/databases/references/mongodb-indexing.md +442 -0
- package/skills/dev/databases/references/postgresql-administration.md +594 -0
- package/skills/dev/databases/references/postgresql-performance.md +527 -0
- package/skills/dev/databases/references/postgresql-psql-cli.md +467 -0
- package/skills/dev/databases/references/postgresql-queries.md +475 -0
- package/skills/dev/databases/scripts/.coverage +0 -0
- package/skills/dev/databases/scripts/db_backup.py +502 -0
- package/skills/dev/databases/scripts/db_migrate.py +426 -0
- package/skills/dev/databases/scripts/db_performance_check.py +457 -0
- package/skills/dev/databases/scripts/requirements.txt +20 -0
- package/skills/dev/databases/scripts/tests/coverage-db.json +1 -0
- package/skills/dev/databases/scripts/tests/requirements.txt +4 -0
- package/skills/dev/databases/scripts/tests/test_db_backup.py +340 -0
- package/skills/dev/databases/scripts/tests/test_db_migrate.py +277 -0
- package/skills/dev/databases/scripts/tests/test_db_performance_check.py +370 -0
- package/skills/dev/databases/stacks/bigquery.md +231 -0
- package/skills/dev/databases/stacks/d1_cloudflare.md +137 -0
- package/skills/dev/databases/stacks/mysql.md +216 -0
- package/skills/dev/databases/stacks/postgres.md +235 -0
- package/skills/dev/databases/stacks/sqlite.md +244 -0
- package/skills/dev/databases/transactional.md +176 -0
- package/skills/dev/devops/.env.example +76 -0
- package/skills/dev/devops/SKILL.md +97 -0
- package/skills/dev/devops/references/browser-rendering.md +305 -0
- package/skills/dev/devops/references/cloudflare-d1-kv.md +123 -0
- package/skills/dev/devops/references/cloudflare-platform.md +271 -0
- package/skills/dev/devops/references/cloudflare-r2-storage.md +280 -0
- package/skills/dev/devops/references/cloudflare-workers-advanced.md +312 -0
- package/skills/dev/devops/references/cloudflare-workers-apis.md +309 -0
- package/skills/dev/devops/references/cloudflare-workers-basics.md +418 -0
- package/skills/dev/devops/references/docker-basics.md +297 -0
- package/skills/dev/devops/references/docker-compose.md +292 -0
- package/skills/dev/devops/references/gcloud-platform.md +297 -0
- package/skills/dev/devops/references/gcloud-services.md +304 -0
- package/skills/dev/devops/references/kubernetes-basics.md +99 -0
- package/skills/dev/devops/references/kubernetes-helm-advanced.md +75 -0
- package/skills/dev/devops/references/kubernetes-helm.md +81 -0
- package/skills/dev/devops/references/kubernetes-kubectl.md +74 -0
- package/skills/dev/devops/references/kubernetes-security-advanced.md +98 -0
- package/skills/dev/devops/references/kubernetes-security.md +95 -0
- package/skills/dev/devops/references/kubernetes-troubleshooting-advanced.md +74 -0
- package/skills/dev/devops/references/kubernetes-troubleshooting.md +49 -0
- package/skills/dev/devops/references/kubernetes-workflows-advanced.md +75 -0
- package/skills/dev/devops/references/kubernetes-workflows.md +78 -0
- package/skills/dev/devops/scripts/cloudflare_deploy.py +269 -0
- package/skills/dev/devops/scripts/docker_optimize.py +332 -0
- package/skills/dev/devops/scripts/requirements.txt +20 -0
- package/skills/dev/devops/scripts/tests/requirements.txt +3 -0
- package/skills/dev/devops/scripts/tests/test_cloudflare_deploy.py +285 -0
- package/skills/dev/devops/scripts/tests/test_docker_optimize.py +436 -0
- package/skills/dev/frontend-design/SKILL.md +78 -0
- package/skills/dev/frontend-design/references/ai-multimodal-overview.md +165 -0
- package/skills/dev/frontend-design/references/analysis-best-practices.md +80 -0
- package/skills/dev/frontend-design/references/analysis-prompts.md +141 -0
- package/skills/dev/frontend-design/references/analysis-techniques.md +118 -0
- package/skills/dev/frontend-design/references/animejs.md +396 -0
- package/skills/dev/frontend-design/references/asset-generation.md +337 -0
- package/skills/dev/frontend-design/references/design-extraction-overview.md +71 -0
- package/skills/dev/frontend-design/references/extraction-best-practices.md +141 -0
- package/skills/dev/frontend-design/references/extraction-output-templates.md +162 -0
- package/skills/dev/frontend-design/references/extraction-prompts.md +127 -0
- package/skills/dev/frontend-design/references/technical-accessibility.md +119 -0
- package/skills/dev/frontend-design/references/technical-best-practices.md +97 -0
- package/skills/dev/frontend-design/references/technical-optimization.md +44 -0
- package/skills/dev/frontend-design/references/technical-overview.md +90 -0
- package/skills/dev/frontend-design/references/technical-workflows.md +150 -0
- package/skills/dev/frontend-design/references/visual-analysis-overview.md +95 -0
- package/skills/dev/frontend-design/references/workflow-3d.md +102 -0
- package/skills/dev/frontend-design/references/workflow-describe.md +87 -0
- package/skills/dev/frontend-design/references/workflow-immersive.md +87 -0
- package/skills/dev/frontend-design/references/workflow-quick.md +57 -0
- package/skills/dev/frontend-design/references/workflow-screenshot.md +63 -0
- package/skills/dev/frontend-design/references/workflow-video.md +74 -0
- package/skills/dev/frontend-dev/SKILL.md +400 -0
- package/skills/dev/frontend-dev/resources/common-patterns.md +331 -0
- package/skills/dev/frontend-dev/resources/complete-examples.md +872 -0
- package/skills/dev/frontend-dev/resources/component-patterns.md +502 -0
- package/skills/dev/frontend-dev/resources/data-fetching.md +767 -0
- package/skills/dev/frontend-dev/resources/file-organization.md +502 -0
- package/skills/dev/frontend-dev/resources/loading-and-error-states.md +501 -0
- package/skills/dev/frontend-dev/resources/performance.md +406 -0
- package/skills/dev/frontend-dev/resources/routing-guide.md +364 -0
- package/skills/dev/frontend-dev/resources/styling-guide.md +428 -0
- package/skills/dev/frontend-dev/resources/typescript-standards.md +418 -0
- package/skills/dev/git/SKILL.md +114 -0
- package/skills/dev/git/references/branch-management.md +88 -0
- package/skills/dev/git/references/commit-standards.md +46 -0
- package/skills/dev/git/references/gh-cli-guide.md +109 -0
- package/skills/dev/git/references/safety-protocols.md +69 -0
- package/skills/dev/git/references/workflow-commit.md +58 -0
- package/skills/dev/git/references/workflow-merge.md +48 -0
- package/skills/dev/git/references/workflow-pr.md +58 -0
- package/skills/dev/git/references/workflow-push.md +52 -0
- package/skills/dev/git-worktree/SKILL.md +218 -0
- package/skills/utils/ask/SKILL.md +58 -0
- package/skills/utils/bootstrap/SKILL.md +101 -0
- package/skills/utils/bootstrap/references/shared-phases.md +59 -0
- package/skills/utils/bootstrap/references/workflow-auto.md +52 -0
- package/skills/utils/bootstrap/references/workflow-fast.md +50 -0
- package/skills/utils/bootstrap/references/workflow-full.md +60 -0
- package/skills/utils/bootstrap/references/workflow-parallel.md +59 -0
- package/skills/utils/ck-help/SKILL.md +102 -0
- package/skills/utils/ck-help/scripts/ck-help.py +1321 -0
- package/skills/utils/ck-help/scripts/commands_data.yaml +3 -0
- package/skills/utils/ck-help/scripts/skills_data.yaml +593 -0
- package/skills/utils/copywriting/SKILL.md +94 -0
- package/skills/utils/copywriting/references/copy-formulas.md +150 -0
- package/skills/utils/copywriting/references/cta-patterns.md +168 -0
- package/skills/utils/copywriting/references/email-copy.md +193 -0
- package/skills/utils/copywriting/references/headline-templates.md +140 -0
- package/skills/utils/copywriting/references/landing-page-copy.md +175 -0
- package/skills/utils/copywriting/references/power-words.md +189 -0
- package/skills/utils/copywriting/references/social-media-copy.md +222 -0
- package/skills/utils/copywriting/references/workflow-cro.md +83 -0
- package/skills/utils/copywriting/references/workflow-enhance.md +32 -0
- package/skills/utils/copywriting/references/workflow-fast.md +29 -0
- package/skills/utils/copywriting/references/workflow-good.md +39 -0
- package/skills/utils/copywriting/references/writing-styles.md +247 -0
- package/skills/utils/copywriting/scripts/extract-writing-styles.py +308 -0
- package/skills/utils/copywriting/templates/copy-brief.md +49 -0
- package/skills/utils/docs/SKILL.md +55 -0
- package/skills/utils/docs/references/init-workflow.md +32 -0
- package/skills/utils/docs/references/summarize-workflow.md +18 -0
- package/skills/utils/docs/references/update-workflow.md +59 -0
- package/skills/utils/journal/SKILL.md +11 -0
- package/skills/utils/kanban/SKILL.md +99 -0
- package/skills/utils/preview/SKILL.md +75 -0
- package/skills/utils/preview/references/generation-modes.md +95 -0
- package/skills/utils/preview/references/view-mode.md +42 -0
- package/skills/utils/repomix/SKILL.md +248 -0
- package/skills/utils/repomix/references/configuration.md +211 -0
- package/skills/utils/repomix/references/usage-patterns.md +232 -0
- package/skills/utils/repomix/scripts/.coverage +0 -0
- package/skills/utils/repomix/scripts/README.md +179 -0
- package/skills/utils/repomix/scripts/repomix_batch.py +455 -0
- package/skills/utils/repomix/scripts/repos.example.json +15 -0
- package/skills/utils/repomix/scripts/requirements.txt +15 -0
- package/skills/utils/repomix/scripts/tests/test_repomix_batch.py +531 -0
- package/skills/utils/research/SKILL.md +171 -0
- package/skills/utils/scout/SKILL.md +89 -0
- package/skills/utils/scout/references/external-scouting.md +140 -0
- package/skills/utils/scout/references/internal-scouting.md +119 -0
- package/skills/utils/scout/references/task-management-scouting.md +125 -0
- package/skills/utils/sequential-thinking/.env.example +8 -0
- package/skills/utils/sequential-thinking/README.md +183 -0
- package/skills/utils/sequential-thinking/SKILL.md +95 -0
- package/skills/utils/sequential-thinking/package.json +31 -0
- package/skills/utils/sequential-thinking/references/advanced-strategies.md +79 -0
- package/skills/utils/sequential-thinking/references/advanced-techniques.md +76 -0
- package/skills/utils/sequential-thinking/references/core-patterns.md +95 -0
- package/skills/utils/sequential-thinking/references/examples-api.md +88 -0
- package/skills/utils/sequential-thinking/references/examples-architecture.md +94 -0
- package/skills/utils/sequential-thinking/references/examples-debug.md +90 -0
- package/skills/utils/sequential-thinking/scripts/format-thought.js +159 -0
- package/skills/utils/sequential-thinking/scripts/process-thought.js +236 -0
- package/skills/utils/sequential-thinking/tests/format-thought.test.js +133 -0
- package/skills/utils/sequential-thinking/tests/process-thought.test.js +215 -0
- package/skills/utils/write-skill/SKILL.md +655 -0
- package/skills/utils/write-skill/anthropic-best-practices.md +1150 -0
- package/skills/utils/write-skill/examples/CLAUDE_MD_TESTING.md +189 -0
- package/skills/utils/write-skill/graphviz-conventions.dot +172 -0
- package/skills/utils/write-skill/persuasion-principles.md +187 -0
- package/skills/utils/write-skill/render-graphs.js +168 -0
- package/skills/utils/write-skill/testing-skills-with-subagents.md +384 -0
- package/src/commands/init.js +238 -0
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""
|
|
3
|
+
Database migration tool for MongoDB and PostgreSQL.
|
|
4
|
+
Generates and applies schema migrations with rollback support.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import argparse
|
|
8
|
+
import json
|
|
9
|
+
import os
|
|
10
|
+
import sys
|
|
11
|
+
from dataclasses import dataclass
|
|
12
|
+
from datetime import datetime
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any, Dict, List, Optional
|
|
15
|
+
|
|
16
|
+
# Windows UTF-8 compatibility (works for both local and global installs)
|
|
17
|
+
CLAUDE_ROOT = Path(__file__).parent.parent.parent.parent
|
|
18
|
+
sys.path.insert(0, str(CLAUDE_ROOT / 'scripts'))
|
|
19
|
+
try:
|
|
20
|
+
from win_compat import ensure_utf8_stdout
|
|
21
|
+
ensure_utf8_stdout()
|
|
22
|
+
except ImportError:
|
|
23
|
+
if sys.platform == 'win32':
|
|
24
|
+
import io
|
|
25
|
+
if hasattr(sys.stdout, 'buffer'):
|
|
26
|
+
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
|
|
27
|
+
|
|
28
|
+
try:
|
|
29
|
+
from pymongo import MongoClient
|
|
30
|
+
MONGO_AVAILABLE = True
|
|
31
|
+
except ImportError:
|
|
32
|
+
MONGO_AVAILABLE = False
|
|
33
|
+
|
|
34
|
+
try:
|
|
35
|
+
import psycopg2
|
|
36
|
+
from psycopg2 import sql
|
|
37
|
+
POSTGRES_AVAILABLE = True
|
|
38
|
+
except ImportError:
|
|
39
|
+
POSTGRES_AVAILABLE = False
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
@dataclass
|
|
43
|
+
class Migration:
|
|
44
|
+
"""Represents a database migration."""
|
|
45
|
+
|
|
46
|
+
id: str
|
|
47
|
+
name: str
|
|
48
|
+
timestamp: datetime
|
|
49
|
+
database_type: str
|
|
50
|
+
up_sql: Optional[str] = None
|
|
51
|
+
down_sql: Optional[str] = None
|
|
52
|
+
mongodb_operations: Optional[List[Dict[str, Any]]] = None
|
|
53
|
+
applied: bool = False
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
class MigrationManager:
|
|
57
|
+
"""Manages database migrations for MongoDB and PostgreSQL."""
|
|
58
|
+
|
|
59
|
+
def __init__(self, db_type: str, connection_string: str, migrations_dir: str = "./migrations"):
|
|
60
|
+
"""
|
|
61
|
+
Initialize migration manager.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
db_type: Database type ('mongodb' or 'postgres')
|
|
65
|
+
connection_string: Database connection string
|
|
66
|
+
migrations_dir: Directory to store migration files
|
|
67
|
+
"""
|
|
68
|
+
self.db_type = db_type.lower()
|
|
69
|
+
self.connection_string = connection_string
|
|
70
|
+
self.migrations_dir = Path(migrations_dir)
|
|
71
|
+
self.migrations_dir.mkdir(exist_ok=True)
|
|
72
|
+
|
|
73
|
+
self.client = None
|
|
74
|
+
self.db = None
|
|
75
|
+
self.conn = None
|
|
76
|
+
|
|
77
|
+
def connect(self) -> bool:
|
|
78
|
+
"""
|
|
79
|
+
Connect to database.
|
|
80
|
+
|
|
81
|
+
Returns:
|
|
82
|
+
True if connection successful, False otherwise
|
|
83
|
+
"""
|
|
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
|
+
# Test connection
|
|
92
|
+
self.client.server_info()
|
|
93
|
+
return True
|
|
94
|
+
|
|
95
|
+
elif self.db_type == "postgres":
|
|
96
|
+
if not POSTGRES_AVAILABLE:
|
|
97
|
+
print("Error: psycopg2 not installed")
|
|
98
|
+
return False
|
|
99
|
+
self.conn = psycopg2.connect(self.connection_string)
|
|
100
|
+
return True
|
|
101
|
+
|
|
102
|
+
else:
|
|
103
|
+
print(f"Error: Unsupported database type: {self.db_type}")
|
|
104
|
+
return False
|
|
105
|
+
|
|
106
|
+
except Exception as e:
|
|
107
|
+
print(f"Connection error: {e}")
|
|
108
|
+
return False
|
|
109
|
+
|
|
110
|
+
def disconnect(self):
|
|
111
|
+
"""Disconnect from database."""
|
|
112
|
+
try:
|
|
113
|
+
if self.client:
|
|
114
|
+
self.client.close()
|
|
115
|
+
if self.conn:
|
|
116
|
+
self.conn.close()
|
|
117
|
+
except Exception as e:
|
|
118
|
+
print(f"Disconnect error: {e}")
|
|
119
|
+
|
|
120
|
+
def _ensure_migrations_table(self):
|
|
121
|
+
"""Create migrations tracking table/collection if not exists."""
|
|
122
|
+
if self.db_type == "mongodb":
|
|
123
|
+
# MongoDB creates collection automatically
|
|
124
|
+
pass
|
|
125
|
+
elif self.db_type == "postgres":
|
|
126
|
+
with self.conn.cursor() as cur:
|
|
127
|
+
cur.execute("""
|
|
128
|
+
CREATE TABLE IF NOT EXISTS migrations (
|
|
129
|
+
id VARCHAR(255) PRIMARY KEY,
|
|
130
|
+
name VARCHAR(255) NOT NULL,
|
|
131
|
+
applied_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
132
|
+
)
|
|
133
|
+
""")
|
|
134
|
+
self.conn.commit()
|
|
135
|
+
|
|
136
|
+
def generate_migration(self, name: str, dry_run: bool = False) -> Optional[Migration]:
|
|
137
|
+
"""
|
|
138
|
+
Generate new migration file.
|
|
139
|
+
|
|
140
|
+
Args:
|
|
141
|
+
name: Migration name
|
|
142
|
+
dry_run: If True, only show what would be generated
|
|
143
|
+
|
|
144
|
+
Returns:
|
|
145
|
+
Migration object if successful, None otherwise
|
|
146
|
+
"""
|
|
147
|
+
timestamp = datetime.now()
|
|
148
|
+
migration_id = timestamp.strftime("%Y%m%d%H%M%S")
|
|
149
|
+
filename = f"{migration_id}_{name}.json"
|
|
150
|
+
filepath = self.migrations_dir / filename
|
|
151
|
+
|
|
152
|
+
migration = Migration(
|
|
153
|
+
id=migration_id,
|
|
154
|
+
name=name,
|
|
155
|
+
timestamp=timestamp,
|
|
156
|
+
database_type=self.db_type
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
if self.db_type == "mongodb":
|
|
160
|
+
migration.mongodb_operations = [
|
|
161
|
+
{
|
|
162
|
+
"operation": "createIndex",
|
|
163
|
+
"collection": "example_collection",
|
|
164
|
+
"index": {"field": 1},
|
|
165
|
+
"options": {}
|
|
166
|
+
}
|
|
167
|
+
]
|
|
168
|
+
elif self.db_type == "postgres":
|
|
169
|
+
migration.up_sql = "-- Add your SQL here\n"
|
|
170
|
+
migration.down_sql = "-- Add rollback SQL here\n"
|
|
171
|
+
|
|
172
|
+
migration_data = {
|
|
173
|
+
"id": migration.id,
|
|
174
|
+
"name": migration.name,
|
|
175
|
+
"timestamp": migration.timestamp.isoformat(),
|
|
176
|
+
"database_type": migration.database_type,
|
|
177
|
+
"up_sql": migration.up_sql,
|
|
178
|
+
"down_sql": migration.down_sql,
|
|
179
|
+
"mongodb_operations": migration.mongodb_operations
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if dry_run:
|
|
183
|
+
print(f"Would create: {filepath}")
|
|
184
|
+
print(json.dumps(migration_data, indent=2))
|
|
185
|
+
return migration
|
|
186
|
+
|
|
187
|
+
try:
|
|
188
|
+
with open(filepath, "w") as f:
|
|
189
|
+
json.dump(migration_data, f, indent=2)
|
|
190
|
+
print(f"Created migration: {filepath}")
|
|
191
|
+
return migration
|
|
192
|
+
except Exception as e:
|
|
193
|
+
print(f"Error creating migration: {e}")
|
|
194
|
+
return None
|
|
195
|
+
|
|
196
|
+
def get_pending_migrations(self) -> List[Migration]:
|
|
197
|
+
"""
|
|
198
|
+
Get list of pending migrations.
|
|
199
|
+
|
|
200
|
+
Returns:
|
|
201
|
+
List of pending Migration objects
|
|
202
|
+
"""
|
|
203
|
+
# Get applied migrations
|
|
204
|
+
applied_ids = set()
|
|
205
|
+
|
|
206
|
+
try:
|
|
207
|
+
if self.db_type == "mongodb":
|
|
208
|
+
applied_ids = {
|
|
209
|
+
doc["id"] for doc in self.db.migrations.find({}, {"id": 1})
|
|
210
|
+
}
|
|
211
|
+
elif self.db_type == "postgres":
|
|
212
|
+
with self.conn.cursor() as cur:
|
|
213
|
+
cur.execute("SELECT id FROM migrations")
|
|
214
|
+
applied_ids = {row[0] for row in cur.fetchall()}
|
|
215
|
+
except Exception as e:
|
|
216
|
+
print(f"Error reading applied migrations: {e}")
|
|
217
|
+
|
|
218
|
+
# Get all migration files
|
|
219
|
+
pending = []
|
|
220
|
+
for filepath in sorted(self.migrations_dir.glob("*.json")):
|
|
221
|
+
try:
|
|
222
|
+
with open(filepath) as f:
|
|
223
|
+
data = json.load(f)
|
|
224
|
+
|
|
225
|
+
if data["id"] not in applied_ids:
|
|
226
|
+
migration = Migration(
|
|
227
|
+
id=data["id"],
|
|
228
|
+
name=data["name"],
|
|
229
|
+
timestamp=datetime.fromisoformat(data["timestamp"]),
|
|
230
|
+
database_type=data["database_type"],
|
|
231
|
+
up_sql=data.get("up_sql"),
|
|
232
|
+
down_sql=data.get("down_sql"),
|
|
233
|
+
mongodb_operations=data.get("mongodb_operations")
|
|
234
|
+
)
|
|
235
|
+
pending.append(migration)
|
|
236
|
+
except Exception as e:
|
|
237
|
+
print(f"Error reading {filepath}: {e}")
|
|
238
|
+
|
|
239
|
+
return pending
|
|
240
|
+
|
|
241
|
+
def apply_migration(self, migration: Migration, dry_run: bool = False) -> bool:
|
|
242
|
+
"""
|
|
243
|
+
Apply migration.
|
|
244
|
+
|
|
245
|
+
Args:
|
|
246
|
+
migration: Migration to apply
|
|
247
|
+
dry_run: If True, only show what would be executed
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
True if successful, False otherwise
|
|
251
|
+
"""
|
|
252
|
+
print(f"Applying migration: {migration.id} - {migration.name}")
|
|
253
|
+
|
|
254
|
+
if dry_run:
|
|
255
|
+
if self.db_type == "mongodb":
|
|
256
|
+
print("MongoDB operations:")
|
|
257
|
+
print(json.dumps(migration.mongodb_operations, indent=2))
|
|
258
|
+
elif self.db_type == "postgres":
|
|
259
|
+
print("SQL to execute:")
|
|
260
|
+
print(migration.up_sql)
|
|
261
|
+
return True
|
|
262
|
+
|
|
263
|
+
try:
|
|
264
|
+
if self.db_type == "mongodb":
|
|
265
|
+
for op in migration.mongodb_operations or []:
|
|
266
|
+
if op["operation"] == "createIndex":
|
|
267
|
+
self.db[op["collection"]].create_index(
|
|
268
|
+
list(op["index"].items()),
|
|
269
|
+
**op.get("options", {})
|
|
270
|
+
)
|
|
271
|
+
|
|
272
|
+
# Record migration
|
|
273
|
+
self.db.migrations.insert_one({
|
|
274
|
+
"id": migration.id,
|
|
275
|
+
"name": migration.name,
|
|
276
|
+
"applied_at": datetime.now()
|
|
277
|
+
})
|
|
278
|
+
|
|
279
|
+
elif self.db_type == "postgres":
|
|
280
|
+
with self.conn.cursor() as cur:
|
|
281
|
+
cur.execute(migration.up_sql)
|
|
282
|
+
|
|
283
|
+
# Record migration
|
|
284
|
+
cur.execute(
|
|
285
|
+
"INSERT INTO migrations (id, name) VALUES (%s, %s)",
|
|
286
|
+
(migration.id, migration.name)
|
|
287
|
+
)
|
|
288
|
+
self.conn.commit()
|
|
289
|
+
|
|
290
|
+
print(f"✓ Applied: {migration.id}")
|
|
291
|
+
return True
|
|
292
|
+
|
|
293
|
+
except Exception as e:
|
|
294
|
+
print(f"✗ Error applying migration: {e}")
|
|
295
|
+
if self.conn:
|
|
296
|
+
self.conn.rollback()
|
|
297
|
+
return False
|
|
298
|
+
|
|
299
|
+
def rollback_migration(self, migration_id: str, dry_run: bool = False) -> bool:
|
|
300
|
+
"""
|
|
301
|
+
Rollback migration.
|
|
302
|
+
|
|
303
|
+
Args:
|
|
304
|
+
migration_id: Migration ID to rollback
|
|
305
|
+
dry_run: If True, only show what would be executed
|
|
306
|
+
|
|
307
|
+
Returns:
|
|
308
|
+
True if successful, False otherwise
|
|
309
|
+
"""
|
|
310
|
+
# Find migration file
|
|
311
|
+
migration_file = None
|
|
312
|
+
for filepath in self.migrations_dir.glob(f"{migration_id}_*.json"):
|
|
313
|
+
migration_file = filepath
|
|
314
|
+
break
|
|
315
|
+
|
|
316
|
+
if not migration_file:
|
|
317
|
+
print(f"Migration not found: {migration_id}")
|
|
318
|
+
return False
|
|
319
|
+
|
|
320
|
+
try:
|
|
321
|
+
with open(migration_file) as f:
|
|
322
|
+
data = json.load(f)
|
|
323
|
+
|
|
324
|
+
print(f"Rolling back: {migration_id} - {data['name']}")
|
|
325
|
+
|
|
326
|
+
if dry_run:
|
|
327
|
+
if self.db_type == "postgres":
|
|
328
|
+
print("SQL to execute:")
|
|
329
|
+
print(data.get("down_sql", "-- No rollback defined"))
|
|
330
|
+
return True
|
|
331
|
+
|
|
332
|
+
if self.db_type == "postgres" and data.get("down_sql"):
|
|
333
|
+
with self.conn.cursor() as cur:
|
|
334
|
+
cur.execute(data["down_sql"])
|
|
335
|
+
cur.execute("DELETE FROM migrations WHERE id = %s", (migration_id,))
|
|
336
|
+
self.conn.commit()
|
|
337
|
+
elif self.db_type == "mongodb":
|
|
338
|
+
self.db.migrations.delete_one({"id": migration_id})
|
|
339
|
+
|
|
340
|
+
print(f"✓ Rolled back: {migration_id}")
|
|
341
|
+
return True
|
|
342
|
+
|
|
343
|
+
except Exception as e:
|
|
344
|
+
print(f"✗ Error rolling back: {e}")
|
|
345
|
+
if self.conn:
|
|
346
|
+
self.conn.rollback()
|
|
347
|
+
return False
|
|
348
|
+
|
|
349
|
+
|
|
350
|
+
def main():
|
|
351
|
+
"""Main entry point."""
|
|
352
|
+
parser = argparse.ArgumentParser(description="Database migration tool")
|
|
353
|
+
parser.add_argument("--db", required=True, choices=["mongodb", "postgres"],
|
|
354
|
+
help="Database type")
|
|
355
|
+
parser.add_argument("--uri", help="Database connection string")
|
|
356
|
+
parser.add_argument("--migrations-dir", default="./migrations",
|
|
357
|
+
help="Migrations directory")
|
|
358
|
+
|
|
359
|
+
subparsers = parser.add_subparsers(dest="command", required=True)
|
|
360
|
+
|
|
361
|
+
# Generate command
|
|
362
|
+
gen_parser = subparsers.add_parser("generate", help="Generate new migration")
|
|
363
|
+
gen_parser.add_argument("name", help="Migration name")
|
|
364
|
+
gen_parser.add_argument("--dry-run", action="store_true",
|
|
365
|
+
help="Show what would be generated")
|
|
366
|
+
|
|
367
|
+
# Apply command
|
|
368
|
+
apply_parser = subparsers.add_parser("apply", help="Apply pending migrations")
|
|
369
|
+
apply_parser.add_argument("--dry-run", action="store_true",
|
|
370
|
+
help="Show what would be executed")
|
|
371
|
+
|
|
372
|
+
# Rollback command
|
|
373
|
+
rollback_parser = subparsers.add_parser("rollback", help="Rollback migration")
|
|
374
|
+
rollback_parser.add_argument("id", help="Migration ID to rollback")
|
|
375
|
+
rollback_parser.add_argument("--dry-run", action="store_true",
|
|
376
|
+
help="Show what would be executed")
|
|
377
|
+
|
|
378
|
+
# Status command
|
|
379
|
+
subparsers.add_parser("status", help="Show migration status")
|
|
380
|
+
|
|
381
|
+
args = parser.parse_args()
|
|
382
|
+
|
|
383
|
+
# For generate, we don't need connection
|
|
384
|
+
if args.command == "generate":
|
|
385
|
+
manager = MigrationManager(args.db, "", args.migrations_dir)
|
|
386
|
+
migration = manager.generate_migration(args.name, args.dry_run)
|
|
387
|
+
sys.exit(0 if migration else 1)
|
|
388
|
+
|
|
389
|
+
# Other commands need connection
|
|
390
|
+
if not args.uri:
|
|
391
|
+
print("Error: --uri required for this command")
|
|
392
|
+
sys.exit(1)
|
|
393
|
+
|
|
394
|
+
manager = MigrationManager(args.db, args.uri, args.migrations_dir)
|
|
395
|
+
|
|
396
|
+
if not manager.connect():
|
|
397
|
+
sys.exit(1)
|
|
398
|
+
|
|
399
|
+
try:
|
|
400
|
+
manager._ensure_migrations_table()
|
|
401
|
+
|
|
402
|
+
if args.command == "status":
|
|
403
|
+
pending = manager.get_pending_migrations()
|
|
404
|
+
print(f"Pending migrations: {len(pending)}")
|
|
405
|
+
for migration in pending:
|
|
406
|
+
print(f" {migration.id} - {migration.name}")
|
|
407
|
+
|
|
408
|
+
elif args.command == "apply":
|
|
409
|
+
pending = manager.get_pending_migrations()
|
|
410
|
+
if not pending:
|
|
411
|
+
print("No pending migrations")
|
|
412
|
+
else:
|
|
413
|
+
for migration in pending:
|
|
414
|
+
if not manager.apply_migration(migration, args.dry_run):
|
|
415
|
+
sys.exit(1)
|
|
416
|
+
|
|
417
|
+
elif args.command == "rollback":
|
|
418
|
+
if not manager.rollback_migration(args.id, args.dry_run):
|
|
419
|
+
sys.exit(1)
|
|
420
|
+
|
|
421
|
+
finally:
|
|
422
|
+
manager.disconnect()
|
|
423
|
+
|
|
424
|
+
|
|
425
|
+
if __name__ == "__main__":
|
|
426
|
+
main()
|