stageflow 0.23.0 → 0.27.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 (511) hide show
  1. package/README.md +24 -5
  2. package/dist/a2a/configDiscovery.d.ts +9 -0
  3. package/dist/a2a/configDiscovery.js +18 -0
  4. package/dist/a2a/contracts.d.ts +94 -0
  5. package/dist/a2a/contracts.js +164 -0
  6. package/dist/a2a/limits.d.ts +14 -0
  7. package/dist/a2a/limits.js +29 -0
  8. package/dist/a2a/registry.d.ts +46 -0
  9. package/dist/a2a/registry.js +178 -0
  10. package/dist/a2a/server.d.ts +36 -0
  11. package/dist/a2a/server.js +344 -0
  12. package/dist/a2a/service.d.ts +97 -0
  13. package/dist/a2a/service.js +545 -0
  14. package/dist/a2a/store.d.ts +109 -0
  15. package/dist/a2a/store.js +202 -0
  16. package/dist/agent/activity.d.ts +3 -0
  17. package/dist/agent/bootProviderConfig.d.ts +21 -0
  18. package/dist/agent/bootProviderConfig.js +74 -0
  19. package/dist/agent/piAdapter.d.ts +9 -1
  20. package/dist/agent/piAdapter.js +58 -3
  21. package/dist/agent/piIsolatedMcp.d.ts +2 -0
  22. package/dist/agent/piIsolatedMcp.js +10 -2
  23. package/dist/agent/port.d.ts +6 -0
  24. package/dist/agent/streamLogRedact.d.ts +1 -1
  25. package/dist/agent/streamLogRedact.js +4 -11
  26. package/dist/cli/a2aCommand.d.ts +8 -0
  27. package/dist/cli/a2aCommand.js +131 -0
  28. package/dist/cli/artifactCommand.js +9 -16
  29. package/dist/cli/backupCommand.d.ts +9 -0
  30. package/dist/cli/backupCommand.js +111 -0
  31. package/dist/cli/debugRunCommand.d.ts +10 -0
  32. package/dist/cli/debugRunCommand.js +109 -0
  33. package/dist/cli/doctorCommand.d.ts +32 -0
  34. package/dist/cli/doctorCommand.js +453 -0
  35. package/dist/cli/envelopeCommand.js +9 -2
  36. package/dist/cli/exportAllCommand.d.ts +55 -0
  37. package/dist/cli/exportAllCommand.js +218 -0
  38. package/dist/cli/exportRunCommand.js +23 -21
  39. package/dist/cli/hostClient.d.ts +21 -3
  40. package/dist/cli/hostClient.js +93 -12
  41. package/dist/cli/initTemplates.d.ts +1 -1
  42. package/dist/cli/initTemplates.js +8 -1
  43. package/dist/cli/resolveSafeOutPath.d.ts +2 -0
  44. package/dist/cli/resolveSafeOutPath.js +40 -0
  45. package/dist/cli/restoreCommand.d.ts +10 -0
  46. package/dist/cli/restoreCommand.js +90 -0
  47. package/dist/cli/runCommand.d.ts +3 -2
  48. package/dist/cli/runCommand.js +93 -11
  49. package/dist/cli/runOutput.d.ts +4 -0
  50. package/dist/cli/runOutput.js +33 -7
  51. package/dist/cli/runStageCommand.d.ts +34 -0
  52. package/dist/cli/runStageCommand.js +426 -0
  53. package/dist/cli/runsCommand.d.ts +1 -1
  54. package/dist/cli/runsCommand.js +162 -8
  55. package/dist/cli.js +190 -30
  56. package/dist/config/catalogRelativePath.d.ts +62 -0
  57. package/dist/config/catalogRelativePath.js +118 -0
  58. package/dist/config/configOrigin.d.ts +27 -0
  59. package/dist/config/configOrigin.js +59 -0
  60. package/dist/config/hostConfig.d.ts +55 -0
  61. package/dist/config/hostConfig.js +333 -0
  62. package/dist/config/listSkills.d.ts +26 -0
  63. package/dist/config/listSkills.js +190 -3
  64. package/dist/config/loadOutcome.d.ts +1 -1
  65. package/dist/config/loadPipeline.js +23 -2
  66. package/dist/config/loadStage.js +18 -0
  67. package/dist/config/loadTask.d.ts +2 -0
  68. package/dist/config/loadTask.js +57 -18
  69. package/dist/config/materializeStageModels.js +5 -1
  70. package/dist/config/mergePipelineIncludes.d.ts +3 -0
  71. package/dist/config/mergePipelineIncludes.js +19 -0
  72. package/dist/config/migrateYaml.js +6 -11
  73. package/dist/config/multiProjectCatalog.d.ts +30 -0
  74. package/dist/config/multiProjectCatalog.js +142 -0
  75. package/dist/config/normalizePipelineStageEntry.js +20 -1
  76. package/dist/config/pipelineStageKeys.js +2 -0
  77. package/dist/config/resolveCatalogRoots.d.ts +27 -0
  78. package/dist/config/resolveCatalogRoots.js +76 -0
  79. package/dist/config/resolveModel.d.ts +7 -1
  80. package/dist/config/resolveModel.js +11 -1
  81. package/dist/config/resolveStageMcpServers.d.ts +9 -1
  82. package/dist/config/resolveStageMcpServers.js +36 -9
  83. package/dist/config/secretFromEnvOrFile.d.ts +9 -0
  84. package/dist/config/secretFromEnvOrFile.js +34 -0
  85. package/dist/config/seededCatalog.d.ts +11 -0
  86. package/dist/config/seededCatalog.js +29 -0
  87. package/dist/config/toolRequires.d.ts +24 -0
  88. package/dist/config/toolRequires.js +115 -0
  89. package/dist/config/validateCatalog.d.ts +5 -1
  90. package/dist/config/validateCatalog.js +140 -1
  91. package/dist/diagnostics/checks.d.ts +39 -0
  92. package/dist/diagnostics/checks.js +135 -0
  93. package/dist/errors/codes.d.ts +14 -0
  94. package/dist/errors/codes.js +59 -0
  95. package/dist/git/cache.d.ts +14 -0
  96. package/dist/git/cache.js +150 -0
  97. package/dist/git/credentials.d.ts +9 -0
  98. package/dist/git/credentials.js +88 -0
  99. package/dist/git/errors.d.ts +20 -0
  100. package/dist/git/errors.js +94 -0
  101. package/dist/git/exec.d.ts +16 -0
  102. package/dist/git/exec.js +135 -0
  103. package/dist/git/operations.d.ts +29 -0
  104. package/dist/git/operations.js +153 -0
  105. package/dist/git/version.d.ts +1 -0
  106. package/dist/git/version.js +10 -0
  107. package/dist/logging/audit.d.ts +16 -0
  108. package/dist/logging/audit.js +19 -0
  109. package/dist/logging/commonWords.d.ts +2 -0
  110. package/dist/logging/commonWords.js +13 -0
  111. package/dist/logging/logger.d.ts +49 -0
  112. package/dist/logging/logger.js +193 -0
  113. package/dist/logging/namedSecrets.d.ts +6 -0
  114. package/dist/logging/namedSecrets.js +58 -0
  115. package/dist/logging/redact.d.ts +13 -0
  116. package/dist/logging/redact.js +88 -0
  117. package/dist/mcp/catalogTools.js +591 -76
  118. package/dist/mcp/checkoutTools.d.ts +52 -0
  119. package/dist/mcp/checkoutTools.js +332 -0
  120. package/dist/mcp/controlTools.js +179 -5
  121. package/dist/mcp/deps.d.ts +1 -0
  122. package/dist/mcp/getStartedTool.d.ts +3 -0
  123. package/dist/mcp/getStartedTool.js +62 -0
  124. package/dist/mcp/readArtifact.d.ts +11 -0
  125. package/dist/mcp/readArtifact.js +46 -30
  126. package/dist/mcp/server.js +1 -0
  127. package/dist/mcp/tools.js +4 -0
  128. package/dist/net/proxy.d.ts +14 -0
  129. package/dist/net/proxy.js +78 -0
  130. package/dist/package-meta.d.ts +2 -1
  131. package/dist/package-meta.js +2 -1
  132. package/dist/preflight/bash.d.ts +8 -0
  133. package/dist/preflight/bash.js +34 -0
  134. package/dist/preflight/claudeRoot.d.ts +11 -0
  135. package/dist/preflight/claudeRoot.js +23 -0
  136. package/dist/preflight/mcpCommands.d.ts +8 -0
  137. package/dist/preflight/mcpCommands.js +36 -0
  138. package/dist/preflight/pipelinePreflight.d.ts +40 -0
  139. package/dist/preflight/pipelinePreflight.js +192 -0
  140. package/dist/preflight/tls.d.ts +6 -0
  141. package/dist/preflight/tls.js +18 -0
  142. package/dist/preflight/toolchain.d.ts +45 -0
  143. package/dist/preflight/toolchain.js +219 -0
  144. package/dist/project/findProjectRoot.js +3 -4
  145. package/dist/project/globalHome.d.ts +7 -0
  146. package/dist/project/globalHome.js +63 -2
  147. package/dist/project/resolveProjectContext.js +2 -2
  148. package/dist/project/resolveStageflowContext.js +2 -2
  149. package/dist/projection/projectRun.d.ts +2 -1
  150. package/dist/projection/projectRun.js +1 -0
  151. package/dist/runstore/assertTmpdir.d.ts +1 -0
  152. package/dist/runstore/assertTmpdir.js +21 -0
  153. package/dist/runstore/backup.d.ts +52 -0
  154. package/dist/runstore/backup.js +292 -0
  155. package/dist/runstore/createStore.d.ts +27 -0
  156. package/dist/runstore/createStore.js +75 -7
  157. package/dist/runstore/debugBundle.d.ts +60 -0
  158. package/dist/runstore/debugBundle.js +143 -0
  159. package/dist/runstore/diskUsage.d.ts +50 -0
  160. package/dist/runstore/diskUsage.js +214 -0
  161. package/dist/runstore/exportRunPayload.d.ts +8 -0
  162. package/dist/runstore/exportRunPayload.js +23 -0
  163. package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
  164. package/dist/runstore/normalizeCatalogPath.js +10 -0
  165. package/dist/runstore/paths.d.ts +5 -0
  166. package/dist/runstore/paths.js +145 -1
  167. package/dist/runstore/port.d.ts +119 -8
  168. package/dist/runstore/port.js +8 -1
  169. package/dist/runstore/restore.d.ts +81 -0
  170. package/dist/runstore/restore.js +355 -0
  171. package/dist/runstore/retention.d.ts +27 -0
  172. package/dist/runstore/retention.js +74 -0
  173. package/dist/runstore/runManifest.d.ts +146 -0
  174. package/dist/runstore/runManifest.js +288 -0
  175. package/dist/runstore/runProjection.d.ts +3 -1
  176. package/dist/runstore/runProjection.js +63 -1
  177. package/dist/runstore/sqlite/SqliteRunStore.d.ts +37 -3
  178. package/dist/runstore/sqlite/SqliteRunStore.js +401 -227
  179. package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
  180. package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
  181. package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
  182. package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
  183. package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
  184. package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
  185. package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
  186. package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
  187. package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
  188. package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
  189. package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
  190. package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
  191. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
  192. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
  193. package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
  194. package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
  195. package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
  196. package/dist/runstore/sqlite/migrations/index.js +72 -0
  197. package/dist/runstore/sqlite/schema.d.ts +20 -1
  198. package/dist/runstore/sqlite/schema.js +283 -1
  199. package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
  200. package/dist/runstore/sqlite/storeOpenError.js +11 -0
  201. package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
  202. package/dist/runstore/sqlite/storeSchemaError.js +8 -0
  203. package/dist/runstore/stageExecution.js +3 -0
  204. package/dist/runstore/storeFilesystem.d.ts +32 -0
  205. package/dist/runstore/storeFilesystem.js +148 -0
  206. package/dist/runstore/submission.d.ts +11 -0
  207. package/dist/runstore/submission.js +7 -0
  208. package/dist/runstore/trackProjection.js +2 -0
  209. package/dist/runstore/workspaceLayout.d.ts +13 -0
  210. package/dist/runstore/workspaceLayout.js +76 -0
  211. package/dist/runtime/completionCheckRunner.d.ts +3 -0
  212. package/dist/runtime/completionCheckRunner.js +45 -7
  213. package/dist/runtime/containerLimits.d.ts +16 -0
  214. package/dist/runtime/containerLimits.js +84 -0
  215. package/dist/runtime/credentialMaterialisation.d.ts +28 -0
  216. package/dist/runtime/credentialMaterialisation.js +128 -0
  217. package/dist/runtime/gitCheckoutCapability.js +7 -13
  218. package/dist/runtime/pipelineRunner.d.ts +38 -1
  219. package/dist/runtime/pipelineRunner.js +179 -15
  220. package/dist/runtime/pipelineScheduler.d.ts +15 -0
  221. package/dist/runtime/pipelineScheduler.js +167 -42
  222. package/dist/runtime/reloadRunCatalog.js +12 -1
  223. package/dist/runtime/repositoryMaterialize.d.ts +47 -0
  224. package/dist/runtime/repositoryMaterialize.js +235 -0
  225. package/dist/runtime/resolveEnvelopeRef.d.ts +30 -0
  226. package/dist/runtime/resolveEnvelopeRef.js +79 -0
  227. package/dist/runtime/resumeTimedOut.d.ts +1 -1
  228. package/dist/runtime/resumeTimedOut.js +5 -2
  229. package/dist/runtime/runChangeBus.js +9 -0
  230. package/dist/runtime/runDeletion.d.ts +7 -0
  231. package/dist/runtime/runDeletion.js +37 -0
  232. package/dist/runtime/runManager.d.ts +179 -4
  233. package/dist/runtime/runManager.js +1644 -83
  234. package/dist/runtime/runRetentionSweep.d.ts +31 -0
  235. package/dist/runtime/runRetentionSweep.js +328 -0
  236. package/dist/runtime/runRetryCoordinator.d.ts +2 -0
  237. package/dist/runtime/runRetryCoordinator.js +19 -2
  238. package/dist/runtime/runSkills.d.ts +40 -0
  239. package/dist/runtime/runSkills.js +173 -0
  240. package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
  241. package/dist/runtime/stageAttemptBootstrap.js +195 -24
  242. package/dist/runtime/stageCacheEnv.d.ts +6 -0
  243. package/dist/runtime/stageCacheEnv.js +34 -0
  244. package/dist/runtime/stageConcurrency.d.ts +2 -1
  245. package/dist/runtime/stageConcurrency.js +4 -2
  246. package/dist/runtime/stageEnvironment.d.ts +38 -0
  247. package/dist/runtime/stageEnvironment.js +193 -0
  248. package/dist/runtime/stageProcessLauncher.d.ts +18 -0
  249. package/dist/runtime/stageProcessLauncher.js +194 -38
  250. package/dist/runtime/stageRecovery.d.ts +3 -1
  251. package/dist/runtime/stageRecovery.js +19 -4
  252. package/dist/runtime/stageRoots.d.ts +38 -1
  253. package/dist/runtime/stageRoots.js +118 -0
  254. package/dist/runtime/stageRunner.d.ts +1 -0
  255. package/dist/runtime/stageRunner.js +3 -1
  256. package/dist/runtime/stageSecretDecl.d.ts +9 -0
  257. package/dist/runtime/stageSecretDecl.js +102 -0
  258. package/dist/runtime/stageSecrets.d.ts +40 -0
  259. package/dist/runtime/stageSecrets.js +181 -0
  260. package/dist/runtime/stageWorker.d.ts +3 -2
  261. package/dist/runtime/stageWorker.js +58 -10
  262. package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
  263. package/dist/runtime/stageWorkerProtocol.js +8 -0
  264. package/dist/runtime/startPayload.d.ts +32 -0
  265. package/dist/runtime/startPayload.js +59 -0
  266. package/dist/runtime/taskInput.js +14 -5
  267. package/dist/runtime/verifiedStageExecution.d.ts +1 -0
  268. package/dist/runtime/verifiedStageExecution.js +2 -1
  269. package/dist/runtime/workspaceBinding.d.ts +20 -0
  270. package/dist/runtime/workspaceBinding.js +60 -0
  271. package/dist/server/allowedHosts.d.ts +19 -0
  272. package/dist/server/allowedHosts.js +179 -0
  273. package/dist/server/bootstrap.d.ts +38 -2
  274. package/dist/server/bootstrap.js +219 -4
  275. package/dist/server/controlToken.d.ts +47 -0
  276. package/dist/server/controlToken.js +241 -0
  277. package/dist/server/createHttpHost.d.ts +11 -2
  278. package/dist/server/createHttpHost.js +109 -10
  279. package/dist/server/ensureGlobalService.d.ts +5 -1
  280. package/dist/server/ensureGlobalService.js +35 -1
  281. package/dist/server/healthSurfaces.d.ts +6 -0
  282. package/dist/server/healthSurfaces.js +98 -0
  283. package/dist/server/http.d.ts +12 -1
  284. package/dist/server/http.js +1085 -485
  285. package/dist/server/listenHost.d.ts +5 -0
  286. package/dist/server/listenHost.js +56 -0
  287. package/dist/server/mcpHost.d.ts +10 -1
  288. package/dist/server/mcpHost.js +36 -6
  289. package/dist/server/operatorResults.d.ts +2 -2
  290. package/dist/server/operatorResults.js +40 -29
  291. package/dist/server/requestAuthContext.d.ts +12 -0
  292. package/dist/server/requestAuthContext.js +21 -0
  293. package/dist/server/shutdown.d.ts +69 -0
  294. package/dist/server/shutdown.js +219 -0
  295. package/dist/types/pipeline.d.ts +7 -0
  296. package/dist/types/stage.d.ts +8 -0
  297. package/dist/types/task.d.ts +8 -0
  298. package/dist/ui/assets/index-B6hlSXXn.js +120 -0
  299. package/dist/ui/index.html +1 -1
  300. package/examples/README.md +98 -0
  301. package/examples/archify-on-pr/README.md +213 -0
  302. package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
  303. package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
  304. package/examples/archify-on-pr/author-diagrams.yaml +106 -0
  305. package/examples/archify-on-pr/detect-changes.yaml +89 -0
  306. package/examples/ci-validate/README.md +35 -0
  307. package/examples/ci-validate/check.yaml +13 -0
  308. package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
  309. package/examples/ci-validate/validate.sh +5 -0
  310. package/examples/compliance-review-demo/README.md +125 -0
  311. package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
  312. package/examples/compliance-review-demo/connect-account.yaml +47 -0
  313. package/examples/compliance-review-demo/map-to-control.yaml +123 -0
  314. package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
  315. package/examples/compliance-review-demo/publish-report.yaml +79 -0
  316. package/examples/compliance-review-demo/review-verdict.yaml +122 -0
  317. package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
  318. package/examples/compliance-review-demo/store-evidence.yaml +143 -0
  319. package/examples/conditional-fork/README.md +89 -0
  320. package/examples/conditional-fork/branch-a.yaml +13 -0
  321. package/examples/conditional-fork/branch-b.yaml +13 -0
  322. package/examples/conditional-fork/decide.yaml +35 -0
  323. package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
  324. package/examples/conditional-fork/fork-demo.task.yaml +8 -0
  325. package/examples/context7-mcp/README.md +42 -0
  326. package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
  327. package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
  328. package/examples/context7-mcp/fetch-docs.yaml +52 -0
  329. package/examples/context7-mcp/resolve-library.yaml +31 -0
  330. package/examples/context7-mcp/write-brief.yaml +52 -0
  331. package/examples/feature-loop/README.md +104 -0
  332. package/examples/feature-loop/address-feedback.yaml +148 -0
  333. package/examples/feature-loop/align.yaml +116 -0
  334. package/examples/feature-loop/decompose.yaml +86 -0
  335. package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
  336. package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
  337. package/examples/feature-loop/feature-loop.task.yaml +25 -0
  338. package/examples/feature-loop/implement.yaml +128 -0
  339. package/examples/feature-loop/plan.yaml +111 -0
  340. package/examples/feature-loop/publish.yaml +167 -0
  341. package/examples/feature-loop/review.yaml +146 -0
  342. package/examples/feature-loop/verify.yaml +106 -0
  343. package/examples/feedback-loop/README.md +72 -0
  344. package/examples/feedback-loop/VERIFY.md +208 -0
  345. package/examples/feedback-loop/continue-only.task.yaml +4 -0
  346. package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
  347. package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
  348. package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
  349. package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
  350. package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
  351. package/examples/feedback-loop/implement.yaml +14 -0
  352. package/examples/feedback-loop/plan.yaml +14 -0
  353. package/examples/feedback-loop/review.yaml +15 -0
  354. package/examples/feedback-loop/send-back-once.task.yaml +6 -0
  355. package/examples/feedback-loop/submit.yaml +12 -0
  356. package/examples/generic-fan-in/README.md +151 -0
  357. package/examples/generic-fan-in/clarify.yaml +18 -0
  358. package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
  359. package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
  360. package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
  361. package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
  362. package/examples/generic-fan-in/research.yaml +45 -0
  363. package/examples/generic-fan-in/synthesize.yaml +66 -0
  364. package/examples/generic-fan-in/validation.yaml +45 -0
  365. package/examples/github-release/README.md +78 -0
  366. package/examples/github-release/draft-release-notes.yaml +64 -0
  367. package/examples/github-release/github-release.pipeline.yaml +11 -0
  368. package/examples/github-release/github-release.task.yaml +13 -0
  369. package/examples/github-release/publish-github-release.yaml +64 -0
  370. package/examples/hello-world/README.md +28 -0
  371. package/examples/hello-world/hello.pipeline.yaml +4 -0
  372. package/examples/hello-world/my-task.task.yaml +6 -0
  373. package/examples/hello-world/research.yaml +18 -0
  374. package/examples/mcp-hitl-tour/README.md +113 -0
  375. package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
  376. package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
  377. package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
  378. package/examples/mcp-hitl-tour/gather.yaml +31 -0
  379. package/examples/mcp-hitl-tour/intake.yaml +62 -0
  380. package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
  381. package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
  382. package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
  383. package/examples/mcp-hitl-tour/polish.yaml +33 -0
  384. package/examples/mcp-hitl-tour/review.yaml +17 -0
  385. package/examples/mcp-hitl-tour/ship.yaml +25 -0
  386. package/examples/oss-issue-contribution/README.md +218 -0
  387. package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
  388. package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
  389. package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
  390. package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
  391. package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
  392. package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
  393. package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
  394. package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
  395. package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
  396. package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
  397. package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
  398. package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
  399. package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
  400. package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
  401. package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
  402. package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
  403. package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
  404. package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
  405. package/examples/oss-quick-fix/README.md +65 -0
  406. package/examples/oss-quick-fix/implement-fix.yaml +84 -0
  407. package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
  408. package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
  409. package/examples/oss-quick-fix/ship-fix.yaml +81 -0
  410. package/examples/oss-quick-fix/understand-issue.yaml +67 -0
  411. package/examples/oss-quick-fix/verify-fix.yaml +73 -0
  412. package/examples/plan-review/README.md +37 -0
  413. package/examples/plan-review/plan-review-followup.yaml +13 -0
  414. package/examples/plan-review/plan-review.pipeline.yaml +9 -0
  415. package/examples/plan-review/plan-review.task.yaml +9 -0
  416. package/examples/plan-review/plan-review.yaml +25 -0
  417. package/examples/playwright-mcp/README.md +39 -0
  418. package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
  419. package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
  420. package/examples/playwright-mcp/screenshot.yaml +40 -0
  421. package/examples/retry-tour/README.md +75 -0
  422. package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
  423. package/examples/retry-tour/retry-tour.task.yaml +9 -0
  424. package/examples/route-if-tour/README.md +202 -0
  425. package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
  426. package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
  427. package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
  428. package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
  429. package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
  430. package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
  431. package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
  432. package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
  433. package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
  434. package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
  435. package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
  436. package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
  437. package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
  438. package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
  439. package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
  440. package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
  441. package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
  442. package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
  443. package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
  444. package/examples/route-wiring-smoke-test/README.md +377 -0
  445. package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
  446. package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
  447. package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
  448. package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
  449. package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
  450. package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
  451. package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
  452. package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
  453. package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
  454. package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
  455. package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
  456. package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
  457. package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
  458. package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
  459. package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
  460. package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
  461. package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
  462. package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
  463. package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
  464. package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
  465. package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
  466. package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
  467. package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
  468. package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
  469. package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
  470. package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
  471. package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
  472. package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
  473. package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
  474. package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
  475. package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
  476. package/examples/ship-feature/README.md +190 -0
  477. package/examples/ship-feature/feat-address-feedback.yaml +119 -0
  478. package/examples/ship-feature/feat-implement.yaml +180 -0
  479. package/examples/ship-feature/feat-plan.yaml +120 -0
  480. package/examples/ship-feature/feat-review.yaml +109 -0
  481. package/examples/ship-feature/feat-ship.yaml +203 -0
  482. package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
  483. package/examples/ship-feature/ship-feature.task.yaml +78 -0
  484. package/examples/stage-mcp/README.md +144 -0
  485. package/examples/stage-mcp/echo-mcp.mjs +20 -0
  486. package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
  487. package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
  488. package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
  489. package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
  490. package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
  491. package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
  492. package/examples/stage-mcp/use-echo.yaml +20 -0
  493. package/examples/verify-tour/README.md +80 -0
  494. package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
  495. package/examples/verify-tour/verify-tour.task.yaml +11 -0
  496. package/package.json +6 -1
  497. package/skills/stageflow/SKILL.md +6 -6
  498. package/skills/stageflow/references/control-surface.md +11 -5
  499. package/skills/stageflow/scripts/detect-host.mjs +14 -1
  500. package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
  501. package/skills/stageflow-author/SKILL.md +4 -3
  502. package/skills/stageflow-author/references/catalog-mapping.md +16 -0
  503. package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
  504. package/skills/stageflow-run/SKILL.md +20 -12
  505. package/skills/stageflow-run/references/mcp-call.md +9 -1
  506. package/skills/stageflow-run/references/task-and-pipeline-selection.md +16 -5
  507. package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
  508. package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
  509. package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
  510. package/skills/stageflow-setup/SKILL.md +40 -8
  511. package/dist/ui/assets/index-Da5EHU6M.js +0 -119
