@zeyue0329/xiaoma-cli 1.0.49 → 1.0.66

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 (754) hide show
  1. package/.playwright-cli/console-2026-05-13T06-36-26-793Z.log +2 -0
  2. package/.playwright-cli/page-2026-05-13T06-36-27-725Z.yml +1 -0
  3. package/CLAUDE.md +79 -251
  4. package/LICENSE +30 -0
  5. package/README.md +127 -2
  6. package/XiaoMa-CLI-2026H2-/350/277/255/344/273/243/350/247/204/345/210/222.pptx +0 -0
  7. package/demo/xiaoma-bug-circle-resolve/SKILL.md +6 -0
  8. package/demo/xiaoma-bug-circle-resolve/workflow.md +254 -0
  9. package/demo/xiaoma-bug-resolve/SKILL.md +6 -0
  10. package/demo/xiaoma-bug-resolve/workflow.md +269 -0
  11. package/demo/xiaoma-prd-saas-zh/README.md +57 -0
  12. package/demo/xiaoma-prd-saas-zh/domain-research.md +128 -0
  13. package/demo/xiaoma-prd-saas-zh/epics.md +303 -0
  14. package/demo/xiaoma-prd-saas-zh/market-research-2026-q1.md +183 -0
  15. package/demo/xiaoma-prd-saas-zh/prd-bad-examples.md +268 -0
  16. package/demo/xiaoma-prd-saas-zh/prd.md +409 -0
  17. package/demo/xiaoma-prd-saas-zh/product-brief.md +97 -0
  18. package/demo/xiaoma-prd-saas-zh/validation-report.md +279 -0
  19. package/docs/roadshow/01-/351/241/271/347/233/256/346/246/202/350/247/210/344/270/216/346/236/266/346/236/204.md +189 -0
  20. package/docs/roadshow/02-/346/231/272/350/203/275/344/275/223/347/263/273/347/273/237/350/257/246/350/247/243.md +464 -0
  21. package/docs/roadshow/03-/346/231/272/350/203/275/344/275/223/344/272/244/344/272/222/346/265/201/347/250/213/345/233/276.md +334 -0
  22. package/docs/roadshow/04-/345/267/245/344/275/234/346/265/201/346/211/247/350/241/214/350/257/246/350/247/243.md +1038 -0
  23. package/docs/roadshow/05-/346/212/200/346/234/257/345/256/236/347/216/260/344/270/216/345/210/233/346/226/260/344/272/256/347/202/271.md +205 -0
  24. package/docs/roadshow/06-/350/267/257/346/274/224/346/200/273/347/273/223/344/270/216/346/274/224/347/244/272/345/273/272/350/256/256.md +167 -0
  25. package/media/doc1_fig1.png +0 -0
  26. package/media/doc1_fig2.png +0 -0
  27. package/media/doc1_fig3.png +0 -0
  28. package/media/doc1_fig4.png +0 -0
  29. package/media/doc2_fig1.png +0 -0
  30. package/media/doc2_fig2.png +0 -0
  31. package/media/doc2_fig3.png +0 -0
  32. package/media/doc2_fig4.png +0 -0
  33. package/media/doc3_fig1.png +0 -0
  34. package/media/doc3_fig2.png +0 -0
  35. package/media/doc3_fig3.png +0 -0
  36. package/media/doc3_fig4.png +0 -0
  37. package/media/doc4_fig1.png +0 -0
  38. package/media/doc4_fig2.png +0 -0
  39. package/media/doc4_fig3.png +0 -0
  40. package/media/doc5_fig1.png +0 -0
  41. package/media/doc5_fig2.png +0 -0
  42. package/media/doc5_fig3.png +0 -0
  43. package/package.json +50 -60
  44. package/src/core/module-help.csv +11 -0
  45. package/src/core/module.yaml +25 -0
  46. package/src/core/skills/xiaoma-advanced-elicitation/SKILL.md +6 -0
  47. package/src/core/skills/xiaoma-advanced-elicitation/methods.csv +51 -0
  48. package/src/core/skills/xiaoma-advanced-elicitation/workflow.md +135 -0
  49. package/src/core/skills/xiaoma-advanced-elicitation/xiaoma-skill-manifest.yaml +1 -0
  50. package/src/core/skills/xiaoma-brainstorming/SKILL.md +6 -0
  51. package/src/core/skills/xiaoma-brainstorming/brain-methods.csv +62 -0
  52. package/src/core/skills/xiaoma-brainstorming/steps/step-01-session-setup.md +214 -0
  53. package/src/core/skills/xiaoma-brainstorming/steps/step-01b-continue.md +124 -0
  54. package/src/core/skills/xiaoma-brainstorming/steps/step-02a-user-selected.md +229 -0
  55. package/src/core/skills/xiaoma-brainstorming/steps/step-02b-ai-recommended.md +239 -0
  56. package/src/core/skills/xiaoma-brainstorming/steps/step-02c-random-selection.md +211 -0
  57. package/src/core/skills/xiaoma-brainstorming/steps/step-02d-progressive-flow.md +266 -0
  58. package/src/core/skills/xiaoma-brainstorming/steps/step-03-technique-execution.md +401 -0
  59. package/src/core/skills/xiaoma-brainstorming/steps/step-04-idea-organization.md +305 -0
  60. package/src/core/skills/xiaoma-brainstorming/template.md +15 -0
  61. package/src/core/skills/xiaoma-brainstorming/workflow.md +53 -0
  62. package/src/core/skills/xiaoma-brainstorming/xiaoma-skill-manifest.yaml +1 -0
  63. package/src/core/skills/xiaoma-distillator/SKILL.md +178 -0
  64. package/src/core/skills/xiaoma-distillator/agents/distillate-compressor.md +116 -0
  65. package/src/core/skills/xiaoma-distillator/agents/round-trip-reconstructor.md +68 -0
  66. package/src/core/skills/xiaoma-distillator/resources/compression-rules.md +51 -0
  67. package/src/core/skills/xiaoma-distillator/resources/distillate-format-reference.md +227 -0
  68. package/src/core/skills/xiaoma-distillator/resources/splitting-strategy.md +78 -0
  69. package/src/core/skills/xiaoma-distillator/scripts/analyze_sources.py +300 -0
  70. package/src/core/skills/xiaoma-distillator/scripts/tests/test_analyze_sources.py +204 -0
  71. package/src/core/skills/xiaoma-distillator/xiaoma-skill-manifest.yaml +15 -0
  72. package/src/core/skills/xiaoma-editorial-review-prose/SKILL.md +6 -0
  73. package/src/core/skills/xiaoma-editorial-review-prose/workflow.md +81 -0
  74. package/src/core/skills/xiaoma-editorial-review-prose/xiaoma-skill-manifest.yaml +1 -0
  75. package/src/core/skills/xiaoma-editorial-review-structure/SKILL.md +6 -0
  76. package/src/core/skills/xiaoma-editorial-review-structure/workflow.md +174 -0
  77. package/src/core/skills/xiaoma-editorial-review-structure/xiaoma-skill-manifest.yaml +1 -0
  78. package/src/core/skills/xiaoma-help/SKILL.md +6 -0
  79. package/src/core/skills/xiaoma-help/workflow.md +88 -0
  80. package/src/core/skills/xiaoma-help/xiaoma-skill-manifest.yaml +1 -0
  81. package/src/core/skills/xiaoma-index-docs/SKILL.md +6 -0
  82. package/src/core/skills/xiaoma-index-docs/workflow.md +61 -0
  83. package/src/core/skills/xiaoma-index-docs/xiaoma-skill-manifest.yaml +1 -0
  84. package/src/core/skills/xiaoma-party-mode/SKILL.md +6 -0
  85. package/src/core/skills/xiaoma-party-mode/steps/step-01-agent-loading.md +138 -0
  86. package/src/core/skills/xiaoma-party-mode/steps/step-02-discussion-orchestration.md +187 -0
  87. package/src/core/skills/xiaoma-party-mode/steps/step-03-graceful-exit.md +167 -0
  88. package/src/core/skills/xiaoma-party-mode/workflow.md +190 -0
  89. package/src/core/skills/xiaoma-party-mode/xiaoma-skill-manifest.yaml +1 -0
  90. package/src/core/skills/xiaoma-review-adversarial-general/SKILL.md +6 -0
  91. package/src/core/skills/xiaoma-review-adversarial-general/workflow.md +32 -0
  92. package/src/core/skills/xiaoma-review-adversarial-general/xiaoma-skill-manifest.yaml +1 -0
  93. package/src/core/skills/xiaoma-review-edge-case-hunter/SKILL.md +6 -0
  94. package/src/core/skills/xiaoma-review-edge-case-hunter/workflow.md +62 -0
  95. package/src/core/skills/xiaoma-review-edge-case-hunter/xiaoma-skill-manifest.yaml +1 -0
  96. package/src/core/skills/xiaoma-shard-doc/SKILL.md +6 -0
  97. package/src/core/skills/xiaoma-shard-doc/workflow.md +100 -0
  98. package/src/core/skills/xiaoma-shard-doc/xiaoma-skill-manifest.yaml +1 -0
  99. package/src/core/tasks/xiaoma-create-prd/SKILL.md +6 -0
  100. package/src/core/tasks/xiaoma-create-prd/data/domain-complexity.csv +15 -0
  101. package/src/core/tasks/xiaoma-create-prd/data/prd-purpose.md +354 -0
  102. package/src/core/tasks/xiaoma-create-prd/data/project-types.csv +11 -0
  103. package/src/core/tasks/xiaoma-create-prd/data/upstream-input-contract.md +168 -0
  104. package/src/core/tasks/xiaoma-create-prd/steps-c/step-01-init.md +178 -0
  105. package/src/core/tasks/xiaoma-create-prd/steps-c/step-01b-continue.md +161 -0
  106. package/src/core/tasks/xiaoma-create-prd/steps-c/step-02-discovery.md +208 -0
  107. package/src/core/tasks/xiaoma-create-prd/steps-c/step-02b-vision.md +142 -0
  108. package/src/core/tasks/xiaoma-create-prd/steps-c/step-02c-executive-summary.md +158 -0
  109. package/src/core/tasks/xiaoma-create-prd/steps-c/step-03-success.md +214 -0
  110. package/src/core/tasks/xiaoma-create-prd/steps-c/step-04-journeys.md +201 -0
  111. package/src/core/tasks/xiaoma-create-prd/steps-c/step-05-domain.md +194 -0
  112. package/src/core/tasks/xiaoma-create-prd/steps-c/step-06-innovation.md +211 -0
  113. package/src/core/tasks/xiaoma-create-prd/steps-c/step-07-project-type.md +222 -0
  114. package/src/core/tasks/xiaoma-create-prd/steps-c/step-08-scoping.md +216 -0
  115. package/src/core/tasks/xiaoma-create-prd/steps-c/step-09-functional.md +219 -0
  116. package/src/core/tasks/xiaoma-create-prd/steps-c/step-10-nonfunctional.md +230 -0
  117. package/src/core/tasks/xiaoma-create-prd/steps-c/step-11-polish.md +221 -0
  118. package/src/core/tasks/xiaoma-create-prd/steps-c/step-12-complete.md +115 -0
  119. package/src/core/tasks/xiaoma-create-prd/templates/prd-skeleton-reference.md +428 -0
  120. package/src/core/tasks/xiaoma-create-prd/templates/prd-template.md +108 -0
  121. package/src/core/tasks/xiaoma-create-prd/workflow.md +62 -0
  122. package/src/core/tasks/xiaoma-create-prd/xiaoma-skill-manifest.yaml +1 -0
  123. package/src/utility/agent-components/activation-rules.txt +6 -0
  124. package/src/utility/agent-components/activation-steps.txt +14 -0
  125. package/src/utility/agent-components/agent-command-header.md +1 -0
  126. package/src/utility/agent-components/agent.customize.template.yaml +41 -0
  127. package/src/utility/agent-components/handler-action.txt +4 -0
  128. package/src/utility/agent-components/handler-data.txt +5 -0
  129. package/src/utility/agent-components/handler-exec.txt +6 -0
  130. package/src/utility/agent-components/handler-multi.txt +13 -0
  131. package/src/utility/agent-components/handler-tmpl.txt +5 -0
  132. package/src/utility/agent-components/menu-handlers.txt +6 -0
  133. package/src/xmc/agents/analyst.agent.yaml +47 -0
  134. package/src/xmc/agents/architect.agent.yaml +29 -0
  135. package/src/xmc/agents/dev.agent.yaml +38 -0
  136. package/src/xmc/agents/pm.agent.yaml +44 -0
  137. package/src/xmc/agents/qa.agent.yaml +58 -0
  138. package/src/xmc/agents/quick-flow-solo-dev.agent.yaml +36 -0
  139. package/src/xmc/agents/sm.agent.yaml +53 -0
  140. package/src/xmc/agents/tech-writer/tech-writer-sidecar/documentation-standards.md +224 -0
  141. package/src/xmc/agents/tech-writer/tech-writer.agent.yaml +46 -0
  142. package/src/xmc/agents/tech-writer/xiaoma-skill-manifest.yaml +3 -0
  143. package/src/xmc/agents/ux-designer.agent.yaml +27 -0
  144. package/src/xmc/agents/xiaoma-skill-manifest.yaml +39 -0
  145. package/src/xmc/data/project-context-template.md +26 -0
  146. package/src/xmc/module-help.csv +32 -0
  147. package/src/xmc/module.yaml +50 -0
  148. package/src/xmc/teams/default-party.csv +20 -0
  149. package/src/xmc/teams/team-fullstack.yaml +12 -0
  150. package/src/xmc/workflows/1-analysis/auto-requirements-pipeline/SKILL.md +6 -0
  151. package/src/xmc/workflows/1-analysis/auto-requirements-pipeline/checklist.md +28 -0
  152. package/src/xmc/workflows/1-analysis/auto-requirements-pipeline/steps/step-01-init-and-validate.md +102 -0
  153. package/src/xmc/workflows/1-analysis/auto-requirements-pipeline/steps/step-02-requirements-analysis.md +146 -0
  154. package/src/xmc/workflows/1-analysis/auto-requirements-pipeline/steps/step-03-architecture-analysis.md +141 -0
  155. package/src/xmc/workflows/1-analysis/auto-requirements-pipeline/steps/step-04-create-prd.md +101 -0
  156. package/src/xmc/workflows/1-analysis/auto-requirements-pipeline/steps/step-05-validate-prd.md +159 -0
  157. package/src/xmc/workflows/1-analysis/auto-requirements-pipeline/steps/step-06-create-epics.md +104 -0
  158. package/src/xmc/workflows/1-analysis/auto-requirements-pipeline/steps/step-07-create-architecture.md +107 -0
  159. package/src/xmc/workflows/1-analysis/auto-requirements-pipeline/steps/step-08-finalize.md +124 -0
  160. package/src/xmc/workflows/1-analysis/auto-requirements-pipeline/workflow.md +107 -0
  161. package/src/xmc/workflows/1-analysis/auto-requirements-pipeline/xiaoma-skill-manifest.yaml +3 -0
  162. package/src/xmc/workflows/1-analysis/research/market-steps/step-01-init.md +182 -0
  163. package/src/xmc/workflows/1-analysis/research/market-steps/step-02-customer-behavior.md +237 -0
  164. package/src/xmc/workflows/1-analysis/research/market-steps/step-03-customer-pain-points.md +249 -0
  165. package/src/xmc/workflows/1-analysis/research/market-steps/step-04-customer-decisions.md +259 -0
  166. package/src/xmc/workflows/1-analysis/research/market-steps/step-05-competitive-analysis.md +177 -0
  167. package/src/xmc/workflows/1-analysis/research/market-steps/step-06-research-completion.md +476 -0
  168. package/src/xmc/workflows/1-analysis/research/research.template.md +29 -0
  169. package/src/xmc/workflows/1-analysis/research/xiaoma-domain-research/SKILL.md +6 -0
  170. package/src/xmc/workflows/1-analysis/research/xiaoma-domain-research/domain-steps/step-01-init.md +137 -0
  171. package/src/xmc/workflows/1-analysis/research/xiaoma-domain-research/domain-steps/step-02-domain-analysis.md +229 -0
  172. package/src/xmc/workflows/1-analysis/research/xiaoma-domain-research/domain-steps/step-03-competitive-landscape.md +238 -0
  173. package/src/xmc/workflows/1-analysis/research/xiaoma-domain-research/domain-steps/step-04-regulatory-focus.md +206 -0
  174. package/src/xmc/workflows/1-analysis/research/xiaoma-domain-research/domain-steps/step-05-technical-trends.md +234 -0
  175. package/src/xmc/workflows/1-analysis/research/xiaoma-domain-research/domain-steps/step-06-research-synthesis.md +444 -0
  176. package/src/xmc/workflows/1-analysis/research/xiaoma-domain-research/research.template.md +29 -0
  177. package/src/xmc/workflows/1-analysis/research/xiaoma-domain-research/workflow.md +49 -0
  178. package/src/xmc/workflows/1-analysis/research/xiaoma-domain-research/xiaoma-skill-manifest.yaml +1 -0
  179. package/src/xmc/workflows/1-analysis/research/xiaoma-market-research/SKILL.md +6 -0
  180. package/src/xmc/workflows/1-analysis/research/xiaoma-market-research/research.template.md +29 -0
  181. package/src/xmc/workflows/1-analysis/research/xiaoma-market-research/steps/step-01-init.md +184 -0
  182. package/src/xmc/workflows/1-analysis/research/xiaoma-market-research/steps/step-02-customer-behavior.md +239 -0
  183. package/src/xmc/workflows/1-analysis/research/xiaoma-market-research/steps/step-03-customer-pain-points.md +251 -0
  184. package/src/xmc/workflows/1-analysis/research/xiaoma-market-research/steps/step-04-customer-decisions.md +261 -0
  185. package/src/xmc/workflows/1-analysis/research/xiaoma-market-research/steps/step-05-competitive-analysis.md +173 -0
  186. package/src/xmc/workflows/1-analysis/research/xiaoma-market-research/steps/step-06-research-completion.md +478 -0
  187. package/src/xmc/workflows/1-analysis/research/xiaoma-market-research/workflow.md +49 -0
  188. package/src/xmc/workflows/1-analysis/research/xiaoma-market-research/xiaoma-skill-manifest.yaml +1 -0
  189. package/src/xmc/workflows/1-analysis/research/xiaoma-technical-research/SKILL.md +6 -0
  190. package/src/xmc/workflows/1-analysis/research/xiaoma-technical-research/research.template.md +29 -0
  191. package/src/xmc/workflows/1-analysis/research/xiaoma-technical-research/technical-steps/step-01-init.md +137 -0
  192. package/src/xmc/workflows/1-analysis/research/xiaoma-technical-research/technical-steps/step-02-technical-overview.md +239 -0
  193. package/src/xmc/workflows/1-analysis/research/xiaoma-technical-research/technical-steps/step-03-integration-patterns.md +248 -0
  194. package/src/xmc/workflows/1-analysis/research/xiaoma-technical-research/technical-steps/step-04-architectural-patterns.md +202 -0
  195. package/src/xmc/workflows/1-analysis/research/xiaoma-technical-research/technical-steps/step-05-implementation-research.md +233 -0
  196. package/src/xmc/workflows/1-analysis/research/xiaoma-technical-research/technical-steps/step-06-research-synthesis.md +487 -0
  197. package/src/xmc/workflows/1-analysis/research/xiaoma-technical-research/workflow.md +50 -0
  198. package/src/xmc/workflows/1-analysis/research/xiaoma-technical-research/xiaoma-skill-manifest.yaml +1 -0
  199. package/src/xmc/workflows/1-analysis/xiaoma-create-product-brief/SKILL.md +6 -0
  200. package/src/xmc/workflows/1-analysis/xiaoma-create-product-brief/product-brief.template.md +10 -0
  201. package/src/xmc/workflows/1-analysis/xiaoma-create-product-brief/steps/step-01-init.md +170 -0
  202. package/src/xmc/workflows/1-analysis/xiaoma-create-product-brief/steps/step-01b-continue.md +158 -0
  203. package/src/xmc/workflows/1-analysis/xiaoma-create-product-brief/steps/step-02-vision.md +193 -0
  204. package/src/xmc/workflows/1-analysis/xiaoma-create-product-brief/steps/step-03-users.md +196 -0
  205. package/src/xmc/workflows/1-analysis/xiaoma-create-product-brief/steps/step-04-metrics.md +199 -0
  206. package/src/xmc/workflows/1-analysis/xiaoma-create-product-brief/steps/step-05-scope.md +213 -0
  207. package/src/xmc/workflows/1-analysis/xiaoma-create-product-brief/steps/step-06-complete.md +159 -0
  208. package/src/xmc/workflows/1-analysis/xiaoma-create-product-brief/workflow.md +55 -0
  209. package/src/xmc/workflows/1-analysis/xiaoma-create-product-brief/xiaoma-skill-manifest.yaml +1 -0
  210. package/src/xmc/workflows/1-analysis/xiaoma-product-brief-preview/SKILL.md +88 -0
  211. package/src/xmc/workflows/1-analysis/xiaoma-product-brief-preview/agents/artifact-analyzer.md +60 -0
  212. package/src/xmc/workflows/1-analysis/xiaoma-product-brief-preview/agents/opportunity-reviewer.md +44 -0
  213. package/src/xmc/workflows/1-analysis/xiaoma-product-brief-preview/agents/skeptic-reviewer.md +44 -0
  214. package/src/xmc/workflows/1-analysis/xiaoma-product-brief-preview/agents/web-researcher.md +49 -0
  215. package/src/xmc/workflows/1-analysis/xiaoma-product-brief-preview/prompts/contextual-discovery.md +57 -0
  216. package/src/xmc/workflows/1-analysis/xiaoma-product-brief-preview/prompts/draft-and-review.md +86 -0
  217. package/src/xmc/workflows/1-analysis/xiaoma-product-brief-preview/prompts/finalize.md +75 -0
  218. package/src/xmc/workflows/1-analysis/xiaoma-product-brief-preview/prompts/guided-elicitation.md +70 -0
  219. package/src/xmc/workflows/1-analysis/xiaoma-product-brief-preview/resources/brief-template.md +60 -0
  220. package/src/xmc/workflows/1-analysis/xiaoma-product-brief-preview/xiaoma-manifest.json +17 -0
  221. package/src/xmc/workflows/1-analysis/xiaoma-product-brief-preview/xiaoma-skill-manifest.yaml +1 -0
  222. package/src/xmc/workflows/2-plan-workflows/create-prd/data/domain-complexity.csv +15 -0
  223. package/src/xmc/workflows/2-plan-workflows/create-prd/data/prd-purpose.md +197 -0
  224. package/src/xmc/workflows/2-plan-workflows/create-prd/data/project-types.csv +11 -0
  225. package/src/xmc/workflows/2-plan-workflows/create-prd/steps-v/step-v-01-discovery.md +224 -0
  226. package/src/xmc/workflows/2-plan-workflows/create-prd/steps-v/step-v-02-format-detection.md +191 -0
  227. package/src/xmc/workflows/2-plan-workflows/create-prd/steps-v/step-v-02b-parity-check.md +209 -0
  228. package/src/xmc/workflows/2-plan-workflows/create-prd/steps-v/step-v-03-density-validation.md +174 -0
  229. package/src/xmc/workflows/2-plan-workflows/create-prd/steps-v/step-v-04-brief-coverage-validation.md +214 -0
  230. package/src/xmc/workflows/2-plan-workflows/create-prd/steps-v/step-v-05-measurability-validation.md +228 -0
  231. package/src/xmc/workflows/2-plan-workflows/create-prd/steps-v/step-v-06-traceability-validation.md +217 -0
  232. package/src/xmc/workflows/2-plan-workflows/create-prd/steps-v/step-v-07-implementation-leakage-validation.md +205 -0
  233. package/src/xmc/workflows/2-plan-workflows/create-prd/steps-v/step-v-08-domain-compliance-validation.md +243 -0
  234. package/src/xmc/workflows/2-plan-workflows/create-prd/steps-v/step-v-09-project-type-validation.md +263 -0
  235. package/src/xmc/workflows/2-plan-workflows/create-prd/steps-v/step-v-10-smart-validation.md +209 -0
  236. package/src/xmc/workflows/2-plan-workflows/create-prd/steps-v/step-v-11-holistic-quality-validation.md +264 -0
  237. package/src/xmc/workflows/2-plan-workflows/create-prd/steps-v/step-v-12-completeness-validation.md +242 -0
  238. package/src/xmc/workflows/2-plan-workflows/create-prd/steps-v/step-v-13-report-complete.md +232 -0
  239. package/src/xmc/workflows/2-plan-workflows/create-prd/workflow-validate-prd.md +65 -0
  240. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/SKILL.md +6 -0
  241. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/steps/step-01-init.md +135 -0
  242. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/steps/step-01b-continue.md +127 -0
  243. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/steps/step-02-discovery.md +190 -0
  244. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/steps/step-03-core-experience.md +217 -0
  245. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/steps/step-04-emotional-response.md +220 -0
  246. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/steps/step-05-inspiration.md +235 -0
  247. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/steps/step-06-design-system.md +253 -0
  248. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/steps/step-07-defining-experience.md +255 -0
  249. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/steps/step-08-visual-foundation.md +225 -0
  250. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/steps/step-09-design-directions.md +225 -0
  251. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/steps/step-10-user-journeys.md +242 -0
  252. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/steps/step-11-component-strategy.md +249 -0
  253. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/steps/step-12-ux-patterns.md +238 -0
  254. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/steps/step-13-responsive-accessibility.md +265 -0
  255. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/steps/step-14-complete.md +171 -0
  256. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/ux-design-template.md +13 -0
  257. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/workflow.md +36 -0
  258. package/src/xmc/workflows/2-plan-workflows/xiaoma-create-ux-design/xiaoma-skill-manifest.yaml +1 -0
  259. package/src/xmc/workflows/2-plan-workflows/xiaoma-edit-prd/SKILL.md +6 -0
  260. package/src/xmc/workflows/2-plan-workflows/xiaoma-edit-prd/steps-e/step-e-01-discovery.md +242 -0
  261. package/src/xmc/workflows/2-plan-workflows/xiaoma-edit-prd/steps-e/step-e-01b-legacy-conversion.md +204 -0
  262. package/src/xmc/workflows/2-plan-workflows/xiaoma-edit-prd/steps-e/step-e-02-review.md +245 -0
  263. package/src/xmc/workflows/2-plan-workflows/xiaoma-edit-prd/steps-e/step-e-03-edit.md +250 -0
  264. package/src/xmc/workflows/2-plan-workflows/xiaoma-edit-prd/steps-e/step-e-04-complete.md +165 -0
  265. package/src/xmc/workflows/2-plan-workflows/xiaoma-edit-prd/workflow.md +63 -0
  266. package/src/xmc/workflows/2-plan-workflows/xiaoma-edit-prd/xiaoma-skill-manifest.yaml +1 -0
  267. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/SKILL.md +6 -0
  268. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/data/domain-complexity.csv +15 -0
  269. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/data/prd-purpose.md +197 -0
  270. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/data/prd-quality-rubric.csv +14 -0
  271. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/data/project-types.csv +11 -0
  272. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/steps-v/step-v-01-discovery.md +221 -0
  273. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/steps-v/step-v-02-format-detection.md +188 -0
  274. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/steps-v/step-v-02b-parity-check.md +206 -0
  275. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/steps-v/step-v-03-density-validation.md +171 -0
  276. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/steps-v/step-v-04-brief-coverage-validation.md +211 -0
  277. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/steps-v/step-v-05-measurability-validation.md +225 -0
  278. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/steps-v/step-v-06-traceability-validation.md +214 -0
  279. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/steps-v/step-v-07-implementation-leakage-validation.md +202 -0
  280. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/steps-v/step-v-08-domain-compliance-validation.md +240 -0
  281. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/steps-v/step-v-09-project-type-validation.md +260 -0
  282. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/steps-v/step-v-10-smart-validation.md +206 -0
  283. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/steps-v/step-v-11-holistic-quality-validation.md +261 -0
  284. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/steps-v/step-v-12-completeness-validation.md +239 -0
  285. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/steps-v/step-v-13-report-complete.md +229 -0
  286. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/workflow.md +62 -0
  287. package/src/xmc/workflows/2-plan-workflows/xiaoma-validate-prd/xiaoma-skill-manifest.yaml +1 -0
  288. package/src/xmc/workflows/3-solutioning/xiaoma-check-implementation-readiness/SKILL.md +6 -0
  289. package/src/xmc/workflows/3-solutioning/xiaoma-check-implementation-readiness/steps/step-01-document-discovery.md +179 -0
  290. package/src/xmc/workflows/3-solutioning/xiaoma-check-implementation-readiness/steps/step-02-prd-analysis.md +168 -0
  291. package/src/xmc/workflows/3-solutioning/xiaoma-check-implementation-readiness/steps/step-03-epic-coverage-validation.md +169 -0
  292. package/src/xmc/workflows/3-solutioning/xiaoma-check-implementation-readiness/steps/step-04-ux-alignment.md +129 -0
  293. package/src/xmc/workflows/3-solutioning/xiaoma-check-implementation-readiness/steps/step-05-epic-quality-review.md +241 -0
  294. package/src/xmc/workflows/3-solutioning/xiaoma-check-implementation-readiness/steps/step-06-final-assessment.md +126 -0
  295. package/src/xmc/workflows/3-solutioning/xiaoma-check-implementation-readiness/templates/readiness-report-template.md +4 -0
  296. package/src/xmc/workflows/3-solutioning/xiaoma-check-implementation-readiness/workflow.md +49 -0
  297. package/src/xmc/workflows/3-solutioning/xiaoma-check-implementation-readiness/xiaoma-skill-manifest.yaml +1 -0
  298. package/src/xmc/workflows/3-solutioning/xiaoma-create-architecture/SKILL.md +6 -0
  299. package/src/xmc/workflows/3-solutioning/xiaoma-create-architecture/architecture-decision-template.md +12 -0
  300. package/src/xmc/workflows/3-solutioning/xiaoma-create-architecture/data/domain-complexity.csv +13 -0
  301. package/src/xmc/workflows/3-solutioning/xiaoma-create-architecture/data/project-types.csv +7 -0
  302. package/src/xmc/workflows/3-solutioning/xiaoma-create-architecture/steps/step-01-init.md +153 -0
  303. package/src/xmc/workflows/3-solutioning/xiaoma-create-architecture/steps/step-01b-continue.md +173 -0
  304. package/src/xmc/workflows/3-solutioning/xiaoma-create-architecture/steps/step-02-context.md +224 -0
  305. package/src/xmc/workflows/3-solutioning/xiaoma-create-architecture/steps/step-03-starter.md +329 -0
  306. package/src/xmc/workflows/3-solutioning/xiaoma-create-architecture/steps/step-04-decisions.md +318 -0
  307. package/src/xmc/workflows/3-solutioning/xiaoma-create-architecture/steps/step-05-patterns.md +359 -0
  308. package/src/xmc/workflows/3-solutioning/xiaoma-create-architecture/steps/step-06-structure.md +379 -0
  309. package/src/xmc/workflows/3-solutioning/xiaoma-create-architecture/steps/step-07-validation.md +359 -0
  310. package/src/xmc/workflows/3-solutioning/xiaoma-create-architecture/steps/step-08-complete.md +76 -0
  311. package/src/xmc/workflows/3-solutioning/xiaoma-create-architecture/workflow.md +38 -0
  312. package/src/xmc/workflows/3-solutioning/xiaoma-create-architecture/xiaoma-skill-manifest.yaml +1 -0
  313. package/src/xmc/workflows/3-solutioning/xiaoma-create-epics-and-stories/SKILL.md +6 -0
  314. package/src/xmc/workflows/3-solutioning/xiaoma-create-epics-and-stories/steps/step-01-validate-prerequisites.md +255 -0
  315. package/src/xmc/workflows/3-solutioning/xiaoma-create-epics-and-stories/steps/step-02-design-epics.md +212 -0
  316. package/src/xmc/workflows/3-solutioning/xiaoma-create-epics-and-stories/steps/step-03-create-stories.md +255 -0
  317. package/src/xmc/workflows/3-solutioning/xiaoma-create-epics-and-stories/steps/step-04-final-validation.md +131 -0
  318. package/src/xmc/workflows/3-solutioning/xiaoma-create-epics-and-stories/templates/epics-template.md +61 -0
  319. package/src/xmc/workflows/3-solutioning/xiaoma-create-epics-and-stories/workflow.md +53 -0
  320. package/src/xmc/workflows/3-solutioning/xiaoma-create-epics-and-stories/xiaoma-skill-manifest.yaml +1 -0
  321. package/src/xmc/workflows/4-implementation/auto-story-pipeline/SKILL.md +6 -0
  322. package/src/xmc/workflows/4-implementation/auto-story-pipeline/checklist.md +22 -0
  323. package/src/xmc/workflows/4-implementation/auto-story-pipeline/steps/step-01-init-and-validate.md +173 -0
  324. package/src/xmc/workflows/4-implementation/auto-story-pipeline/steps/step-02-create-story.md +102 -0
  325. package/src/xmc/workflows/4-implementation/auto-story-pipeline/steps/step-03-validate-story.md +107 -0
  326. package/src/xmc/workflows/4-implementation/auto-story-pipeline/steps/step-04-develop-story.md +97 -0
  327. package/src/xmc/workflows/4-implementation/auto-story-pipeline/steps/step-05-code-review.md +95 -0
  328. package/src/xmc/workflows/4-implementation/auto-story-pipeline/steps/step-06-test-story.md +253 -0
  329. package/src/xmc/workflows/4-implementation/auto-story-pipeline/steps/step-07-fix-and-retest.md +237 -0
  330. package/src/xmc/workflows/4-implementation/auto-story-pipeline/steps/step-08-complete-story.md +114 -0
  331. package/src/xmc/workflows/4-implementation/auto-story-pipeline/steps/step-09-finalize.md +69 -0
  332. package/src/xmc/workflows/4-implementation/auto-story-pipeline/workflow.md +89 -0
  333. package/src/xmc/workflows/4-implementation/auto-story-pipeline/xiaoma-skill-manifest.yaml +3 -0
  334. package/src/xmc/workflows/4-implementation/auto-story-pipeline-batch/SKILL.md +6 -0
  335. package/src/xmc/workflows/4-implementation/auto-story-pipeline-batch/workflow.md +333 -0
  336. package/src/xmc/workflows/4-implementation/auto-story-pipeline-batch/xiaoma-skill-manifest.yaml +3 -0
  337. package/src/xmc/workflows/4-implementation/xiaoma-code-review/SKILL.md +6 -0
  338. package/src/xmc/workflows/4-implementation/xiaoma-code-review/checklist.md +23 -0
  339. package/src/xmc/workflows/4-implementation/xiaoma-code-review/discover-inputs.md +88 -0
  340. package/src/xmc/workflows/4-implementation/xiaoma-code-review/steps/step-01-gather-context.md +61 -0
  341. package/src/xmc/workflows/4-implementation/xiaoma-code-review/steps/step-02-review.md +41 -0
  342. package/src/xmc/workflows/4-implementation/xiaoma-code-review/steps/step-03-triage.md +50 -0
  343. package/src/xmc/workflows/4-implementation/xiaoma-code-review/steps/step-04-present.md +38 -0
  344. package/src/xmc/workflows/4-implementation/xiaoma-code-review/workflow.md +54 -0
  345. package/src/xmc/workflows/4-implementation/xiaoma-code-review/xiaoma-skill-manifest.yaml +1 -0
  346. package/src/xmc/workflows/4-implementation/xiaoma-correct-course/SKILL.md +6 -0
  347. package/src/xmc/workflows/4-implementation/xiaoma-correct-course/checklist.md +288 -0
  348. package/src/xmc/workflows/4-implementation/xiaoma-correct-course/workflow.md +267 -0
  349. package/src/xmc/workflows/4-implementation/xiaoma-correct-course/xiaoma-skill-manifest.yaml +1 -0
  350. package/src/xmc/workflows/4-implementation/xiaoma-create-story/SKILL.md +6 -0
  351. package/src/xmc/workflows/4-implementation/xiaoma-create-story/checklist.md +357 -0
  352. package/src/xmc/workflows/4-implementation/xiaoma-create-story/discover-inputs.md +88 -0
  353. package/src/xmc/workflows/4-implementation/xiaoma-create-story/template.md +49 -0
  354. package/src/xmc/workflows/4-implementation/xiaoma-create-story/workflow.md +380 -0
  355. package/src/xmc/workflows/4-implementation/xiaoma-create-story/xiaoma-skill-manifest.yaml +1 -0
  356. package/src/xmc/workflows/4-implementation/xiaoma-dev-story/SKILL.md +6 -0
  357. package/src/xmc/workflows/4-implementation/xiaoma-dev-story/checklist.md +80 -0
  358. package/src/xmc/workflows/4-implementation/xiaoma-dev-story/workflow.md +450 -0
  359. package/src/xmc/workflows/4-implementation/xiaoma-dev-story/xiaoma-skill-manifest.yaml +1 -0
  360. package/src/xmc/workflows/4-implementation/xiaoma-retrospective/SKILL.md +6 -0
  361. package/src/xmc/workflows/4-implementation/xiaoma-retrospective/workflow.md +1479 -0
  362. package/src/xmc/workflows/4-implementation/xiaoma-retrospective/xiaoma-skill-manifest.yaml +1 -0
  363. package/src/xmc/workflows/4-implementation/xiaoma-sprint-planning/SKILL.md +6 -0
  364. package/src/xmc/workflows/4-implementation/xiaoma-sprint-planning/checklist.md +33 -0
  365. package/src/xmc/workflows/4-implementation/xiaoma-sprint-planning/sprint-status-template.yaml +56 -0
  366. package/src/xmc/workflows/4-implementation/xiaoma-sprint-planning/workflow.md +263 -0
  367. package/src/xmc/workflows/4-implementation/xiaoma-sprint-planning/xiaoma-skill-manifest.yaml +1 -0
  368. package/src/xmc/workflows/4-implementation/xiaoma-sprint-status/SKILL.md +6 -0
  369. package/src/xmc/workflows/4-implementation/xiaoma-sprint-status/workflow.md +261 -0
  370. package/src/xmc/workflows/4-implementation/xiaoma-sprint-status/xiaoma-skill-manifest.yaml +1 -0
  371. package/src/xmc/workflows/5-full-pipeline/auto-full-pipeline/SKILL.md +6 -0
  372. package/src/xmc/workflows/5-full-pipeline/auto-full-pipeline/checklist.md +37 -0
  373. package/src/xmc/workflows/5-full-pipeline/auto-full-pipeline/steps/step-01-init-and-validate.md +152 -0
  374. package/src/xmc/workflows/5-full-pipeline/auto-full-pipeline/steps/step-02-run-requirements-pipeline.md +120 -0
  375. package/src/xmc/workflows/5-full-pipeline/auto-full-pipeline/steps/step-03-bridge-sprint-planning.md +119 -0
  376. package/src/xmc/workflows/5-full-pipeline/auto-full-pipeline/steps/step-04-run-story-pipeline.md +114 -0
  377. package/src/xmc/workflows/5-full-pipeline/auto-full-pipeline/steps/step-05-finalize.md +194 -0
  378. package/src/xmc/workflows/5-full-pipeline/auto-full-pipeline/workflow.md +108 -0
  379. package/src/xmc/workflows/5-full-pipeline/auto-full-pipeline/xiaoma-skill-manifest.yaml +3 -0
  380. package/src/xmc/workflows/5-full-pipeline/auto-prd-to-stories/SKILL.md +6 -0
  381. package/src/xmc/workflows/5-full-pipeline/auto-prd-to-stories/checklist.md +43 -0
  382. package/src/xmc/workflows/5-full-pipeline/auto-prd-to-stories/steps/step-01-init-and-validate.md +155 -0
  383. package/src/xmc/workflows/5-full-pipeline/auto-prd-to-stories/steps/step-02-create-epics.md +156 -0
  384. package/src/xmc/workflows/5-full-pipeline/auto-prd-to-stories/steps/step-03-bridge-sprint-planning.md +143 -0
  385. package/src/xmc/workflows/5-full-pipeline/auto-prd-to-stories/steps/step-04-batch-create-stories.md +309 -0
  386. package/src/xmc/workflows/5-full-pipeline/auto-prd-to-stories/steps/step-05-finalize.md +311 -0
  387. package/src/xmc/workflows/5-full-pipeline/auto-prd-to-stories/workflow.md +105 -0
  388. package/src/xmc/workflows/5-full-pipeline/auto-prd-to-stories/xiaoma-skill-manifest.yaml +3 -0
  389. package/src/xmc/workflows/xiaoma-document-project/SKILL.md +6 -0
  390. package/src/xmc/workflows/xiaoma-document-project/checklist.md +245 -0
  391. package/src/xmc/workflows/xiaoma-document-project/documentation-requirements.csv +12 -0
  392. package/src/xmc/workflows/xiaoma-document-project/instructions.md +128 -0
  393. package/src/xmc/workflows/xiaoma-document-project/templates/deep-dive-template.md +345 -0
  394. package/src/xmc/workflows/xiaoma-document-project/templates/index-template.md +169 -0
  395. package/src/xmc/workflows/xiaoma-document-project/templates/project-overview-template.md +103 -0
  396. package/src/xmc/workflows/xiaoma-document-project/templates/project-scan-report-schema.json +160 -0
  397. package/src/xmc/workflows/xiaoma-document-project/templates/source-tree-template.md +135 -0
  398. package/src/xmc/workflows/xiaoma-document-project/workflow.md +27 -0
  399. package/src/xmc/workflows/xiaoma-document-project/workflows/deep-dive-instructions.md +299 -0
  400. package/src/xmc/workflows/xiaoma-document-project/workflows/deep-dive-workflow.md +34 -0
  401. package/src/xmc/workflows/xiaoma-document-project/workflows/full-scan-instructions.md +1107 -0
  402. package/src/xmc/workflows/xiaoma-document-project/workflows/full-scan-workflow.md +34 -0
  403. package/src/xmc/workflows/xiaoma-document-project/xiaoma-skill-manifest.yaml +1 -0
  404. package/src/xmc/workflows/xiaoma-generate-project-context/SKILL.md +6 -0
  405. package/src/xmc/workflows/xiaoma-generate-project-context/project-context-template.md +21 -0
  406. package/src/xmc/workflows/xiaoma-generate-project-context/steps/step-01-discover.md +186 -0
  407. package/src/xmc/workflows/xiaoma-generate-project-context/steps/step-02-generate.md +321 -0
  408. package/src/xmc/workflows/xiaoma-generate-project-context/steps/step-03-complete.md +278 -0
  409. package/src/xmc/workflows/xiaoma-generate-project-context/workflow.md +43 -0
  410. package/src/xmc/workflows/xiaoma-generate-project-context/xiaoma-skill-manifest.yaml +1 -0
  411. package/src/xmc/workflows/xiaoma-qa-generate-e2e-tests/SKILL.md +6 -0
  412. package/src/xmc/workflows/xiaoma-qa-generate-e2e-tests/checklist.md +33 -0
  413. package/src/xmc/workflows/xiaoma-qa-generate-e2e-tests/workflow.md +136 -0
  414. package/src/xmc/workflows/xiaoma-qa-generate-e2e-tests/xiaoma-skill-manifest.yaml +1 -0
  415. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev/SKILL.md +6 -0
  416. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev/steps/step-01-mode-detection.md +169 -0
  417. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev/steps/step-02-context-gathering.md +114 -0
  418. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev/steps/step-03-execute.md +107 -0
  419. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev/steps/step-04-self-check.md +107 -0
  420. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev/steps/step-05-adversarial-review.md +94 -0
  421. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev/steps/step-06-resolve-findings.md +144 -0
  422. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev/workflow.md +38 -0
  423. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev/xiaoma-skill-manifest.yaml +1 -0
  424. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev-new-preview/SKILL.md +6 -0
  425. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev-new-preview/steps/step-01-clarify-and-route.md +51 -0
  426. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev-new-preview/steps/step-02-plan.md +35 -0
  427. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev-new-preview/steps/step-03-implement.md +33 -0
  428. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev-new-preview/steps/step-04-review.md +50 -0
  429. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev-new-preview/steps/step-05-present.md +17 -0
  430. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev-new-preview/tech-spec-template.md +90 -0
  431. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev-new-preview/workflow.md +79 -0
  432. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-dev-new-preview/xiaoma-skill-manifest.yaml +1 -0
  433. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-spec/SKILL.md +6 -0
  434. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-spec/steps/step-01-understand.md +185 -0
  435. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-spec/steps/step-02-investigate.md +140 -0
  436. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-spec/steps/step-03-generate.md +123 -0
  437. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-spec/steps/step-04-review.md +195 -0
  438. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-spec/tech-spec-template.md +74 -0
  439. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-spec/workflow.md +73 -0
  440. package/src/xmc/workflows/xiaoma-quick-flow/xiaoma-quick-spec/xiaoma-skill-manifest.yaml +1 -0
  441. package/src/xpm/agents/patent-advisor.agent.yaml +30 -0
  442. package/src/xpm/module.yaml +26 -0
  443. package/src/xpm/skills/xiaoma-patent-mining/SKILL.md +6 -0
  444. package/src/xpm/skills/xiaoma-patent-mining/references/disclosure-template.md +84 -0
  445. package/src/xpm/skills/xiaoma-patent-mining/references/docx-format-spec.md +183 -0
  446. package/src/xpm/skills/xiaoma-patent-mining/references/mining-principles.md +168 -0
  447. package/src/xpm/skills/xiaoma-patent-mining/scripts/md2docx.js +777 -0
  448. package/src/xpm/skills/xiaoma-patent-mining/steps/step-01-project-analysis.md +65 -0
  449. package/src/xpm/skills/xiaoma-patent-mining/steps/step-02-patent-mining.md +87 -0
  450. package/src/xpm/skills/xiaoma-patent-mining/steps/step-03-disclosure-writing.md +110 -0
  451. package/src/xpm/skills/xiaoma-patent-mining/steps/step-04-ai-taste-removal.md +85 -0
  452. package/src/xpm/skills/xiaoma-patent-mining/steps/step-05-docx-generation.md +111 -0
  453. package/src/xpm/skills/xiaoma-patent-mining/workflow.md +94 -0
  454. package/src/xpm/skills/xiaoma-patent-mining/xiaoma-skill-manifest.yaml +1 -0
  455. package/tools/cli/README.md +60 -0
  456. package/tools/cli/commands/install.js +87 -0
  457. package/tools/cli/commands/status.js +65 -0
  458. package/tools/cli/commands/uninstall.js +167 -0
  459. package/tools/cli/external-official-modules.yaml +6 -0
  460. package/tools/cli/installers/install-messages.yaml +9 -0
  461. package/tools/cli/installers/lib/core/config-collector.js +1285 -0
  462. package/tools/cli/installers/lib/core/custom-module-cache.js +260 -0
  463. package/tools/cli/installers/lib/core/dependency-resolver.js +742 -0
  464. package/tools/cli/installers/lib/core/detector.js +223 -0
  465. package/tools/cli/installers/lib/core/ide-config-manager.js +157 -0
  466. package/tools/cli/installers/lib/core/installer.js +3216 -0
  467. package/tools/cli/installers/lib/core/manifest-generator.js +1374 -0
  468. package/tools/cli/installers/lib/core/manifest.js +1042 -0
  469. package/tools/cli/installers/lib/custom/handler.js +358 -0
  470. package/tools/cli/installers/lib/ide/_base-ide.js +673 -0
  471. package/tools/cli/installers/lib/ide/_config-driven.js +1058 -0
  472. package/tools/cli/installers/lib/ide/manager.js +304 -0
  473. package/tools/cli/installers/lib/ide/platform-codes.js +100 -0
  474. package/tools/cli/installers/lib/ide/platform-codes.yaml +321 -0
  475. package/tools/cli/installers/lib/ide/shared/agent-command-generator.js +181 -0
  476. package/tools/cli/installers/lib/ide/shared/module-injections.js +136 -0
  477. package/tools/cli/installers/lib/ide/shared/path-utils.js +364 -0
  478. package/tools/cli/installers/lib/ide/shared/skill-manifest.js +90 -0
  479. package/tools/cli/installers/lib/ide/shared/task-tool-command-generator.js +368 -0
  480. package/tools/cli/installers/lib/ide/shared/workflow-command-generator.js +179 -0
  481. package/tools/cli/installers/lib/ide/shared/xiaoma-artifacts.js +181 -0
  482. package/tools/cli/installers/lib/ide/templates/agent-command-template.md +14 -0
  483. package/tools/cli/installers/lib/ide/templates/combined/antigravity.md +8 -0
  484. package/tools/cli/installers/lib/ide/templates/combined/default-agent.md +15 -0
  485. package/tools/cli/installers/lib/ide/templates/combined/default-task.md +10 -0
  486. package/tools/cli/installers/lib/ide/templates/combined/default-tool.md +10 -0
  487. package/tools/cli/installers/lib/ide/templates/combined/default-workflow.md +6 -0
  488. package/tools/cli/installers/lib/ide/templates/combined/gemini-agent.toml +14 -0
  489. package/tools/cli/installers/lib/ide/templates/combined/gemini-task.toml +11 -0
  490. package/tools/cli/installers/lib/ide/templates/combined/gemini-tool.toml +11 -0
  491. package/tools/cli/installers/lib/ide/templates/combined/gemini-workflow-yaml.toml +16 -0
  492. package/tools/cli/installers/lib/ide/templates/combined/gemini-workflow.toml +14 -0
  493. package/tools/cli/installers/lib/ide/templates/combined/kiro-agent.md +16 -0
  494. package/tools/cli/installers/lib/ide/templates/combined/kiro-task.md +9 -0
  495. package/tools/cli/installers/lib/ide/templates/combined/kiro-tool.md +9 -0
  496. package/tools/cli/installers/lib/ide/templates/combined/kiro-workflow.md +7 -0
  497. package/tools/cli/installers/lib/ide/templates/combined/opencode-agent.md +15 -0
  498. package/tools/cli/installers/lib/ide/templates/combined/opencode-task.md +13 -0
  499. package/tools/cli/installers/lib/ide/templates/combined/opencode-tool.md +13 -0
  500. package/tools/cli/installers/lib/ide/templates/combined/opencode-workflow-yaml.md +16 -0
  501. package/tools/cli/installers/lib/ide/templates/combined/opencode-workflow.md +16 -0
  502. package/tools/cli/installers/lib/ide/templates/combined/rovodev.md +9 -0
  503. package/tools/cli/installers/lib/ide/templates/combined/trae.md +9 -0
  504. package/tools/cli/installers/lib/ide/templates/combined/windsurf-workflow.md +10 -0
  505. package/tools/cli/installers/lib/ide/templates/split/.gitkeep +0 -0
  506. package/tools/cli/installers/lib/message-loader.js +83 -0
  507. package/tools/cli/installers/lib/modules/external-manager.js +136 -0
  508. package/tools/cli/installers/lib/modules/manager.js +1387 -0
  509. package/tools/cli/lib/activation-builder.js +165 -0
  510. package/tools/cli/lib/agent/compiler.js +516 -0
  511. package/tools/cli/lib/agent/installer.js +680 -0
  512. package/tools/cli/lib/agent/template-engine.js +152 -0
  513. package/tools/cli/lib/agent-analyzer.js +97 -0
  514. package/tools/cli/lib/agent-party-generator.js +203 -0
  515. package/tools/cli/lib/cli-utils.js +182 -0
  516. package/tools/cli/lib/config.js +213 -0
  517. package/tools/cli/lib/file-ops.js +204 -0
  518. package/tools/cli/lib/platform-codes.js +116 -0
  519. package/tools/cli/lib/project-root.js +75 -0
  520. package/tools/cli/lib/prompts.js +809 -0
  521. package/tools/cli/lib/ui.js +1960 -0
  522. package/tools/cli/lib/xml-handler.js +177 -0
  523. package/tools/cli/lib/xml-to-markdown.js +82 -0
  524. package/tools/{yaml-format.js → cli/lib/yaml-format.js} +39 -71
  525. package/tools/cli/lib/yaml-xml-builder.js +570 -0
  526. package/tools/cli/xiaoma-cli.js +106 -0
  527. package/tools/lib/xml-utils.js +13 -0
  528. package/tools/platform-codes.yaml +157 -0
  529. package/tools/schema/agent.js +489 -0
  530. package/tools/validate-svg-changes.sh +356 -0
  531. package/tools/xiaoma-npx-wrapper.js +18 -24
  532. package//344/270/223/345/210/251/344/272/244/345/272/225/344/271/246_1_/351/235/242/345/220/221AI/346/231/272/350/203/275/344/275/223/347/232/204/345/244/232/351/200/232/351/201/223/344/276/235/350/265/226_20260318.md +483 -0
  533. package//344/270/223/345/210/251/344/272/244/345/272/225/344/271/246_2_/345/237/272/344/272/216/351/205/215/347/275/256/351/251/261/345/212/250/347/232/204/350/267/250/345/271/263/345/217/260IDE/346/231/272/350/203/275_20260318.md +592 -0
  534. package//344/270/223/345/210/251/344/272/244/345/272/225/344/271/246_3_AI/346/231/272/350/203/275/344/275/223/345/243/260/346/230/216/345/274/217/345/256/232/344/271/211/347/232/204/347/274/226/350/257/221/346/265/201/346/260/264_20260318.md +624 -0
  535. package//344/270/223/345/210/251/344/272/244/345/272/225/344/271/246_4_/345/237/272/344/272/216/345/223/210/345/270/214/346/214/207/347/272/271/347/232/204/346/231/272/350/203/275/344/275/223/351/231/204/345/261/236/350/265/204/346/272/220/351/200/211_20260318.md +628 -0
  536. package//344/270/223/345/210/251/344/272/244/345/272/225/344/271/246_5_AI/346/231/272/350/203/275/344/275/223/350/247/246/345/217/221/346/214/207/344/273/244/347/232/204/345/244/215/345/220/210/346/240/274/345/274/217/346/240/241_20260318.md +652 -0
  537. package/.claude/agents/tech-translator.md +0 -124
  538. package/.claude/settings.local.json +0 -37
  539. package/.idea/XiaoMa-Cli.iml +0 -9
  540. package/.idea/inspectionProfiles/Project_Default.xml +0 -6
  541. package/.idea/misc.xml +0 -6
  542. package/.idea/modules.xml +0 -8
  543. package/.idea/prettier.xml +0 -6
  544. package/.idea/vcs.xml +0 -7
  545. package/.idea/workspace.xml +0 -117
  546. package/.xiaoma-core/.coordinator-state.json +0 -19
  547. package/JAVA-BACKEND-COMMANDS-REFERENCE.md +0 -300
  548. package/JAVA-BACKEND-ITERATION-GUIDE.md +0 -2116
  549. package/common/tasks/create-doc.md +0 -103
  550. package/common/tasks/execute-checklist.md +0 -88
  551. package/common/utils/bmad-doc-template.md +0 -327
  552. package/common/utils/workflow-management.md +0 -71
  553. package/dist/agents/analyst.txt +0 -6308
  554. package/dist/agents/architect.txt +0 -5046
  555. package/dist/agents/automation-orchestrator.txt +0 -396
  556. package/dist/agents/dev.txt +0 -1180
  557. package/dist/agents/full-requirement-orchestrator.txt +0 -505
  558. package/dist/agents/pm.txt +0 -3078
  559. package/dist/agents/po.txt +0 -1358
  560. package/dist/agents/qa.txt +0 -2002
  561. package/dist/agents/sm.txt +0 -3044
  562. package/dist/agents/ux-expert.txt +0 -707
  563. package/dist/agents/workflow-executor.txt +0 -1029
  564. package/dist/agents/workflow-helper.txt +0 -93
  565. package/dist/agents/xiaoma-master.txt +0 -9008
  566. package/dist/agents/xiaoma-orchestrator.txt +0 -1523
  567. package/dist/teams/team-all.txt +0 -23101
  568. package/dist/teams/team-fullstack-with-database.txt +0 -25076
  569. package/dist/teams/team-fullstack.txt +0 -15820
  570. package/dist/teams/team-ide-minimal.txt +0 -8285
  571. package/dist/teams/team-no-ui.txt +0 -14368
  572. package/docs/GUIDING-PRINCIPLES.md +0 -91
  573. package/docs/architecture/workflow-coordinator-implementation.md +0 -1188
  574. package/docs/architecture-sharding-modification.md +0 -623
  575. package/docs/automated-requirements-analysis-outputs.md +0 -896
  576. package/docs/core-architecture.md +0 -219
  577. package/docs/enhanced-ide-development-workflow.md +0 -248
  578. package/docs/prd/workflow-coordinator-prd.md +0 -1214
  579. package/docs/user-guide.md +0 -530
  580. package/docs/versioning-and-releases.md +0 -155
  581. package/docs/versions.md +0 -48
  582. package/docs/working-in-the-brownfield.md +0 -597
  583. package/tools/api-server.js +0 -367
  584. package/tools/builders/web-builder.js +0 -830
  585. package/tools/bump-all-versions.js +0 -133
  586. package/tools/cli.js +0 -157
  587. package/tools/flattener/aggregate.js +0 -94
  588. package/tools/flattener/binary.js +0 -83
  589. package/tools/flattener/discovery.js +0 -79
  590. package/tools/flattener/files.js +0 -35
  591. package/tools/flattener/ignoreRules.js +0 -177
  592. package/tools/flattener/main.js +0 -673
  593. package/tools/flattener/projectRoot.js +0 -211
  594. package/tools/flattener/prompts.js +0 -46
  595. package/tools/flattener/stats.helpers.js +0 -424
  596. package/tools/flattener/stats.js +0 -80
  597. package/tools/flattener/test-matrix.js +0 -468
  598. package/tools/flattener/xml.js +0 -96
  599. package/tools/installer/README.md +0 -8
  600. package/tools/installer/bin/xiaoma.js +0 -477
  601. package/tools/installer/config/ide-agent-config.yaml +0 -58
  602. package/tools/installer/config/install.config.yaml +0 -164
  603. package/tools/installer/lib/config-loader.js +0 -286
  604. package/tools/installer/lib/file-manager.js +0 -446
  605. package/tools/installer/lib/ide-base-setup.js +0 -238
  606. package/tools/installer/lib/ide-setup.js +0 -2027
  607. package/tools/installer/lib/installer.js +0 -2333
  608. package/tools/installer/lib/memory-profiler.js +0 -235
  609. package/tools/installer/lib/module-manager.js +0 -116
  610. package/tools/installer/lib/resource-locator.js +0 -334
  611. package/tools/installer/package-lock.json +0 -715
  612. package/tools/installer/package.json +0 -44
  613. package/tools/lib/dependency-resolver.js +0 -186
  614. package/tools/lib/yaml-utils.js +0 -34
  615. package/tools/md-assets/web-agent-startup-instructions.md +0 -39
  616. package/tools/preview-release-notes.js +0 -74
  617. package/tools/setup-hooks.sh +0 -37
  618. package/tools/shared/bannerArt.js +0 -105
  619. package/tools/sync-installer-version.js +0 -41
  620. package/tools/sync-version.sh +0 -23
  621. package/tools/upgraders/v3-to-v4-upgrader.js +0 -753
  622. package/tools/version-bump.js +0 -100
  623. package/tools/workflow-coordinator/README.md +0 -38
  624. package/tools/workflow-coordinator/USAGE.md +0 -548
  625. package/tools/workflow-coordinator/package-lock.json +0 -4868
  626. package/tools/workflow-coordinator/package.json +0 -35
  627. package/tools/workflow-coordinator/src/api/server.js +0 -207
  628. package/tools/workflow-coordinator/src/controller/workflow-controller.js +0 -263
  629. package/tools/workflow-coordinator/src/index.js +0 -113
  630. package/tools/workflow-coordinator/src/parser/workflow-parser.js +0 -144
  631. package/tools/workflow-coordinator/src/utils/state-manager.js +0 -59
  632. package/tools/workflow-coordinator/src/utils/validator.js +0 -86
  633. package/tools/workflow-coordinator/test/integration-test.js +0 -266
  634. package/tools/workflow-coordinator/test/quick-test.js +0 -127
  635. package/xiaoma-core/agent-teams/team-all.yaml +0 -15
  636. package/xiaoma-core/agent-teams/team-fullstack-with-database.yaml +0 -27
  637. package/xiaoma-core/agent-teams/team-fullstack.yaml +0 -19
  638. package/xiaoma-core/agent-teams/team-ide-minimal.yaml +0 -11
  639. package/xiaoma-core/agent-teams/team-no-ui.yaml +0 -14
  640. package/xiaoma-core/agents/analyst.md +0 -91
  641. package/xiaoma-core/agents/architect.md +0 -88
  642. package/xiaoma-core/agents/automated-fix-validator.yaml +0 -579
  643. package/xiaoma-core/agents/automated-quality-validator.yaml +0 -549
  644. package/xiaoma-core/agents/automation-orchestrator.md +0 -353
  645. package/xiaoma-core/agents/dev.md +0 -144
  646. package/xiaoma-core/agents/enhanced-workflow-orchestrator.yaml +0 -304
  647. package/xiaoma-core/agents/full-requirement-orchestrator.md +0 -462
  648. package/xiaoma-core/agents/global-requirements-auditor.yaml +0 -520
  649. package/xiaoma-core/agents/intelligent-template-adapter.yaml +0 -389
  650. package/xiaoma-core/agents/issue-dispatcher.yaml +0 -627
  651. package/xiaoma-core/agents/master-execution-engine.yaml +0 -543
  652. package/xiaoma-core/agents/pm.md +0 -85
  653. package/xiaoma-core/agents/po.md +0 -77
  654. package/xiaoma-core/agents/qa.md +0 -88
  655. package/xiaoma-core/agents/requirements-coverage-auditor.yaml +0 -373
  656. package/xiaoma-core/agents/sm.md +0 -125
  657. package/xiaoma-core/agents/ux-expert.md +0 -67
  658. package/xiaoma-core/agents/workflow-executor.md +0 -1031
  659. package/xiaoma-core/agents/workflow-helper.md +0 -481
  660. package/xiaoma-core/agents/xiaoma-master.md +0 -108
  661. package/xiaoma-core/agents/xiaoma-orchestrator.md +0 -145
  662. package/xiaoma-core/checklists/architect-checklist.md +0 -440
  663. package/xiaoma-core/checklists/change-checklist.md +0 -184
  664. package/xiaoma-core/checklists/dev-completion-checklist.md +0 -324
  665. package/xiaoma-core/checklists/pm-checklist.md +0 -372
  666. package/xiaoma-core/checklists/po-master-checklist.md +0 -434
  667. package/xiaoma-core/checklists/po-story-validation-checklist.md +0 -219
  668. package/xiaoma-core/checklists/qa-approval-checklist.md +0 -393
  669. package/xiaoma-core/checklists/story-dod-checklist.md +0 -96
  670. package/xiaoma-core/checklists/story-draft-checklist.md +0 -155
  671. package/xiaoma-core/core-config.yaml +0 -23
  672. package/xiaoma-core/data/bmad-kb.md +0 -809
  673. package/xiaoma-core/data/brainstorming-techniques.md +0 -38
  674. package/xiaoma-core/data/elicitation-methods.md +0 -156
  675. package/xiaoma-core/data/technical-preferences.md +0 -5
  676. package/xiaoma-core/data/test-levels-framework.md +0 -148
  677. package/xiaoma-core/data/test-priorities-matrix.md +0 -174
  678. package/xiaoma-core/scripts/build-validation/pre-dev-validation.sh +0 -71
  679. package/xiaoma-core/scripts/build-validation/progressive-validation.sh +0 -88
  680. package/xiaoma-core/scripts/build-validation/quick-check.sh +0 -69
  681. package/xiaoma-core/tasks/advanced-elicitation.md +0 -119
  682. package/xiaoma-core/tasks/analyze-existing-database.md +0 -155
  683. package/xiaoma-core/tasks/apply-qa-fixes.md +0 -150
  684. package/xiaoma-core/tasks/automated-story-cycle.md +0 -370
  685. package/xiaoma-core/tasks/batch-story-generation.md +0 -354
  686. package/xiaoma-core/tasks/brownfield-create-epic.md +0 -162
  687. package/xiaoma-core/tasks/brownfield-create-story.md +0 -149
  688. package/xiaoma-core/tasks/correct-course.md +0 -72
  689. package/xiaoma-core/tasks/create-brownfield-story.md +0 -314
  690. package/xiaoma-core/tasks/create-database-design.md +0 -161
  691. package/xiaoma-core/tasks/create-deep-research-prompt.md +0 -280
  692. package/xiaoma-core/tasks/create-enhanced-story-with-database.md +0 -250
  693. package/xiaoma-core/tasks/create-incremental-architecture.md +0 -525
  694. package/xiaoma-core/tasks/create-next-story.md +0 -114
  695. package/xiaoma-core/tasks/create-prd-from-rag.md +0 -435
  696. package/xiaoma-core/tasks/create-story-with-rag.md +0 -559
  697. package/xiaoma-core/tasks/develop-story-with-rag.md +0 -536
  698. package/xiaoma-core/tasks/document-project.md +0 -345
  699. package/xiaoma-core/tasks/facilitate-brainstorming-session.md +0 -138
  700. package/xiaoma-core/tasks/generate-ai-frontend-prompt.md +0 -53
  701. package/xiaoma-core/tasks/generate-database-ddl.md +0 -240
  702. package/xiaoma-core/tasks/generate-database-entities.md +0 -501
  703. package/xiaoma-core/tasks/generate-rag-questions.md +0 -312
  704. package/xiaoma-core/tasks/index-docs.md +0 -175
  705. package/xiaoma-core/tasks/kb-mode-interaction.md +0 -77
  706. package/xiaoma-core/tasks/nfr-assess.md +0 -345
  707. package/xiaoma-core/tasks/project-integration-testing.md +0 -477
  708. package/xiaoma-core/tasks/qa-gate.md +0 -163
  709. package/xiaoma-core/tasks/requirement-analysis-with-rag.md +0 -1318
  710. package/xiaoma-core/tasks/requirements-coverage-audit.md +0 -198
  711. package/xiaoma-core/tasks/review-story.md +0 -316
  712. package/xiaoma-core/tasks/risk-profile.md +0 -355
  713. package/xiaoma-core/tasks/serial-development-orchestration.md +0 -426
  714. package/xiaoma-core/tasks/shard-doc.md +0 -187
  715. package/xiaoma-core/tasks/test-design.md +0 -176
  716. package/xiaoma-core/tasks/trace-requirements.md +0 -266
  717. package/xiaoma-core/tasks/validate-next-story.md +0 -136
  718. package/xiaoma-core/templates/api-design-tmpl.yaml +0 -704
  719. package/xiaoma-core/templates/architecture-tmpl.yaml +0 -650
  720. package/xiaoma-core/templates/brainstorming-output-tmpl.yaml +0 -156
  721. package/xiaoma-core/templates/brownfield-architecture-tmpl.yaml +0 -476
  722. package/xiaoma-core/templates/brownfield-prd-tmpl.yaml +0 -280
  723. package/xiaoma-core/templates/competitor-analysis-tmpl.yaml +0 -336
  724. package/xiaoma-core/templates/database-design-tmpl.yaml +0 -266
  725. package/xiaoma-core/templates/enhanced-story-with-database-tmpl.yaml +0 -428
  726. package/xiaoma-core/templates/front-end-architecture-tmpl.yaml +0 -272
  727. package/xiaoma-core/templates/front-end-spec-tmpl.yaml +0 -354
  728. package/xiaoma-core/templates/fullstack-architecture-tmpl.yaml +0 -925
  729. package/xiaoma-core/templates/global-qa-monitoring-tmpl.yaml +0 -443
  730. package/xiaoma-core/templates/incremental-architecture-tmpl.yaml +0 -601
  731. package/xiaoma-core/templates/market-research-tmpl.yaml +0 -252
  732. package/xiaoma-core/templates/maven-lombok-template.xml +0 -111
  733. package/xiaoma-core/templates/prd-from-rag-tmpl.yaml +0 -410
  734. package/xiaoma-core/templates/prd-tmpl.yaml +0 -202
  735. package/xiaoma-core/templates/project-brief-tmpl.yaml +0 -221
  736. package/xiaoma-core/templates/qa-gate-tmpl.yaml +0 -102
  737. package/xiaoma-core/templates/rag-knowledge-tmpl.yaml +0 -569
  738. package/xiaoma-core/templates/rag-questions-tmpl.yaml +0 -949
  739. package/xiaoma-core/templates/requirements-coverage-audit.yaml +0 -330
  740. package/xiaoma-core/templates/start-enhanced-workflow.yaml +0 -347
  741. package/xiaoma-core/templates/story-tmpl.yaml +0 -137
  742. package/xiaoma-core/templates/story-with-rag-tmpl.yaml +0 -360
  743. package/xiaoma-core/workflows/automated-requirements-analysis.yaml +0 -2149
  744. package/xiaoma-core/workflows/automated-requirements-development.yaml +0 -739
  745. package/xiaoma-core/workflows/automated-story-development.yaml +0 -1264
  746. package/xiaoma-core/workflows/brownfield-fullstack.yaml +0 -298
  747. package/xiaoma-core/workflows/brownfield-service.yaml +0 -188
  748. package/xiaoma-core/workflows/brownfield-ui.yaml +0 -198
  749. package/xiaoma-core/workflows/enhanced-fullstack-with-database.yaml +0 -427
  750. package/xiaoma-core/workflows/enhanced-fullstack-with-qa-loop.yaml +0 -766
  751. package/xiaoma-core/workflows/full-requirement-automation.yaml +0 -1305
  752. package/xiaoma-core/workflows/greenfield-fullstack.yaml +0 -241
  753. package/xiaoma-core/workflows/greenfield-service.yaml +0 -207
  754. package/xiaoma-core/workflows/greenfield-ui.yaml +0 -236
