stageflow 0.25.0 → 0.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (681) hide show
  1. package/README.md +14 -3
  2. package/builtin-skills/browser/SKILL.md +42 -0
  3. package/dist/a2a/contracts.d.ts +1 -0
  4. package/dist/a2a/contracts.js +1 -0
  5. package/dist/a2a/registry.d.ts +2 -0
  6. package/dist/a2a/registry.js +20 -1
  7. package/dist/a2a/server.d.ts +7 -0
  8. package/dist/a2a/server.js +5 -2
  9. package/dist/a2a/service.d.ts +1 -1
  10. package/dist/a2a/service.js +57 -8
  11. package/dist/a2a/store.d.ts +8 -5
  12. package/dist/a2a/store.js +24 -67
  13. package/dist/agent/activity.d.ts +3 -0
  14. package/dist/agent/bootProviderConfig.d.ts +21 -0
  15. package/dist/agent/bootProviderConfig.js +74 -0
  16. package/dist/agent/claudeAdapter.js +2 -2
  17. package/dist/agent/cursorProvider.d.ts +2 -0
  18. package/dist/agent/cursorProvider.js +30 -5
  19. package/dist/agent/fakeAgent.d.ts +1 -0
  20. package/dist/agent/fakeAgent.js +13 -0
  21. package/dist/agent/piAdapter.d.ts +11 -24
  22. package/dist/agent/piAdapter.js +107 -50
  23. package/dist/agent/piIsolatedMcp.d.ts +2 -0
  24. package/dist/agent/piIsolatedMcp.js +10 -2
  25. package/dist/agent/piSessionFactory.d.ts +38 -0
  26. package/dist/agent/piSessionFactory.js +60 -0
  27. package/dist/agent/port.d.ts +8 -0
  28. package/dist/agent/streamLogRedact.d.ts +7 -1
  29. package/dist/agent/streamLogRedact.js +26 -11
  30. package/dist/browser/anchor.d.ts +27 -0
  31. package/dist/browser/anchor.js +127 -0
  32. package/dist/browser/auditSink.d.ts +38 -0
  33. package/dist/browser/auditSink.js +34 -0
  34. package/dist/browser/browserHost.d.ts +86 -0
  35. package/dist/browser/browserHost.js +7 -0
  36. package/dist/browser/browserSweep.d.ts +14 -0
  37. package/dist/browser/browserSweep.js +54 -0
  38. package/dist/browser/browserTeardown.d.ts +56 -0
  39. package/dist/browser/browserTeardown.js +235 -0
  40. package/dist/browser/fakeRemoteBrowserHost.d.ts +2 -0
  41. package/dist/browser/fakeRemoteBrowserHost.js +34 -0
  42. package/dist/browser/gateHandoff.d.ts +25 -0
  43. package/dist/browser/gateHandoff.js +83 -0
  44. package/dist/browser/humanLogin.d.ts +18 -0
  45. package/dist/browser/humanLogin.js +34 -0
  46. package/dist/browser/keyProvider.d.ts +10 -0
  47. package/dist/browser/keyProvider.js +39 -0
  48. package/dist/browser/localBrowserHost.d.ts +10 -0
  49. package/dist/browser/localBrowserHost.js +152 -0
  50. package/dist/browser/localProfileLock.d.ts +2 -0
  51. package/dist/browser/localProfileLock.js +218 -0
  52. package/dist/browser/localProfileStore.d.ts +5 -0
  53. package/dist/browser/localProfileStore.js +91 -0
  54. package/dist/browser/loginCheck.d.ts +53 -0
  55. package/dist/browser/loginCheck.js +147 -0
  56. package/dist/browser/memoryProfileLock.d.ts +2 -0
  57. package/dist/browser/memoryProfileLock.js +53 -0
  58. package/dist/browser/memoryProfileStore.d.ts +2 -0
  59. package/dist/browser/memoryProfileStore.js +31 -0
  60. package/dist/browser/navigationAudit.d.ts +16 -0
  61. package/dist/browser/navigationAudit.js +53 -0
  62. package/dist/browser/persistedEnv.d.ts +3 -0
  63. package/dist/browser/persistedEnv.js +15 -0
  64. package/dist/browser/profileLock.d.ts +40 -0
  65. package/dist/browser/profileLock.js +10 -0
  66. package/dist/browser/profileStore.d.ts +23 -0
  67. package/dist/browser/profileStore.js +39 -0
  68. package/dist/browser/runLiveness.d.ts +13 -0
  69. package/dist/browser/runLiveness.js +39 -0
  70. package/dist/browser/sitePolicy.d.ts +10 -0
  71. package/dist/browser/sitePolicy.js +61 -0
  72. package/dist/browser/stageBrowserEnv.d.ts +22 -0
  73. package/dist/browser/stageBrowserEnv.js +147 -0
  74. package/dist/browser/stageProfileLock.d.ts +17 -0
  75. package/dist/browser/stageProfileLock.js +39 -0
  76. package/dist/cli/artifactCommand.js +9 -16
  77. package/dist/cli/backupCommand.d.ts +9 -0
  78. package/dist/cli/backupCommand.js +111 -0
  79. package/dist/cli/browserCommand.d.ts +44 -0
  80. package/dist/cli/browserCommand.js +472 -0
  81. package/dist/cli/debugRunCommand.d.ts +10 -0
  82. package/dist/cli/debugRunCommand.js +109 -0
  83. package/dist/cli/doctorCommand.d.ts +32 -0
  84. package/dist/cli/doctorCommand.js +453 -0
  85. package/dist/cli/envelopeCommand.js +9 -2
  86. package/dist/cli/exportAllCommand.d.ts +55 -0
  87. package/dist/cli/exportAllCommand.js +218 -0
  88. package/dist/cli/exportRunCommand.js +23 -21
  89. package/dist/cli/hostClient.d.ts +41 -3
  90. package/dist/cli/hostClient.js +129 -14
  91. package/dist/cli/initCommand.d.ts +1 -0
  92. package/dist/cli/initCommand.js +23 -7
  93. package/dist/cli/initTemplates.d.ts +5 -2
  94. package/dist/cli/initTemplates.js +32 -2
  95. package/dist/cli/resolveSafeOutPath.d.ts +2 -0
  96. package/dist/cli/resolveSafeOutPath.js +40 -0
  97. package/dist/cli/restoreCommand.d.ts +10 -0
  98. package/dist/cli/restoreCommand.js +90 -0
  99. package/dist/cli/runCommand.d.ts +3 -2
  100. package/dist/cli/runCommand.js +93 -11
  101. package/dist/cli/runOutput.d.ts +4 -0
  102. package/dist/cli/runOutput.js +33 -7
  103. package/dist/cli/runStageCommand.d.ts +1 -0
  104. package/dist/cli/runStageCommand.js +44 -25
  105. package/dist/cli/runsCommand.d.ts +1 -1
  106. package/dist/cli/runsCommand.js +168 -10
  107. package/dist/cli/triggerCommand.d.ts +12 -0
  108. package/dist/cli/triggerCommand.js +183 -0
  109. package/dist/cli/validateCommand.d.ts +1 -1
  110. package/dist/cli/validateCommand.js +23 -6
  111. package/dist/cli.js +202 -32
  112. package/dist/config/browseCatalog.d.ts +1 -0
  113. package/dist/config/browseCatalog.js +5 -4
  114. package/dist/config/builtinSkills.d.ts +4 -0
  115. package/dist/config/builtinSkills.js +23 -0
  116. package/dist/config/catalogRelativePath.d.ts +63 -0
  117. package/dist/config/catalogRelativePath.js +126 -0
  118. package/dist/config/configOrigin.d.ts +27 -0
  119. package/dist/config/configOrigin.js +59 -0
  120. package/dist/config/createTrigger.d.ts +27 -0
  121. package/dist/config/createTrigger.js +232 -0
  122. package/dist/config/draftPackage.d.ts +117 -0
  123. package/dist/config/draftPackage.js +550 -0
  124. package/dist/config/ensureCatalogScanRoot.d.ts +16 -0
  125. package/dist/config/ensureCatalogScanRoot.js +73 -0
  126. package/dist/config/hostConfig.d.ts +57 -0
  127. package/dist/config/hostConfig.js +360 -0
  128. package/dist/config/listSkills.d.ts +26 -0
  129. package/dist/config/listSkills.js +206 -5
  130. package/dist/config/loadOutcome.d.ts +7 -1
  131. package/dist/config/loadPipeline.js +39 -2
  132. package/dist/config/loadStage.js +25 -0
  133. package/dist/config/loadStageflowManifest.js +25 -0
  134. package/dist/config/loadTask.d.ts +2 -0
  135. package/dist/config/loadTask.js +57 -18
  136. package/dist/config/loadTrigger.d.ts +9 -0
  137. package/dist/config/loadTrigger.js +120 -0
  138. package/dist/config/materializeStageModels.js +5 -1
  139. package/dist/config/mergePipelineIncludes.d.ts +3 -0
  140. package/dist/config/mergePipelineIncludes.js +19 -0
  141. package/dist/config/migrateYaml.js +6 -11
  142. package/dist/config/multiProjectCatalog.d.ts +32 -0
  143. package/dist/config/multiProjectCatalog.js +150 -0
  144. package/dist/config/normalizePipelineStageEntry.js +27 -1
  145. package/dist/config/parseCompletionContract.js +6 -0
  146. package/dist/config/pipelineStageKeys.js +3 -0
  147. package/dist/config/publishDraftPackage.d.ts +7 -0
  148. package/dist/config/publishDraftPackage.js +25 -0
  149. package/dist/config/resolveCatalogContext.js +1 -1
  150. package/dist/config/resolveCatalogRoots.d.ts +27 -0
  151. package/dist/config/resolveCatalogRoots.js +76 -0
  152. package/dist/config/resolveModel.d.ts +7 -1
  153. package/dist/config/resolveModel.js +11 -1
  154. package/dist/config/resolvePipelineDag.js +1 -1
  155. package/dist/config/resolveStageMcpServers.d.ts +9 -1
  156. package/dist/config/resolveStageMcpServers.js +36 -9
  157. package/dist/config/scanCatalogPaths.d.ts +1 -1
  158. package/dist/config/scanCatalogPaths.js +6 -2
  159. package/dist/config/secretFromEnvOrFile.d.ts +9 -0
  160. package/dist/config/secretFromEnvOrFile.js +34 -0
  161. package/dist/config/seededCatalog.d.ts +11 -0
  162. package/dist/config/seededCatalog.js +29 -0
  163. package/dist/config/stageBrowser.d.ts +12 -0
  164. package/dist/config/stageBrowser.js +118 -0
  165. package/dist/config/toolRequires.d.ts +24 -0
  166. package/dist/config/toolRequires.js +115 -0
  167. package/dist/config/triggerCatalog.d.ts +10 -0
  168. package/dist/config/triggerCatalog.js +37 -0
  169. package/dist/config/validateCatalog.d.ts +17 -3
  170. package/dist/config/validateCatalog.js +223 -3
  171. package/dist/config/validateCompletionContract.js +8 -0
  172. package/dist/diagnostics/checks.d.ts +39 -0
  173. package/dist/diagnostics/checks.js +135 -0
  174. package/dist/envelope/preEmitChecks.d.ts +1 -1
  175. package/dist/envelope/preEmitChecks.js +8 -0
  176. package/dist/errors/codes.d.ts +14 -0
  177. package/dist/errors/codes.js +59 -0
  178. package/dist/git/cache.d.ts +14 -0
  179. package/dist/git/cache.js +150 -0
  180. package/dist/git/credentials.d.ts +9 -0
  181. package/dist/git/credentials.js +88 -0
  182. package/dist/git/errors.d.ts +20 -0
  183. package/dist/git/errors.js +94 -0
  184. package/dist/git/exec.d.ts +16 -0
  185. package/dist/git/exec.js +135 -0
  186. package/dist/git/operations.d.ts +29 -0
  187. package/dist/git/operations.js +153 -0
  188. package/dist/git/version.d.ts +1 -0
  189. package/dist/git/version.js +10 -0
  190. package/dist/logging/audit.d.ts +16 -0
  191. package/dist/logging/audit.js +19 -0
  192. package/dist/logging/commonWords.d.ts +2 -0
  193. package/dist/logging/commonWords.js +13 -0
  194. package/dist/logging/logger.d.ts +49 -0
  195. package/dist/logging/logger.js +193 -0
  196. package/dist/logging/namedSecrets.d.ts +6 -0
  197. package/dist/logging/namedSecrets.js +58 -0
  198. package/dist/logging/redact.d.ts +17 -0
  199. package/dist/logging/redact.js +105 -0
  200. package/dist/mcp/catalogTools.js +492 -81
  201. package/dist/mcp/checkoutTools.d.ts +52 -0
  202. package/dist/mcp/checkoutTools.js +332 -0
  203. package/dist/mcp/controlTools.js +182 -6
  204. package/dist/mcp/deps.d.ts +3 -0
  205. package/dist/mcp/getStartedTool.d.ts +3 -0
  206. package/dist/mcp/getStartedTool.js +62 -0
  207. package/dist/mcp/readArtifact.d.ts +11 -0
  208. package/dist/mcp/readArtifact.js +46 -30
  209. package/dist/mcp/server.js +2 -0
  210. package/dist/mcp/tools.js +6 -0
  211. package/dist/mcp/triggerTools.d.ts +3 -0
  212. package/dist/mcp/triggerTools.js +176 -0
  213. package/dist/net/proxy.d.ts +14 -0
  214. package/dist/net/proxy.js +78 -0
  215. package/dist/operatorAgent/docsRetrieval.d.ts +40 -0
  216. package/dist/operatorAgent/docsRetrieval.js +269 -0
  217. package/dist/operatorAgent/draftContext.d.ts +16 -0
  218. package/dist/operatorAgent/draftContext.js +68 -0
  219. package/dist/operatorAgent/fakeHost.d.ts +39 -0
  220. package/dist/operatorAgent/fakeHost.js +92 -0
  221. package/dist/operatorAgent/host.d.ts +40 -0
  222. package/dist/operatorAgent/host.js +179 -0
  223. package/dist/operatorAgent/index.d.ts +9 -0
  224. package/dist/operatorAgent/index.js +8 -0
  225. package/dist/operatorAgent/piModel.d.ts +80 -0
  226. package/dist/operatorAgent/piModel.js +528 -0
  227. package/dist/operatorAgent/profiles/workshopAuthor.d.ts +23 -0
  228. package/dist/operatorAgent/profiles/workshopAuthor.js +338 -0
  229. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +6 -0
  230. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +103 -0
  231. package/dist/operatorAgent/profiles/workshopAuthorTools.d.ts +57 -0
  232. package/dist/operatorAgent/profiles/workshopAuthorTools.js +623 -0
  233. package/dist/operatorAgent/proposals.d.ts +32 -0
  234. package/dist/operatorAgent/proposals.js +144 -0
  235. package/dist/operatorAgent/types.d.ts +128 -0
  236. package/dist/operatorAgent/types.js +1 -0
  237. package/dist/package-meta.d.ts +2 -1
  238. package/dist/package-meta.js +2 -1
  239. package/dist/preflight/bash.d.ts +8 -0
  240. package/dist/preflight/bash.js +34 -0
  241. package/dist/preflight/claudeRoot.d.ts +11 -0
  242. package/dist/preflight/claudeRoot.js +23 -0
  243. package/dist/preflight/mcpCommands.d.ts +8 -0
  244. package/dist/preflight/mcpCommands.js +36 -0
  245. package/dist/preflight/pipelinePreflight.d.ts +40 -0
  246. package/dist/preflight/pipelinePreflight.js +192 -0
  247. package/dist/preflight/tls.d.ts +6 -0
  248. package/dist/preflight/tls.js +18 -0
  249. package/dist/preflight/toolchain.d.ts +45 -0
  250. package/dist/preflight/toolchain.js +219 -0
  251. package/dist/project/findManifestRoot.d.ts +3 -0
  252. package/dist/project/findManifestRoot.js +35 -0
  253. package/dist/project/findProjectRoot.js +3 -4
  254. package/dist/project/globalHome.d.ts +7 -0
  255. package/dist/project/globalHome.js +63 -2
  256. package/dist/project/resolveProjectContext.js +2 -2
  257. package/dist/project/resolveStageflowContext.d.ts +7 -0
  258. package/dist/project/resolveStageflowContext.js +46 -30
  259. package/dist/projection/projectRun.d.ts +2 -1
  260. package/dist/projection/projectRun.js +1 -0
  261. package/dist/runstore/assertTmpdir.d.ts +1 -0
  262. package/dist/runstore/assertTmpdir.js +25 -0
  263. package/dist/runstore/backup.d.ts +52 -0
  264. package/dist/runstore/backup.js +292 -0
  265. package/dist/runstore/createStore.d.ts +18 -1
  266. package/dist/runstore/createStore.js +64 -5
  267. package/dist/runstore/debugBundle.d.ts +60 -0
  268. package/dist/runstore/debugBundle.js +143 -0
  269. package/dist/runstore/diskUsage.d.ts +50 -0
  270. package/dist/runstore/diskUsage.js +214 -0
  271. package/dist/runstore/exportRunPayload.d.ts +8 -0
  272. package/dist/runstore/exportRunPayload.js +23 -0
  273. package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
  274. package/dist/runstore/normalizeCatalogPath.js +10 -0
  275. package/dist/runstore/paths.d.ts +5 -0
  276. package/dist/runstore/paths.js +145 -1
  277. package/dist/runstore/port.d.ts +139 -13
  278. package/dist/runstore/port.js +8 -1
  279. package/dist/runstore/restore.d.ts +81 -0
  280. package/dist/runstore/restore.js +355 -0
  281. package/dist/runstore/retention.d.ts +27 -0
  282. package/dist/runstore/retention.js +74 -0
  283. package/dist/runstore/runManifest.d.ts +146 -0
  284. package/dist/runstore/runManifest.js +288 -0
  285. package/dist/runstore/runProjection.d.ts +3 -1
  286. package/dist/runstore/runProjection.js +63 -1
  287. package/dist/runstore/sqlite/SqliteRunStore.d.ts +35 -3
  288. package/dist/runstore/sqlite/SqliteRunStore.js +442 -219
  289. package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
  290. package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
  291. package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
  292. package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
  293. package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
  294. package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
  295. package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
  296. package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
  297. package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
  298. package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
  299. package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
  300. package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
  301. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
  302. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
  303. package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
  304. package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
  305. package/dist/runstore/sqlite/migrations/008-triggers-table.d.ts +7 -0
  306. package/dist/runstore/sqlite/migrations/008-triggers-table.js +19 -0
  307. package/dist/runstore/sqlite/migrations/009-trigger-next-run.d.ts +7 -0
  308. package/dist/runstore/sqlite/migrations/009-trigger-next-run.js +19 -0
  309. package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.d.ts +7 -0
  310. package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.js +17 -0
  311. package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
  312. package/dist/runstore/sqlite/migrations/index.js +78 -0
  313. package/dist/runstore/sqlite/schema.d.ts +20 -1
  314. package/dist/runstore/sqlite/schema.js +277 -1
  315. package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
  316. package/dist/runstore/sqlite/storeOpenError.js +11 -0
  317. package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
  318. package/dist/runstore/sqlite/storeSchemaError.js +8 -0
  319. package/dist/runstore/stageExecution.js +3 -0
  320. package/dist/runstore/storeFilesystem.d.ts +32 -0
  321. package/dist/runstore/storeFilesystem.js +148 -0
  322. package/dist/runstore/trackProjection.js +2 -0
  323. package/dist/runstore/workspaceLayout.d.ts +13 -0
  324. package/dist/runstore/workspaceLayout.js +76 -0
  325. package/dist/runtime/answerResume.d.ts +1 -0
  326. package/dist/runtime/answerResume.js +3 -1
  327. package/dist/runtime/completionCheckRunner.d.ts +15 -1
  328. package/dist/runtime/completionCheckRunner.js +67 -7
  329. package/dist/runtime/containerLimits.d.ts +16 -0
  330. package/dist/runtime/containerLimits.js +84 -0
  331. package/dist/runtime/credentialBinding.d.ts +2 -0
  332. package/dist/runtime/credentialBinding.js +3 -0
  333. package/dist/runtime/credentialMaterialisation.d.ts +28 -0
  334. package/dist/runtime/credentialMaterialisation.js +128 -0
  335. package/dist/runtime/emailSource.d.ts +72 -0
  336. package/dist/runtime/emailSource.js +304 -0
  337. package/dist/runtime/gitCheckoutCapability.js +7 -13
  338. package/dist/runtime/githubPollSource.d.ts +86 -0
  339. package/dist/runtime/githubPollSource.js +284 -0
  340. package/dist/runtime/pipelineRunner.d.ts +40 -1
  341. package/dist/runtime/pipelineRunner.js +181 -17
  342. package/dist/runtime/pipelineScheduler.d.ts +17 -0
  343. package/dist/runtime/pipelineScheduler.js +220 -28
  344. package/dist/runtime/reloadRunCatalog.js +6 -1
  345. package/dist/runtime/repositoryMaterialize.d.ts +47 -0
  346. package/dist/runtime/repositoryMaterialize.js +235 -0
  347. package/dist/runtime/resumeTimedOut.d.ts +1 -1
  348. package/dist/runtime/resumeTimedOut.js +5 -2
  349. package/dist/runtime/runChangeBus.js +9 -0
  350. package/dist/runtime/runDeletion.d.ts +7 -0
  351. package/dist/runtime/runDeletion.js +37 -0
  352. package/dist/runtime/runManager.d.ts +169 -4
  353. package/dist/runtime/runManager.js +1748 -83
  354. package/dist/runtime/runRetentionSweep.d.ts +31 -0
  355. package/dist/runtime/runRetentionSweep.js +328 -0
  356. package/dist/runtime/runRetryCoordinator.d.ts +4 -0
  357. package/dist/runtime/runRetryCoordinator.js +20 -2
  358. package/dist/runtime/runSkills.d.ts +40 -0
  359. package/dist/runtime/runSkills.js +173 -0
  360. package/dist/runtime/scheduleSource.d.ts +38 -0
  361. package/dist/runtime/scheduleSource.js +119 -0
  362. package/dist/runtime/settingsFile.d.ts +5 -0
  363. package/dist/runtime/settingsFile.js +61 -54
  364. package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
  365. package/dist/runtime/stageAttemptBootstrap.js +250 -27
  366. package/dist/runtime/stageCacheEnv.d.ts +6 -0
  367. package/dist/runtime/stageCacheEnv.js +34 -0
  368. package/dist/runtime/stageConcurrency.d.ts +2 -1
  369. package/dist/runtime/stageConcurrency.js +4 -2
  370. package/dist/runtime/stageEnvironment.d.ts +38 -0
  371. package/dist/runtime/stageEnvironment.js +194 -0
  372. package/dist/runtime/stageHitl.d.ts +1 -0
  373. package/dist/runtime/stageHitl.js +5 -1
  374. package/dist/runtime/stageProcessLauncher.d.ts +20 -0
  375. package/dist/runtime/stageProcessLauncher.js +236 -41
  376. package/dist/runtime/stageRecovery.d.ts +3 -1
  377. package/dist/runtime/stageRecovery.js +19 -4
  378. package/dist/runtime/stageRoots.d.ts +38 -1
  379. package/dist/runtime/stageRoots.js +118 -0
  380. package/dist/runtime/stageRunner.d.ts +6 -0
  381. package/dist/runtime/stageRunner.js +32 -6
  382. package/dist/runtime/stageSecretDecl.d.ts +9 -0
  383. package/dist/runtime/stageSecretDecl.js +102 -0
  384. package/dist/runtime/stageSecrets.d.ts +40 -0
  385. package/dist/runtime/stageSecrets.js +181 -0
  386. package/dist/runtime/stageStreamLog.d.ts +1 -0
  387. package/dist/runtime/stageStreamLog.js +2 -1
  388. package/dist/runtime/stageWorker.d.ts +3 -2
  389. package/dist/runtime/stageWorker.js +58 -10
  390. package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
  391. package/dist/runtime/stageWorkerProtocol.js +8 -0
  392. package/dist/runtime/startPayload.d.ts +32 -0
  393. package/dist/runtime/startPayload.js +59 -0
  394. package/dist/runtime/taskInput.js +14 -5
  395. package/dist/runtime/triggerCatalog.d.ts +6 -0
  396. package/dist/runtime/triggerCatalog.js +24 -0
  397. package/dist/runtime/triggerEventMatch.d.ts +2 -0
  398. package/dist/runtime/triggerEventMatch.js +6 -0
  399. package/dist/runtime/triggerPort.d.ts +14 -0
  400. package/dist/runtime/triggerPort.js +1 -0
  401. package/dist/runtime/triggerRunner.d.ts +17 -0
  402. package/dist/runtime/triggerRunner.js +89 -0
  403. package/dist/runtime/verifiedStageExecution.d.ts +8 -0
  404. package/dist/runtime/verifiedStageExecution.js +16 -1
  405. package/dist/runtime/webhookSignature.d.ts +1 -0
  406. package/dist/runtime/webhookSignature.js +12 -0
  407. package/dist/runtime/workspaceBinding.d.ts +20 -0
  408. package/dist/runtime/workspaceBinding.js +60 -0
  409. package/dist/server/allowedHosts.d.ts +19 -0
  410. package/dist/server/allowedHosts.js +179 -0
  411. package/dist/server/bootstrap.d.ts +42 -2
  412. package/dist/server/bootstrap.js +273 -5
  413. package/dist/server/controlToken.d.ts +47 -0
  414. package/dist/server/controlToken.js +254 -0
  415. package/dist/server/createHttpHost.d.ts +11 -2
  416. package/dist/server/createHttpHost.js +106 -10
  417. package/dist/server/ensureGlobalService.d.ts +5 -1
  418. package/dist/server/ensureGlobalService.js +35 -1
  419. package/dist/server/healthSurfaces.d.ts +6 -0
  420. package/dist/server/healthSurfaces.js +123 -0
  421. package/dist/server/http.d.ts +27 -1
  422. package/dist/server/http.js +2254 -477
  423. package/dist/server/listenHost.d.ts +5 -0
  424. package/dist/server/listenHost.js +56 -0
  425. package/dist/server/mcpHost.d.ts +10 -1
  426. package/dist/server/mcpHost.js +36 -6
  427. package/dist/server/operatorResults.d.ts +2 -2
  428. package/dist/server/operatorResults.js +40 -29
  429. package/dist/server/requestAuthContext.d.ts +12 -0
  430. package/dist/server/requestAuthContext.js +21 -0
  431. package/dist/server/shutdown.d.ts +69 -0
  432. package/dist/server/shutdown.js +219 -0
  433. package/dist/server/triggerRoutes.d.ts +15 -0
  434. package/dist/server/triggerRoutes.js +268 -0
  435. package/dist/tools/askOperator.d.ts +3 -2
  436. package/dist/types/completion.d.ts +3 -0
  437. package/dist/types/pipeline.d.ts +10 -1
  438. package/dist/types/preEmitCheck.d.ts +7 -0
  439. package/dist/types/stage.d.ts +22 -0
  440. package/dist/types/stageflowManifest.d.ts +3 -0
  441. package/dist/types/task.d.ts +8 -0
  442. package/dist/types/trigger.d.ts +18 -0
  443. package/dist/types/trigger.js +1 -0
  444. package/dist/ui/assets/{index-CSsDued1.css → index-Bv4p1aPK.css} +1 -1
  445. package/dist/ui/assets/index-CntB4bZR.js +133 -0
  446. package/dist/ui/index.html +2 -2
  447. package/dist/workshop/autosave.d.ts +58 -0
  448. package/dist/workshop/autosave.js +222 -0
  449. package/dist/workshop/buildStore.d.ts +79 -0
  450. package/dist/workshop/buildStore.js +326 -0
  451. package/dist/workshop/chatTurn.d.ts +232 -0
  452. package/dist/workshop/chatTurn.js +475 -0
  453. package/dist/workshop/modelSettings.d.ts +18 -0
  454. package/dist/workshop/modelSettings.js +44 -0
  455. package/dist/workshop/sessionStore.d.ts +61 -0
  456. package/dist/workshop/sessionStore.js +254 -0
  457. package/dist/workshop/workshopPin.d.ts +72 -0
  458. package/dist/workshop/workshopPin.js +193 -0
  459. package/examples/README.md +99 -0
  460. package/examples/archify-on-pr/README.md +213 -0
  461. package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
  462. package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
  463. package/examples/archify-on-pr/author-diagrams.yaml +106 -0
  464. package/examples/archify-on-pr/detect-changes.yaml +89 -0
  465. package/examples/browser-session/README.md +77 -0
  466. package/examples/browser-session/browser-session.pipeline.yaml +50 -0
  467. package/examples/browser-session/browser-session.task.yaml +6 -0
  468. package/examples/browser-session/check-login.yaml +22 -0
  469. package/examples/browser-session/fixture-server.mjs +64 -0
  470. package/examples/browser-session/human-login.yaml +31 -0
  471. package/examples/browser-session/merge.yaml +36 -0
  472. package/examples/browser-session/work-a.yaml +41 -0
  473. package/examples/browser-session/work-b.yaml +41 -0
  474. package/examples/ci-validate/README.md +35 -0
  475. package/examples/ci-validate/check.yaml +13 -0
  476. package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
  477. package/examples/ci-validate/validate.sh +5 -0
  478. package/examples/compliance-review-demo/README.md +125 -0
  479. package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
  480. package/examples/compliance-review-demo/connect-account.yaml +47 -0
  481. package/examples/compliance-review-demo/map-to-control.yaml +123 -0
  482. package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
  483. package/examples/compliance-review-demo/publish-report.yaml +79 -0
  484. package/examples/compliance-review-demo/review-verdict.yaml +122 -0
  485. package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
  486. package/examples/compliance-review-demo/store-evidence.yaml +143 -0
  487. package/examples/conditional-fork/README.md +89 -0
  488. package/examples/conditional-fork/branch-a.yaml +13 -0
  489. package/examples/conditional-fork/branch-b.yaml +13 -0
  490. package/examples/conditional-fork/decide.yaml +35 -0
  491. package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
  492. package/examples/conditional-fork/fork-demo.task.yaml +8 -0
  493. package/examples/context7-mcp/README.md +42 -0
  494. package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
  495. package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
  496. package/examples/context7-mcp/fetch-docs.yaml +52 -0
  497. package/examples/context7-mcp/resolve-library.yaml +31 -0
  498. package/examples/context7-mcp/write-brief.yaml +52 -0
  499. package/examples/feature-loop/README.md +104 -0
  500. package/examples/feature-loop/address-feedback.yaml +148 -0
  501. package/examples/feature-loop/align.yaml +116 -0
  502. package/examples/feature-loop/decompose.yaml +86 -0
  503. package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
  504. package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
  505. package/examples/feature-loop/feature-loop.task.yaml +25 -0
  506. package/examples/feature-loop/implement.yaml +128 -0
  507. package/examples/feature-loop/plan.yaml +111 -0
  508. package/examples/feature-loop/publish.yaml +167 -0
  509. package/examples/feature-loop/review.yaml +146 -0
  510. package/examples/feature-loop/verify.yaml +106 -0
  511. package/examples/feedback-loop/README.md +72 -0
  512. package/examples/feedback-loop/VERIFY.md +208 -0
  513. package/examples/feedback-loop/continue-only.task.yaml +4 -0
  514. package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
  515. package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
  516. package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
  517. package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
  518. package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
  519. package/examples/feedback-loop/implement.yaml +14 -0
  520. package/examples/feedback-loop/plan.yaml +14 -0
  521. package/examples/feedback-loop/review.yaml +15 -0
  522. package/examples/feedback-loop/send-back-once.task.yaml +6 -0
  523. package/examples/feedback-loop/submit.yaml +12 -0
  524. package/examples/generic-fan-in/README.md +151 -0
  525. package/examples/generic-fan-in/clarify.yaml +18 -0
  526. package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
  527. package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
  528. package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
  529. package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
  530. package/examples/generic-fan-in/research.yaml +45 -0
  531. package/examples/generic-fan-in/synthesize.yaml +66 -0
  532. package/examples/generic-fan-in/validation.yaml +45 -0
  533. package/examples/github-release/README.md +78 -0
  534. package/examples/github-release/draft-release-notes.yaml +64 -0
  535. package/examples/github-release/github-release.pipeline.yaml +11 -0
  536. package/examples/github-release/github-release.task.yaml +13 -0
  537. package/examples/github-release/publish-github-release.yaml +64 -0
  538. package/examples/hello-world/README.md +28 -0
  539. package/examples/hello-world/hello.pipeline.yaml +4 -0
  540. package/examples/hello-world/my-task.task.yaml +6 -0
  541. package/examples/hello-world/research.yaml +18 -0
  542. package/examples/mcp-hitl-tour/README.md +113 -0
  543. package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
  544. package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
  545. package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
  546. package/examples/mcp-hitl-tour/gather.yaml +31 -0
  547. package/examples/mcp-hitl-tour/intake.yaml +62 -0
  548. package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
  549. package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
  550. package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
  551. package/examples/mcp-hitl-tour/polish.yaml +33 -0
  552. package/examples/mcp-hitl-tour/review.yaml +17 -0
  553. package/examples/mcp-hitl-tour/ship.yaml +25 -0
  554. package/examples/oss-issue-contribution/README.md +218 -0
  555. package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
  556. package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
  557. package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
  558. package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
  559. package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
  560. package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
  561. package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
  562. package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
  563. package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
  564. package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
  565. package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
  566. package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
  567. package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
  568. package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
  569. package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
  570. package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
  571. package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
  572. package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
  573. package/examples/oss-quick-fix/README.md +65 -0
  574. package/examples/oss-quick-fix/implement-fix.yaml +84 -0
  575. package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
  576. package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
  577. package/examples/oss-quick-fix/ship-fix.yaml +81 -0
  578. package/examples/oss-quick-fix/understand-issue.yaml +67 -0
  579. package/examples/oss-quick-fix/verify-fix.yaml +73 -0
  580. package/examples/plan-review/README.md +37 -0
  581. package/examples/plan-review/plan-review-followup.yaml +13 -0
  582. package/examples/plan-review/plan-review.pipeline.yaml +9 -0
  583. package/examples/plan-review/plan-review.task.yaml +9 -0
  584. package/examples/plan-review/plan-review.yaml +25 -0
  585. package/examples/playwright-mcp/README.md +39 -0
  586. package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
  587. package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
  588. package/examples/playwright-mcp/screenshot.yaml +40 -0
  589. package/examples/retry-tour/README.md +75 -0
  590. package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
  591. package/examples/retry-tour/retry-tour.task.yaml +9 -0
  592. package/examples/route-if-tour/README.md +202 -0
  593. package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
  594. package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
  595. package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
  596. package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
  597. package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
  598. package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
  599. package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
  600. package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
  601. package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
  602. package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
  603. package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
  604. package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
  605. package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
  606. package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
  607. package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
  608. package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
  609. package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
  610. package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
  611. package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
  612. package/examples/route-wiring-smoke-test/README.md +377 -0
  613. package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
  614. package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
  615. package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
  616. package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
  617. package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
  618. package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
  619. package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
  620. package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
  621. package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
  622. package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
  623. package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
  624. package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
  625. package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
  626. package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
  627. package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
  628. package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
  629. package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
  630. package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
  631. package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
  632. package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
  633. package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
  634. package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
  635. package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
  636. package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
  637. package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
  638. package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
  639. package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
  640. package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
  641. package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
  642. package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
  643. package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
  644. package/examples/ship-feature/README.md +190 -0
  645. package/examples/ship-feature/feat-address-feedback.yaml +119 -0
  646. package/examples/ship-feature/feat-implement.yaml +180 -0
  647. package/examples/ship-feature/feat-plan.yaml +120 -0
  648. package/examples/ship-feature/feat-review.yaml +109 -0
  649. package/examples/ship-feature/feat-ship.yaml +203 -0
  650. package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
  651. package/examples/ship-feature/ship-feature.task.yaml +78 -0
  652. package/examples/stage-mcp/README.md +145 -0
  653. package/examples/stage-mcp/echo-mcp.mjs +20 -0
  654. package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
  655. package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
  656. package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
  657. package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
  658. package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
  659. package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
  660. package/examples/stage-mcp/use-echo.yaml +20 -0
  661. package/examples/stageflow.yaml +51 -0
  662. package/examples/verify-tour/README.md +80 -0
  663. package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
  664. package/examples/verify-tour/verify-tour.task.yaml +11 -0
  665. package/package.json +9 -1
  666. package/skills/stageflow/SKILL.md +6 -6
  667. package/skills/stageflow/references/control-surface.md +13 -5
  668. package/skills/stageflow/scripts/detect-host.mjs +14 -1
  669. package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
  670. package/skills/stageflow-author/SKILL.md +4 -3
  671. package/skills/stageflow-author/references/catalog-mapping.md +16 -0
  672. package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
  673. package/skills/stageflow-author/references/stage-prompt-template.md +4 -4
  674. package/skills/stageflow-run/SKILL.md +22 -12
  675. package/skills/stageflow-run/references/mcp-call.md +9 -1
  676. package/skills/stageflow-run/references/task-and-pipeline-selection.md +19 -6
  677. package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
  678. package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
  679. package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
  680. package/skills/stageflow-setup/SKILL.md +51 -8
  681. package/dist/ui/assets/index-Da5EHU6M.js +0 -119
