@josstei/maestro 1.6.4-rc.1

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 (655) hide show
  1. package/.agents/plugins/marketplace.json +20 -0
  2. package/CHANGELOG.md +485 -0
  3. package/EXAMPLES.md +255 -0
  4. package/GEMINI.md +231 -0
  5. package/LICENSE +201 -0
  6. package/QWEN.md +241 -0
  7. package/README.md +220 -0
  8. package/agents/accessibility_specialist.md +20 -0
  9. package/agents/analytics_engineer.md +22 -0
  10. package/agents/api_designer.md +19 -0
  11. package/agents/architect.md +19 -0
  12. package/agents/cloud_architect.md +19 -0
  13. package/agents/cobol_engineer.md +22 -0
  14. package/agents/code_reviewer.md +17 -0
  15. package/agents/coder.md +22 -0
  16. package/agents/compliance_reviewer.md +19 -0
  17. package/agents/content_strategist.md +19 -0
  18. package/agents/copywriter.md +19 -0
  19. package/agents/data_engineer.md +22 -0
  20. package/agents/database_administrator.md +21 -0
  21. package/agents/db2_dba.md +21 -0
  22. package/agents/debugger.md +19 -0
  23. package/agents/design_system_engineer.md +22 -0
  24. package/agents/devops_engineer.md +23 -0
  25. package/agents/hlasm_assembler_specialist.md +22 -0
  26. package/agents/i18n_specialist.md +21 -0
  27. package/agents/ibm_i_specialist.md +22 -0
  28. package/agents/integration_engineer.md +23 -0
  29. package/agents/ml_engineer.md +23 -0
  30. package/agents/mlops_engineer.md +23 -0
  31. package/agents/mobile_engineer.md +23 -0
  32. package/agents/observability_engineer.md +23 -0
  33. package/agents/performance_engineer.md +21 -0
  34. package/agents/platform_engineer.md +24 -0
  35. package/agents/product_manager.md +20 -0
  36. package/agents/prompt_engineer.md +22 -0
  37. package/agents/refactor.md +22 -0
  38. package/agents/release_manager.md +22 -0
  39. package/agents/security_engineer.md +21 -0
  40. package/agents/seo_specialist.md +21 -0
  41. package/agents/site_reliability_engineer.md +21 -0
  42. package/agents/solutions_architect.md +19 -0
  43. package/agents/technical_writer.md +21 -0
  44. package/agents/tester.md +23 -0
  45. package/agents/ux_designer.md +20 -0
  46. package/agents/zos_sysprog.md +21 -0
  47. package/bin/maestro-mcp-server.js +10 -0
  48. package/claude/.claude-plugin/plugin.json +21 -0
  49. package/claude/.mcp.json +11 -0
  50. package/claude/README.md +191 -0
  51. package/claude/agents/accessibility-specialist.md +36 -0
  52. package/claude/agents/analytics-engineer.md +38 -0
  53. package/claude/agents/api-designer.md +33 -0
  54. package/claude/agents/architect.md +33 -0
  55. package/claude/agents/cloud-architect.md +33 -0
  56. package/claude/agents/cobol-engineer.md +38 -0
  57. package/claude/agents/code-reviewer.md +31 -0
  58. package/claude/agents/coder.md +38 -0
  59. package/claude/agents/compliance-reviewer.md +33 -0
  60. package/claude/agents/content-strategist.md +33 -0
  61. package/claude/agents/copywriter.md +33 -0
  62. package/claude/agents/data-engineer.md +37 -0
  63. package/claude/agents/database-administrator.md +37 -0
  64. package/claude/agents/db2-dba.md +37 -0
  65. package/claude/agents/debugger.md +32 -0
  66. package/claude/agents/design-system-engineer.md +38 -0
  67. package/claude/agents/devops-engineer.md +39 -0
  68. package/claude/agents/hlasm-assembler-specialist.md +38 -0
  69. package/claude/agents/i18n-specialist.md +37 -0
  70. package/claude/agents/ibm-i-specialist.md +38 -0
  71. package/claude/agents/integration-engineer.md +39 -0
  72. package/claude/agents/ml-engineer.md +39 -0
  73. package/claude/agents/mlops-engineer.md +39 -0
  74. package/claude/agents/mobile-engineer.md +39 -0
  75. package/claude/agents/observability-engineer.md +39 -0
  76. package/claude/agents/performance-engineer.md +34 -0
  77. package/claude/agents/platform-engineer.md +40 -0
  78. package/claude/agents/product-manager.md +34 -0
  79. package/claude/agents/prompt-engineer.md +38 -0
  80. package/claude/agents/refactor.md +38 -0
  81. package/claude/agents/release-manager.md +38 -0
  82. package/claude/agents/security-engineer.md +37 -0
  83. package/claude/agents/seo-specialist.md +37 -0
  84. package/claude/agents/site-reliability-engineer.md +37 -0
  85. package/claude/agents/solutions-architect.md +33 -0
  86. package/claude/agents/technical-writer.md +37 -0
  87. package/claude/agents/tester.md +39 -0
  88. package/claude/agents/ux-designer.md +34 -0
  89. package/claude/agents/zos-sysprog.md +37 -0
  90. package/claude/hooks/claude-hooks.json +48 -0
  91. package/claude/mcp/maestro-server.js +9 -0
  92. package/claude/mcp-config.example.json +9 -0
  93. package/claude/scripts/adapters/claude-adapter.js +7 -0
  94. package/claude/scripts/hook-runner.js +8 -0
  95. package/claude/scripts/policy-enforcer.js +294 -0
  96. package/claude/skills/a11y-audit/SKILL.md +26 -0
  97. package/claude/skills/archive/SKILL.md +24 -0
  98. package/claude/skills/code-review/SKILL.md +7 -0
  99. package/claude/skills/compliance-check/SKILL.md +26 -0
  100. package/claude/skills/debug-workflow/SKILL.md +27 -0
  101. package/claude/skills/delegation/SKILL.md +7 -0
  102. package/claude/skills/design-dialogue/SKILL.md +7 -0
  103. package/claude/skills/execute/SKILL.md +38 -0
  104. package/claude/skills/execution/SKILL.md +7 -0
  105. package/claude/skills/implementation-planning/SKILL.md +7 -0
  106. package/claude/skills/orchestrate/SKILL.md +38 -0
  107. package/claude/skills/perf-check/SKILL.md +26 -0
  108. package/claude/skills/resume-session/SKILL.md +38 -0
  109. package/claude/skills/review-code/SKILL.md +27 -0
  110. package/claude/skills/security-audit/SKILL.md +28 -0
  111. package/claude/skills/seo-audit/SKILL.md +26 -0
  112. package/claude/skills/session-management/SKILL.md +7 -0
  113. package/claude/skills/status/SKILL.md +22 -0
  114. package/claude/skills/validation/SKILL.md +7 -0
  115. package/claude/src/agents/accessibility-specialist.md +163 -0
  116. package/claude/src/agents/analytics-engineer.md +182 -0
  117. package/claude/src/agents/api-designer.md +124 -0
  118. package/claude/src/agents/architect.md +120 -0
  119. package/claude/src/agents/cloud-architect.md +134 -0
  120. package/claude/src/agents/cobol-engineer.md +127 -0
  121. package/claude/src/agents/code-reviewer.md +123 -0
  122. package/claude/src/agents/coder.md +132 -0
  123. package/claude/src/agents/compliance-reviewer.md +219 -0
  124. package/claude/src/agents/content-strategist.md +111 -0
  125. package/claude/src/agents/copywriter.md +113 -0
  126. package/claude/src/agents/data-engineer.md +130 -0
  127. package/claude/src/agents/database-administrator.md +126 -0
  128. package/claude/src/agents/db2-dba.md +124 -0
  129. package/claude/src/agents/debugger.md +133 -0
  130. package/claude/src/agents/design-system-engineer.md +258 -0
  131. package/claude/src/agents/devops-engineer.md +138 -0
  132. package/claude/src/agents/hlasm-assembler-specialist.md +134 -0
  133. package/claude/src/agents/i18n-specialist.md +241 -0
  134. package/claude/src/agents/ibm-i-specialist.md +132 -0
  135. package/claude/src/agents/integration-engineer.md +133 -0
  136. package/claude/src/agents/ml-engineer.md +115 -0
  137. package/claude/src/agents/mlops-engineer.md +116 -0
  138. package/claude/src/agents/mobile-engineer.md +115 -0
  139. package/claude/src/agents/observability-engineer.md +133 -0
  140. package/claude/src/agents/performance-engineer.md +139 -0
  141. package/claude/src/agents/platform-engineer.md +129 -0
  142. package/claude/src/agents/product-manager.md +170 -0
  143. package/claude/src/agents/prompt-engineer.md +129 -0
  144. package/claude/src/agents/refactor.md +138 -0
  145. package/claude/src/agents/release-manager.md +132 -0
  146. package/claude/src/agents/security-engineer.md +143 -0
  147. package/claude/src/agents/seo-specialist.md +129 -0
  148. package/claude/src/agents/site-reliability-engineer.md +131 -0
  149. package/claude/src/agents/solutions-architect.md +137 -0
  150. package/claude/src/agents/technical-writer.md +129 -0
  151. package/claude/src/agents/tester.md +135 -0
  152. package/claude/src/agents/ux-designer.md +168 -0
  153. package/claude/src/agents/zos-sysprog.md +134 -0
  154. package/claude/src/config/setting-resolver.js +32 -0
  155. package/claude/src/core/agent-registry.js +67 -0
  156. package/claude/src/core/canonical-source.js +39 -0
  157. package/claude/src/core/env-file-parser.js +82 -0
  158. package/claude/src/core/feature-blocks.js +34 -0
  159. package/claude/src/core/logger.js +12 -0
  160. package/claude/src/core/markdown-state.js +36 -0
  161. package/claude/src/core/policy-rules.js +32 -0
  162. package/claude/src/core/project-root-resolver.js +184 -0
  163. package/claude/src/core/stdin-reader.js +77 -0
  164. package/claude/src/core/version.js +50 -0
  165. package/claude/src/entry-points/core-command-registry.js +37 -0
  166. package/claude/src/entry-points/preamble-builders.js +54 -0
  167. package/claude/src/entry-points/registry.js +199 -0
  168. package/claude/src/entry-points/templates/claude-core-command.md.tmpl +38 -0
  169. package/claude/src/entry-points/templates/claude-skill.md.tmpl +18 -0
  170. package/claude/src/entry-points/templates/codex-core-command.md.tmpl +16 -0
  171. package/claude/src/entry-points/templates/codex-skill.md.tmpl +11 -0
  172. package/claude/src/entry-points/templates/gemini-command.toml.tmpl +17 -0
  173. package/claude/src/entry-points/templates/gemini-core-command.toml.tmpl +30 -0
  174. package/claude/src/generated/agent-registry.json +630 -0
  175. package/claude/src/generated/hook-registry.json +18 -0
  176. package/claude/src/generated/resource-registry.json +16 -0
  177. package/claude/src/hooks/logic/after-agent-logic.js +54 -0
  178. package/claude/src/hooks/logic/before-agent-logic.js +57 -0
  179. package/claude/src/hooks/logic/hook-state.js +127 -0
  180. package/claude/src/hooks/logic/session-end-logic.js +17 -0
  181. package/claude/src/hooks/logic/session-start-logic.js +25 -0
  182. package/claude/src/lib/discovery/index.js +172 -0
  183. package/claude/src/lib/errors/index.js +104 -0
  184. package/claude/src/lib/framework-detection.js +50 -0
  185. package/claude/src/lib/frontmatter/index.js +262 -0
  186. package/claude/src/lib/io/index.js +96 -0
  187. package/claude/src/lib/naming/index.js +94 -0
  188. package/claude/src/lib/validation/index.js +124 -0
  189. package/claude/src/lib/yaml-emit.js +38 -0
  190. package/claude/src/mcp/content/provider.js +68 -0
  191. package/claude/src/mcp/content/runtime-content.js +188 -0
  192. package/claude/src/mcp/contracts/cache-path-rejector.js +39 -0
  193. package/claude/src/mcp/contracts/downstream-context.js +106 -0
  194. package/claude/src/mcp/contracts/plan-schema.js +148 -0
  195. package/claude/src/mcp/contracts/workspace-marker.js +61 -0
  196. package/claude/src/mcp/core/create-server.js +76 -0
  197. package/claude/src/mcp/core/line-reader.js +35 -0
  198. package/claude/src/mcp/core/project-root-cache.js +120 -0
  199. package/claude/src/mcp/core/protocol-dispatcher.js +274 -0
  200. package/claude/src/mcp/core/recovery-hints.js +43 -0
  201. package/claude/src/mcp/core/tool-outcome.js +77 -0
  202. package/claude/src/mcp/core/tool-registry.js +82 -0
  203. package/claude/src/mcp/handlers/assess-task-complexity.js +108 -0
  204. package/claude/src/mcp/handlers/blocker-parser.js +34 -0
  205. package/claude/src/mcp/handlers/design-gate.js +393 -0
  206. package/claude/src/mcp/handlers/get-agent.js +54 -0
  207. package/claude/src/mcp/handlers/get-runtime-context.js +49 -0
  208. package/claude/src/mcp/handlers/get-skill-content.js +51 -0
  209. package/claude/src/mcp/handlers/initialize-workspace.js +45 -0
  210. package/claude/src/mcp/handlers/reconciliation.js +224 -0
  211. package/claude/src/mcp/handlers/resolve-settings.js +39 -0
  212. package/claude/src/mcp/handlers/session-state-core.js +108 -0
  213. package/claude/src/mcp/handlers/session-state-tools.js +562 -0
  214. package/claude/src/mcp/handlers/validate-plan.js +76 -0
  215. package/claude/src/mcp/maestro-server.js +122 -0
  216. package/claude/src/mcp/runtime/runtime-config-map.js +70 -0
  217. package/claude/src/mcp/tool-packs/content/index.js +80 -0
  218. package/claude/src/mcp/tool-packs/contracts.js +30 -0
  219. package/claude/src/mcp/tool-packs/index.js +15 -0
  220. package/claude/src/mcp/tool-packs/session/index.js +243 -0
  221. package/claude/src/mcp/tool-packs/workspace/index.js +98 -0
  222. package/claude/src/mcp/utils/extension-root.js +31 -0
  223. package/claude/src/mcp/validation/agent-checker.js +81 -0
  224. package/claude/src/mcp/validation/dag-checker.js +214 -0
  225. package/claude/src/mcp/validation/file-overlap-checker.js +63 -0
  226. package/claude/src/mcp/validation/schema-checker.js +108 -0
  227. package/claude/src/platforms/claude/runtime-config.js +60 -0
  228. package/claude/src/platforms/shared/adapters/claude-adapter.js +36 -0
  229. package/claude/src/platforms/shared/adapters/conventions.js +29 -0
  230. package/claude/src/platforms/shared/adapters/exit-codes.js +6 -0
  231. package/claude/src/platforms/shared/adapters/factory.js +40 -0
  232. package/claude/src/platforms/shared/agent-names.js +10 -0
  233. package/claude/src/platforms/shared/hook-runner.js +52 -0
  234. package/claude/src/references/architecture.md +139 -0
  235. package/claude/src/references/orchestration-steps.md +193 -0
  236. package/claude/src/skills/shared/code-review/SKILL.md +145 -0
  237. package/claude/src/skills/shared/delegation/SKILL.md +370 -0
  238. package/claude/src/skills/shared/delegation/protocols/agent-base-protocol.md +145 -0
  239. package/claude/src/skills/shared/delegation/protocols/filesystem-safety-protocol.md +31 -0
  240. package/claude/src/skills/shared/design-dialogue/SKILL.md +284 -0
  241. package/claude/src/skills/shared/execution/SKILL.md +258 -0
  242. package/claude/src/skills/shared/implementation-planning/SKILL.md +303 -0
  243. package/claude/src/skills/shared/session-management/SKILL.md +314 -0
  244. package/claude/src/skills/shared/validation/SKILL.md +204 -0
  245. package/claude/src/state/session-state.js +113 -0
  246. package/claude/src/templates/design-document.md +95 -0
  247. package/claude/src/templates/implementation-plan.md +86 -0
  248. package/claude/src/templates/session-state.md +68 -0
  249. package/claude/src/version.json +3 -0
  250. package/commands/maestro/a11y-audit.toml +22 -0
  251. package/commands/maestro/archive.toml +23 -0
  252. package/commands/maestro/compliance-check.toml +22 -0
  253. package/commands/maestro/debug.toml +23 -0
  254. package/commands/maestro/execute.toml +30 -0
  255. package/commands/maestro/orchestrate.toml +30 -0
  256. package/commands/maestro/perf-check.toml +22 -0
  257. package/commands/maestro/resume.toml +38 -0
  258. package/commands/maestro/review.toml +23 -0
  259. package/commands/maestro/security-audit.toml +24 -0
  260. package/commands/maestro/seo-audit.toml +22 -0
  261. package/commands/maestro/status.toml +21 -0
  262. package/docs/architecture.md +310 -0
  263. package/docs/cicd.md +647 -0
  264. package/docs/flow.md +255 -0
  265. package/docs/maestro-cheatsheet.md +199 -0
  266. package/docs/overview.md +141 -0
  267. package/docs/runtime-claude.md +190 -0
  268. package/docs/runtime-codex.md +197 -0
  269. package/docs/runtime-gemini.md +170 -0
  270. package/docs/runtime-qwen.md +147 -0
  271. package/docs/usage.md +312 -0
  272. package/gemini-extension.json +55 -0
  273. package/hooks/adapters/gemini-adapter.js +2 -0
  274. package/hooks/adapters/qwen-adapter.js +2 -0
  275. package/hooks/hook-runner.js +3 -0
  276. package/hooks/hooks.json +56 -0
  277. package/mcp/maestro-server.js +4 -0
  278. package/package.json +93 -0
  279. package/plugins/maestro/.app.json +3 -0
  280. package/plugins/maestro/.codex-plugin/plugin.json +41 -0
  281. package/plugins/maestro/.mcp.json +16 -0
  282. package/plugins/maestro/README.md +57 -0
  283. package/plugins/maestro/references/runtime-guide.md +125 -0
  284. package/plugins/maestro/skills/a11y-audit/SKILL.md +16 -0
  285. package/plugins/maestro/skills/archive/SKILL.md +16 -0
  286. package/plugins/maestro/skills/code-review/SKILL.md +6 -0
  287. package/plugins/maestro/skills/compliance-check/SKILL.md +16 -0
  288. package/plugins/maestro/skills/debug-workflow/SKILL.md +16 -0
  289. package/plugins/maestro/skills/delegation/SKILL.md +6 -0
  290. package/plugins/maestro/skills/design-dialogue/SKILL.md +6 -0
  291. package/plugins/maestro/skills/execute/SKILL.md +16 -0
  292. package/plugins/maestro/skills/execution/SKILL.md +6 -0
  293. package/plugins/maestro/skills/implementation-planning/SKILL.md +6 -0
  294. package/plugins/maestro/skills/orchestrate/SKILL.md +16 -0
  295. package/plugins/maestro/skills/perf-check/SKILL.md +16 -0
  296. package/plugins/maestro/skills/resume-session/SKILL.md +16 -0
  297. package/plugins/maestro/skills/review-code/SKILL.md +16 -0
  298. package/plugins/maestro/skills/security-audit/SKILL.md +16 -0
  299. package/plugins/maestro/skills/seo-audit/SKILL.md +16 -0
  300. package/plugins/maestro/skills/session-management/SKILL.md +6 -0
  301. package/plugins/maestro/skills/status/SKILL.md +14 -0
  302. package/plugins/maestro/skills/validation/SKILL.md +6 -0
  303. package/plugins/maestro/src/agents/accessibility-specialist.md +163 -0
  304. package/plugins/maestro/src/agents/analytics-engineer.md +182 -0
  305. package/plugins/maestro/src/agents/api-designer.md +124 -0
  306. package/plugins/maestro/src/agents/architect.md +120 -0
  307. package/plugins/maestro/src/agents/cloud-architect.md +134 -0
  308. package/plugins/maestro/src/agents/cobol-engineer.md +127 -0
  309. package/plugins/maestro/src/agents/code-reviewer.md +123 -0
  310. package/plugins/maestro/src/agents/coder.md +132 -0
  311. package/plugins/maestro/src/agents/compliance-reviewer.md +219 -0
  312. package/plugins/maestro/src/agents/content-strategist.md +111 -0
  313. package/plugins/maestro/src/agents/copywriter.md +113 -0
  314. package/plugins/maestro/src/agents/data-engineer.md +130 -0
  315. package/plugins/maestro/src/agents/database-administrator.md +126 -0
  316. package/plugins/maestro/src/agents/db2-dba.md +124 -0
  317. package/plugins/maestro/src/agents/debugger.md +133 -0
  318. package/plugins/maestro/src/agents/design-system-engineer.md +258 -0
  319. package/plugins/maestro/src/agents/devops-engineer.md +138 -0
  320. package/plugins/maestro/src/agents/hlasm-assembler-specialist.md +134 -0
  321. package/plugins/maestro/src/agents/i18n-specialist.md +241 -0
  322. package/plugins/maestro/src/agents/ibm-i-specialist.md +132 -0
  323. package/plugins/maestro/src/agents/integration-engineer.md +133 -0
  324. package/plugins/maestro/src/agents/ml-engineer.md +115 -0
  325. package/plugins/maestro/src/agents/mlops-engineer.md +116 -0
  326. package/plugins/maestro/src/agents/mobile-engineer.md +115 -0
  327. package/plugins/maestro/src/agents/observability-engineer.md +133 -0
  328. package/plugins/maestro/src/agents/performance-engineer.md +139 -0
  329. package/plugins/maestro/src/agents/platform-engineer.md +129 -0
  330. package/plugins/maestro/src/agents/product-manager.md +170 -0
  331. package/plugins/maestro/src/agents/prompt-engineer.md +129 -0
  332. package/plugins/maestro/src/agents/refactor.md +138 -0
  333. package/plugins/maestro/src/agents/release-manager.md +132 -0
  334. package/plugins/maestro/src/agents/security-engineer.md +143 -0
  335. package/plugins/maestro/src/agents/seo-specialist.md +129 -0
  336. package/plugins/maestro/src/agents/site-reliability-engineer.md +131 -0
  337. package/plugins/maestro/src/agents/solutions-architect.md +137 -0
  338. package/plugins/maestro/src/agents/technical-writer.md +129 -0
  339. package/plugins/maestro/src/agents/tester.md +135 -0
  340. package/plugins/maestro/src/agents/ux-designer.md +168 -0
  341. package/plugins/maestro/src/agents/zos-sysprog.md +134 -0
  342. package/plugins/maestro/src/config/setting-resolver.js +32 -0
  343. package/plugins/maestro/src/core/agent-registry.js +67 -0
  344. package/plugins/maestro/src/core/canonical-source.js +39 -0
  345. package/plugins/maestro/src/core/env-file-parser.js +82 -0
  346. package/plugins/maestro/src/core/feature-blocks.js +34 -0
  347. package/plugins/maestro/src/core/logger.js +12 -0
  348. package/plugins/maestro/src/core/markdown-state.js +36 -0
  349. package/plugins/maestro/src/core/policy-rules.js +32 -0
  350. package/plugins/maestro/src/core/project-root-resolver.js +184 -0
  351. package/plugins/maestro/src/core/stdin-reader.js +77 -0
  352. package/plugins/maestro/src/core/version.js +50 -0
  353. package/plugins/maestro/src/entry-points/core-command-registry.js +37 -0
  354. package/plugins/maestro/src/entry-points/preamble-builders.js +54 -0
  355. package/plugins/maestro/src/entry-points/registry.js +199 -0
  356. package/plugins/maestro/src/entry-points/templates/claude-core-command.md.tmpl +38 -0
  357. package/plugins/maestro/src/entry-points/templates/claude-skill.md.tmpl +18 -0
  358. package/plugins/maestro/src/entry-points/templates/codex-core-command.md.tmpl +16 -0
  359. package/plugins/maestro/src/entry-points/templates/codex-skill.md.tmpl +11 -0
  360. package/plugins/maestro/src/entry-points/templates/gemini-command.toml.tmpl +17 -0
  361. package/plugins/maestro/src/entry-points/templates/gemini-core-command.toml.tmpl +30 -0
  362. package/plugins/maestro/src/generated/agent-registry.json +630 -0
  363. package/plugins/maestro/src/generated/hook-registry.json +18 -0
  364. package/plugins/maestro/src/generated/resource-registry.json +16 -0
  365. package/plugins/maestro/src/hooks/logic/after-agent-logic.js +54 -0
  366. package/plugins/maestro/src/hooks/logic/before-agent-logic.js +57 -0
  367. package/plugins/maestro/src/hooks/logic/hook-state.js +127 -0
  368. package/plugins/maestro/src/hooks/logic/session-end-logic.js +17 -0
  369. package/plugins/maestro/src/hooks/logic/session-start-logic.js +25 -0
  370. package/plugins/maestro/src/lib/discovery/index.js +172 -0
  371. package/plugins/maestro/src/lib/errors/index.js +104 -0
  372. package/plugins/maestro/src/lib/framework-detection.js +50 -0
  373. package/plugins/maestro/src/lib/frontmatter/index.js +262 -0
  374. package/plugins/maestro/src/lib/io/index.js +96 -0
  375. package/plugins/maestro/src/lib/naming/index.js +94 -0
  376. package/plugins/maestro/src/lib/validation/index.js +124 -0
  377. package/plugins/maestro/src/lib/yaml-emit.js +38 -0
  378. package/plugins/maestro/src/mcp/content/provider.js +68 -0
  379. package/plugins/maestro/src/mcp/content/runtime-content.js +188 -0
  380. package/plugins/maestro/src/mcp/contracts/cache-path-rejector.js +39 -0
  381. package/plugins/maestro/src/mcp/contracts/downstream-context.js +106 -0
  382. package/plugins/maestro/src/mcp/contracts/plan-schema.js +148 -0
  383. package/plugins/maestro/src/mcp/contracts/workspace-marker.js +61 -0
  384. package/plugins/maestro/src/mcp/core/create-server.js +76 -0
  385. package/plugins/maestro/src/mcp/core/line-reader.js +35 -0
  386. package/plugins/maestro/src/mcp/core/project-root-cache.js +120 -0
  387. package/plugins/maestro/src/mcp/core/protocol-dispatcher.js +274 -0
  388. package/plugins/maestro/src/mcp/core/recovery-hints.js +43 -0
  389. package/plugins/maestro/src/mcp/core/tool-outcome.js +77 -0
  390. package/plugins/maestro/src/mcp/core/tool-registry.js +82 -0
  391. package/plugins/maestro/src/mcp/handlers/assess-task-complexity.js +108 -0
  392. package/plugins/maestro/src/mcp/handlers/blocker-parser.js +34 -0
  393. package/plugins/maestro/src/mcp/handlers/design-gate.js +393 -0
  394. package/plugins/maestro/src/mcp/handlers/get-agent.js +54 -0
  395. package/plugins/maestro/src/mcp/handlers/get-runtime-context.js +49 -0
  396. package/plugins/maestro/src/mcp/handlers/get-skill-content.js +51 -0
  397. package/plugins/maestro/src/mcp/handlers/initialize-workspace.js +45 -0
  398. package/plugins/maestro/src/mcp/handlers/reconciliation.js +224 -0
  399. package/plugins/maestro/src/mcp/handlers/resolve-settings.js +39 -0
  400. package/plugins/maestro/src/mcp/handlers/session-state-core.js +108 -0
  401. package/plugins/maestro/src/mcp/handlers/session-state-tools.js +562 -0
  402. package/plugins/maestro/src/mcp/handlers/validate-plan.js +76 -0
  403. package/plugins/maestro/src/mcp/maestro-server.js +122 -0
  404. package/plugins/maestro/src/mcp/runtime/runtime-config-map.js +70 -0
  405. package/plugins/maestro/src/mcp/tool-packs/content/index.js +80 -0
  406. package/plugins/maestro/src/mcp/tool-packs/contracts.js +30 -0
  407. package/plugins/maestro/src/mcp/tool-packs/index.js +15 -0
  408. package/plugins/maestro/src/mcp/tool-packs/session/index.js +243 -0
  409. package/plugins/maestro/src/mcp/tool-packs/workspace/index.js +98 -0
  410. package/plugins/maestro/src/mcp/utils/extension-root.js +31 -0
  411. package/plugins/maestro/src/mcp/validation/agent-checker.js +81 -0
  412. package/plugins/maestro/src/mcp/validation/dag-checker.js +214 -0
  413. package/plugins/maestro/src/mcp/validation/file-overlap-checker.js +63 -0
  414. package/plugins/maestro/src/mcp/validation/schema-checker.js +108 -0
  415. package/plugins/maestro/src/platforms/codex/runtime-config.js +58 -0
  416. package/plugins/maestro/src/platforms/shared/adapters/conventions.js +29 -0
  417. package/plugins/maestro/src/platforms/shared/adapters/exit-codes.js +6 -0
  418. package/plugins/maestro/src/platforms/shared/adapters/factory.js +40 -0
  419. package/plugins/maestro/src/platforms/shared/agent-names.js +10 -0
  420. package/plugins/maestro/src/platforms/shared/hook-runner.js +52 -0
  421. package/plugins/maestro/src/references/architecture.md +139 -0
  422. package/plugins/maestro/src/references/orchestration-steps.md +193 -0
  423. package/plugins/maestro/src/skills/shared/code-review/SKILL.md +145 -0
  424. package/plugins/maestro/src/skills/shared/delegation/SKILL.md +370 -0
  425. package/plugins/maestro/src/skills/shared/delegation/protocols/agent-base-protocol.md +145 -0
  426. package/plugins/maestro/src/skills/shared/delegation/protocols/filesystem-safety-protocol.md +31 -0
  427. package/plugins/maestro/src/skills/shared/design-dialogue/SKILL.md +284 -0
  428. package/plugins/maestro/src/skills/shared/execution/SKILL.md +258 -0
  429. package/plugins/maestro/src/skills/shared/implementation-planning/SKILL.md +303 -0
  430. package/plugins/maestro/src/skills/shared/session-management/SKILL.md +314 -0
  431. package/plugins/maestro/src/skills/shared/validation/SKILL.md +204 -0
  432. package/plugins/maestro/src/state/session-state.js +113 -0
  433. package/plugins/maestro/src/templates/design-document.md +95 -0
  434. package/plugins/maestro/src/templates/implementation-plan.md +86 -0
  435. package/plugins/maestro/src/templates/session-state.md +68 -0
  436. package/plugins/maestro/src/version.json +3 -0
  437. package/policies/maestro.toml +44 -0
  438. package/qwen/agents/accessibility_specialist.md +18 -0
  439. package/qwen/agents/analytics_engineer.md +20 -0
  440. package/qwen/agents/api_designer.md +17 -0
  441. package/qwen/agents/architect.md +17 -0
  442. package/qwen/agents/cloud_architect.md +17 -0
  443. package/qwen/agents/cobol_engineer.md +20 -0
  444. package/qwen/agents/code_reviewer.md +15 -0
  445. package/qwen/agents/coder.md +20 -0
  446. package/qwen/agents/compliance_reviewer.md +17 -0
  447. package/qwen/agents/content_strategist.md +17 -0
  448. package/qwen/agents/copywriter.md +17 -0
  449. package/qwen/agents/data_engineer.md +20 -0
  450. package/qwen/agents/database_administrator.md +19 -0
  451. package/qwen/agents/db2_dba.md +19 -0
  452. package/qwen/agents/debugger.md +17 -0
  453. package/qwen/agents/design_system_engineer.md +20 -0
  454. package/qwen/agents/devops_engineer.md +21 -0
  455. package/qwen/agents/hlasm_assembler_specialist.md +20 -0
  456. package/qwen/agents/i18n_specialist.md +19 -0
  457. package/qwen/agents/ibm_i_specialist.md +20 -0
  458. package/qwen/agents/integration_engineer.md +21 -0
  459. package/qwen/agents/ml_engineer.md +21 -0
  460. package/qwen/agents/mlops_engineer.md +21 -0
  461. package/qwen/agents/mobile_engineer.md +21 -0
  462. package/qwen/agents/observability_engineer.md +21 -0
  463. package/qwen/agents/performance_engineer.md +19 -0
  464. package/qwen/agents/platform_engineer.md +22 -0
  465. package/qwen/agents/product_manager.md +18 -0
  466. package/qwen/agents/prompt_engineer.md +20 -0
  467. package/qwen/agents/refactor.md +20 -0
  468. package/qwen/agents/release_manager.md +20 -0
  469. package/qwen/agents/security_engineer.md +19 -0
  470. package/qwen/agents/seo_specialist.md +19 -0
  471. package/qwen/agents/site_reliability_engineer.md +19 -0
  472. package/qwen/agents/solutions_architect.md +17 -0
  473. package/qwen/agents/technical_writer.md +19 -0
  474. package/qwen/agents/tester.md +21 -0
  475. package/qwen/agents/ux_designer.md +18 -0
  476. package/qwen/agents/zos_sysprog.md +19 -0
  477. package/qwen/hooks.json +56 -0
  478. package/qwen-extension.json +55 -0
  479. package/scripts/check-layer-boundaries.js +74 -0
  480. package/scripts/generate.js +155 -0
  481. package/scripts/install-codex-plugin.js +167 -0
  482. package/scripts/install-git-hooks.js +43 -0
  483. package/scripts/npm-publish-idempotent.js +150 -0
  484. package/scripts/package-release-artifacts.js +156 -0
  485. package/scripts/release-artifact-manifest.js +378 -0
  486. package/scripts/release-version-metadata.js +129 -0
  487. package/scripts/update-versions.js +33 -0
  488. package/scripts/verify-npm-pack.js +85 -0
  489. package/scripts/verify-release-artifacts.js +95 -0
  490. package/src/agents/accessibility-specialist.md +163 -0
  491. package/src/agents/analytics-engineer.md +182 -0
  492. package/src/agents/api-designer.md +124 -0
  493. package/src/agents/architect.md +120 -0
  494. package/src/agents/cloud-architect.md +134 -0
  495. package/src/agents/cobol-engineer.md +127 -0
  496. package/src/agents/code-reviewer.md +123 -0
  497. package/src/agents/coder.md +132 -0
  498. package/src/agents/compliance-reviewer.md +219 -0
  499. package/src/agents/content-strategist.md +111 -0
  500. package/src/agents/copywriter.md +113 -0
  501. package/src/agents/data-engineer.md +130 -0
  502. package/src/agents/database-administrator.md +126 -0
  503. package/src/agents/db2-dba.md +124 -0
  504. package/src/agents/debugger.md +133 -0
  505. package/src/agents/design-system-engineer.md +258 -0
  506. package/src/agents/devops-engineer.md +138 -0
  507. package/src/agents/hlasm-assembler-specialist.md +134 -0
  508. package/src/agents/i18n-specialist.md +241 -0
  509. package/src/agents/ibm-i-specialist.md +132 -0
  510. package/src/agents/integration-engineer.md +133 -0
  511. package/src/agents/ml-engineer.md +115 -0
  512. package/src/agents/mlops-engineer.md +116 -0
  513. package/src/agents/mobile-engineer.md +115 -0
  514. package/src/agents/observability-engineer.md +133 -0
  515. package/src/agents/performance-engineer.md +139 -0
  516. package/src/agents/platform-engineer.md +129 -0
  517. package/src/agents/product-manager.md +170 -0
  518. package/src/agents/prompt-engineer.md +129 -0
  519. package/src/agents/refactor.md +138 -0
  520. package/src/agents/release-manager.md +132 -0
  521. package/src/agents/security-engineer.md +143 -0
  522. package/src/agents/seo-specialist.md +129 -0
  523. package/src/agents/site-reliability-engineer.md +131 -0
  524. package/src/agents/solutions-architect.md +137 -0
  525. package/src/agents/technical-writer.md +129 -0
  526. package/src/agents/tester.md +135 -0
  527. package/src/agents/ux-designer.md +168 -0
  528. package/src/agents/zos-sysprog.md +134 -0
  529. package/src/config/setting-resolver.js +32 -0
  530. package/src/core/agent-registry.js +67 -0
  531. package/src/core/canonical-source.js +39 -0
  532. package/src/core/env-file-parser.js +82 -0
  533. package/src/core/feature-blocks.js +34 -0
  534. package/src/core/logger.js +12 -0
  535. package/src/core/markdown-state.js +36 -0
  536. package/src/core/policy-rules.js +32 -0
  537. package/src/core/project-root-resolver.js +184 -0
  538. package/src/core/stdin-reader.js +77 -0
  539. package/src/core/version.js +50 -0
  540. package/src/entry-points/core-command-registry.js +37 -0
  541. package/src/entry-points/preamble-builders.js +54 -0
  542. package/src/entry-points/registry.js +199 -0
  543. package/src/entry-points/templates/claude-core-command.md.tmpl +38 -0
  544. package/src/entry-points/templates/claude-skill.md.tmpl +18 -0
  545. package/src/entry-points/templates/codex-core-command.md.tmpl +16 -0
  546. package/src/entry-points/templates/codex-skill.md.tmpl +11 -0
  547. package/src/entry-points/templates/gemini-command.toml.tmpl +17 -0
  548. package/src/entry-points/templates/gemini-core-command.toml.tmpl +30 -0
  549. package/src/generated/agent-registry.json +630 -0
  550. package/src/generated/hook-registry.json +18 -0
  551. package/src/generated/resource-registry.json +16 -0
  552. package/src/generator/entry-point-expander.js +182 -0
  553. package/src/generator/file-writer.js +167 -0
  554. package/src/generator/generation-session.js +62 -0
  555. package/src/generator/manifest-curator.js +31 -0
  556. package/src/generator/manifest-expander.js +256 -0
  557. package/src/generator/payload-builder.js +217 -0
  558. package/src/generator/registry-scanner.js +130 -0
  559. package/src/generator/stale-pruner.js +101 -0
  560. package/src/hooks/logic/after-agent-logic.js +54 -0
  561. package/src/hooks/logic/before-agent-logic.js +57 -0
  562. package/src/hooks/logic/hook-state.js +127 -0
  563. package/src/hooks/logic/session-end-logic.js +17 -0
  564. package/src/hooks/logic/session-start-logic.js +25 -0
  565. package/src/lib/discovery/index.js +172 -0
  566. package/src/lib/errors/index.js +104 -0
  567. package/src/lib/framework-detection.js +50 -0
  568. package/src/lib/frontmatter/index.js +262 -0
  569. package/src/lib/io/index.js +96 -0
  570. package/src/lib/naming/index.js +94 -0
  571. package/src/lib/validation/index.js +124 -0
  572. package/src/lib/yaml-emit.js +38 -0
  573. package/src/manifest.js +11 -0
  574. package/src/mcp/content/provider.js +68 -0
  575. package/src/mcp/content/runtime-content.js +188 -0
  576. package/src/mcp/contracts/cache-path-rejector.js +39 -0
  577. package/src/mcp/contracts/downstream-context.js +106 -0
  578. package/src/mcp/contracts/plan-schema.js +148 -0
  579. package/src/mcp/contracts/workspace-marker.js +61 -0
  580. package/src/mcp/core/create-server.js +76 -0
  581. package/src/mcp/core/line-reader.js +35 -0
  582. package/src/mcp/core/project-root-cache.js +120 -0
  583. package/src/mcp/core/protocol-dispatcher.js +274 -0
  584. package/src/mcp/core/recovery-hints.js +43 -0
  585. package/src/mcp/core/tool-outcome.js +77 -0
  586. package/src/mcp/core/tool-registry.js +82 -0
  587. package/src/mcp/handlers/assess-task-complexity.js +108 -0
  588. package/src/mcp/handlers/blocker-parser.js +34 -0
  589. package/src/mcp/handlers/design-gate.js +393 -0
  590. package/src/mcp/handlers/get-agent.js +54 -0
  591. package/src/mcp/handlers/get-runtime-context.js +49 -0
  592. package/src/mcp/handlers/get-skill-content.js +51 -0
  593. package/src/mcp/handlers/initialize-workspace.js +45 -0
  594. package/src/mcp/handlers/reconciliation.js +224 -0
  595. package/src/mcp/handlers/resolve-settings.js +39 -0
  596. package/src/mcp/handlers/session-state-core.js +108 -0
  597. package/src/mcp/handlers/session-state-tools.js +562 -0
  598. package/src/mcp/handlers/validate-plan.js +76 -0
  599. package/src/mcp/maestro-server.js +122 -0
  600. package/src/mcp/runtime/runtime-config-map.js +70 -0
  601. package/src/mcp/tool-packs/content/index.js +80 -0
  602. package/src/mcp/tool-packs/contracts.js +30 -0
  603. package/src/mcp/tool-packs/index.js +15 -0
  604. package/src/mcp/tool-packs/session/index.js +243 -0
  605. package/src/mcp/tool-packs/workspace/index.js +98 -0
  606. package/src/mcp/utils/extension-root.js +31 -0
  607. package/src/mcp/validation/agent-checker.js +81 -0
  608. package/src/mcp/validation/dag-checker.js +214 -0
  609. package/src/mcp/validation/file-overlap-checker.js +63 -0
  610. package/src/mcp/validation/schema-checker.js +108 -0
  611. package/src/platforms/claude/metadata.js +96 -0
  612. package/src/platforms/claude/runtime-config.js +60 -0
  613. package/src/platforms/codex/metadata.js +107 -0
  614. package/src/platforms/codex/runtime-config.js +58 -0
  615. package/src/platforms/gemini/metadata.js +27 -0
  616. package/src/platforms/gemini/runtime-config.js +62 -0
  617. package/src/platforms/metadata-shared.js +131 -0
  618. package/src/platforms/metadata.js +29 -0
  619. package/src/platforms/qwen/metadata.js +27 -0
  620. package/src/platforms/qwen/runtime-config.js +62 -0
  621. package/src/platforms/shared/adapters/claude-adapter.js +36 -0
  622. package/src/platforms/shared/adapters/conventions.js +29 -0
  623. package/src/platforms/shared/adapters/exit-codes.js +6 -0
  624. package/src/platforms/shared/adapters/factory.js +40 -0
  625. package/src/platforms/shared/adapters/gemini-adapter.js +34 -0
  626. package/src/platforms/shared/adapters/qwen-adapter.js +93 -0
  627. package/src/platforms/shared/agent-names.js +10 -0
  628. package/src/platforms/shared/hook-runner.js +52 -0
  629. package/src/references/architecture.md +139 -0
  630. package/src/references/orchestration-steps.md +193 -0
  631. package/src/scripts/ensure-workspace.js +14 -0
  632. package/src/scripts/read-active-session.js +26 -0
  633. package/src/scripts/read-setting.js +18 -0
  634. package/src/scripts/read-state.js +17 -0
  635. package/src/scripts/write-state.js +22 -0
  636. package/src/skills/shared/code-review/SKILL.md +145 -0
  637. package/src/skills/shared/delegation/SKILL.md +370 -0
  638. package/src/skills/shared/delegation/protocols/agent-base-protocol.md +145 -0
  639. package/src/skills/shared/delegation/protocols/filesystem-safety-protocol.md +31 -0
  640. package/src/skills/shared/design-dialogue/SKILL.md +284 -0
  641. package/src/skills/shared/execution/SKILL.md +258 -0
  642. package/src/skills/shared/implementation-planning/SKILL.md +303 -0
  643. package/src/skills/shared/session-management/SKILL.md +314 -0
  644. package/src/skills/shared/validation/SKILL.md +204 -0
  645. package/src/state/session-state.js +113 -0
  646. package/src/templates/design-document.md +95 -0
  647. package/src/templates/implementation-plan.md +86 -0
  648. package/src/templates/session-state.md +68 -0
  649. package/src/transforms/agent-stub.js +29 -0
  650. package/src/transforms/extract-examples.js +63 -0
  651. package/src/transforms/index.js +35 -0
  652. package/src/transforms/parse-frontmatter.js +23 -0
  653. package/src/transforms/rebuild-frontmatter.js +147 -0
  654. package/src/transforms/skill-discovery-stub.js +27 -0
  655. package/src/transforms/skill-metadata.js +14 -0
