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.
Files changed (438) hide show
  1. agent_toolkit/__init__.py +4 -0
  2. agent_toolkit/__main__.py +5 -0
  3. agent_toolkit/_paths.py +145 -0
  4. agent_toolkit/bin/.gitkeep +0 -0
  5. agent_toolkit/bin/agent-toolkit.exe +0 -0
  6. agent_toolkit/cli/__init__.py +0 -0
  7. agent_toolkit/cli/__main__.py +5 -0
  8. agent_toolkit/cli/build.py +278 -0
  9. agent_toolkit/cli/completion.py +297 -0
  10. agent_toolkit/cli/context_budget.py +455 -0
  11. agent_toolkit/cli/devcompanion.py +923 -0
  12. agent_toolkit/cli/devcompanion_queue.py +235 -0
  13. agent_toolkit/cli/diff.py +176 -0
  14. agent_toolkit/cli/doctor.py +1052 -0
  15. agent_toolkit/cli/insights.py +771 -0
  16. agent_toolkit/cli/install.py +706 -0
  17. agent_toolkit/cli/main.py +171 -0
  18. agent_toolkit/cli/mcp.py +537 -0
  19. agent_toolkit/cli/memory.py +739 -0
  20. agent_toolkit/cli/plugin.py +224 -0
  21. agent_toolkit/cli/project.py +459 -0
  22. agent_toolkit/cli/release.py +178 -0
  23. agent_toolkit/cli/skills.py +461 -0
  24. agent_toolkit/cli/uninstall.py +166 -0
  25. agent_toolkit/cli/update.py +298 -0
  26. agent_toolkit/cli/workspace.py +1713 -0
  27. agent_toolkit/compiler/hook_registry.py +110 -0
  28. agent_toolkit/compiler/loader.py +338 -0
  29. agent_toolkit/compiler/mcp_registry.py +87 -0
  30. agent_toolkit/compiler/model.py +182 -0
  31. agent_toolkit/compiler/provenance.py +140 -0
  32. agent_toolkit/compiler/registry_emit.py +263 -0
  33. agent_toolkit/compiler/target_registry.py +122 -0
  34. agent_toolkit/compiler/targets/__init__.py +1 -0
  35. agent_toolkit/compiler/targets/agent_plugins.py +160 -0
  36. agent_toolkit/compiler/targets/base.py +229 -0
  37. agent_toolkit/compiler/targets/claude_code.py +241 -0
  38. agent_toolkit/compiler/targets/codex.py +261 -0
  39. agent_toolkit/compiler/targets/copilot.py +275 -0
  40. agent_toolkit/compiler/targets/cursor.py +207 -0
  41. agent_toolkit/compiler/targets/gemini_cli.py +213 -0
  42. agent_toolkit/compiler/targets/muse_code.py +113 -0
  43. agent_toolkit/compiler/targets/opencode.py +204 -0
  44. agent_toolkit/compiler/targets/pi.py +263 -0
  45. agent_toolkit/compiler/targets/windsurf.py +267 -0
  46. agent_toolkit/compiler/tool_mapping.py +83 -0
  47. agent_toolkit/data/.gitignore +4 -0
  48. agent_toolkit/data/__init__.py +1 -0
  49. agent_toolkit/data/agents/agentic-security-reviewer/AGENT.md +60 -0
  50. agent_toolkit/data/agents/architect/AGENT.md +30 -0
  51. agent_toolkit/data/agents/assistant/AGENT.md +59 -0
  52. agent_toolkit/data/agents/build-error-resolver/AGENT.md +30 -0
  53. agent_toolkit/data/agents/client-workflow-bootstrap/AGENT.md +60 -0
  54. agent_toolkit/data/agents/code-reviewer/AGENT.md +49 -0
  55. agent_toolkit/data/agents/database-reviewer/AGENT.md +44 -0
  56. agent_toolkit/data/agents/docs-lookup/AGENT.md +28 -0
  57. agent_toolkit/data/agents/e2e-runner/AGENT.md +38 -0
  58. agent_toolkit/data/agents/performance-optimizer/AGENT.md +52 -0
  59. agent_toolkit/data/agents/planner/AGENT.md +41 -0
  60. agent_toolkit/data/agents/refactor-cleaner/AGENT.md +43 -0
  61. agent_toolkit/data/agents/reference-lookup/AGENT.md +33 -0
  62. agent_toolkit/data/agents/security-reviewer/AGENT.md +47 -0
  63. agent_toolkit/data/agents/tdd-guide/AGENT.md +58 -0
  64. agent_toolkit/data/agents/tech-assistant/AGENT.md +11 -0
  65. agent_toolkit/data/agents/typescript-reviewer/AGENT.md +61 -0
  66. agent_toolkit/data/capabilities/hooks/README.md +6 -0
  67. agent_toolkit/data/capabilities/hooks/pre-commit-validate.yaml +26 -0
  68. agent_toolkit/data/capabilities/hooks/scripts/pre-commit-validate.sh +41 -0
  69. agent_toolkit/data/capabilities/hooks/scripts/session-start-context.sh +11 -0
  70. agent_toolkit/data/capabilities/hooks/session-start-context.yaml +23 -0
  71. agent_toolkit/data/capabilities/targets/registry.yaml +90 -0
  72. agent_toolkit/data/capabilities/upstream.lock +118 -0
  73. agent_toolkit/data/catalogs/agent-catalog.yaml +81 -0
  74. agent_toolkit/data/catalogs/loop-catalog.yaml +55 -0
  75. agent_toolkit/data/catalogs/skill-catalog.yaml +520 -0
  76. agent_toolkit/data/catalogs/skills-layout.json +391 -0
  77. agent_toolkit/data/distributions/products.yaml +190 -0
  78. agent_toolkit/data/distributions/targets/claude-code.yaml +47 -0
  79. agent_toolkit/data/distributions/targets/cursor.yaml +42 -0
  80. agent_toolkit/data/distributions/targets/opencode.yaml +55 -0
  81. agent_toolkit/data/loops/changelog-drafter/loop.yaml +40 -0
  82. agent_toolkit/data/loops/ci-sweeper/loop.yaml +53 -0
  83. agent_toolkit/data/loops/daily-triage/loop.yaml +47 -0
  84. agent_toolkit/data/loops/dep-sweeper/loop.yaml +46 -0
  85. agent_toolkit/data/loops/issue-triage/loop.yaml +40 -0
  86. agent_toolkit/data/loops/oss-daily-briefing/loop.yaml +65 -0
  87. agent_toolkit/data/loops/oss-pr-monitor/loop.yaml +86 -0
  88. agent_toolkit/data/loops/oss-triage/loop.yaml +67 -0
  89. agent_toolkit/data/loops/post-merge-cleanup/loop.yaml +44 -0
  90. agent_toolkit/data/loops/pr-babysitter/loop.yaml +46 -0
  91. agent_toolkit/data/mcp/registry/chrome-devtools.yaml +61 -0
  92. agent_toolkit/data/mcp/registry/clickup.yaml +48 -0
  93. agent_toolkit/data/mcp/registry/figma.yaml +44 -0
  94. agent_toolkit/data/mcp/registry/github.yaml +52 -0
  95. agent_toolkit/data/mcp/registry/linear.yaml +47 -0
  96. agent_toolkit/data/mcp/registry/notion.yaml +48 -0
  97. agent_toolkit/data/mcp/registry/slack.yaml +46 -0
  98. agent_toolkit/data/mcp/templates/chrome-devtools/README.md +57 -0
  99. agent_toolkit/data/mcp/templates/chrome-devtools/config.template.json +6 -0
  100. agent_toolkit/data/mcp/templates/clickup/README.md +45 -0
  101. agent_toolkit/data/mcp/templates/clickup/config.template.json +8 -0
  102. agent_toolkit/data/mcp/templates/clickup/wrapper.sh +23 -0
  103. agent_toolkit/data/mcp/templates/figma/README.md +54 -0
  104. agent_toolkit/data/mcp/templates/figma/config.template.json +9 -0
  105. agent_toolkit/data/mcp/templates/github/README.md +16 -0
  106. agent_toolkit/data/mcp/templates/github/config.template.json +15 -0
  107. agent_toolkit/data/mcp/templates/github/wrapper.sh +6 -0
  108. agent_toolkit/data/mcp/templates/linear/README.md +49 -0
  109. agent_toolkit/data/mcp/templates/linear/config.template.json +10 -0
  110. agent_toolkit/data/mcp/templates/notion/README.md +7 -0
  111. agent_toolkit/data/mcp/templates/notion/config.template.json +8 -0
  112. agent_toolkit/data/mcp/templates/notion/wrapper.sh +23 -0
  113. agent_toolkit/data/mcp/templates/slack/README.md +8 -0
  114. agent_toolkit/data/mcp/templates/slack/config.template.json +9 -0
  115. agent_toolkit/data/mcp/templates/slack/wrapper.sh +23 -0
  116. agent_toolkit/data/packs/README.md +66 -0
  117. agent_toolkit/data/packs/agentic-security/README.md +19 -0
  118. agent_toolkit/data/packs/agentic-security/config.yaml +25 -0
  119. agent_toolkit/data/packs/architecture/README.md +22 -0
  120. agent_toolkit/data/packs/architecture/config.yaml +27 -0
  121. agent_toolkit/data/packs/code-quality/README.md +19 -0
  122. agent_toolkit/data/packs/code-quality/config.yaml +21 -0
  123. agent_toolkit/data/packs/delivery-discipline/README.md +19 -0
  124. agent_toolkit/data/packs/delivery-discipline/config.yaml +42 -0
  125. agent_toolkit/data/packs/design-engineering/README.md +19 -0
  126. agent_toolkit/data/packs/design-engineering/config.yaml +41 -0
  127. agent_toolkit/data/packs/engineering-workflow/README.md +21 -0
  128. agent_toolkit/data/packs/engineering-workflow/config.yaml +57 -0
  129. agent_toolkit/data/packs/oss-maintenance/README.md +245 -0
  130. agent_toolkit/data/packs/oss-maintenance/config.yaml +75 -0
  131. agent_toolkit/data/profiles/claude-code/CLAUDE.md +110 -0
  132. agent_toolkit/data/profiles/claude-code/agents/assistant.md +59 -0
  133. agent_toolkit/data/profiles/claude-code/agents/build-error-resolver.md +30 -0
  134. agent_toolkit/data/profiles/claude-code/agents/client-workflow-bootstrap.md +60 -0
  135. agent_toolkit/data/profiles/claude-code/agents/contribution-planner.md +39 -0
  136. agent_toolkit/data/profiles/claude-code/agents/database-reviewer.md +44 -0
  137. agent_toolkit/data/profiles/claude-code/agents/docs-lookup.md +28 -0
  138. agent_toolkit/data/profiles/claude-code/agents/e2e-runner.md +38 -0
  139. agent_toolkit/data/profiles/claude-code/agents/performance-optimizer.md +52 -0
  140. agent_toolkit/data/profiles/claude-code/agents/planner.md +41 -0
  141. agent_toolkit/data/profiles/claude-code/agents/refactor-cleaner.md +43 -0
  142. agent_toolkit/data/profiles/claude-code/agents/reference-lookup.md +33 -0
  143. agent_toolkit/data/profiles/claude-code/agents/security-reviewer.md +47 -0
  144. agent_toolkit/data/profiles/claude-code/agents/tdd-guide.md +58 -0
  145. agent_toolkit/data/profiles/claude-code/agents/typescript-reviewer.md +61 -0
  146. agent_toolkit/data/profiles/claude-code/settings.json +86 -0
  147. agent_toolkit/data/profiles/copilot/copilot-instructions.md +15 -0
  148. agent_toolkit/data/profiles/cursor/README.md +33 -0
  149. agent_toolkit/data/profiles/cursor/rules/architect.mdc +23 -0
  150. agent_toolkit/data/profiles/cursor/rules/assistant.mdc +61 -0
  151. agent_toolkit/data/profiles/cursor/rules/build-error-resolver.mdc +20 -0
  152. agent_toolkit/data/profiles/cursor/rules/code-reviewer.mdc +21 -0
  153. agent_toolkit/data/profiles/cursor/rules/database-reviewer.mdc +29 -0
  154. agent_toolkit/data/profiles/cursor/rules/docs-lookup.mdc +15 -0
  155. agent_toolkit/data/profiles/cursor/rules/e2e-runner.mdc +30 -0
  156. agent_toolkit/data/profiles/cursor/rules/performance-optimizer.mdc +27 -0
  157. agent_toolkit/data/profiles/cursor/rules/planner.mdc +28 -0
  158. agent_toolkit/data/profiles/cursor/rules/refactor-cleaner.mdc +26 -0
  159. agent_toolkit/data/profiles/cursor/rules/reference-lookup.mdc +20 -0
  160. agent_toolkit/data/profiles/cursor/rules/security-reviewer.mdc +20 -0
  161. agent_toolkit/data/profiles/cursor/rules/tdd-guide.mdc +26 -0
  162. agent_toolkit/data/profiles/cursor/rules/typescript-reviewer.mdc +28 -0
  163. agent_toolkit/data/profiles/muse-code/README.md +35 -0
  164. agent_toolkit/data/profiles/opencode/README.md +44 -0
  165. agent_toolkit/data/profiles/opencode/agents/architect.md +30 -0
  166. agent_toolkit/data/profiles/opencode/agents/assistant.md +96 -0
  167. agent_toolkit/data/profiles/opencode/agents/build-error-resolver.md +31 -0
  168. agent_toolkit/data/profiles/opencode/agents/client-workflow-bootstrap.md +66 -0
  169. agent_toolkit/data/profiles/opencode/agents/code-reviewer.md +47 -0
  170. agent_toolkit/data/profiles/opencode/agents/contribution-planner.md +44 -0
  171. agent_toolkit/data/profiles/opencode/agents/database-reviewer.md +43 -0
  172. agent_toolkit/data/profiles/opencode/agents/docs-lookup.md +28 -0
  173. agent_toolkit/data/profiles/opencode/agents/e2e-runner.md +33 -0
  174. agent_toolkit/data/profiles/opencode/agents/performance-optimizer.md +34 -0
  175. agent_toolkit/data/profiles/opencode/agents/planner.md +27 -0
  176. agent_toolkit/data/profiles/opencode/agents/refactor-cleaner.md +27 -0
  177. agent_toolkit/data/profiles/opencode/agents/reference-lookup.md +27 -0
  178. agent_toolkit/data/profiles/opencode/agents/security-reviewer.md +27 -0
  179. agent_toolkit/data/profiles/opencode/agents/tdd-guide.md +27 -0
  180. agent_toolkit/data/profiles/opencode/agents/typescript-reviewer.md +30 -0
  181. agent_toolkit/data/profiles/opencode/opencode.json +3 -0
  182. agent_toolkit/data/profiles/pi/skills/architect/skill.md +5 -0
  183. agent_toolkit/data/profiles/pi/skills/assistant/skill.md +3 -0
  184. agent_toolkit/data/profiles/pi/skills/code-reviewer/skill.md +5 -0
  185. agent_toolkit/data/profiles/pi/skills/planner/skill.md +3 -0
  186. agent_toolkit/data/profiles/pi/skills/security-reviewer/skill.md +3 -0
  187. agent_toolkit/data/profiles/windsurf/memories/global_rules.md +114 -0
  188. agent_toolkit/data/profiles/windsurf/rules/architect.mdc +23 -0
  189. agent_toolkit/data/profiles/windsurf/rules/assistant.mdc +61 -0
  190. agent_toolkit/data/profiles/windsurf/rules/build-error-resolver.mdc +20 -0
  191. agent_toolkit/data/profiles/windsurf/rules/code-reviewer.mdc +21 -0
  192. agent_toolkit/data/profiles/windsurf/rules/database-reviewer.mdc +29 -0
  193. agent_toolkit/data/profiles/windsurf/rules/docs-lookup.mdc +15 -0
  194. agent_toolkit/data/profiles/windsurf/rules/e2e-runner.mdc +30 -0
  195. agent_toolkit/data/profiles/windsurf/rules/performance-optimizer.mdc +27 -0
  196. agent_toolkit/data/profiles/windsurf/rules/planner.mdc +28 -0
  197. agent_toolkit/data/profiles/windsurf/rules/refactor-cleaner.mdc +26 -0
  198. agent_toolkit/data/profiles/windsurf/rules/reference-lookup.mdc +20 -0
  199. agent_toolkit/data/profiles/windsurf/rules/security-reviewer.mdc +20 -0
  200. agent_toolkit/data/profiles/windsurf/rules/tdd-guide.mdc +26 -0
  201. agent_toolkit/data/profiles/windsurf/rules/typescript-reviewer.mdc +28 -0
  202. agent_toolkit/data/skills/accessibility/review/SKILL.md +116 -0
  203. agent_toolkit/data/skills/accessibility/review/references/a11y-checklist.md +25 -0
  204. agent_toolkit/data/skills/accessibility/review/references/a11y-findings-template.md +56 -0
  205. agent_toolkit/data/skills/accessibility/review/references/research.md +47 -0
  206. agent_toolkit/data/skills/agentic-security/mcp-audit/SKILL.md +116 -0
  207. agent_toolkit/data/skills/agentic-security/mcp-audit/references/mcp-audit-template.md +51 -0
  208. agent_toolkit/data/skills/agentic-security/owasp-agentic-review/SKILL.md +73 -0
  209. agent_toolkit/data/skills/agentic-security/owasp-agentic-review/references/owasp-agentic-template.md +32 -0
  210. agent_toolkit/data/skills/agentic-security/supply-chain-audit/SKILL.md +142 -0
  211. agent_toolkit/data/skills/agentic-security/threat-modeling/SKILL.md +100 -0
  212. agent_toolkit/data/skills/agentic-security/threat-modeling/references/threat-model-template.md +55 -0
  213. agent_toolkit/data/skills/architecture/c4-model/SKILL.md +49 -0
  214. agent_toolkit/data/skills/cloud/aws-well-architected-review/SKILL.md +37 -0
  215. agent_toolkit/data/skills/cloud/cloud-design-patterns/SKILL.md +38 -0
  216. agent_toolkit/data/skills/core/assistant/SKILL.md +216 -0
  217. agent_toolkit/data/skills/core/assistant/references/AGENTS_TEMPLATE.md +0 -0
  218. agent_toolkit/data/skills/core/assistant/references/ORCHESTRATION.md +0 -0
  219. agent_toolkit/data/skills/core/assistant/references/REPO_INSPECTION.md +0 -0
  220. agent_toolkit/data/skills/core/dev-companion/SKILL.md +65 -0
  221. agent_toolkit/data/skills/core/dev-companion/references/LOOP_GUARDRAILS.md +0 -0
  222. agent_toolkit/data/skills/core/onboarding/SKILL.md +122 -0
  223. agent_toolkit/data/skills/core/output-handshake/SKILL.md +26 -0
  224. agent_toolkit/data/skills/core/pr-fallback/SKILL.md +35 -0
  225. agent_toolkit/data/skills/core/pr-fallback/references/pr-body-default.md +0 -0
  226. agent_toolkit/data/skills/core/project/SKILL.md +89 -0
  227. agent_toolkit/data/skills/core/workspace/SKILL.md +103 -0
  228. agent_toolkit/data/skills/core/workspace-knowledge-sync/SKILL.md +140 -0
  229. agent_toolkit/data/skills/data/dbt-validation/SKILL.md +41 -0
  230. agent_toolkit/data/skills/data/snowflake-validation/SKILL.md +38 -0
  231. agent_toolkit/data/skills/delivery/adr/SKILL.md +56 -0
  232. agent_toolkit/data/skills/delivery/adr/references/default-template.md +35 -0
  233. agent_toolkit/data/skills/delivery/adr/references/example-001-graphql-adoption.md +66 -0
  234. agent_toolkit/data/skills/delivery/agreement/SKILL.md +24 -0
  235. agent_toolkit/data/skills/delivery/agreement/references/default-template.md +17 -0
  236. agent_toolkit/data/skills/delivery/agreement/references/example-api-versioning.md +29 -0
  237. agent_toolkit/data/skills/delivery/bug/SKILL.md +26 -0
  238. agent_toolkit/data/skills/delivery/bug/references/default-template.md +26 -0
  239. agent_toolkit/data/skills/delivery/bug/references/example-search-filter-bug.md +58 -0
  240. agent_toolkit/data/skills/delivery/decision-log/SKILL.md +28 -0
  241. agent_toolkit/data/skills/delivery/decision-log/references/default-template.md +17 -0
  242. agent_toolkit/data/skills/delivery/decision-log/references/example-repository-pattern.md +27 -0
  243. agent_toolkit/data/skills/delivery/development-workflow/SKILL.md +34 -0
  244. agent_toolkit/data/skills/delivery/development-workflow/references/default-workflow-checklist.md +44 -0
  245. agent_toolkit/data/skills/delivery/epic/SKILL.md +22 -0
  246. agent_toolkit/data/skills/delivery/epic/references/default-template.md +26 -0
  247. agent_toolkit/data/skills/delivery/epic/references/example-unified-dashboard.md +40 -0
  248. agent_toolkit/data/skills/delivery/incident/SKILL.md +24 -0
  249. agent_toolkit/data/skills/delivery/incident/references/default-template.md +29 -0
  250. agent_toolkit/data/skills/delivery/incident/references/example-payment-outage.md +62 -0
  251. agent_toolkit/data/skills/delivery/management-unit-assessment/SKILL.md +104 -0
  252. agent_toolkit/data/skills/delivery/management-unit-assessment/references/default-template.md +24 -0
  253. agent_toolkit/data/skills/delivery/management-unit-assessment/references/example-team-assessment.md +126 -0
  254. agent_toolkit/data/skills/delivery/meeting-minutes/SKILL.md +25 -0
  255. agent_toolkit/data/skills/delivery/meeting-minutes/references/default-template.md +22 -0
  256. agent_toolkit/data/skills/delivery/meeting-minutes/references/example-weekly-sync.md +72 -0
  257. agent_toolkit/data/skills/delivery/planning/SKILL.md +31 -0
  258. agent_toolkit/data/skills/delivery/planning/references/default-template.md +25 -0
  259. agent_toolkit/data/skills/delivery/planning/references/example-sprint-planning.md +62 -0
  260. agent_toolkit/data/skills/delivery/prd/SKILL.md +46 -0
  261. agent_toolkit/data/skills/delivery/prd/references/default-template.md +31 -0
  262. agent_toolkit/data/skills/delivery/prd/references/example-unified-api.md +71 -0
  263. agent_toolkit/data/skills/delivery/project-assessment/SKILL.md +90 -0
  264. agent_toolkit/data/skills/delivery/project-assessment/references/default-template.md +26 -0
  265. agent_toolkit/data/skills/delivery/project-assessment/references/example-platform-assessment.md +122 -0
  266. agent_toolkit/data/skills/delivery/project-assessment-evidence/SKILL.md +88 -0
  267. agent_toolkit/data/skills/delivery/project-assessment-evidence/references/default-template.md +24 -0
  268. agent_toolkit/data/skills/delivery/project-assessment-evidence/references/example-evidence-map.md +46 -0
  269. agent_toolkit/data/skills/delivery/spike/SKILL.md +24 -0
  270. agent_toolkit/data/skills/delivery/spike/references/default-template.md +29 -0
  271. agent_toolkit/data/skills/delivery/spike/references/example-graphql-federation.md +79 -0
  272. agent_toolkit/data/skills/delivery/task/SKILL.md +21 -0
  273. agent_toolkit/data/skills/delivery/task/references/default-template.md +21 -0
  274. agent_toolkit/data/skills/delivery/task/references/example-nav-system.md +33 -0
  275. agent_toolkit/data/skills/delivery/technical-unit-assessment/SKILL.md +58 -0
  276. agent_toolkit/data/skills/delivery/technical-unit-assessment/references/default-template.md +26 -0
  277. agent_toolkit/data/skills/delivery/technical-unit-assessment/references/example-frontend-assessment.md +112 -0
  278. agent_toolkit/data/skills/delivery/technical-unit-assessment/references/indicator-groups.md +65 -0
  279. agent_toolkit/data/skills/delivery/trd/SKILL.md +49 -0
  280. agent_toolkit/data/skills/delivery/trd/references/default-template.md +31 -0
  281. agent_toolkit/data/skills/delivery/trd/references/example-api-migration.md +122 -0
  282. agent_toolkit/data/skills/delivery/user-story/SKILL.md +21 -0
  283. agent_toolkit/data/skills/delivery/user-story/references/default-template.md +21 -0
  284. agent_toolkit/data/skills/delivery/user-story/references/example-advanced-filtering.md +37 -0
  285. agent_toolkit/data/skills/delivery/work-item/SKILL.md +31 -0
  286. agent_toolkit/data/skills/delivery/work-item/references/default-template.md +21 -0
  287. agent_toolkit/data/skills/delivery/work-item/references/example-routing-dashboard.md +23 -0
  288. agent_toolkit/data/skills/delivery/workflow-client-bootstrap/SKILL.md +148 -0
  289. agent_toolkit/data/skills/delivery/workflow-client-bootstrap/questions.yaml +165 -0
  290. agent_toolkit/data/skills/delivery/workflow-generic-project/SKILL.md +79 -0
  291. agent_toolkit/data/skills/design/design-assessment/SKILL.md +150 -0
  292. agent_toolkit/data/skills/design/design-assessment/references/design-scorecard-template.md +78 -0
  293. agent_toolkit/data/skills/design/design-improvement/SKILL.md +167 -0
  294. agent_toolkit/data/skills/design/design-improvement/references/improvement-plan-template.md +113 -0
  295. agent_toolkit/data/skills/design/figma/LICENSE.txt +2 -0
  296. agent_toolkit/data/skills/design/figma/NOTICE.txt +25 -0
  297. agent_toolkit/data/skills/design/figma/SKILL.md +98 -0
  298. agent_toolkit/data/skills/design/figma/references/figma-mcp-config.md +82 -0
  299. agent_toolkit/data/skills/design/figma/references/figma-tools-and-prompts.md +34 -0
  300. agent_toolkit/data/skills/design/figma-code-connect-components/LICENSE.txt +2 -0
  301. agent_toolkit/data/skills/design/figma-code-connect-components/NOTICE.txt +18 -0
  302. agent_toolkit/data/skills/design/figma-code-connect-components/SKILL.md +354 -0
  303. agent_toolkit/data/skills/design/figma-code-connect-components/references/mapping-checklist.md +7 -0
  304. agent_toolkit/data/skills/design/figma-code-connect-components/scripts/normalize_node_id.py +25 -0
  305. agent_toolkit/data/skills/design/figma-create-design-system-rules/LICENSE.txt +2 -0
  306. agent_toolkit/data/skills/design/figma-create-design-system-rules/NOTICE.txt +19 -0
  307. agent_toolkit/data/skills/design/figma-create-design-system-rules/SKILL.md +554 -0
  308. agent_toolkit/data/skills/design/figma-create-design-system-rules/references/rule-template.md +15 -0
  309. agent_toolkit/data/skills/design/figma-create-design-system-rules/scripts/check_agents_md.sh +9 -0
  310. agent_toolkit/data/skills/design/figma-create-new-file/LICENSE.txt +2 -0
  311. agent_toolkit/data/skills/design/figma-create-new-file/NOTICE.txt +17 -0
  312. agent_toolkit/data/skills/design/figma-create-new-file/SKILL.md +72 -0
  313. agent_toolkit/data/skills/design/figma-implement-design/LICENSE.txt +2 -0
  314. agent_toolkit/data/skills/design/figma-implement-design/NOTICE.txt +19 -0
  315. agent_toolkit/data/skills/design/figma-implement-design/SKILL.md +268 -0
  316. agent_toolkit/data/skills/design/frontend-design/LICENSE.txt +177 -0
  317. agent_toolkit/data/skills/design/frontend-design/SKILL.md +82 -0
  318. agent_toolkit/data/skills/design/frontend-design/UPSTREAM.md +14 -0
  319. agent_toolkit/data/skills/design/frontend-design-review/LICENSE +21 -0
  320. agent_toolkit/data/skills/design/frontend-design-review/SKILL.md +194 -0
  321. agent_toolkit/data/skills/design/frontend-design-review/references/pattern-examples.md +21 -0
  322. agent_toolkit/data/skills/design/frontend-design-review/references/quick-checklist.md +38 -0
  323. agent_toolkit/data/skills/design/frontend-design-review/references/review-output-format.md +68 -0
  324. agent_toolkit/data/skills/design/frontend-design-review/references/review-type-modifiers.md +31 -0
  325. agent_toolkit/data/skills/design/web-design-guidelines/SKILL.md +78 -0
  326. agent_toolkit/data/skills/design/web-design-guidelines/references/LICENSE +21 -0
  327. agent_toolkit/data/skills/design/web-design-guidelines/references/web-interface-guidelines.md +180 -0
  328. agent_toolkit/data/skills/forge/gh-address-comments/LICENSE.txt +202 -0
  329. agent_toolkit/data/skills/forge/gh-address-comments/NOTICE.txt +20 -0
  330. agent_toolkit/data/skills/forge/gh-address-comments/SKILL.md +72 -0
  331. agent_toolkit/data/skills/forge/gh-address-comments/scripts/fetch_comments.py +239 -0
  332. agent_toolkit/data/skills/forge/gh-contribution-planner/SKILL.md +160 -0
  333. agent_toolkit/data/skills/forge/gh-contribution-planner/scripts/inspect_contributions.py +818 -0
  334. agent_toolkit/data/skills/forge/gh-fix-ci/LICENSE.txt +201 -0
  335. agent_toolkit/data/skills/forge/gh-fix-ci/NOTICE.txt +20 -0
  336. agent_toolkit/data/skills/forge/gh-fix-ci/SKILL.md +74 -0
  337. agent_toolkit/data/skills/forge/gh-fix-ci/scripts/inspect_pr_checks.py +509 -0
  338. agent_toolkit/data/skills/forge/github-cli-workflow/SKILL.md +49 -0
  339. agent_toolkit/data/skills/forge/gitlab-cli-workflow/SKILL.md +44 -0
  340. agent_toolkit/data/skills/forge/workflow-client-bootstrap/SKILL.md +14 -0
  341. agent_toolkit/data/skills/forge/workflow-generic-project/SKILL.md +14 -0
  342. agent_toolkit/data/skills/forge/worktree/SKILL.md +113 -0
  343. agent_toolkit/data/skills/integrations/clickup-cli/SKILL.md +78 -0
  344. agent_toolkit/data/skills/integrations/clickup-cli/references/docs-management.md +57 -0
  345. agent_toolkit/data/skills/integrations/clickup-cli/references/task-management.md +131 -0
  346. agent_toolkit/data/skills/integrations/clickup-cli/references/time-tracking.md +38 -0
  347. agent_toolkit/data/skills/integrations/linear/LICENSE.txt +202 -0
  348. agent_toolkit/data/skills/integrations/linear/NOTICE.txt +23 -0
  349. agent_toolkit/data/skills/integrations/linear/SKILL.md +134 -0
  350. agent_toolkit/data/skills/integrations/mcp/SKILL.md +88 -0
  351. agent_toolkit/data/skills/integrations/slack-assistant/SKILL.md +138 -0
  352. agent_toolkit/data/skills/integrations/slack-cli/SKILL.md +109 -0
  353. agent_toolkit/data/skills/integrations/slack-cli/references/INSTALLATION.md +42 -0
  354. agent_toolkit/data/skills/loops/loop-runner/SKILL.md +92 -0
  355. agent_toolkit/data/skills/ops/docs-generator/SKILL.md +120 -0
  356. agent_toolkit/data/skills/ops/llm-cost-advisor/SKILL.md +87 -0
  357. agent_toolkit/data/skills/ops/swarm/SKILL.md +108 -0
  358. agent_toolkit/data/skills/ops/swarm-handoff/SKILL.md +112 -0
  359. agent_toolkit/data/skills/ops/swarm-observer/SKILL.md +102 -0
  360. agent_toolkit/data/skills/ops/triage/SKILL.md +119 -0
  361. agent_toolkit/data/skills/quality/codeql/SKILL.md +106 -0
  362. agent_toolkit/data/skills/quality/codeql/references/codeql-queries.md +43 -0
  363. agent_toolkit/data/skills/quality/megalinter/SKILL.md +162 -0
  364. agent_toolkit/data/skills/quality/megalinter/references/megalinter-images.md +36 -0
  365. agent_toolkit/data/skills/quality/megalinter/references/megalinter-license.md +41 -0
  366. agent_toolkit/data/skills/quality/megalinter/references/megalinter-targets.md +66 -0
  367. agent_toolkit/data/skills/tooling/chrome-devtools/SKILL.md +146 -0
  368. agent_toolkit/data/skills/tooling/herdr/SKILL.md +109 -0
  369. agent_toolkit/data/skills/tooling/inventory/SKILL.md +81 -0
  370. agent_toolkit/data/skills/tooling/jupyter-notebook/LICENSE.txt +201 -0
  371. agent_toolkit/data/skills/tooling/jupyter-notebook/NOTICE.txt +27 -0
  372. agent_toolkit/data/skills/tooling/jupyter-notebook/SKILL.md +145 -0
  373. agent_toolkit/data/skills/tooling/jupyter-notebook/assets/experiment-template.ipynb +117 -0
  374. agent_toolkit/data/skills/tooling/jupyter-notebook/assets/tutorial-template.ipynb +115 -0
  375. agent_toolkit/data/skills/tooling/jupyter-notebook/references/experiment-patterns.md +10 -0
  376. agent_toolkit/data/skills/tooling/jupyter-notebook/references/notebook-structure.md +17 -0
  377. agent_toolkit/data/skills/tooling/jupyter-notebook/references/quality-checklist.md +11 -0
  378. agent_toolkit/data/skills/tooling/jupyter-notebook/references/tutorial-patterns.md +9 -0
  379. agent_toolkit/data/skills/tooling/jupyter-notebook/scripts/new_notebook.py +132 -0
  380. agent_toolkit/data/skills/tooling/mermaid/SKILL.md +36 -0
  381. agent_toolkit/data/skills/tooling/playwright-cli/LICENSE.txt +201 -0
  382. agent_toolkit/data/skills/tooling/playwright-cli/NOTICE.txt +29 -0
  383. agent_toolkit/data/skills/tooling/playwright-cli/SKILL.md +154 -0
  384. agent_toolkit/data/skills/tooling/playwright-cli/references/cli.md +116 -0
  385. agent_toolkit/data/skills/tooling/playwright-cli/references/workflows.md +98 -0
  386. agent_toolkit/data/skills/tooling/playwright-cli/scripts/executable_playwright_cli.sh +25 -0
  387. agent_toolkit/data_cache.py +79 -0
  388. agent_toolkit/data_sync.py +144 -0
  389. agent_toolkit/installer/__init__.py +0 -0
  390. agent_toolkit/installer/merge.py +59 -0
  391. agent_toolkit/installer/receipt.py +89 -0
  392. agent_toolkit/installer/sources.py +92 -0
  393. agent_toolkit/installer/tracking.py +63 -0
  394. agent_toolkit/launcher.py +69 -0
  395. agent_toolkit/loop/__init__.py +0 -0
  396. agent_toolkit/loop/budget.py +107 -0
  397. agent_toolkit/loop/gh_gate.py +923 -0
  398. agent_toolkit/loop/loop-gh-gate +923 -0
  399. agent_toolkit/loop/pack.py +65 -0
  400. agent_toolkit/loop/runner.py +2722 -0
  401. agent_toolkit/runner/__init__.py +0 -0
  402. agent_toolkit/runner/dispatcher.py +163 -0
  403. agent_toolkit/runner/policy.py +356 -0
  404. agent_toolkit/runner/providers/__init__.py +21 -0
  405. agent_toolkit/runner/providers/anthropic_provider.py +109 -0
  406. agent_toolkit/runner/providers/base.py +53 -0
  407. agent_toolkit/runner/providers/ollama_provider.py +108 -0
  408. agent_toolkit/runner/providers/openai_provider.py +103 -0
  409. agent_toolkit/runner/providers/opencode_provider.py +127 -0
  410. agent_toolkit/swarm/__init__.py +5 -0
  411. agent_toolkit/swarm/approvals.py +121 -0
  412. agent_toolkit/swarm/backends/__init__.py +596 -0
  413. agent_toolkit/swarm/budget.py +83 -0
  414. agent_toolkit/swarm/cli.py +2448 -0
  415. agent_toolkit/swarm/config.py +351 -0
  416. agent_toolkit/swarm/handoff.py +174 -0
  417. agent_toolkit/swarm/models.py +230 -0
  418. agent_toolkit/swarm/prompts.py +177 -0
  419. agent_toolkit/swarm/recipes.py +304 -0
  420. agent_toolkit/swarm/runner.py +267 -0
  421. agent_toolkit/swarm/state.py +93 -0
  422. agent_toolkit/swarm/store.py +148 -0
  423. agent_toolkit/swarm/worktree.py +105 -0
  424. agent_toolkit/templates/workspace/.gitignore +19 -0
  425. agent_toolkit/templates/workspace/AGENTS.md +82 -0
  426. agent_toolkit/templates/workspace/knowledge/README.md +22 -0
  427. agent_toolkit/templates/workspace/knowledge/learnings/general.md +3 -0
  428. agent_toolkit/templates/workspace/knowledge/todos/pending.md +7 -0
  429. agent_toolkit/templates/workspace/packs/README.md +24 -0
  430. agent_toolkit/templates/workspace/personas/architect.md +12 -0
  431. agent_toolkit/templates/workspace/personas/implementer.md +12 -0
  432. agent_toolkit/templates/workspace/personas/researcher.md +12 -0
  433. agent_toolkit/templates/workspace/personas/reviewer.md +12 -0
  434. agent_toolkit_cli-1.11.0.dist-info/METADATA +363 -0
  435. agent_toolkit_cli-1.11.0.dist-info/RECORD +438 -0
  436. agent_toolkit_cli-1.11.0.dist-info/WHEEL +4 -0
  437. agent_toolkit_cli-1.11.0.dist-info/entry_points.txt +4 -0
  438. 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()
@@ -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