@@ -0,0 +1,45 @@
1
+ id: research
2
+ system_prompt: |
3
+ You are the research branch of a diamond join. Follow these steps exactly:
4
+
5
+ 1. Call ask_operator with kind free_text. Ask the operator to reply with
6
+ exactly one of:
7
+ ok <finding>
8
+ fail
9
+ Tell them <finding> is one token (letters, digits, or hyphen). Examples:
10
+ ok glaciers
11
+ fail
12
+ 2. Wait for the operator answer. Do not emit before you have that answer.
13
+ 3. If the answer is fail (optionally with surrounding whitespace), emit
14
+ emit_stage_envelope with status failure, a short summary that research
15
+ failed, artifacts [], and no payload.
16
+ 4. If the answer is ok followed by a finding token:
17
+ emit status success, artifacts [], payload { "finding": "<that token>" },
18
+ and a summary that includes the word research and the finding token.
19
+ Use the token after ok as-is; do not invent a different word.
20
+ 5. If the answer is ok with no token, or anything else, emit status failure
21
+ explaining the reply was not ok <finding> or fail.
22
+
23
+ Rules:
24
+ - Never emit before the operator answers.
25
+ - Do not call ask_operator more than once.
26
+ model: cursor/auto
27
+ io:
28
+ input:
29
+ schema:
30
+ type: object
31
+ required:
32
+ - brief
33
+ properties:
34
+ brief:
35
+ type: string
36
+ output:
37
+ schema:
38
+ type: object
39
+ required:
40
+ - finding
41
+ properties:
42
+ finding:
43
+ type: string
44
+ gate_kinds:
45
+ - free_text
@@ -0,0 +1,66 @@
1
+ id: synthesize
2
+ system_prompt: |
3
+ You are the diamond join. The prompt includes priorEnvelopesByStage — a
4
+ record keyed in YAML declaration order (research, then validation).
5
+ priorEnvelope is null. There is no clone-list priorEnvelopes field.
6
+
7
+ Call emit_stage_envelope exactly once. Do not call ask_operator.
8
+
9
+ 1. Read priorEnvelopesByStage.research and priorEnvelopesByStage.validation.
10
+ Do not invent keys. Do not reorder keys.
11
+ 2. For each parent, copy status, summary, and payload.finding when present.
12
+ If a parent is a failure envelope with no finding, omit finding.
13
+ 3. Emit status success, artifacts [], and payload:
14
+ {
15
+ "received": {
16
+ "research": { "status": "…", "summary": "…", "finding": "…" },
17
+ "validation": { "status": "…", "summary": "…", "finding": "…" }
18
+ }
19
+ }
20
+ Include finding only when that parent payload had it.
21
+ 4. Summary must mention both parent keys and their status values, for
22
+ example: received research=success glaciers; validation=success citations
23
+
24
+ Rules:
25
+ - Copy from priorEnvelopesByStage only. Do not use a single priorEnvelope.
26
+ model: cursor/auto
27
+ io:
28
+ input:
29
+ schema:
30
+ type: object
31
+ output:
32
+ schema:
33
+ type: object
34
+ required:
35
+ - received
36
+ properties:
37
+ received:
38
+ type: object
39
+ required:
40
+ - research
41
+ - validation
42
+ properties:
43
+ research:
44
+ type: object
45
+ required:
46
+ - status
47
+ - summary
48
+ properties:
49
+ status:
50
+ type: string
51
+ summary:
52
+ type: string
53
+ finding:
54
+ type: string
55
+ validation:
56
+ type: object
57
+ required:
58
+ - status
59
+ - summary
60
+ properties:
61
+ status:
62
+ type: string
63
+ summary:
64
+ type: string
65
+ finding:
66
+ type: string
@@ -0,0 +1,45 @@
1
+ id: validation
2
+ system_prompt: |
3
+ You are the validation branch of a diamond join. Follow these steps exactly:
4
+
5
+ 1. Call ask_operator with kind free_text. Ask the operator to reply with
6
+ exactly one of:
7
+ ok <finding>
8
+ fail
9
+ Tell them <finding> is one token (letters, digits, or hyphen). Examples:
10
+ ok citations
11
+ fail
12
+ 2. Wait for the operator answer. Do not emit before you have that answer.
13
+ 3. If the answer is fail (optionally with surrounding whitespace), emit
14
+ emit_stage_envelope with status failure, a short summary that validation
15
+ failed, artifacts [], and no payload.
16
+ 4. If the answer is ok followed by a finding token:
17
+ emit status success, artifacts [], payload { "finding": "<that token>" },
18
+ and a summary that includes the word validation and the finding token.
19
+ Use the token after ok as-is; do not invent a different word.
20
+ 5. If the answer is ok with no token, or anything else, emit status failure
21
+ explaining the reply was not ok <finding> or fail.
22
+
23
+ Rules:
24
+ - Never emit before the operator answers.
25
+ - Do not call ask_operator more than once.
26
+ model: cursor/auto
27
+ io:
28
+ input:
29
+ schema:
30
+ type: object
31
+ required:
32
+ - brief
33
+ properties:
34
+ brief:
35
+ type: string
36
+ output:
37
+ schema:
38
+ type: object
39
+ required:
40
+ - finding
41
+ properties:
42
+ finding:
43
+ type: string
44
+ gate_kinds:
45
+ - free_text
@@ -0,0 +1,78 @@
1
+ # github-release
2
+
3
+ Dogfood release automation: draft operator-facing GitHub release notes, then publish with `gh`. This is an **ops / release example** — not SDLC planning.
4
+
5
+ Stageflow uses this catalog in `.github/workflows/publish.yml` and `release.yml` when publishing new npm versions.
6
+
7
+ One GitHub Release is created for the current tag. The notes body includes **every CHANGELOG version since the last GitHub Release**, not only the latest `package.json` bump. A publish that jumps from `0.3.0` to `0.8.0` therefore includes headings for `0.4.0` through `0.8.0`. Intermediate versions are not tagged or published as extra GitHub Releases.
8
+
9
+ ## Layout
10
+
11
+ | Path | Role |
12
+ |------|------|
13
+ | `github-release.pipeline.yaml` | Two-stage linear pipeline |
14
+ | `draft-release-notes.yaml` | Collect changelog, write `RELEASE_NOTES.md` artifact |
15
+ | `publish-github-release.yaml` | `gh release create` from prior artifact |
16
+ | `github-release.task.yaml` | Task bound at run time |
17
+
18
+ CI helpers: `scripts/release-range.mjs` resolves previous from published GitHub Releases (git tags if `gh` is unavailable) and extracts the CHANGELOG slice.
19
+
20
+ ## Prerequisites
21
+
22
+ - Node.js ≥ 20, Stageflow installed
23
+ - **Cursor** (`cursor/composer-2-5`) — set `CURSOR_API_KEY` and install `pi-cursor-sdk` (`pi install npm:pi-cursor-sdk`, or `npm i --prefix ~/.pi/agent/npm pi-cursor-sdk`)
24
+ - **`gh` CLI** and `GH_TOKEN` or `GITHUB_TOKEN` for publish stage
25
+ - Git checkout of the Stageflow repo (stages read version/tags from the bound checkout)
26
+
27
+ Optional env vars (set by publish workflow): `RELEASE_VERSION`, `RELEASE_TAG`, `RELEASE_PREVIOUS`, `RELEASE_CHANGELOG_SLICE`, `GITHUB_SHA`, `DRY_RUN=1` to skip actual release creation.
28
+
29
+ `RELEASE_PREVIOUS` is the last published GitHub Release version, not `HEAD^` `package.json`. `RELEASE_CHANGELOG_SLICE` is a markdown file of CHANGELOG sections in that range (workflows write `changelog-slice.md` before `sf run`).
30
+
31
+ ## Commands
32
+
33
+ From the **repository git root**:
34
+
35
+ ```bash
36
+ sf validate --strict
37
+ export CURSOR_API_KEY=…
38
+ export GH_TOKEN=…
39
+ CURRENT="$(node -p "require('./package.json').version")"
40
+ PREVIOUS="$(node scripts/release-range.mjs previous --current "$CURRENT")"
41
+ if [ -n "$PREVIOUS" ]; then
42
+ node scripts/release-range.mjs changelog --after "$PREVIOUS" --through "$CURRENT" > changelog-slice.md
43
+ else
44
+ node scripts/release-range.mjs changelog --through "$CURRENT" > changelog-slice.md
45
+ fi
46
+ export RELEASE_VERSION="$CURRENT" RELEASE_TAG="v${CURRENT}" RELEASE_PREVIOUS="$PREVIOUS" RELEASE_CHANGELOG_SLICE="$PWD/changelog-slice.md"
47
+ sf run \
48
+ --pipeline examples/github-release/github-release.pipeline.yaml \
49
+ --task examples/github-release/github-release.task.yaml \
50
+ --checkout "$PWD"
51
+ ```
52
+
53
+ For a dry run (no GitHub release created):
54
+
55
+ ```bash
56
+ DRY_RUN=1 sf run \
57
+ --pipeline examples/github-release/github-release.pipeline.yaml \
58
+ --task examples/github-release/github-release.task.yaml \
59
+ --checkout "$PWD"
60
+ ```
61
+
62
+ ## Repair published notes
63
+
64
+ If a GitHub Release was published with only the latest version's notes, run **Repair GitHub Release notes** from the Actions tab (`workflow_dispatch`). It overwrites that release's body with every CHANGELOG section since the previous GitHub Release. It does not create tags.
65
+
66
+ | Input | Effect |
67
+ |-------|--------|
68
+ | *(empty)* | Repair the latest GitHub Release (closes the current `v0.8.0` gap) |
69
+ | `tag` | Repair one tag (`v0.8.0` or `0.8.0`) |
70
+ | `all` | Repair every published GitHub Release |
71
+ | `dry_run` | Print notes in the job log; do not edit GitHub |
72
+
73
+ Use the branch that contains `scripts/release-range.mjs` (this change must be on the branch you run). Locally:
74
+
75
+ ```bash
76
+ node scripts/release-range.mjs repair --dry-run true
77
+ node scripts/release-range.mjs repair --tag v0.8.0
78
+ ```
@@ -0,0 +1,64 @@
1
+ id: draft-release-notes
2
+ system_prompt: |
3
+ Do exactly one thing: write GitHub release notes for this publish.
4
+
5
+ The bound checkout is the Stageflow git repository (agent cwd). Read
6
+ RELEASE_VERSION, RELEASE_TAG, RELEASE_PREVIOUS, and
7
+ RELEASE_CHANGELOG_SLICE from the environment when they are set.
8
+
9
+ RELEASE_PREVIOUS is the last published GitHub Release (or last v* git
10
+ tag), not the previous package.json bump. If it is missing, read
11
+ version from package.json, use tag v<version>, and resolve previous
12
+ the same way: last GitHub Release, else latest v* git tag that is
13
+ strictly older than the current version. Do not use HEAD^ package.json
14
+ as previous.
15
+
16
+ Notes must cover every version after previous through current,
17
+ inclusive. A jump from 0.3.0 to 0.8.0 must include 0.4.0, 0.5.0,
18
+ 0.6.0, 0.7.0, and 0.8.0 as separate headings. Do not collapse the
19
+ range into the latest version only.
20
+
21
+ Source of truth for those sections:
22
+ - If RELEASE_CHANGELOG_SLICE is set, read that file first (absolute
23
+ or repo-relative). Keep every ## [x.y.z] section it contains.
24
+ - Else read CHANGELOG.md and take every ## [x.y.z] heading where
25
+ version is greater than previous and less than or equal to current.
26
+ You may polish wording for GitHub (short summary, Features / Fixes /
27
+ Docs) but do not drop a version or invent commits, PRs, or features.
28
+ If CHANGELOG is missing a version in the range, fill that version
29
+ from git log v$PREVIOUS..HEAD (or the first commit of previous
30
+ through HEAD). You may also use gh to list merged PRs in that range.
31
+
32
+ Write RELEASE_NOTES.md via write_stage_artifact. Newest version first.
33
+ Not a raw git log dump. Not "bumped the version" as the only content.
34
+ Do not create a git tag. Do not call gh release create. Do not call
35
+ ask_operator. Do not stop after a chat reply.
36
+
37
+ Call emit_stage_envelope exactly once with status success, that artifact
38
+ path, a one-sentence summary, and a payload matching the stage schema.
39
+ included_versions lists every x.y.z heading in the notes, newest first.
40
+ model: cursor/composer-2-5
41
+ io:
42
+ input:
43
+ schema:
44
+ type: object
45
+ output:
46
+ schema:
47
+ type: object
48
+ required:
49
+ - version
50
+ - tag
51
+ - previous_version
52
+ - included_versions
53
+ properties:
54
+ version:
55
+ type: string
56
+ tag:
57
+ type: string
58
+ previous_version:
59
+ type: string
60
+ included_versions:
61
+ type: array
62
+ items:
63
+ type: string
64
+ additionalProperties: false
@@ -0,0 +1,11 @@
1
+ id: github-release
2
+ stages:
3
+ - id: draft-release-notes
4
+ entry: true
5
+ route:
6
+ - to: publish-github-release
7
+ uses: ./draft-release-notes.yaml
8
+ - id: publish-github-release
9
+ uses: ./publish-github-release.yaml
10
+ secrets:
11
+ - GITHUB_TOKEN
@@ -0,0 +1,13 @@
1
+ id: github-release
2
+ goal: Draft operator-facing GitHub release notes for every version since the last GitHub Release, then publish them as one GitHub Release for the current tag.
3
+ context: |
4
+ Bound checkout is the Stageflow repository. Current version, tag,
5
+ previous published GitHub Release, and optional changelog slice path
6
+ are in RELEASE_VERSION, RELEASE_TAG, RELEASE_PREVIOUS, and
7
+ RELEASE_CHANGELOG_SLICE when those env vars are set; otherwise read
8
+ them from package.json, git tags / GitHub Releases, and CHANGELOG.md.
9
+ constraints: |
10
+ No HITL. Do not call ask_operator. Stage 1 writes notes that include
11
+ a heading for every CHANGELOG version after previous through current.
12
+ Stage 2 only publishes those notes with gh for the current tag. Do
13
+ not use GitHub auto-generated notes. Do not create extra tags.
@@ -0,0 +1,64 @@
1
+ id: publish-github-release
2
+ system_prompt: |
3
+ Do exactly one thing: publish the prior stage's release notes as a
4
+ GitHub Release.
5
+
6
+ Use the prior envelope for version, tag, previous_version, and the
7
+ RELEASE_NOTES.md artifact path. Read that file from the factory run
8
+ workspace (STAGEFLOW_RUN_WORKSPACE plus the run-relative artifact
9
+ path). Do not rewrite or regenerate the notes. Do not call
10
+ --generate-notes. Do not call ask_operator.
11
+
12
+ Target commit is GITHUB_SHA if set, otherwise git rev-parse HEAD.
13
+ Auth uses GIT_ASKPASS from a declared secrets: [GITHUB_TOKEN] grant
14
+ (file-backed helper — not ambient GH_TOKEN/GITHUB_TOKEN). gh is on PATH.
15
+
16
+ If DRY_RUN is 1, do not create the release. Write publish.md via
17
+ write_stage_artifact recording the gh command you would have run,
18
+ then emit success with published false and html_url empty.
19
+
20
+ Otherwise run:
21
+ gh release create "$TAG" --title "$TAG" --target "$SHA" --notes-file "$NOTES_PATH"
22
+ Confirm with gh release view. Write publish.md via write_stage_artifact
23
+ with the tag and html_url. If the release already exists, emit status
24
+ failure. Do not stop after a chat reply.
25
+
26
+ Call emit_stage_envelope exactly once with status, that artifact path,
27
+ a one-sentence summary, and a payload matching the stage schema.
28
+ model: cursor/composer-2-5
29
+ io:
30
+ input:
31
+ schema:
32
+ type: object
33
+ required:
34
+ - version
35
+ - tag
36
+ - previous_version
37
+ - included_versions
38
+ properties:
39
+ version:
40
+ type: string
41
+ tag:
42
+ type: string
43
+ previous_version:
44
+ type: string
45
+ included_versions:
46
+ type: array
47
+ items:
48
+ type: string
49
+ additionalProperties: false
50
+ output:
51
+ schema:
52
+ type: object
53
+ required:
54
+ - tag
55
+ - published
56
+ - html_url
57
+ properties:
58
+ tag:
59
+ type: string
60
+ published:
61
+ type: boolean
62
+ html_url:
63
+ type: string
64
+ additionalProperties: false
@@ -0,0 +1,28 @@
1
+ # hello-world
2
+
3
+ Minimal single-stage pipeline. Domain-neutral — the stage id and prompts are yours to define.
4
+
5
+ ## What this demonstrates
6
+
7
+ - **`task.input` ↔ entry `io.input.schema`** — `my-task.task.yaml` supplies a structured `input` object; the entry stage (`research.yaml`) declares matching `io.input.schema`.
8
+ - **Unmet entry input** — if the entry stage declares `io.input` and the task omits `input`, `sf validate` of each file alone still succeeds; start-run / `preparePipeline` warn with `task.entry_input_unmet` and continue (existing product behavior).
9
+
10
+ This catalog uses `io` only (no `verify` / `on_verify_fail`). For upgrading older field names, see [YAML catalog — Upgrading older catalogs](../../docs/yaml-catalog.md#upgrading-older-catalogs).
11
+
12
+ ## Prerequisites
13
+
14
+ - Node.js ≥ 20, Stageflow installed (`npm i -g stageflow`)
15
+ - A Pi-compatible provider connected via `sf ui` or `sf providers login`
16
+
17
+ ## Commands
18
+
19
+ From the **repository git root**:
20
+
21
+ ```bash
22
+ sf validate --pipeline examples/hello-world/hello.pipeline.yaml --strict
23
+ sf run \
24
+ --pipeline examples/hello-world/hello.pipeline.yaml \
25
+ --task examples/hello-world/my-task.task.yaml
26
+ ```
27
+
28
+ Use `sf ui` (from any subdirectory) to watch the run and inspect the stage envelope.
@@ -0,0 +1,4 @@
1
+ id: hello
2
+ stages:
3
+ - id: research
4
+ uses: ./research.yaml
@@ -0,0 +1,6 @@
1
+ id: my-task
2
+ goal: Draft a one-page brief on a topic of your choice
3
+ context: Domain-neutral hello-world run
4
+ constraints: Docs only; no implementation code
5
+ input:
6
+ topic: Calendar apps for personal productivity
@@ -0,0 +1,18 @@
1
+ id: research
2
+ system_prompt: |
3
+ Summarize the task goal for the given topic and list open questions.
4
+ The topic arrives as task input (and as this stage's io.input payload).
5
+ model: anthropic/claude-sonnet-4-5
6
+ io:
7
+ input:
8
+ schema:
9
+ type: object
10
+ required:
11
+ - topic
12
+ properties:
13
+ topic:
14
+ type: string
15
+ additionalProperties: false
16
+ output:
17
+ schema:
18
+ type: object
@@ -0,0 +1,113 @@
1
+ # mcp-hitl-tour
2
+
3
+ MCP-first walkthrough: **HITL**, an ungated **fan-out/join**, a small **Clone
4
+ Chain**, a **guaranteed feedback loop** that parks for `decide_feedback_loop`,
5
+ and **artifacts** you can read back with `read_artifact`.
6
+
7
+ Domain-neutral — it writes a short brief. Use it to see how an operator-host
8
+ MCP client starts a run, asks the operator at each HITL gate, inspects a
9
+ stage, and decides the loop.
10
+
11
+ This DAG does **not** exclusive-route. Exclusive Route `if` into a shared join
12
+ can leave the unused arm `pending`, so the join never becomes runnable. Here
13
+ both arms always run; `polish` waits for two successes, not a skip.
14
+
15
+ ```
16
+ start_run → wait_run → answer_gate (intake) → wait_run
17
+ → review send_back → polish replay → review send_back
18
+ → decide_feedback_loop → wait_run until terminal
19
+ → get_run / list_stage_events / get_envelope / read_artifact
20
+ ```
21
+
22
+ ## What it exercises
23
+
24
+ | Stage | Why it is here |
25
+ |-------|----------------|
26
+ | `intake` | `gate_kinds: [free_text]` — MCP `answer_gate`. Emits `payload.audience`. Writes `intake.md`. |
27
+ | Fan-out | Intake lists `emit-angles` and `draft-short` with **no** `if`. Both always run. |
28
+ | `emit-angles` → `draft-angle` → `gather` | Sequential Clone Chain, `clone_cap: 2`. Clone workers write `angle.md`. |
29
+ | `draft-short` | Parallel short take. Writes `short.md`. |
30
+ | `polish` | Join of `gather` and `draft-short`. Writes `brief.md`. Loop target. |
31
+ | `review` | Always `send_back` polish. `{ type: loop }`, `max_replays: 1`, `on_max_replays: wait_for_human` — one replay, then operator HITL. |
32
+ | `ship` | `replay_safe: false`. Writes `ship.md`. |
33
+
34
+ `describe_pipeline` should show `entry`, clone fields, `feedback_loop`,
35
+ `gate_kinds` on intake, and `replay_safe` on ship. It should **not** show
36
+ inbound `if` on the intake children.
37
+
38
+ ```
39
+ intake (free_text HITL)
40
+ ├─ emit-angles → draft-angle×2 → gather ─┐
41
+ └─ draft-short ──────────────────────────┴→ polish ► review ⇄ polish ► ship
42
+ ```
43
+
44
+ ## Prerequisites
45
+
46
+ - This Stageflow checkout, built (`npm run build && npm run ui:build`)
47
+ - Provider auth connected
48
+ - An MCP client (Cursor on **another** project is fine) pointed at `http://127.0.0.1:3847/mcp`
49
+
50
+ Host the catalog from **this git root** so `list_pipelines` includes this example:
51
+
52
+ ```bash
53
+ cd /path/to/stageflow
54
+ node dist/cli.js ui
55
+ ```
56
+
57
+ ## MCP walkthrough
58
+
59
+ From a consumer Cursor chat with Stageflow MCP loaded:
60
+
61
+ 1. `describe_pipeline` `{ "pipeline": "examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml" }`
62
+ 2. `start_run` with
63
+ - `pipeline`: `examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml`
64
+ - `task_path`: `examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml`
65
+ 3. `wait_run` `{ "runId": "…", "until": "waiting" }`
66
+ 4. Present the intake prompt to the operator. `answer_gate` — `stageId` is
67
+ `intake`, `kind` is `free_text`, `text` is `operators` or `executives`,
68
+ `promptId` from the pending prompt. Do not invent the reply.
69
+ 5. `wait_run` `{ "runId": "…", "until": "waiting" }` — review sends the brief
70
+ back once (polish replays), then parks (`waiting_kind` is
71
+ `feedback_loop_decision`)
72
+ 6. Present the loop decision to the operator. `decide_feedback_loop` with
73
+ `decision: "continue"` (or `extend` / `abandon`)
74
+ 7. `wait_run` `{ "runId": "…", "until": "terminal" }`
75
+ 8. `get_run` — artifact paths, `total_cost_usd` when the store has it
76
+ 9. `read_artifact` `intake.md` / `short.md` / `angles-brief.md` / `brief.md` /
77
+ `ship.md` (use the paths `get_run` returned)
78
+ 10. `list_stage_events` `{ "runId": "…", "stageId": "intake" }`
79
+ 11. `get_envelope` `{ "runId": "…", "stageId": "intake" }` — `payload.audience`
80
+ matches the gate reply
81
+
82
+ The exhaust task (`mcp-hitl-tour-exhaust.task.yaml`) is the same walkthrough.
83
+
84
+ ## Validate
85
+
86
+ ```bash
87
+ node dist/cli.js validate --pipeline examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml --strict
88
+ ```
89
+
90
+ ## Layout
91
+
92
+ ```
93
+ examples/mcp-hitl-tour/
94
+ mcp-hitl-tour.pipeline.yaml
95
+ mcp-hitl-tour.task.yaml
96
+ mcp-hitl-tour-exhaust.task.yaml
97
+ intake.yaml
98
+ emit-angles.yaml
99
+ draft-angle.yaml
100
+ gather.yaml
101
+ draft-short.yaml
102
+ polish.yaml
103
+ review.yaml
104
+ ship.yaml
105
+ ```
106
+
107
+ ## References
108
+
109
+ - [MCP](../../docs/mcp.md)
110
+ - [HITL](../../docs/hitl.md)
111
+ - [YAML catalog — Generic fan-in](../../docs/yaml-catalog.md#generic-fan-in)
112
+ - [YAML catalog — Clone Chain](../../docs/yaml-catalog.md#clone-chain)
113
+ - [YAML catalog — Feedback loops](../../docs/yaml-catalog.md#feedback-loops)
@@ -0,0 +1,33 @@
1
+ id: draft-angle
2
+ system_prompt: |
3
+ Draft one clone angle. Your io.input is a single Angle (id, title, topic).
4
+ Write 5–8 sentences. Do not cover the other clone's title.
5
+
6
+ 1. Call write_stage_artifact with path angle.md for this id and title.
7
+ 2. Emit success with artifacts [angle.md] and payload
8
+ { "id": "<input id>", "title": "<input title>" }.
9
+ io:
10
+ input:
11
+ schema:
12
+ $ref: "#/schemas/Angle"
13
+ output:
14
+ schema:
15
+ type: object
16
+ required: [id, title]
17
+ properties:
18
+ id:
19
+ type: string
20
+ title:
21
+ type: string
22
+ verify:
23
+ - id: angle-declared
24
+ type: artifact
25
+ basename: angle.md
26
+ when:
27
+ - emit
28
+ - id: angle-on-disk
29
+ type: artifact
30
+ path: angle.md
31
+ nonempty: true
32
+ when:
33
+ - after
@@ -0,0 +1,32 @@
1
+ id: draft-short
2
+ system_prompt: |
3
+ Write one short take on the intake topic for payload.audience.
4
+
5
+ This arm always runs alongside the Clone Chain. Do not skip clone work;
6
+ just write this one-page take.
7
+
8
+ 1. Call write_stage_artifact with path short.md (one page, headings allowed).
9
+ 2. Emit success with artifacts [short.md] and payload { "kind": "short" }.
10
+ io:
11
+ input:
12
+ schema:
13
+ type: object
14
+ output:
15
+ schema:
16
+ type: object
17
+ required: [kind]
18
+ properties:
19
+ kind:
20
+ type: string
21
+ verify:
22
+ - id: short-declared
23
+ type: artifact
24
+ basename: short.md
25
+ when:
26
+ - emit
27
+ - id: short-on-disk
28
+ type: artifact
29
+ path: short.md
30
+ nonempty: true
31
+ when:
32
+ - after
@@ -0,0 +1,45 @@
1
+ id: emit-angles
2
+ system_prompt: |
3
+ Split the intake topic into exactly two short angles for sequential clone
4
+ workers. Do not write the briefs here.
5
+
6
+ 1. Read payload.topic from the intake envelope.
7
+ 2. Invent two non-overlapping angles (id kebab-case, title, same topic).
8
+ 3. Call write_stage_artifact with path angles.md listing both ids and titles.
9
+ 4. Emit exactly one success envelope with artifacts [angles.md] and payload:
10
+ {
11
+ "items": [
12
+ { "id": "…", "title": "…", "topic": "<intake topic>" },
13
+ { "id": "…", "title": "…", "topic": "<intake topic>" }
14
+ ],
15
+ "summary": "two angles"
16
+ }
17
+
18
+ Emit exactly two items. Never zero, never more than two.
19
+ io:
20
+ input:
21
+ schema:
22
+ type: object
23
+ output:
24
+ schema:
25
+ type: object
26
+ required: [items]
27
+ properties:
28
+ items:
29
+ type: array
30
+ items:
31
+ $ref: "#/schemas/Angle"
32
+ summary:
33
+ type: string
34
+ verify:
35
+ - id: angles-declared
36
+ type: artifact
37
+ basename: angles.md
38
+ when:
39
+ - emit
40
+ - id: angles-on-disk
41
+ type: artifact
42
+ path: angles.md
43
+ nonempty: true
44
+ when:
45
+ - after