agent-toolkit-cli 1.11.0__py3-none-win_amd64.whl
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.
- agent_toolkit/__init__.py +4 -0
- agent_toolkit/__main__.py +5 -0
- agent_toolkit/_paths.py +145 -0
- agent_toolkit/bin/.gitkeep +0 -0
- agent_toolkit/bin/agent-toolkit.exe +0 -0
- agent_toolkit/cli/__init__.py +0 -0
- agent_toolkit/cli/__main__.py +5 -0
- agent_toolkit/cli/build.py +278 -0
- agent_toolkit/cli/completion.py +297 -0
- agent_toolkit/cli/context_budget.py +455 -0
- agent_toolkit/cli/devcompanion.py +923 -0
- agent_toolkit/cli/devcompanion_queue.py +235 -0
- agent_toolkit/cli/diff.py +176 -0
- agent_toolkit/cli/doctor.py +1052 -0
- agent_toolkit/cli/insights.py +771 -0
- agent_toolkit/cli/install.py +706 -0
- agent_toolkit/cli/main.py +171 -0
- agent_toolkit/cli/mcp.py +537 -0
- agent_toolkit/cli/memory.py +739 -0
- agent_toolkit/cli/plugin.py +224 -0
- agent_toolkit/cli/project.py +459 -0
- agent_toolkit/cli/release.py +178 -0
- agent_toolkit/cli/skills.py +461 -0
- agent_toolkit/cli/uninstall.py +166 -0
- agent_toolkit/cli/update.py +298 -0
- agent_toolkit/cli/workspace.py +1713 -0
- agent_toolkit/compiler/hook_registry.py +110 -0
- agent_toolkit/compiler/loader.py +338 -0
- agent_toolkit/compiler/mcp_registry.py +87 -0
- agent_toolkit/compiler/model.py +182 -0
- agent_toolkit/compiler/provenance.py +140 -0
- agent_toolkit/compiler/registry_emit.py +263 -0
- agent_toolkit/compiler/target_registry.py +122 -0
- agent_toolkit/compiler/targets/__init__.py +1 -0
- agent_toolkit/compiler/targets/agent_plugins.py +160 -0
- agent_toolkit/compiler/targets/base.py +229 -0
- agent_toolkit/compiler/targets/claude_code.py +241 -0
- agent_toolkit/compiler/targets/codex.py +261 -0
- agent_toolkit/compiler/targets/copilot.py +275 -0
- agent_toolkit/compiler/targets/cursor.py +207 -0
- agent_toolkit/compiler/targets/gemini_cli.py +213 -0
- agent_toolkit/compiler/targets/muse_code.py +113 -0
- agent_toolkit/compiler/targets/opencode.py +204 -0
- agent_toolkit/compiler/targets/pi.py +263 -0
- agent_toolkit/compiler/targets/windsurf.py +267 -0
- agent_toolkit/compiler/tool_mapping.py +83 -0
- agent_toolkit/data/.gitignore +4 -0
- agent_toolkit/data/__init__.py +1 -0
- agent_toolkit/data/agents/agentic-security-reviewer/AGENT.md +60 -0
- agent_toolkit/data/agents/architect/AGENT.md +30 -0
- agent_toolkit/data/agents/assistant/AGENT.md +59 -0
- agent_toolkit/data/agents/build-error-resolver/AGENT.md +30 -0
- agent_toolkit/data/agents/client-workflow-bootstrap/AGENT.md +60 -0
- agent_toolkit/data/agents/code-reviewer/AGENT.md +49 -0
- agent_toolkit/data/agents/database-reviewer/AGENT.md +44 -0
- agent_toolkit/data/agents/docs-lookup/AGENT.md +28 -0
- agent_toolkit/data/agents/e2e-runner/AGENT.md +38 -0
- agent_toolkit/data/agents/performance-optimizer/AGENT.md +52 -0
- agent_toolkit/data/agents/planner/AGENT.md +41 -0
- agent_toolkit/data/agents/refactor-cleaner/AGENT.md +43 -0
- agent_toolkit/data/agents/reference-lookup/AGENT.md +33 -0
- agent_toolkit/data/agents/security-reviewer/AGENT.md +47 -0
- agent_toolkit/data/agents/tdd-guide/AGENT.md +58 -0
- agent_toolkit/data/agents/tech-assistant/AGENT.md +11 -0
- agent_toolkit/data/agents/typescript-reviewer/AGENT.md +61 -0
- agent_toolkit/data/capabilities/hooks/README.md +6 -0
- agent_toolkit/data/capabilities/hooks/pre-commit-validate.yaml +26 -0
- agent_toolkit/data/capabilities/hooks/scripts/pre-commit-validate.sh +41 -0
- agent_toolkit/data/capabilities/hooks/scripts/session-start-context.sh +11 -0
- agent_toolkit/data/capabilities/hooks/session-start-context.yaml +23 -0
- agent_toolkit/data/capabilities/targets/registry.yaml +90 -0
- agent_toolkit/data/capabilities/upstream.lock +118 -0
- agent_toolkit/data/catalogs/agent-catalog.yaml +81 -0
- agent_toolkit/data/catalogs/loop-catalog.yaml +55 -0
- agent_toolkit/data/catalogs/skill-catalog.yaml +520 -0
- agent_toolkit/data/catalogs/skills-layout.json +391 -0
- agent_toolkit/data/distributions/products.yaml +190 -0
- agent_toolkit/data/distributions/targets/claude-code.yaml +47 -0
- agent_toolkit/data/distributions/targets/cursor.yaml +42 -0
- agent_toolkit/data/distributions/targets/opencode.yaml +55 -0
- agent_toolkit/data/loops/changelog-drafter/loop.yaml +40 -0
- agent_toolkit/data/loops/ci-sweeper/loop.yaml +53 -0
- agent_toolkit/data/loops/daily-triage/loop.yaml +47 -0
- agent_toolkit/data/loops/dep-sweeper/loop.yaml +46 -0
- agent_toolkit/data/loops/issue-triage/loop.yaml +40 -0
- agent_toolkit/data/loops/oss-daily-briefing/loop.yaml +65 -0
- agent_toolkit/data/loops/oss-pr-monitor/loop.yaml +86 -0
- agent_toolkit/data/loops/oss-triage/loop.yaml +67 -0
- agent_toolkit/data/loops/post-merge-cleanup/loop.yaml +44 -0
- agent_toolkit/data/loops/pr-babysitter/loop.yaml +46 -0
- agent_toolkit/data/mcp/registry/chrome-devtools.yaml +61 -0
- agent_toolkit/data/mcp/registry/clickup.yaml +48 -0
- agent_toolkit/data/mcp/registry/figma.yaml +44 -0
- agent_toolkit/data/mcp/registry/github.yaml +52 -0
- agent_toolkit/data/mcp/registry/linear.yaml +47 -0
- agent_toolkit/data/mcp/registry/notion.yaml +48 -0
- agent_toolkit/data/mcp/registry/slack.yaml +46 -0
- agent_toolkit/data/mcp/templates/chrome-devtools/README.md +57 -0
- agent_toolkit/data/mcp/templates/chrome-devtools/config.template.json +6 -0
- agent_toolkit/data/mcp/templates/clickup/README.md +45 -0
- agent_toolkit/data/mcp/templates/clickup/config.template.json +8 -0
- agent_toolkit/data/mcp/templates/clickup/wrapper.sh +23 -0
- agent_toolkit/data/mcp/templates/figma/README.md +54 -0
- agent_toolkit/data/mcp/templates/figma/config.template.json +9 -0
- agent_toolkit/data/mcp/templates/github/README.md +16 -0
- agent_toolkit/data/mcp/templates/github/config.template.json +15 -0
- agent_toolkit/data/mcp/templates/github/wrapper.sh +6 -0
- agent_toolkit/data/mcp/templates/linear/README.md +49 -0
- agent_toolkit/data/mcp/templates/linear/config.template.json +10 -0
- agent_toolkit/data/mcp/templates/notion/README.md +7 -0
- agent_toolkit/data/mcp/templates/notion/config.template.json +8 -0
- agent_toolkit/data/mcp/templates/notion/wrapper.sh +23 -0
- agent_toolkit/data/mcp/templates/slack/README.md +8 -0
- agent_toolkit/data/mcp/templates/slack/config.template.json +9 -0
- agent_toolkit/data/mcp/templates/slack/wrapper.sh +23 -0
- agent_toolkit/data/packs/README.md +66 -0
- agent_toolkit/data/packs/agentic-security/README.md +19 -0
- agent_toolkit/data/packs/agentic-security/config.yaml +25 -0
- agent_toolkit/data/packs/architecture/README.md +22 -0
- agent_toolkit/data/packs/architecture/config.yaml +27 -0
- agent_toolkit/data/packs/code-quality/README.md +19 -0
- agent_toolkit/data/packs/code-quality/config.yaml +21 -0
- agent_toolkit/data/packs/delivery-discipline/README.md +19 -0
- agent_toolkit/data/packs/delivery-discipline/config.yaml +42 -0
- agent_toolkit/data/packs/design-engineering/README.md +19 -0
- agent_toolkit/data/packs/design-engineering/config.yaml +41 -0
- agent_toolkit/data/packs/engineering-workflow/README.md +21 -0
- agent_toolkit/data/packs/engineering-workflow/config.yaml +57 -0
- agent_toolkit/data/packs/oss-maintenance/README.md +245 -0
- agent_toolkit/data/packs/oss-maintenance/config.yaml +75 -0
- agent_toolkit/data/profiles/claude-code/CLAUDE.md +110 -0
- agent_toolkit/data/profiles/claude-code/agents/assistant.md +59 -0
- agent_toolkit/data/profiles/claude-code/agents/build-error-resolver.md +30 -0
- agent_toolkit/data/profiles/claude-code/agents/client-workflow-bootstrap.md +60 -0
- agent_toolkit/data/profiles/claude-code/agents/contribution-planner.md +39 -0
- agent_toolkit/data/profiles/claude-code/agents/database-reviewer.md +44 -0
- agent_toolkit/data/profiles/claude-code/agents/docs-lookup.md +28 -0
- agent_toolkit/data/profiles/claude-code/agents/e2e-runner.md +38 -0
- agent_toolkit/data/profiles/claude-code/agents/performance-optimizer.md +52 -0
- agent_toolkit/data/profiles/claude-code/agents/planner.md +41 -0
- agent_toolkit/data/profiles/claude-code/agents/refactor-cleaner.md +43 -0
- agent_toolkit/data/profiles/claude-code/agents/reference-lookup.md +33 -0
- agent_toolkit/data/profiles/claude-code/agents/security-reviewer.md +47 -0
- agent_toolkit/data/profiles/claude-code/agents/tdd-guide.md +58 -0
- agent_toolkit/data/profiles/claude-code/agents/typescript-reviewer.md +61 -0
- agent_toolkit/data/profiles/claude-code/settings.json +86 -0
- agent_toolkit/data/profiles/copilot/copilot-instructions.md +15 -0
- agent_toolkit/data/profiles/cursor/README.md +33 -0
- agent_toolkit/data/profiles/cursor/rules/architect.mdc +23 -0
- agent_toolkit/data/profiles/cursor/rules/assistant.mdc +61 -0
- agent_toolkit/data/profiles/cursor/rules/build-error-resolver.mdc +20 -0
- agent_toolkit/data/profiles/cursor/rules/code-reviewer.mdc +21 -0
- agent_toolkit/data/profiles/cursor/rules/database-reviewer.mdc +29 -0
- agent_toolkit/data/profiles/cursor/rules/docs-lookup.mdc +15 -0
- agent_toolkit/data/profiles/cursor/rules/e2e-runner.mdc +30 -0
- agent_toolkit/data/profiles/cursor/rules/performance-optimizer.mdc +27 -0
- agent_toolkit/data/profiles/cursor/rules/planner.mdc +28 -0
- agent_toolkit/data/profiles/cursor/rules/refactor-cleaner.mdc +26 -0
- agent_toolkit/data/profiles/cursor/rules/reference-lookup.mdc +20 -0
- agent_toolkit/data/profiles/cursor/rules/security-reviewer.mdc +20 -0
- agent_toolkit/data/profiles/cursor/rules/tdd-guide.mdc +26 -0
- agent_toolkit/data/profiles/cursor/rules/typescript-reviewer.mdc +28 -0
- agent_toolkit/data/profiles/muse-code/README.md +35 -0
- agent_toolkit/data/profiles/opencode/README.md +44 -0
- agent_toolkit/data/profiles/opencode/agents/architect.md +30 -0
- agent_toolkit/data/profiles/opencode/agents/assistant.md +96 -0
- agent_toolkit/data/profiles/opencode/agents/build-error-resolver.md +31 -0
- agent_toolkit/data/profiles/opencode/agents/client-workflow-bootstrap.md +66 -0
- agent_toolkit/data/profiles/opencode/agents/code-reviewer.md +47 -0
- agent_toolkit/data/profiles/opencode/agents/contribution-planner.md +44 -0
- agent_toolkit/data/profiles/opencode/agents/database-reviewer.md +43 -0
- agent_toolkit/data/profiles/opencode/agents/docs-lookup.md +28 -0
- agent_toolkit/data/profiles/opencode/agents/e2e-runner.md +33 -0
- agent_toolkit/data/profiles/opencode/agents/performance-optimizer.md +34 -0
- agent_toolkit/data/profiles/opencode/agents/planner.md +27 -0
- agent_toolkit/data/profiles/opencode/agents/refactor-cleaner.md +27 -0
- agent_toolkit/data/profiles/opencode/agents/reference-lookup.md +27 -0
- agent_toolkit/data/profiles/opencode/agents/security-reviewer.md +27 -0
- agent_toolkit/data/profiles/opencode/agents/tdd-guide.md +27 -0
- agent_toolkit/data/profiles/opencode/agents/typescript-reviewer.md +30 -0
- agent_toolkit/data/profiles/opencode/opencode.json +3 -0
- agent_toolkit/data/profiles/pi/skills/architect/skill.md +5 -0
- agent_toolkit/data/profiles/pi/skills/assistant/skill.md +3 -0
- agent_toolkit/data/profiles/pi/skills/code-reviewer/skill.md +5 -0
- agent_toolkit/data/profiles/pi/skills/planner/skill.md +3 -0
- agent_toolkit/data/profiles/pi/skills/security-reviewer/skill.md +3 -0
- agent_toolkit/data/profiles/windsurf/memories/global_rules.md +114 -0
- agent_toolkit/data/profiles/windsurf/rules/architect.mdc +23 -0
- agent_toolkit/data/profiles/windsurf/rules/assistant.mdc +61 -0
- agent_toolkit/data/profiles/windsurf/rules/build-error-resolver.mdc +20 -0
- agent_toolkit/data/profiles/windsurf/rules/code-reviewer.mdc +21 -0
- agent_toolkit/data/profiles/windsurf/rules/database-reviewer.mdc +29 -0
- agent_toolkit/data/profiles/windsurf/rules/docs-lookup.mdc +15 -0
- agent_toolkit/data/profiles/windsurf/rules/e2e-runner.mdc +30 -0
- agent_toolkit/data/profiles/windsurf/rules/performance-optimizer.mdc +27 -0
- agent_toolkit/data/profiles/windsurf/rules/planner.mdc +28 -0
- agent_toolkit/data/profiles/windsurf/rules/refactor-cleaner.mdc +26 -0
- agent_toolkit/data/profiles/windsurf/rules/reference-lookup.mdc +20 -0
- agent_toolkit/data/profiles/windsurf/rules/security-reviewer.mdc +20 -0
- agent_toolkit/data/profiles/windsurf/rules/tdd-guide.mdc +26 -0
- agent_toolkit/data/profiles/windsurf/rules/typescript-reviewer.mdc +28 -0
- agent_toolkit/data/skills/accessibility/review/SKILL.md +116 -0
- agent_toolkit/data/skills/accessibility/review/references/a11y-checklist.md +25 -0
- agent_toolkit/data/skills/accessibility/review/references/a11y-findings-template.md +56 -0
- agent_toolkit/data/skills/accessibility/review/references/research.md +47 -0
- agent_toolkit/data/skills/agentic-security/mcp-audit/SKILL.md +116 -0
- agent_toolkit/data/skills/agentic-security/mcp-audit/references/mcp-audit-template.md +51 -0
- agent_toolkit/data/skills/agentic-security/owasp-agentic-review/SKILL.md +73 -0
- agent_toolkit/data/skills/agentic-security/owasp-agentic-review/references/owasp-agentic-template.md +32 -0
- agent_toolkit/data/skills/agentic-security/supply-chain-audit/SKILL.md +142 -0
- agent_toolkit/data/skills/agentic-security/threat-modeling/SKILL.md +100 -0
- agent_toolkit/data/skills/agentic-security/threat-modeling/references/threat-model-template.md +55 -0
- agent_toolkit/data/skills/architecture/c4-model/SKILL.md +49 -0
- agent_toolkit/data/skills/cloud/aws-well-architected-review/SKILL.md +37 -0
- agent_toolkit/data/skills/cloud/cloud-design-patterns/SKILL.md +38 -0
- agent_toolkit/data/skills/core/assistant/SKILL.md +216 -0
- agent_toolkit/data/skills/core/assistant/references/AGENTS_TEMPLATE.md +0 -0
- agent_toolkit/data/skills/core/assistant/references/ORCHESTRATION.md +0 -0
- agent_toolkit/data/skills/core/assistant/references/REPO_INSPECTION.md +0 -0
- agent_toolkit/data/skills/core/dev-companion/SKILL.md +65 -0
- agent_toolkit/data/skills/core/dev-companion/references/LOOP_GUARDRAILS.md +0 -0
- agent_toolkit/data/skills/core/onboarding/SKILL.md +122 -0
- agent_toolkit/data/skills/core/output-handshake/SKILL.md +26 -0
- agent_toolkit/data/skills/core/pr-fallback/SKILL.md +35 -0
- agent_toolkit/data/skills/core/pr-fallback/references/pr-body-default.md +0 -0
- agent_toolkit/data/skills/core/project/SKILL.md +89 -0
- agent_toolkit/data/skills/core/workspace/SKILL.md +103 -0
- agent_toolkit/data/skills/core/workspace-knowledge-sync/SKILL.md +140 -0
- agent_toolkit/data/skills/data/dbt-validation/SKILL.md +41 -0
- agent_toolkit/data/skills/data/snowflake-validation/SKILL.md +38 -0
- agent_toolkit/data/skills/delivery/adr/SKILL.md +56 -0
- agent_toolkit/data/skills/delivery/adr/references/default-template.md +35 -0
- agent_toolkit/data/skills/delivery/adr/references/example-001-graphql-adoption.md +66 -0
- agent_toolkit/data/skills/delivery/agreement/SKILL.md +24 -0
- agent_toolkit/data/skills/delivery/agreement/references/default-template.md +17 -0
- agent_toolkit/data/skills/delivery/agreement/references/example-api-versioning.md +29 -0
- agent_toolkit/data/skills/delivery/bug/SKILL.md +26 -0
- agent_toolkit/data/skills/delivery/bug/references/default-template.md +26 -0
- agent_toolkit/data/skills/delivery/bug/references/example-search-filter-bug.md +58 -0
- agent_toolkit/data/skills/delivery/decision-log/SKILL.md +28 -0
- agent_toolkit/data/skills/delivery/decision-log/references/default-template.md +17 -0
- agent_toolkit/data/skills/delivery/decision-log/references/example-repository-pattern.md +27 -0
- agent_toolkit/data/skills/delivery/development-workflow/SKILL.md +34 -0
- agent_toolkit/data/skills/delivery/development-workflow/references/default-workflow-checklist.md +44 -0
- agent_toolkit/data/skills/delivery/epic/SKILL.md +22 -0
- agent_toolkit/data/skills/delivery/epic/references/default-template.md +26 -0
- agent_toolkit/data/skills/delivery/epic/references/example-unified-dashboard.md +40 -0
- agent_toolkit/data/skills/delivery/incident/SKILL.md +24 -0
- agent_toolkit/data/skills/delivery/incident/references/default-template.md +29 -0
- agent_toolkit/data/skills/delivery/incident/references/example-payment-outage.md +62 -0
- agent_toolkit/data/skills/delivery/management-unit-assessment/SKILL.md +104 -0
- agent_toolkit/data/skills/delivery/management-unit-assessment/references/default-template.md +24 -0
- agent_toolkit/data/skills/delivery/management-unit-assessment/references/example-team-assessment.md +126 -0
- agent_toolkit/data/skills/delivery/meeting-minutes/SKILL.md +25 -0
- agent_toolkit/data/skills/delivery/meeting-minutes/references/default-template.md +22 -0
- agent_toolkit/data/skills/delivery/meeting-minutes/references/example-weekly-sync.md +72 -0
- agent_toolkit/data/skills/delivery/planning/SKILL.md +31 -0
- agent_toolkit/data/skills/delivery/planning/references/default-template.md +25 -0
- agent_toolkit/data/skills/delivery/planning/references/example-sprint-planning.md +62 -0
- agent_toolkit/data/skills/delivery/prd/SKILL.md +46 -0
- agent_toolkit/data/skills/delivery/prd/references/default-template.md +31 -0
- agent_toolkit/data/skills/delivery/prd/references/example-unified-api.md +71 -0
- agent_toolkit/data/skills/delivery/project-assessment/SKILL.md +90 -0
- agent_toolkit/data/skills/delivery/project-assessment/references/default-template.md +26 -0
- agent_toolkit/data/skills/delivery/project-assessment/references/example-platform-assessment.md +122 -0
- agent_toolkit/data/skills/delivery/project-assessment-evidence/SKILL.md +88 -0
- agent_toolkit/data/skills/delivery/project-assessment-evidence/references/default-template.md +24 -0
- agent_toolkit/data/skills/delivery/project-assessment-evidence/references/example-evidence-map.md +46 -0
- agent_toolkit/data/skills/delivery/spike/SKILL.md +24 -0
- agent_toolkit/data/skills/delivery/spike/references/default-template.md +29 -0
- agent_toolkit/data/skills/delivery/spike/references/example-graphql-federation.md +79 -0
- agent_toolkit/data/skills/delivery/task/SKILL.md +21 -0
- agent_toolkit/data/skills/delivery/task/references/default-template.md +21 -0
- agent_toolkit/data/skills/delivery/task/references/example-nav-system.md +33 -0
- agent_toolkit/data/skills/delivery/technical-unit-assessment/SKILL.md +58 -0
- agent_toolkit/data/skills/delivery/technical-unit-assessment/references/default-template.md +26 -0
- agent_toolkit/data/skills/delivery/technical-unit-assessment/references/example-frontend-assessment.md +112 -0
- agent_toolkit/data/skills/delivery/technical-unit-assessment/references/indicator-groups.md +65 -0
- agent_toolkit/data/skills/delivery/trd/SKILL.md +49 -0
- agent_toolkit/data/skills/delivery/trd/references/default-template.md +31 -0
- agent_toolkit/data/skills/delivery/trd/references/example-api-migration.md +122 -0
- agent_toolkit/data/skills/delivery/user-story/SKILL.md +21 -0
- agent_toolkit/data/skills/delivery/user-story/references/default-template.md +21 -0
- agent_toolkit/data/skills/delivery/user-story/references/example-advanced-filtering.md +37 -0
- agent_toolkit/data/skills/delivery/work-item/SKILL.md +31 -0
- agent_toolkit/data/skills/delivery/work-item/references/default-template.md +21 -0
- agent_toolkit/data/skills/delivery/work-item/references/example-routing-dashboard.md +23 -0
- agent_toolkit/data/skills/delivery/workflow-client-bootstrap/SKILL.md +148 -0
- agent_toolkit/data/skills/delivery/workflow-client-bootstrap/questions.yaml +165 -0
- agent_toolkit/data/skills/delivery/workflow-generic-project/SKILL.md +79 -0
- agent_toolkit/data/skills/design/design-assessment/SKILL.md +150 -0
- agent_toolkit/data/skills/design/design-assessment/references/design-scorecard-template.md +78 -0
- agent_toolkit/data/skills/design/design-improvement/SKILL.md +167 -0
- agent_toolkit/data/skills/design/design-improvement/references/improvement-plan-template.md +113 -0
- agent_toolkit/data/skills/design/figma/LICENSE.txt +2 -0
- agent_toolkit/data/skills/design/figma/NOTICE.txt +25 -0
- agent_toolkit/data/skills/design/figma/SKILL.md +98 -0
- agent_toolkit/data/skills/design/figma/references/figma-mcp-config.md +82 -0
- agent_toolkit/data/skills/design/figma/references/figma-tools-and-prompts.md +34 -0
- agent_toolkit/data/skills/design/figma-code-connect-components/LICENSE.txt +2 -0
- agent_toolkit/data/skills/design/figma-code-connect-components/NOTICE.txt +18 -0
- agent_toolkit/data/skills/design/figma-code-connect-components/SKILL.md +354 -0
- agent_toolkit/data/skills/design/figma-code-connect-components/references/mapping-checklist.md +7 -0
- agent_toolkit/data/skills/design/figma-code-connect-components/scripts/normalize_node_id.py +25 -0
- agent_toolkit/data/skills/design/figma-create-design-system-rules/LICENSE.txt +2 -0
- agent_toolkit/data/skills/design/figma-create-design-system-rules/NOTICE.txt +19 -0
- agent_toolkit/data/skills/design/figma-create-design-system-rules/SKILL.md +554 -0
- agent_toolkit/data/skills/design/figma-create-design-system-rules/references/rule-template.md +15 -0
- agent_toolkit/data/skills/design/figma-create-design-system-rules/scripts/check_agents_md.sh +9 -0
- agent_toolkit/data/skills/design/figma-create-new-file/LICENSE.txt +2 -0
- agent_toolkit/data/skills/design/figma-create-new-file/NOTICE.txt +17 -0
- agent_toolkit/data/skills/design/figma-create-new-file/SKILL.md +72 -0
- agent_toolkit/data/skills/design/figma-implement-design/LICENSE.txt +2 -0
- agent_toolkit/data/skills/design/figma-implement-design/NOTICE.txt +19 -0
- agent_toolkit/data/skills/design/figma-implement-design/SKILL.md +268 -0
- agent_toolkit/data/skills/design/frontend-design/LICENSE.txt +177 -0
- agent_toolkit/data/skills/design/frontend-design/SKILL.md +82 -0
- agent_toolkit/data/skills/design/frontend-design/UPSTREAM.md +14 -0
- agent_toolkit/data/skills/design/frontend-design-review/LICENSE +21 -0
- agent_toolkit/data/skills/design/frontend-design-review/SKILL.md +194 -0
- agent_toolkit/data/skills/design/frontend-design-review/references/pattern-examples.md +21 -0
- agent_toolkit/data/skills/design/frontend-design-review/references/quick-checklist.md +38 -0
- agent_toolkit/data/skills/design/frontend-design-review/references/review-output-format.md +68 -0
- agent_toolkit/data/skills/design/frontend-design-review/references/review-type-modifiers.md +31 -0
- agent_toolkit/data/skills/design/web-design-guidelines/SKILL.md +78 -0
- agent_toolkit/data/skills/design/web-design-guidelines/references/LICENSE +21 -0
- agent_toolkit/data/skills/design/web-design-guidelines/references/web-interface-guidelines.md +180 -0
- agent_toolkit/data/skills/forge/gh-address-comments/LICENSE.txt +202 -0
- agent_toolkit/data/skills/forge/gh-address-comments/NOTICE.txt +20 -0
- agent_toolkit/data/skills/forge/gh-address-comments/SKILL.md +72 -0
- agent_toolkit/data/skills/forge/gh-address-comments/scripts/fetch_comments.py +239 -0
- agent_toolkit/data/skills/forge/gh-contribution-planner/SKILL.md +160 -0
- agent_toolkit/data/skills/forge/gh-contribution-planner/scripts/inspect_contributions.py +818 -0
- agent_toolkit/data/skills/forge/gh-fix-ci/LICENSE.txt +201 -0
- agent_toolkit/data/skills/forge/gh-fix-ci/NOTICE.txt +20 -0
- agent_toolkit/data/skills/forge/gh-fix-ci/SKILL.md +74 -0
- agent_toolkit/data/skills/forge/gh-fix-ci/scripts/inspect_pr_checks.py +509 -0
- agent_toolkit/data/skills/forge/github-cli-workflow/SKILL.md +49 -0
- agent_toolkit/data/skills/forge/gitlab-cli-workflow/SKILL.md +44 -0
- agent_toolkit/data/skills/forge/workflow-client-bootstrap/SKILL.md +14 -0
- agent_toolkit/data/skills/forge/workflow-generic-project/SKILL.md +14 -0
- agent_toolkit/data/skills/forge/worktree/SKILL.md +113 -0
- agent_toolkit/data/skills/integrations/clickup-cli/SKILL.md +78 -0
- agent_toolkit/data/skills/integrations/clickup-cli/references/docs-management.md +57 -0
- agent_toolkit/data/skills/integrations/clickup-cli/references/task-management.md +131 -0
- agent_toolkit/data/skills/integrations/clickup-cli/references/time-tracking.md +38 -0
- agent_toolkit/data/skills/integrations/linear/LICENSE.txt +202 -0
- agent_toolkit/data/skills/integrations/linear/NOTICE.txt +23 -0
- agent_toolkit/data/skills/integrations/linear/SKILL.md +134 -0
- agent_toolkit/data/skills/integrations/mcp/SKILL.md +88 -0
- agent_toolkit/data/skills/integrations/slack-assistant/SKILL.md +138 -0
- agent_toolkit/data/skills/integrations/slack-cli/SKILL.md +109 -0
- agent_toolkit/data/skills/integrations/slack-cli/references/INSTALLATION.md +42 -0
- agent_toolkit/data/skills/loops/loop-runner/SKILL.md +92 -0
- agent_toolkit/data/skills/ops/docs-generator/SKILL.md +120 -0
- agent_toolkit/data/skills/ops/llm-cost-advisor/SKILL.md +87 -0
- agent_toolkit/data/skills/ops/swarm/SKILL.md +108 -0
- agent_toolkit/data/skills/ops/swarm-handoff/SKILL.md +112 -0
- agent_toolkit/data/skills/ops/swarm-observer/SKILL.md +102 -0
- agent_toolkit/data/skills/ops/triage/SKILL.md +119 -0
- agent_toolkit/data/skills/quality/codeql/SKILL.md +106 -0
- agent_toolkit/data/skills/quality/codeql/references/codeql-queries.md +43 -0
- agent_toolkit/data/skills/quality/megalinter/SKILL.md +162 -0
- agent_toolkit/data/skills/quality/megalinter/references/megalinter-images.md +36 -0
- agent_toolkit/data/skills/quality/megalinter/references/megalinter-license.md +41 -0
- agent_toolkit/data/skills/quality/megalinter/references/megalinter-targets.md +66 -0
- agent_toolkit/data/skills/tooling/chrome-devtools/SKILL.md +146 -0
- agent_toolkit/data/skills/tooling/herdr/SKILL.md +109 -0
- agent_toolkit/data/skills/tooling/inventory/SKILL.md +81 -0
- agent_toolkit/data/skills/tooling/jupyter-notebook/LICENSE.txt +201 -0
- agent_toolkit/data/skills/tooling/jupyter-notebook/NOTICE.txt +27 -0
- agent_toolkit/data/skills/tooling/jupyter-notebook/SKILL.md +145 -0
- agent_toolkit/data/skills/tooling/jupyter-notebook/assets/experiment-template.ipynb +117 -0
- agent_toolkit/data/skills/tooling/jupyter-notebook/assets/tutorial-template.ipynb +115 -0
- agent_toolkit/data/skills/tooling/jupyter-notebook/references/experiment-patterns.md +10 -0
- agent_toolkit/data/skills/tooling/jupyter-notebook/references/notebook-structure.md +17 -0
- agent_toolkit/data/skills/tooling/jupyter-notebook/references/quality-checklist.md +11 -0
- agent_toolkit/data/skills/tooling/jupyter-notebook/references/tutorial-patterns.md +9 -0
- agent_toolkit/data/skills/tooling/jupyter-notebook/scripts/new_notebook.py +132 -0
- agent_toolkit/data/skills/tooling/mermaid/SKILL.md +36 -0
- agent_toolkit/data/skills/tooling/playwright-cli/LICENSE.txt +201 -0
- agent_toolkit/data/skills/tooling/playwright-cli/NOTICE.txt +29 -0
- agent_toolkit/data/skills/tooling/playwright-cli/SKILL.md +154 -0
- agent_toolkit/data/skills/tooling/playwright-cli/references/cli.md +116 -0
- agent_toolkit/data/skills/tooling/playwright-cli/references/workflows.md +98 -0
- agent_toolkit/data/skills/tooling/playwright-cli/scripts/executable_playwright_cli.sh +25 -0
- agent_toolkit/data_cache.py +79 -0
- agent_toolkit/data_sync.py +144 -0
- agent_toolkit/installer/__init__.py +0 -0
- agent_toolkit/installer/merge.py +59 -0
- agent_toolkit/installer/receipt.py +89 -0
- agent_toolkit/installer/sources.py +92 -0
- agent_toolkit/installer/tracking.py +63 -0
- agent_toolkit/launcher.py +69 -0
- agent_toolkit/loop/__init__.py +0 -0
- agent_toolkit/loop/budget.py +107 -0
- agent_toolkit/loop/gh_gate.py +923 -0
- agent_toolkit/loop/loop-gh-gate +923 -0
- agent_toolkit/loop/pack.py +65 -0
- agent_toolkit/loop/runner.py +2722 -0
- agent_toolkit/runner/__init__.py +0 -0
- agent_toolkit/runner/dispatcher.py +163 -0
- agent_toolkit/runner/policy.py +356 -0
- agent_toolkit/runner/providers/__init__.py +21 -0
- agent_toolkit/runner/providers/anthropic_provider.py +109 -0
- agent_toolkit/runner/providers/base.py +53 -0
- agent_toolkit/runner/providers/ollama_provider.py +108 -0
- agent_toolkit/runner/providers/openai_provider.py +103 -0
- agent_toolkit/runner/providers/opencode_provider.py +127 -0
- agent_toolkit/swarm/__init__.py +5 -0
- agent_toolkit/swarm/approvals.py +121 -0
- agent_toolkit/swarm/backends/__init__.py +596 -0
- agent_toolkit/swarm/budget.py +83 -0
- agent_toolkit/swarm/cli.py +2448 -0
- agent_toolkit/swarm/config.py +351 -0
- agent_toolkit/swarm/handoff.py +174 -0
- agent_toolkit/swarm/models.py +230 -0
- agent_toolkit/swarm/prompts.py +177 -0
- agent_toolkit/swarm/recipes.py +304 -0
- agent_toolkit/swarm/runner.py +267 -0
- agent_toolkit/swarm/state.py +93 -0
- agent_toolkit/swarm/store.py +148 -0
- agent_toolkit/swarm/worktree.py +105 -0
- agent_toolkit/templates/workspace/.gitignore +19 -0
- agent_toolkit/templates/workspace/AGENTS.md +82 -0
- agent_toolkit/templates/workspace/knowledge/README.md +22 -0
- agent_toolkit/templates/workspace/knowledge/learnings/general.md +3 -0
- agent_toolkit/templates/workspace/knowledge/todos/pending.md +7 -0
- agent_toolkit/templates/workspace/packs/README.md +24 -0
- agent_toolkit/templates/workspace/personas/architect.md +12 -0
- agent_toolkit/templates/workspace/personas/implementer.md +12 -0
- agent_toolkit/templates/workspace/personas/researcher.md +12 -0
- agent_toolkit/templates/workspace/personas/reviewer.md +12 -0
- agent_toolkit_cli-1.11.0.dist-info/METADATA +363 -0
- agent_toolkit_cli-1.11.0.dist-info/RECORD +438 -0
- agent_toolkit_cli-1.11.0.dist-info/WHEEL +4 -0
- agent_toolkit_cli-1.11.0.dist-info/entry_points.txt +4 -0
- agent_toolkit_cli-1.11.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""agent-toolkit CLI entrypoint — see docs/CLI_SURFACES.md."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import sys
|
|
7
|
+
|
|
8
|
+
CONSUMER_COMMANDS: tuple[str, ...] = (
|
|
9
|
+
"install",
|
|
10
|
+
"update",
|
|
11
|
+
"uninstall",
|
|
12
|
+
"doctor",
|
|
13
|
+
"diff",
|
|
14
|
+
"skills",
|
|
15
|
+
"mcp",
|
|
16
|
+
"plugin",
|
|
17
|
+
)
|
|
18
|
+
ADVANCED_COMMANDS: tuple[str, ...] = (
|
|
19
|
+
"loop",
|
|
20
|
+
"workspace",
|
|
21
|
+
"memory",
|
|
22
|
+
"project",
|
|
23
|
+
"devcompanion",
|
|
24
|
+
"dc",
|
|
25
|
+
"insights",
|
|
26
|
+
"build",
|
|
27
|
+
"inventory",
|
|
28
|
+
"matrix",
|
|
29
|
+
"release",
|
|
30
|
+
"swarm",
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
_CONSUMER_HELP = """\
|
|
34
|
+
agent-toolkit — Composable AI agent toolkit CLI
|
|
35
|
+
|
|
36
|
+
Usage:
|
|
37
|
+
agent-toolkit <command> [args...]
|
|
38
|
+
|
|
39
|
+
Consumer commands:
|
|
40
|
+
install Install profiles for detected AI tools
|
|
41
|
+
update Refresh installed profiles from latest toolkit data
|
|
42
|
+
uninstall Remove toolkit-owned files using install receipts
|
|
43
|
+
doctor Check system health and tool availability
|
|
44
|
+
diff Show changes vs currently installed plugin bundles
|
|
45
|
+
skills Skill management: sync, list, validate
|
|
46
|
+
mcp MCP provider management: setup, list, doctor
|
|
47
|
+
plugin Plugin bundle management: sync, check
|
|
48
|
+
|
|
49
|
+
Advanced commands (workstation / power-user — docs/CLI_SURFACES.md):
|
|
50
|
+
loop Loop engineering: init, run, status, audit, cost, schedule, sync
|
|
51
|
+
workspace Workspace scaffolding: init, context, sync
|
|
52
|
+
memory Knowledge base: add, search, inject, review, todo
|
|
53
|
+
project Project management: clone, list, add, remove, scan
|
|
54
|
+
devcompanion Background job queue: queue, run-once, status, done, sync-todos
|
|
55
|
+
insights AI tool usage insights: opencode, cursor, claude
|
|
56
|
+
build Compile canonical capabilities into target-native artifacts
|
|
57
|
+
inventory List all canonical skills, agents, and products
|
|
58
|
+
matrix Show platform capability matrix
|
|
59
|
+
release Generate release artifacts (maintainer)
|
|
60
|
+
swarm Multi-agent swarm orchestration (pair/team/full, Herdr/tmux)
|
|
61
|
+
|
|
62
|
+
Run 'agent-toolkit <command> --help' for details.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def main() -> None:
|
|
67
|
+
argv = sys.argv[1:]
|
|
68
|
+
if not argv or argv[0] in ("-h", "--help", "help"):
|
|
69
|
+
print(_CONSUMER_HELP)
|
|
70
|
+
sys.exit(0)
|
|
71
|
+
|
|
72
|
+
if argv[0] in ("-V", "--version", "version"):
|
|
73
|
+
from agent_toolkit import __version__
|
|
74
|
+
|
|
75
|
+
print(f"agent-toolkit {__version__}")
|
|
76
|
+
sys.exit(0)
|
|
77
|
+
|
|
78
|
+
command = argv[0]
|
|
79
|
+
rest = argv[1:]
|
|
80
|
+
|
|
81
|
+
match command:
|
|
82
|
+
case "release":
|
|
83
|
+
from agent_toolkit.cli.release import cmd_release
|
|
84
|
+
|
|
85
|
+
sys.exit(cmd_release(rest))
|
|
86
|
+
case "diff":
|
|
87
|
+
from agent_toolkit.cli.diff import cmd_diff
|
|
88
|
+
|
|
89
|
+
sys.exit(cmd_diff(rest))
|
|
90
|
+
case "build":
|
|
91
|
+
from agent_toolkit.cli.build import cmd_build
|
|
92
|
+
|
|
93
|
+
sys.exit(cmd_build(rest))
|
|
94
|
+
case "inventory":
|
|
95
|
+
from agent_toolkit.cli.build import cmd_inventory
|
|
96
|
+
|
|
97
|
+
sys.exit(cmd_inventory(rest))
|
|
98
|
+
case "matrix":
|
|
99
|
+
from agent_toolkit.cli.build import cmd_matrix
|
|
100
|
+
|
|
101
|
+
sys.exit(cmd_matrix(rest))
|
|
102
|
+
case "install":
|
|
103
|
+
from agent_toolkit.cli.install import cmd_install
|
|
104
|
+
|
|
105
|
+
sys.exit(cmd_install(rest))
|
|
106
|
+
case "update":
|
|
107
|
+
from agent_toolkit.cli.update import cmd_update
|
|
108
|
+
|
|
109
|
+
sys.exit(cmd_update(rest))
|
|
110
|
+
case "uninstall" | "rollback":
|
|
111
|
+
from agent_toolkit.cli.uninstall import cmd_uninstall
|
|
112
|
+
|
|
113
|
+
sys.exit(cmd_uninstall(rest))
|
|
114
|
+
case "doctor":
|
|
115
|
+
from agent_toolkit.cli.doctor import cmd_doctor
|
|
116
|
+
|
|
117
|
+
sys.exit(cmd_doctor(rest))
|
|
118
|
+
case "loop":
|
|
119
|
+
from agent_toolkit.loop import runner
|
|
120
|
+
|
|
121
|
+
sys.argv = ["agent-toolkit loop"] + rest
|
|
122
|
+
runner.main()
|
|
123
|
+
case "mcp":
|
|
124
|
+
from agent_toolkit.cli.mcp import cmd_mcp
|
|
125
|
+
|
|
126
|
+
sys.exit(cmd_mcp(rest))
|
|
127
|
+
case "skills":
|
|
128
|
+
from agent_toolkit.cli.skills import cmd_skills
|
|
129
|
+
|
|
130
|
+
sys.exit(cmd_skills(rest))
|
|
131
|
+
case "plugin":
|
|
132
|
+
from agent_toolkit.cli.plugin import cmd_plugin
|
|
133
|
+
|
|
134
|
+
sys.exit(cmd_plugin(rest))
|
|
135
|
+
case "workspace":
|
|
136
|
+
from agent_toolkit.cli.workspace import cmd_workspace
|
|
137
|
+
|
|
138
|
+
sys.exit(cmd_workspace(rest))
|
|
139
|
+
case "memory":
|
|
140
|
+
from agent_toolkit.cli.memory import cmd_memory
|
|
141
|
+
|
|
142
|
+
sys.exit(cmd_memory(rest))
|
|
143
|
+
case "project":
|
|
144
|
+
from agent_toolkit.cli.project import cmd_project
|
|
145
|
+
|
|
146
|
+
sys.exit(cmd_project(rest))
|
|
147
|
+
case "devcompanion" | "dc":
|
|
148
|
+
from agent_toolkit.cli.devcompanion import cmd_devcompanion
|
|
149
|
+
|
|
150
|
+
sys.exit(cmd_devcompanion(rest))
|
|
151
|
+
case "insights":
|
|
152
|
+
from agent_toolkit.cli.insights import cmd_insights
|
|
153
|
+
|
|
154
|
+
sys.exit(cmd_insights(rest))
|
|
155
|
+
case "swarm":
|
|
156
|
+
from agent_toolkit.swarm.cli import main as swarm_main
|
|
157
|
+
|
|
158
|
+
sys.exit(swarm_main(rest))
|
|
159
|
+
case _:
|
|
160
|
+
print(f"Unknown command: {command}", file=sys.stderr)
|
|
161
|
+
print("Run 'agent-toolkit help' for usage.", file=sys.stderr)
|
|
162
|
+
if command not in CONSUMER_COMMANDS and command not in ADVANCED_COMMANDS:
|
|
163
|
+
print(
|
|
164
|
+
"See docs/CLI_SURFACES.md for consumer vs advanced commands.",
|
|
165
|
+
file=sys.stderr,
|
|
166
|
+
)
|
|
167
|
+
sys.exit(1)
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
if __name__ == "__main__":
|
|
171
|
+
main()
|
agent_toolkit/cli/mcp.py
ADDED
|
@@ -0,0 +1,537 @@
|
|
|
1
|
+
"""
|
|
2
|
+
mcp — MCP (Model Context Protocol) provider management.
|
|
3
|
+
|
|
4
|
+
Usage:
|
|
5
|
+
agent-toolkit mcp <subcommand> [args]
|
|
6
|
+
|
|
7
|
+
Subcommands:
|
|
8
|
+
list List available MCP providers
|
|
9
|
+
setup <provider> Interactive wizard to configure a provider
|
|
10
|
+
health [provider] Validate registry entry and required env var names (no network)
|
|
11
|
+
doctor [provider] Check env vars and connectivity for provider(s)
|
|
12
|
+
uninstall <provider> Remove a provider from local MCP config
|
|
13
|
+
|
|
14
|
+
Options:
|
|
15
|
+
--offline Skip network connectivity checks (setup/doctor)
|
|
16
|
+
--help Show this help message
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
from __future__ import annotations
|
|
20
|
+
|
|
21
|
+
import json
|
|
22
|
+
import os
|
|
23
|
+
import re
|
|
24
|
+
import sys
|
|
25
|
+
import urllib.request
|
|
26
|
+
from datetime import datetime, timezone
|
|
27
|
+
from pathlib import Path
|
|
28
|
+
|
|
29
|
+
from agent_toolkit._paths import toolkit_root
|
|
30
|
+
|
|
31
|
+
# ---------------------------------------------------------------------------
|
|
32
|
+
# Toolkit directory & config paths
|
|
33
|
+
# ---------------------------------------------------------------------------
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def _mcp_config_path() -> Path:
|
|
37
|
+
return Path.home() / ".config" / "agent-toolkit" / "mcp-config.json"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _templates_dir(toolkit_dir: Path) -> Path:
|
|
41
|
+
return toolkit_dir / "mcp" / "templates"
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _registry_dir(toolkit_dir: Path) -> Path:
|
|
45
|
+
return toolkit_dir / "mcp" / "registry"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def _load_registry_provider(toolkit_dir: Path, provider: str):
|
|
49
|
+
"""Load provider metadata from mcp/registry/<provider>.yaml."""
|
|
50
|
+
from agent_toolkit.compiler.mcp_registry import load_registry
|
|
51
|
+
|
|
52
|
+
registry, _errors = load_registry(_registry_dir(toolkit_dir))
|
|
53
|
+
return registry.get(provider)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _registry_env_vars(toolkit_dir: Path, provider: str) -> list[str]:
|
|
57
|
+
entry = _load_registry_provider(toolkit_dir, provider)
|
|
58
|
+
if entry is None:
|
|
59
|
+
template = _load_template(_templates_dir(toolkit_dir), provider)
|
|
60
|
+
return _extract_env_vars(template) if template else []
|
|
61
|
+
return list(entry.env_vars)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _list_known_providers(toolkit_dir: Path) -> list[str]:
|
|
65
|
+
reg_dir = _registry_dir(toolkit_dir)
|
|
66
|
+
names = {p.stem for p in reg_dir.glob("*.yaml")} if reg_dir.is_dir() else set()
|
|
67
|
+
tdir = _templates_dir(toolkit_dir)
|
|
68
|
+
if tdir.is_dir():
|
|
69
|
+
names.update(p.name for p in tdir.iterdir() if p.is_dir())
|
|
70
|
+
return sorted(names)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
# ---------------------------------------------------------------------------
|
|
74
|
+
# Config I/O
|
|
75
|
+
# ---------------------------------------------------------------------------
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def _load_config() -> dict:
|
|
79
|
+
path = _mcp_config_path()
|
|
80
|
+
if not path.exists():
|
|
81
|
+
return {"providers": {}}
|
|
82
|
+
try:
|
|
83
|
+
return json.loads(path.read_text())
|
|
84
|
+
except (json.JSONDecodeError, OSError):
|
|
85
|
+
return {"providers": {}}
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def _save_config(cfg: dict) -> None:
|
|
89
|
+
path = _mcp_config_path()
|
|
90
|
+
try:
|
|
91
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
92
|
+
path.write_text(json.dumps(cfg, indent=2) + "\n")
|
|
93
|
+
except (PermissionError, OSError) as exc:
|
|
94
|
+
print(f" ✗ Failed to save config: {exc}", file=sys.stderr)
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
# ---------------------------------------------------------------------------
|
|
98
|
+
# Template parsing
|
|
99
|
+
# ---------------------------------------------------------------------------
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
def _extract_env_vars(template: dict) -> list[str]:
|
|
103
|
+
"""Extract ${ENV_VAR} names from all string values in a dict (recursive)."""
|
|
104
|
+
pattern = re.compile(r"\$\{([A-Za-z_][A-Za-z0-9_]*)\}")
|
|
105
|
+
found: list[str] = []
|
|
106
|
+
|
|
107
|
+
def _walk(obj: object) -> None:
|
|
108
|
+
if isinstance(obj, str):
|
|
109
|
+
for m in pattern.finditer(obj):
|
|
110
|
+
name = m.group(1)
|
|
111
|
+
if name not in found:
|
|
112
|
+
found.append(name)
|
|
113
|
+
elif isinstance(obj, dict):
|
|
114
|
+
for v in obj.values():
|
|
115
|
+
_walk(v)
|
|
116
|
+
elif isinstance(obj, list):
|
|
117
|
+
for item in obj:
|
|
118
|
+
_walk(item)
|
|
119
|
+
|
|
120
|
+
_walk(template)
|
|
121
|
+
return found
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def _load_template(templates_dir: Path, provider: str) -> dict | None:
|
|
125
|
+
"""Load and parse a provider's config.template.json."""
|
|
126
|
+
template_file = templates_dir / provider / "config.template.json"
|
|
127
|
+
if not template_file.exists():
|
|
128
|
+
return None
|
|
129
|
+
try:
|
|
130
|
+
return json.loads(template_file.read_text())
|
|
131
|
+
except (json.JSONDecodeError, OSError) as exc:
|
|
132
|
+
print(f" ✗ Cannot read template {template_file}: {exc}", file=sys.stderr)
|
|
133
|
+
return None
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
def _load_readme(templates_dir: Path, provider: str) -> str:
|
|
137
|
+
readme = templates_dir / provider / "README.md"
|
|
138
|
+
if readme.exists():
|
|
139
|
+
try:
|
|
140
|
+
return readme.read_text().strip()
|
|
141
|
+
except OSError:
|
|
142
|
+
pass
|
|
143
|
+
return ""
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
# ---------------------------------------------------------------------------
|
|
147
|
+
# Connectivity tests
|
|
148
|
+
# ---------------------------------------------------------------------------
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def _test_github(token: str) -> tuple[bool, str]:
|
|
152
|
+
try:
|
|
153
|
+
req = urllib.request.Request("https://api.github.com/user")
|
|
154
|
+
req.add_header("Authorization", f"Bearer {token}")
|
|
155
|
+
req.add_header("User-Agent", "agent-toolkit-mcp/1")
|
|
156
|
+
with urllib.request.urlopen(req, timeout=8) as resp:
|
|
157
|
+
data = json.loads(resp.read())
|
|
158
|
+
return True, f"Authenticated as: {data.get('login', 'unknown')}"
|
|
159
|
+
except urllib.error.HTTPError as exc:
|
|
160
|
+
return False, f"HTTP {exc.code}: {exc.reason}"
|
|
161
|
+
except Exception as exc:
|
|
162
|
+
return False, str(exc)
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
def _test_connectivity(provider: str, env_vals: dict[str, str]) -> tuple[bool, str]:
|
|
166
|
+
"""Run a lightweight connectivity test if we know how for this provider."""
|
|
167
|
+
if provider == "github":
|
|
168
|
+
token = env_vals.get("GITHUB_TOKEN", "")
|
|
169
|
+
if token:
|
|
170
|
+
return _test_github(token)
|
|
171
|
+
return False, "GITHUB_TOKEN not provided"
|
|
172
|
+
# For other providers we just confirm env vars are set
|
|
173
|
+
return True, "env vars provided (connectivity test not available for this provider)"
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
# ---------------------------------------------------------------------------
|
|
177
|
+
# Subcommands
|
|
178
|
+
# ---------------------------------------------------------------------------
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
def _cmd_list(toolkit_dir: Path | None) -> int:
|
|
182
|
+
"""List available MCP providers from mcp/templates/."""
|
|
183
|
+
if toolkit_dir is None:
|
|
184
|
+
print(" ✗ Cannot locate toolkit directory", file=sys.stderr)
|
|
185
|
+
return 1
|
|
186
|
+
|
|
187
|
+
tdir = _templates_dir(toolkit_dir)
|
|
188
|
+
if not tdir.is_dir():
|
|
189
|
+
print(f" ✗ MCP templates directory not found: {tdir}", file=sys.stderr)
|
|
190
|
+
return 1
|
|
191
|
+
|
|
192
|
+
providers = sorted(p.name for p in tdir.iterdir() if p.is_dir())
|
|
193
|
+
if not providers:
|
|
194
|
+
print(" ⚠ No MCP provider templates found")
|
|
195
|
+
return 0
|
|
196
|
+
|
|
197
|
+
cfg = _load_config()
|
|
198
|
+
configured = cfg.get("providers", {})
|
|
199
|
+
|
|
200
|
+
print()
|
|
201
|
+
print("Available MCP providers")
|
|
202
|
+
print()
|
|
203
|
+
col_name = max(len(p) for p in providers) + 2
|
|
204
|
+
|
|
205
|
+
header = f" {'Provider':<{col_name}} {'Status':<12} Required env vars"
|
|
206
|
+
print(header)
|
|
207
|
+
print(" " + "-" * (len(header) - 2))
|
|
208
|
+
|
|
209
|
+
for provider in providers:
|
|
210
|
+
template = _load_template(tdir, provider)
|
|
211
|
+
env_vars = _extract_env_vars(template) if template else []
|
|
212
|
+
env_str = ", ".join(env_vars) if env_vars else "(none)"
|
|
213
|
+
|
|
214
|
+
prov_cfg = configured.get(provider, {})
|
|
215
|
+
if prov_cfg.get("enabled"):
|
|
216
|
+
status = "✓ configured"
|
|
217
|
+
elif prov_cfg:
|
|
218
|
+
status = "- disabled"
|
|
219
|
+
else:
|
|
220
|
+
status = " not setup"
|
|
221
|
+
|
|
222
|
+
print(f" {provider:<{col_name}} {status:<12} {env_str}")
|
|
223
|
+
|
|
224
|
+
print()
|
|
225
|
+
print("Run: agent-toolkit mcp setup <provider>")
|
|
226
|
+
print()
|
|
227
|
+
return 0
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def _cmd_setup(provider: str, toolkit_dir: Path | None, *, offline: bool = False) -> int:
|
|
231
|
+
"""Interactive wizard to configure an MCP provider."""
|
|
232
|
+
if toolkit_dir is None:
|
|
233
|
+
print(" ✗ Cannot locate toolkit directory", file=sys.stderr)
|
|
234
|
+
return 1
|
|
235
|
+
|
|
236
|
+
tdir = _templates_dir(toolkit_dir)
|
|
237
|
+
template = _load_template(tdir, provider)
|
|
238
|
+
entry = _load_registry_provider(toolkit_dir, provider)
|
|
239
|
+
if entry is None and template is None:
|
|
240
|
+
providers = _list_known_providers(toolkit_dir)
|
|
241
|
+
print(f" ✗ Provider '{provider}' not found.", file=sys.stderr)
|
|
242
|
+
if providers:
|
|
243
|
+
print(f" Available: {', '.join(providers)}", file=sys.stderr)
|
|
244
|
+
return 1
|
|
245
|
+
|
|
246
|
+
env_vars = _registry_env_vars(toolkit_dir, provider)
|
|
247
|
+
if not env_vars and template is not None:
|
|
248
|
+
env_vars = _extract_env_vars(template)
|
|
249
|
+
readme = _load_readme(tdir, provider)
|
|
250
|
+
|
|
251
|
+
print()
|
|
252
|
+
print(f"MCP setup: {provider}")
|
|
253
|
+
print()
|
|
254
|
+
|
|
255
|
+
if readme:
|
|
256
|
+
# Print the first paragraph of the README as a hint
|
|
257
|
+
first_para = readme.split("\n\n")[0]
|
|
258
|
+
for line in first_para.splitlines():
|
|
259
|
+
print(f" {line}")
|
|
260
|
+
print()
|
|
261
|
+
|
|
262
|
+
if not env_vars:
|
|
263
|
+
print(" ⚠ No environment variables required for this provider.")
|
|
264
|
+
else:
|
|
265
|
+
print(f" Required env vars: {', '.join(env_vars)}")
|
|
266
|
+
print()
|
|
267
|
+
|
|
268
|
+
# Collect env var values
|
|
269
|
+
import getpass
|
|
270
|
+
|
|
271
|
+
env_vals: dict[str, str] = {}
|
|
272
|
+
token_words = ("TOKEN", "KEY", "SECRET", "PASSWORD", "PASS")
|
|
273
|
+
|
|
274
|
+
for var in env_vars:
|
|
275
|
+
current = os.environ.get(var, "")
|
|
276
|
+
is_sensitive = any(w in var.upper() for w in token_words)
|
|
277
|
+
|
|
278
|
+
if current:
|
|
279
|
+
hint = "[already set in env"
|
|
280
|
+
if is_sensitive:
|
|
281
|
+
hint += ", press Enter to keep]"
|
|
282
|
+
else:
|
|
283
|
+
hint += f" = {current!r}, press Enter to keep]"
|
|
284
|
+
else:
|
|
285
|
+
hint = "[required]"
|
|
286
|
+
|
|
287
|
+
prompt = f" {var} {hint}: "
|
|
288
|
+
|
|
289
|
+
try:
|
|
290
|
+
if is_sensitive:
|
|
291
|
+
value = getpass.getpass(prompt) or current
|
|
292
|
+
else:
|
|
293
|
+
value = input(prompt).strip() or current
|
|
294
|
+
except (EOFError, KeyboardInterrupt):
|
|
295
|
+
print()
|
|
296
|
+
print(" ⚠ Setup cancelled")
|
|
297
|
+
return 1
|
|
298
|
+
|
|
299
|
+
env_vals[var] = value
|
|
300
|
+
|
|
301
|
+
# Validate / test connectivity
|
|
302
|
+
print()
|
|
303
|
+
if offline:
|
|
304
|
+
print(" ✓ Offline mode — skipping connectivity check")
|
|
305
|
+
ok, detail = True, "registry and env var names validated"
|
|
306
|
+
else:
|
|
307
|
+
print(" Testing connectivity...")
|
|
308
|
+
ok, detail = _test_connectivity(provider, env_vals)
|
|
309
|
+
if ok:
|
|
310
|
+
print(f" ✓ {detail}")
|
|
311
|
+
else:
|
|
312
|
+
print(f" ⚠ Connectivity check failed: {detail}")
|
|
313
|
+
if not offline:
|
|
314
|
+
print(" Saving configuration anyway — double-check your credentials.")
|
|
315
|
+
|
|
316
|
+
# Save config: store env var names (not plaintext values)
|
|
317
|
+
cfg = _load_config()
|
|
318
|
+
cfg.setdefault("providers", {})[provider] = {
|
|
319
|
+
"enabled": True,
|
|
320
|
+
"required_env": env_vars,
|
|
321
|
+
"validated_at": datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ"),
|
|
322
|
+
}
|
|
323
|
+
_save_config(cfg)
|
|
324
|
+
print(f" ✓ Saved to {_mcp_config_path()}")
|
|
325
|
+
print()
|
|
326
|
+
|
|
327
|
+
# Next steps per tool
|
|
328
|
+
print("── Next steps ──")
|
|
329
|
+
print()
|
|
330
|
+
print(" Export env vars in your shell profile (e.g. ~/.zshrc / ~/.bashrc):")
|
|
331
|
+
print()
|
|
332
|
+
for var in env_vars:
|
|
333
|
+
print(f' export {var}="<your-value>"')
|
|
334
|
+
print()
|
|
335
|
+
print(" Then configure each AI tool:")
|
|
336
|
+
print(" Claude Code → add MCP server to ~/.claude/settings.json")
|
|
337
|
+
print(" Cursor → add MCP server in Cursor Settings → MCP")
|
|
338
|
+
print(" OpenCode → add entry to ~/.config/opencode/opencode.json")
|
|
339
|
+
print()
|
|
340
|
+
print(f" See: mcp/templates/{provider}/README.md for full instructions")
|
|
341
|
+
print()
|
|
342
|
+
return 0
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
def _cmd_doctor_provider(provider: str, toolkit_dir: Path | None) -> tuple[int, int, int]:
|
|
346
|
+
"""Check a single provider. Returns (ok, warn, err) counts."""
|
|
347
|
+
n_ok = n_warn = n_err = 0
|
|
348
|
+
|
|
349
|
+
if toolkit_dir:
|
|
350
|
+
tdir = _templates_dir(toolkit_dir)
|
|
351
|
+
template = _load_template(tdir, provider)
|
|
352
|
+
env_vars = _extract_env_vars(template) if template else []
|
|
353
|
+
else:
|
|
354
|
+
env_vars = []
|
|
355
|
+
|
|
356
|
+
cfg = _load_config()
|
|
357
|
+
prov_cfg = cfg.get("providers", {}).get(provider, {})
|
|
358
|
+
if not prov_cfg:
|
|
359
|
+
print(f" ⚠ {provider}: not configured (run: agent-toolkit mcp setup {provider})")
|
|
360
|
+
n_warn += 1
|
|
361
|
+
else:
|
|
362
|
+
enabled = prov_cfg.get("enabled", False)
|
|
363
|
+
validated = prov_cfg.get("validated_at", "never")
|
|
364
|
+
icon = "✓" if enabled else "⚠"
|
|
365
|
+
print(f" {icon} {provider}: enabled={enabled}, validated_at={validated}")
|
|
366
|
+
if enabled:
|
|
367
|
+
n_ok += 1
|
|
368
|
+
else:
|
|
369
|
+
n_warn += 1
|
|
370
|
+
|
|
371
|
+
# Check env vars
|
|
372
|
+
for var in env_vars:
|
|
373
|
+
if os.environ.get(var):
|
|
374
|
+
print(f" ✓ {var}: set")
|
|
375
|
+
n_ok += 1
|
|
376
|
+
else:
|
|
377
|
+
print(f" ✗ {var}: not set in environment")
|
|
378
|
+
n_err += 1
|
|
379
|
+
|
|
380
|
+
# Connectivity test
|
|
381
|
+
env_vals = {v: os.environ.get(v, "") for v in env_vars}
|
|
382
|
+
if all(env_vals.values()):
|
|
383
|
+
ok, detail = _test_connectivity(provider, env_vals)
|
|
384
|
+
if ok:
|
|
385
|
+
print(f" ✓ connectivity: {detail}")
|
|
386
|
+
n_ok += 1
|
|
387
|
+
else:
|
|
388
|
+
print(f" ⚠ connectivity: {detail}")
|
|
389
|
+
n_warn += 1
|
|
390
|
+
|
|
391
|
+
return n_ok, n_warn, n_err
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
def _cmd_doctor(providers_arg: list[str], toolkit_dir: Path | None) -> int:
|
|
395
|
+
"""Check MCP provider configuration and connectivity."""
|
|
396
|
+
cfg = _load_config()
|
|
397
|
+
configured_providers = list(cfg.get("providers", {}).keys())
|
|
398
|
+
|
|
399
|
+
if providers_arg:
|
|
400
|
+
targets = providers_arg
|
|
401
|
+
elif configured_providers:
|
|
402
|
+
targets = configured_providers
|
|
403
|
+
else:
|
|
404
|
+
print(" ⚠ No MCP providers configured. Run: agent-toolkit mcp list")
|
|
405
|
+
return 0
|
|
406
|
+
|
|
407
|
+
print()
|
|
408
|
+
print("MCP doctor")
|
|
409
|
+
|
|
410
|
+
total_ok = total_warn = total_err = 0
|
|
411
|
+
for provider in targets:
|
|
412
|
+
print(f"\n── {provider} ──")
|
|
413
|
+
n_ok, n_warn, n_err = _cmd_doctor_provider(provider, toolkit_dir)
|
|
414
|
+
total_ok += n_ok
|
|
415
|
+
total_warn += n_warn
|
|
416
|
+
total_err += n_err
|
|
417
|
+
|
|
418
|
+
print()
|
|
419
|
+
print(f"── Summary: {total_ok} ok, {total_warn} warnings, {total_err} errors ──")
|
|
420
|
+
print()
|
|
421
|
+
return 1 if total_err else 0
|
|
422
|
+
|
|
423
|
+
|
|
424
|
+
def _cmd_health(providers_arg: list[str], toolkit_dir: Path | None) -> int:
|
|
425
|
+
"""Validate registry metadata and env var names without network calls."""
|
|
426
|
+
if toolkit_dir is None:
|
|
427
|
+
print(" ✗ Cannot locate toolkit directory", file=sys.stderr)
|
|
428
|
+
return 1
|
|
429
|
+
|
|
430
|
+
targets = providers_arg or _list_known_providers(toolkit_dir)
|
|
431
|
+
if not targets:
|
|
432
|
+
print(" ⚠ No MCP providers found in registry or templates")
|
|
433
|
+
return 0
|
|
434
|
+
|
|
435
|
+
print()
|
|
436
|
+
print("MCP health (offline)")
|
|
437
|
+
errors = 0
|
|
438
|
+
for provider in targets:
|
|
439
|
+
print(f"\n── {provider} ──")
|
|
440
|
+
entry = _load_registry_provider(toolkit_dir, provider)
|
|
441
|
+
if entry is None:
|
|
442
|
+
print(" ✗ Not in mcp/registry/ and no template directory")
|
|
443
|
+
errors += 1
|
|
444
|
+
continue
|
|
445
|
+
print(f" ✓ registry: {entry.display_name} ({entry.id})")
|
|
446
|
+
if entry.package:
|
|
447
|
+
print(f" ✓ package: {entry.package}")
|
|
448
|
+
env_vars = entry.env_vars
|
|
449
|
+
if env_vars:
|
|
450
|
+
print(f" ✓ required env: {', '.join(env_vars)}")
|
|
451
|
+
for var in env_vars:
|
|
452
|
+
if os.environ.get(var):
|
|
453
|
+
print(f" ✓ {var}: set")
|
|
454
|
+
else:
|
|
455
|
+
print(f" - {var}: not set (expected until configured)")
|
|
456
|
+
else:
|
|
457
|
+
print(" ✓ required env: (none)")
|
|
458
|
+
|
|
459
|
+
print()
|
|
460
|
+
return 1 if errors else 0
|
|
461
|
+
|
|
462
|
+
|
|
463
|
+
def _cmd_uninstall(provider: str) -> int:
|
|
464
|
+
"""Remove a provider from the local MCP config file."""
|
|
465
|
+
cfg = _load_config()
|
|
466
|
+
providers = cfg.get("providers", {})
|
|
467
|
+
if provider not in providers:
|
|
468
|
+
print(f" ⚠ Provider '{provider}' is not configured")
|
|
469
|
+
return 0
|
|
470
|
+
del providers[provider]
|
|
471
|
+
cfg["providers"] = providers
|
|
472
|
+
_save_config(cfg)
|
|
473
|
+
print(f" ✓ Removed '{provider}' from {_mcp_config_path()}")
|
|
474
|
+
return 0
|
|
475
|
+
|
|
476
|
+
|
|
477
|
+
# ---------------------------------------------------------------------------
|
|
478
|
+
# Argument parsing & dispatch
|
|
479
|
+
# ---------------------------------------------------------------------------
|
|
480
|
+
|
|
481
|
+
|
|
482
|
+
def _pop_offline_flag(args: list[str]) -> tuple[list[str], bool]:
|
|
483
|
+
rest: list[str] = []
|
|
484
|
+
offline = False
|
|
485
|
+
for arg in args:
|
|
486
|
+
if arg == "--offline":
|
|
487
|
+
offline = True
|
|
488
|
+
else:
|
|
489
|
+
rest.append(arg)
|
|
490
|
+
return rest, offline
|
|
491
|
+
|
|
492
|
+
|
|
493
|
+
def cmd_mcp(args: list[str]) -> int:
|
|
494
|
+
"""MCP provider management entry point.
|
|
495
|
+
|
|
496
|
+
Returns 0 on success, 1 on failure.
|
|
497
|
+
"""
|
|
498
|
+
if not args or args[0] in ("-h", "--help"):
|
|
499
|
+
print(__doc__)
|
|
500
|
+
return 0
|
|
501
|
+
|
|
502
|
+
toolkit_dir = toolkit_root()
|
|
503
|
+
rest, offline = _pop_offline_flag(args)
|
|
504
|
+
if not rest or rest[0] in ("-h", "--help"):
|
|
505
|
+
print(__doc__)
|
|
506
|
+
return 0
|
|
507
|
+
|
|
508
|
+
subcommand = rest[0]
|
|
509
|
+
subargs = rest[1:]
|
|
510
|
+
|
|
511
|
+
if subcommand == "list":
|
|
512
|
+
return _cmd_list(toolkit_dir)
|
|
513
|
+
|
|
514
|
+
elif subcommand == "setup":
|
|
515
|
+
if not subargs:
|
|
516
|
+
print(" ✗ Usage: agent-toolkit mcp setup <provider>", file=sys.stderr)
|
|
517
|
+
return 1
|
|
518
|
+
return _cmd_setup(subargs[0], toolkit_dir, offline=offline)
|
|
519
|
+
|
|
520
|
+
elif subcommand == "health":
|
|
521
|
+
return _cmd_health(subargs, toolkit_dir)
|
|
522
|
+
|
|
523
|
+
elif subcommand == "doctor":
|
|
524
|
+
if offline:
|
|
525
|
+
return _cmd_health(subargs, toolkit_dir)
|
|
526
|
+
return _cmd_doctor(subargs, toolkit_dir)
|
|
527
|
+
|
|
528
|
+
elif subcommand == "uninstall":
|
|
529
|
+
if not subargs:
|
|
530
|
+
print(" ✗ Usage: agent-toolkit mcp uninstall <provider>", file=sys.stderr)
|
|
531
|
+
return 1
|
|
532
|
+
return _cmd_uninstall(subargs[0])
|
|
533
|
+
|
|
534
|
+
else:
|
|
535
|
+
print(f" ✗ Unknown subcommand: {subcommand}", file=sys.stderr)
|
|
536
|
+
print(" Valid subcommands: list, setup, health, doctor, uninstall", file=sys.stderr)
|
|
537
|
+
return 1
|