@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,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
+ };
@@ -0,0 +1,94 @@
1
+ 'use strict';
2
+
3
+ const TITLE_SPECIAL_CASES = {
4
+ 'a11y-audit': 'Accessibility Audit',
5
+ 'seo-audit': 'SEO Audit',
6
+ };
7
+
8
+ /**
9
+ * Convert a kebab-case name to snake_case.
10
+ * @param {string} name - Name in kebab-case (e.g. 'api-designer')
11
+ * @returns {string} Name in snake_case (e.g. 'api_designer')
12
+ */
13
+ function toSnakeCase(name) {
14
+ return name.replace(/-/g, '_');
15
+ }
16
+
17
+ /**
18
+ * Convert a snake_case name to kebab-case.
19
+ * @param {string} name - Name in snake_case (e.g. 'api_designer')
20
+ * @returns {string} Name in kebab-case (e.g. 'api-designer')
21
+ */
22
+ function toKebabCase(name) {
23
+ return name.replace(/_/g, '-');
24
+ }
25
+
26
+ /**
27
+ * Convert a kebab-case name to PascalCase.
28
+ * @param {string} name - Name in kebab-case (e.g. 'session-start')
29
+ * @returns {string} Name in PascalCase (e.g. 'SessionStart')
30
+ */
31
+ function toPascalCase(name) {
32
+ return name
33
+ .split('-')
34
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
35
+ .join('');
36
+ }
37
+
38
+ /**
39
+ * Convert a kebab-case name to title case for display.
40
+ * Includes special-case handling for abbreviations and accessibility terms.
41
+ *
42
+ * @param {string} name - Name in kebab-case (e.g. 'perf-check')
43
+ * @returns {string} Display-friendly title (e.g. 'Perf Check')
44
+ */
45
+ function toTitleCase(name) {
46
+ if (TITLE_SPECIAL_CASES[name]) {
47
+ return TITLE_SPECIAL_CASES[name];
48
+ }
49
+ return name
50
+ .split('-')
51
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
52
+ .join(' ');
53
+ }
54
+
55
+ /**
56
+ * Replace all occurrences of canonical kebab-case names in content
57
+ * with the target naming convention.
58
+ *
59
+ * When targetCase is 'snake_case', each name in the provided list
60
+ * is matched using word-boundary regexes and replaced with its snake_case
61
+ * equivalent. When targetCase is 'kebab-case', content is returned unchanged
62
+ * since kebab-case is the canonical format.
63
+ *
64
+ * @param {string} content - Text content containing name references
65
+ * @param {string[]} names - Canonical kebab-case names to replace
66
+ * @param {string} targetCase - Target convention: 'snake_case' or 'kebab-case'
67
+ * @returns {string} Content with names converted to the target convention
68
+ */
69
+ function replaceInContent(content, names, targetCase) {
70
+ if (targetCase !== 'snake_case') {
71
+ return content;
72
+ }
73
+
74
+ if (!names || names.length === 0) {
75
+ return content;
76
+ }
77
+
78
+ let result = content;
79
+ for (const name of names) {
80
+ const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
81
+ const pattern = new RegExp(`\\b${escaped}\\b`, 'g');
82
+ result = result.replace(pattern, toSnakeCase(name));
83
+ }
84
+ return result;
85
+ }
86
+
87
+ module.exports = {
88
+ TITLE_SPECIAL_CASES,
89
+ toSnakeCase,
90
+ toKebabCase,
91
+ toPascalCase,
92
+ toTitleCase,
93
+ replaceInContent,
94
+ };
@@ -0,0 +1,124 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs');
4
+ const path = require('node:path');
5
+ const { ValidationError } = require('../errors');
6
+
7
+ const SESSION_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;
8
+
9
+ /**
10
+ * @param {*} value
11
+ * @param {string} label
12
+ * @throws {ValidationError}
13
+ */
14
+ function assertNonEmptyArray(value, label) {
15
+ if (!Array.isArray(value) || value.length === 0) {
16
+ throw new ValidationError(`${label} must be a non-empty array`, {
17
+ details: { value, label },
18
+ });
19
+ }
20
+ }
21
+
22
+ /**
23
+ * @param {*} id
24
+ * @throws {ValidationError}
25
+ */
26
+ function assertSessionId(id) {
27
+ if (typeof id !== 'string' || !SESSION_ID_PATTERN.test(id)) {
28
+ throw new ValidationError(
29
+ 'Invalid session_id: must match pattern [a-zA-Z0-9_-]+',
30
+ { details: { value: id } }
31
+ );
32
+ }
33
+ }
34
+
35
+ /**
36
+ * @param {string|string[]} value
37
+ * @param {string[]|Record<string, *>} allowlist
38
+ * @param {string} label
39
+ * @throws {ValidationError}
40
+ */
41
+ function assertAllowlisted(value, allowlist, label) {
42
+ const entries = Array.isArray(value) ? value : [value];
43
+ const permitted = Array.isArray(allowlist) ? allowlist : Object.keys(allowlist);
44
+ const invalid = entries.filter((entry) => !permitted.includes(entry));
45
+
46
+ if (invalid.length > 0) {
47
+ throw new ValidationError(
48
+ `Unknown ${label}: ${invalid.map((v) => `"${v}"`).join(', ')}. Known identifiers: ${permitted.join(', ')}`,
49
+ { details: { invalid, permitted, label } }
50
+ );
51
+ }
52
+ }
53
+
54
+ /**
55
+ * @param {string} p
56
+ * @throws {ValidationError}
57
+ */
58
+ function assertRelativePath(p) {
59
+ if (typeof p !== 'string') {
60
+ throw new ValidationError('Path must be a string', {
61
+ details: { value: p },
62
+ });
63
+ }
64
+
65
+ if (p.includes('\0')) {
66
+ throw new ValidationError('Path contains null bytes', {
67
+ details: { value: p },
68
+ });
69
+ }
70
+
71
+ if (path.isAbsolute(p)) {
72
+ throw new ValidationError('Path must be relative', {
73
+ details: { value: p },
74
+ });
75
+ }
76
+
77
+ const segments = p.split(/[/\\]/);
78
+ if (segments.includes('..')) {
79
+ throw new ValidationError('Path traversal not allowed', {
80
+ details: { value: p },
81
+ });
82
+ }
83
+ }
84
+
85
+ /**
86
+ * @param {string} p
87
+ * @param {string} base
88
+ * @throws {ValidationError}
89
+ */
90
+ function assertContainedIn(p, base) {
91
+ let resolved = path.resolve(p);
92
+ let resolvedBase = path.resolve(base);
93
+
94
+ try { resolved = fs.realpathSync(resolved); } catch {}
95
+ try { resolvedBase = fs.realpathSync(resolvedBase); } catch {}
96
+
97
+ const basePrefix = resolvedBase + path.sep;
98
+
99
+ if (!resolved.startsWith(basePrefix) && resolved !== resolvedBase) {
100
+ throw new ValidationError('Path escapes base directory', {
101
+ details: { path: resolved, base: resolvedBase },
102
+ });
103
+ }
104
+ }
105
+
106
+ /**
107
+ * @param {*} value
108
+ * @returns {*}
109
+ */
110
+ function coercePositiveInteger(value) {
111
+ if (value == null || typeof value === 'number') return value;
112
+ if (typeof value !== 'string') return value;
113
+ const num = Number(value);
114
+ return Number.isFinite(num) && Number.isInteger(num) && num > 0 ? num : value;
115
+ }
116
+
117
+ module.exports = {
118
+ assertNonEmptyArray,
119
+ assertSessionId,
120
+ assertAllowlisted,
121
+ assertRelativePath,
122
+ assertContainedIn,
123
+ coercePositiveInteger,
124
+ };
@@ -0,0 +1,38 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Minimal YAML fragment emitters used by the generator.
5
+ *
6
+ * Neither function escapes its inputs — callers MUST pass YAML-safe
7
+ * scalars (identifiers, numbers, or pre-escaped strings). Values
8
+ * containing `:`, `"`, `\`, or leading/trailing whitespace will
9
+ * produce invalid YAML.
10
+ *
11
+ * Current callers (entry-point-expander, preamble-builders) pass
12
+ * agent names, skill names, and reference names — all controlled
13
+ * inputs from the canonical source tree — so the raw interpolation
14
+ * is safe in practice.
15
+ */
16
+
17
+ /**
18
+ * Emit a block-style list under `key`. Returns [] when the list is
19
+ * empty so callers can append without producing an orphaned `key:`
20
+ * line.
21
+ */
22
+ function emitBlockList(key, items) {
23
+ if (!items || items.length === 0) return [];
24
+ return [`${key}:`, ...items.map((item) => ` - ${item}`)];
25
+ }
26
+
27
+ /**
28
+ * Emit an inline comma-separated list of double-quoted scalars.
29
+ * Intended for embedding inside flow-style arrays like `[...]`.
30
+ */
31
+ function emitInlineQuotedList(items) {
32
+ return items.map((item) => `"${item}"`).join(', ');
33
+ }
34
+
35
+ module.exports = {
36
+ emitBlockList,
37
+ emitInlineQuotedList,
38
+ };
@@ -0,0 +1,68 @@
1
+ 'use strict';
2
+
3
+ const { resolveCanonicalSrcFromExtensionRoot } = require('../utils/extension-root');
4
+ const {
5
+ readResourceFromFilesystem,
6
+ readAgentFromFilesystem,
7
+ } = require('./runtime-content');
8
+
9
+ const CONTENT_SOURCES = Object.freeze({
10
+ FILESYSTEM: 'filesystem',
11
+ NONE: 'none',
12
+ });
13
+
14
+ function createFilesystemProvider(runtimeConfig, canonicalSrcRoot = resolveCanonicalSrcFromExtensionRoot()) {
15
+ const srcRoot = canonicalSrcRoot;
16
+
17
+ return {
18
+ readResource(id) {
19
+ return readResourceFromFilesystem(id, runtimeConfig, srcRoot);
20
+ },
21
+
22
+ readAgent(agentName) {
23
+ return readAgentFromFilesystem(agentName, runtimeConfig, srcRoot);
24
+ },
25
+ };
26
+ }
27
+
28
+ function normalizeContentPolicy(runtimeConfig) {
29
+ const content = runtimeConfig && runtimeConfig.content;
30
+
31
+ return {
32
+ primary: content && content.primary ? content.primary : CONTENT_SOURCES.FILESYSTEM,
33
+ fallback: content && content.fallback ? content.fallback : CONTENT_SOURCES.NONE,
34
+ };
35
+ }
36
+
37
+ /**
38
+ * Every runtime configures `primary=filesystem, fallback=none`, so the
39
+ * chain collapses to the filesystem provider with a shaped error for
40
+ * `none`. If a future source is introduced, reintroduce chaining here.
41
+ */
42
+ function createContentProvider(runtimeConfig, canonicalSrcRoot = resolveCanonicalSrcFromExtensionRoot()) {
43
+ const { primary } = normalizeContentPolicy(runtimeConfig);
44
+
45
+ if (primary === CONTENT_SOURCES.NONE) {
46
+ return {
47
+ readResource(id) {
48
+ return { error: `No content provider could read resource "${id}"` };
49
+ },
50
+ readAgent(agentName) {
51
+ return { error: `No content provider could read agent "${agentName}"` };
52
+ },
53
+ };
54
+ }
55
+
56
+ if (primary !== CONTENT_SOURCES.FILESYSTEM) {
57
+ throw new Error(`Unknown content source: "${primary}"`);
58
+ }
59
+
60
+ return createFilesystemProvider(runtimeConfig, canonicalSrcRoot);
61
+ }
62
+
63
+ module.exports = {
64
+ CONTENT_SOURCES,
65
+ createContentProvider,
66
+ createFilesystemProvider,
67
+ normalizeContentPolicy,
68
+ };