@zigrivers/scaffold 3.16.0 → 3.18.0

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 (385) hide show
  1. package/README.md +28 -0
  2. package/content/knowledge/backend/backend-fintech-broker-integration.md +244 -0
  3. package/content/knowledge/backend/backend-fintech-compliance.md +181 -0
  4. package/content/knowledge/backend/backend-fintech-data-modeling.md +210 -0
  5. package/content/knowledge/backend/backend-fintech-ledger.md +226 -0
  6. package/content/knowledge/backend/backend-fintech-observability.md +151 -0
  7. package/content/knowledge/backend/backend-fintech-order-lifecycle.md +213 -0
  8. package/content/knowledge/backend/backend-fintech-risk-management.md +150 -0
  9. package/content/knowledge/backend/backend-fintech-testing.md +197 -0
  10. package/content/knowledge/core/automated-review-tooling.md +10 -0
  11. package/content/knowledge/core/multi-service-api-contracts.md +634 -0
  12. package/content/knowledge/core/multi-service-architecture.md +492 -0
  13. package/content/knowledge/core/multi-service-auth.md +706 -0
  14. package/content/knowledge/core/multi-service-data-ownership.md +539 -0
  15. package/content/knowledge/core/multi-service-observability.md +545 -0
  16. package/content/knowledge/core/multi-service-resilience.md +710 -0
  17. package/content/knowledge/core/multi-service-task-decomposition.md +615 -0
  18. package/content/knowledge/core/multi-service-testing.md +728 -0
  19. package/content/methodology/backend-fintech.yml +46 -0
  20. package/content/methodology/custom-defaults.yml +6 -0
  21. package/content/methodology/deep.yml +6 -0
  22. package/content/methodology/multi-service-overlay.yml +103 -0
  23. package/content/methodology/mvp.yml +6 -0
  24. package/content/pipeline/architecture/service-ownership-map.md +83 -0
  25. package/content/pipeline/quality/cross-service-auth.md +96 -0
  26. package/content/pipeline/quality/cross-service-observability.md +104 -0
  27. package/content/pipeline/quality/integration-test-plan.md +106 -0
  28. package/content/pipeline/specification/inter-service-contracts.md +95 -0
  29. package/dist/cli/commands/adopt.cli-flags.test.js +20 -0
  30. package/dist/cli/commands/adopt.cli-flags.test.js.map +1 -1
  31. package/dist/cli/commands/adopt.d.ts.map +1 -1
  32. package/dist/cli/commands/adopt.js +11 -3
  33. package/dist/cli/commands/adopt.js.map +1 -1
  34. package/dist/cli/commands/complete.d.ts +1 -0
  35. package/dist/cli/commands/complete.d.ts.map +1 -1
  36. package/dist/cli/commands/complete.js +26 -8
  37. package/dist/cli/commands/complete.js.map +1 -1
  38. package/dist/cli/commands/dashboard.d.ts +1 -0
  39. package/dist/cli/commands/dashboard.d.ts.map +1 -1
  40. package/dist/cli/commands/dashboard.js +19 -6
  41. package/dist/cli/commands/dashboard.js.map +1 -1
  42. package/dist/cli/commands/decisions.d.ts +1 -0
  43. package/dist/cli/commands/decisions.d.ts.map +1 -1
  44. package/dist/cli/commands/decisions.js +18 -4
  45. package/dist/cli/commands/decisions.js.map +1 -1
  46. package/dist/cli/commands/info.d.ts +1 -0
  47. package/dist/cli/commands/info.d.ts.map +1 -1
  48. package/dist/cli/commands/info.js +25 -3
  49. package/dist/cli/commands/info.js.map +1 -1
  50. package/dist/cli/commands/init-from.test.d.ts +2 -0
  51. package/dist/cli/commands/init-from.test.d.ts.map +1 -0
  52. package/dist/cli/commands/init-from.test.js +315 -0
  53. package/dist/cli/commands/init-from.test.js.map +1 -0
  54. package/dist/cli/commands/init.d.ts +3 -0
  55. package/dist/cli/commands/init.d.ts.map +1 -1
  56. package/dist/cli/commands/init.js +239 -129
  57. package/dist/cli/commands/init.js.map +1 -1
  58. package/dist/cli/commands/init.test.js +20 -0
  59. package/dist/cli/commands/init.test.js.map +1 -1
  60. package/dist/cli/commands/next.d.ts +1 -0
  61. package/dist/cli/commands/next.d.ts.map +1 -1
  62. package/dist/cli/commands/next.js +40 -4
  63. package/dist/cli/commands/next.js.map +1 -1
  64. package/dist/cli/commands/next.test.js +153 -0
  65. package/dist/cli/commands/next.test.js.map +1 -1
  66. package/dist/cli/commands/reset.d.ts +1 -0
  67. package/dist/cli/commands/reset.d.ts.map +1 -1
  68. package/dist/cli/commands/reset.js +77 -29
  69. package/dist/cli/commands/reset.js.map +1 -1
  70. package/dist/cli/commands/rework.d.ts +1 -0
  71. package/dist/cli/commands/rework.d.ts.map +1 -1
  72. package/dist/cli/commands/rework.js +16 -2
  73. package/dist/cli/commands/rework.js.map +1 -1
  74. package/dist/cli/commands/run.d.ts +1 -0
  75. package/dist/cli/commands/run.d.ts.map +1 -1
  76. package/dist/cli/commands/run.js +65 -13
  77. package/dist/cli/commands/run.js.map +1 -1
  78. package/dist/cli/commands/run.test.js +255 -3
  79. package/dist/cli/commands/run.test.js.map +1 -1
  80. package/dist/cli/commands/skip.d.ts +1 -0
  81. package/dist/cli/commands/skip.d.ts.map +1 -1
  82. package/dist/cli/commands/skip.js +24 -7
  83. package/dist/cli/commands/skip.js.map +1 -1
  84. package/dist/cli/commands/status.d.ts +1 -0
  85. package/dist/cli/commands/status.d.ts.map +1 -1
  86. package/dist/cli/commands/status.js +51 -4
  87. package/dist/cli/commands/status.js.map +1 -1
  88. package/dist/cli/commands/status.test.js +130 -0
  89. package/dist/cli/commands/status.test.js.map +1 -1
  90. package/dist/cli/guards-coverage.test.d.ts +2 -0
  91. package/dist/cli/guards-coverage.test.d.ts.map +1 -0
  92. package/dist/cli/guards-coverage.test.js +26 -0
  93. package/dist/cli/guards-coverage.test.js.map +1 -0
  94. package/dist/cli/guards-integration.test.d.ts +2 -0
  95. package/dist/cli/guards-integration.test.d.ts.map +1 -0
  96. package/dist/cli/guards-integration.test.js +178 -0
  97. package/dist/cli/guards-integration.test.js.map +1 -0
  98. package/dist/cli/guards.d.ts +13 -0
  99. package/dist/cli/guards.d.ts.map +1 -0
  100. package/dist/cli/guards.js +70 -0
  101. package/dist/cli/guards.js.map +1 -0
  102. package/dist/cli/guards.test.d.ts +2 -0
  103. package/dist/cli/guards.test.d.ts.map +1 -0
  104. package/dist/cli/guards.test.js +136 -0
  105. package/dist/cli/guards.test.js.map +1 -0
  106. package/dist/cli/init-flag-families.d.ts +1 -1
  107. package/dist/cli/init-flag-families.d.ts.map +1 -1
  108. package/dist/cli/init-flag-families.js +4 -1
  109. package/dist/cli/init-flag-families.js.map +1 -1
  110. package/dist/cli/init-flag-families.test.js +10 -0
  111. package/dist/cli/init-flag-families.test.js.map +1 -1
  112. package/dist/cli/shutdown.d.ts +2 -3
  113. package/dist/cli/shutdown.d.ts.map +1 -1
  114. package/dist/cli/shutdown.js +14 -11
  115. package/dist/cli/shutdown.js.map +1 -1
  116. package/dist/cli/shutdown.test.js +2 -4
  117. package/dist/cli/shutdown.test.js.map +1 -1
  118. package/dist/config/schema.d.ts +12122 -288
  119. package/dist/config/schema.d.ts.map +1 -1
  120. package/dist/config/schema.js +74 -79
  121. package/dist/config/schema.js.map +1 -1
  122. package/dist/config/schema.test.js +230 -1
  123. package/dist/config/schema.test.js.map +1 -1
  124. package/dist/config/validators/backend.d.ts +4 -0
  125. package/dist/config/validators/backend.d.ts.map +1 -0
  126. package/dist/config/validators/backend.js +14 -0
  127. package/dist/config/validators/backend.js.map +1 -0
  128. package/dist/config/validators/browser-extension.d.ts +4 -0
  129. package/dist/config/validators/browser-extension.d.ts.map +1 -0
  130. package/dist/config/validators/browser-extension.js +24 -0
  131. package/dist/config/validators/browser-extension.js.map +1 -0
  132. package/dist/config/validators/cli.d.ts +4 -0
  133. package/dist/config/validators/cli.d.ts.map +1 -0
  134. package/dist/config/validators/cli.js +14 -0
  135. package/dist/config/validators/cli.js.map +1 -0
  136. package/dist/config/validators/data-pipeline.d.ts +4 -0
  137. package/dist/config/validators/data-pipeline.d.ts.map +1 -0
  138. package/dist/config/validators/data-pipeline.js +14 -0
  139. package/dist/config/validators/data-pipeline.js.map +1 -0
  140. package/dist/config/validators/game.d.ts +4 -0
  141. package/dist/config/validators/game.d.ts.map +1 -0
  142. package/dist/config/validators/game.js +14 -0
  143. package/dist/config/validators/game.js.map +1 -0
  144. package/dist/config/validators/index.d.ts +7 -0
  145. package/dist/config/validators/index.d.ts.map +1 -0
  146. package/dist/config/validators/index.js +27 -0
  147. package/dist/config/validators/index.js.map +1 -0
  148. package/dist/config/validators/library.d.ts +4 -0
  149. package/dist/config/validators/library.d.ts.map +1 -0
  150. package/dist/config/validators/library.js +25 -0
  151. package/dist/config/validators/library.js.map +1 -0
  152. package/dist/config/validators/ml.d.ts +4 -0
  153. package/dist/config/validators/ml.d.ts.map +1 -0
  154. package/dist/config/validators/ml.js +31 -0
  155. package/dist/config/validators/ml.js.map +1 -0
  156. package/dist/config/validators/mobile-app.d.ts +4 -0
  157. package/dist/config/validators/mobile-app.d.ts.map +1 -0
  158. package/dist/config/validators/mobile-app.js +14 -0
  159. package/dist/config/validators/mobile-app.js.map +1 -0
  160. package/dist/config/validators/registry.test.d.ts +2 -0
  161. package/dist/config/validators/registry.test.d.ts.map +1 -0
  162. package/dist/config/validators/registry.test.js +26 -0
  163. package/dist/config/validators/registry.test.js.map +1 -0
  164. package/dist/config/validators/research.d.ts +4 -0
  165. package/dist/config/validators/research.d.ts.map +1 -0
  166. package/dist/config/validators/research.js +24 -0
  167. package/dist/config/validators/research.js.map +1 -0
  168. package/dist/config/validators/research.test.d.ts +2 -0
  169. package/dist/config/validators/research.test.d.ts.map +1 -0
  170. package/dist/config/validators/research.test.js +44 -0
  171. package/dist/config/validators/research.test.js.map +1 -0
  172. package/dist/config/validators/types.d.ts +19 -0
  173. package/dist/config/validators/types.d.ts.map +1 -0
  174. package/dist/config/validators/types.js +2 -0
  175. package/dist/config/validators/types.js.map +1 -0
  176. package/dist/config/validators/validators.test.d.ts +2 -0
  177. package/dist/config/validators/validators.test.d.ts.map +1 -0
  178. package/dist/config/validators/validators.test.js +25 -0
  179. package/dist/config/validators/validators.test.js.map +1 -0
  180. package/dist/config/validators/web-app.d.ts +4 -0
  181. package/dist/config/validators/web-app.d.ts.map +1 -0
  182. package/dist/config/validators/web-app.js +31 -0
  183. package/dist/config/validators/web-app.js.map +1 -0
  184. package/dist/core/assembly/context-gatherer.d.ts.map +1 -1
  185. package/dist/core/assembly/context-gatherer.js +4 -2
  186. package/dist/core/assembly/context-gatherer.js.map +1 -1
  187. package/dist/core/assembly/cross-reads.d.ts +61 -0
  188. package/dist/core/assembly/cross-reads.d.ts.map +1 -0
  189. package/dist/core/assembly/cross-reads.js +190 -0
  190. package/dist/core/assembly/cross-reads.js.map +1 -0
  191. package/dist/core/assembly/cross-reads.test.d.ts +2 -0
  192. package/dist/core/assembly/cross-reads.test.d.ts.map +1 -0
  193. package/dist/core/assembly/cross-reads.test.js +497 -0
  194. package/dist/core/assembly/cross-reads.test.js.map +1 -0
  195. package/dist/core/assembly/overlay-loader-structural.test.d.ts +2 -0
  196. package/dist/core/assembly/overlay-loader-structural.test.d.ts.map +1 -0
  197. package/dist/core/assembly/overlay-loader-structural.test.js +173 -0
  198. package/dist/core/assembly/overlay-loader-structural.test.js.map +1 -0
  199. package/dist/core/assembly/overlay-loader.d.ts +19 -3
  200. package/dist/core/assembly/overlay-loader.d.ts.map +1 -1
  201. package/dist/core/assembly/overlay-loader.js +135 -4
  202. package/dist/core/assembly/overlay-loader.js.map +1 -1
  203. package/dist/core/assembly/overlay-loader.test.js +204 -1
  204. package/dist/core/assembly/overlay-loader.test.js.map +1 -1
  205. package/dist/core/assembly/overlay-resolver.d.ts +9 -2
  206. package/dist/core/assembly/overlay-resolver.d.ts.map +1 -1
  207. package/dist/core/assembly/overlay-resolver.js +32 -1
  208. package/dist/core/assembly/overlay-resolver.js.map +1 -1
  209. package/dist/core/assembly/overlay-resolver.test.js +135 -17
  210. package/dist/core/assembly/overlay-resolver.test.js.map +1 -1
  211. package/dist/core/assembly/overlay-state-resolver.d.ts +9 -0
  212. package/dist/core/assembly/overlay-state-resolver.d.ts.map +1 -1
  213. package/dist/core/assembly/overlay-state-resolver.js +43 -2
  214. package/dist/core/assembly/overlay-state-resolver.js.map +1 -1
  215. package/dist/core/assembly/overlay-state-resolver.test.js +321 -0
  216. package/dist/core/assembly/overlay-state-resolver.test.js.map +1 -1
  217. package/dist/core/assembly/update-mode.d.ts +1 -0
  218. package/dist/core/assembly/update-mode.d.ts.map +1 -1
  219. package/dist/core/assembly/update-mode.js +17 -9
  220. package/dist/core/assembly/update-mode.js.map +1 -1
  221. package/dist/core/dependency/eligibility.d.ts +10 -1
  222. package/dist/core/dependency/eligibility.d.ts.map +1 -1
  223. package/dist/core/dependency/eligibility.js +19 -1
  224. package/dist/core/dependency/eligibility.js.map +1 -1
  225. package/dist/core/dependency/eligibility.test.js +82 -0
  226. package/dist/core/dependency/eligibility.test.js.map +1 -1
  227. package/dist/core/dependency/graph.d.ts +4 -1
  228. package/dist/core/dependency/graph.d.ts.map +1 -1
  229. package/dist/core/dependency/graph.js +7 -1
  230. package/dist/core/dependency/graph.js.map +1 -1
  231. package/dist/core/dependency/graph.test.js +48 -0
  232. package/dist/core/dependency/graph.test.js.map +1 -1
  233. package/dist/core/pipeline/global-steps.d.ts +7 -0
  234. package/dist/core/pipeline/global-steps.d.ts.map +1 -0
  235. package/dist/core/pipeline/global-steps.js +18 -0
  236. package/dist/core/pipeline/global-steps.js.map +1 -0
  237. package/dist/core/pipeline/resolver.d.ts +1 -0
  238. package/dist/core/pipeline/resolver.d.ts.map +1 -1
  239. package/dist/core/pipeline/resolver.js +54 -7
  240. package/dist/core/pipeline/resolver.js.map +1 -1
  241. package/dist/core/pipeline/resolver.test.js +51 -1
  242. package/dist/core/pipeline/resolver.test.js.map +1 -1
  243. package/dist/core/pipeline/types.d.ts +5 -1
  244. package/dist/core/pipeline/types.d.ts.map +1 -1
  245. package/dist/e2e/cross-service-references.test.d.ts +22 -0
  246. package/dist/e2e/cross-service-references.test.d.ts.map +1 -0
  247. package/dist/e2e/cross-service-references.test.js +230 -0
  248. package/dist/e2e/cross-service-references.test.js.map +1 -0
  249. package/dist/e2e/multi-service-pipeline.test.d.ts +10 -0
  250. package/dist/e2e/multi-service-pipeline.test.d.ts.map +1 -0
  251. package/dist/e2e/multi-service-pipeline.test.js +185 -0
  252. package/dist/e2e/multi-service-pipeline.test.js.map +1 -0
  253. package/dist/e2e/project-type-overlays.test.js +68 -0
  254. package/dist/e2e/project-type-overlays.test.js.map +1 -1
  255. package/dist/e2e/service-execution.test.d.ts +15 -0
  256. package/dist/e2e/service-execution.test.d.ts.map +1 -0
  257. package/dist/e2e/service-execution.test.js +219 -0
  258. package/dist/e2e/service-execution.test.js.map +1 -0
  259. package/dist/e2e/service-manifest.test.d.ts +19 -0
  260. package/dist/e2e/service-manifest.test.d.ts.map +1 -0
  261. package/dist/e2e/service-manifest.test.js +166 -0
  262. package/dist/e2e/service-manifest.test.js.map +1 -0
  263. package/dist/project/__frozen-schemas__/schema-v3.9.2.d.ts +224 -224
  264. package/dist/project/frontmatter.d.ts.map +1 -1
  265. package/dist/project/frontmatter.js +11 -0
  266. package/dist/project/frontmatter.js.map +1 -1
  267. package/dist/project/frontmatter.test.js +71 -0
  268. package/dist/project/frontmatter.test.js.map +1 -1
  269. package/dist/state/completion.d.ts +1 -1
  270. package/dist/state/completion.d.ts.map +1 -1
  271. package/dist/state/completion.js +10 -8
  272. package/dist/state/completion.js.map +1 -1
  273. package/dist/state/decision-logger.d.ts +3 -2
  274. package/dist/state/decision-logger.d.ts.map +1 -1
  275. package/dist/state/decision-logger.js +12 -11
  276. package/dist/state/decision-logger.js.map +1 -1
  277. package/dist/state/ensure-v3-migration.d.ts +9 -0
  278. package/dist/state/ensure-v3-migration.d.ts.map +1 -0
  279. package/dist/state/ensure-v3-migration.js +35 -0
  280. package/dist/state/ensure-v3-migration.js.map +1 -0
  281. package/dist/state/lock-manager.d.ts +5 -4
  282. package/dist/state/lock-manager.d.ts.map +1 -1
  283. package/dist/state/lock-manager.js +11 -11
  284. package/dist/state/lock-manager.js.map +1 -1
  285. package/dist/state/rework-manager.d.ts +1 -2
  286. package/dist/state/rework-manager.d.ts.map +1 -1
  287. package/dist/state/rework-manager.js +4 -5
  288. package/dist/state/rework-manager.js.map +1 -1
  289. package/dist/state/state-manager.d.ts +25 -1
  290. package/dist/state/state-manager.d.ts.map +1 -1
  291. package/dist/state/state-manager.js +86 -12
  292. package/dist/state/state-manager.js.map +1 -1
  293. package/dist/state/state-manager.test.js +278 -0
  294. package/dist/state/state-manager.test.js.map +1 -1
  295. package/dist/state/state-migration-v3.d.ts +22 -0
  296. package/dist/state/state-migration-v3.d.ts.map +1 -0
  297. package/dist/state/state-migration-v3.js +82 -0
  298. package/dist/state/state-migration-v3.js.map +1 -0
  299. package/dist/state/state-migration-v3.test.d.ts +2 -0
  300. package/dist/state/state-migration-v3.test.d.ts.map +1 -0
  301. package/dist/state/state-migration-v3.test.js +196 -0
  302. package/dist/state/state-migration-v3.test.js.map +1 -0
  303. package/dist/state/state-migration.d.ts.map +1 -1
  304. package/dist/state/state-migration.js +11 -6
  305. package/dist/state/state-migration.js.map +1 -1
  306. package/dist/state/state-migration.test.js +47 -2
  307. package/dist/state/state-migration.test.js.map +1 -1
  308. package/dist/state/state-path-resolver.d.ts +23 -0
  309. package/dist/state/state-path-resolver.d.ts.map +1 -0
  310. package/dist/state/state-path-resolver.js +36 -0
  311. package/dist/state/state-path-resolver.js.map +1 -0
  312. package/dist/state/state-path-resolver.test.d.ts +2 -0
  313. package/dist/state/state-path-resolver.test.d.ts.map +1 -0
  314. package/dist/state/state-path-resolver.test.js +78 -0
  315. package/dist/state/state-path-resolver.test.js.map +1 -0
  316. package/dist/state/state-version-dispatch.d.ts +17 -0
  317. package/dist/state/state-version-dispatch.d.ts.map +1 -0
  318. package/dist/state/state-version-dispatch.js +27 -0
  319. package/dist/state/state-version-dispatch.js.map +1 -0
  320. package/dist/state/state-version-dispatch.test.d.ts +2 -0
  321. package/dist/state/state-version-dispatch.test.d.ts.map +1 -0
  322. package/dist/state/state-version-dispatch.test.js +40 -0
  323. package/dist/state/state-version-dispatch.test.js.map +1 -0
  324. package/dist/types/config.d.ts +33 -3
  325. package/dist/types/config.d.ts.map +1 -1
  326. package/dist/types/config.test.js +62 -1
  327. package/dist/types/config.test.js.map +1 -1
  328. package/dist/types/dependency.d.ts +9 -0
  329. package/dist/types/dependency.d.ts.map +1 -1
  330. package/dist/types/frontmatter.d.ts +5 -0
  331. package/dist/types/frontmatter.d.ts.map +1 -1
  332. package/dist/types/lock.d.ts +1 -1
  333. package/dist/types/lock.d.ts.map +1 -1
  334. package/dist/types/state.d.ts +1 -1
  335. package/dist/types/state.d.ts.map +1 -1
  336. package/dist/utils/artifact-path.d.ts +19 -0
  337. package/dist/utils/artifact-path.d.ts.map +1 -0
  338. package/dist/utils/artifact-path.js +95 -0
  339. package/dist/utils/artifact-path.js.map +1 -0
  340. package/dist/utils/artifact-path.test.d.ts +2 -0
  341. package/dist/utils/artifact-path.test.d.ts.map +1 -0
  342. package/dist/utils/artifact-path.test.js +138 -0
  343. package/dist/utils/artifact-path.test.js.map +1 -0
  344. package/dist/utils/errors.d.ts +3 -1
  345. package/dist/utils/errors.d.ts.map +1 -1
  346. package/dist/utils/errors.js +21 -2
  347. package/dist/utils/errors.js.map +1 -1
  348. package/dist/utils/errors.test.js +27 -1
  349. package/dist/utils/errors.test.js.map +1 -1
  350. package/dist/utils/user-errors.d.ts +46 -0
  351. package/dist/utils/user-errors.d.ts.map +1 -0
  352. package/dist/utils/user-errors.js +76 -0
  353. package/dist/utils/user-errors.js.map +1 -0
  354. package/dist/utils/user-errors.test.d.ts +2 -0
  355. package/dist/utils/user-errors.test.d.ts.map +1 -0
  356. package/dist/utils/user-errors.test.js +74 -0
  357. package/dist/utils/user-errors.test.js.map +1 -0
  358. package/dist/validation/index.d.ts.map +1 -1
  359. package/dist/validation/index.js +16 -0
  360. package/dist/validation/index.js.map +1 -1
  361. package/dist/validation/index.test.js +48 -0
  362. package/dist/validation/index.test.js.map +1 -1
  363. package/dist/validation/state-validator.d.ts +5 -2
  364. package/dist/validation/state-validator.d.ts.map +1 -1
  365. package/dist/validation/state-validator.js +18 -20
  366. package/dist/validation/state-validator.js.map +1 -1
  367. package/dist/validation/state-validator.test.js +31 -2
  368. package/dist/validation/state-validator.test.js.map +1 -1
  369. package/dist/wizard/copy/backend.d.ts.map +1 -1
  370. package/dist/wizard/copy/backend.js +12 -0
  371. package/dist/wizard/copy/backend.js.map +1 -1
  372. package/dist/wizard/flags.d.ts +1 -0
  373. package/dist/wizard/flags.d.ts.map +1 -1
  374. package/dist/wizard/questions.d.ts.map +1 -1
  375. package/dist/wizard/questions.js +5 -1
  376. package/dist/wizard/questions.js.map +1 -1
  377. package/dist/wizard/questions.test.js +45 -2
  378. package/dist/wizard/questions.test.js.map +1 -1
  379. package/dist/wizard/wizard.d.ts +23 -0
  380. package/dist/wizard/wizard.d.ts.map +1 -1
  381. package/dist/wizard/wizard.js +85 -47
  382. package/dist/wizard/wizard.js.map +1 -1
  383. package/dist/wizard/wizard.test.js +186 -1
  384. package/dist/wizard/wizard.test.js.map +1 -1
  385. package/package.json +1 -1
