stageflow 0.25.0 → 0.30.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 (681) hide show
  1. package/README.md +14 -3
  2. package/builtin-skills/browser/SKILL.md +42 -0
  3. package/dist/a2a/contracts.d.ts +1 -0
  4. package/dist/a2a/contracts.js +1 -0
  5. package/dist/a2a/registry.d.ts +2 -0
  6. package/dist/a2a/registry.js +20 -1
  7. package/dist/a2a/server.d.ts +7 -0
  8. package/dist/a2a/server.js +5 -2
  9. package/dist/a2a/service.d.ts +1 -1
  10. package/dist/a2a/service.js +57 -8
  11. package/dist/a2a/store.d.ts +8 -5
  12. package/dist/a2a/store.js +24 -67
  13. package/dist/agent/activity.d.ts +3 -0
  14. package/dist/agent/bootProviderConfig.d.ts +21 -0
  15. package/dist/agent/bootProviderConfig.js +74 -0
  16. package/dist/agent/claudeAdapter.js +2 -2
  17. package/dist/agent/cursorProvider.d.ts +2 -0
  18. package/dist/agent/cursorProvider.js +30 -5
  19. package/dist/agent/fakeAgent.d.ts +1 -0
  20. package/dist/agent/fakeAgent.js +13 -0
  21. package/dist/agent/piAdapter.d.ts +11 -24
  22. package/dist/agent/piAdapter.js +107 -50
  23. package/dist/agent/piIsolatedMcp.d.ts +2 -0
  24. package/dist/agent/piIsolatedMcp.js +10 -2
  25. package/dist/agent/piSessionFactory.d.ts +38 -0
  26. package/dist/agent/piSessionFactory.js +60 -0
  27. package/dist/agent/port.d.ts +8 -0
  28. package/dist/agent/streamLogRedact.d.ts +7 -1
  29. package/dist/agent/streamLogRedact.js +26 -11
  30. package/dist/browser/anchor.d.ts +27 -0
  31. package/dist/browser/anchor.js +127 -0
  32. package/dist/browser/auditSink.d.ts +38 -0
  33. package/dist/browser/auditSink.js +34 -0
  34. package/dist/browser/browserHost.d.ts +86 -0
  35. package/dist/browser/browserHost.js +7 -0
  36. package/dist/browser/browserSweep.d.ts +14 -0
  37. package/dist/browser/browserSweep.js +54 -0
  38. package/dist/browser/browserTeardown.d.ts +56 -0
  39. package/dist/browser/browserTeardown.js +235 -0
  40. package/dist/browser/fakeRemoteBrowserHost.d.ts +2 -0
  41. package/dist/browser/fakeRemoteBrowserHost.js +34 -0
  42. package/dist/browser/gateHandoff.d.ts +25 -0
  43. package/dist/browser/gateHandoff.js +83 -0
  44. package/dist/browser/humanLogin.d.ts +18 -0
  45. package/dist/browser/humanLogin.js +34 -0
  46. package/dist/browser/keyProvider.d.ts +10 -0
  47. package/dist/browser/keyProvider.js +39 -0
  48. package/dist/browser/localBrowserHost.d.ts +10 -0
  49. package/dist/browser/localBrowserHost.js +152 -0
  50. package/dist/browser/localProfileLock.d.ts +2 -0
  51. package/dist/browser/localProfileLock.js +218 -0
  52. package/dist/browser/localProfileStore.d.ts +5 -0
  53. package/dist/browser/localProfileStore.js +91 -0
  54. package/dist/browser/loginCheck.d.ts +53 -0
  55. package/dist/browser/loginCheck.js +147 -0
  56. package/dist/browser/memoryProfileLock.d.ts +2 -0
  57. package/dist/browser/memoryProfileLock.js +53 -0
  58. package/dist/browser/memoryProfileStore.d.ts +2 -0
  59. package/dist/browser/memoryProfileStore.js +31 -0
  60. package/dist/browser/navigationAudit.d.ts +16 -0
  61. package/dist/browser/navigationAudit.js +53 -0
  62. package/dist/browser/persistedEnv.d.ts +3 -0
  63. package/dist/browser/persistedEnv.js +15 -0
  64. package/dist/browser/profileLock.d.ts +40 -0
  65. package/dist/browser/profileLock.js +10 -0
  66. package/dist/browser/profileStore.d.ts +23 -0
  67. package/dist/browser/profileStore.js +39 -0
  68. package/dist/browser/runLiveness.d.ts +13 -0
  69. package/dist/browser/runLiveness.js +39 -0
  70. package/dist/browser/sitePolicy.d.ts +10 -0
  71. package/dist/browser/sitePolicy.js +61 -0
  72. package/dist/browser/stageBrowserEnv.d.ts +22 -0
  73. package/dist/browser/stageBrowserEnv.js +147 -0
  74. package/dist/browser/stageProfileLock.d.ts +17 -0
  75. package/dist/browser/stageProfileLock.js +39 -0
  76. package/dist/cli/artifactCommand.js +9 -16
  77. package/dist/cli/backupCommand.d.ts +9 -0
  78. package/dist/cli/backupCommand.js +111 -0
  79. package/dist/cli/browserCommand.d.ts +44 -0
  80. package/dist/cli/browserCommand.js +472 -0
  81. package/dist/cli/debugRunCommand.d.ts +10 -0
  82. package/dist/cli/debugRunCommand.js +109 -0
  83. package/dist/cli/doctorCommand.d.ts +32 -0
  84. package/dist/cli/doctorCommand.js +453 -0
  85. package/dist/cli/envelopeCommand.js +9 -2
  86. package/dist/cli/exportAllCommand.d.ts +55 -0
  87. package/dist/cli/exportAllCommand.js +218 -0
  88. package/dist/cli/exportRunCommand.js +23 -21
  89. package/dist/cli/hostClient.d.ts +41 -3
  90. package/dist/cli/hostClient.js +129 -14
  91. package/dist/cli/initCommand.d.ts +1 -0
  92. package/dist/cli/initCommand.js +23 -7
  93. package/dist/cli/initTemplates.d.ts +5 -2
  94. package/dist/cli/initTemplates.js +32 -2
  95. package/dist/cli/resolveSafeOutPath.d.ts +2 -0
  96. package/dist/cli/resolveSafeOutPath.js +40 -0
  97. package/dist/cli/restoreCommand.d.ts +10 -0
  98. package/dist/cli/restoreCommand.js +90 -0
  99. package/dist/cli/runCommand.d.ts +3 -2
  100. package/dist/cli/runCommand.js +93 -11
  101. package/dist/cli/runOutput.d.ts +4 -0
  102. package/dist/cli/runOutput.js +33 -7
  103. package/dist/cli/runStageCommand.d.ts +1 -0
  104. package/dist/cli/runStageCommand.js +44 -25
  105. package/dist/cli/runsCommand.d.ts +1 -1
  106. package/dist/cli/runsCommand.js +168 -10
  107. package/dist/cli/triggerCommand.d.ts +12 -0
  108. package/dist/cli/triggerCommand.js +183 -0
  109. package/dist/cli/validateCommand.d.ts +1 -1
  110. package/dist/cli/validateCommand.js +23 -6
  111. package/dist/cli.js +202 -32
  112. package/dist/config/browseCatalog.d.ts +1 -0
  113. package/dist/config/browseCatalog.js +5 -4
  114. package/dist/config/builtinSkills.d.ts +4 -0
  115. package/dist/config/builtinSkills.js +23 -0
  116. package/dist/config/catalogRelativePath.d.ts +63 -0
  117. package/dist/config/catalogRelativePath.js +126 -0
  118. package/dist/config/configOrigin.d.ts +27 -0
  119. package/dist/config/configOrigin.js +59 -0
  120. package/dist/config/createTrigger.d.ts +27 -0
  121. package/dist/config/createTrigger.js +232 -0
  122. package/dist/config/draftPackage.d.ts +117 -0
  123. package/dist/config/draftPackage.js +550 -0
  124. package/dist/config/ensureCatalogScanRoot.d.ts +16 -0
  125. package/dist/config/ensureCatalogScanRoot.js +73 -0
  126. package/dist/config/hostConfig.d.ts +57 -0
  127. package/dist/config/hostConfig.js +360 -0
  128. package/dist/config/listSkills.d.ts +26 -0
  129. package/dist/config/listSkills.js +206 -5
  130. package/dist/config/loadOutcome.d.ts +7 -1
  131. package/dist/config/loadPipeline.js +39 -2
  132. package/dist/config/loadStage.js +25 -0
  133. package/dist/config/loadStageflowManifest.js +25 -0
  134. package/dist/config/loadTask.d.ts +2 -0
  135. package/dist/config/loadTask.js +57 -18
  136. package/dist/config/loadTrigger.d.ts +9 -0
  137. package/dist/config/loadTrigger.js +120 -0
  138. package/dist/config/materializeStageModels.js +5 -1
  139. package/dist/config/mergePipelineIncludes.d.ts +3 -0
  140. package/dist/config/mergePipelineIncludes.js +19 -0
  141. package/dist/config/migrateYaml.js +6 -11
  142. package/dist/config/multiProjectCatalog.d.ts +32 -0
  143. package/dist/config/multiProjectCatalog.js +150 -0
  144. package/dist/config/normalizePipelineStageEntry.js +27 -1
  145. package/dist/config/parseCompletionContract.js +6 -0
  146. package/dist/config/pipelineStageKeys.js +3 -0
  147. package/dist/config/publishDraftPackage.d.ts +7 -0
  148. package/dist/config/publishDraftPackage.js +25 -0
  149. package/dist/config/resolveCatalogContext.js +1 -1
  150. package/dist/config/resolveCatalogRoots.d.ts +27 -0
  151. package/dist/config/resolveCatalogRoots.js +76 -0
  152. package/dist/config/resolveModel.d.ts +7 -1
  153. package/dist/config/resolveModel.js +11 -1
  154. package/dist/config/resolvePipelineDag.js +1 -1
  155. package/dist/config/resolveStageMcpServers.d.ts +9 -1
  156. package/dist/config/resolveStageMcpServers.js +36 -9
  157. package/dist/config/scanCatalogPaths.d.ts +1 -1
  158. package/dist/config/scanCatalogPaths.js +6 -2
  159. package/dist/config/secretFromEnvOrFile.d.ts +9 -0
  160. package/dist/config/secretFromEnvOrFile.js +34 -0
  161. package/dist/config/seededCatalog.d.ts +11 -0
  162. package/dist/config/seededCatalog.js +29 -0
  163. package/dist/config/stageBrowser.d.ts +12 -0
  164. package/dist/config/stageBrowser.js +118 -0
  165. package/dist/config/toolRequires.d.ts +24 -0
  166. package/dist/config/toolRequires.js +115 -0
  167. package/dist/config/triggerCatalog.d.ts +10 -0
  168. package/dist/config/triggerCatalog.js +37 -0
  169. package/dist/config/validateCatalog.d.ts +17 -3
  170. package/dist/config/validateCatalog.js +223 -3
  171. package/dist/config/validateCompletionContract.js +8 -0
  172. package/dist/diagnostics/checks.d.ts +39 -0
  173. package/dist/diagnostics/checks.js +135 -0
  174. package/dist/envelope/preEmitChecks.d.ts +1 -1
  175. package/dist/envelope/preEmitChecks.js +8 -0
  176. package/dist/errors/codes.d.ts +14 -0
  177. package/dist/errors/codes.js +59 -0
  178. package/dist/git/cache.d.ts +14 -0
  179. package/dist/git/cache.js +150 -0
  180. package/dist/git/credentials.d.ts +9 -0
  181. package/dist/git/credentials.js +88 -0
  182. package/dist/git/errors.d.ts +20 -0
  183. package/dist/git/errors.js +94 -0
  184. package/dist/git/exec.d.ts +16 -0
  185. package/dist/git/exec.js +135 -0
  186. package/dist/git/operations.d.ts +29 -0
  187. package/dist/git/operations.js +153 -0
  188. package/dist/git/version.d.ts +1 -0
  189. package/dist/git/version.js +10 -0
  190. package/dist/logging/audit.d.ts +16 -0
  191. package/dist/logging/audit.js +19 -0
  192. package/dist/logging/commonWords.d.ts +2 -0
  193. package/dist/logging/commonWords.js +13 -0
  194. package/dist/logging/logger.d.ts +49 -0
  195. package/dist/logging/logger.js +193 -0
  196. package/dist/logging/namedSecrets.d.ts +6 -0
  197. package/dist/logging/namedSecrets.js +58 -0
  198. package/dist/logging/redact.d.ts +17 -0
  199. package/dist/logging/redact.js +105 -0
  200. package/dist/mcp/catalogTools.js +492 -81
  201. package/dist/mcp/checkoutTools.d.ts +52 -0
  202. package/dist/mcp/checkoutTools.js +332 -0
  203. package/dist/mcp/controlTools.js +182 -6
  204. package/dist/mcp/deps.d.ts +3 -0
  205. package/dist/mcp/getStartedTool.d.ts +3 -0
  206. package/dist/mcp/getStartedTool.js +62 -0
  207. package/dist/mcp/readArtifact.d.ts +11 -0
  208. package/dist/mcp/readArtifact.js +46 -30
  209. package/dist/mcp/server.js +2 -0
  210. package/dist/mcp/tools.js +6 -0
  211. package/dist/mcp/triggerTools.d.ts +3 -0
  212. package/dist/mcp/triggerTools.js +176 -0
  213. package/dist/net/proxy.d.ts +14 -0
  214. package/dist/net/proxy.js +78 -0
  215. package/dist/operatorAgent/docsRetrieval.d.ts +40 -0
  216. package/dist/operatorAgent/docsRetrieval.js +269 -0
  217. package/dist/operatorAgent/draftContext.d.ts +16 -0
  218. package/dist/operatorAgent/draftContext.js +68 -0
  219. package/dist/operatorAgent/fakeHost.d.ts +39 -0
  220. package/dist/operatorAgent/fakeHost.js +92 -0
  221. package/dist/operatorAgent/host.d.ts +40 -0
  222. package/dist/operatorAgent/host.js +179 -0
  223. package/dist/operatorAgent/index.d.ts +9 -0
  224. package/dist/operatorAgent/index.js +8 -0
  225. package/dist/operatorAgent/piModel.d.ts +80 -0
  226. package/dist/operatorAgent/piModel.js +528 -0
  227. package/dist/operatorAgent/profiles/workshopAuthor.d.ts +23 -0
  228. package/dist/operatorAgent/profiles/workshopAuthor.js +338 -0
  229. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +6 -0
  230. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +103 -0
  231. package/dist/operatorAgent/profiles/workshopAuthorTools.d.ts +57 -0
  232. package/dist/operatorAgent/profiles/workshopAuthorTools.js +623 -0
  233. package/dist/operatorAgent/proposals.d.ts +32 -0
  234. package/dist/operatorAgent/proposals.js +144 -0
  235. package/dist/operatorAgent/types.d.ts +128 -0
  236. package/dist/operatorAgent/types.js +1 -0
  237. package/dist/package-meta.d.ts +2 -1
  238. package/dist/package-meta.js +2 -1
  239. package/dist/preflight/bash.d.ts +8 -0
  240. package/dist/preflight/bash.js +34 -0
  241. package/dist/preflight/claudeRoot.d.ts +11 -0
  242. package/dist/preflight/claudeRoot.js +23 -0
  243. package/dist/preflight/mcpCommands.d.ts +8 -0
  244. package/dist/preflight/mcpCommands.js +36 -0
  245. package/dist/preflight/pipelinePreflight.d.ts +40 -0
  246. package/dist/preflight/pipelinePreflight.js +192 -0
  247. package/dist/preflight/tls.d.ts +6 -0
  248. package/dist/preflight/tls.js +18 -0
  249. package/dist/preflight/toolchain.d.ts +45 -0
  250. package/dist/preflight/toolchain.js +219 -0
  251. package/dist/project/findManifestRoot.d.ts +3 -0
  252. package/dist/project/findManifestRoot.js +35 -0
  253. package/dist/project/findProjectRoot.js +3 -4
  254. package/dist/project/globalHome.d.ts +7 -0
  255. package/dist/project/globalHome.js +63 -2
  256. package/dist/project/resolveProjectContext.js +2 -2
  257. package/dist/project/resolveStageflowContext.d.ts +7 -0
  258. package/dist/project/resolveStageflowContext.js +46 -30
  259. package/dist/projection/projectRun.d.ts +2 -1
  260. package/dist/projection/projectRun.js +1 -0
  261. package/dist/runstore/assertTmpdir.d.ts +1 -0
  262. package/dist/runstore/assertTmpdir.js +25 -0
  263. package/dist/runstore/backup.d.ts +52 -0
  264. package/dist/runstore/backup.js +292 -0
  265. package/dist/runstore/createStore.d.ts +18 -1
  266. package/dist/runstore/createStore.js +64 -5
  267. package/dist/runstore/debugBundle.d.ts +60 -0
  268. package/dist/runstore/debugBundle.js +143 -0
  269. package/dist/runstore/diskUsage.d.ts +50 -0
  270. package/dist/runstore/diskUsage.js +214 -0
  271. package/dist/runstore/exportRunPayload.d.ts +8 -0
  272. package/dist/runstore/exportRunPayload.js +23 -0
  273. package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
  274. package/dist/runstore/normalizeCatalogPath.js +10 -0
  275. package/dist/runstore/paths.d.ts +5 -0
  276. package/dist/runstore/paths.js +145 -1
  277. package/dist/runstore/port.d.ts +139 -13
  278. package/dist/runstore/port.js +8 -1
  279. package/dist/runstore/restore.d.ts +81 -0
  280. package/dist/runstore/restore.js +355 -0
  281. package/dist/runstore/retention.d.ts +27 -0
  282. package/dist/runstore/retention.js +74 -0
  283. package/dist/runstore/runManifest.d.ts +146 -0
  284. package/dist/runstore/runManifest.js +288 -0
  285. package/dist/runstore/runProjection.d.ts +3 -1
  286. package/dist/runstore/runProjection.js +63 -1
  287. package/dist/runstore/sqlite/SqliteRunStore.d.ts +35 -3
  288. package/dist/runstore/sqlite/SqliteRunStore.js +442 -219
  289. package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
  290. package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
  291. package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
  292. package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
  293. package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
  294. package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
  295. package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
  296. package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
  297. package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
  298. package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
  299. package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
  300. package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
  301. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
  302. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
  303. package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
  304. package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
  305. package/dist/runstore/sqlite/migrations/008-triggers-table.d.ts +7 -0
  306. package/dist/runstore/sqlite/migrations/008-triggers-table.js +19 -0
  307. package/dist/runstore/sqlite/migrations/009-trigger-next-run.d.ts +7 -0
  308. package/dist/runstore/sqlite/migrations/009-trigger-next-run.js +19 -0
  309. package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.d.ts +7 -0
  310. package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.js +17 -0
  311. package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
  312. package/dist/runstore/sqlite/migrations/index.js +78 -0
  313. package/dist/runstore/sqlite/schema.d.ts +20 -1
  314. package/dist/runstore/sqlite/schema.js +277 -1
  315. package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
  316. package/dist/runstore/sqlite/storeOpenError.js +11 -0
  317. package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
  318. package/dist/runstore/sqlite/storeSchemaError.js +8 -0
  319. package/dist/runstore/stageExecution.js +3 -0
  320. package/dist/runstore/storeFilesystem.d.ts +32 -0
  321. package/dist/runstore/storeFilesystem.js +148 -0
  322. package/dist/runstore/trackProjection.js +2 -0
  323. package/dist/runstore/workspaceLayout.d.ts +13 -0
  324. package/dist/runstore/workspaceLayout.js +76 -0
  325. package/dist/runtime/answerResume.d.ts +1 -0
  326. package/dist/runtime/answerResume.js +3 -1
  327. package/dist/runtime/completionCheckRunner.d.ts +15 -1
  328. package/dist/runtime/completionCheckRunner.js +67 -7
  329. package/dist/runtime/containerLimits.d.ts +16 -0
  330. package/dist/runtime/containerLimits.js +84 -0
  331. package/dist/runtime/credentialBinding.d.ts +2 -0
  332. package/dist/runtime/credentialBinding.js +3 -0
  333. package/dist/runtime/credentialMaterialisation.d.ts +28 -0
  334. package/dist/runtime/credentialMaterialisation.js +128 -0
  335. package/dist/runtime/emailSource.d.ts +72 -0
  336. package/dist/runtime/emailSource.js +304 -0
  337. package/dist/runtime/gitCheckoutCapability.js +7 -13
  338. package/dist/runtime/githubPollSource.d.ts +86 -0
  339. package/dist/runtime/githubPollSource.js +284 -0
  340. package/dist/runtime/pipelineRunner.d.ts +40 -1
  341. package/dist/runtime/pipelineRunner.js +181 -17
  342. package/dist/runtime/pipelineScheduler.d.ts +17 -0
  343. package/dist/runtime/pipelineScheduler.js +220 -28
  344. package/dist/runtime/reloadRunCatalog.js +6 -1
  345. package/dist/runtime/repositoryMaterialize.d.ts +47 -0
  346. package/dist/runtime/repositoryMaterialize.js +235 -0
  347. package/dist/runtime/resumeTimedOut.d.ts +1 -1
  348. package/dist/runtime/resumeTimedOut.js +5 -2
  349. package/dist/runtime/runChangeBus.js +9 -0
  350. package/dist/runtime/runDeletion.d.ts +7 -0
  351. package/dist/runtime/runDeletion.js +37 -0
  352. package/dist/runtime/runManager.d.ts +169 -4
  353. package/dist/runtime/runManager.js +1748 -83
  354. package/dist/runtime/runRetentionSweep.d.ts +31 -0
  355. package/dist/runtime/runRetentionSweep.js +328 -0
  356. package/dist/runtime/runRetryCoordinator.d.ts +4 -0
  357. package/dist/runtime/runRetryCoordinator.js +20 -2
  358. package/dist/runtime/runSkills.d.ts +40 -0
  359. package/dist/runtime/runSkills.js +173 -0
  360. package/dist/runtime/scheduleSource.d.ts +38 -0
  361. package/dist/runtime/scheduleSource.js +119 -0
  362. package/dist/runtime/settingsFile.d.ts +5 -0
  363. package/dist/runtime/settingsFile.js +61 -54
  364. package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
  365. package/dist/runtime/stageAttemptBootstrap.js +250 -27
  366. package/dist/runtime/stageCacheEnv.d.ts +6 -0
  367. package/dist/runtime/stageCacheEnv.js +34 -0
  368. package/dist/runtime/stageConcurrency.d.ts +2 -1
  369. package/dist/runtime/stageConcurrency.js +4 -2
  370. package/dist/runtime/stageEnvironment.d.ts +38 -0
  371. package/dist/runtime/stageEnvironment.js +194 -0
  372. package/dist/runtime/stageHitl.d.ts +1 -0
  373. package/dist/runtime/stageHitl.js +5 -1
  374. package/dist/runtime/stageProcessLauncher.d.ts +20 -0
  375. package/dist/runtime/stageProcessLauncher.js +236 -41
  376. package/dist/runtime/stageRecovery.d.ts +3 -1
  377. package/dist/runtime/stageRecovery.js +19 -4
  378. package/dist/runtime/stageRoots.d.ts +38 -1
  379. package/dist/runtime/stageRoots.js +118 -0
  380. package/dist/runtime/stageRunner.d.ts +6 -0
  381. package/dist/runtime/stageRunner.js +32 -6
  382. package/dist/runtime/stageSecretDecl.d.ts +9 -0
  383. package/dist/runtime/stageSecretDecl.js +102 -0
  384. package/dist/runtime/stageSecrets.d.ts +40 -0
  385. package/dist/runtime/stageSecrets.js +181 -0
  386. package/dist/runtime/stageStreamLog.d.ts +1 -0
  387. package/dist/runtime/stageStreamLog.js +2 -1
  388. package/dist/runtime/stageWorker.d.ts +3 -2
  389. package/dist/runtime/stageWorker.js +58 -10
  390. package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
  391. package/dist/runtime/stageWorkerProtocol.js +8 -0
  392. package/dist/runtime/startPayload.d.ts +32 -0
  393. package/dist/runtime/startPayload.js +59 -0
  394. package/dist/runtime/taskInput.js +14 -5
  395. package/dist/runtime/triggerCatalog.d.ts +6 -0
  396. package/dist/runtime/triggerCatalog.js +24 -0
  397. package/dist/runtime/triggerEventMatch.d.ts +2 -0
  398. package/dist/runtime/triggerEventMatch.js +6 -0
  399. package/dist/runtime/triggerPort.d.ts +14 -0
  400. package/dist/runtime/triggerPort.js +1 -0
  401. package/dist/runtime/triggerRunner.d.ts +17 -0
  402. package/dist/runtime/triggerRunner.js +89 -0
  403. package/dist/runtime/verifiedStageExecution.d.ts +8 -0
  404. package/dist/runtime/verifiedStageExecution.js +16 -1
  405. package/dist/runtime/webhookSignature.d.ts +1 -0
  406. package/dist/runtime/webhookSignature.js +12 -0
  407. package/dist/runtime/workspaceBinding.d.ts +20 -0
  408. package/dist/runtime/workspaceBinding.js +60 -0
  409. package/dist/server/allowedHosts.d.ts +19 -0
  410. package/dist/server/allowedHosts.js +179 -0
  411. package/dist/server/bootstrap.d.ts +42 -2
  412. package/dist/server/bootstrap.js +273 -5
  413. package/dist/server/controlToken.d.ts +47 -0
  414. package/dist/server/controlToken.js +254 -0
  415. package/dist/server/createHttpHost.d.ts +11 -2
  416. package/dist/server/createHttpHost.js +106 -10
  417. package/dist/server/ensureGlobalService.d.ts +5 -1
  418. package/dist/server/ensureGlobalService.js +35 -1
  419. package/dist/server/healthSurfaces.d.ts +6 -0
  420. package/dist/server/healthSurfaces.js +123 -0
  421. package/dist/server/http.d.ts +27 -1
  422. package/dist/server/http.js +2254 -477
  423. package/dist/server/listenHost.d.ts +5 -0
  424. package/dist/server/listenHost.js +56 -0
  425. package/dist/server/mcpHost.d.ts +10 -1
  426. package/dist/server/mcpHost.js +36 -6
  427. package/dist/server/operatorResults.d.ts +2 -2
  428. package/dist/server/operatorResults.js +40 -29
  429. package/dist/server/requestAuthContext.d.ts +12 -0
  430. package/dist/server/requestAuthContext.js +21 -0
  431. package/dist/server/shutdown.d.ts +69 -0
  432. package/dist/server/shutdown.js +219 -0
  433. package/dist/server/triggerRoutes.d.ts +15 -0
  434. package/dist/server/triggerRoutes.js +268 -0
  435. package/dist/tools/askOperator.d.ts +3 -2
  436. package/dist/types/completion.d.ts +3 -0
  437. package/dist/types/pipeline.d.ts +10 -1
  438. package/dist/types/preEmitCheck.d.ts +7 -0
  439. package/dist/types/stage.d.ts +22 -0
  440. package/dist/types/stageflowManifest.d.ts +3 -0
  441. package/dist/types/task.d.ts +8 -0
  442. package/dist/types/trigger.d.ts +18 -0
  443. package/dist/types/trigger.js +1 -0
  444. package/dist/ui/assets/{index-CSsDued1.css → index-Bv4p1aPK.css} +1 -1
  445. package/dist/ui/assets/index-CntB4bZR.js +133 -0
  446. package/dist/ui/index.html +2 -2
  447. package/dist/workshop/autosave.d.ts +58 -0
  448. package/dist/workshop/autosave.js +222 -0
  449. package/dist/workshop/buildStore.d.ts +79 -0
  450. package/dist/workshop/buildStore.js +326 -0
  451. package/dist/workshop/chatTurn.d.ts +232 -0
  452. package/dist/workshop/chatTurn.js +475 -0
  453. package/dist/workshop/modelSettings.d.ts +18 -0
  454. package/dist/workshop/modelSettings.js +44 -0
  455. package/dist/workshop/sessionStore.d.ts +61 -0
  456. package/dist/workshop/sessionStore.js +254 -0
  457. package/dist/workshop/workshopPin.d.ts +72 -0
  458. package/dist/workshop/workshopPin.js +193 -0
  459. package/examples/README.md +99 -0
  460. package/examples/archify-on-pr/README.md +213 -0
  461. package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
  462. package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
  463. package/examples/archify-on-pr/author-diagrams.yaml +106 -0
  464. package/examples/archify-on-pr/detect-changes.yaml +89 -0
  465. package/examples/browser-session/README.md +77 -0
  466. package/examples/browser-session/browser-session.pipeline.yaml +50 -0
  467. package/examples/browser-session/browser-session.task.yaml +6 -0
  468. package/examples/browser-session/check-login.yaml +22 -0
  469. package/examples/browser-session/fixture-server.mjs +64 -0
  470. package/examples/browser-session/human-login.yaml +31 -0
  471. package/examples/browser-session/merge.yaml +36 -0
  472. package/examples/browser-session/work-a.yaml +41 -0
  473. package/examples/browser-session/work-b.yaml +41 -0
  474. package/examples/ci-validate/README.md +35 -0
  475. package/examples/ci-validate/check.yaml +13 -0
  476. package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
  477. package/examples/ci-validate/validate.sh +5 -0
  478. package/examples/compliance-review-demo/README.md +125 -0
  479. package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
  480. package/examples/compliance-review-demo/connect-account.yaml +47 -0
  481. package/examples/compliance-review-demo/map-to-control.yaml +123 -0
  482. package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
  483. package/examples/compliance-review-demo/publish-report.yaml +79 -0
  484. package/examples/compliance-review-demo/review-verdict.yaml +122 -0
  485. package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
  486. package/examples/compliance-review-demo/store-evidence.yaml +143 -0
  487. package/examples/conditional-fork/README.md +89 -0
  488. package/examples/conditional-fork/branch-a.yaml +13 -0
  489. package/examples/conditional-fork/branch-b.yaml +13 -0
  490. package/examples/conditional-fork/decide.yaml +35 -0
  491. package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
  492. package/examples/conditional-fork/fork-demo.task.yaml +8 -0
  493. package/examples/context7-mcp/README.md +42 -0
  494. package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
  495. package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
  496. package/examples/context7-mcp/fetch-docs.yaml +52 -0
  497. package/examples/context7-mcp/resolve-library.yaml +31 -0
  498. package/examples/context7-mcp/write-brief.yaml +52 -0
  499. package/examples/feature-loop/README.md +104 -0
  500. package/examples/feature-loop/address-feedback.yaml +148 -0
  501. package/examples/feature-loop/align.yaml +116 -0
  502. package/examples/feature-loop/decompose.yaml +86 -0
  503. package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
  504. package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
  505. package/examples/feature-loop/feature-loop.task.yaml +25 -0
  506. package/examples/feature-loop/implement.yaml +128 -0
  507. package/examples/feature-loop/plan.yaml +111 -0
  508. package/examples/feature-loop/publish.yaml +167 -0
  509. package/examples/feature-loop/review.yaml +146 -0
  510. package/examples/feature-loop/verify.yaml +106 -0
  511. package/examples/feedback-loop/README.md +72 -0
  512. package/examples/feedback-loop/VERIFY.md +208 -0
  513. package/examples/feedback-loop/continue-only.task.yaml +4 -0
  514. package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
  515. package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
  516. package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
  517. package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
  518. package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
  519. package/examples/feedback-loop/implement.yaml +14 -0
  520. package/examples/feedback-loop/plan.yaml +14 -0
  521. package/examples/feedback-loop/review.yaml +15 -0
  522. package/examples/feedback-loop/send-back-once.task.yaml +6 -0
  523. package/examples/feedback-loop/submit.yaml +12 -0
  524. package/examples/generic-fan-in/README.md +151 -0
  525. package/examples/generic-fan-in/clarify.yaml +18 -0
  526. package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
  527. package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
  528. package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
  529. package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
  530. package/examples/generic-fan-in/research.yaml +45 -0
  531. package/examples/generic-fan-in/synthesize.yaml +66 -0
  532. package/examples/generic-fan-in/validation.yaml +45 -0
  533. package/examples/github-release/README.md +78 -0
  534. package/examples/github-release/draft-release-notes.yaml +64 -0
  535. package/examples/github-release/github-release.pipeline.yaml +11 -0
  536. package/examples/github-release/github-release.task.yaml +13 -0
  537. package/examples/github-release/publish-github-release.yaml +64 -0
  538. package/examples/hello-world/README.md +28 -0
  539. package/examples/hello-world/hello.pipeline.yaml +4 -0
  540. package/examples/hello-world/my-task.task.yaml +6 -0
  541. package/examples/hello-world/research.yaml +18 -0
  542. package/examples/mcp-hitl-tour/README.md +113 -0
  543. package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
  544. package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
  545. package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
  546. package/examples/mcp-hitl-tour/gather.yaml +31 -0
  547. package/examples/mcp-hitl-tour/intake.yaml +62 -0
  548. package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
  549. package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
  550. package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
  551. package/examples/mcp-hitl-tour/polish.yaml +33 -0
  552. package/examples/mcp-hitl-tour/review.yaml +17 -0
  553. package/examples/mcp-hitl-tour/ship.yaml +25 -0
  554. package/examples/oss-issue-contribution/README.md +218 -0
  555. package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
  556. package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
  557. package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
  558. package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
  559. package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
  560. package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
  561. package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
  562. package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
  563. package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
  564. package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
  565. package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
  566. package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
  567. package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
  568. package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
  569. package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
  570. package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
  571. package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
  572. package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
  573. package/examples/oss-quick-fix/README.md +65 -0
  574. package/examples/oss-quick-fix/implement-fix.yaml +84 -0
  575. package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
  576. package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
  577. package/examples/oss-quick-fix/ship-fix.yaml +81 -0
  578. package/examples/oss-quick-fix/understand-issue.yaml +67 -0
  579. package/examples/oss-quick-fix/verify-fix.yaml +73 -0
  580. package/examples/plan-review/README.md +37 -0
  581. package/examples/plan-review/plan-review-followup.yaml +13 -0
  582. package/examples/plan-review/plan-review.pipeline.yaml +9 -0
  583. package/examples/plan-review/plan-review.task.yaml +9 -0
  584. package/examples/plan-review/plan-review.yaml +25 -0
  585. package/examples/playwright-mcp/README.md +39 -0
  586. package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
  587. package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
  588. package/examples/playwright-mcp/screenshot.yaml +40 -0
  589. package/examples/retry-tour/README.md +75 -0
  590. package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
  591. package/examples/retry-tour/retry-tour.task.yaml +9 -0
  592. package/examples/route-if-tour/README.md +202 -0
  593. package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
  594. package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
  595. package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
  596. package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
  597. package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
  598. package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
  599. package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
  600. package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
  601. package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
  602. package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
  603. package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
  604. package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
  605. package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
  606. package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
  607. package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
  608. package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
  609. package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
  610. package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
  611. package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
  612. package/examples/route-wiring-smoke-test/README.md +377 -0
  613. package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
  614. package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
  615. package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
  616. package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
  617. package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
  618. package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
  619. package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
  620. package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
  621. package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
  622. package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
  623. package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
  624. package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
  625. package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
  626. package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
  627. package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
  628. package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
  629. package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
  630. package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
  631. package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
  632. package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
  633. package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
  634. package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
  635. package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
  636. package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
  637. package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
  638. package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
  639. package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
  640. package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
  641. package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
  642. package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
  643. package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
  644. package/examples/ship-feature/README.md +190 -0
  645. package/examples/ship-feature/feat-address-feedback.yaml +119 -0
  646. package/examples/ship-feature/feat-implement.yaml +180 -0
  647. package/examples/ship-feature/feat-plan.yaml +120 -0
  648. package/examples/ship-feature/feat-review.yaml +109 -0
  649. package/examples/ship-feature/feat-ship.yaml +203 -0
  650. package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
  651. package/examples/ship-feature/ship-feature.task.yaml +78 -0
  652. package/examples/stage-mcp/README.md +145 -0
  653. package/examples/stage-mcp/echo-mcp.mjs +20 -0
  654. package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
  655. package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
  656. package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
  657. package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
  658. package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
  659. package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
  660. package/examples/stage-mcp/use-echo.yaml +20 -0
  661. package/examples/stageflow.yaml +51 -0
  662. package/examples/verify-tour/README.md +80 -0
  663. package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
  664. package/examples/verify-tour/verify-tour.task.yaml +11 -0
  665. package/package.json +9 -1
  666. package/skills/stageflow/SKILL.md +6 -6
  667. package/skills/stageflow/references/control-surface.md +13 -5
  668. package/skills/stageflow/scripts/detect-host.mjs +14 -1
  669. package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
  670. package/skills/stageflow-author/SKILL.md +4 -3
  671. package/skills/stageflow-author/references/catalog-mapping.md +16 -0
  672. package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
  673. package/skills/stageflow-author/references/stage-prompt-template.md +4 -4
  674. package/skills/stageflow-run/SKILL.md +22 -12
  675. package/skills/stageflow-run/references/mcp-call.md +9 -1
  676. package/skills/stageflow-run/references/task-and-pipeline-selection.md +19 -6
  677. package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
  678. package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
  679. package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
  680. package/skills/stageflow-setup/SKILL.md +51 -8
  681. package/dist/ui/assets/index-Da5EHU6M.js +0 -119
