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,178 @@
1
+ """
2
+ release — Generate release artifacts and checksums without publishing.
3
+
4
+ Usage:
5
+ agent-toolkit release --dry-run [--output DIR] [--target all]
6
+
7
+ Options:
8
+ --dry-run Required: prevents accidental publishing
9
+ --output DIR Output directory (default: dist/)
10
+ --target TARGET Specific target or 'all' (default: all)
11
+ --json JSON output
12
+ --help Show this help
13
+
14
+ Example:
15
+ agent-toolkit release --dry-run --output dist/
16
+ """
17
+
18
+ from __future__ import annotations
19
+
20
+ import hashlib
21
+ import json
22
+ import sys
23
+ import tarfile
24
+ import tempfile
25
+ from pathlib import Path
26
+
27
+ from agent_toolkit._paths import toolkit_root
28
+
29
+
30
+ def _file_digest(path: Path) -> str:
31
+ return hashlib.sha256(path.read_bytes()).hexdigest()
32
+
33
+
34
+ def _find_repo_root() -> Path:
35
+ root = toolkit_root()
36
+ if (root / "distributions").is_dir():
37
+ return root
38
+ if (root.parent / "distributions").is_dir():
39
+ return root.parent
40
+ return root
41
+
42
+
43
+ def cmd_release(args: list[str]) -> int:
44
+ import argparse
45
+
46
+ parser = argparse.ArgumentParser(prog="agent-toolkit release", add_help=False)
47
+ parser.add_argument(
48
+ "--dry-run",
49
+ action="store_true",
50
+ required=True,
51
+ help="Required: prevents accidental publishing",
52
+ )
53
+ parser.add_argument("--output", default="dist/")
54
+ parser.add_argument("--target", default="all")
55
+ parser.add_argument("--json", dest="json_out", action="store_true")
56
+ parser.add_argument("--help", "-h", action="store_true")
57
+ parsed, _ = parser.parse_known_args(args)
58
+
59
+ if parsed.help:
60
+ print(__doc__)
61
+ return 0
62
+
63
+ if not parsed.dry_run:
64
+ print(" ✗ --dry-run is required to prevent accidental publishing", file=sys.stderr)
65
+ return 1
66
+
67
+ repo_root = _find_repo_root()
68
+ output_dir = Path(parsed.output)
69
+ output_dir.mkdir(parents=True, exist_ok=True)
70
+
71
+ try:
72
+ import yaml # noqa: F401
73
+
74
+ from agent_toolkit.compiler.loader import load_graph
75
+ except ImportError as e:
76
+ print(f" ✗ Compiler unavailable: {e}", file=sys.stderr)
77
+ return 1
78
+
79
+ graph = load_graph(repo_root)
80
+ if graph.errors:
81
+ for err in graph.errors:
82
+ print(f" ✗ {err}", file=sys.stderr)
83
+ return 1
84
+
85
+ json_mode = parsed.json_out
86
+
87
+ def _say(*args, **kwargs):
88
+ if not json_mode:
89
+ print(*args, **kwargs)
90
+
91
+ _say(f"\nRelease dry run — output: {output_dir}\n")
92
+
93
+ targets = {
94
+ "claude-code": "agent_toolkit.compiler.targets.claude_code.ClaudeCodeAdapter",
95
+ "cursor": "agent_toolkit.compiler.targets.cursor.CursorAdapter",
96
+ "opencode": "agent_toolkit.compiler.targets.opencode.OpenCodeAdapter",
97
+ "copilot-cli": "agent_toolkit.compiler.targets.copilot.CopilotCLIAdapter",
98
+ "copilot-repository": "agent_toolkit.compiler.targets.copilot.CopilotRepositoryAdapter",
99
+ "gemini-cli": "agent_toolkit.compiler.targets.gemini_cli.GeminiCLIAdapter",
100
+ "windsurf": "agent_toolkit.compiler.targets.windsurf.WindsurfAdapter",
101
+ "pi": "agent_toolkit.compiler.targets.pi.PiAdapter",
102
+ "codex": "agent_toolkit.compiler.targets.codex.CodexAdapter",
103
+ }
104
+
105
+ target_filter = parsed.target
106
+ if target_filter != "all":
107
+ targets = {k: v for k, v in targets.items() if k == target_filter}
108
+
109
+ artifacts_summary = []
110
+ checksums: dict[str, str] = {}
111
+
112
+ for target_id, adapter_path in targets.items():
113
+ try:
114
+ module_path, cls_name = adapter_path.rsplit(".", 1)
115
+ import importlib
116
+
117
+ mod = importlib.import_module(module_path)
118
+ AdapterCls = getattr(mod, cls_name)
119
+ except (ImportError, AttributeError):
120
+ _say(f" ⚠ {target_id}: adapter not available — skipping")
121
+ continue
122
+
123
+ target_out = output_dir / target_id
124
+ target_out.mkdir(parents=True, exist_ok=True)
125
+
126
+ with tempfile.TemporaryDirectory() as tmpdir:
127
+ adapter = AdapterCls(Path(tmpdir), repo_root)
128
+ for product in graph.products.values():
129
+ result = adapter.compile(graph, product)
130
+ if result.errors:
131
+ print(f" ✗ {target_id}/{product.id}: {result.errors}", file=sys.stderr)
132
+ continue
133
+
134
+ # Create tarball
135
+ tarball = target_out / f"{product.id}.tar.gz"
136
+ product_dir = Path(tmpdir) / product.id
137
+ if product_dir.is_dir():
138
+ with tarfile.open(tarball, "w:gz") as tar:
139
+ tar.add(product_dir, arcname=product.id)
140
+ digest = _file_digest(tarball)
141
+ checksums[str(tarball.relative_to(output_dir))] = digest
142
+ artifacts_summary.append(
143
+ {
144
+ "target": target_id,
145
+ "product": product.id,
146
+ "artifact": str(tarball),
147
+ "digest": digest,
148
+ }
149
+ )
150
+ _say(f" ✓ {target_id}/{product.id} → {tarball.name}")
151
+
152
+ # Write checksums
153
+ checksums_dir = output_dir / "checksums"
154
+ checksums_dir.mkdir(exist_ok=True)
155
+ checksums_file = checksums_dir / "SHA256SUMS"
156
+ with checksums_file.open("w") as f:
157
+ for path, digest in sorted(checksums.items()):
158
+ f.write(f"{digest} {path}\n")
159
+
160
+ # Write release manifest
161
+ manifests_dir = output_dir / "manifests"
162
+ manifests_dir.mkdir(exist_ok=True)
163
+ manifest = {
164
+ "targets": list(targets.keys()),
165
+ "products": list(graph.products.keys()),
166
+ "artifactCount": len(artifacts_summary),
167
+ }
168
+ (manifests_dir / "release-manifest.json").write_text(json.dumps(manifest, indent=2) + "\n")
169
+
170
+ _say(f"\n ✓ {len(artifacts_summary)} artifacts generated")
171
+ _say(f" ✓ Checksums: {checksums_file}")
172
+ _say(f" ✓ Manifest: {manifests_dir / 'release-manifest.json'}")
173
+ _say("\n ℹ Dry run complete — nothing published\n")
174
+
175
+ if json_mode:
176
+ print(json.dumps(artifacts_summary, indent=2))
177
+
178
+ return 0
@@ -0,0 +1,461 @@
1
+ """
2
+ skills — Skill management for agent-toolkit.
3
+
4
+ Usage:
5
+ agent-toolkit skills <subcommand> [options]
6
+
7
+ Subcommands:
8
+ list [--domain DOMAIN] List skills grouped by domain
9
+ sync [--tools TOOLS] Sync skills to tool-specific directories
10
+ validate Validate SKILL.md frontmatter
11
+
12
+ Options:
13
+ --domain DOMAIN Filter by domain (used with list)
14
+ --tools TOOLS Comma-separated tools to sync (used with sync)
15
+ Valid: claude-code, cursor, opencode
16
+ --help Show this help message
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ import json
22
+ import re
23
+ import shutil
24
+ import sys
25
+
26
+ # Windows: force UTF-8 output so Unicode chars (✓ ✗ ──) don't crash
27
+ import sys as _sys
28
+ from pathlib import Path
29
+
30
+ from agent_toolkit._paths import toolkit_root
31
+
32
+ if _sys.platform == "win32":
33
+ try:
34
+ _sys.stdout.reconfigure(encoding="utf-8", errors="replace")
35
+ _sys.stderr.reconfigure(encoding="utf-8", errors="replace")
36
+ except Exception:
37
+ pass
38
+
39
+
40
+ def _parse_skill_description(skill_dir):
41
+ skill_md = skill_dir / "SKILL.md"
42
+ if not skill_md.exists():
43
+ return ""
44
+ text = skill_md.read_text(errors="replace")
45
+ fm_match = re.match(r"^---[ \t]*\n(.*?)\n---", text, re.DOTALL)
46
+ if not fm_match:
47
+ return ""
48
+ fm = fm_match.group(1)
49
+ # Block scalar: description: >-\n content
50
+ block = re.search(r"^description:[ \t]*[|>][\-+]?[ \t]*\n((?:[ \t]+.+\n?)+)", fm, re.MULTILINE)
51
+ if block:
52
+ lines = [line.strip() for line in block.group(1).splitlines() if line.strip()]
53
+ return " ".join(lines)[:120]
54
+ # Inline: description: text
55
+ inline = re.search(r"^description:[ \t]+(.+)$", fm, re.MULTILINE)
56
+ if inline:
57
+ return inline.group(1).strip()[:120]
58
+ return ""
59
+
60
+
61
+ def _load_layout(toolkit_dir: Path) -> dict | None:
62
+ layout_path = toolkit_dir / "catalogs" / "skills-layout.json"
63
+ if not layout_path.exists():
64
+ print(f" ✗ skills-layout.json not found: {layout_path}", file=sys.stderr)
65
+ return None
66
+ try:
67
+ return json.loads(layout_path.read_text())
68
+ except (json.JSONDecodeError, OSError) as exc:
69
+ print(f" ✗ Cannot parse skills-layout.json: {exc}", file=sys.stderr)
70
+ return None
71
+
72
+
73
+ # ---------------------------------------------------------------------------
74
+ # SKILL.md frontmatter parsing (stdlib-only, no PyYAML)
75
+ # ---------------------------------------------------------------------------
76
+
77
+ _FRONTMATTER_RE = re.compile(r"^---\s*\n(.*?)\n---\s*\n", re.DOTALL)
78
+ _SIMPLE_KV_RE = re.compile(r"^([A-Za-z_][A-Za-z0-9_-]*)\s*:\s*(.*)$")
79
+
80
+
81
+ def _parse_frontmatter_simple(content: str) -> dict | None:
82
+ """Parse YAML frontmatter — handles inline values and block scalars (>-, |-)."""
83
+ match = _FRONTMATTER_RE.match(content)
84
+ if not match:
85
+ return None
86
+ result: dict[str, str] = {}
87
+ lines = match.group(1).splitlines()
88
+ i = 0
89
+ while i < len(lines):
90
+ line = lines[i]
91
+ stripped = line.strip()
92
+ if not stripped or stripped.startswith("#"):
93
+ i += 1
94
+ continue
95
+ m = _SIMPLE_KV_RE.match(stripped)
96
+ if m:
97
+ key = m.group(1).strip()
98
+ val = m.group(2).strip().strip('"').strip("'")
99
+ # YAML block scalar — collect indented lines that follow
100
+ if val in (">", ">-", "|-", "|", ">+", "|+"):
101
+ block_lines = []
102
+ j = i + 1
103
+ while j < len(lines) and (lines[j].startswith(" ") or lines[j].startswith("\t")):
104
+ block_lines.append(lines[j].strip())
105
+ j += 1
106
+ result[key] = " ".join(block_lines)
107
+ i = j
108
+ continue
109
+ result[key] = val
110
+ i += 1
111
+ return result
112
+
113
+
114
+ # ---------------------------------------------------------------------------
115
+ # list subcommand
116
+ # ---------------------------------------------------------------------------
117
+
118
+
119
+ def _cmd_list(args: list[str], toolkit_dir: Path) -> int:
120
+ """Display skills grouped by domain."""
121
+ domain_filter: str | None = None
122
+ i = 0
123
+ while i < len(args):
124
+ if args[i] == "--domain" and i + 1 < len(args):
125
+ domain_filter = args[i + 1]
126
+ i += 2
127
+ else:
128
+ i += 1
129
+
130
+ layout = _load_layout(toolkit_dir)
131
+ if layout is None:
132
+ return 1
133
+
134
+ groups: dict[str, list[str]] = layout.get("groups", {})
135
+ skills_index: dict[str, dict] = {s["name"]: s for s in layout.get("skills", [])}
136
+
137
+ if domain_filter and domain_filter not in groups:
138
+ available = ", ".join(sorted(groups.keys()))
139
+ print(f" ✗ Unknown domain: {domain_filter} (available: {available})", file=sys.stderr)
140
+ return 1
141
+
142
+ targets = {domain_filter: groups[domain_filter]} if domain_filter else groups
143
+
144
+ print()
145
+ print("Available skills")
146
+ print()
147
+
148
+ for domain, skill_names in sorted(targets.items()):
149
+ print(f"── {domain} ──")
150
+ for name in sorted(skill_names):
151
+ info = skills_index.get(name, {})
152
+ path = toolkit_dir / info.get("path", f"skills/{domain}/{name}")
153
+ skill_md = path / "SKILL.md"
154
+
155
+ description = ""
156
+ if skill_md.exists():
157
+ try:
158
+ content = skill_md.read_text(errors="replace")
159
+ fm = _parse_frontmatter_simple(content)
160
+ if fm:
161
+ description = fm.get("description", "")
162
+ except OSError:
163
+ pass
164
+
165
+ exists_marker = "✓" if skill_md.exists() else "✗"
166
+ desc_str = f" — {description}" if description else ""
167
+ print(f" {exists_marker} {name:<40}{desc_str}")
168
+ print()
169
+
170
+ total = sum(len(v) for v in groups.values())
171
+ print(f"Total: {total} skill(s) across {len(groups)} domain(s)")
172
+ print()
173
+ return 0
174
+
175
+
176
+ # ---------------------------------------------------------------------------
177
+ # sync subcommand
178
+ # ---------------------------------------------------------------------------
179
+
180
+
181
+ def _sync_claude_code(toolkit_dir: Path) -> bool:
182
+ """Copy/symlink SKILL.md files into ~/.claude/skills/<name>/."""
183
+ skills_dir = toolkit_dir / "skills"
184
+ if not skills_dir.is_dir():
185
+ print(f" ✗ Skills directory not found: {skills_dir}", file=sys.stderr)
186
+ return False
187
+
188
+ dst_root = Path.home() / ".claude" / "skills"
189
+ success = True
190
+
191
+ for skill_md in sorted(skills_dir.rglob("SKILL.md")):
192
+ skill_dir = skill_md.parent
193
+ name = skill_dir.name
194
+ dst = dst_root / name / "SKILL.md"
195
+ try:
196
+ dst.parent.mkdir(parents=True, exist_ok=True)
197
+ if dst.exists() and dst.read_bytes() == skill_md.read_bytes():
198
+ print(f" - {name}: already up to date")
199
+ continue
200
+ shutil.copy2(skill_md, dst)
201
+ print(f" ✓ {name}: synced → {dst}")
202
+ except (PermissionError, OSError) as exc:
203
+ print(f" ✗ {name}: {exc}", file=sys.stderr)
204
+ success = False
205
+
206
+ return success
207
+
208
+
209
+ def _sync_cursor(toolkit_dir: Path) -> bool:
210
+ """Write a skills index JSON to ~/.cursor/skills-index.json."""
211
+ layout = _load_layout(toolkit_dir)
212
+ if layout is None:
213
+ return False
214
+
215
+ index: list[dict] = []
216
+ for skill_info in layout.get("skills", []):
217
+ name = skill_info["name"]
218
+ path = toolkit_dir / skill_info.get("path", f"skills/{skill_info.get('group', '')}/{name}")
219
+ skill_md = path / "SKILL.md"
220
+ description = ""
221
+ if skill_md.exists():
222
+ try:
223
+ fm = _parse_frontmatter_simple(skill_md.read_text(errors="replace"))
224
+ if fm:
225
+ description = fm.get("description", "")
226
+ except OSError:
227
+ pass
228
+ index.append(
229
+ {
230
+ "name": name,
231
+ "group": skill_info.get("group", ""),
232
+ "description": description,
233
+ "path": str(path),
234
+ }
235
+ )
236
+
237
+ dst = Path.home() / ".cursor" / "skills-index.json"
238
+ try:
239
+ dst.parent.mkdir(parents=True, exist_ok=True)
240
+ dst.write_text(json.dumps({"skills": index}, indent=2) + "\n")
241
+ print(f" ✓ cursor: skills-index written → {dst} ({len(index)} skills)")
242
+ return True
243
+ except (PermissionError, OSError) as exc:
244
+ print(f" ✗ cursor: {exc}", file=sys.stderr)
245
+ return False
246
+
247
+
248
+ def _sync_opencode(toolkit_dir: Path) -> bool:
249
+ """Copy SKILL.md files to ~/.config/opencode/skills/<name>/."""
250
+ skills_dir = toolkit_dir / "skills"
251
+ if not skills_dir.is_dir():
252
+ print(f" ✗ Skills directory not found: {skills_dir}", file=sys.stderr)
253
+ return False
254
+
255
+ dst_root = Path.home() / ".config" / "opencode" / "skills"
256
+ success = True
257
+
258
+ for skill_md in sorted(skills_dir.rglob("SKILL.md")):
259
+ skill_dir = skill_md.parent
260
+ name = skill_dir.name
261
+ dst = dst_root / name / "SKILL.md"
262
+ try:
263
+ dst.parent.mkdir(parents=True, exist_ok=True)
264
+ if dst.exists() and dst.read_bytes() == skill_md.read_bytes():
265
+ print(f" - {name}: already up to date")
266
+ continue
267
+ shutil.copy2(skill_md, dst)
268
+ print(f" ✓ {name}: synced → {dst}")
269
+ except (PermissionError, OSError) as exc:
270
+ print(f" ✗ {name}: {exc}", file=sys.stderr)
271
+ success = False
272
+
273
+ return success
274
+
275
+
276
+ def _cmd_sync(args: list[str], toolkit_dir: Path) -> int:
277
+ """Sync skills to tool-specific directories."""
278
+ tools_arg: str | None = None
279
+ i = 0
280
+ while i < len(args):
281
+ if args[i] == "--tools" and i + 1 < len(args):
282
+ tools_arg = args[i + 1]
283
+ i += 2
284
+ else:
285
+ i += 1
286
+
287
+ valid_tools = ("claude-code", "cursor", "opencode")
288
+ if tools_arg:
289
+ tools = [t.strip() for t in tools_arg.split(",") if t.strip()]
290
+ else:
291
+ # Default: all supported tools
292
+ tools = list(valid_tools)
293
+
294
+ print()
295
+ print("Syncing skills...")
296
+ print()
297
+
298
+ success = True
299
+ for tool in tools:
300
+ if tool == "claude-code":
301
+ print("── claude-code ──")
302
+ if not _sync_claude_code(toolkit_dir):
303
+ success = False
304
+ print()
305
+ elif tool == "cursor":
306
+ print("── cursor ──")
307
+ if not _sync_cursor(toolkit_dir):
308
+ success = False
309
+ print()
310
+ elif tool == "opencode":
311
+ print("── opencode ──")
312
+ if not _sync_opencode(toolkit_dir):
313
+ success = False
314
+ print()
315
+ else:
316
+ print(f" ⚠ Unknown tool: {tool} (valid: {', '.join(valid_tools)})")
317
+ success = False # CLI-012 / #48 — unknown --tools must fail
318
+
319
+ return 0 if success else 1
320
+
321
+
322
+ # ---------------------------------------------------------------------------
323
+ # validate subcommand
324
+ # ---------------------------------------------------------------------------
325
+
326
+
327
+ def _validate_skill(skill_dir: Path, toolkit_dir: Path) -> tuple[int, int]:
328
+ """Validate a single skill directory. Returns (errors, warnings)."""
329
+ rel = skill_dir.relative_to(toolkit_dir)
330
+ skill_md = skill_dir / "SKILL.md"
331
+ errors = 0
332
+ warnings = 0
333
+
334
+ if not skill_md.exists():
335
+ print(f" ✗ {rel}: missing SKILL.md")
336
+ return 1, 0
337
+
338
+ try:
339
+ content = skill_md.read_text(errors="replace")
340
+ except OSError as exc:
341
+ print(f" ✗ {rel}/SKILL.md: cannot read: {exc}")
342
+ return 1, 0
343
+
344
+ fm = _parse_frontmatter_simple(content)
345
+ if fm is None:
346
+ print(f" ✗ {rel}/SKILL.md: no YAML frontmatter found (must start with ---)")
347
+ return 1, 0
348
+
349
+ ok = True
350
+ for field in ("name", "description"):
351
+ if not fm.get(field):
352
+ print(f" ✗ {rel}/SKILL.md: missing required frontmatter field '{field}'")
353
+ errors += 1
354
+ ok = False
355
+
356
+ if fm.get("name") and fm["name"] != skill_dir.name:
357
+ print(
358
+ f" ⚠ {rel}/SKILL.md: name '{fm['name']}' does not match directory '{skill_dir.name}'"
359
+ )
360
+ warnings += 1
361
+
362
+ if (skill_dir / "skill.json").exists():
363
+ print(f" ⚠ {rel}: skill.json found — not needed, can be removed")
364
+ warnings += 1
365
+
366
+ if ok:
367
+ print(f" ✓ {rel}/SKILL.md")
368
+
369
+ return errors, warnings
370
+
371
+
372
+ def _cmd_validate(toolkit_dir: Path) -> int:
373
+ """Validate SKILL.md frontmatter for all skills."""
374
+ skills_dir = toolkit_dir / "skills"
375
+ plugins_dir = toolkit_dir / "plugins"
376
+
377
+ if not skills_dir.is_dir():
378
+ print(f" ✗ Skills directory not found: {skills_dir}", file=sys.stderr)
379
+ return 1
380
+
381
+ print()
382
+ print("Validating SKILL.md frontmatter...")
383
+ print()
384
+
385
+ total_errors = 0
386
+ total_warnings = 0
387
+ skill_count = 0
388
+
389
+ print("── skills/ ──")
390
+ for domain_dir in sorted(skills_dir.iterdir()):
391
+ if not domain_dir.is_dir():
392
+ continue
393
+ for skill_dir in sorted(domain_dir.iterdir()):
394
+ if not skill_dir.is_dir():
395
+ continue
396
+ errs, warns = _validate_skill(skill_dir, toolkit_dir)
397
+ total_errors += errs
398
+ total_warnings += warns
399
+ skill_count += 1
400
+
401
+ if plugins_dir.is_dir():
402
+ print()
403
+ print("── plugins/ (bundled copies) ──")
404
+ for plugin_dir in sorted(plugins_dir.iterdir()):
405
+ if not plugin_dir.is_dir():
406
+ continue
407
+ plugin_skills = plugin_dir / "skills"
408
+ if plugin_skills.exists():
409
+ for skill_dir in sorted(plugin_skills.iterdir()):
410
+ if skill_dir.is_dir():
411
+ errs, warns = _validate_skill(skill_dir, toolkit_dir)
412
+ total_errors += errs
413
+ total_warnings += warns
414
+
415
+ print()
416
+ print("── Summary ──")
417
+ print(f" Skills validated: {skill_count}")
418
+
419
+ if total_errors:
420
+ print(f"\n ✗ {total_errors} error(s) found")
421
+ return 1
422
+
423
+ if total_warnings:
424
+ print(f"\n ⚠ All valid with {total_warnings} warning(s)")
425
+ else:
426
+ print("\n ✓ All SKILL.md files are valid!")
427
+ return 0
428
+
429
+
430
+ # ---------------------------------------------------------------------------
431
+ # Argument parsing & dispatch
432
+ # ---------------------------------------------------------------------------
433
+
434
+
435
+ def cmd_skills(args: list[str]) -> int:
436
+ """Skill management entry point.
437
+
438
+ Returns 0 on success, 1 on failure.
439
+ """
440
+ if not args or args[0] in ("-h", "--help"):
441
+ print(__doc__)
442
+ return 0
443
+
444
+ toolkit_dir = toolkit_root()
445
+ if toolkit_dir is None:
446
+ print(" ✗ Cannot locate toolkit directory", file=sys.stderr)
447
+ return 1
448
+
449
+ subcommand = args[0]
450
+ rest = args[1:]
451
+
452
+ if subcommand == "list":
453
+ return _cmd_list(rest, toolkit_dir)
454
+ elif subcommand == "sync":
455
+ return _cmd_sync(rest, toolkit_dir)
456
+ elif subcommand == "validate":
457
+ return _cmd_validate(toolkit_dir)
458
+ else:
459
+ print(f" ✗ Unknown subcommand: {subcommand}", file=sys.stderr)
460
+ print(" Valid subcommands: list, sync, validate", file=sys.stderr)
461
+ return 1