@@ -0,0 +1,393 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+
6
+ const { assertSessionId } = require('../../lib/validation');
7
+ const { ValidationError } = require('../../lib/errors');
8
+ const { resolveStateDirPath } = require('../../state/session-state');
9
+ const { atomicWriteSync } = require('../../lib/io');
10
+
11
+ const GATE_FILENAME = '.design-gate.json';
12
+
13
+ /**
14
+ * Resolves the filesystem path for the gate file for a given session.
15
+ * @param {string} projectRoot
16
+ * @param {string} sessionId
17
+ * @returns {string}
18
+ */
19
+ function gatePath(projectRoot, sessionId) {
20
+ const stateDir = resolveStateDirPath(projectRoot);
21
+ return path.join(stateDir, 'state', `${sessionId}${GATE_FILENAME}`);
22
+ }
23
+
24
+ /**
25
+ * Canonical location where approved design documents live. Runtimes (including
26
+ * Plan Mode) may write design docs to arbitrary temporary locations; this
27
+ * function is the single source of truth for the post-approval location so the
28
+ * archive flow can reliably find and move the document.
29
+ *
30
+ * @param {string} projectRoot
31
+ * @returns {string}
32
+ */
33
+ function plansDirPath(projectRoot) {
34
+ return path.join(resolveStateDirPath(projectRoot), 'plans');
35
+ }
36
+
37
+ /**
38
+ * Copy a design document to `<state_dir>/plans/<basename>` when it isn't
39
+ * already there. Idempotent: returns the in-plans path regardless of whether a
40
+ * copy was needed. Preserves the source file so runtime-managed tmp locations
41
+ * (Plan Mode) remain intact.
42
+ *
43
+ * @param {string} projectRoot
44
+ * @param {string} sourcePath - absolute path to the approved design document
45
+ * @returns {string} absolute path to the canonical location inside plans/
46
+ */
47
+ function ensureDesignDocumentInPlans(projectRoot, sourcePath) {
48
+ const plansDir = plansDirPath(projectRoot);
49
+ const resolvedPlansDir = path.resolve(plansDir) + path.sep;
50
+ const resolvedSource = path.resolve(sourcePath);
51
+
52
+ if (resolvedSource.startsWith(resolvedPlansDir)) {
53
+ return resolvedSource;
54
+ }
55
+
56
+ fs.mkdirSync(plansDir, { recursive: true });
57
+ const destination = path.join(plansDir, path.basename(resolvedSource));
58
+ fs.copyFileSync(resolvedSource, destination);
59
+ return destination;
60
+ }
61
+
62
+ /**
63
+ * Validate that a caller-provided filename is safe to join into the plans
64
+ * directory. Rejects anything that could escape the directory or collide with a
65
+ * nested path.
66
+ *
67
+ * @param {string} filename
68
+ * @param {string} paramName - name of the parameter for error messages (e.g. "design_document_filename")
69
+ * @throws {ValidationError}
70
+ */
71
+ function assertPlansFilename(filename, paramName) {
72
+ if (typeof filename !== 'string' || filename.length === 0) {
73
+ throw new ValidationError(`${paramName} is required`);
74
+ }
75
+ if (filename.includes('\0')) {
76
+ throw new ValidationError(`${paramName} contains null bytes`, {
77
+ details: { value: filename },
78
+ });
79
+ }
80
+ if (filename !== path.basename(filename) || filename === '..' || filename === '.') {
81
+ throw new ValidationError(
82
+ `${paramName} must be a pure basename (no path separators, no '.' or '..')`,
83
+ { details: { value: filename } }
84
+ );
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Write caller-supplied document content to `<state_dir>/plans/<filename>`
90
+ * atomically and return the canonical absolute path. The content-based
91
+ * counterpart to `ensureDesignDocumentInPlans` — callers that cannot guarantee
92
+ * filesystem visibility across runtime boundaries (e.g. Gemini Plan Mode writes
93
+ * to `~/.gemini/tmp/...`) use this to bypass path-resolution ambiguity
94
+ * entirely.
95
+ *
96
+ * @param {string} projectRoot
97
+ * @param {string} filename - basename-only, validated via assertPlansFilename
98
+ * @param {string} content - UTF-8 document content
99
+ * @param {string} filenameParam - parameter name for validation errors
100
+ * @returns {string} absolute canonical path inside plans/
101
+ */
102
+ function writePlansDocumentContent(projectRoot, filename, content, filenameParam) {
103
+ assertPlansFilename(filename, filenameParam);
104
+ if (typeof content !== 'string' || content.length === 0) {
105
+ throw new ValidationError(
106
+ `${filenameParam.replace(/_filename$/, '_content')} must be a non-empty string`
107
+ );
108
+ }
109
+ const destination = path.join(plansDirPath(projectRoot), filename);
110
+ atomicWriteSync(destination, content);
111
+ return destination;
112
+ }
113
+
114
+ /**
115
+ * @param {string} projectRoot
116
+ * @param {string} sessionId
117
+ * @returns {{ session_id: string, entered_at: string | null, approved_at: string | null, design_document_path: string | null } | null}
118
+ */
119
+ function readGate(projectRoot, sessionId) {
120
+ const filePath = gatePath(projectRoot, sessionId);
121
+ if (!fs.existsSync(filePath)) return null;
122
+ try {
123
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'));
124
+ } catch {
125
+ return null;
126
+ }
127
+ }
128
+
129
+ /**
130
+ * @param {string} projectRoot
131
+ * @param {string} sessionId
132
+ * @param {object} data
133
+ */
134
+ function writeGate(projectRoot, sessionId, data) {
135
+ const filePath = gatePath(projectRoot, sessionId);
136
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
137
+ atomicWriteSync(filePath, JSON.stringify(data, null, 2));
138
+ }
139
+
140
+ /**
141
+ * @param {{ session_id: string }} params
142
+ * @param {string} projectRoot
143
+ */
144
+ function handleEnterDesignGate(params, projectRoot) {
145
+ assertSessionId(params.session_id);
146
+ const existing = readGate(projectRoot, params.session_id);
147
+ if (existing && existing.entered_at) {
148
+ return { success: true, entered_at: existing.entered_at, already_entered: true };
149
+ }
150
+ const gate = {
151
+ session_id: params.session_id,
152
+ entered_at: new Date().toISOString(),
153
+ approved_at: null,
154
+ design_document_path: null,
155
+ };
156
+ writeGate(projectRoot, params.session_id, gate);
157
+ return { success: true, entered_at: gate.entered_at, already_entered: false };
158
+ }
159
+
160
+ /**
161
+ * Resolve the caller's approved-design input to a canonical absolute path.
162
+ * Accepts exactly one of (design_document_path) or (design_document_content +
163
+ * design_document_filename). The content variant materializes the file
164
+ * immediately inside `<state_dir>/plans/`, eliminating the path-resolution
165
+ * ambiguity that arises when callers write through a runtime surface whose
166
+ * filesystem root differs from the MCP server's workspace (e.g. Gemini Plan
167
+ * Mode writes to `~/.gemini/tmp/<uuid>/...`).
168
+ *
169
+ * @param {object} params
170
+ * @param {string} [params.design_document_path]
171
+ * @param {string} [params.design_document_content]
172
+ * @param {string} [params.design_document_filename]
173
+ * @param {string} projectRoot
174
+ * @returns {string} canonical absolute path of the approved design document
175
+ * @throws {ValidationError} when neither or both input variants are supplied
176
+ */
177
+ function resolveApprovedDesignDocument(params, projectRoot) {
178
+ const hasPath =
179
+ typeof params.design_document_path === 'string' &&
180
+ params.design_document_path.length > 0;
181
+ const hasContent =
182
+ typeof params.design_document_content === 'string' &&
183
+ params.design_document_content.length > 0;
184
+ const hasFilename =
185
+ typeof params.design_document_filename === 'string' &&
186
+ params.design_document_filename.length > 0;
187
+ const contentVariantProvided = hasContent || hasFilename;
188
+
189
+ if (hasPath && contentVariantProvided) {
190
+ throw new ValidationError(
191
+ 'design_document_path is mutually exclusive with design_document_content/design_document_filename'
192
+ );
193
+ }
194
+
195
+ if (contentVariantProvided) {
196
+ if (!hasContent) {
197
+ throw new ValidationError('design_document_content is required');
198
+ }
199
+ if (!hasFilename) {
200
+ throw new ValidationError('design_document_filename is required');
201
+ }
202
+ return writePlansDocumentContent(
203
+ projectRoot,
204
+ params.design_document_filename,
205
+ params.design_document_content,
206
+ 'design_document_filename'
207
+ );
208
+ }
209
+
210
+ if (!hasPath) {
211
+ throw new ValidationError(
212
+ 'record_design_approval requires either design_document_path or both design_document_content and design_document_filename'
213
+ );
214
+ }
215
+
216
+ return path.isAbsolute(params.design_document_path)
217
+ ? params.design_document_path
218
+ : path.join(projectRoot, params.design_document_path);
219
+ }
220
+
221
+ /**
222
+ * @param {{ session_id: string, design_document_path?: string, design_document_content?: string, design_document_filename?: string }} params
223
+ * @param {string} projectRoot
224
+ */
225
+ function handleRecordDesignApproval(params, projectRoot) {
226
+ assertSessionId(params.session_id);
227
+ const absDesignPath = resolveApprovedDesignDocument(params, projectRoot);
228
+
229
+ const gate = readGate(projectRoot, params.session_id) || {
230
+ session_id: params.session_id,
231
+ entered_at: new Date().toISOString(),
232
+ approved_at: null,
233
+ design_document_path: null,
234
+ };
235
+ gate.approved_at = new Date().toISOString();
236
+ gate.design_document_path = absDesignPath;
237
+ writeGate(projectRoot, params.session_id, gate);
238
+
239
+ return {
240
+ success: true,
241
+ entered_at: gate.entered_at,
242
+ approved_at: gate.approved_at,
243
+ design_document_path: absDesignPath,
244
+ };
245
+ }
246
+
247
+ /**
248
+ * @param {{ session_id: string }} params
249
+ * @param {string} projectRoot
250
+ */
251
+ function handleGetDesignGateStatus(params, projectRoot) {
252
+ assertSessionId(params.session_id);
253
+ const gate = readGate(projectRoot, params.session_id);
254
+ if (!gate) {
255
+ return {
256
+ session_id: params.session_id,
257
+ entered_at: null,
258
+ approved_at: null,
259
+ design_document_path: null,
260
+ };
261
+ }
262
+ return gate;
263
+ }
264
+
265
+ /**
266
+ * Returns true when a session has entered the design gate but not yet received approval.
267
+ * Used by create_session (Task 12) to block session creation until the gate is cleared.
268
+ * @param {string} projectRoot
269
+ * @param {string} sessionId
270
+ * @returns {boolean}
271
+ */
272
+ function isDesignGateBlockingCreate(projectRoot, sessionId) {
273
+ const gate = readGate(projectRoot, sessionId);
274
+ if (!gate) return false;
275
+ return !!(gate.entered_at && !gate.approved_at);
276
+ }
277
+
278
+ /**
279
+ * Returns true when a gate artifact exists on disk for the given session_id,
280
+ * regardless of whether it is approved. Used by the orphan-gate guard in
281
+ * create_session to distinguish "orchestrator never entered this session's
282
+ * gate" from "orchestrator is in the normal approve-then-create flow".
283
+ * @param {string} projectRoot
284
+ * @param {string} sessionId
285
+ * @returns {boolean}
286
+ */
287
+ function hasDesignGate(projectRoot, sessionId) {
288
+ return readGate(projectRoot, sessionId) !== null;
289
+ }
290
+
291
+ /**
292
+ * Read the design document path persisted on the gate after approval. Used by
293
+ * create_session to auto-populate `state.design_document` when the orchestrator
294
+ * does not pass it explicitly — avoids losing the document during archival.
295
+ * @param {string} projectRoot
296
+ * @param {string} sessionId
297
+ * @returns {string | null}
298
+ */
299
+ function getApprovedDesignDocumentPath(projectRoot, sessionId) {
300
+ const gate = readGate(projectRoot, sessionId);
301
+ if (!gate || !gate.approved_at) return null;
302
+ return gate.design_document_path || null;
303
+ }
304
+
305
+ /**
306
+ * Enumerate every approved design gate currently persisted in the workspace.
307
+ * Reads the `state/` directory once and parses each `<session_id>.design-gate.json`
308
+ * artifact. Corrupt or unapproved gate files are skipped silently. Used by
309
+ * create_session to detect session_id drift across the enter_design_gate →
310
+ * record_design_approval → create_session sequence.
311
+ *
312
+ * @param {string} projectRoot
313
+ * @returns {Array<{session_id: string, approved_at: string, design_document_path: string | null}>}
314
+ */
315
+ function listApprovedGates(projectRoot) {
316
+ const stateDir = path.join(resolveStateDirPath(projectRoot), 'state');
317
+ if (!fs.existsSync(stateDir)) return [];
318
+ let entries;
319
+ try {
320
+ entries = fs.readdirSync(stateDir);
321
+ } catch {
322
+ return [];
323
+ }
324
+ const gates = [];
325
+ for (const entry of entries) {
326
+ if (!entry.endsWith(GATE_FILENAME)) continue;
327
+ const sessionId = entry.slice(0, -GATE_FILENAME.length);
328
+ if (sessionId.length === 0) continue;
329
+ const filePath = path.join(stateDir, entry);
330
+ try {
331
+ const gate = JSON.parse(fs.readFileSync(filePath, 'utf8'));
332
+ if (gate && typeof gate.approved_at === 'string' && gate.approved_at.length > 0) {
333
+ gates.push({
334
+ session_id: sessionId,
335
+ approved_at: gate.approved_at,
336
+ design_document_path: gate.design_document_path || null,
337
+ });
338
+ }
339
+ } catch {
340
+ // unreadable or corrupt gate — skip; detection is best-effort.
341
+ }
342
+ }
343
+ return gates;
344
+ }
345
+
346
+ /**
347
+ * Find approved design gates whose session_id does not match the caller's.
348
+ * The orchestrator must use a single session_id from enter_design_gate through
349
+ * archive_session; a mismatched approved gate signals either (a) an in-flight
350
+ * workflow the caller forgot to continue with the original id or (b) an
351
+ * abandoned prior run. create_session uses this to fail fast rather than
352
+ * silently discard the approved design document.
353
+ *
354
+ * @param {string} projectRoot
355
+ * @param {string} currentSessionId
356
+ * @returns {Array<{session_id: string, approved_at: string, design_document_path: string | null}>}
357
+ */
358
+ function findOrphanedApprovedGates(projectRoot, currentSessionId) {
359
+ return listApprovedGates(projectRoot).filter(
360
+ (gate) => gate.session_id !== currentSessionId
361
+ );
362
+ }
363
+
364
+ /**
365
+ * Remove the design-gate artifact for a session. Called by archive_session so
366
+ * the gate doesn't linger in state/ after the session is archived — otherwise
367
+ * a future session reusing the same id would inherit a stale "already approved"
368
+ * gate from the prior run.
369
+ * @param {string} projectRoot
370
+ * @param {string} sessionId
371
+ * @returns {string | null} path of the removed gate file, or null if no gate existed
372
+ */
373
+ function removeDesignGate(projectRoot, sessionId) {
374
+ const filePath = gatePath(projectRoot, sessionId);
375
+ if (!fs.existsSync(filePath)) return null;
376
+ fs.unlinkSync(filePath);
377
+ return filePath;
378
+ }
379
+
380
+ module.exports = {
381
+ handleEnterDesignGate,
382
+ handleRecordDesignApproval,
383
+ handleGetDesignGateStatus,
384
+ isDesignGateBlockingCreate,
385
+ hasDesignGate,
386
+ getApprovedDesignDocumentPath,
387
+ listApprovedGates,
388
+ findOrphanedApprovedGates,
389
+ ensureDesignDocumentInPlans,
390
+ writePlansDocumentContent,
391
+ plansDirPath,
392
+ removeDesignGate,
393
+ };
@@ -0,0 +1,54 @@
1
+ 'use strict';
2
+
3
+ const { DEFAULT_RUNTIME_CONFIG } = require('./get-skill-content');
4
+ const { AGENT_ALLOWLIST } = require('../content/runtime-content');
5
+ const { createContentProvider } = require('../content/provider');
6
+ const { ValidationError } = require('../../lib/errors');
7
+ const { toSnakeCase, toKebabCase } = require('../../lib/naming');
8
+
9
+ function createHandler(runtimeConfig = DEFAULT_RUNTIME_CONFIG, canonicalSrcRoot) {
10
+ return function handleGetAgent(params) {
11
+ const requestedAgents = params.agents;
12
+ if (!Array.isArray(requestedAgents) || requestedAgents.length === 0) {
13
+ throw new ValidationError('agents must be a non-empty array of agent identifiers');
14
+ }
15
+
16
+ const provider = createContentProvider(runtimeConfig, canonicalSrcRoot);
17
+ const agents = {};
18
+ const errors = {};
19
+
20
+ for (const rawName of requestedAgents) {
21
+ const inputName = String(rawName || '').trim();
22
+ const canonicalName = toKebabCase(inputName);
23
+
24
+ if (!AGENT_ALLOWLIST.includes(canonicalName)) {
25
+ errors[inputName || '(empty)'] =
26
+ `Unknown agent identifier: "${inputName}". Known identifiers: ${AGENT_ALLOWLIST.join(', ')}`;
27
+ continue;
28
+ }
29
+
30
+ const result = provider.readAgent(canonicalName);
31
+ if (result.error) {
32
+ errors[inputName] = result.error;
33
+ continue;
34
+ }
35
+
36
+ const toolName =
37
+ runtimeConfig.agentNaming === 'snake_case'
38
+ ? toSnakeCase(canonicalName)
39
+ : canonicalName;
40
+
41
+ agents[inputName] = { ...result.agent, tool_name: toolName };
42
+ }
43
+
44
+ return { agents, errors };
45
+ };
46
+ }
47
+
48
+ const handleGetAgent = createHandler();
49
+
50
+ module.exports = {
51
+ AGENT_ALLOWLIST,
52
+ createHandler,
53
+ handleGetAgent,
54
+ };
@@ -0,0 +1,49 @@
1
+ 'use strict';
2
+
3
+ const { KNOWN_AGENTS, AGENT_CAPABILITIES } = require('../../core/agent-registry');
4
+ const { normalizeRuntimeConfig } = require('../runtime/runtime-config-map');
5
+ const { toKebabCase } = require('../../lib/naming');
6
+
7
+ const MCP_PREFIXES = {
8
+ gemini: 'mcp_maestro_',
9
+ claude: 'mcp__plugin_maestro_maestro__',
10
+ codex: 'mcp__maestro_maestro__',
11
+ };
12
+
13
+ const PLAN_MODE_NATIVE = { claude: true, gemini: true, codex: false, qwen: false };
14
+
15
+ function createHandler(runtimeConfig, getWorkspaceSuggestion = () => null) {
16
+ const resolvedRuntimeConfig = normalizeRuntimeConfig(runtimeConfig);
17
+ const agentNames = KNOWN_AGENTS.map((name) =>
18
+ resolvedRuntimeConfig.agentNaming === 'kebab-case'
19
+ ? toKebabCase(name)
20
+ : name
21
+ );
22
+
23
+ const prefix = resolvedRuntimeConfig.name === 'claude' ? 'maestro:' : '';
24
+ const delegation = resolvedRuntimeConfig.delegation || { pattern: '', constraints: {} };
25
+
26
+ return function handleGetRuntimeContext(_params) {
27
+ return {
28
+ runtime: resolvedRuntimeConfig.name,
29
+ tools: resolvedRuntimeConfig.tools || {},
30
+ agent_dispatch: {
31
+ pattern: delegation.pattern || '',
32
+ naming: resolvedRuntimeConfig.agentNaming || 'kebab-case',
33
+ prefix,
34
+ },
35
+ delegation: {
36
+ pattern: delegation.pattern || '',
37
+ constraints: delegation.constraints || {},
38
+ },
39
+ mcp_prefix: MCP_PREFIXES[resolvedRuntimeConfig.name] || '',
40
+ paths: resolvedRuntimeConfig.paths || {},
41
+ agents: agentNames,
42
+ agent_capabilities: AGENT_CAPABILITIES,
43
+ plan_mode_native: PLAN_MODE_NATIVE[resolvedRuntimeConfig.name] || false,
44
+ workspace_suggestion: getWorkspaceSuggestion() || null,
45
+ };
46
+ };
47
+ }
48
+
49
+ module.exports = { createHandler };
@@ -0,0 +1,51 @@
1
+ 'use strict';
2
+
3
+ const { getDefaultRuntimeConfig } = require('../runtime/runtime-config-map');
4
+ const {
5
+ RESOURCE_ALLOWLIST,
6
+ applyRuntimeTransforms,
7
+ } = require('../content/runtime-content');
8
+ const { createContentProvider } = require('../content/provider');
9
+ const { ValidationError } = require('../../lib/errors');
10
+
11
+ const DEFAULT_RUNTIME_CONFIG = getDefaultRuntimeConfig();
12
+
13
+ function createHandler(runtimeConfig = DEFAULT_RUNTIME_CONFIG, canonicalSrcRoot) {
14
+ return function handleGetSkillContent(params) {
15
+ const resources = params.resources;
16
+ if (!Array.isArray(resources) || resources.length === 0) {
17
+ throw new ValidationError('resources must be a non-empty array of resource identifiers');
18
+ }
19
+
20
+ const provider = createContentProvider(runtimeConfig, canonicalSrcRoot);
21
+ const contents = {};
22
+ const errors = {};
23
+
24
+ for (const id of resources) {
25
+ if (!RESOURCE_ALLOWLIST[id]) {
26
+ errors[id] = `Unknown resource identifier: "${id}". Known identifiers: ${Object.keys(RESOURCE_ALLOWLIST).join(', ')}`;
27
+ continue;
28
+ }
29
+
30
+ const result = provider.readResource(id);
31
+ if (result.error) {
32
+ errors[id] = result.error;
33
+ continue;
34
+ }
35
+
36
+ contents[id] = result.content;
37
+ }
38
+
39
+ return { contents, errors };
40
+ };
41
+ }
42
+
43
+ const handleGetSkillContent = createHandler();
44
+
45
+ module.exports = {
46
+ RESOURCE_ALLOWLIST,
47
+ DEFAULT_RUNTIME_CONFIG,
48
+ applyRuntimeTransforms,
49
+ createHandler,
50
+ handleGetSkillContent,
51
+ };
@@ -0,0 +1,45 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+
6
+ const { ensureWorkspace, resolveStateDirPath } = require('../../state/session-state');
7
+ const { resolveSetting } = require('../../config/setting-resolver');
8
+ const {
9
+ requireExplicitWorkspaceRoot,
10
+ } = require('../../core/project-root-resolver');
11
+ const { writeWorkspaceMarker } = require('../contracts/workspace-marker');
12
+
13
+ async function handleInitializeWorkspace(params = {}, cachedProjectRoot) {
14
+ const workspacePath =
15
+ params.workspace_path || cachedProjectRoot || null;
16
+
17
+ const resolvedWorkspace = requireExplicitWorkspaceRoot({
18
+ workspacePath,
19
+ });
20
+
21
+ const stateDir =
22
+ params.state_dir ||
23
+ resolveSetting('MAESTRO_STATE_DIR', resolvedWorkspace) ||
24
+ 'docs/maestro';
25
+ const fullStatePath = resolveStateDirPath(resolvedWorkspace, stateDir);
26
+ const alreadyExisted = fs.existsSync(path.join(fullStatePath, 'state'));
27
+
28
+ ensureWorkspace(stateDir, resolvedWorkspace);
29
+ writeWorkspaceMarker(fullStatePath, resolvedWorkspace);
30
+
31
+ return {
32
+ success: true,
33
+ workspace_path: resolvedWorkspace,
34
+ state_dir: stateDir,
35
+ created_directories: [
36
+ 'state/',
37
+ 'state/archive/',
38
+ 'plans/',
39
+ 'plans/archive/',
40
+ ].map((dir) => path.join(stateDir, dir)),
41
+ already_existed: alreadyExisted,
42
+ };
43
+ }
44
+
45
+ module.exports = { handleInitializeWorkspace };