@@ -0,0 +1,22 @@
1
+ /**
2
+ * E2E integration tests for cross-service references (Wave 3c).
3
+ *
4
+ * Scope note: these tests exercise the full cross-reads resolver against the
5
+ * real filesystem (StateManager.loadStateReadOnly, migrateState, state merging,
6
+ * per-service cache, transitive DFS). MetaPromptFile fixtures are typed objects
7
+ * rather than on-disk pipeline content because Wave 3c is the first feature to
8
+ * use the crossReads frontmatter field — no real pipeline step uses it yet.
9
+ * CLI-wiring coverage (loadPipelineContext + runCommand.handler) lives in
10
+ * src/cli/commands/run.test.ts's "cross-reads artifact gathering (Wave 3c)"
11
+ * suite, which mocks resolveTransitiveCrossReads at the module boundary.
12
+ *
13
+ * Verifies:
14
+ * - resolveTransitiveCrossReads returns foreign service artifacts
15
+ * - transitive chain A → B → C surfaces C's artifact via B's crossReads
16
+ * - the read-only loader NEVER writes to foreign state — regression test for
17
+ * the Round-4 P0 (migrateState → saveState clobbering next_eligible)
18
+ * - cross-reads work while a foreign service's lock is held (no deadlock,
19
+ * no foreign-state write under concurrency)
20
+ */
21
+ export {};
22
+ //# sourceMappingURL=cross-service-references.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-service-references.test.d.ts","sourceRoot":"","sources":["../../src/e2e/cross-service-references.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG"}
@@ -0,0 +1,230 @@
1
+ /**
2
+ * E2E integration tests for cross-service references (Wave 3c).
3
+ *
4
+ * Scope note: these tests exercise the full cross-reads resolver against the
5
+ * real filesystem (StateManager.loadStateReadOnly, migrateState, state merging,
6
+ * per-service cache, transitive DFS). MetaPromptFile fixtures are typed objects
7
+ * rather than on-disk pipeline content because Wave 3c is the first feature to
8
+ * use the crossReads frontmatter field — no real pipeline step uses it yet.
9
+ * CLI-wiring coverage (loadPipelineContext + runCommand.handler) lives in
10
+ * src/cli/commands/run.test.ts's "cross-reads artifact gathering (Wave 3c)"
11
+ * suite, which mocks resolveTransitiveCrossReads at the module boundary.
12
+ *
13
+ * Verifies:
14
+ * - resolveTransitiveCrossReads returns foreign service artifacts
15
+ * - transitive chain A → B → C surfaces C's artifact via B's crossReads
16
+ * - the read-only loader NEVER writes to foreign state — regression test for
17
+ * the Round-4 P0 (migrateState → saveState clobbering next_eligible)
18
+ * - cross-reads work while a foreign service's lock is held (no deadlock,
19
+ * no foreign-state write under concurrency)
20
+ */
21
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
22
+ import fs from 'node:fs';
23
+ import path from 'node:path';
24
+ import os from 'node:os';
25
+ import { resolveTransitiveCrossReads } from '../core/assembly/cross-reads.js';
26
+ function mkOutput() {
27
+ return {
28
+ warn: vi.fn(), info: vi.fn(), success: vi.fn(), error: vi.fn(),
29
+ result: vi.fn(),
30
+ supportsInteractivePrompts: vi.fn().mockReturnValue(false),
31
+ prompt: vi.fn(), confirm: vi.fn(), select: vi.fn(),
32
+ multiSelect: vi.fn(), multiInput: vi.fn(),
33
+ startSpinner: vi.fn(), stopSpinner: vi.fn(),
34
+ startProgress: vi.fn(), updateProgress: vi.fn(), stopProgress: vi.fn(),
35
+ };
36
+ }
37
+ function mkMetaFile(name, crossReads = []) {
38
+ return {
39
+ stepName: name,
40
+ filePath: `/fake/${name}.md`,
41
+ frontmatter: {
42
+ name, description: '', summary: null,
43
+ phase: 'architecture', order: 700,
44
+ dependencies: [], outputs: [], conditional: null,
45
+ knowledgeBase: [], reads: [], crossReads,
46
+ stateless: false, category: 'pipeline',
47
+ },
48
+ body: '', sections: {},
49
+ };
50
+ }
51
+ function writeState(filePath, steps) {
52
+ fs.mkdirSync(path.dirname(filePath), { recursive: true });
53
+ fs.writeFileSync(filePath, JSON.stringify({
54
+ 'schema-version': 3,
55
+ steps,
56
+ next_eligible: [],
57
+ in_progress: null,
58
+ }));
59
+ }
60
+ describe('Cross-service references E2E (Wave 3c)', () => {
61
+ let projectRoot;
62
+ const producerStep = 'domain-modeling'; // service-local step (not in multi-service-overlay)
63
+ beforeEach(() => {
64
+ projectRoot = path.join(os.tmpdir(), `scaffold-e2e-cross-${Date.now()}-${Math.random()}`);
65
+ fs.mkdirSync(path.join(projectRoot, 'docs'), { recursive: true });
66
+ fs.mkdirSync(path.join(projectRoot, '.scaffold', 'services', 'producer'), { recursive: true });
67
+ fs.mkdirSync(path.join(projectRoot, '.scaffold', 'services', 'consumer'), { recursive: true });
68
+ writeState(path.join(projectRoot, '.scaffold', 'state.json'), {});
69
+ writeState(path.join(projectRoot, '.scaffold', 'services', 'producer', 'state.json'), { [producerStep]: { status: 'completed', produces: ['docs/contracts.md'] } });
70
+ writeState(path.join(projectRoot, '.scaffold', 'services', 'consumer', 'state.json'), {});
71
+ fs.writeFileSync(path.join(projectRoot, 'docs', 'contracts.md'), 'CONTRACTS');
72
+ });
73
+ afterEach(() => fs.rmSync(projectRoot, { recursive: true, force: true }));
74
+ const config = {
75
+ version: 2, methodology: 'deep', platforms: ['claude-code'],
76
+ project: {
77
+ services: [
78
+ {
79
+ name: 'producer', projectType: 'library',
80
+ libraryConfig: { visibility: 'internal' },
81
+ exports: [{ step: producerStep }],
82
+ },
83
+ {
84
+ name: 'consumer', projectType: 'backend',
85
+ backendConfig: { apiStyle: 'rest' },
86
+ },
87
+ ],
88
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
89
+ },
90
+ };
91
+ it('resolveTransitiveCrossReads returns foreign service artifact end-to-end', () => {
92
+ const metas = new Map([
93
+ [producerStep, mkMetaFile(producerStep)],
94
+ ]);
95
+ const output = mkOutput();
96
+ const artifacts = resolveTransitiveCrossReads([{ service: 'producer', step: producerStep }], config, projectRoot, metas, output, new Set(), new Map(), new Map());
97
+ expect(artifacts).toEqual([
98
+ expect.objectContaining({
99
+ stepName: `producer:${producerStep}`,
100
+ filePath: 'docs/contracts.md',
101
+ content: 'CONTRACTS',
102
+ }),
103
+ ]);
104
+ });
105
+ it('transitive chain: consumer → producer → shared-lib surfaces all artifacts', () => {
106
+ // A third service 'shared-lib' produces docs/shared.md; producer's
107
+ // domain-modeling step cross-reads shared-lib, so consumer cross-reading
108
+ // producer should transitively receive shared-lib's artifact too.
109
+ fs.mkdirSync(path.join(projectRoot, '.scaffold', 'services', 'shared-lib'), { recursive: true });
110
+ fs.writeFileSync(path.join(projectRoot, 'docs', 'shared.md'), 'SHARED');
111
+ writeState(path.join(projectRoot, '.scaffold', 'services', 'shared-lib', 'state.json'), { 'api-contracts': { status: 'completed', produces: ['docs/shared.md'] } });
112
+ const transitiveConfig = {
113
+ version: 2, methodology: 'deep', platforms: ['claude-code'],
114
+ project: {
115
+ services: [
116
+ {
117
+ name: 'producer', projectType: 'library',
118
+ libraryConfig: { visibility: 'internal' },
119
+ exports: [{ step: producerStep }],
120
+ },
121
+ {
122
+ name: 'shared-lib', projectType: 'library',
123
+ libraryConfig: { visibility: 'internal' },
124
+ exports: [{ step: 'api-contracts' }],
125
+ },
126
+ {
127
+ name: 'consumer', projectType: 'backend',
128
+ backendConfig: { apiStyle: 'rest' },
129
+ },
130
+ ],
131
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
132
+ },
133
+ };
134
+ // Producer's step template declares a cross-read to shared-lib:api-contracts
135
+ const metas = new Map([
136
+ [producerStep, mkMetaFile(producerStep, [{ service: 'shared-lib', step: 'api-contracts' }])],
137
+ ['api-contracts', mkMetaFile('api-contracts')],
138
+ ]);
139
+ const output = mkOutput();
140
+ const artifacts = resolveTransitiveCrossReads([{ service: 'producer', step: producerStep }], // consumer → producer
141
+ transitiveConfig, projectRoot, metas, output, new Set(), new Map(), new Map());
142
+ const paths = artifacts.map(a => a.filePath).sort();
143
+ expect(paths).toEqual(['docs/contracts.md', 'docs/shared.md']);
144
+ });
145
+ it('NEVER writes to foreign state file even when migrateState would apply a rename', () => {
146
+ // Regression for Round-4 P0. Seed producer state with a deprecated step name
147
+ // that migrateState would rename (testing-strategy → tdd). If loadStateReadOnly
148
+ // or any downstream code calls saveState, this file's mtime changes.
149
+ const producerStatePath = path.join(projectRoot, '.scaffold', 'services', 'producer', 'state.json');
150
+ writeState(producerStatePath, {
151
+ [producerStep]: { status: 'completed', produces: ['docs/contracts.md'] },
152
+ 'testing-strategy': { status: 'completed', produces: ['docs/tdd.md'] },
153
+ });
154
+ // Backdate so a same-millisecond write would still be detectable
155
+ const backdated = new Date(Date.now() - 2000);
156
+ fs.utimesSync(producerStatePath, backdated, backdated);
157
+ const mtimeBefore = fs.statSync(producerStatePath).mtimeMs;
158
+ const metas = new Map([
159
+ [producerStep, mkMetaFile(producerStep)],
160
+ ]);
161
+ const output = mkOutput();
162
+ resolveTransitiveCrossReads([{ service: 'producer', step: producerStep }], config, projectRoot, metas, output, new Set(), new Map(), new Map());
163
+ const mtimeAfter = fs.statSync(producerStatePath).mtimeMs;
164
+ expect(mtimeAfter).toBe(mtimeBefore); // file NOT written
165
+ });
166
+ it('cross-read succeeds when producer service has an active lock (no deadlock, no write)', () => {
167
+ // Simulate a foreign service lock held by another concurrent run
168
+ const lockDir = path.join(projectRoot, '.scaffold', 'services', 'producer');
169
+ const lockPath = path.join(lockDir, 'lock.json');
170
+ fs.writeFileSync(lockPath, JSON.stringify({
171
+ pid: 999999, step: producerStep, acquired: new Date().toISOString(),
172
+ }));
173
+ const statePath = path.join(lockDir, 'state.json');
174
+ const backdated = new Date(Date.now() - 2000);
175
+ fs.utimesSync(statePath, backdated, backdated);
176
+ const mtimeBefore = fs.statSync(statePath).mtimeMs;
177
+ const metas = new Map([
178
+ [producerStep, mkMetaFile(producerStep)],
179
+ ]);
180
+ const output = mkOutput();
181
+ // Must complete without hanging on the lock — read-only loader acquires no lock.
182
+ const artifacts = resolveTransitiveCrossReads([{ service: 'producer', step: producerStep }], config, projectRoot, metas, output, new Set(), new Map(), new Map());
183
+ expect(artifacts.length).toBeGreaterThan(0);
184
+ // Still no write to foreign state
185
+ expect(fs.statSync(statePath).mtimeMs).toBe(mtimeBefore);
186
+ });
187
+ it('overlay-only crossRead (no frontmatter entry) surfaces through resolveTransitiveCrossReads (Wave 3c+1)', () => {
188
+ // Step B's frontmatter has no crossReads; an overlay adds one pointing at C.
189
+ // Passing the overlay map to the resolver must surface C's artifact.
190
+ fs.mkdirSync(path.join(projectRoot, '.scaffold', 'services', 'consumer2'), { recursive: true });
191
+ fs.writeFileSync(path.join(projectRoot, 'docs', 'extra.md'), 'EXTRA');
192
+ writeState(path.join(projectRoot, '.scaffold', 'services', 'consumer2', 'state.json'), { 'extra-step': { status: 'completed', produces: ['docs/extra.md'] } });
193
+ const configWithExtraExport = {
194
+ version: 2, methodology: 'deep', platforms: ['claude-code'],
195
+ project: {
196
+ services: [
197
+ {
198
+ name: 'producer', projectType: 'library',
199
+ libraryConfig: { visibility: 'internal' },
200
+ exports: [{ step: producerStep }],
201
+ },
202
+ {
203
+ name: 'consumer2', projectType: 'library',
204
+ libraryConfig: { visibility: 'internal' },
205
+ exports: [{ step: 'extra-step' }],
206
+ },
207
+ {
208
+ name: 'consumer', projectType: 'backend',
209
+ backendConfig: { apiStyle: 'rest' },
210
+ },
211
+ ],
212
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
213
+ },
214
+ };
215
+ const metas = new Map([
216
+ [producerStep, mkMetaFile(producerStep)], // no frontmatter crossReads
217
+ ]);
218
+ // Overlay adds a cross-read to producer's step
219
+ const overlayCrossReads = {
220
+ [producerStep]: [{ service: 'consumer2', step: 'extra-step' }],
221
+ };
222
+ const output = mkOutput();
223
+ const artifacts = resolveTransitiveCrossReads([{ service: 'producer', step: producerStep }], configWithExtraExport, projectRoot, metas, output, new Set(), new Map(), new Map(), undefined, // globalSteps
224
+ overlayCrossReads);
225
+ const paths = artifacts.map(a => a.filePath).sort();
226
+ // producer's own docs/contracts.md + consumer2's docs/extra.md (via overlay-added crossRead)
227
+ expect(paths).toEqual(['docs/contracts.md', 'docs/extra.md']);
228
+ });
229
+ });
230
+ //# sourceMappingURL=cross-service-references.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cross-service-references.test.js","sourceRoot":"","sources":["../../src/e2e/cross-service-references.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * E2E tests for multi-service pipeline — exercises resolveOverlayState with
3
+ * a services[] config, verifies cross-service steps are enabled, knowledge
4
+ * is injected, and reads/dependencies are wired correctly.
5
+ *
6
+ * Follows the same pattern as game-pipeline.test.ts: real meta-prompts via
7
+ * vi.importActual, mocked detectProjectMode and discoverMetaPrompts.
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=multi-service-pipeline.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-service-pipeline.test.d.ts","sourceRoot":"","sources":["../../src/e2e/multi-service-pipeline.test.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * E2E tests for multi-service pipeline — exercises resolveOverlayState with
3
+ * a services[] config, verifies cross-service steps are enabled, knowledge
4
+ * is injected, and reads/dependencies are wired correctly.
5
+ *
6
+ * Follows the same pattern as game-pipeline.test.ts: real meta-prompts via
7
+ * vi.importActual, mocked detectProjectMode and discoverMetaPrompts.
8
+ */
9
+ import { describe, it, expect, vi } from 'vitest';
10
+ // ---------------------------------------------------------------------------
11
+ // Hoisted mocks — must appear before real imports
12
+ // ---------------------------------------------------------------------------
13
+ vi.mock('../../src/project/detector.js', () => ({
14
+ detectProjectMode: vi.fn(() => ({
15
+ mode: 'greenfield',
16
+ signals: [],
17
+ methodologySuggestion: 'deep',
18
+ sourceFileCount: 0,
19
+ })),
20
+ }));
21
+ vi.mock('../../src/core/assembly/meta-prompt-loader.js', () => ({
22
+ discoverMetaPrompts: vi.fn(() => new Map()),
23
+ discoverAllMetaPrompts: vi.fn(() => new Map()),
24
+ }));
25
+ // ---------------------------------------------------------------------------
26
+ // Real imports (after mock declarations)
27
+ // ---------------------------------------------------------------------------
28
+ import { loadAllPresets } from '../core/assembly/preset-loader.js';
29
+ import { resolveOverlayState } from '../core/assembly/overlay-state-resolver.js';
30
+ import { getPackagePipelineDir, getPackageMethodologyDir } from '../utils/fs.js';
31
+ // ---------------------------------------------------------------------------
32
+ // Helpers
33
+ // ---------------------------------------------------------------------------
34
+ function createMockOutput() {
35
+ return {
36
+ success: vi.fn(),
37
+ info: vi.fn(),
38
+ warn: vi.fn(),
39
+ error: vi.fn(),
40
+ result: vi.fn(),
41
+ supportsInteractivePrompts: vi.fn().mockReturnValue(false),
42
+ prompt: vi.fn().mockResolvedValue(''),
43
+ confirm: vi.fn().mockResolvedValue(false),
44
+ select: vi.fn().mockResolvedValue(''),
45
+ multiSelect: vi.fn().mockResolvedValue([]),
46
+ multiInput: vi.fn().mockResolvedValue([]),
47
+ startSpinner: vi.fn(),
48
+ stopSpinner: vi.fn(),
49
+ startProgress: vi.fn(),
50
+ updateProgress: vi.fn(),
51
+ stopProgress: vi.fn(),
52
+ };
53
+ }
54
+ /**
55
+ * Discover real meta-prompts from the package pipeline directory
56
+ * and build a Map suitable for resolveOverlayState.
57
+ * Uses vi.importActual to bypass the vi.mock and get the real loader.
58
+ */
59
+ async function discoverRealMetaPrompts() {
60
+ const pipelineDir = getPackagePipelineDir();
61
+ const actual = await vi.importActual('../core/assembly/meta-prompt-loader.js');
62
+ return actual.discoverMetaPrompts(pipelineDir);
63
+ }
64
+ /**
65
+ * Resolve the multi-service overlay with a given methodology against the real pipeline.
66
+ * Config includes a services[] array to activate the structural overlay pass.
67
+ */
68
+ async function resolveMultiServiceOverlay(methodology = 'deep') {
69
+ const methodologyDir = getPackageMethodologyDir();
70
+ const realMetaPrompts = await discoverRealMetaPrompts();
71
+ const knownSteps = [...realMetaPrompts.keys()];
72
+ const presets = loadAllPresets(methodologyDir, knownSteps);
73
+ const output = createMockOutput();
74
+ const preset = methodology === 'mvp' ? presets.mvp : presets.deep;
75
+ const overlayState = resolveOverlayState({
76
+ config: {
77
+ version: 2,
78
+ methodology,
79
+ platforms: ['claude-code'],
80
+ project: {
81
+ services: [
82
+ {
83
+ name: 'api', projectType: 'backend',
84
+ backendConfig: {
85
+ apiStyle: 'rest', dataStore: ['relational'], authMechanism: 'jwt',
86
+ asyncMessaging: 'none', deployTarget: 'container', domain: 'none',
87
+ },
88
+ },
89
+ {
90
+ name: 'web', projectType: 'web-app',
91
+ webAppConfig: {
92
+ deployTarget: 'container', renderingStrategy: 'spa',
93
+ realtime: 'none', authFlow: 'none',
94
+ },
95
+ },
96
+ ],
97
+ },
98
+ },
99
+ methodologyDir,
100
+ metaPrompts: realMetaPrompts,
101
+ presetSteps: preset?.steps ?? {},
102
+ output,
103
+ });
104
+ return { overlayState, realMetaPrompts };
105
+ }
106
+ // ---------------------------------------------------------------------------
107
+ // Tests
108
+ // ---------------------------------------------------------------------------
109
+ describe('multi-service pipeline E2E', () => {
110
+ // Test 1: All 5 cross-service steps enabled when services[] present
111
+ it('enables cross-service steps when services[] present', async () => {
112
+ const { overlayState } = await resolveMultiServiceOverlay();
113
+ const crossServiceSteps = [
114
+ 'service-ownership-map',
115
+ 'inter-service-contracts',
116
+ 'cross-service-auth',
117
+ 'cross-service-observability',
118
+ 'integration-test-plan',
119
+ ];
120
+ for (const step of crossServiceSteps) {
121
+ expect(overlayState.steps[step], `${step} should be defined`).toBeDefined();
122
+ expect(overlayState.steps[step].enabled, `${step} should be enabled`).toBe(true);
123
+ }
124
+ });
125
+ // Test 2: Cross-service steps stay disabled when no services[]
126
+ it('does NOT enable cross-service steps when no services[]', async () => {
127
+ const methodologyDir = getPackageMethodologyDir();
128
+ const realMetaPrompts = await discoverRealMetaPrompts();
129
+ const knownSteps = [...realMetaPrompts.keys()];
130
+ const presets = loadAllPresets(methodologyDir, knownSteps);
131
+ const output = createMockOutput();
132
+ const overlayState = resolveOverlayState({
133
+ config: {
134
+ version: 2,
135
+ methodology: 'deep',
136
+ platforms: ['claude-code'],
137
+ project: {
138
+ projectType: 'backend',
139
+ backendConfig: {
140
+ apiStyle: 'rest', dataStore: ['relational'], authMechanism: 'jwt',
141
+ asyncMessaging: 'none', deployTarget: 'container', domain: 'none',
142
+ },
143
+ },
144
+ },
145
+ methodologyDir,
146
+ metaPrompts: realMetaPrompts,
147
+ presetSteps: presets.deep?.steps ?? {},
148
+ output,
149
+ });
150
+ const crossServiceSteps = [
151
+ 'service-ownership-map',
152
+ 'inter-service-contracts',
153
+ 'cross-service-auth',
154
+ 'cross-service-observability',
155
+ 'integration-test-plan',
156
+ ];
157
+ for (const step of crossServiceSteps) {
158
+ const stepEntry = overlayState.steps[step];
159
+ if (stepEntry !== undefined) {
160
+ expect(stepEntry.enabled, `${step} should not be enabled without services[]`).toBe(false);
161
+ }
162
+ // If not present in steps at all, it defaults to disabled — also acceptable
163
+ }
164
+ });
165
+ // Test 3: Multi-service knowledge injected into existing steps
166
+ it('injects multi-service knowledge into existing steps', async () => {
167
+ const { overlayState } = await resolveMultiServiceOverlay();
168
+ expect(overlayState.knowledge['system-architecture']).toBeDefined();
169
+ expect(overlayState.knowledge['system-architecture']).toContain('multi-service-architecture');
170
+ expect(overlayState.knowledge['system-architecture']).toContain('multi-service-resilience');
171
+ });
172
+ // Test 4: Reads injected into downstream steps
173
+ it('injects reads into downstream steps', async () => {
174
+ const { overlayState } = await resolveMultiServiceOverlay();
175
+ expect(overlayState.reads['implementation-plan']).toBeDefined();
176
+ expect(overlayState.reads['implementation-plan']).toContain('service-ownership-map');
177
+ });
178
+ // Test 5: Dependencies injected into downstream steps
179
+ it('injects dependencies into downstream steps', async () => {
180
+ const { overlayState } = await resolveMultiServiceOverlay();
181
+ expect(overlayState.dependencies['review-security']).toBeDefined();
182
+ expect(overlayState.dependencies['review-security']).toContain('cross-service-auth');
183
+ });
184
+ });
185
+ //# sourceMappingURL=multi-service-pipeline.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-service-pipeline.test.js","sourceRoot":"","sources":["../../src/e2e/multi-service-pipeline.test.ts"],"names":[],"mappings":"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"}
@@ -360,6 +360,74 @@ describe('backend overlay integration', () => {
360
360
  expect(overlayState.knowledge['system-architecture']).toContain('backend-architecture');
361
361
  expect(overlayState.knowledge['tech-stack']).toContain('backend-api-design');
362
362
  });