@@ -0,0 +1,103 @@
1
+ id: poll-bucket-config
2
+ system_prompt: |
3
+ Read bucket, check_id, and scenario from the prior stage's payload.
4
+ bucket is the bare bucket name, no gs:// or s3:// prefix — add the right
5
+ prefix yourself for whichever CLI you end up using.
6
+
7
+ The four output fields (block_public_acls, ignore_public_acls,
8
+ block_public_policy, restrict_public_buckets) are cloud-agnostic — they
9
+ mean "is public access meaningfully blocked", not literally AWS S3
10
+ setting names. Try real polls in this order, first one that works wins:
11
+
12
+ 1. GCP: if `gcloud` is on PATH and `gcloud auth list
13
+ --filter=status:ACTIVE --format="value(account)"` returns a account,
14
+ poll the real bucket:
15
+ gcloud storage buckets describe gs://<bucket> --format=json
16
+ gcloud storage buckets get-iam-policy gs://<bucket> --format=json
17
+ Read these exact fields from the describe output:
18
+ public_access_prevention ("enforced" or "inherited")
19
+ uniform_bucket_level_access (boolean)
20
+ From the IAM policy output, check every binding's members list for
21
+ "allUsers" or "allAuthenticatedUsers" — call this has_public_iam_binding.
22
+ Map to the four fields:
23
+ block_public_acls = uniform_bucket_level_access
24
+ ignore_public_acls = uniform_bucket_level_access
25
+ block_public_policy = (public_access_prevention == "enforced")
26
+ restrict_public_buckets = NOT has_public_iam_binding
27
+ Set source = "real-gcp". Ignore scenario in this case.
28
+
29
+ 2. AWS: else if `aws` CLI is on PATH and `aws sts get-caller-identity`
30
+ succeeds, run `aws s3api get-public-access-block --bucket <bucket>`
31
+ and use that real response directly (the field names already match).
32
+ Set source = "real-aws". Ignore scenario in this case.
33
+
34
+ 3. Simulated: otherwise — no working cloud CLI — produce a SIMULATED
35
+ response and set source = "simulated". Never present simulated data
36
+ as real; label it "simulated" wherever it's written down. Use
37
+ scenario to pick the fixture:
38
+
39
+ scenario "fail":
40
+ { block_public_acls: true, ignore_public_acls: true,
41
+ block_public_policy: false, restrict_public_buckets: true }
42
+
43
+ scenario "fixed":
44
+ { block_public_acls: true, ignore_public_acls: true,
45
+ block_public_policy: true, restrict_public_buckets: true }
46
+
47
+ Write the raw response via write_stage_artifact. For a real GCP poll,
48
+ include both the raw gcloud fields (public_access_prevention,
49
+ uniform_bucket_level_access, has_public_iam_binding) and the four mapped
50
+ booleans, so the translation is visible, not hidden. Clearly mark the
51
+ artifact "simulated", "real-aws", or "real-gcp".
52
+
53
+ summary and payload are handed to the next stage verbatim. State outcomes
54
+ and artifact pointers only. Do not repeat this stage's prohibitions in
55
+ summary — downstream will obey them literally.
56
+
57
+ When finished, call emit_stage_envelope exactly once with status, summary,
58
+ artifacts, and a payload matching io.output.schema: bucket, check_id,
59
+ scenario carried forward, plus source and the four boolean fields. Your
60
+ last tool call in this attempt must be emit_stage_envelope. An empty
61
+ final message is a stage failure.
62
+ model: anthropic/claude-sonnet-4-5
63
+ io:
64
+ input:
65
+ schema:
66
+ type: object
67
+ required: [bucket, check_id, scenario]
68
+ properties:
69
+ bucket:
70
+ type: string
71
+ check_id:
72
+ type: string
73
+ scenario:
74
+ type: string
75
+ output:
76
+ schema:
77
+ type: object
78
+ required:
79
+ - bucket
80
+ - check_id
81
+ - scenario
82
+ - source
83
+ - block_public_acls
84
+ - ignore_public_acls
85
+ - block_public_policy
86
+ - restrict_public_buckets
87
+ properties:
88
+ bucket:
89
+ type: string
90
+ check_id:
91
+ type: string
92
+ scenario:
93
+ type: string
94
+ source:
95
+ type: string
96
+ block_public_acls:
97
+ type: boolean
98
+ ignore_public_acls:
99
+ type: boolean
100
+ block_public_policy:
101
+ type: boolean
102
+ restrict_public_buckets:
103
+ type: boolean
@@ -0,0 +1,79 @@
1
+ id: publish-report
2
+ system_prompt: |
3
+ Read the evidence log at
4
+ examples/compliance-review-demo/data/evidence-log.json (checkout-relative,
5
+ use the Read tool) and the current run's payload.
6
+
7
+ Write a short markdown report via write_stage_artifact (for example
8
+ report.md) showing the timeline for this check_id + resource: every
9
+ recorded verdict with its timestamp, and — for any row with
10
+ reviewed = true — the reviewer. Make the human-in-the-loop review visible:
11
+ call out explicitly which rows were auto-approved (no flip) versus which
12
+ required a person's confirmation (a flip), since that distinction is the
13
+ whole point of this pipeline.
14
+
15
+ When finished, call emit_stage_envelope exactly once with status, summary,
16
+ and artifacts pointing at the report. Your last tool call in this attempt
17
+ must be emit_stage_envelope. An empty final message is a stage failure.
18
+ model: anthropic/claude-sonnet-4-5
19
+ io:
20
+ input:
21
+ schema:
22
+ type: object
23
+ required:
24
+ - bucket
25
+ - check_id
26
+ - scenario
27
+ - source
28
+ - block_public_acls
29
+ - ignore_public_acls
30
+ - block_public_policy
31
+ - restrict_public_buckets
32
+ - verdict
33
+ - resource
34
+ - failed_fields
35
+ - reviewed
36
+ - auto_approved
37
+ - reviewer
38
+ - control_id
39
+ - changed_files
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
+ verdict:
58
+ type: string
59
+ resource:
60
+ type: string
61
+ failed_fields:
62
+ type: array
63
+ items:
64
+ type: string
65
+ reviewed:
66
+ type: boolean
67
+ auto_approved:
68
+ type: boolean
69
+ reviewer:
70
+ type: string
71
+ control_id:
72
+ type: string
73
+ changed_files:
74
+ type: array
75
+ items:
76
+ type: string
77
+ output:
78
+ schema:
79
+ type: object
@@ -0,0 +1,122 @@
1
+ id: review-verdict
2
+ system_prompt: |
3
+ This stage never pauses for a human — it has to be safe to run unattended
4
+ on a schedule (cron, a nightly GitHub Action, Cloud Scheduler). It still
5
+ tells the difference between "nothing changed" and "this just flipped,"
6
+ it just never blocks on that difference.
7
+
8
+ 1. Read examples/compliance-review-demo/data/evidence-log.json if it
9
+ exists (checkout-relative path, use the Read tool). Find the most
10
+ recent entry for this run's check_id + resource, if any.
11
+ 2. No prior entry, or the prior entry's verdict matches this run's
12
+ verdict: set reviewer = "auto".
13
+ 3. Prior entry exists and its verdict differs from this run's verdict (a
14
+ flip): set reviewer = "unreviewed-flip" and write a short artifact via
15
+ write_stage_artifact noting the flip (prior verdict, new verdict, the
16
+ raw field values from the prior stage's payload), so a person can spot
17
+ it later in the evidence log or the published report — without the
18
+ run ever waiting on them.
19
+ 4. In both cases set reviewed = false and auto_approved = true. Never
20
+ call ask_operator — this stage has no gate_kinds. Always emit an
21
+ advancing success status; a flip is information, not a failure.
22
+
23
+ summary and payload are handed to the next stage verbatim. State outcomes
24
+ and artifact pointers only. Do not repeat this stage's prohibitions in
25
+ summary — downstream will obey them literally.
26
+
27
+ When finished, call emit_stage_envelope exactly once with status, summary,
28
+ artifacts, and a payload matching io.output.schema: everything carried
29
+ forward from the prior stage, plus reviewed, auto_approved, and reviewer
30
+ as described above. Your last tool call in this attempt must be
31
+ emit_stage_envelope. An empty final message is a stage failure.
32
+ model: anthropic/claude-sonnet-4-5
33
+ io:
34
+ input:
35
+ schema:
36
+ type: object
37
+ required:
38
+ - bucket
39
+ - check_id
40
+ - scenario
41
+ - source
42
+ - block_public_acls
43
+ - ignore_public_acls
44
+ - block_public_policy
45
+ - restrict_public_buckets
46
+ - verdict
47
+ - resource
48
+ - failed_fields
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
+ output:
75
+ schema:
76
+ type: object
77
+ required:
78
+ - bucket
79
+ - check_id
80
+ - scenario
81
+ - source
82
+ - block_public_acls
83
+ - ignore_public_acls
84
+ - block_public_policy
85
+ - restrict_public_buckets
86
+ - verdict
87
+ - resource
88
+ - failed_fields
89
+ - reviewed
90
+ - auto_approved
91
+ - reviewer
92
+ properties:
93
+ bucket:
94
+ type: string
95
+ check_id:
96
+ type: string
97
+ scenario:
98
+ type: string
99
+ source:
100
+ type: string
101
+ block_public_acls:
102
+ type: boolean
103
+ ignore_public_acls:
104
+ type: boolean
105
+ block_public_policy:
106
+ type: boolean
107
+ restrict_public_buckets:
108
+ type: boolean
109
+ verdict:
110
+ type: string
111
+ resource:
112
+ type: string
113
+ failed_fields:
114
+ type: array
115
+ items:
116
+ type: string
117
+ reviewed:
118
+ type: boolean
119
+ auto_approved:
120
+ type: boolean
121
+ reviewer:
122
+ type: string
@@ -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