stageflow 0.25.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 (501) hide show
  1. package/README.md +10 -3
  2. package/dist/a2a/contracts.d.ts +1 -0
  3. package/dist/a2a/contracts.js +1 -0
  4. package/dist/a2a/registry.d.ts +2 -0
  5. package/dist/a2a/registry.js +20 -1
  6. package/dist/a2a/server.d.ts +7 -0
  7. package/dist/a2a/server.js +5 -2
  8. package/dist/a2a/service.d.ts +1 -1
  9. package/dist/a2a/service.js +57 -8
  10. package/dist/a2a/store.d.ts +8 -5
  11. package/dist/a2a/store.js +24 -67
  12. package/dist/agent/activity.d.ts +3 -0
  13. package/dist/agent/bootProviderConfig.d.ts +21 -0
  14. package/dist/agent/bootProviderConfig.js +74 -0
  15. package/dist/agent/piAdapter.d.ts +9 -1
  16. package/dist/agent/piAdapter.js +58 -3
  17. package/dist/agent/piIsolatedMcp.d.ts +2 -0
  18. package/dist/agent/piIsolatedMcp.js +10 -2
  19. package/dist/agent/port.d.ts +6 -0
  20. package/dist/agent/streamLogRedact.d.ts +1 -1
  21. package/dist/agent/streamLogRedact.js +4 -11
  22. package/dist/cli/artifactCommand.js +9 -16
  23. package/dist/cli/backupCommand.d.ts +9 -0
  24. package/dist/cli/backupCommand.js +111 -0
  25. package/dist/cli/debugRunCommand.d.ts +10 -0
  26. package/dist/cli/debugRunCommand.js +109 -0
  27. package/dist/cli/doctorCommand.d.ts +32 -0
  28. package/dist/cli/doctorCommand.js +453 -0
  29. package/dist/cli/envelopeCommand.js +9 -2
  30. package/dist/cli/exportAllCommand.d.ts +55 -0
  31. package/dist/cli/exportAllCommand.js +218 -0
  32. package/dist/cli/exportRunCommand.js +23 -21
  33. package/dist/cli/hostClient.d.ts +21 -3
  34. package/dist/cli/hostClient.js +93 -12
  35. package/dist/cli/initTemplates.d.ts +1 -1
  36. package/dist/cli/initTemplates.js +8 -1
  37. package/dist/cli/resolveSafeOutPath.d.ts +2 -0
  38. package/dist/cli/resolveSafeOutPath.js +40 -0
  39. package/dist/cli/restoreCommand.d.ts +10 -0
  40. package/dist/cli/restoreCommand.js +90 -0
  41. package/dist/cli/runCommand.d.ts +3 -2
  42. package/dist/cli/runCommand.js +93 -11
  43. package/dist/cli/runOutput.d.ts +4 -0
  44. package/dist/cli/runOutput.js +33 -7
  45. package/dist/cli/runStageCommand.d.ts +1 -0
  46. package/dist/cli/runStageCommand.js +44 -25
  47. package/dist/cli/runsCommand.d.ts +1 -1
  48. package/dist/cli/runsCommand.js +162 -8
  49. package/dist/cli.js +171 -30
  50. package/dist/config/catalogRelativePath.d.ts +62 -0
  51. package/dist/config/catalogRelativePath.js +118 -0
  52. package/dist/config/configOrigin.d.ts +27 -0
  53. package/dist/config/configOrigin.js +59 -0
  54. package/dist/config/hostConfig.d.ts +55 -0
  55. package/dist/config/hostConfig.js +333 -0
  56. package/dist/config/listSkills.d.ts +26 -0
  57. package/dist/config/listSkills.js +190 -3
  58. package/dist/config/loadOutcome.d.ts +1 -1
  59. package/dist/config/loadPipeline.js +23 -2
  60. package/dist/config/loadStage.js +18 -0
  61. package/dist/config/loadTask.d.ts +2 -0
  62. package/dist/config/loadTask.js +57 -18
  63. package/dist/config/materializeStageModels.js +5 -1
  64. package/dist/config/mergePipelineIncludes.d.ts +3 -0
  65. package/dist/config/mergePipelineIncludes.js +19 -0
  66. package/dist/config/migrateYaml.js +6 -11
  67. package/dist/config/multiProjectCatalog.d.ts +30 -0
  68. package/dist/config/multiProjectCatalog.js +142 -0
  69. package/dist/config/normalizePipelineStageEntry.js +20 -1
  70. package/dist/config/pipelineStageKeys.js +2 -0
  71. package/dist/config/resolveCatalogRoots.d.ts +27 -0
  72. package/dist/config/resolveCatalogRoots.js +76 -0
  73. package/dist/config/resolveModel.d.ts +7 -1
  74. package/dist/config/resolveModel.js +11 -1
  75. package/dist/config/resolveStageMcpServers.d.ts +9 -1
  76. package/dist/config/resolveStageMcpServers.js +36 -9
  77. package/dist/config/secretFromEnvOrFile.d.ts +9 -0
  78. package/dist/config/secretFromEnvOrFile.js +34 -0
  79. package/dist/config/seededCatalog.d.ts +11 -0
  80. package/dist/config/seededCatalog.js +29 -0
  81. package/dist/config/toolRequires.d.ts +24 -0
  82. package/dist/config/toolRequires.js +115 -0
  83. package/dist/config/validateCatalog.d.ts +5 -1
  84. package/dist/config/validateCatalog.js +140 -1
  85. package/dist/diagnostics/checks.d.ts +39 -0
  86. package/dist/diagnostics/checks.js +135 -0
  87. package/dist/errors/codes.d.ts +14 -0
  88. package/dist/errors/codes.js +59 -0
  89. package/dist/git/cache.d.ts +14 -0
  90. package/dist/git/cache.js +150 -0
  91. package/dist/git/credentials.d.ts +9 -0
  92. package/dist/git/credentials.js +88 -0
  93. package/dist/git/errors.d.ts +20 -0
  94. package/dist/git/errors.js +94 -0
  95. package/dist/git/exec.d.ts +16 -0
  96. package/dist/git/exec.js +135 -0
  97. package/dist/git/operations.d.ts +29 -0
  98. package/dist/git/operations.js +153 -0
  99. package/dist/git/version.d.ts +1 -0
  100. package/dist/git/version.js +10 -0
  101. package/dist/logging/audit.d.ts +16 -0
  102. package/dist/logging/audit.js +19 -0
  103. package/dist/logging/commonWords.d.ts +2 -0
  104. package/dist/logging/commonWords.js +13 -0
  105. package/dist/logging/logger.d.ts +49 -0
  106. package/dist/logging/logger.js +193 -0
  107. package/dist/logging/namedSecrets.d.ts +6 -0
  108. package/dist/logging/namedSecrets.js +58 -0
  109. package/dist/logging/redact.d.ts +13 -0
  110. package/dist/logging/redact.js +88 -0
  111. package/dist/mcp/catalogTools.js +456 -80
  112. package/dist/mcp/checkoutTools.d.ts +52 -0
  113. package/dist/mcp/checkoutTools.js +332 -0
  114. package/dist/mcp/controlTools.js +179 -5
  115. package/dist/mcp/deps.d.ts +1 -0
  116. package/dist/mcp/getStartedTool.d.ts +3 -0
  117. package/dist/mcp/getStartedTool.js +62 -0
  118. package/dist/mcp/readArtifact.d.ts +11 -0
  119. package/dist/mcp/readArtifact.js +46 -30
  120. package/dist/mcp/server.js +1 -0
  121. package/dist/mcp/tools.js +4 -0
  122. package/dist/net/proxy.d.ts +14 -0
  123. package/dist/net/proxy.js +78 -0
  124. package/dist/package-meta.d.ts +2 -1
  125. package/dist/package-meta.js +2 -1
  126. package/dist/preflight/bash.d.ts +8 -0
  127. package/dist/preflight/bash.js +34 -0
  128. package/dist/preflight/claudeRoot.d.ts +11 -0
  129. package/dist/preflight/claudeRoot.js +23 -0
  130. package/dist/preflight/mcpCommands.d.ts +8 -0
  131. package/dist/preflight/mcpCommands.js +36 -0
  132. package/dist/preflight/pipelinePreflight.d.ts +40 -0
  133. package/dist/preflight/pipelinePreflight.js +192 -0
  134. package/dist/preflight/tls.d.ts +6 -0
  135. package/dist/preflight/tls.js +18 -0
  136. package/dist/preflight/toolchain.d.ts +45 -0
  137. package/dist/preflight/toolchain.js +219 -0
  138. package/dist/project/findProjectRoot.js +3 -4
  139. package/dist/project/globalHome.d.ts +7 -0
  140. package/dist/project/globalHome.js +63 -2
  141. package/dist/project/resolveProjectContext.js +2 -2
  142. package/dist/project/resolveStageflowContext.js +2 -2
  143. package/dist/projection/projectRun.d.ts +2 -1
  144. package/dist/projection/projectRun.js +1 -0
  145. package/dist/runstore/assertTmpdir.d.ts +1 -0
  146. package/dist/runstore/assertTmpdir.js +21 -0
  147. package/dist/runstore/backup.d.ts +52 -0
  148. package/dist/runstore/backup.js +292 -0
  149. package/dist/runstore/createStore.d.ts +18 -1
  150. package/dist/runstore/createStore.js +64 -5
  151. package/dist/runstore/debugBundle.d.ts +60 -0
  152. package/dist/runstore/debugBundle.js +143 -0
  153. package/dist/runstore/diskUsage.d.ts +50 -0
  154. package/dist/runstore/diskUsage.js +214 -0
  155. package/dist/runstore/exportRunPayload.d.ts +8 -0
  156. package/dist/runstore/exportRunPayload.js +23 -0
  157. package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
  158. package/dist/runstore/normalizeCatalogPath.js +10 -0
  159. package/dist/runstore/paths.d.ts +5 -0
  160. package/dist/runstore/paths.js +145 -1
  161. package/dist/runstore/port.d.ts +111 -13
  162. package/dist/runstore/port.js +8 -1
  163. package/dist/runstore/restore.d.ts +81 -0
  164. package/dist/runstore/restore.js +355 -0
  165. package/dist/runstore/retention.d.ts +27 -0
  166. package/dist/runstore/retention.js +74 -0
  167. package/dist/runstore/runManifest.d.ts +146 -0
  168. package/dist/runstore/runManifest.js +288 -0
  169. package/dist/runstore/runProjection.d.ts +3 -1
  170. package/dist/runstore/runProjection.js +63 -1
  171. package/dist/runstore/sqlite/SqliteRunStore.d.ts +28 -3
  172. package/dist/runstore/sqlite/SqliteRunStore.js +352 -219
  173. package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
  174. package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
  175. package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
  176. package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
  177. package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
  178. package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
  179. package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
  180. package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
  181. package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
  182. package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
  183. package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
  184. package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
  185. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
  186. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
  187. package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
  188. package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
  189. package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
  190. package/dist/runstore/sqlite/migrations/index.js +72 -0
  191. package/dist/runstore/sqlite/schema.d.ts +20 -1
  192. package/dist/runstore/sqlite/schema.js +277 -1
  193. package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
  194. package/dist/runstore/sqlite/storeOpenError.js +11 -0
  195. package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
  196. package/dist/runstore/sqlite/storeSchemaError.js +8 -0
  197. package/dist/runstore/stageExecution.js +3 -0
  198. package/dist/runstore/storeFilesystem.d.ts +32 -0
  199. package/dist/runstore/storeFilesystem.js +148 -0
  200. package/dist/runstore/trackProjection.js +2 -0
  201. package/dist/runstore/workspaceLayout.d.ts +13 -0
  202. package/dist/runstore/workspaceLayout.js +76 -0
  203. package/dist/runtime/completionCheckRunner.d.ts +3 -0
  204. package/dist/runtime/completionCheckRunner.js +45 -7
  205. package/dist/runtime/containerLimits.d.ts +16 -0
  206. package/dist/runtime/containerLimits.js +84 -0
  207. package/dist/runtime/credentialMaterialisation.d.ts +28 -0
  208. package/dist/runtime/credentialMaterialisation.js +128 -0
  209. package/dist/runtime/gitCheckoutCapability.js +7 -13
  210. package/dist/runtime/pipelineRunner.d.ts +36 -1
  211. package/dist/runtime/pipelineRunner.js +178 -17
  212. package/dist/runtime/pipelineScheduler.d.ts +15 -0
  213. package/dist/runtime/pipelineScheduler.js +135 -27
  214. package/dist/runtime/reloadRunCatalog.js +6 -1
  215. package/dist/runtime/repositoryMaterialize.d.ts +47 -0
  216. package/dist/runtime/repositoryMaterialize.js +235 -0
  217. package/dist/runtime/resumeTimedOut.d.ts +1 -1
  218. package/dist/runtime/resumeTimedOut.js +5 -2
  219. package/dist/runtime/runChangeBus.js +9 -0
  220. package/dist/runtime/runDeletion.d.ts +7 -0
  221. package/dist/runtime/runDeletion.js +37 -0
  222. package/dist/runtime/runManager.d.ts +158 -4
  223. package/dist/runtime/runManager.js +1596 -79
  224. package/dist/runtime/runRetentionSweep.d.ts +31 -0
  225. package/dist/runtime/runRetentionSweep.js +328 -0
  226. package/dist/runtime/runRetryCoordinator.d.ts +2 -0
  227. package/dist/runtime/runRetryCoordinator.js +19 -2
  228. package/dist/runtime/runSkills.d.ts +40 -0
  229. package/dist/runtime/runSkills.js +173 -0
  230. package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
  231. package/dist/runtime/stageAttemptBootstrap.js +195 -24
  232. package/dist/runtime/stageCacheEnv.d.ts +6 -0
  233. package/dist/runtime/stageCacheEnv.js +34 -0
  234. package/dist/runtime/stageConcurrency.d.ts +2 -1
  235. package/dist/runtime/stageConcurrency.js +4 -2
  236. package/dist/runtime/stageEnvironment.d.ts +38 -0
  237. package/dist/runtime/stageEnvironment.js +193 -0
  238. package/dist/runtime/stageProcessLauncher.d.ts +18 -0
  239. package/dist/runtime/stageProcessLauncher.js +194 -38
  240. package/dist/runtime/stageRecovery.d.ts +3 -1
  241. package/dist/runtime/stageRecovery.js +19 -4
  242. package/dist/runtime/stageRoots.d.ts +38 -1
  243. package/dist/runtime/stageRoots.js +118 -0
  244. package/dist/runtime/stageRunner.d.ts +1 -0
  245. package/dist/runtime/stageRunner.js +3 -1
  246. package/dist/runtime/stageSecretDecl.d.ts +9 -0
  247. package/dist/runtime/stageSecretDecl.js +102 -0
  248. package/dist/runtime/stageSecrets.d.ts +40 -0
  249. package/dist/runtime/stageSecrets.js +181 -0
  250. package/dist/runtime/stageWorker.d.ts +3 -2
  251. package/dist/runtime/stageWorker.js +58 -10
  252. package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
  253. package/dist/runtime/stageWorkerProtocol.js +8 -0
  254. package/dist/runtime/startPayload.d.ts +32 -0
  255. package/dist/runtime/startPayload.js +59 -0
  256. package/dist/runtime/taskInput.js +14 -5
  257. package/dist/runtime/verifiedStageExecution.d.ts +1 -0
  258. package/dist/runtime/verifiedStageExecution.js +2 -1
  259. package/dist/runtime/workspaceBinding.d.ts +20 -0
  260. package/dist/runtime/workspaceBinding.js +60 -0
  261. package/dist/server/allowedHosts.d.ts +19 -0
  262. package/dist/server/allowedHosts.js +179 -0
  263. package/dist/server/bootstrap.d.ts +36 -2
  264. package/dist/server/bootstrap.js +209 -5
  265. package/dist/server/controlToken.d.ts +47 -0
  266. package/dist/server/controlToken.js +241 -0
  267. package/dist/server/createHttpHost.d.ts +11 -2
  268. package/dist/server/createHttpHost.js +103 -10
  269. package/dist/server/ensureGlobalService.d.ts +5 -1
  270. package/dist/server/ensureGlobalService.js +35 -1
  271. package/dist/server/healthSurfaces.d.ts +6 -0
  272. package/dist/server/healthSurfaces.js +98 -0
  273. package/dist/server/http.d.ts +12 -1
  274. package/dist/server/http.js +1085 -485
  275. package/dist/server/listenHost.d.ts +5 -0
  276. package/dist/server/listenHost.js +56 -0
  277. package/dist/server/mcpHost.d.ts +10 -1
  278. package/dist/server/mcpHost.js +36 -6
  279. package/dist/server/operatorResults.d.ts +2 -2
  280. package/dist/server/operatorResults.js +40 -29
  281. package/dist/server/requestAuthContext.d.ts +12 -0
  282. package/dist/server/requestAuthContext.js +21 -0
  283. package/dist/server/shutdown.d.ts +69 -0
  284. package/dist/server/shutdown.js +219 -0
  285. package/dist/types/pipeline.d.ts +7 -0
  286. package/dist/types/stage.d.ts +8 -0
  287. package/dist/types/task.d.ts +8 -0
  288. package/dist/ui/assets/index-B6hlSXXn.js +120 -0
  289. package/dist/ui/index.html +1 -1
  290. package/examples/README.md +98 -0
  291. package/examples/archify-on-pr/README.md +213 -0
  292. package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
  293. package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
  294. package/examples/archify-on-pr/author-diagrams.yaml +106 -0
  295. package/examples/archify-on-pr/detect-changes.yaml +89 -0
  296. package/examples/ci-validate/README.md +35 -0
  297. package/examples/ci-validate/check.yaml +13 -0
  298. package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
  299. package/examples/ci-validate/validate.sh +5 -0
  300. package/examples/compliance-review-demo/README.md +125 -0
  301. package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
  302. package/examples/compliance-review-demo/connect-account.yaml +47 -0
  303. package/examples/compliance-review-demo/map-to-control.yaml +123 -0
  304. package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
  305. package/examples/compliance-review-demo/publish-report.yaml +79 -0
  306. package/examples/compliance-review-demo/review-verdict.yaml +122 -0
  307. package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
  308. package/examples/compliance-review-demo/store-evidence.yaml +143 -0
  309. package/examples/conditional-fork/README.md +89 -0
  310. package/examples/conditional-fork/branch-a.yaml +13 -0
  311. package/examples/conditional-fork/branch-b.yaml +13 -0
  312. package/examples/conditional-fork/decide.yaml +35 -0
  313. package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
  314. package/examples/conditional-fork/fork-demo.task.yaml +8 -0
  315. package/examples/context7-mcp/README.md +42 -0
  316. package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
  317. package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
  318. package/examples/context7-mcp/fetch-docs.yaml +52 -0
  319. package/examples/context7-mcp/resolve-library.yaml +31 -0
  320. package/examples/context7-mcp/write-brief.yaml +52 -0
  321. package/examples/feature-loop/README.md +104 -0
  322. package/examples/feature-loop/address-feedback.yaml +148 -0
  323. package/examples/feature-loop/align.yaml +116 -0
  324. package/examples/feature-loop/decompose.yaml +86 -0
  325. package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
  326. package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
  327. package/examples/feature-loop/feature-loop.task.yaml +25 -0
  328. package/examples/feature-loop/implement.yaml +128 -0
  329. package/examples/feature-loop/plan.yaml +111 -0
  330. package/examples/feature-loop/publish.yaml +167 -0
  331. package/examples/feature-loop/review.yaml +146 -0
  332. package/examples/feature-loop/verify.yaml +106 -0
  333. package/examples/feedback-loop/README.md +72 -0
  334. package/examples/feedback-loop/VERIFY.md +208 -0
  335. package/examples/feedback-loop/continue-only.task.yaml +4 -0
  336. package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
  337. package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
  338. package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
  339. package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
  340. package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
  341. package/examples/feedback-loop/implement.yaml +14 -0
  342. package/examples/feedback-loop/plan.yaml +14 -0
  343. package/examples/feedback-loop/review.yaml +15 -0
  344. package/examples/feedback-loop/send-back-once.task.yaml +6 -0
  345. package/examples/feedback-loop/submit.yaml +12 -0
  346. package/examples/generic-fan-in/README.md +151 -0
  347. package/examples/generic-fan-in/clarify.yaml +18 -0
  348. package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
  349. package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
  350. package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
  351. package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
  352. package/examples/generic-fan-in/research.yaml +45 -0
  353. package/examples/generic-fan-in/synthesize.yaml +66 -0
  354. package/examples/generic-fan-in/validation.yaml +45 -0
  355. package/examples/github-release/README.md +78 -0
  356. package/examples/github-release/draft-release-notes.yaml +64 -0
  357. package/examples/github-release/github-release.pipeline.yaml +11 -0
  358. package/examples/github-release/github-release.task.yaml +13 -0
  359. package/examples/github-release/publish-github-release.yaml +64 -0
  360. package/examples/hello-world/README.md +28 -0
  361. package/examples/hello-world/hello.pipeline.yaml +4 -0
  362. package/examples/hello-world/my-task.task.yaml +6 -0
  363. package/examples/hello-world/research.yaml +18 -0
  364. package/examples/mcp-hitl-tour/README.md +113 -0
  365. package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
  366. package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
  367. package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
  368. package/examples/mcp-hitl-tour/gather.yaml +31 -0
  369. package/examples/mcp-hitl-tour/intake.yaml +62 -0
  370. package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
  371. package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
  372. package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
  373. package/examples/mcp-hitl-tour/polish.yaml +33 -0
  374. package/examples/mcp-hitl-tour/review.yaml +17 -0
  375. package/examples/mcp-hitl-tour/ship.yaml +25 -0
  376. package/examples/oss-issue-contribution/README.md +218 -0
  377. package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
  378. package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
  379. package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
  380. package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
  381. package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
  382. package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
  383. package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
  384. package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
  385. package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
  386. package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
  387. package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
  388. package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
  389. package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
  390. package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
  391. package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
  392. package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
  393. package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
  394. package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
  395. package/examples/oss-quick-fix/README.md +65 -0
  396. package/examples/oss-quick-fix/implement-fix.yaml +84 -0
  397. package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
  398. package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
  399. package/examples/oss-quick-fix/ship-fix.yaml +81 -0
  400. package/examples/oss-quick-fix/understand-issue.yaml +67 -0
  401. package/examples/oss-quick-fix/verify-fix.yaml +73 -0
  402. package/examples/plan-review/README.md +37 -0
  403. package/examples/plan-review/plan-review-followup.yaml +13 -0
  404. package/examples/plan-review/plan-review.pipeline.yaml +9 -0
  405. package/examples/plan-review/plan-review.task.yaml +9 -0
  406. package/examples/plan-review/plan-review.yaml +25 -0
  407. package/examples/playwright-mcp/README.md +39 -0
  408. package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
  409. package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
  410. package/examples/playwright-mcp/screenshot.yaml +40 -0
  411. package/examples/retry-tour/README.md +75 -0
  412. package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
  413. package/examples/retry-tour/retry-tour.task.yaml +9 -0
  414. package/examples/route-if-tour/README.md +202 -0
  415. package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
  416. package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
  417. package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
  418. package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
  419. package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
  420. package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
  421. package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
  422. package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
  423. package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
  424. package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
  425. package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
  426. package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
  427. package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
  428. package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
  429. package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
  430. package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
  431. package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
  432. package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
  433. package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
  434. package/examples/route-wiring-smoke-test/README.md +377 -0
  435. package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
  436. package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
  437. package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
  438. package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
  439. package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
  440. package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
  441. package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
  442. package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
  443. package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
  444. package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
  445. package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
  446. package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
  447. package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
  448. package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
  449. package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
  450. package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
  451. package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
  452. package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
  453. package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
  454. package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
  455. package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
  456. package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
  457. package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
  458. package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
  459. package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
  460. package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
  461. package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
  462. package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
  463. package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
  464. package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
  465. package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
  466. package/examples/ship-feature/README.md +190 -0
  467. package/examples/ship-feature/feat-address-feedback.yaml +119 -0
  468. package/examples/ship-feature/feat-implement.yaml +180 -0
  469. package/examples/ship-feature/feat-plan.yaml +120 -0
  470. package/examples/ship-feature/feat-review.yaml +109 -0
  471. package/examples/ship-feature/feat-ship.yaml +203 -0
  472. package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
  473. package/examples/ship-feature/ship-feature.task.yaml +78 -0
  474. package/examples/stage-mcp/README.md +144 -0
  475. package/examples/stage-mcp/echo-mcp.mjs +20 -0
  476. package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
  477. package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
  478. package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
  479. package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
  480. package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
  481. package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
  482. package/examples/stage-mcp/use-echo.yaml +20 -0
  483. package/examples/verify-tour/README.md +80 -0
  484. package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
  485. package/examples/verify-tour/verify-tour.task.yaml +11 -0
  486. package/package.json +5 -1
  487. package/skills/stageflow/SKILL.md +6 -6
  488. package/skills/stageflow/references/control-surface.md +11 -5
  489. package/skills/stageflow/scripts/detect-host.mjs +14 -1
  490. package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
  491. package/skills/stageflow-author/SKILL.md +4 -3
  492. package/skills/stageflow-author/references/catalog-mapping.md +16 -0
  493. package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
  494. package/skills/stageflow-run/SKILL.md +20 -12
  495. package/skills/stageflow-run/references/mcp-call.md +9 -1
  496. package/skills/stageflow-run/references/task-and-pipeline-selection.md +16 -5
  497. package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
  498. package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
  499. package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
  500. package/skills/stageflow-setup/SKILL.md +40 -8
  501. package/dist/ui/assets/index-Da5EHU6M.js +0 -119