@@ -0,0 +1,1387 @@
1
+ const path = require('node:path');
2
+ const fs = require('fs-extra');
3
+ const yaml = require('yaml');
4
+ const prompts = require('../../../lib/prompts');
5
+ const { XmlHandler } = require('../../../lib/xml-handler');
6
+ const { getProjectRoot, getSourcePath, getModulePath } = require('../../../lib/project-root');
7
+ const { filterCustomizationData } = require('../../../lib/agent/compiler');
8
+ const { ExternalModuleManager } = require('./external-manager');
9
+ const { XiaoMa_FOLDER_NAME } = require('../ide/shared/path-utils');
10
+
11
+ /**
12
+ * Manages the installation, updating, and removal of XiaoMa modules.
13
+ * Handles module discovery, dependency resolution, configuration processing,
14
+ * and agent file management including XML activation block injection.
15
+ *
16
+ * @class ModuleManager
17
+ * @requires fs-extra
18
+ * @requires yaml
19
+ * @requires prompts
20
+ * @requires XmlHandler
21
+ *
22
+ * @example
23
+ * const manager = new ModuleManager();
24
+ * const modules = await manager.listAvailable();
25
+ * await manager.install('core-module', '/path/to/xiaoma');
26
+ */
27
+ class ModuleManager {
28
+ constructor(options = {}) {
29
+ this.xmlHandler = new XmlHandler();
30
+ this.xiaomaFolderName = XiaoMa_FOLDER_NAME; // Default, can be overridden
31
+ this.customModulePaths = new Map(); // Initialize custom module paths
32
+ this.externalModuleManager = new ExternalModuleManager(); // For external official modules
33
+ }
34
+
35
+ /**
36
+ * Set the xiaoma folder name for placeholder replacement
37
+ * @param {string} xiaomaFolderName - The xiaoma folder name
38
+ */
39
+ setXiaomaFolderName(xiaomaFolderName) {
40
+ this.xiaomaFolderName = xiaomaFolderName;
41
+ }
42
+
43
+ /**
44
+ * Set the core configuration for access during module installation
45
+ * @param {Object} coreConfig - Core configuration object
46
+ */
47
+ setCoreConfig(coreConfig) {
48
+ this.coreConfig = coreConfig;
49
+ }
50
+
51
+ /**
52
+ * Set custom module paths for priority lookup
53
+ * @param {Map<string, string>} customModulePaths - Map of module ID to source path
54
+ */
55
+ setCustomModulePaths(customModulePaths) {
56
+ this.customModulePaths = customModulePaths;
57
+ }
58
+
59
+ /**
60
+ * Copy a file to the target location
61
+ * @param {string} sourcePath - Source file path
62
+ * @param {string} targetPath - Target file path
63
+ * @param {boolean} overwrite - Whether to overwrite existing files (default: true)
64
+ */
65
+ async copyFileWithPlaceholderReplacement(sourcePath, targetPath, overwrite = true) {
66
+ await fs.copy(sourcePath, targetPath, { overwrite });
67
+ }
68
+
69
+ /**
70
+ * Copy a directory recursively
71
+ * @param {string} sourceDir - Source directory path
72
+ * @param {string} targetDir - Target directory path
73
+ * @param {boolean} overwrite - Whether to overwrite existing files (default: true)
74
+ */
75
+ async copyDirectoryWithPlaceholderReplacement(sourceDir, targetDir, overwrite = true) {
76
+ await fs.ensureDir(targetDir);
77
+ const entries = await fs.readdir(sourceDir, { withFileTypes: true });
78
+
79
+ for (const entry of entries) {
80
+ const sourcePath = path.join(sourceDir, entry.name);
81
+ const targetPath = path.join(targetDir, entry.name);
82
+
83
+ if (entry.isDirectory()) {
84
+ await this.copyDirectoryWithPlaceholderReplacement(sourcePath, targetPath, overwrite);
85
+ } else {
86
+ await this.copyFileWithPlaceholderReplacement(sourcePath, targetPath, overwrite);
87
+ }
88
+ }
89
+ }
90
+
91
+ /**
92
+ * Copy sidecar directory to _xiaoma/_memory location with update-safe handling
93
+ * @param {string} sourceSidecarPath - Source sidecar directory path
94
+ * @param {string} agentName - Name of the agent (for naming)
95
+ * @param {string} xiaomaMemoryPath - This should ALWAYS be _xiaoma/_memory
96
+ * @param {boolean} isUpdate - Whether this is an update (default: false)
97
+ * @param {string} xiaomaDir - XiaoMa installation directory
98
+ * @param {Object} installer - Installer instance for file tracking
99
+ */
100
+ async copySidecarToMemory(sourceSidecarPath, agentName, xiaomaMemoryPath, isUpdate = false, xiaomaDir = null, installer = null) {
101
+ const crypto = require('node:crypto');
102
+ const sidecarTargetDir = path.join(xiaomaMemoryPath, `${agentName}-sidecar`);
103
+
104
+ // Ensure target directory exists
105
+ await fs.ensureDir(xiaomaMemoryPath);
106
+ await fs.ensureDir(sidecarTargetDir);
107
+
108
+ // Get existing files manifest for update checking
109
+ let existingFilesManifest = [];
110
+ if (isUpdate && installer) {
111
+ existingFilesManifest = await installer.readFilesManifest(xiaomaDir);
112
+ }
113
+
114
+ // Build map of existing sidecar files with their hashes
115
+ const existingSidecarFiles = new Map();
116
+ for (const fileEntry of existingFilesManifest) {
117
+ if (fileEntry.path && fileEntry.path.includes(`${agentName}-sidecar/`)) {
118
+ existingSidecarFiles.set(fileEntry.path, fileEntry.hash);
119
+ }
120
+ }
121
+
122
+ // Get all files in source sidecar
123
+ const sourceFiles = await this.getFileList(sourceSidecarPath);
124
+
125
+ for (const file of sourceFiles) {
126
+ const sourceFilePath = path.join(sourceSidecarPath, file);
127
+ const targetFilePath = path.join(sidecarTargetDir, file);
128
+
129
+ // Calculate current source file hash
130
+ const sourceHash = crypto
131
+ .createHash('sha256')
132
+ .update(await fs.readFile(sourceFilePath))
133
+ .digest('hex');
134
+
135
+ // Path relative to xiaoma directory
136
+ const relativeToXiaoma = path.join('_memory', `${agentName}-sidecar`, file);
137
+
138
+ if (isUpdate && (await fs.pathExists(targetFilePath))) {
139
+ // Calculate current target file hash
140
+ const currentTargetHash = crypto
141
+ .createHash('sha256')
142
+ .update(await fs.readFile(targetFilePath))
143
+ .digest('hex');
144
+
145
+ // Get the last known hash from files-manifest
146
+ const lastKnownHash = existingSidecarFiles.get(relativeToXiaoma);
147
+
148
+ if (lastKnownHash) {
149
+ // We have a record of this file
150
+ if (currentTargetHash === lastKnownHash) {
151
+ // File hasn't been modified by user, safe to update
152
+ await this.copyFileWithPlaceholderReplacement(sourceFilePath, targetFilePath, true);
153
+ if (process.env.XiaoMa_VERBOSE_INSTALL === 'true') {
154
+ await prompts.log.message(` Updated sidecar file: ${relativeToXiaoma}`);
155
+ }
156
+ } else {
157
+ // User has modified the file, preserve it
158
+ if (process.env.XiaoMa_VERBOSE_INSTALL === 'true') {
159
+ await prompts.log.message(` Preserving user-modified file: ${relativeToXiaoma}`);
160
+ }
161
+ }
162
+ } else {
163
+ // First time seeing this file in manifest, copy it
164
+ await this.copyFileWithPlaceholderReplacement(sourceFilePath, targetFilePath, true);
165
+ if (process.env.XiaoMa_VERBOSE_INSTALL === 'true') {
166
+ await prompts.log.message(` Added new sidecar file: ${relativeToXiaoma}`);
167
+ }
168
+ }
169
+ } else {
170
+ // New installation
171
+ await this.copyFileWithPlaceholderReplacement(sourceFilePath, targetFilePath, true);
172
+ if (process.env.XiaoMa_VERBOSE_INSTALL === 'true') {
173
+ await prompts.log.message(` Copied sidecar file: ${relativeToXiaoma}`);
174
+ }
175
+ }
176
+
177
+ // Track the file in the installer's file tracking system
178
+ if (installer && installer.installedFiles) {
179
+ installer.installedFiles.add(targetFilePath);
180
+ }
181
+ }
182
+
183
+ // Return list of files that were processed
184
+ const processedFiles = sourceFiles.map((file) => path.join('_memory', `${agentName}-sidecar`, file));
185
+ return processedFiles;
186
+ }
187
+
188
+ /**
189
+ * List all available modules (excluding core which is always installed)
190
+ * Built-in modules live directly under src/<code> and are discovered here.
191
+ * External modules come from external-official-modules.yaml.
192
+ * @returns {Object} Object with modules array and customModules array
193
+ */
194
+ async listAvailable() {
195
+ const modules = [];
196
+ const customModules = [];
197
+
198
+ // Built-in modules (directly under src/<code>). Add new built-ins here.
199
+ const builtInCodes = ['xmc', 'xpm'];
200
+ for (const code of builtInCodes) {
201
+ const builtInPath = getSourcePath(code);
202
+ if (await fs.pathExists(builtInPath)) {
203
+ const info = await this.getModuleInfo(builtInPath, code, `src/${code}`);
204
+ if (info) {
205
+ modules.push(info);
206
+ }
207
+ }
208
+ }
209
+
210
+ // Check for cached custom modules in _config/custom/
211
+ if (this.xiaomaDir) {
212
+ const customCacheDir = path.join(this.xiaomaDir, '_config', 'custom');
213
+ if (await fs.pathExists(customCacheDir)) {
214
+ const cacheEntries = await fs.readdir(customCacheDir, { withFileTypes: true });
215
+ for (const entry of cacheEntries) {
216
+ if (entry.isDirectory()) {
217
+ const cachePath = path.join(customCacheDir, entry.name);
218
+ const moduleInfo = await this.getModuleInfo(cachePath, entry.name, '_config/custom');
219
+ if (moduleInfo && !modules.some((m) => m.id === moduleInfo.id) && !customModules.some((m) => m.id === moduleInfo.id)) {
220
+ moduleInfo.isCustom = true;
221
+ moduleInfo.fromCache = true;
222
+ customModules.push(moduleInfo);
223
+ }
224
+ }
225
+ }
226
+ }
227
+ }
228
+
229
+ return { modules, customModules };
230
+ }
231
+
232
+ /**
233
+ * Get module information from a module path
234
+ * @param {string} modulePath - Path to the module directory
235
+ * @param {string} defaultName - Default name for the module
236
+ * @param {string} sourceDescription - Description of where the module was found
237
+ * @returns {Object|null} Module info or null if not a valid module
238
+ */
239
+ async getModuleInfo(modulePath, defaultName, sourceDescription) {
240
+ // Check for module structure (module.yaml OR custom.yaml)
241
+ const moduleConfigPath = path.join(modulePath, 'module.yaml');
242
+ const rootCustomConfigPath = path.join(modulePath, 'custom.yaml');
243
+ let configPath = null;
244
+
245
+ if (await fs.pathExists(moduleConfigPath)) {
246
+ configPath = moduleConfigPath;
247
+ } else if (await fs.pathExists(rootCustomConfigPath)) {
248
+ configPath = rootCustomConfigPath;
249
+ }
250
+
251
+ // Skip if this doesn't look like a module
252
+ if (!configPath) {
253
+ return null;
254
+ }
255
+
256
+ // Mark as custom if it's using custom.yaml OR if it's outside the known built-in source paths
257
+ const BUILT_IN_SOURCES = new Set(['src/xmc', 'src/xpm', 'src/core', 'src/modules']);
258
+ const isCustomSource = !BUILT_IN_SOURCES.has(sourceDescription);
259
+ const moduleInfo = {
260
+ id: defaultName,
261
+ path: modulePath,
262
+ name: defaultName
263
+ .split('-')
264
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
265
+ .join(' '),
266
+ description: 'XiaoMa Module',
267
+ version: '5.0.0',
268
+ source: sourceDescription,
269
+ isCustom: configPath === rootCustomConfigPath || isCustomSource,
270
+ };
271
+
272
+ // Read module config for metadata
273
+ try {
274
+ const configContent = await fs.readFile(configPath, 'utf8');
275
+ const config = yaml.parse(configContent);
276
+
277
+ // Use the code property as the id if available
278
+ if (config.code) {
279
+ moduleInfo.id = config.code;
280
+ }
281
+
282
+ moduleInfo.name = config.name || moduleInfo.name;
283
+ moduleInfo.description = config.description || moduleInfo.description;
284
+ moduleInfo.version = config.version || moduleInfo.version;
285
+ moduleInfo.dependencies = config.dependencies || [];
286
+ moduleInfo.defaultSelected = config.default_selected === undefined ? false : config.default_selected;
287
+ } catch (error) {
288
+ await prompts.log.warn(`Failed to read config for ${defaultName}: ${error.message}`);
289
+ }
290
+
291
+ return moduleInfo;
292
+ }
293
+
294
+ /**
295
+ * Find the source path for a module by searching all possible locations
296
+ * @param {string} moduleCode - Code of the module to find (from module.yaml)
297
+ * @returns {string|null} Path to the module source or null if not found
298
+ */
299
+ async findModuleSource(moduleCode, options = {}) {
300
+ const projectRoot = getProjectRoot();
301
+
302
+ // First check custom module paths if they exist
303
+ if (this.customModulePaths && this.customModulePaths.has(moduleCode)) {
304
+ return this.customModulePaths.get(moduleCode);
305
+ }
306
+
307
+ // Check for built-in modules (directly under src/<code>). Keep in sync with listAvailable().
308
+ const builtInCodes = ['xmc', 'xpm'];
309
+ if (builtInCodes.includes(moduleCode)) {
310
+ const builtInPath = getSourcePath(moduleCode);
311
+ if (await fs.pathExists(builtInPath)) {
312
+ return builtInPath;
313
+ }
314
+ }
315
+
316
+ // Check external official modules
317
+ const externalSource = await this.findExternalModuleSource(moduleCode, options);
318
+ if (externalSource) {
319
+ return externalSource;
320
+ }
321
+
322
+ return null;
323
+ }
324
+
325
+ /**
326
+ * Check if a module is an external official module
327
+ * @param {string} moduleCode - Code of the module to check
328
+ * @returns {boolean} True if the module is external
329
+ */
330
+ async isExternalModule(moduleCode) {
331
+ return await this.externalModuleManager.hasModule(moduleCode);
332
+ }
333
+
334
+ /**
335
+ * Get the cache directory for external modules
336
+ * @returns {string} Path to the external modules cache directory
337
+ */
338
+ getExternalCacheDir() {
339
+ const os = require('node:os');
340
+ const cacheDir = path.join(os.homedir(), '.xiaoma', 'cache', 'external-modules');
341
+ return cacheDir;
342
+ }
343
+
344
+ /**
345
+ * Clone an external module repository to cache
346
+ * @param {string} moduleCode - Code of the external module
347
+ * @returns {string} Path to the cloned repository
348
+ */
349
+ async cloneExternalModule(moduleCode, options = {}) {
350
+ const { execSync } = require('node:child_process');
351
+ const moduleInfo = await this.externalModuleManager.getModuleByCode(moduleCode);
352
+
353
+ if (!moduleInfo) {
354
+ throw new Error(`External module '${moduleCode}' not found in external-official-modules.yaml`);
355
+ }
356
+
357
+ const cacheDir = this.getExternalCacheDir();
358
+ const moduleCacheDir = path.join(cacheDir, moduleCode);
359
+ const silent = options.silent || false;
360
+
361
+ // Create cache directory if it doesn't exist
362
+ await fs.ensureDir(cacheDir);
363
+
364
+ // Helper to create a spinner or a no-op when silent
365
+ const createSpinner = async () => {
366
+ if (silent) {
367
+ return {
368
+ start() {},
369
+ stop() {},
370
+ error() {},
371
+ message() {},
372
+ cancel() {},
373
+ clear() {},
374
+ get isSpinning() {
375
+ return false;
376
+ },
377
+ get isCancelled() {
378
+ return false;
379
+ },
380
+ };
381
+ }
382
+ return await prompts.spinner();
383
+ };
384
+
385
+ // Track if we need to install dependencies
386
+ let needsDependencyInstall = false;
387
+ let wasNewClone = false;
388
+
389
+ // Check if already cloned
390
+ if (await fs.pathExists(moduleCacheDir)) {
391
+ // Try to update if it's a git repo
392
+ const fetchSpinner = await createSpinner();
393
+ fetchSpinner.start(`Fetching ${moduleInfo.name}...`);
394
+ try {
395
+ const currentRef = execSync('git rev-parse HEAD', { cwd: moduleCacheDir, stdio: 'pipe' }).toString().trim();
396
+ // Fetch and reset to remote - works better with shallow clones than pull
397
+ execSync('git fetch origin --depth 1', {
398
+ cwd: moduleCacheDir,
399
+ stdio: ['ignore', 'pipe', 'pipe'],
400
+ env: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
401
+ });
402
+ execSync('git reset --hard origin/HEAD', {
403
+ cwd: moduleCacheDir,
404
+ stdio: ['ignore', 'pipe', 'pipe'],
405
+ env: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
406
+ });
407
+ const newRef = execSync('git rev-parse HEAD', { cwd: moduleCacheDir, stdio: 'pipe' }).toString().trim();
408
+
409
+ fetchSpinner.stop(`Fetched ${moduleInfo.name}`);
410
+ // Force dependency install if we got new code
411
+ if (currentRef !== newRef) {
412
+ needsDependencyInstall = true;
413
+ }
414
+ } catch {
415
+ fetchSpinner.error(`Fetch failed, re-downloading ${moduleInfo.name}`);
416
+ // If update fails, remove and re-clone
417
+ await fs.remove(moduleCacheDir);
418
+ wasNewClone = true;
419
+ }
420
+ } else {
421
+ wasNewClone = true;
422
+ }
423
+
424
+ // Clone if not exists or was removed
425
+ if (wasNewClone) {
426
+ const fetchSpinner = await createSpinner();
427
+ fetchSpinner.start(`Fetching ${moduleInfo.name}...`);
428
+ try {
429
+ execSync(`git clone --depth 1 "${moduleInfo.url}" "${moduleCacheDir}"`, {
430
+ stdio: ['ignore', 'pipe', 'pipe'],
431
+ env: { ...process.env, GIT_TERMINAL_PROMPT: '0' },
432
+ });
433
+ fetchSpinner.stop(`Fetched ${moduleInfo.name}`);
434
+ } catch (error) {
435
+ fetchSpinner.error(`Failed to fetch ${moduleInfo.name}`);
436
+ throw new Error(`Failed to clone external module '${moduleCode}': ${error.message}`);
437
+ }
438
+ }
439
+
440
+ // Install dependencies if package.json exists
441
+ const packageJsonPath = path.join(moduleCacheDir, 'package.json');
442
+ const nodeModulesPath = path.join(moduleCacheDir, 'node_modules');
443
+ if (await fs.pathExists(packageJsonPath)) {
444
+ // Install if node_modules doesn't exist, or if package.json is newer (dependencies changed)
445
+ const nodeModulesMissing = !(await fs.pathExists(nodeModulesPath));
446
+
447
+ // Force install if we updated or cloned new
448
+ if (needsDependencyInstall || wasNewClone || nodeModulesMissing) {
449
+ const installSpinner = await createSpinner();
450
+ installSpinner.start(`Installing dependencies for ${moduleInfo.name}...`);
451
+ try {
452
+ execSync('npm install --omit=dev --no-audit --no-fund --no-progress --legacy-peer-deps', {
453
+ cwd: moduleCacheDir,
454
+ stdio: ['ignore', 'pipe', 'pipe'],
455
+ timeout: 120_000, // 2 minute timeout
456
+ });
457
+ installSpinner.stop(`Installed dependencies for ${moduleInfo.name}`);
458
+ } catch (error) {
459
+ installSpinner.error(`Failed to install dependencies for ${moduleInfo.name}`);
460
+ if (!silent) await prompts.log.warn(` ${error.message}`);
461
+ }
462
+ } else {
463
+ // Check if package.json is newer than node_modules
464
+ let packageJsonNewer = false;
465
+ try {
466
+ const packageStats = await fs.stat(packageJsonPath);
467
+ const nodeModulesStats = await fs.stat(nodeModulesPath);
468
+ packageJsonNewer = packageStats.mtime > nodeModulesStats.mtime;
469
+ } catch {
470
+ // If stat fails, assume we need to install
471
+ packageJsonNewer = true;
472
+ }
473
+
474
+ if (packageJsonNewer) {
475
+ const installSpinner = await createSpinner();
476
+ installSpinner.start(`Installing dependencies for ${moduleInfo.name}...`);
477
+ try {
478
+ execSync('npm install --omit=dev --no-audit --no-fund --no-progress --legacy-peer-deps', {
479
+ cwd: moduleCacheDir,
480
+ stdio: ['ignore', 'pipe', 'pipe'],
481
+ timeout: 120_000, // 2 minute timeout
482
+ });
483
+ installSpinner.stop(`Installed dependencies for ${moduleInfo.name}`);
484
+ } catch (error) {
485
+ installSpinner.error(`Failed to install dependencies for ${moduleInfo.name}`);
486
+ if (!silent) await prompts.log.warn(` ${error.message}`);
487
+ }
488
+ }
489
+ }
490
+ }
491
+
492
+ return moduleCacheDir;
493
+ }
494
+
495
+ /**
496
+ * Find the source path for an external module
497
+ * @param {string} moduleCode - Code of the external module
498
+ * @returns {string|null} Path to the module source or null if not found
499
+ */
500
+ async findExternalModuleSource(moduleCode, options = {}) {
501
+ const moduleInfo = await this.externalModuleManager.getModuleByCode(moduleCode);
502
+
503
+ if (!moduleInfo) {
504
+ return null;
505
+ }
506
+
507
+ // Clone the external module repo
508
+ const cloneDir = await this.cloneExternalModule(moduleCode, options);
509
+
510
+ // The module-definition specifies the path to module.yaml relative to repo root
511
+ // We need to return the directory containing module.yaml
512
+ const moduleDefinitionPath = moduleInfo.moduleDefinition; // e.g., 'src/module.yaml'
513
+ const moduleDir = path.dirname(path.join(cloneDir, moduleDefinitionPath));
514
+
515
+ return moduleDir;
516
+ }
517
+
518
+ /**
519
+ * Install a module
520
+ * @param {string} moduleName - Code of the module to install (from module.yaml)
521
+ * @param {string} xiaomaDir - Target xiaoma directory
522
+ * @param {Function} fileTrackingCallback - Optional callback to track installed files
523
+ * @param {Object} options - Additional installation options
524
+ * @param {Array<string>} options.installedIDEs - Array of IDE codes that were installed
525
+ * @param {Object} options.moduleConfig - Module configuration from config collector
526
+ * @param {Object} options.logger - Logger instance for output
527
+ */
528
+ async install(moduleName, xiaomaDir, fileTrackingCallback = null, options = {}) {
529
+ const sourcePath = await this.findModuleSource(moduleName, { silent: options.silent });
530
+ const targetPath = path.join(xiaomaDir, moduleName);
531
+
532
+ // Check if source module exists
533
+ if (!sourcePath) {
534
+ // Provide a more user-friendly error message
535
+ throw new Error(
536
+ `Source for module '${moduleName}' is not available. It will be retained but cannot be updated without its source files.`,
537
+ );
538
+ }
539
+
540
+ // Check if this is a custom module and read its custom.yaml values
541
+ let customConfig = null;
542
+ const rootCustomConfigPath = path.join(sourcePath, 'custom.yaml');
543
+
544
+ if (await fs.pathExists(rootCustomConfigPath)) {
545
+ try {
546
+ const customContent = await fs.readFile(rootCustomConfigPath, 'utf8');
547
+ customConfig = yaml.parse(customContent);
548
+ } catch (error) {
549
+ await prompts.log.warn(`Failed to read custom.yaml for ${moduleName}: ${error.message}`);
550
+ }
551
+ }
552
+
553
+ // If this is a custom module, merge its values into the module config
554
+ if (customConfig) {
555
+ options.moduleConfig = { ...options.moduleConfig, ...customConfig };
556
+ if (options.logger) {
557
+ await options.logger.log(` Merged custom configuration for ${moduleName}`);
558
+ }
559
+ }
560
+
561
+ // Check if already installed
562
+ if (await fs.pathExists(targetPath)) {
563
+ await fs.remove(targetPath);
564
+ }
565
+
566
+ // Vendor cross-module workflows BEFORE copying
567
+ // This reads source agent.yaml files and copies referenced workflows
568
+ await this.vendorCrossModuleWorkflows(sourcePath, targetPath, moduleName);
569
+
570
+ // Copy module files with filtering
571
+ await this.copyModuleWithFiltering(sourcePath, targetPath, fileTrackingCallback, options.moduleConfig);
572
+
573
+ // Compile any .agent.yaml files to .md format
574
+ await this.compileModuleAgents(sourcePath, targetPath, moduleName, xiaomaDir, options.installer);
575
+
576
+ // Process agent files to inject activation block
577
+ await this.processAgentFiles(targetPath, moduleName);
578
+
579
+ // Create directories declared in module.yaml (unless explicitly skipped)
580
+ if (!options.skipModuleInstaller) {
581
+ await this.createModuleDirectories(moduleName, xiaomaDir, options);
582
+ }
583
+
584
+ // Capture version info for manifest
585
+ const { Manifest } = require('../core/manifest');
586
+ const manifestObj = new Manifest();
587
+ const versionInfo = await manifestObj.getModuleVersionInfo(moduleName, xiaomaDir, sourcePath);
588
+
589
+ await manifestObj.addModule(xiaomaDir, moduleName, {
590
+ version: versionInfo.version,
591
+ source: versionInfo.source,
592
+ npmPackage: versionInfo.npmPackage,
593
+ repoUrl: versionInfo.repoUrl,
594
+ });
595
+
596
+ return {
597
+ success: true,
598
+ module: moduleName,
599
+ path: targetPath,
600
+ versionInfo,
601
+ };
602
+ }
603
+
604
+ /**
605
+ * Update an existing module
606
+ * @param {string} moduleName - Name of the module to update
607
+ * @param {string} xiaomaDir - Target xiaoma directory
608
+ * @param {boolean} force - Force update (overwrite modifications)
609
+ */
610
+ async update(moduleName, xiaomaDir, force = false, options = {}) {
611
+ const sourcePath = await this.findModuleSource(moduleName);
612
+ const targetPath = path.join(xiaomaDir, moduleName);
613
+
614
+ // Check if source module exists
615
+ if (!sourcePath) {
616
+ throw new Error(`Module '${moduleName}' not found in any source location`);
617
+ }
618
+
619
+ // Check if module is installed
620
+ if (!(await fs.pathExists(targetPath))) {
621
+ throw new Error(`Module '${moduleName}' is not installed`);
622
+ }
623
+
624
+ if (force) {
625
+ // Force update - remove and reinstall
626
+ await fs.remove(targetPath);
627
+ return await this.install(moduleName, xiaomaDir, null, { installer: options.installer });
628
+ } else {
629
+ // Selective update - preserve user modifications
630
+ await this.syncModule(sourcePath, targetPath);
631
+
632
+ // Recompile agents (#1133)
633
+ await this.compileModuleAgents(sourcePath, targetPath, moduleName, xiaomaDir, options.installer);
634
+ await this.processAgentFiles(targetPath, moduleName);
635
+ }
636
+
637
+ return {
638
+ success: true,
639
+ module: moduleName,
640
+ path: targetPath,
641
+ };
642
+ }
643
+
644
+ /**
645
+ * Remove a module
646
+ * @param {string} moduleName - Name of the module to remove
647
+ * @param {string} xiaomaDir - Target xiaoma directory
648
+ */
649
+ async remove(moduleName, xiaomaDir) {
650
+ const targetPath = path.join(xiaomaDir, moduleName);
651
+
652
+ if (!(await fs.pathExists(targetPath))) {
653
+ throw new Error(`Module '${moduleName}' is not installed`);
654
+ }
655
+
656
+ await fs.remove(targetPath);
657
+
658
+ return {
659
+ success: true,
660
+ module: moduleName,
661
+ };
662
+ }
663
+
664
+ /**
665
+ * Check if a module is installed
666
+ * @param {string} moduleName - Name of the module
667
+ * @param {string} xiaomaDir - Target xiaoma directory
668
+ * @returns {boolean} True if module is installed
669
+ */
670
+ async isInstalled(moduleName, xiaomaDir) {
671
+ const targetPath = path.join(xiaomaDir, moduleName);
672
+ return await fs.pathExists(targetPath);
673
+ }
674
+
675
+ /**
676
+ * Get installed module info
677
+ * @param {string} moduleName - Name of the module
678
+ * @param {string} xiaomaDir - Target xiaoma directory
679
+ * @returns {Object|null} Module info or null if not installed
680
+ */
681
+ async getInstalledInfo(moduleName, xiaomaDir) {
682
+ const targetPath = path.join(xiaomaDir, moduleName);
683
+
684
+ if (!(await fs.pathExists(targetPath))) {
685
+ return null;
686
+ }
687
+
688
+ const configPath = path.join(targetPath, 'config.yaml');
689
+ const moduleInfo = {
690
+ id: moduleName,
691
+ path: targetPath,
692
+ installed: true,
693
+ };
694
+
695
+ if (await fs.pathExists(configPath)) {
696
+ try {
697
+ const configContent = await fs.readFile(configPath, 'utf8');
698
+ const config = yaml.parse(configContent);
699
+ Object.assign(moduleInfo, config);
700
+ } catch (error) {
701
+ await prompts.log.warn(`Failed to read installed module config: ${error.message}`);
702
+ }
703
+ }
704
+
705
+ return moduleInfo;
706
+ }
707
+
708
+ /**
709
+ * Copy module with filtering for localskip agents and conditional content
710
+ * @param {string} sourcePath - Source module path
711
+ * @param {string} targetPath - Target module path
712
+ * @param {Function} fileTrackingCallback - Optional callback to track installed files
713
+ * @param {Object} moduleConfig - Module configuration with conditional flags
714
+ */
715
+ async copyModuleWithFiltering(sourcePath, targetPath, fileTrackingCallback = null, moduleConfig = {}) {
716
+ // Get all files in source
717
+ const sourceFiles = await this.getFileList(sourcePath);
718
+
719
+ for (const file of sourceFiles) {
720
+ // Skip sub-modules directory - these are IDE-specific and handled separately
721
+ if (file.startsWith('sub-modules/')) {
722
+ continue;
723
+ }
724
+
725
+ // Only skip sidecar directories - they are handled separately during agent compilation
726
+ // But still allow other files in agent directories
727
+ const isInAgentDirectory = file.startsWith('agents/');
728
+ const isInSidecarDirectory = path
729
+ .dirname(file)
730
+ .split('/')
731
+ .some((dir) => dir.toLowerCase().endsWith('-sidecar'));
732
+
733
+ if (isInSidecarDirectory) {
734
+ continue;
735
+ }
736
+
737
+ // Skip module.yaml at root - it's only needed at install time
738
+ if (file === 'module.yaml') {
739
+ continue;
740
+ }
741
+
742
+ // Skip module root config.yaml only - generated by config collector with actual values
743
+ // Workflow-level config.yaml (e.g. workflows/orchestrate-story/config.yaml) must be copied
744
+ // for custom modules that use workflow-specific configuration
745
+ if (file === 'config.yaml') {
746
+ continue;
747
+ }
748
+
749
+ // Skip .agent.yaml files - they will be compiled separately
750
+ if (file.endsWith('.agent.yaml')) {
751
+ continue;
752
+ }
753
+
754
+ const sourceFile = path.join(sourcePath, file);
755
+ const targetFile = path.join(targetPath, file);
756
+
757
+ // Check if this is an agent file
758
+ if (file.startsWith('agents/') && file.endsWith('.md')) {
759
+ // Read the file to check for localskip
760
+ const content = await fs.readFile(sourceFile, 'utf8');
761
+
762
+ // Check for localskip="true" in the agent tag
763
+ const agentMatch = content.match(/<agent[^>]*\slocalskip="true"[^>]*>/);
764
+ if (agentMatch) {
765
+ await prompts.log.message(` Skipping web-only agent: ${path.basename(file)}`);
766
+ continue; // Skip this agent
767
+ }
768
+ }
769
+
770
+ // Copy the file with placeholder replacement
771
+ await this.copyFileWithPlaceholderReplacement(sourceFile, targetFile);
772
+
773
+ // Track the file if callback provided
774
+ if (fileTrackingCallback) {
775
+ fileTrackingCallback(targetFile);
776
+ }
777
+ }
778
+ }
779
+
780
+ /**
781
+ * Compile .agent.yaml files to .md format in modules
782
+ * @param {string} sourcePath - Source module path
783
+ * @param {string} targetPath - Target module path
784
+ * @param {string} moduleName - Module name
785
+ * @param {string} xiaomaDir - XiaoMa installation directory
786
+ * @param {Object} installer - Installer instance for file tracking
787
+ */
788
+ async compileModuleAgents(sourcePath, targetPath, moduleName, xiaomaDir, installer = null) {
789
+ const sourceAgentsPath = path.join(sourcePath, 'agents');
790
+ const targetAgentsPath = path.join(targetPath, 'agents');
791
+ const cfgAgentsDir = path.join(xiaomaDir, '_config', 'agents');
792
+
793
+ // Check if agents directory exists in source
794
+ if (!(await fs.pathExists(sourceAgentsPath))) {
795
+ return; // No agents to compile
796
+ }
797
+
798
+ // Get all agent YAML files recursively
799
+ const agentFiles = await this.findAgentFiles(sourceAgentsPath);
800
+
801
+ for (const agentFile of agentFiles) {
802
+ if (!agentFile.endsWith('.agent.yaml')) continue;
803
+
804
+ const relativePath = path.relative(sourceAgentsPath, agentFile).split(path.sep).join('/');
805
+ const targetDir = path.join(targetAgentsPath, path.dirname(relativePath));
806
+
807
+ await fs.ensureDir(targetDir);
808
+
809
+ const agentName = path.basename(agentFile, '.agent.yaml');
810
+ const sourceYamlPath = agentFile;
811
+ const targetMdPath = path.join(targetDir, `${agentName}.md`);
812
+ const customizePath = path.join(cfgAgentsDir, `${moduleName}-${agentName}.customize.yaml`);
813
+
814
+ // Read and compile the YAML
815
+ try {
816
+ const yamlContent = await fs.readFile(sourceYamlPath, 'utf8');
817
+ const { compileAgent } = require('../../../lib/agent/compiler');
818
+
819
+ // Create customize template if it doesn't exist
820
+ if (!(await fs.pathExists(customizePath))) {
821
+ const { getSourcePath } = require('../../../lib/project-root');
822
+ const genericTemplatePath = getSourcePath('utility', 'agent-components', 'agent.customize.template.yaml');
823
+ if (await fs.pathExists(genericTemplatePath)) {
824
+ await this.copyFileWithPlaceholderReplacement(genericTemplatePath, customizePath);
825
+ // Only show customize creation in verbose mode
826
+ if (process.env.XiaoMa_VERBOSE_INSTALL === 'true') {
827
+ await prompts.log.message(` Created customize: ${moduleName}-${agentName}.customize.yaml`);
828
+ }
829
+
830
+ // Store original hash for modification detection
831
+ const crypto = require('node:crypto');
832
+ const customizeContent = await fs.readFile(customizePath, 'utf8');
833
+ const originalHash = crypto.createHash('sha256').update(customizeContent).digest('hex');
834
+
835
+ // Store in main manifest
836
+ const manifestPath = path.join(xiaomaDir, '_config', 'manifest.yaml');
837
+ let manifestData = {};
838
+ if (await fs.pathExists(manifestPath)) {
839
+ const manifestContent = await fs.readFile(manifestPath, 'utf8');
840
+ const yaml = require('yaml');
841
+ manifestData = yaml.parse(manifestContent);
842
+ }
843
+ if (!manifestData.agentCustomizations) {
844
+ manifestData.agentCustomizations = {};
845
+ }
846
+ manifestData.agentCustomizations[path.relative(xiaomaDir, customizePath)] = originalHash;
847
+
848
+ // Write back to manifest
849
+ const yaml = require('yaml');
850
+ // Clean the manifest data to remove any non-serializable values
851
+ const cleanManifestData = structuredClone(manifestData);
852
+
853
+ const updatedContent = yaml.stringify(cleanManifestData, {
854
+ indent: 2,
855
+ lineWidth: 0,
856
+ });
857
+ await fs.writeFile(manifestPath, updatedContent, 'utf8');
858
+ }
859
+ }
860
+
861
+ // Check for customizations and build answers object
862
+ let customizedFields = [];
863
+ let answers = {};
864
+ if (await fs.pathExists(customizePath)) {
865
+ const customizeContent = await fs.readFile(customizePath, 'utf8');
866
+ const customizeData = yaml.parse(customizeContent);
867
+ customizedFields = customizeData.customized_fields || [];
868
+
869
+ // Build answers object from customizations
870
+ if (customizeData.persona) {
871
+ answers.persona = customizeData.persona;
872
+ }
873
+ if (customizeData.agent?.metadata) {
874
+ const filteredMetadata = filterCustomizationData(customizeData.agent.metadata);
875
+ if (Object.keys(filteredMetadata).length > 0) {
876
+ Object.assign(answers, { metadata: filteredMetadata });
877
+ }
878
+ }
879
+ if (customizeData.critical_actions && customizeData.critical_actions.length > 0) {
880
+ answers.critical_actions = customizeData.critical_actions;
881
+ }
882
+ if (customizeData.memories && customizeData.memories.length > 0) {
883
+ answers.memories = customizeData.memories;
884
+ }
885
+ if (customizeData.menu && customizeData.menu.length > 0) {
886
+ answers.menu = customizeData.menu;
887
+ }
888
+ if (customizeData.prompts && customizeData.prompts.length > 0) {
889
+ answers.prompts = customizeData.prompts;
890
+ }
891
+ }
892
+
893
+ // Check if agent has sidecar
894
+ let hasSidecar = false;
895
+ try {
896
+ const agentYaml = yaml.parse(yamlContent);
897
+ hasSidecar = agentYaml?.agent?.metadata?.hasSidecar === true;
898
+ } catch {
899
+ // Continue without sidecar processing
900
+ }
901
+
902
+ // Compile with customizations if any
903
+ const { xml } = await compileAgent(yamlContent, answers, agentName, relativePath, { config: this.coreConfig || {} });
904
+
905
+ // Write the compiled agent
906
+ await fs.writeFile(targetMdPath, xml, 'utf8');
907
+
908
+ // Handle sidecar copying if present
909
+ if (hasSidecar) {
910
+ // Get the agent's directory to look for sidecar
911
+ const agentDir = path.dirname(agentFile);
912
+ const sidecarDirName = `${agentName}-sidecar`;
913
+ const sourceSidecarPath = path.join(agentDir, sidecarDirName);
914
+
915
+ // Check if sidecar directory exists
916
+ if (await fs.pathExists(sourceSidecarPath)) {
917
+ // Memory is always in _xiaoma/_memory
918
+ const xiaomaMemoryPath = path.join(xiaomaDir, '_memory');
919
+
920
+ // Determine if this is an update (by checking if agent already exists)
921
+ const isUpdate = await fs.pathExists(targetMdPath);
922
+
923
+ // Copy sidecar to memory location with update-safe handling
924
+ const copiedFiles = await this.copySidecarToMemory(
925
+ sourceSidecarPath,
926
+ agentName,
927
+ xiaomaMemoryPath,
928
+ isUpdate,
929
+ xiaomaDir,
930
+ installer,
931
+ );
932
+
933
+ if (process.env.XiaoMa_VERBOSE_INSTALL === 'true' && copiedFiles.length > 0) {
934
+ await prompts.log.message(` Sidecar files processed: ${copiedFiles.length} files`);
935
+ }
936
+ } else if (process.env.XiaoMa_VERBOSE_INSTALL === 'true') {
937
+ await prompts.log.warn(` Agent marked as having sidecar but ${sidecarDirName} directory not found`);
938
+ }
939
+ }
940
+
941
+ // Copy any non-sidecar files from agent directory (e.g., foo.md)
942
+ const agentDir = path.dirname(agentFile);
943
+ const agentEntries = await fs.readdir(agentDir, { withFileTypes: true });
944
+
945
+ for (const entry of agentEntries) {
946
+ if (entry.isFile() && !entry.name.endsWith('.agent.yaml') && !entry.name.endsWith('.md')) {
947
+ // Copy additional files (like foo.md) to the agent target directory
948
+ const sourceFile = path.join(agentDir, entry.name);
949
+ const targetFile = path.join(targetDir, entry.name);
950
+ await this.copyFileWithPlaceholderReplacement(sourceFile, targetFile);
951
+ }
952
+ }
953
+
954
+ // Only show compilation details in verbose mode
955
+ if (process.env.XiaoMa_VERBOSE_INSTALL === 'true') {
956
+ await prompts.log.message(
957
+ ` Compiled agent: ${agentName} -> ${path.relative(targetPath, targetMdPath)}${hasSidecar ? ' (with sidecar)' : ''}`,
958
+ );
959
+ }
960
+ } catch (error) {
961
+ await prompts.log.warn(` Failed to compile agent ${agentName}: ${error.message}`);
962
+ }
963
+ }
964
+ }
965
+
966
+ /**
967
+ * Find all .agent.yaml files recursively in a directory
968
+ * @param {string} dir - Directory to search
969
+ * @returns {Array} List of .agent.yaml file paths
970
+ */
971
+ async findAgentFiles(dir) {
972
+ const agentFiles = [];
973
+
974
+ async function searchDirectory(searchDir) {
975
+ const entries = await fs.readdir(searchDir, { withFileTypes: true });
976
+
977
+ for (const entry of entries) {
978
+ const fullPath = path.join(searchDir, entry.name);
979
+
980
+ if (entry.isFile() && entry.name.endsWith('.agent.yaml')) {
981
+ agentFiles.push(fullPath);
982
+ } else if (entry.isDirectory()) {
983
+ await searchDirectory(fullPath);
984
+ }
985
+ }
986
+ }
987
+
988
+ await searchDirectory(dir);
989
+ return agentFiles;
990
+ }
991
+
992
+ /**
993
+ * Process agent files to inject activation block
994
+ * @param {string} modulePath - Path to installed module
995
+ * @param {string} moduleName - Module name
996
+ */
997
+ async processAgentFiles(modulePath, moduleName) {
998
+ // const agentsPath = path.join(modulePath, 'agents');
999
+ // // Check if agents directory exists
1000
+ // if (!(await fs.pathExists(agentsPath))) {
1001
+ // return; // No agents to process
1002
+ // }
1003
+ // // Get all agent MD files recursively
1004
+ // const agentFiles = await this.findAgentMdFiles(agentsPath);
1005
+ // for (const agentFile of agentFiles) {
1006
+ // if (!agentFile.endsWith('.md')) continue;
1007
+ // let content = await fs.readFile(agentFile, 'utf8');
1008
+ // // Check if content has agent XML and no activation block
1009
+ // if (content.includes('<agent') && !content.includes('<activation')) {
1010
+ // // Inject the activation block using XML handler
1011
+ // content = this.xmlHandler.injectActivationSimple(content);
1012
+ // await fs.writeFile(agentFile, content, 'utf8');
1013
+ // }
1014
+ // }
1015
+ }
1016
+
1017
+ /**
1018
+ * Find all .md agent files recursively in a directory
1019
+ * @param {string} dir - Directory to search
1020
+ * @returns {Array} List of .md agent file paths
1021
+ */
1022
+ async findAgentMdFiles(dir) {
1023
+ const agentFiles = [];
1024
+
1025
+ async function searchDirectory(searchDir) {
1026
+ const entries = await fs.readdir(searchDir, { withFileTypes: true });
1027
+
1028
+ for (const entry of entries) {
1029
+ const fullPath = path.join(searchDir, entry.name);
1030
+
1031
+ if (entry.isFile() && entry.name.endsWith('.md')) {
1032
+ agentFiles.push(fullPath);
1033
+ } else if (entry.isDirectory()) {
1034
+ await searchDirectory(fullPath);
1035
+ }
1036
+ }
1037
+ }
1038
+
1039
+ await searchDirectory(dir);
1040
+ return agentFiles;
1041
+ }
1042
+
1043
+ /**
1044
+ * Vendor cross-module workflows referenced in agent files
1045
+ * Scans SOURCE agent.yaml files for workflow-install and copies workflows to destination
1046
+ * @param {string} sourcePath - Source module path
1047
+ * @param {string} targetPath - Target module path (destination)
1048
+ * @param {string} moduleName - Module name being installed
1049
+ */
1050
+ async vendorCrossModuleWorkflows(sourcePath, targetPath, moduleName) {
1051
+ const sourceAgentsPath = path.join(sourcePath, 'agents');
1052
+
1053
+ // Check if source agents directory exists
1054
+ if (!(await fs.pathExists(sourceAgentsPath))) {
1055
+ return; // No agents to process
1056
+ }
1057
+
1058
+ // Get all agent YAML files from source
1059
+ const agentFiles = await fs.readdir(sourceAgentsPath);
1060
+ const yamlFiles = agentFiles.filter((f) => f.endsWith('.agent.yaml') || f.endsWith('.yaml'));
1061
+
1062
+ if (yamlFiles.length === 0) {
1063
+ return; // No YAML agent files
1064
+ }
1065
+
1066
+ let workflowsVendored = false;
1067
+
1068
+ for (const agentFile of yamlFiles) {
1069
+ const agentPath = path.join(sourceAgentsPath, agentFile);
1070
+ const agentYaml = yaml.parse(await fs.readFile(agentPath, 'utf8'));
1071
+
1072
+ // Check if agent has menu items with workflow-install
1073
+ const menuItems = agentYaml?.agent?.menu || [];
1074
+ const workflowInstallItems = menuItems.filter((item) => item['workflow-install']);
1075
+
1076
+ if (workflowInstallItems.length === 0) {
1077
+ continue; // No workflow-install in this agent
1078
+ }
1079
+
1080
+ if (!workflowsVendored) {
1081
+ await prompts.log.info(`\n Vendoring cross-module workflows for ${moduleName}...`);
1082
+ workflowsVendored = true;
1083
+ }
1084
+
1085
+ await prompts.log.message(` Processing: ${agentFile}`);
1086
+
1087
+ for (const item of workflowInstallItems) {
1088
+ const sourceWorkflowPath = item.exec; // Where to copy FROM
1089
+ const installWorkflowPath = item['workflow-install']; // Where to copy TO
1090
+
1091
+ // Parse SOURCE workflow path
1092
+ // Example: {project-root}/_xiaoma/xmc/workflows/4-implementation/xiaoma-create-story/workflow.md
1093
+ const sourceMatch = sourceWorkflowPath.match(/\{project-root\}\/(?:_xiaoma)\/([^/]+)\/workflows\/(.+)/);
1094
+ if (!sourceMatch) {
1095
+ await prompts.log.warn(` Could not parse workflow path: ${sourceWorkflowPath}`);
1096
+ continue;
1097
+ }
1098
+
1099
+ const [, sourceModule, sourceWorkflowSubPath] = sourceMatch;
1100
+
1101
+ // Parse INSTALL workflow path
1102
+ // Example: {project-root}/_xiaoma/bmgd/workflows/4-production/create-story/workflow.md
1103
+ const installMatch = installWorkflowPath.match(/\{project-root\}\/(?:_xiaoma)\/([^/]+)\/workflows\/(.+)/);
1104
+ if (!installMatch) {
1105
+ await prompts.log.warn(` Could not parse workflow-install path: ${installWorkflowPath}`);
1106
+ continue;
1107
+ }
1108
+
1109
+ const installWorkflowSubPath = installMatch[2];
1110
+
1111
+ const sourceModulePath = getModulePath(sourceModule);
1112
+ const actualSourceWorkflowPath = path.join(sourceModulePath, 'workflows', sourceWorkflowSubPath.replace(/\/workflow\.md$/, ''));
1113
+
1114
+ const actualDestWorkflowPath = path.join(targetPath, 'workflows', installWorkflowSubPath.replace(/\/workflow\.md$/, ''));
1115
+
1116
+ // Check if source workflow exists
1117
+ if (!(await fs.pathExists(actualSourceWorkflowPath))) {
1118
+ await prompts.log.warn(` Source workflow not found: ${actualSourceWorkflowPath}`);
1119
+ continue;
1120
+ }
1121
+
1122
+ // Copy the entire workflow folder
1123
+ await prompts.log.message(
1124
+ ` Vendoring: ${sourceModule}/workflows/${sourceWorkflowSubPath.replace(/\/workflow\.md$/, '')} → ${moduleName}/workflows/${installWorkflowSubPath.replace(/\/workflow\.md$/, '')}`,
1125
+ );
1126
+
1127
+ await fs.ensureDir(path.dirname(actualDestWorkflowPath));
1128
+ // Copy the workflow directory recursively with placeholder replacement
1129
+ await this.copyDirectoryWithPlaceholderReplacement(actualSourceWorkflowPath, actualDestWorkflowPath);
1130
+ }
1131
+ }
1132
+
1133
+ if (workflowsVendored) {
1134
+ await prompts.log.success(` Workflow vendoring complete\n`);
1135
+ }
1136
+ }
1137
+
1138
+ /**
1139
+ * Create directories declared in module.yaml's `directories` key
1140
+ * This replaces the security-risky module installer pattern with declarative config
1141
+ * During updates, if a directory path changed, moves the old directory to the new path
1142
+ * @param {string} moduleName - Name of the module
1143
+ * @param {string} xiaomaDir - Target xiaoma directory
1144
+ * @param {Object} options - Installation options
1145
+ * @param {Object} options.moduleConfig - Module configuration from config collector
1146
+ * @param {Object} options.existingModuleConfig - Previous module config (for detecting path changes during updates)
1147
+ * @param {Object} options.coreConfig - Core configuration
1148
+ * @returns {Promise<{createdDirs: string[], movedDirs: string[], createdWdsFolders: string[]}>} Created directories info
1149
+ */
1150
+ async createModuleDirectories(moduleName, xiaomaDir, options = {}) {
1151
+ const moduleConfig = options.moduleConfig || {};
1152
+ const existingModuleConfig = options.existingModuleConfig || {};
1153
+ const projectRoot = path.dirname(xiaomaDir);
1154
+ const emptyResult = { createdDirs: [], movedDirs: [], createdWdsFolders: [] };
1155
+
1156
+ // Special handling for core module - it's in src/core not src/modules
1157
+ let sourcePath;
1158
+ if (moduleName === 'core') {
1159
+ sourcePath = getSourcePath('core');
1160
+ } else {
1161
+ sourcePath = await this.findModuleSource(moduleName, { silent: true });
1162
+ if (!sourcePath) {
1163
+ return emptyResult; // No source found, skip
1164
+ }
1165
+ }
1166
+
1167
+ // Read module.yaml to find the `directories` key
1168
+ const moduleYamlPath = path.join(sourcePath, 'module.yaml');
1169
+ if (!(await fs.pathExists(moduleYamlPath))) {
1170
+ return emptyResult; // No module.yaml, skip
1171
+ }
1172
+
1173
+ let moduleYaml;
1174
+ try {
1175
+ const yamlContent = await fs.readFile(moduleYamlPath, 'utf8');
1176
+ moduleYaml = yaml.parse(yamlContent);
1177
+ } catch {
1178
+ return emptyResult; // Invalid YAML, skip
1179
+ }
1180
+
1181
+ if (!moduleYaml || !moduleYaml.directories) {
1182
+ return emptyResult; // No directories declared, skip
1183
+ }
1184
+
1185
+ const directories = moduleYaml.directories;
1186
+ const wdsFolders = moduleYaml.wds_folders || [];
1187
+ const createdDirs = [];
1188
+ const movedDirs = [];
1189
+ const createdWdsFolders = [];
1190
+
1191
+ for (const dirRef of directories) {
1192
+ // Parse variable reference like "{design_artifacts}"
1193
+ const varMatch = dirRef.match(/^\{([^}]+)\}$/);
1194
+ if (!varMatch) {
1195
+ // Not a variable reference, skip
1196
+ continue;
1197
+ }
1198
+
1199
+ const configKey = varMatch[1];
1200
+ const dirValue = moduleConfig[configKey];
1201
+ if (!dirValue || typeof dirValue !== 'string') {
1202
+ continue; // No value or not a string, skip
1203
+ }
1204
+
1205
+ // Strip {project-root}/ prefix if present
1206
+ let dirPath = dirValue.replace(/^\{project-root\}\/?/, '');
1207
+
1208
+ // Handle remaining {project-root} anywhere in the path
1209
+ dirPath = dirPath.replaceAll('{project-root}', '');
1210
+
1211
+ // Resolve to absolute path
1212
+ const fullPath = path.join(projectRoot, dirPath);
1213
+
1214
+ // Validate path is within project root (prevent directory traversal)
1215
+ const normalizedPath = path.normalize(fullPath);
1216
+ const normalizedRoot = path.normalize(projectRoot);
1217
+ if (!normalizedPath.startsWith(normalizedRoot + path.sep) && normalizedPath !== normalizedRoot) {
1218
+ const color = await prompts.getColor();
1219
+ await prompts.log.warn(color.yellow(`${configKey} path escapes project root, skipping: ${dirPath}`));
1220
+ continue;
1221
+ }
1222
+
1223
+ // Check if directory path changed from previous config (update/modify scenario)
1224
+ const oldDirValue = existingModuleConfig[configKey];
1225
+ let oldFullPath = null;
1226
+ let oldDirPath = null;
1227
+ if (oldDirValue && typeof oldDirValue === 'string') {
1228
+ // F3: Normalize both values before comparing to avoid false negatives
1229
+ // from trailing slashes, separator differences, or prefix format variations
1230
+ let normalizedOld = oldDirValue.replace(/^\{project-root\}\/?/, '');
1231
+ normalizedOld = path.normalize(normalizedOld.replaceAll('{project-root}', ''));
1232
+ const normalizedNew = path.normalize(dirPath);
1233
+
1234
+ if (normalizedOld !== normalizedNew) {
1235
+ oldDirPath = normalizedOld;
1236
+ oldFullPath = path.join(projectRoot, oldDirPath);
1237
+ const normalizedOldAbsolute = path.normalize(oldFullPath);
1238
+ if (!normalizedOldAbsolute.startsWith(normalizedRoot + path.sep) && normalizedOldAbsolute !== normalizedRoot) {
1239
+ oldFullPath = null; // Old path escapes project root, ignore it
1240
+ }
1241
+
1242
+ // F13: Prevent parent/child move (e.g. docs/planning → docs/planning/v2)
1243
+ if (oldFullPath) {
1244
+ const normalizedNewAbsolute = path.normalize(fullPath);
1245
+ if (
1246
+ normalizedOldAbsolute.startsWith(normalizedNewAbsolute + path.sep) ||
1247
+ normalizedNewAbsolute.startsWith(normalizedOldAbsolute + path.sep)
1248
+ ) {
1249
+ const color = await prompts.getColor();
1250
+ await prompts.log.warn(
1251
+ color.yellow(
1252
+ `${configKey}: cannot move between parent/child paths (${oldDirPath} / ${dirPath}), creating new directory instead`,
1253
+ ),
1254
+ );
1255
+ oldFullPath = null;
1256
+ }
1257
+ }
1258
+ }
1259
+ }
1260
+
1261
+ const dirName = configKey.replaceAll('_', ' ');
1262
+
1263
+ if (oldFullPath && (await fs.pathExists(oldFullPath)) && !(await fs.pathExists(fullPath))) {
1264
+ // Path changed and old dir exists → move old to new location
1265
+ // F1: Use fs.move() instead of fs.rename() for cross-device/volume support
1266
+ // F2: Wrap in try/catch — fallback to creating new dir on failure
1267
+ try {
1268
+ await fs.ensureDir(path.dirname(fullPath));
1269
+ await fs.move(oldFullPath, fullPath);
1270
+ movedDirs.push(`${dirName}: ${oldDirPath} → ${dirPath}`);
1271
+ } catch (moveError) {
1272
+ const color = await prompts.getColor();
1273
+ await prompts.log.warn(
1274
+ color.yellow(
1275
+ `Failed to move ${oldDirPath} → ${dirPath}: ${moveError.message}\n Creating new directory instead. Please move contents from the old directory manually.`,
1276
+ ),
1277
+ );
1278
+ await fs.ensureDir(fullPath);
1279
+ createdDirs.push(`${dirName}: ${dirPath}`);
1280
+ }
1281
+ } else if (oldFullPath && (await fs.pathExists(oldFullPath)) && (await fs.pathExists(fullPath))) {
1282
+ // F5: Both old and new directories exist — warn user about potential orphaned documents
1283
+ const color = await prompts.getColor();
1284
+ await prompts.log.warn(
1285
+ color.yellow(
1286
+ `${dirName}: path changed but both directories exist:\n Old: ${oldDirPath}\n New: ${dirPath}\n Old directory may contain orphaned documents — please review and merge manually.`,
1287
+ ),
1288
+ );
1289
+ } else if (!(await fs.pathExists(fullPath))) {
1290
+ // New directory doesn't exist yet → create it
1291
+ createdDirs.push(`${dirName}: ${dirPath}`);
1292
+ await fs.ensureDir(fullPath);
1293
+ }
1294
+
1295
+ // Create WDS subfolders if this is the design_artifacts directory
1296
+ if (configKey === 'design_artifacts' && wdsFolders.length > 0) {
1297
+ for (const subfolder of wdsFolders) {
1298
+ const subPath = path.join(fullPath, subfolder);
1299
+ if (!(await fs.pathExists(subPath))) {
1300
+ await fs.ensureDir(subPath);
1301
+ createdWdsFolders.push(subfolder);
1302
+ }
1303
+ }
1304
+ }
1305
+ }
1306
+
1307
+ return { createdDirs, movedDirs, createdWdsFolders };
1308
+ }
1309
+
1310
+ /**
1311
+ * Private: Process module configuration
1312
+ * @param {string} modulePath - Path to installed module
1313
+ * @param {string} moduleName - Module name
1314
+ */
1315
+ async processModuleConfig(modulePath, moduleName) {
1316
+ const configPath = path.join(modulePath, 'config.yaml');
1317
+
1318
+ if (await fs.pathExists(configPath)) {
1319
+ try {
1320
+ let configContent = await fs.readFile(configPath, 'utf8');
1321
+
1322
+ // Replace path placeholders
1323
+ configContent = configContent.replaceAll('{project-root}', `xiaoma/${moduleName}`);
1324
+ configContent = configContent.replaceAll('{module}', moduleName);
1325
+
1326
+ await fs.writeFile(configPath, configContent, 'utf8');
1327
+ } catch (error) {
1328
+ await prompts.log.warn(`Failed to process module config: ${error.message}`);
1329
+ }
1330
+ }
1331
+ }
1332
+
1333
+ /**
1334
+ * Private: Sync module files (preserving user modifications)
1335
+ * @param {string} sourcePath - Source module path
1336
+ * @param {string} targetPath - Target module path
1337
+ */
1338
+ async syncModule(sourcePath, targetPath) {
1339
+ // Get list of all source files
1340
+ const sourceFiles = await this.getFileList(sourcePath);
1341
+
1342
+ for (const file of sourceFiles) {
1343
+ const sourceFile = path.join(sourcePath, file);
1344
+ const targetFile = path.join(targetPath, file);
1345
+
1346
+ // Check if target file exists and has been modified
1347
+ if (await fs.pathExists(targetFile)) {
1348
+ const sourceStats = await fs.stat(sourceFile);
1349
+ const targetStats = await fs.stat(targetFile);
1350
+
1351
+ // Skip if target is newer (user modified)
1352
+ if (targetStats.mtime > sourceStats.mtime) {
1353
+ continue;
1354
+ }
1355
+ }
1356
+
1357
+ // Copy file with placeholder replacement
1358
+ await this.copyFileWithPlaceholderReplacement(sourceFile, targetFile);
1359
+ }
1360
+ }
1361
+
1362
+ /**
1363
+ * Private: Get list of all files in a directory
1364
+ * @param {string} dir - Directory path
1365
+ * @param {string} baseDir - Base directory for relative paths
1366
+ * @returns {Array} List of relative file paths
1367
+ */
1368
+ async getFileList(dir, baseDir = dir) {
1369
+ const files = [];
1370
+ const entries = await fs.readdir(dir, { withFileTypes: true });
1371
+
1372
+ for (const entry of entries) {
1373
+ const fullPath = path.join(dir, entry.name);
1374
+
1375
+ if (entry.isDirectory()) {
1376
+ const subFiles = await this.getFileList(fullPath, baseDir);
1377
+ files.push(...subFiles);
1378
+ } else {
1379
+ files.push(path.relative(baseDir, fullPath));
1380
+ }
1381
+ }
1382
+
1383
+ return files;
1384
+ }
1385
+ }
1386
+
1387
+ module.exports = { ModuleManager };