@@ -0,0 +1,20 @@
1
+ id: fork-demo
2
+ stages:
3
+ - id: decide
4
+ uses: ./decide.yaml
5
+ entry: true
6
+ route:
7
+ - to: branch-a
8
+ if:
9
+ field: branch
10
+ op: eq
11
+ value: branch-a
12
+ - to: branch-b
13
+ if:
14
+ field: branch
15
+ op: eq
16
+ value: branch-b
17
+ - id: branch-a
18
+ uses: ./branch-a.yaml
19
+ - id: branch-b
20
+ uses: ./branch-b.yaml
@@ -0,0 +1,8 @@
1
+ id: fork-demo
2
+ goal: |
3
+ Operator chooses branch-a or branch-b at the decide gate; the pipeline routes
4
+ to that branch and skips the other.
5
+ context: |
6
+ Manual HITL then Route if walkthrough. At decide, answer the free_text gate
7
+ with exactly branch-a or branch-b. The chosen branch should succeed; the other
8
+ should be skipped.
@@ -0,0 +1,42 @@
1
+ # context7-mcp
2
+
3
+ Three-stage walkthrough: **resolve a library**, **fetch docs**, then **write a brief**, using Context7 MCP (`https://mcp.context7.com/mcp`) from git-root `.mcp.json`.
4
+
5
+ Each MCP stage is a **fresh Pi session**. Stage 1 cannot leave a live Context7 connection for stage 2. The `library_id` travels in the envelope; stage 2 calls `query-docs`. Stage 3 has **no** `mcp:` list — it only turns the excerpt into an artifact.
6
+
7
+ | Stage | MCP | What it does |
8
+ |-------|-----|----------------|
9
+ | `resolve-library` | `context7` | `resolve-library-id` → emit `library_id` |
10
+ | `fetch-docs` | `context7` | `query-docs` → `docs.md` + `excerpt` |
11
+ | `write-brief` | — | `brief.md` from the excerpt (no MCP) |
12
+
13
+ ## Prerequisites
14
+
15
+ - Node.js ≥ 20 and this repo's CLI (`npm run build`), not an older global `sf`
16
+ - Provider auth (`sf ui` → Settings → Providers)
17
+ - `CONTEXT7_API_KEY` in the environment of the `sf run` / `sf ui` process (free key at [context7.com/dashboard](https://context7.com/dashboard)). The catalog interpolates `Authorization: Bearer ${CONTEXT7_API_KEY}`. `sf validate` does not require the var; the run does.
18
+
19
+ Git-root `.mcp.json` already names `context7`. Stages still pass `mcp: [context7]` — listing it in the catalog is not attach.
20
+
21
+ Optional: Settings → **Project MCP servers** → Check `context7` before the run.
22
+
23
+ ## Run (repo root)
24
+
25
+ ```bash
26
+ export CONTEXT7_API_KEY=... # from context7.com/dashboard
27
+ npm run build
28
+ node dist/cli.js validate --pipeline examples/context7-mcp/context7-mcp.pipeline.yaml --strict
29
+ node dist/cli.js run \
30
+ --pipeline examples/context7-mcp/context7-mcp.pipeline.yaml \
31
+ --task examples/context7-mcp/context7-mcp.task.yaml
32
+ ```
33
+
34
+ Inspect:
35
+
36
+ ```bash
37
+ node dist/cli.js envelope get --run <runId> --stage resolve-library --json
38
+ node dist/cli.js envelope get --run <runId> --stage fetch-docs --json
39
+ node dist/cli.js envelope get --run <runId> --stage write-brief --json
40
+ ```
41
+
42
+ The operator-facing write-up is the `write-brief` Files row `brief.md`.
@@ -0,0 +1,15 @@
1
+ id: context7-mcp
2
+ stages:
3
+ - id: resolve-library
4
+ entry: true
5
+ route:
6
+ - to: fetch-docs
7
+ uses: ./resolve-library.yaml
8
+ mcp: [context7]
9
+ - id: fetch-docs
10
+ route:
11
+ - to: write-brief
12
+ uses: ./fetch-docs.yaml
13
+ mcp: [context7]
14
+ - id: write-brief
15
+ uses: ./write-brief.yaml
@@ -0,0 +1,4 @@
1
+ id: context7-mcp
2
+ goal: Look up how to register a GET route in Express, using current Context7 docs, then write a one-page brief.
3
+ context: Three-stage Context7 MCP walkthrough. Resolve a library id, fetch docs, then write a brief without MCP. Each MCP stage is a fresh session.
4
+ constraints: Use only the context7 server named on the stage. Do not call ask_operator. Do not invent APIs missing from the fetched docs.
@@ -0,0 +1,52 @@
1
+ id: fetch-docs
2
+ system_prompt: |
3
+ Fetch current docs for the library_id from the prior resolve-library
4
+ envelope. This stage has a new Context7 MCP session. Call query-docs
5
+ with that libraryId and the task question. Do not call
6
+ resolve-library-id unless the id is unusable. Do not call ask_operator.
7
+
8
+ Write docs.md via write_stage_artifact with the retrieved snippets
9
+ (trimmed to what answers the question). Checkout write/edit does not
10
+ satisfy the artifact.
11
+
12
+ When finished, call emit_stage_envelope exactly once with status success,
13
+ artifacts ["docs.md"], a short summary, and payload
14
+ { "library_id": "<id>", "query": "<question>", "excerpt": "<short answer
15
+ plus one code sample from the docs>" }. summary and payload are handed
16
+ downstream verbatim. State outcomes and artifact pointers only.
17
+
18
+ Your last tool call in this attempt must be emit_stage_envelope.
19
+ model: cursor/auto
20
+ io:
21
+ input:
22
+ schema:
23
+ type: object
24
+ required:
25
+ - library_id
26
+ - library_name
27
+ properties:
28
+ library_id:
29
+ type: string
30
+ library_name:
31
+ type: string
32
+ output:
33
+ schema:
34
+ type: object
35
+ required:
36
+ - library_id
37
+ - query
38
+ - excerpt
39
+ properties:
40
+ library_id:
41
+ type: string
42
+ query:
43
+ type: string
44
+ excerpt:
45
+ type: string
46
+ verify:
47
+ - id: docs
48
+ type: artifact
49
+ path: docs.md
50
+ nonempty: true
51
+ when:
52
+ - after
@@ -0,0 +1,31 @@
1
+ id: resolve-library
2
+ system_prompt: |
3
+ Resolve the library named in the task with Context7 MCP. Call
4
+ resolve-library-id with libraryName and the task question as query.
5
+ Pick one libraryId (prefer an official high-reputation match). Do not
6
+ call query-docs. Do not call ask_operator.
7
+
8
+ When finished, call emit_stage_envelope exactly once with status success,
9
+ artifacts [], a short summary, and payload
10
+ { "library_id": "<id like /org/project>", "library_name": "<name>" }.
11
+ summary and payload are handed to the next stage verbatim. State outcomes
12
+ only.
13
+
14
+ Your last tool call in this attempt must be emit_stage_envelope.
15
+ The next stage starts a fresh MCP session — pass the id in the envelope.
16
+ model: cursor/auto
17
+ io:
18
+ input:
19
+ schema:
20
+ type: object
21
+ output:
22
+ schema:
23
+ type: object
24
+ required:
25
+ - library_id
26
+ - library_name
27
+ properties:
28
+ library_id:
29
+ type: string
30
+ library_name:
31
+ type: string
@@ -0,0 +1,52 @@
1
+ id: write-brief
2
+ system_prompt: |
3
+ Turn the fetch-docs envelope into a one-page operator brief. You do not
4
+ have Context7 MCP on this stage. Use payload.excerpt, library_id, and
5
+ query only. Do not invent APIs that are not in the excerpt. Do not call
6
+ ask_operator.
7
+
8
+ Write brief.md via write_stage_artifact: the question, the library id,
9
+ a short answer, and the code sample from the excerpt. Checkout write/edit
10
+ does not satisfy the artifact.
11
+
12
+ When finished, call emit_stage_envelope exactly once with status success,
13
+ artifacts ["brief.md"], a short summary, and payload
14
+ { "library_id": "<id>", "brief_artifact": "brief.md" }. summary and
15
+ payload are handed downstream verbatim. State outcomes and artifact
16
+ pointers only.
17
+
18
+ Your last tool call in this attempt must be emit_stage_envelope.
19
+ model: cursor/auto
20
+ io:
21
+ input:
22
+ schema:
23
+ type: object
24
+ required:
25
+ - library_id
26
+ - query
27
+ - excerpt
28
+ properties:
29
+ library_id:
30
+ type: string
31
+ query:
32
+ type: string
33
+ excerpt:
34
+ type: string
35
+ output:
36
+ schema:
37
+ type: object
38
+ required:
39
+ - library_id
40
+ - brief_artifact
41
+ properties:
42
+ library_id:
43
+ type: string
44
+ brief_artifact:
45
+ type: string
46
+ verify:
47
+ - id: brief
48
+ type: artifact
49
+ path: brief.md
50
+ nonempty: true
51
+ when:
52
+ - after
@@ -0,0 +1,104 @@
1
+ # feature-loop
2
+
3
+ Epic-to-PR walkthrough: split a requirements document into stories,
4
+ plan them in parallel, align the plans, implement them **sequentially**,
5
+ verify nothing was missed, review the whole diff, fix review blockers
6
+ (with a send-back loop), then open an operator-approved pull request.
7
+
8
+ This is the shape for work that starts as one epic and must not land
9
+ as overlapping parallel edits. It is repository-neutral — point the
10
+ task `checkout` at a feature branch of whatever tree you are shipping.
11
+ Nothing in the stage files names a product, repo, or keyword.
12
+
13
+ The shipped YAML is two sealed [Clone Chains](../../docs/yaml-catalog.md#clone-chain)
14
+ plus a `{ type: loop }` from `address-feedback` back to `review`. Wiring
15
+ is outbound `route` (`entry`, `clone_cap` / `clone_mode` on emitters).
16
+ `sf validate --strict` against this pipeline is expected to pass.
17
+
18
+ ## Flow
19
+
20
+ ```
21
+ decompose ──Clone Array (parallel)──► plan~N ──Join──► align
22
+ │
23
+ sequential Clone Array │
24
+ ▼
25
+ implement~1 → implement~2 → …
26
+ │
27
+ ▼
28
+ verify → review ⇄ address-feedback → publish
29
+ ```
30
+
31
+ 1. **decompose** — Read the epic (task + requirements doc). Cut 1–8
32
+ stories into a Clone Array (`stories` items `$ref` `story-assignment`).
33
+ Writes `epic-split.md`. Emitter: `clone_cap: 8`, `clone_mode: parallel`.
34
+ 2. **plan** — One Clone Instance per story (`clone_mode: parallel`). Each
35
+ writes `story-plan.md` (edit sites, validation commands, neighbor
36
+ boundaries). No source edits. Entire `io.input.schema` is
37
+ `{ $ref: "#/schemas/story-assignment" }`.
38
+ 3. **align** — Join of every plan Clone Instance. Fix overlapping files and
39
+ contradictions, choose **implementation order**, ask the operator to
40
+ accept. Then this stage is the emitter of the next Clone Chain
41
+ (`clone_mode: sequential`): `stories` items `$ref` `story-work`, with
42
+ `order` / `depends_on` on each item.
43
+ 4. **implement** — Sequential Clone Instances in array order; `~N`
44
+ starts only after `~N-1` succeeded, so earlier edits are already in
45
+ the tree. Each instance executes only its story and must change the
46
+ checkout. Entire `io.input.schema` is `{ $ref: "#/schemas/story-work" }`.
47
+ 5. **verify** — Join of implement Clone Instances. Fail if any aligned
48
+ `story_id` is missing from the instance set or the union diff. Writes
49
+ `coverage.md`.
50
+ 6. **review** — One whole-diff review of every story together
51
+ (ce-code-review style). Report-only. `verdict: pass | changes_required`.
52
+ 7. **address-feedback** — Fix blockers. Envelope `feedback_loop`
53
+ `send_back` to `review` when the tree changed so the whole diff is re-read;
54
+ `continue` when review is clean. Catalog loop:
55
+ `{ type: loop, to: review, max_replays: 2, on_max_replays: wait_for_human,
56
+ replay_session: new_session }`. After two send-backs the run waits
57
+ for an operator decision. `publish` is `replay_safe: false`.
58
+ 8. **publish** — Operator accepts `ship-package.md`, then this same
59
+ attempt commits, pushes the current branch, and opens the PR.
60
+
61
+ No stage before `publish` commits, pushes, or opens a PR. No stage
62
+ creates or switches branches.
63
+
64
+ ## Runtime contracts
65
+
66
+ | Stage | Gate | Required artifacts | Other checks |
67
+ |-------|------|--------------------|--------------|
68
+ | `plan` | — | `story-plan.md` | `io.input` assignment |
69
+ | `implement` | — | `implementation-report.md` | `checkout_changes` |
70
+ | `verify` | — | `coverage.md` | `io.output` |
71
+ | `review` | — | `review-report.md` | whole-diff, report-only |
72
+ | `address-feedback` | — | `review-feedback-report.md` | `{ type: loop }` → `review` |
73
+ | `publish` | `artifact_backed` | `ship-package.md`, `pull-request.md` | `on_verify_fail: manual` |
74
+
75
+ `on_verify_fail` repair (idempotent, 3 attempts) sits on every stage except
76
+ `publish` (`manual` / `side_effecting`). Stage files use `io` / `verify` /
77
+ `on_verify_fail`.
78
+
79
+ Shared JSON Schema lives on the pipeline under `schemas:` —
80
+ `story-assignment` is the first Clone Array item (`plan` input `$ref`);
81
+ `story-work` is the second (`implement` input `$ref`). See
82
+ [YAML catalog — Pipeline schemas](../../docs/yaml-catalog.md#pipeline-schemas)
83
+ and [Clone Chain](../../docs/yaml-catalog.md#clone-chain).
84
+
85
+ ## Run
86
+
87
+ Fill in [`feature-loop.task.yaml`](feature-loop.task.yaml) (epic path,
88
+ publish repo, base branch, `checkout` on the feature branch). Operator
89
+ accepts twice: aligned plans, then the ship package.
90
+
91
+ ```bash
92
+ node dist/cli.js validate --pipeline examples/feature-loop/feature-loop.pipeline.yaml --strict
93
+ node dist/cli.js run \
94
+ --pipeline examples/feature-loop/feature-loop.pipeline.yaml \
95
+ --task examples/feature-loop/feature-loop.task.yaml
96
+ ```
97
+
98
+ Needs a configured provider (`sf providers status`), `gh` on PATH, and
99
+ `GH_TOKEN` or `GITHUB_TOKEN` for the publish stage. Optional: add
100
+ `mcp: [context7]` on the `plan` pipeline entry when `CONTEXT7_API_KEY`
101
+ is set so story plans can query current library docs.
102
+
103
+ Inspect Clone Instance tracks and envelopes in the operator console (`sf ui`)
104
+ on the `plan` and `implement` stages, then the `align` / `verify` Joins.
@@ -0,0 +1,148 @@
1
+ id: address-feedback
2
+ system_prompt: |
3
+ Address every blocking finding from review. This is the only stage
4
+ after implement that may edit the checkout. It is last-mile fixup,
5
+ not a second epic. Do not commit, push, or open a pull request.
6
+
7
+ On success you MUST include feedback_loop in emit_stage_envelope:
8
+ - {"action":"continue"} when verdict was pass, or when you fixed
9
+ every blocker and a further review pass is not needed (no remaining
10
+ blocking risk).
11
+ - {"action":"send_back","target":"review"} when you changed the
12
+ checkout to address blockers — review must re-read the whole diff
13
+ before publish. Do not combine send_back with fork_choice or
14
+
15
+ Reading upstream work: the user prompt contains "Factory run
16
+ workspace: <absolute path>". review-report.md and review payload
17
+ (verdict, blocking_findings) are authoritative. If Feedback Loop
18
+ Context is present, that is a prior send-back: fix what the latest
19
+ review still blocks.
20
+
21
+ Definition of done — every line must hold before you emit success:
22
+ - review-report.md and the review envelope were read.
23
+ - If verdict is pass and blocking_findings is empty: the checkout is
24
+ untouched, fixed_files is empty, addressed_all_blocking is true,
25
+ feedback_loop is continue.
26
+ - If any blocker exists: every blocking_findings entry is fixed, then
27
+ search for other instances of the same category and fix those too.
28
+ git diff is non-empty. Every cited failing check was re-run and
29
+ now passes. addressed_all_blocking is true. feedback_loop is
30
+ send_back to review unless a Feedback Loop Context remaining-replay
31
+ count is already exhausted — then continue only if the latest
32
+ review is actually clean; otherwise emit failure.
33
+ - Every fixed_files entry is a repo-relative checkout path in
34
+ git diff --name-only.
35
+ - review-feedback-report.md was written through write_stage_artifact
36
+ and appears in the emitted artifacts list.
37
+
38
+ 1. Read review-report.md. If every verdict is pass, skip to the
39
+ report step with nothing to fix and continue.
40
+ 2. Fix each blocker at the cited location, then sweep the rest of
41
+ the diff for the same category. No unrelated refactors. Do not
42
+ weaken or delete tests to go green.
43
+ 3. Re-run every command a blocker cited. If a fix cannot complete,
44
+ emit failure — do not present partial remediation as success.
45
+ 4. Call write_stage_artifact with path review-feedback-report.md
46
+ listing each blocker, the fix, the passing re-run, or that there
47
+ was nothing to address.
48
+ 5. Emit exactly once, including the report and inherited evidence,
49
+ with a payload matching the schema and feedback_loop as above.
50
+
51
+ Success requires real checkout edits when blockers existed. Put
52
+ checkout-relative paths in payload.fixed_files. Do not put
53
+ stages/.../artifacts paths there.
54
+
55
+ Contract violations — emit failure rather than presenting these as
56
+ success:
57
+ - addressed_all_blocking: true while any blocker remains unverified.
58
+ - continue after checkout edits that have not been re-reviewed, when
59
+ a send_back replay remains available.
60
+ - send_back when the tree was not changed.
61
+ - A fixed_files entry under stages/.../artifacts/.
62
+
63
+ summary and payload are handed to the next stage verbatim. State
64
+ what was fixed, whether review must run again, and remaining risk.
65
+ Do not repeat this stage's prohibitions in summary.
66
+
67
+ When finished, call emit_stage_envelope exactly once. Your last tool
68
+ call in this attempt must be emit_stage_envelope. An empty final
69
+ message is a stage failure.
70
+ model: cursor/auto
71
+ timeout_ms: 3600000
72
+ io:
73
+ input:
74
+ schema:
75
+ type: object
76
+ required:
77
+ - verdict
78
+ - findings
79
+ - blocking_findings
80
+ - suggestions
81
+ - evidence
82
+ - reviewed_files
83
+ properties:
84
+ verdict:
85
+ type: string
86
+ enum:
87
+ - pass
88
+ - changes_required
89
+ findings:
90
+ type: array
91
+ items:
92
+ type: string
93
+ blocking_findings:
94
+ type: array
95
+ items:
96
+ type: string
97
+ suggestions:
98
+ type: array
99
+ items:
100
+ type: string
101
+ evidence:
102
+ type: array
103
+ items:
104
+ type: string
105
+ reviewed_files:
106
+ type: array
107
+ minItems: 1
108
+ items:
109
+ type: string
110
+ output:
111
+ schema:
112
+ type: object
113
+ required:
114
+ - addressed_all_blocking
115
+ - fixed_files
116
+ - verification_commands
117
+ - remaining_risks
118
+ - sent_back
119
+ properties:
120
+ addressed_all_blocking:
121
+ type: boolean
122
+ fixed_files:
123
+ type: array
124
+ items:
125
+ type: string
126
+ verification_commands:
127
+ type: array
128
+ items:
129
+ type: string
130
+ remaining_risks:
131
+ type: array
132
+ items:
133
+ type: string
134
+ sent_back:
135
+ type: boolean
136
+ verify:
137
+ - id: review-feedback-report-declared
138
+ type: artifact
139
+ basename: review-feedback-report.md
140
+ when:
141
+ - emit
142
+ - id: review-feedback-report
143
+ type: artifact
144
+ path: review-feedback-report.md
145
+ nonempty: true
146
+ when:
147
+ - after
148
+ gate_kinds: []
@@ -0,0 +1,116 @@
1
+ id: align
2
+ system_prompt: |
3
+ You are the join after plan. Read all story plans together,
4
+ fix overlaps and contradictions in the plan artifacts, choose the
5
+ sequential implementation order, and get operator acceptance before any
6
+ source edit. Do not implement, commit, push, or open a pull request.
7
+
8
+ Prior plan envelopes' payload (story_id, planned_files, validation_commands) and
9
+ story-plan.md are authoritative over any prose summary.
10
+
11
+ Reading upstream work: the user prompt contains "Factory run workspace:
12
+ <absolute path>". Read each prior artifact at <Factory run workspace>/
13
+ <artifact path>.
14
+
15
+ Definition of done — every line must hold before you emit success:
16
+ - Every plan envelope and story-plan.md was read.
17
+ - Overlapping planned_files, contradictory approaches, and missing
18
+ epic coverage were resolved by editing the affected story plans via
19
+ write_stage_artifact (new aligned copies named
20
+ story-plan-<story_id>.md in this attempt) — not by hoping implement
21
+ will notice.
22
+ - aligned-plans.md was written through write_stage_artifact, appears
23
+ in the emitted artifacts list, and records the final story set, the
24
+ implementation order, what changed in which plan, and remaining
25
+ risks.
26
+ - payload.stories is a Clone Array of story-work objects, one per
27
+ aligned story, in implementation order. Each item has story_id,
28
+ title, plan_artifact, order (1-based), depends_on, planned_files, and
29
+ validation_commands. The first item has no unmet neighbor
30
+ dependency; later items may depend only on earlier story_ids.
31
+ Encode order in each item; do not emit a sibling implementation_order
32
+ or story_ids array.
33
+ - remaining_risks is a string. approved is a boolean. alignment_notes
34
+ is a string.
35
+ - The operator accepted aligned-plans.md through artifact_backed, and
36
+ that accepted decision is recorded inside the artifact.
37
+
38
+ 1. Read every plan envelope and story-plan.md. Diff planned_files across stories. Flag overlap, gaps
39
+ against epic-split.md, and validation commands that do not exist
40
+ in this repo.
41
+ 2. Rewrite any story plan that needs a fix into
42
+ story-plan-<story_id>.md via write_stage_artifact. Unchanged plans
43
+ are still copied so implement reads from this attempt.
44
+ 3. Choose a sequential order that respects neighbor_dependencies and
45
+ file coupling (shared types and contracts first). Put that order
46
+ on each stories item as order and depends_on.
47
+ 4. Call write_stage_artifact with path aligned-plans.md covering the
48
+ matrix of stories, order, diffs you made, and why sequential
49
+ implement will not thrash shared files.
50
+ 5. Call ask_operator with kind artifact_backed referencing
51
+ aligned-plans.md. Ask whether this set and order are ready to
52
+ implement. On reject or change text: revise artifacts and ask
53
+ again in this same stage. Never emit before accept.
54
+ 6. After explicit acceptance, rewrite aligned-plans.md to include an
55
+ operator-decision section (accepted wording and any conditions).
56
+ Then emit the stories Clone Array plus approved, alignment_notes,
57
+ and remaining_risks as scalars.
58
+
59
+ Required files must be created with write_stage_artifact. Checkout
60
+ write/edit does not satisfy after-phase verify.
61
+
62
+ this same attempt. Do not pause after accept. Do not ask_operator for
63
+ emit/schema errors.
64
+
65
+ summary and payload are handed to the next stage verbatim. State the
66
+ approved story set, order, and artifact pointers only. Do not repeat
67
+ this stage's prohibitions in summary.
68
+
69
+ When finished, call emit_stage_envelope exactly once. Your last tool
70
+ call in this attempt must be emit_stage_envelope (or ask_operator if
71
+ waiting on HITL). An empty final message is a stage failure.
72
+ model: cursor/auto
73
+ timeout_ms: 3600000
74
+ io:
75
+ input:
76
+ schema:
77
+ type: object
78
+ output:
79
+ schema:
80
+ type: object
81
+ required:
82
+ - stories
83
+ - approved
84
+ - alignment_notes
85
+ - remaining_risks
86
+ properties:
87
+ stories:
88
+ type: array
89
+ items:
90
+ $ref: "#/schemas/story-work"
91
+ approved:
92
+ type: boolean
93
+ alignment_notes:
94
+ type: string
95
+ remaining_risks:
96
+ type: string
97
+ verify:
98
+ - id: plans-approved
99
+ type: gate
100
+ kind: artifact_backed
101
+ when:
102
+ - emit
103
+ - after
104
+ - id: aligned-plans-declared
105
+ type: artifact
106
+ basename: aligned-plans.md
107
+ when:
108
+ - emit
109
+ - id: aligned-plans
110
+ type: artifact
111
+ path: aligned-plans.md
112
+ nonempty: true
113
+ when:
114
+ - after
115
+ gate_kinds:
116
+ - artifact_backed
@@ -0,0 +1,86 @@
1
+ id: decompose
2
+ system_prompt: |
3
+ Split the task's requirements document (the epic) into independent
4
+ implementation stories for the next stage to plan. Do not write story plans here, edit source, commit, push, or
5
+ open a pull request.
6
+
7
+ There is no prior stage. The task goal, context, and constraints name
8
+ the epic: a requirements path, pasted epic, or equivalent. Read that
9
+ document from the checkout when a path is given, plus the files and
10
+ neighbors the epic implies. A split that restates the epic without
11
+ grounding it in the real tree is not done.
12
+
13
+ Definition of done — every line must hold before you emit success:
14
+ - epic-split.md was written through write_stage_artifact and appears in
15
+ the emitted artifacts list.
16
+ - payload.stories is an array of 1–8 story-assignment objects. Each item
17
+ has story_id, title, epic_slice, acceptance, neighboring_story_ids, and
18
+ constraints. Do not emit a parallel story_ids string array.
19
+ - Each story is a slice the next stage can plan in isolation: one
20
+ story_id (stable kebab-case), a title, an epic_slice that quotes or
21
+ paraphrases only the epic text that slice owns, acceptance the
22
+ implementer can falsify, neighboring_story_ids it must not steal
23
+ work from, and constraints that clone must honor.
24
+ - Stories do not overlap files or acceptance. Together they cover the
25
+ epic; leftover epic text with no owner is a contract violation.
26
+ - Emit 1–8 stories. Never zero stories, never more than eight.
27
+
28
+ 1. Read the task and the named requirements document in the checkout.
29
+ Map the epic onto real files before cutting stories.
30
+ 2. Cut 1–8 stories. Prefer seams the checkout already has (modules,
31
+ APIs, UI vs runtime, tests vs prod) over arbitrary chapter splits.
32
+ If the epic is one tight change, emit one story — do not invent filler
33
+ stories.
34
+ 3. Call write_stage_artifact with path epic-split.md listing each
35
+ story_id, title, owned epic text, likely files, acceptance, and why
36
+ the slices can be planned in parallel.
37
+ 4. Emit exactly one success envelope with payload matching the schema,
38
+ artifacts containing epic-split.md, and stories as those objects in
39
+ deterministic order. Sibling fields requirements_source and
40
+ split_rationale are strings only.
41
+
42
+ Required files must be created with write_stage_artifact. Checkout
43
+ write/edit does not satisfy after-phase verify.
44
+
45
+ summary and payload are handed to the next stage verbatim. State
46
+ outcomes and artifact pointers only. Do not repeat this stage's
47
+ prohibitions in summary — downstream will obey them literally.
48
+
49
+ When finished, call emit_stage_envelope exactly once with status,
50
+ this attempt must be emit_stage_envelope. An empty final message is a
51
+ stage failure.
52
+ model: cursor/auto
53
+ timeout_ms: 3600000
54
+ io:
55
+ input:
56
+ schema:
57
+ type: object
58
+ output:
59
+ schema:
60
+ type: object
61
+ required:
62
+ - stories
63
+ - requirements_source
64
+ - split_rationale
65
+ properties:
66
+ stories:
67
+ type: array
68
+ items:
69
+ $ref: "#/schemas/story-assignment"
70
+ requirements_source:
71
+ type: string
72
+ split_rationale:
73
+ type: string
74
+ verify:
75
+ - id: epic-split-declared
76
+ type: artifact
77
+ basename: epic-split.md
78
+ when:
79
+ - emit
80
+ - id: epic-split
81
+ type: artifact
82
+ path: epic-split.md
83
+ nonempty: true
84
+ when:
85
+ - after
86
+ gate_kinds: []