@@ -0,0 +1,96 @@
1
+ id: run-compliance-check
2
+ system_prompt: |
3
+ Read the four public-access-block field values, bucket, and check_id from
4
+ the prior stage's payload.
5
+
6
+ Apply the rule for bucket-level public access block (the same rule
7
+ Prowler's SOC2-labeled AWS S3 check uses, applied here to whichever
8
+ cloud the prior stage actually polled): the check passes only if
9
+ block_public_acls, ignore_public_acls, block_public_policy, and
10
+ restrict_public_buckets are all true. If any field is false, the check
11
+ fails; name which field(s) failed in failed_fields. Use an empty list
12
+ when nothing failed.
13
+
14
+ Write the verdict via write_stage_artifact (for example verdict.md),
15
+ including the field values and which failed, if any.
16
+
17
+ summary and payload are handed to the next stage verbatim. State outcomes
18
+ and artifact pointers only. Do not repeat this stage's prohibitions in
19
+ summary — downstream will obey them literally.
20
+
21
+ When finished, call emit_stage_envelope exactly once with status, summary,
22
+ artifacts, and a payload matching io.output.schema: everything carried
23
+ forward from the prior stage, plus verdict ("PASS" or "FAIL"), resource
24
+ (the bucket name), and failed_fields. Your last tool call in this attempt
25
+ must be emit_stage_envelope. An empty final message is a stage failure.
26
+ model: anthropic/claude-sonnet-4-5
27
+ io:
28
+ input:
29
+ schema:
30
+ type: object
31
+ required:
32
+ - bucket
33
+ - check_id
34
+ - scenario
35
+ - source
36
+ - block_public_acls
37
+ - ignore_public_acls
38
+ - block_public_policy
39
+ - restrict_public_buckets
40
+ properties:
41
+ bucket:
42
+ type: string
43
+ check_id:
44
+ type: string
45
+ scenario:
46
+ type: string
47
+ source:
48
+ type: string
49
+ block_public_acls:
50
+ type: boolean
51
+ ignore_public_acls:
52
+ type: boolean
53
+ block_public_policy:
54
+ type: boolean
55
+ restrict_public_buckets:
56
+ type: boolean
57
+ output:
58
+ schema:
59
+ type: object
60
+ required:
61
+ - bucket
62
+ - check_id
63
+ - scenario
64
+ - source
65
+ - block_public_acls
66
+ - ignore_public_acls
67
+ - block_public_policy
68
+ - restrict_public_buckets
69
+ - verdict
70
+ - resource
71
+ - failed_fields
72
+ properties:
73
+ bucket:
74
+ type: string
75
+ check_id:
76
+ type: string
77
+ scenario:
78
+ type: string
79
+ source:
80
+ type: string
81
+ block_public_acls:
82
+ type: boolean
83
+ ignore_public_acls:
84
+ type: boolean
85
+ block_public_policy:
86
+ type: boolean
87
+ restrict_public_buckets:
88
+ type: boolean
89
+ verdict:
90
+ type: string
91
+ resource:
92
+ type: string
93
+ failed_fields:
94
+ type: array
95
+ items:
96
+ type: string
@@ -0,0 +1,143 @@
1
+ id: store-evidence
2
+ system_prompt: |
3
+ Append one row to the checkout-relative evidence log at
4
+ examples/compliance-review-demo/data/evidence-log.json.
5
+
6
+ Read that file with the Read tool if it exists and parse it as a JSON
7
+ array; if it does not exist yet, start from an empty array. Append a new
8
+ object with: timestamp (ISO 8601, now), check_id, resource, control_id,
9
+ verdict, reviewed, auto_approved, reviewer (use JSON null in this file
10
+ when reviewer is "") — all from the prior stage's payload. Write the full
11
+ updated array back to that same path with the checkout write/edit tool,
12
+ pretty-printed.
13
+
14
+ Success requires real checkout edits. Put
15
+ ["examples/compliance-review-demo/data/evidence-log.json"] in
16
+ payload.changed_files. Do not put stages/.../artifacts paths there. A
17
+ report or map alone is a failure emit, not success.
18
+
19
+ summary and payload are handed to the next stage verbatim. State outcomes
20
+ and artifact pointers only. Do not repeat this stage's prohibitions in
21
+ summary — downstream will obey them literally.
22
+
23
+ When finished, call emit_stage_envelope exactly once with status, summary,
24
+ artifacts, and a payload matching io.output.schema: everything carried
25
+ forward from the prior stage, plus changed_files naming the evidence log
26
+ path. Your last tool call in this attempt must be emit_stage_envelope. An
27
+ empty final message is a stage failure.
28
+ model: anthropic/claude-sonnet-4-5
29
+ io:
30
+ input:
31
+ schema:
32
+ type: object
33
+ required:
34
+ - bucket
35
+ - check_id
36
+ - scenario
37
+ - source
38
+ - block_public_acls
39
+ - ignore_public_acls
40
+ - block_public_policy
41
+ - restrict_public_buckets
42
+ - verdict
43
+ - resource
44
+ - failed_fields
45
+ - reviewed
46
+ - auto_approved
47
+ - reviewer
48
+ - control_id
49
+ properties:
50
+ bucket:
51
+ type: string
52
+ check_id:
53
+ type: string
54
+ scenario:
55
+ type: string
56
+ source:
57
+ type: string
58
+ block_public_acls:
59
+ type: boolean
60
+ ignore_public_acls:
61
+ type: boolean
62
+ block_public_policy:
63
+ type: boolean
64
+ restrict_public_buckets:
65
+ type: boolean
66
+ verdict:
67
+ type: string
68
+ resource:
69
+ type: string
70
+ failed_fields:
71
+ type: array
72
+ items:
73
+ type: string
74
+ reviewed:
75
+ type: boolean
76
+ auto_approved:
77
+ type: boolean
78
+ reviewer:
79
+ type: string
80
+ control_id:
81
+ type: string
82
+ output:
83
+ schema:
84
+ type: object
85
+ required:
86
+ - bucket
87
+ - check_id
88
+ - scenario
89
+ - source
90
+ - block_public_acls
91
+ - ignore_public_acls
92
+ - block_public_policy
93
+ - restrict_public_buckets
94
+ - verdict
95
+ - resource
96
+ - failed_fields
97
+ - reviewed
98
+ - auto_approved
99
+ - reviewer
100
+ - control_id
101
+ - changed_files
102
+ properties:
103
+ bucket:
104
+ type: string
105
+ check_id:
106
+ type: string
107
+ scenario:
108
+ type: string
109
+ source:
110
+ type: string
111
+ block_public_acls:
112
+ type: boolean
113
+ ignore_public_acls:
114
+ type: boolean
115
+ block_public_policy:
116
+ type: boolean
117
+ restrict_public_buckets:
118
+ type: boolean
119
+ verdict:
120
+ type: string
121
+ resource:
122
+ type: string
123
+ failed_fields:
124
+ type: array
125
+ items:
126
+ type: string
127
+ reviewed:
128
+ type: boolean
129
+ auto_approved:
130
+ type: boolean
131
+ reviewer:
132
+ type: string
133
+ control_id:
134
+ type: string
135
+ changed_files:
136
+ type: array
137
+ items:
138
+ type: string
139
+ verify:
140
+ - id: evidence-log-written
141
+ type: checkout_changes
142
+ path_fields: [changed_files]
143
+ when: [after]
@@ -0,0 +1,89 @@
1
+ # conditional-fork
2
+
3
+ Operator HITL, then exclusive Route `if`. The `decide` stage asks for **branch-a** or **branch-b**, emits that value on `payload.branch`, and listed successors stay on the DAG. After success, each `if` runs against that payload: the matching arm runs; the other is skipped. The completing agent does not pick YAML successors.
4
+
5
+ See [YAML catalog — Route wiring](../../docs/yaml-catalog.md#route) (Route `if`). `if.field` must be a required output property — optional fields cannot be used in `if`.
6
+
7
+ ## Prerequisites
8
+
9
+ - Node.js ≥ 20, Stageflow installed (`npm i -g stageflow`), **or** this repo built (`npm run build`)
10
+ - Provider auth connected (`sf ui` → Settings → Providers, or `sf providers login …`)
11
+ - Operator console for the gate: `sf ui` (default `http://127.0.0.1:3847`)
12
+
13
+ ## Manual test
14
+
15
+ Commands run from the **repository git root**. Run state lives in `<repo>/.stageflow` even if you start `sf ui` from a subdirectory.
16
+
17
+ ### Terminal 1 — operator console
18
+
19
+ ```bash
20
+ cd examples/conditional-fork
21
+ sf ui
22
+ ```
23
+
24
+ ### Terminal 2 — validate and run (repo root)
25
+
26
+ ```bash
27
+ sf validate --pipeline examples/conditional-fork/fork-demo.pipeline.yaml --strict
28
+ sf run \
29
+ --pipeline examples/conditional-fork/fork-demo.pipeline.yaml \
30
+ --task examples/conditional-fork/fork-demo.task.yaml
31
+ ```
32
+
33
+ ### From the Stageflow repo (no global install)
34
+
35
+ ```bash
36
+ npm run build
37
+ npm run dev -- validate --pipeline examples/conditional-fork/fork-demo.pipeline.yaml --strict
38
+ npm run dev -- run \
39
+ --pipeline examples/conditional-fork/fork-demo.pipeline.yaml \
40
+ --task examples/conditional-fork/fork-demo.task.yaml
41
+ ```
42
+
43
+ ### At the HITL gate
44
+
45
+ When `decide` blocks, open the run in the console and answer the free-text prompt with exactly:
46
+
47
+ - `branch-a`, or
48
+ - `branch-b`
49
+
50
+ Exit code `2` means waiting on operator input. See [docs/hitl.md](../../docs/hitl.md).
51
+
52
+ ### What to verify in the UI
53
+
54
+ After you answer:
55
+
56
+ 1. The chosen branch stage (`branch-a` or `branch-b`) reaches **succeeded**
57
+ 2. The other branch is **skipped**
58
+ 3. The run overall **succeeded**
59
+
60
+ ### Re-test the other branch
61
+
62
+ Start a **new** run and answer the opposite id at the gate.
63
+
64
+ ## How it works
65
+
66
+ `decide` is `entry: true` with two `route` targets, each gated by `if` (`field: branch`, `op: eq`). After the operator answers, the agent emits `payload: { "branch": "branch-a" }` or `{ "branch": "branch-b" }`. Stageflow evaluates those predicates against the success payload: the matching successor runs; the miss is skipped. Both `to:` stay on the DAG.
67
+
68
+ `io.output.schema` requires `branch` as a string so `if.field: branch` is valid. Branch stage `io.input` is an empty object (a subset of decide output).
69
+
70
+ Validate may warn `pipeline.route_all_gated` because every forward `to:` on `decide` has `if`. That warning keeps `ok: true`; `--strict` does not promote it.
71
+
72
+ ## Layout
73
+
74
+ ```
75
+ examples/conditional-fork/
76
+ fork-demo.pipeline.yaml
77
+ fork-demo.task.yaml
78
+ decide.yaml
79
+ branch-a.yaml
80
+ branch-b.yaml
81
+ ```
82
+
83
+ ## References
84
+
85
+ - [YAML catalog — Route wiring](../../docs/yaml-catalog.md#route)
86
+ - [YAML catalog — Upgrading older catalogs](../../docs/yaml-catalog.md#upgrading-older-catalogs)
87
+ - [HITL](../../docs/hitl.md)
88
+ - Fixtures: [`route-if-eq.pipeline.yaml`](../../tests/fixtures/pipelines/route-if-eq.pipeline.yaml)
89
+ - Related walkthrough: [`../route-if-tour/`](../route-if-tour/)
@@ -0,0 +1,13 @@
1
+ id: branch-a
2
+ system_prompt: |
3
+ You are branch-a. Call emit_stage_envelope exactly once with status success,
4
+ a short summary that acknowledges branch-a ran, and artifacts []. Do not call
5
+ ask_operator.
6
+ model: anthropic/claude-sonnet-4-5
7
+ io:
8
+ input:
9
+ schema:
10
+ type: object
11
+ output:
12
+ schema:
13
+ type: object
@@ -0,0 +1,13 @@
1
+ id: branch-b
2
+ system_prompt: |
3
+ You are branch-b. Call emit_stage_envelope exactly once with status success,
4
+ a short summary that acknowledges branch-b ran, and artifacts []. Do not call
5
+ ask_operator.
6
+ model: cursor/auto
7
+ io:
8
+ input:
9
+ schema:
10
+ type: object
11
+ output:
12
+ schema:
13
+ type: object
@@ -0,0 +1,35 @@
1
+ id: decide
2
+ gate_kinds:
3
+ - free_text
4
+ system_prompt: |
5
+ You are the deciding stage for exclusive Route if branching. The operator
6
+ chooses which branch runs. Follow these steps exactly:
7
+
8
+ 1. Call ask_operator with kind free_text. Ask which branch to take. Tell the
9
+ operator to reply with exactly one of: branch-a or branch-b.
10
+ 2. Wait for the operator answer. Do not call emit_stage_envelope before you
11
+ have that answer.
12
+ 3. After the operator answers, call emit_stage_envelope exactly once with:
13
+ - status: success
14
+ - a non-empty summary
15
+ - artifacts: []
16
+ - payload: { "branch": "branch-a" } or { "branch": "branch-b" }, matching
17
+ the operator reply exactly
18
+
19
+ Rules:
20
+ - Never emit before the operator answers.
21
+ - Do not emit fork_choice. Routing is deterministic from payload.branch.
22
+ - Never invent other branch values.
23
+ - Put only the id the operator chose in payload.branch.
24
+ model: cursor/auto
25
+ io:
26
+ input:
27
+ schema:
28
+ type: object
29
+ output:
30
+ schema:
31
+ type: object
32
+ required: [branch]
33
+ properties:
34
+ branch:
35
+ type: string
@@ -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