@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,25 @@
1
+ 'use strict';
2
+
3
+ const hookState = require('./hook-state');
4
+ const state = require('../../state/session-state');
5
+
6
+ /**
7
+ * Session-start hook logic (runtime-agnostic).
8
+ *
9
+ * @param {object} ctx - Internal context contract
10
+ * @param {string} ctx.sessionId
11
+ * @param {string} ctx.cwd
12
+ * @returns {{ action: string, message: null, reason: null }}
13
+ */
14
+ function handleSessionStart(ctx) {
15
+ hookState.pruneStale();
16
+
17
+ if (!state.hasActiveSession(ctx.cwd)) {
18
+ return { action: 'advisory', message: null, reason: null };
19
+ }
20
+
21
+ hookState.ensureSessionDir(ctx.sessionId);
22
+ return { action: 'advisory', message: null, reason: null };
23
+ }
24
+
25
+ module.exports = { handleSessionStart };
@@ -0,0 +1,172 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+ const { readFileSafe, writeIfChanged } = require('../io');
6
+
7
+ /**
8
+ * @typedef {Object} DiscoveryEntry
9
+ * @property {string} id - Unique identifier derived by the identity function
10
+ * @property {string} path - Absolute path to the discovered file
11
+ */
12
+
13
+ /**
14
+ * @typedef {Object} DiscoverOptions
15
+ * @property {string} dir - Absolute path to the directory to scan
16
+ * @property {string} pattern - File-matching pattern (e.g., '*.js', '*-logic.js', '**\/*.md')
17
+ * @property {Function} identity - (filepath: string) => string — derives the entry identifier
18
+ * @property {Function} [metadata] - (filepath: string, content: string) => Object — extracts metadata per file
19
+ * @property {Function} [validate] - (entry: DiscoveryEntry) => boolean — false excludes the entry
20
+ * @property {boolean} [recursive=false] - Whether to recurse into subdirectories
21
+ */
22
+
23
+ /**
24
+ * Convert a simple glob pattern into a RegExp for matching filenames.
25
+ *
26
+ * Supports:
27
+ * - `*` matches any sequence of characters except path separators
28
+ * - Literal characters are escaped for safe regex usage
29
+ * - The pattern is anchored to match the full filename
30
+ *
31
+ * @param {string} pattern - The glob pattern (filename portion only, no directory prefix)
32
+ * @returns {RegExp} Compiled regular expression
33
+ */
34
+ function patternToRegex(pattern) {
35
+ let regex = '';
36
+ for (let i = 0; i < pattern.length; i++) {
37
+ const char = pattern[i];
38
+ if (char === '*') {
39
+ regex += '[^/]*';
40
+ } else if ('.+?^${}()|[]\\'.includes(char)) {
41
+ regex += '\\' + char;
42
+ } else {
43
+ regex += char;
44
+ }
45
+ }
46
+ return new RegExp('^' + regex + '$');
47
+ }
48
+
49
+ /**
50
+ * Parse a discovery pattern into its file-matching regex and whether
51
+ * recursive scanning is implied by a `**\/` prefix.
52
+ *
53
+ * @param {string} pattern - The discovery pattern (e.g., '*.md', '**\/*.md')
54
+ * @returns {{ regex: RegExp, impliedRecursive: boolean }}
55
+ */
56
+ function parsePattern(pattern) {
57
+ if (pattern.startsWith('**/')) {
58
+ return {
59
+ regex: patternToRegex(pattern.slice(3)),
60
+ impliedRecursive: true,
61
+ };
62
+ }
63
+ return {
64
+ regex: patternToRegex(pattern),
65
+ impliedRecursive: false,
66
+ };
67
+ }
68
+
69
+ /**
70
+ * Collect file paths from a directory, optionally recursing into subdirectories.
71
+ *
72
+ * @param {string} dir - Absolute path to scan
73
+ * @param {boolean} recursive - Whether to descend into child directories
74
+ * @returns {string[]} Absolute paths of all regular files found
75
+ */
76
+ function collectFiles(dir, recursive) {
77
+ const results = [];
78
+
79
+ if (!fs.existsSync(dir)) {
80
+ return results;
81
+ }
82
+
83
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
84
+
85
+ for (const entry of entries) {
86
+ const fullPath = path.join(dir, entry.name);
87
+
88
+ if (entry.isDirectory() && recursive) {
89
+ results.push(...collectFiles(fullPath, true));
90
+ } else if (entry.isFile()) {
91
+ results.push(fullPath);
92
+ }
93
+ }
94
+
95
+ return results;
96
+ }
97
+
98
+ /**
99
+ * Scan a directory for files matching a pattern and produce an array of
100
+ * structured discovery entries.
101
+ *
102
+ * @param {DiscoverOptions} options
103
+ * @returns {Array<DiscoveryEntry>} Entries sorted by id
104
+ */
105
+ function discover({ dir, pattern, identity, metadata, validate, recursive = false }) {
106
+ const { regex, impliedRecursive } = parsePattern(pattern);
107
+ const shouldRecurse = recursive || impliedRecursive;
108
+
109
+ const filePaths = collectFiles(dir, shouldRecurse);
110
+
111
+ const entries = [];
112
+
113
+ for (const filePath of filePaths) {
114
+ const filename = path.basename(filePath);
115
+
116
+ if (!regex.test(filename)) {
117
+ continue;
118
+ }
119
+
120
+ const id = identity(filePath);
121
+
122
+ let extra = {};
123
+ if (metadata) {
124
+ const content = readFileSafe(filePath);
125
+ extra = metadata(filePath, content) || {};
126
+ }
127
+
128
+ const entry = { id, path: filePath, ...extra };
129
+
130
+ if (validate && !validate(entry)) {
131
+ continue;
132
+ }
133
+
134
+ entries.push(entry);
135
+ }
136
+
137
+ entries.sort((a, b) => a.id.localeCompare(b.id));
138
+
139
+ return entries;
140
+ }
141
+
142
+ /**
143
+ * Serialize data as JSON and write it to a file, skipping the write when
144
+ * the content has not changed.
145
+ *
146
+ * @param {*} data - Any JSON-serializable value
147
+ * @param {string} outputPath - Absolute path to the output file
148
+ * @returns {boolean} True if the file was written, false if content was identical
149
+ */
150
+ function generateRegistry(data, outputPath) {
151
+ const content = serializeRegistry(data);
152
+ return writeIfChanged(outputPath, content);
153
+ }
154
+
155
+ /**
156
+ * Serialize registry data to stable, newline-terminated JSON.
157
+ *
158
+ * @param {*} data - Any JSON-serializable registry value
159
+ * @returns {string} JSON content ready to write
160
+ */
161
+ function serializeRegistry(data) {
162
+ return JSON.stringify(data, null, 2) + '\n';
163
+ }
164
+
165
+ module.exports = {
166
+ discover,
167
+ generateRegistry,
168
+ serializeRegistry,
169
+ patternToRegex,
170
+ parsePattern,
171
+ collectFiles,
172
+ };
@@ -0,0 +1,104 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Base error class for the Maestro platform.
5
+ * Provides structured error metadata via `code`, `details`, and `context` properties.
6
+ *
7
+ * @extends Error
8
+ */
9
+ class MaestroError extends Error {
10
+ /**
11
+ * @param {string} message - Human-readable error description
12
+ * @param {object} [opts]
13
+ * @param {string} [opts.code='MAESTRO_ERROR'] - Machine-readable error code
14
+ * @param {*} [opts.details=null] - Structured payload describing the failure
15
+ * @param {*} [opts.context=null] - Ambient context at the point of failure
16
+ */
17
+ constructor(message, { code = 'MAESTRO_ERROR', details = null, context = null } = {}) {
18
+ super(message);
19
+ this.name = this.constructor.name;
20
+ this.code = code;
21
+ this.details = details;
22
+ this.context = context;
23
+ }
24
+ }
25
+
26
+ /**
27
+ * Raised when input data or arguments fail validation constraints.
28
+ *
29
+ * @extends MaestroError
30
+ */
31
+ class ValidationError extends MaestroError {
32
+ /**
33
+ * @param {string} message
34
+ * @param {object} [opts]
35
+ * @param {string} [opts.code='VALIDATION_ERROR'] - Subtype code for specific failures (e.g. HANDOFF_INCOMPLETE)
36
+ * @param {*} [opts.details]
37
+ * @param {*} [opts.context]
38
+ */
39
+ constructor(message, opts = {}) {
40
+ super(message, { ...opts, code: opts.code || 'VALIDATION_ERROR' });
41
+ }
42
+ }
43
+
44
+ /**
45
+ * Raised when a requested resource (agent, session, file, etc.) does not exist.
46
+ *
47
+ * @extends MaestroError
48
+ */
49
+ class NotFoundError extends MaestroError {
50
+ /**
51
+ * @param {string} message
52
+ * @param {object} [opts]
53
+ * @param {string} [opts.code='NOT_FOUND'] - Subtype code for specific failures
54
+ * @param {*} [opts.details]
55
+ * @param {*} [opts.context]
56
+ */
57
+ constructor(message, opts = {}) {
58
+ super(message, { ...opts, code: opts.code || 'NOT_FOUND' });
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Raised when configuration is missing, malformed, or internally inconsistent.
64
+ *
65
+ * @extends MaestroError
66
+ */
67
+ class ConfigError extends MaestroError {
68
+ /**
69
+ * @param {string} message
70
+ * @param {object} [opts]
71
+ * @param {string} [opts.code='CONFIG_ERROR'] - Subtype code for specific failures
72
+ * @param {*} [opts.details]
73
+ * @param {*} [opts.context]
74
+ */
75
+ constructor(message, opts = {}) {
76
+ super(message, { ...opts, code: opts.code || 'CONFIG_ERROR' });
77
+ }
78
+ }
79
+
80
+ /**
81
+ * Raised when an operation is invalid for the current session or workflow state.
82
+ *
83
+ * @extends MaestroError
84
+ */
85
+ class StateError extends MaestroError {
86
+ /**
87
+ * @param {string} message
88
+ * @param {object} [opts]
89
+ * @param {string} [opts.code='STATE_ERROR'] - Subtype code for specific failures (e.g. DESIGN_GATE_UNAPPROVED, RECONCILIATION_PENDING)
90
+ * @param {*} [opts.details]
91
+ * @param {*} [opts.context]
92
+ */
93
+ constructor(message, opts = {}) {
94
+ super(message, { ...opts, code: opts.code || 'STATE_ERROR' });
95
+ }
96
+ }
97
+
98
+ module.exports = {
99
+ MaestroError,
100
+ ValidationError,
101
+ NotFoundError,
102
+ ConfigError,
103
+ StateError,
104
+ };
@@ -0,0 +1,50 @@
1
+ 'use strict';
2
+
3
+ const CONFIG_FILES = [
4
+ '.eslintrc',
5
+ '.prettierrc',
6
+ 'tsconfig.json',
7
+ 'webpack.config.js',
8
+ 'vite.config.js',
9
+ 'next.config.js',
10
+ '.env',
11
+ 'docker-compose.yml',
12
+ 'Dockerfile',
13
+ 'Makefile',
14
+ ];
15
+
16
+ const SKIP_DIRS = new Set([
17
+ 'node_modules',
18
+ '.git',
19
+ 'dist',
20
+ 'build',
21
+ '.next',
22
+ '__pycache__',
23
+ 'venv',
24
+ '.venv',
25
+ 'target',
26
+ 'vendor',
27
+ '.cache',
28
+ '.output',
29
+ 'coverage',
30
+ '.nyc_output',
31
+ '.pytest_cache',
32
+ ]);
33
+
34
+ const FRAMEWORK_INDICATORS = {
35
+ react: ['react', 'react-dom'],
36
+ vue: ['vue'],
37
+ angular: ['@angular/core'],
38
+ next: ['next'],
39
+ express: ['express'],
40
+ fastify: ['fastify'],
41
+ django: ['django'],
42
+ flask: ['flask'],
43
+ rails: ['rails'],
44
+ };
45
+
46
+ module.exports = {
47
+ CONFIG_FILES,
48
+ SKIP_DIRS,
49
+ FRAMEWORK_INDICATORS,
50
+ };
@@ -0,0 +1,262 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Unified frontmatter parsing module.
5
+ *
6
+ * Consolidates three distinct boundary-detection implementations and two YAML
7
+ * escaping implementations into a single authoritative module.
8
+ *
9
+ * Boundary detection approaches unified:
10
+ * - Character-offset indexOf (agent-stub.js, parseFrontmatterOnly)
11
+ * - Line-split iteration (core/frontmatter-parser.js parse)
12
+ * - Regex multiline match (skill-metadata.js)
13
+ *
14
+ * @module lib/frontmatter
15
+ */
16
+
17
+ /**
18
+ * Parse a double-quoted string value with escape sequence support.
19
+ *
20
+ * Handles \n, \r, \t, \\, and \" escape sequences. Unknown escape sequences
21
+ * preserve the backslash character.
22
+ *
23
+ * @param {string} raw - The inner content of a double-quoted string (without outer quotes).
24
+ * @returns {string} The unescaped string value.
25
+ */
26
+ function parseDoubleQuotedValue(raw) {
27
+ let value = '';
28
+
29
+ for (let i = 0; i < raw.length; i++) {
30
+ const char = raw[i];
31
+ const next = raw[i + 1];
32
+
33
+ if (char !== '\\' || next == null) {
34
+ value += char;
35
+ continue;
36
+ }
37
+
38
+ switch (next) {
39
+ case '"':
40
+ value += '"';
41
+ i++;
42
+ break;
43
+ case '\\':
44
+ value += '\\';
45
+ i++;
46
+ break;
47
+ case 'n':
48
+ value += '\n';
49
+ i++;
50
+ break;
51
+ case 'r':
52
+ value += '\r';
53
+ i++;
54
+ break;
55
+ case 't':
56
+ value += '\t';
57
+ i++;
58
+ break;
59
+ default:
60
+ value += char;
61
+ break;
62
+ }
63
+ }
64
+
65
+ return value;
66
+ }
67
+
68
+ /**
69
+ * Parse a YAML-like scalar value with type coercion.
70
+ *
71
+ * Supports inline arrays ([a, b, c]), double-quoted strings with escape
72
+ * sequences, single-quoted strings with '' escaping, numeric literals, and
73
+ * bare string values.
74
+ *
75
+ * @param {string} raw - The raw value string to parse.
76
+ * @returns {string|number|string[]} The parsed value.
77
+ */
78
+ function parseValue(raw) {
79
+ if (raw.startsWith('[') && raw.endsWith(']')) {
80
+ const inner = raw.slice(1, -1);
81
+ if (inner.trim() === '') return [];
82
+ return inner.split(',').map((s) => s.trim());
83
+ }
84
+
85
+ if (raw.startsWith('"') && raw.endsWith('"')) {
86
+ return parseDoubleQuotedValue(raw.slice(1, -1));
87
+ }
88
+
89
+ if (raw.startsWith("'") && raw.endsWith("'")) {
90
+ return raw.slice(1, -1).replace(/''/g, "'");
91
+ }
92
+
93
+ const num = Number(raw);
94
+ if (raw !== '' && !isNaN(num)) {
95
+ return num;
96
+ }
97
+
98
+ return raw;
99
+ }
100
+
101
+ /**
102
+ * Split content at the frontmatter boundary using line iteration.
103
+ *
104
+ * Unifies the three boundary-detection approaches into one canonical
105
+ * implementation. Uses line-split iteration (the most permissive approach)
106
+ * which handles all edge cases including content without a trailing newline
107
+ * after the closing delimiter.
108
+ *
109
+ * @param {string} content - The full content string with optional frontmatter.
110
+ * @returns {{ raw: string, body: string }} The raw frontmatter text (between
111
+ * delimiters, excluding them) and the remaining body. When no valid
112
+ * frontmatter block is found, raw is '' and body is the original content.
113
+ */
114
+ function splitAtBoundary(content) {
115
+ const lines = content.split('\n');
116
+
117
+ if (lines[0] !== '---') {
118
+ return { raw: '', body: content };
119
+ }
120
+
121
+ let endIndex = -1;
122
+ for (let i = 1; i < lines.length; i++) {
123
+ if (lines[i] === '---') {
124
+ endIndex = i;
125
+ break;
126
+ }
127
+ }
128
+
129
+ if (endIndex === -1) {
130
+ return { raw: '', body: content };
131
+ }
132
+
133
+ const raw = lines.slice(1, endIndex).join('\n');
134
+ const body = lines.slice(endIndex + 1).join('\n');
135
+
136
+ return { raw, body };
137
+ }
138
+
139
+ /**
140
+ * Parse frontmatter key-value lines into an object.
141
+ *
142
+ * @param {string[]} lines - Lines between frontmatter delimiters.
143
+ * @param {function} valueFn - Function to apply to each raw value string.
144
+ * @returns {Object} Parsed frontmatter object.
145
+ */
146
+ function parseLines(lines, valueFn) {
147
+ const frontmatter = {};
148
+
149
+ for (const line of lines) {
150
+ const colonIndex = line.indexOf(':');
151
+ if (colonIndex === -1) continue;
152
+
153
+ const key = line.substring(0, colonIndex).trim();
154
+ const rawValue = line.substring(colonIndex + 1).trim();
155
+
156
+ frontmatter[key] = valueFn(rawValue);
157
+ }
158
+
159
+ return frontmatter;
160
+ }
161
+
162
+ /**
163
+ * Parse frontmatter with full type coercion (rich parser).
164
+ *
165
+ * Splits content on `---` delimiters and parses key-value pairs with type
166
+ * coercion via {@link parseValue}. Arrays, numbers, and quoted strings are
167
+ * converted to their native types.
168
+ *
169
+ * Returns empty frontmatter and the full content as body when no valid
170
+ * frontmatter block is found (missing opening or closing `---`).
171
+ *
172
+ * @param {string} content - The full content string with optional frontmatter.
173
+ * @returns {{ frontmatter: Object, body: string }} Parsed frontmatter object and remaining body.
174
+ */
175
+ function parse(content) {
176
+ const { raw, body } = splitAtBoundary(content);
177
+
178
+ if (raw === '' && body === content) {
179
+ return { frontmatter: {}, body: content };
180
+ }
181
+
182
+ const fmLines = raw.split('\n');
183
+ const frontmatter = parseLines(fmLines, parseValue);
184
+
185
+ return { frontmatter, body };
186
+ }
187
+
188
+ /**
189
+ * Parse frontmatter returning raw string values without type coercion (simple parser).
190
+ *
191
+ * Uses substring-based boundary detection (`---\n` prefix and `\n---\n`
192
+ * closing). Returns a wrapper object with a frontmatter map (raw string
193
+ * values) and the remaining body text.
194
+ *
195
+ * This intentionally uses stricter boundary detection than {@link parse} or
196
+ * {@link splitAtBoundary}: it requires a newline after the closing `---`
197
+ * delimiter. This preserves the historical contract where content ending
198
+ * exactly at `---` (no trailing newline) returns empty frontmatter with the
199
+ * full content as body.
200
+ *
201
+ * Returns empty frontmatter and the full content as body when no valid
202
+ * frontmatter block is found.
203
+ *
204
+ * @param {string} content - The full content string with optional frontmatter.
205
+ * @returns {{ frontmatter: Object<string, string>, body: string }} Raw frontmatter map and remaining body.
206
+ */
207
+ function parseFrontmatterOnly(content) {
208
+ if (!content.startsWith('---\n')) {
209
+ return { frontmatter: {}, body: content };
210
+ }
211
+
212
+ const end = content.indexOf('\n---\n', 4);
213
+ if (end === -1) {
214
+ return { frontmatter: {}, body: content };
215
+ }
216
+
217
+ const lines = content.slice(4, end).split('\n');
218
+ const frontmatter = parseLines(lines, (v) => v);
219
+ const body = content.slice(end + 5);
220
+
221
+ return { frontmatter, body };
222
+ }
223
+
224
+ /**
225
+ * Extract a single frontmatter value by key via regex.
226
+ *
227
+ * Searches for `key: value` on its own line within the content. Does not
228
+ * require the content to have valid frontmatter delimiters -- works on any
229
+ * text that contains `key: value` lines.
230
+ *
231
+ * @param {string} content - The content string to search.
232
+ * @param {string} key - The frontmatter key to extract.
233
+ * @returns {string|null} The trimmed value string, or null if the key is not found.
234
+ */
235
+ function extractValue(content, key) {
236
+ const match = content.match(new RegExp(`(?:^|\\n)${key}:\\s*(.+)$`, 'm'));
237
+ return match ? match[1].trim() : null;
238
+ }
239
+
240
+ /**
241
+ * Escape special characters in a YAML string value.
242
+ *
243
+ * Escapes backslashes and double quotes for safe embedding inside a
244
+ * double-quoted YAML scalar. Non-string inputs are coerced via String().
245
+ *
246
+ * @param {string} value - Value to escape.
247
+ * @returns {string} Escaped value safe for double-quoted YAML context.
248
+ */
249
+ function escapeYaml(value) {
250
+ if (typeof value !== 'string') return String(value);
251
+ return value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
252
+ }
253
+
254
+ module.exports = {
255
+ parse,
256
+ parseFrontmatterOnly,
257
+ extractValue,
258
+ escapeYaml,
259
+ splitAtBoundary,
260
+ parseValue,
261
+ parseDoubleQuotedValue,
262
+ };
@@ -0,0 +1,96 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+
6
+ let counter = 0;
7
+
8
+ /**
9
+ * Creates parent directories and writes content atomically via temp-file + rename.
10
+ * The parent directory is created with mode 0o700 and the file with mode 0o600.
11
+ *
12
+ * @param {string} filePath - Absolute path to the target file
13
+ * @param {string} content - Content to write
14
+ */
15
+ function atomicWriteSync(filePath, content) {
16
+ fs.mkdirSync(path.dirname(filePath), { recursive: true, mode: 0o700 });
17
+ const tmpFile = `${filePath}.tmp.${process.pid}.${++counter}`;
18
+ try {
19
+ fs.writeFileSync(tmpFile, content, { mode: 0o600 });
20
+ fs.renameSync(tmpFile, filePath);
21
+ } catch (err) {
22
+ try { fs.unlinkSync(tmpFile); } catch {}
23
+ throw err;
24
+ }
25
+ }
26
+
27
+ /**
28
+ * Reads a file and returns its contents as a UTF-8 string.
29
+ * Returns the fallback value on any error (missing file, permission denied, etc.).
30
+ *
31
+ * @param {string} filePath - Absolute or relative path to the file
32
+ * @param {string} [fallback=''] - Value returned when reading fails
33
+ * @returns {string} File contents or fallback
34
+ */
35
+ function readFileSafe(filePath, fallback = '') {
36
+ try {
37
+ return fs.readFileSync(filePath, 'utf8');
38
+ } catch {
39
+ return fallback;
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Reads a file and parses its contents as JSON.
45
+ * Returns the fallback value on any error (missing file, invalid JSON, etc.).
46
+ *
47
+ * @param {string} filePath - Absolute or relative path to the file
48
+ * @param {*} [fallback=null] - Value returned when reading or parsing fails
49
+ * @returns {*} Parsed JSON value or fallback
50
+ */
51
+ function readJsonSafe(filePath, fallback = null) {
52
+ try {
53
+ return JSON.parse(fs.readFileSync(filePath, 'utf8'));
54
+ } catch {
55
+ return fallback;
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Writes content to a file only when it differs from existing content.
61
+ * Creates parent directories if they do not exist.
62
+ *
63
+ * @param {string} filePath - Absolute path to the target file
64
+ * @param {string} content - Content to write
65
+ * @returns {boolean} True if the file was written, false if content was identical
66
+ */
67
+ function writeIfChanged(filePath, content) {
68
+ const existing = fs.existsSync(filePath)
69
+ ? fs.readFileSync(filePath, 'utf8')
70
+ : null;
71
+
72
+ if (existing === content) {
73
+ return false;
74
+ }
75
+
76
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
77
+ fs.writeFileSync(filePath, content, 'utf8');
78
+ return true;
79
+ }
80
+
81
+ /**
82
+ * Ensures a directory exists, creating it and all parent directories as needed.
83
+ *
84
+ * @param {string} dirPath - Absolute path to the directory
85
+ */
86
+ function ensureDir(dirPath) {
87
+ fs.mkdirSync(dirPath, { recursive: true });
88
+ }
89
+
90
+ module.exports = {
91
+ atomicWriteSync,
92
+ readFileSafe,
93
+ readJsonSafe,
94
+ writeIfChanged,
95
+ ensureDir,
96
+ };