363
+ // -------------------------------------------------------------------------
364
+ // Sub-overlay: backend-fintech
365
+ // -------------------------------------------------------------------------
366
+ /**
367
+ * Resolve a backend overlay with an explicit domain sub-overlay selection.
368
+ * Mirrors `resolveResearchOverlay` but for the backend project type.
369
+ * A FULL typed BackendConfig literal is required because BackendConfig is
370
+ * inferred from BackendConfigSchema's *output* shape (all defaults resolved).
371
+ */
372
+ async function resolveBackendOverlayWithDomain(domain) {
373
+ const backendConfig = {
374
+ apiStyle: 'rest',
375
+ dataStore: ['relational'],
376
+ authMechanism: 'none',
377
+ asyncMessaging: 'none',
378
+ deployTarget: 'container',
379
+ domain,
380
+ };
381
+ const methodologyDir = getPackageMethodologyDir();
382
+ const realMetaPrompts = await discoverRealMetaPrompts();
383
+ const knownSteps = [...realMetaPrompts.keys()];
384
+ const presets = loadAllPresets(methodologyDir, knownSteps);
385
+ const output = createMockOutput();
386
+ const preset = presets.deep;
387
+ return resolveOverlayState({
388
+ config: {
389
+ version: 2,
390
+ methodology: 'deep',
391
+ platforms: ['claude-code'],
392
+ project: {
393
+ projectType: 'backend',
394
+ backendConfig,
395
+ },
396
+ },
397
+ methodologyDir,
398
+ metaPrompts: realMetaPrompts,
399
+ presetSteps: preset?.steps ?? {},
400
+ output,
401
+ });
402
+ }
403
+ it('fintech domain knowledge appended after core backend knowledge', async () => {
404
+ const state = await resolveBackendOverlayWithDomain('fintech');
405
+ // Core backend overlay entry is present in create-prd
406
+ expect(state.knowledge['create-prd']).toContain('backend-requirements');
407
+ // Fintech sub-overlay entries present on create-prd (per backend-fintech.yml)
408
+ expect(state.knowledge['create-prd']).toContain('backend-fintech-compliance');
409
+ expect(state.knowledge['create-prd']).toContain('backend-fintech-broker-integration');
410
+ // Domain knowledge appears AFTER core knowledge (appended)
411
+ const prdKnowledge = state.knowledge['create-prd'];
412
+ const coreIdx = prdKnowledge.indexOf('backend-requirements');
413
+ const domainIdx = prdKnowledge.indexOf('backend-fintech-compliance');
414
+ expect(domainIdx).toBeGreaterThan(coreIdx);
415
+ // Spot-check another step: system-architecture gets broker-integration + risk-management
416
+ expect(state.knowledge['system-architecture']).toContain('backend-architecture');
417
+ expect(state.knowledge['system-architecture']).toContain('backend-fintech-broker-integration');
418
+ expect(state.knowledge['system-architecture']).toContain('backend-fintech-risk-management');
419
+ });
420
+ it('backend domain=none skips fintech sub-overlay', async () => {
421
+ const state = await resolveBackendOverlayWithDomain('none');
422
+ // Core backend knowledge is present
423
+ expect(state.knowledge['create-prd']).toContain('backend-requirements');
424
+ expect(state.knowledge['system-architecture']).toContain('backend-architecture');
425
+ // Fintech sub-overlay entries are NOT present
426
+ expect(state.knowledge['create-prd']).not.toContain('backend-fintech-compliance');
427
+ expect(state.knowledge['create-prd']).not.toContain('backend-fintech-broker-integration');
428
+ expect(state.knowledge['system-architecture']).not.toContain('backend-fintech-broker-integration');
429
+ expect(state.knowledge['system-architecture']).not.toContain('backend-fintech-risk-management');
430
+ });
363
431
  });
364
432
  // ---------------------------------------------------------------------------
365
433
  // Tests — CLI