@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,373 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Tests for media_optimizer.py
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import pytest
|
|
6
|
+
import sys
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from unittest.mock import Mock, patch, MagicMock
|
|
9
|
+
import json
|
|
10
|
+
|
|
11
|
+
sys.path.insert(0, str(Path(__file__).parent.parent))
|
|
12
|
+
|
|
13
|
+
import media_optimizer as mo
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class TestEnvLoading:
|
|
17
|
+
"""Test environment variable loading."""
|
|
18
|
+
|
|
19
|
+
@patch('media_optimizer.load_dotenv')
|
|
20
|
+
@patch('pathlib.Path.exists')
|
|
21
|
+
def test_load_env_files_success(self, mock_exists, mock_load_dotenv):
|
|
22
|
+
"""Test successful .env file loading."""
|
|
23
|
+
mock_exists.return_value = True
|
|
24
|
+
mo.load_env_files()
|
|
25
|
+
# Should be called for skill, skills, and claude dirs
|
|
26
|
+
assert mock_load_dotenv.call_count >= 1
|
|
27
|
+
|
|
28
|
+
@patch('media_optimizer.load_dotenv', None)
|
|
29
|
+
def test_load_env_files_no_dotenv(self):
|
|
30
|
+
"""Test when dotenv is not available."""
|
|
31
|
+
# Should not raise an error
|
|
32
|
+
mo.load_env_files()
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class TestFFmpegCheck:
|
|
36
|
+
"""Test ffmpeg availability checking."""
|
|
37
|
+
|
|
38
|
+
@patch('subprocess.run')
|
|
39
|
+
def test_ffmpeg_installed(self, mock_run):
|
|
40
|
+
"""Test when ffmpeg is installed."""
|
|
41
|
+
mock_run.return_value = Mock()
|
|
42
|
+
assert mo.check_ffmpeg() is True
|
|
43
|
+
|
|
44
|
+
@patch('subprocess.run')
|
|
45
|
+
def test_ffmpeg_not_installed(self, mock_run):
|
|
46
|
+
"""Test when ffmpeg is not installed."""
|
|
47
|
+
mock_run.side_effect = FileNotFoundError()
|
|
48
|
+
assert mo.check_ffmpeg() is False
|
|
49
|
+
|
|
50
|
+
@patch('subprocess.run')
|
|
51
|
+
def test_ffmpeg_error(self, mock_run):
|
|
52
|
+
"""Test ffmpeg command error."""
|
|
53
|
+
mock_run.side_effect = Exception("Error")
|
|
54
|
+
assert mo.check_ffmpeg() is False
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class TestMediaInfo:
|
|
58
|
+
"""Test media information extraction."""
|
|
59
|
+
|
|
60
|
+
@patch('media_optimizer.check_ffmpeg')
|
|
61
|
+
@patch('subprocess.run')
|
|
62
|
+
def test_get_video_info(self, mock_run, mock_check):
|
|
63
|
+
"""Test extracting video information."""
|
|
64
|
+
mock_check.return_value = True
|
|
65
|
+
|
|
66
|
+
mock_result = Mock()
|
|
67
|
+
mock_result.stdout = json.dumps({
|
|
68
|
+
'format': {
|
|
69
|
+
'size': '10485760',
|
|
70
|
+
'duration': '120.5',
|
|
71
|
+
'bit_rate': '691200'
|
|
72
|
+
},
|
|
73
|
+
'streams': [
|
|
74
|
+
{
|
|
75
|
+
'codec_type': 'video',
|
|
76
|
+
'width': 1920,
|
|
77
|
+
'height': 1080,
|
|
78
|
+
'r_frame_rate': '30/1'
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
'codec_type': 'audio',
|
|
82
|
+
'sample_rate': '48000',
|
|
83
|
+
'channels': 2
|
|
84
|
+
}
|
|
85
|
+
]
|
|
86
|
+
})
|
|
87
|
+
mock_run.return_value = mock_result
|
|
88
|
+
|
|
89
|
+
info = mo.get_media_info('test.mp4')
|
|
90
|
+
|
|
91
|
+
assert info['size'] == 10485760
|
|
92
|
+
assert info['duration'] == 120.5
|
|
93
|
+
assert info['width'] == 1920
|
|
94
|
+
assert info['height'] == 1080
|
|
95
|
+
assert info['sample_rate'] == 48000
|
|
96
|
+
|
|
97
|
+
@patch('media_optimizer.check_ffmpeg')
|
|
98
|
+
def test_get_media_info_no_ffmpeg(self, mock_check):
|
|
99
|
+
"""Test when ffmpeg is not available."""
|
|
100
|
+
mock_check.return_value = False
|
|
101
|
+
info = mo.get_media_info('test.mp4')
|
|
102
|
+
assert info == {}
|
|
103
|
+
|
|
104
|
+
@patch('media_optimizer.check_ffmpeg')
|
|
105
|
+
@patch('subprocess.run')
|
|
106
|
+
def test_get_media_info_error(self, mock_run, mock_check):
|
|
107
|
+
"""Test error handling in media info extraction."""
|
|
108
|
+
mock_check.return_value = True
|
|
109
|
+
mock_run.side_effect = Exception("Error")
|
|
110
|
+
|
|
111
|
+
info = mo.get_media_info('test.mp4')
|
|
112
|
+
assert info == {}
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class TestVideoOptimization:
|
|
116
|
+
"""Test video optimization functionality."""
|
|
117
|
+
|
|
118
|
+
@patch('media_optimizer.check_ffmpeg')
|
|
119
|
+
@patch('media_optimizer.get_media_info')
|
|
120
|
+
@patch('subprocess.run')
|
|
121
|
+
def test_optimize_video_success(self, mock_run, mock_info, mock_check):
|
|
122
|
+
"""Test successful video optimization."""
|
|
123
|
+
mock_check.return_value = True
|
|
124
|
+
mock_info.side_effect = [
|
|
125
|
+
# Input info
|
|
126
|
+
{
|
|
127
|
+
'size': 50 * 1024 * 1024,
|
|
128
|
+
'duration': 120.0,
|
|
129
|
+
'bit_rate': 3500000,
|
|
130
|
+
'width': 1920,
|
|
131
|
+
'height': 1080
|
|
132
|
+
},
|
|
133
|
+
# Output info
|
|
134
|
+
{
|
|
135
|
+
'size': 25 * 1024 * 1024,
|
|
136
|
+
'duration': 120.0,
|
|
137
|
+
'width': 1920,
|
|
138
|
+
'height': 1080
|
|
139
|
+
}
|
|
140
|
+
]
|
|
141
|
+
|
|
142
|
+
result = mo.optimize_video(
|
|
143
|
+
'input.mp4',
|
|
144
|
+
'output.mp4',
|
|
145
|
+
quality=23,
|
|
146
|
+
verbose=False
|
|
147
|
+
)
|
|
148
|
+
|
|
149
|
+
assert result is True
|
|
150
|
+
mock_run.assert_called_once()
|
|
151
|
+
|
|
152
|
+
@patch('media_optimizer.check_ffmpeg')
|
|
153
|
+
def test_optimize_video_no_ffmpeg(self, mock_check):
|
|
154
|
+
"""Test video optimization without ffmpeg."""
|
|
155
|
+
mock_check.return_value = False
|
|
156
|
+
|
|
157
|
+
result = mo.optimize_video('input.mp4', 'output.mp4')
|
|
158
|
+
assert result is False
|
|
159
|
+
|
|
160
|
+
@patch('media_optimizer.check_ffmpeg')
|
|
161
|
+
@patch('media_optimizer.get_media_info')
|
|
162
|
+
def test_optimize_video_no_info(self, mock_info, mock_check):
|
|
163
|
+
"""Test video optimization when info cannot be read."""
|
|
164
|
+
mock_check.return_value = True
|
|
165
|
+
mock_info.return_value = {}
|
|
166
|
+
|
|
167
|
+
result = mo.optimize_video('input.mp4', 'output.mp4')
|
|
168
|
+
assert result is False
|
|
169
|
+
|
|
170
|
+
@patch('media_optimizer.check_ffmpeg')
|
|
171
|
+
@patch('media_optimizer.get_media_info')
|
|
172
|
+
@patch('subprocess.run')
|
|
173
|
+
def test_optimize_video_with_target_size(self, mock_run, mock_info, mock_check):
|
|
174
|
+
"""Test video optimization with target size."""
|
|
175
|
+
mock_check.return_value = True
|
|
176
|
+
mock_info.side_effect = [
|
|
177
|
+
{'size': 100 * 1024 * 1024, 'duration': 60.0, 'bit_rate': 3500000},
|
|
178
|
+
{'size': 50 * 1024 * 1024, 'duration': 60.0}
|
|
179
|
+
]
|
|
180
|
+
|
|
181
|
+
result = mo.optimize_video(
|
|
182
|
+
'input.mp4',
|
|
183
|
+
'output.mp4',
|
|
184
|
+
target_size_mb=50,
|
|
185
|
+
verbose=False
|
|
186
|
+
)
|
|
187
|
+
|
|
188
|
+
assert result is True
|
|
189
|
+
|
|
190
|
+
@patch('media_optimizer.check_ffmpeg')
|
|
191
|
+
@patch('media_optimizer.get_media_info')
|
|
192
|
+
@patch('subprocess.run')
|
|
193
|
+
def test_optimize_video_with_resolution(self, mock_run, mock_info, mock_check):
|
|
194
|
+
"""Test video optimization with custom resolution."""
|
|
195
|
+
mock_check.return_value = True
|
|
196
|
+
mock_info.side_effect = [
|
|
197
|
+
{'size': 50 * 1024 * 1024, 'duration': 120.0, 'bit_rate': 3500000},
|
|
198
|
+
{'size': 25 * 1024 * 1024, 'duration': 120.0}
|
|
199
|
+
]
|
|
200
|
+
|
|
201
|
+
result = mo.optimize_video(
|
|
202
|
+
'input.mp4',
|
|
203
|
+
'output.mp4',
|
|
204
|
+
resolution='1280x720',
|
|
205
|
+
verbose=False
|
|
206
|
+
)
|
|
207
|
+
|
|
208
|
+
assert result is True
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
class TestAudioOptimization:
|
|
212
|
+
"""Test audio optimization functionality."""
|
|
213
|
+
|
|
214
|
+
@patch('media_optimizer.check_ffmpeg')
|
|
215
|
+
@patch('media_optimizer.get_media_info')
|
|
216
|
+
@patch('subprocess.run')
|
|
217
|
+
def test_optimize_audio_success(self, mock_run, mock_info, mock_check):
|
|
218
|
+
"""Test successful audio optimization."""
|
|
219
|
+
mock_check.return_value = True
|
|
220
|
+
mock_info.side_effect = [
|
|
221
|
+
{'size': 10 * 1024 * 1024, 'duration': 300.0},
|
|
222
|
+
{'size': 5 * 1024 * 1024, 'duration': 300.0}
|
|
223
|
+
]
|
|
224
|
+
|
|
225
|
+
result = mo.optimize_audio(
|
|
226
|
+
'input.mp3',
|
|
227
|
+
'output.m4a',
|
|
228
|
+
bitrate='64k',
|
|
229
|
+
verbose=False
|
|
230
|
+
)
|
|
231
|
+
|
|
232
|
+
assert result is True
|
|
233
|
+
mock_run.assert_called_once()
|
|
234
|
+
|
|
235
|
+
@patch('media_optimizer.check_ffmpeg')
|
|
236
|
+
def test_optimize_audio_no_ffmpeg(self, mock_check):
|
|
237
|
+
"""Test audio optimization without ffmpeg."""
|
|
238
|
+
mock_check.return_value = False
|
|
239
|
+
|
|
240
|
+
result = mo.optimize_audio('input.mp3', 'output.m4a')
|
|
241
|
+
assert result is False
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
class TestImageOptimization:
|
|
245
|
+
"""Test image optimization functionality."""
|
|
246
|
+
|
|
247
|
+
@patch('PIL.Image.open')
|
|
248
|
+
@patch('pathlib.Path.stat')
|
|
249
|
+
def test_optimize_image_success(self, mock_stat, mock_image_open):
|
|
250
|
+
"""Test successful image optimization."""
|
|
251
|
+
# Mock image
|
|
252
|
+
mock_resized = Mock()
|
|
253
|
+
mock_resized.mode = 'RGB'
|
|
254
|
+
|
|
255
|
+
mock_img = Mock()
|
|
256
|
+
mock_img.width = 3840
|
|
257
|
+
mock_img.height = 2160
|
|
258
|
+
mock_img.mode = 'RGB'
|
|
259
|
+
mock_img.resize.return_value = mock_resized
|
|
260
|
+
mock_image_open.return_value = mock_img
|
|
261
|
+
|
|
262
|
+
# Mock file sizes
|
|
263
|
+
mock_stat.return_value.st_size = 5 * 1024 * 1024
|
|
264
|
+
|
|
265
|
+
result = mo.optimize_image(
|
|
266
|
+
'input.jpg',
|
|
267
|
+
'output.jpg',
|
|
268
|
+
max_width=1920,
|
|
269
|
+
quality=85,
|
|
270
|
+
verbose=False
|
|
271
|
+
)
|
|
272
|
+
|
|
273
|
+
assert result is True
|
|
274
|
+
# Since image is resized, save is called on the resized image
|
|
275
|
+
mock_resized.save.assert_called_once()
|
|
276
|
+
|
|
277
|
+
@patch('PIL.Image.open')
|
|
278
|
+
@patch('pathlib.Path.stat')
|
|
279
|
+
def test_optimize_image_resize(self, mock_stat, mock_image_open):
|
|
280
|
+
"""Test image resizing during optimization."""
|
|
281
|
+
mock_img = Mock()
|
|
282
|
+
mock_img.width = 3840
|
|
283
|
+
mock_img.height = 2160
|
|
284
|
+
mock_img.mode = 'RGB'
|
|
285
|
+
mock_resized = Mock()
|
|
286
|
+
mock_img.resize.return_value = mock_resized
|
|
287
|
+
mock_image_open.return_value = mock_img
|
|
288
|
+
|
|
289
|
+
mock_stat.return_value.st_size = 5 * 1024 * 1024
|
|
290
|
+
|
|
291
|
+
mo.optimize_image('input.jpg', 'output.jpg', max_width=1920, verbose=False)
|
|
292
|
+
|
|
293
|
+
mock_img.resize.assert_called_once()
|
|
294
|
+
|
|
295
|
+
@patch('PIL.Image.open')
|
|
296
|
+
@patch('pathlib.Path.stat')
|
|
297
|
+
def test_optimize_image_rgba_to_jpg(self, mock_stat, mock_image_open):
|
|
298
|
+
"""Test converting RGBA to RGB for JPEG."""
|
|
299
|
+
mock_img = Mock()
|
|
300
|
+
mock_img.width = 1920
|
|
301
|
+
mock_img.height = 1080
|
|
302
|
+
mock_img.mode = 'RGBA'
|
|
303
|
+
mock_img.split.return_value = [Mock(), Mock(), Mock(), Mock()]
|
|
304
|
+
mock_image_open.return_value = mock_img
|
|
305
|
+
|
|
306
|
+
mock_stat.return_value.st_size = 1024 * 1024
|
|
307
|
+
|
|
308
|
+
with patch('PIL.Image.new') as mock_new:
|
|
309
|
+
mock_rgb = Mock()
|
|
310
|
+
mock_new.return_value = mock_rgb
|
|
311
|
+
|
|
312
|
+
mo.optimize_image('input.png', 'output.jpg', verbose=False)
|
|
313
|
+
|
|
314
|
+
mock_new.assert_called_once()
|
|
315
|
+
|
|
316
|
+
def test_optimize_image_no_pillow(self):
|
|
317
|
+
"""Test image optimization without Pillow."""
|
|
318
|
+
with patch.dict('sys.modules', {'PIL': None}):
|
|
319
|
+
result = mo.optimize_image('input.jpg', 'output.jpg')
|
|
320
|
+
# Will fail to import but function handles it
|
|
321
|
+
assert result is False
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
class TestVideoSplitting:
|
|
325
|
+
"""Test video splitting functionality."""
|
|
326
|
+
|
|
327
|
+
@patch('media_optimizer.check_ffmpeg')
|
|
328
|
+
@patch('media_optimizer.get_media_info')
|
|
329
|
+
@patch('subprocess.run')
|
|
330
|
+
@patch('pathlib.Path.mkdir')
|
|
331
|
+
def test_split_video_success(self, mock_mkdir, mock_run, mock_info, mock_check):
|
|
332
|
+
"""Test successful video splitting."""
|
|
333
|
+
mock_check.return_value = True
|
|
334
|
+
mock_info.return_value = {'duration': 7200.0} # 2 hours
|
|
335
|
+
|
|
336
|
+
result = mo.split_video(
|
|
337
|
+
'input.mp4',
|
|
338
|
+
'./chunks',
|
|
339
|
+
chunk_duration=3600, # 1 hour chunks
|
|
340
|
+
verbose=False
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
# Duration 7200s / 3600s = 2, +1 for safety = 3 chunks
|
|
344
|
+
assert len(result) == 3
|
|
345
|
+
assert mock_run.call_count == 3
|
|
346
|
+
|
|
347
|
+
@patch('media_optimizer.check_ffmpeg')
|
|
348
|
+
@patch('media_optimizer.get_media_info')
|
|
349
|
+
def test_split_video_short_duration(self, mock_info, mock_check):
|
|
350
|
+
"""Test splitting video shorter than chunk duration."""
|
|
351
|
+
mock_check.return_value = True
|
|
352
|
+
mock_info.return_value = {'duration': 1800.0} # 30 minutes
|
|
353
|
+
|
|
354
|
+
result = mo.split_video(
|
|
355
|
+
'input.mp4',
|
|
356
|
+
'./chunks',
|
|
357
|
+
chunk_duration=3600, # 1 hour
|
|
358
|
+
verbose=False
|
|
359
|
+
)
|
|
360
|
+
|
|
361
|
+
assert result == ['input.mp4']
|
|
362
|
+
|
|
363
|
+
@patch('media_optimizer.check_ffmpeg')
|
|
364
|
+
def test_split_video_no_ffmpeg(self, mock_check):
|
|
365
|
+
"""Test video splitting without ffmpeg."""
|
|
366
|
+
mock_check.return_value = False
|
|
367
|
+
|
|
368
|
+
result = mo.split_video('input.mp4', './chunks')
|
|
369
|
+
assert result == []
|
|
370
|
+
|
|
371
|
+
|
|
372
|
+
if __name__ == '__main__':
|
|
373
|
+
pytest.main([__file__, '-v', '--cov=media_optimizer', '--cov-report=term-missing'])
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
# MCP Management Skill
|
|
2
|
+
|
|
3
|
+
Intelligent management and execution of Model Context Protocol (MCP) servers.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
This skill enables Claude to discover, analyze, and execute MCP server capabilities without polluting the main context window. Perfect for context-efficient MCP integration using subagent-based architecture.
|
|
8
|
+
|
|
9
|
+
## Features
|
|
10
|
+
|
|
11
|
+
- **Multi-Server Management**: Connect to multiple MCP servers from single config
|
|
12
|
+
- **Intelligent Tool Discovery**: Analyze which tools are relevant for specific tasks
|
|
13
|
+
- **Progressive Disclosure**: Load only necessary tool definitions
|
|
14
|
+
- **Execution Engine**: Call MCP tools with proper parameter handling
|
|
15
|
+
- **Context Efficiency**: Delegate MCP operations to `mcp-manager` subagent
|
|
16
|
+
|
|
17
|
+
## Quick Start
|
|
18
|
+
|
|
19
|
+
### 1. Install Dependencies
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
cd .claude/skills/mcp-management/scripts
|
|
23
|
+
npm install
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
### 2. Configure MCP Servers
|
|
27
|
+
|
|
28
|
+
Create `.claude/.mcp.json`:
|
|
29
|
+
|
|
30
|
+
```json
|
|
31
|
+
{
|
|
32
|
+
"mcpServers": {
|
|
33
|
+
"memory": {
|
|
34
|
+
"command": "npx",
|
|
35
|
+
"args": ["-y", "@modelcontextprotocol/server-memory"]
|
|
36
|
+
},
|
|
37
|
+
"filesystem": {
|
|
38
|
+
"command": "npx",
|
|
39
|
+
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/allowed/path"]
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
See `.claude/.mcp.json.example` for more examples.
|
|
46
|
+
|
|
47
|
+
### 3. Test Connection
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
cd .claude/skills/mcp-management/scripts
|
|
51
|
+
npx ts-node cli.ts list-tools
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Usage Patterns
|
|
55
|
+
|
|
56
|
+
### Pattern 1: Discover Available Tools
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
npx ts-node scripts/cli.ts list-tools
|
|
60
|
+
npx ts-node scripts/cli.ts list-prompts
|
|
61
|
+
npx ts-node scripts/cli.ts list-resources
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Pattern 2: LLM-Driven Tool Selection
|
|
65
|
+
|
|
66
|
+
The LLM reads `assets/tools.json` and intelligently selects tools. No separate analysis command needed - the LLM's understanding of context and intent is superior to keyword matching.
|
|
67
|
+
|
|
68
|
+
### Pattern 3: Execute MCP Tools
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
npx ts-node scripts/cli.ts call-tool memory add '{"key":"name","value":"Alice"}'
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Pattern 4: Use with Subagent
|
|
75
|
+
|
|
76
|
+
In main Claude conversation:
|
|
77
|
+
|
|
78
|
+
```
|
|
79
|
+
User: "I need to search the web and save results"
|
|
80
|
+
Main Agent: [Spawns mcp-manager subagent]
|
|
81
|
+
mcp-manager: Discovers brave-search + memory tools, reports back
|
|
82
|
+
Main Agent: Uses recommended tools for implementation
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Architecture
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
Main Agent (Claude)
|
|
89
|
+
↓ (delegates MCP tasks)
|
|
90
|
+
mcp-manager Subagent
|
|
91
|
+
↓ (uses skill)
|
|
92
|
+
mcp-management Skill
|
|
93
|
+
↓ (connects via)
|
|
94
|
+
MCP Servers (memory, filesystem, etc.)
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
**Benefits**:
|
|
98
|
+
- Main agent context stays clean
|
|
99
|
+
- MCP discovery happens in isolated subagent context
|
|
100
|
+
- Only relevant tool definitions loaded when needed
|
|
101
|
+
- Reduced token usage
|
|
102
|
+
|
|
103
|
+
## File Structure
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
mcp-management/
|
|
107
|
+
├── SKILL.md # Skill definition
|
|
108
|
+
├── README.md # This file
|
|
109
|
+
├── scripts/
|
|
110
|
+
│ ├── mcp-client.ts # Core MCP client manager
|
|
111
|
+
│ ├── analyze-tools.ts # Intelligent tool selection
|
|
112
|
+
│ ├── cli.ts # Command-line interface
|
|
113
|
+
│ ├── package.json # Dependencies
|
|
114
|
+
│ ├── tsconfig.json # TypeScript config
|
|
115
|
+
│ └── .env.example # Environment template
|
|
116
|
+
└── references/
|
|
117
|
+
├── mcp-protocol.md # MCP protocol reference
|
|
118
|
+
└── configuration.md # Config guide
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Scripts Reference
|
|
122
|
+
|
|
123
|
+
### mcp-client.ts
|
|
124
|
+
|
|
125
|
+
Core client manager class:
|
|
126
|
+
- Load config from `.claude/.mcp.json`
|
|
127
|
+
- Connect to multiple MCP servers
|
|
128
|
+
- List/execute tools, prompts, resources
|
|
129
|
+
- Lifecycle management
|
|
130
|
+
|
|
131
|
+
### cli.ts
|
|
132
|
+
|
|
133
|
+
Command-line interface:
|
|
134
|
+
- `list-tools` - Show all tools and save to assets/tools.json
|
|
135
|
+
- `list-prompts` - Show all prompts
|
|
136
|
+
- `list-resources` - Show all resources
|
|
137
|
+
- `call-tool <server> <tool> <json>` - Execute tool
|
|
138
|
+
|
|
139
|
+
**Note**: Tool analysis is performed by the LLM reading `assets/tools.json`, which provides better context understanding than algorithmic matching.
|
|
140
|
+
|
|
141
|
+
## Configuration
|
|
142
|
+
|
|
143
|
+
### Environment Variables
|
|
144
|
+
|
|
145
|
+
Scripts check for variables in this order:
|
|
146
|
+
|
|
147
|
+
1. `process.env` (runtime)
|
|
148
|
+
2. `.claude/skills/mcp-management/.env`
|
|
149
|
+
3. `.claude/skills/.env`
|
|
150
|
+
4. `.claude/.env`
|
|
151
|
+
|
|
152
|
+
### MCP Config Format
|
|
153
|
+
|
|
154
|
+
```json
|
|
155
|
+
{
|
|
156
|
+
"mcpServers": {
|
|
157
|
+
"server-name": {
|
|
158
|
+
"command": "executable", // Required
|
|
159
|
+
"args": ["arg1", "arg2"], // Required
|
|
160
|
+
"env": { // Optional
|
|
161
|
+
"VAR": "value",
|
|
162
|
+
"API_KEY": "${ENV_VAR}" // Reference env vars
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Common MCP Servers
|
|
170
|
+
|
|
171
|
+
Install with `npx`:
|
|
172
|
+
|
|
173
|
+
- `@modelcontextprotocol/server-memory` - Key-value storage
|
|
174
|
+
- `@modelcontextprotocol/server-filesystem` - File operations
|
|
175
|
+
- `@modelcontextprotocol/server-brave-search` - Web search
|
|
176
|
+
- `@modelcontextprotocol/server-puppeteer` - Browser automation
|
|
177
|
+
- `@modelcontextprotocol/server-fetch` - HTTP requests
|
|
178
|
+
|
|
179
|
+
## Integration with mcp-manager Agent
|
|
180
|
+
|
|
181
|
+
The `mcp-manager` agent (`.claude/agents/mcp-manager.md`) uses this skill to:
|
|
182
|
+
|
|
183
|
+
1. **Discover**: Connect to MCP servers, list capabilities
|
|
184
|
+
2. **Analyze**: Filter relevant tools for tasks
|
|
185
|
+
3. **Execute**: Call MCP tools on behalf of main agent
|
|
186
|
+
4. **Report**: Send concise results back to main agent
|
|
187
|
+
|
|
188
|
+
This architecture keeps main context clean and enables efficient MCP integration.
|
|
189
|
+
|
|
190
|
+
## Troubleshooting
|
|
191
|
+
|
|
192
|
+
### "Config not found"
|
|
193
|
+
|
|
194
|
+
Ensure `.claude/.mcp.json` exists and is valid JSON.
|
|
195
|
+
|
|
196
|
+
### "Server connection failed"
|
|
197
|
+
|
|
198
|
+
Check:
|
|
199
|
+
- Server command is installed (`npx` packages installed?)
|
|
200
|
+
- Server args are correct
|
|
201
|
+
- Environment variables are set
|
|
202
|
+
|
|
203
|
+
### "Tool not found"
|
|
204
|
+
|
|
205
|
+
List available tools first:
|
|
206
|
+
```bash
|
|
207
|
+
npx ts-node scripts/cli.ts list-tools
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## Resources
|
|
211
|
+
|
|
212
|
+
- [MCP Specification](https://modelcontextprotocol.io/specification/latest)
|
|
213
|
+
- [MCP TypeScript SDK](https://github.com/modelcontextprotocol/typescript-sdk)
|
|
214
|
+
- [Official MCP Servers](https://github.com/modelcontextprotocol/servers)
|
|
215
|
+
- [Skill References](./references/)
|
|
216
|
+
|
|
217
|
+
## License
|
|
218
|
+
|
|
219
|
+
MIT
|