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,99 @@
1
+ # Examples
2
+
3
+ Runnable Stageflow catalogs. Each directory is **pipeline-owned** (co-located `*.pipeline.yaml`, stage YAML, `*.task.yaml`). Run commands use **paths from the repository git root**.
4
+
5
+ Stages are **author-defined** in YAML; these walkthroughs show domain-neutral flows, release automation, and an SDLC-style plan review — not built-in product types. Author contracts with `io` / `verify` / `on_verify_fail` — see [YAML catalog](../docs/yaml-catalog.md).
6
+
7
+ Upgrading older YAML: [`sf migrate-yaml`](../docs/cli-reference.md#sf-migrate-yaml) converts contract keys to `io` / `verify` / `on_verify_fail`. Wiring (`needs` / `fork` / `feedback_loop`) is a hard cutover to `route` / `entry` / `{ type: loop }` — see [Upgrading older catalogs](../docs/yaml-catalog.md#upgrading-older-catalogs) (wiring subsection). `sf migrate-yaml` does not rewrite wiring.
8
+
9
+ [Clone Chain](../docs/yaml-catalog.md#clone-chain) (one Clone Instance per Clone Array element) is documented in the YAML catalog. Walkthrough: [`feature-loop/`](feature-loop/). Canonical shapes: [`tests/fixtures/pipelines/clone-chain-*.pipeline.yaml`](../tests/fixtures/pipelines/).
10
+
11
+ ## Featured example: Archify on PR
12
+
13
+ **[`archify-on-pr/`](archify-on-pr/)** is the flagship CI dogfood walkthrough. It shows what configurable stages look like in production:
14
+
15
+ - **Route `if`** — `detect-changes` emits `author_diagrams` and skips `author-diagrams` when the PR diff has no diagram-relevant types
16
+ - **Multi-type output** — one pipeline authors 1–5 Archify diagram specs (`architecture`, `workflow`, `sequence`, `dataflow`, `lifecycle`)
17
+ - **Skill binding** — `skill: archify` on the pipeline stage entry; GHA provisions the skill via `sf skills install`
18
+ - **Deterministic handoff** — agents emit JSON specs; GHA runs `sf envelope get --format handoff` and Archify `deliver` outside the agent
19
+ - **Real automation** — [`.github/workflows/archify-pr-diagrams.yml`](../.github/workflows/archify-pr-diagrams.yml) posts sticky PR comments with browser-viewable HTML artifacts
20
+
21
+ Start here: [archify-on-pr/README.md](archify-on-pr/README.md) · CI overview: [docs/ci.md#pr-diagrams-archify](../docs/ci.md#pr-diagrams-archify)
22
+
23
+ More CI-focused examples will follow this pattern (prepare context → run pipeline → consume envelope in shell).
24
+
25
+ | Example | Description | Commands |
26
+ |---------|-------------|----------|
27
+ | [hello-world](hello-world/) | Single stage; demos `task.input` ↔ entry `io.input.schema` | `sf validate --strict`, `sf run` with paths below |
28
+ | [plan-review](plan-review/) | Multi-stage with operator gate | `sf ui`, then `sf run` |
29
+ | [conditional-fork](conditional-fork/) | HITL then exclusive Route `if`; operator chooses branch | `sf ui`, then `sf run` |
30
+ | [generic-fan-in](generic-fan-in/) | Dummy diamond join; inspect keyed parent envelopes | `sf ui`, then `sf run` |
31
+ | [stage-mcp](stage-mcp/) | Stage MCP via project `.mcp.json` and a local echo fixture | `sf validate`, then `sf run` from git root |
32
+ | [playwright-mcp](playwright-mcp/) | One stage: open a page and save a PNG screenshot (Playwright MCP) | `sf validate`, then `sf run` from git root |
33
+ | [browser-session](browser-session/) | Saved browser login: check, human login only when logged out, then work; local fixture site | [README](browser-session/README.md), then `sf run` |
34
+ | [context7-mcp](context7-mcp/) | Three stages: resolve a library, fetch docs, write a brief (Context7 MCP) | `sf validate`, then `sf run` from git root |
35
+ | [feedback-loop](feedback-loop/) | Source-owned review loop (`continue` / `send_back`) | `sf validate`, then `sf run` |
36
+ | [feature-loop](feature-loop/) | Epic-to-PR; two Clone Chains + `{ type: loop }` | `sf validate`, then `sf run` |
37
+ | [ship-feature](ship-feature/) | Plan → implement → parallel review → operator-approved PR | `sf validate`, then `sf run` |
38
+ | [oss-issue-contribution](oss-issue-contribution/) | Real upstream issue: reproduce, parallel investigation, gated fix, verification, parallel review | [README](oss-issue-contribution/README.md), then `sf run` |
39
+ | [oss-quick-fix](oss-quick-fix/) | Unattended sibling of oss-issue-contribution: straight-line fix with no operator gate | [README](oss-quick-fix/README.md), then `sf run` |
40
+ | [github-release](github-release/) | Dogfood: draft + publish GitHub Release | Used in publish/release workflows |
41
+ | [archify-on-pr](archify-on-pr/) | **Featured** — PR diagrams via Route `if` + Archify handoff | [README](archify-on-pr/README.md), archify-pr-diagrams workflow |
42
+ | [ci-validate](ci-validate/) | Strict manifest validate in CI | `./validate.sh` |
43
+ | [route-if-tour](route-if-tour/) | Deterministic `if` tour: operators, composition, skip, join fire/miss | `sf ui`, then pick `route-if-tour` |
44
+ | [verify-tour](verify-tour/) | Verify check types: artifact, command, checklist, payload_schema, gate, checkout_changes | `sf ui`, then pick `verify-tour` |
45
+ | [retry-tour](retry-tour/) | Retry surfaces: emit soft-reject, automatic repair, manual recover, ordinary Retry | `sf ui`, then pick `retry-tour` |
46
+ | [mcp-hitl-tour](mcp-hitl-tour/) | MCP HITL tour: free_text gate, ungated fan-out + Clone Chain join, wait_for_human loop, artifacts | `sf ui` / MCP `start_run`, then [README](mcp-hitl-tour/README.md) |
47
+
48
+ Current wiring tours: [`route-wiring-smoke-test`](route-wiring-smoke-test/), [`route-if-tour`](route-if-tour/).
49
+
50
+ Browse scope is declared in repo-root [`stageflow.yaml`](../stageflow.yaml). Cold Host (`sf ui` / `sf mcp`) also browses the packaged seeded root via [`examples/stageflow.yaml`](stageflow.yaml) (paths relative to `examples/`; wire `project_root: "examples"`). **`sf ui` started from any subdirectory** still uses the global durable root (`$STAGEFLOW_HOME`) for run state.
51
+
52
+ ## Prerequisites (all examples)
53
+
54
+ - **Node.js ≥ 20**
55
+ - Stageflow CLI: `npm i -g stageflow` (or `npm run build` in this repo)
56
+ - **Provider auth** for `sf run` (not required for `sf validate`)
57
+
58
+ ## Validate all examples
59
+
60
+ From repo root after `npm run build`:
61
+
62
+ ```bash
63
+ npm run validate:examples
64
+ ```
65
+
66
+ ## Run an example (repo root)
67
+
68
+ ```bash
69
+ sf validate --strict
70
+ sf run \
71
+ --pipeline examples/hello-world/hello.pipeline.yaml \
72
+ --task examples/hello-world/my-task.task.yaml
73
+ ```
74
+
75
+ Current wiring north star: [`examples/route-wiring-smoke-test/`](route-wiring-smoke-test/) and [`examples/route-if-tour/`](route-if-tour/). HITL then exclusive Route `if`: [`examples/conditional-fork/`](conditional-fork/).
76
+
77
+ ```bash
78
+ sf run \
79
+ --pipeline examples/conditional-fork/fork-demo.pipeline.yaml \
80
+ --task examples/conditional-fork/fork-demo.task.yaml
81
+ ```
82
+
83
+ Archify-on-PR local dry-run (requires `OPENAI_API_KEY` + Archify skill — see example README):
84
+
85
+ ```bash
86
+ ./scripts/prepare-ci-context.sh ci-context.json
87
+ sf run \
88
+ --pipeline examples/archify-on-pr/archify-on-pr.pipeline.yaml \
89
+ --task examples/archify-on-pr/archify-on-pr.task.yaml \
90
+ --skip-gates --json > sf-run.json
91
+ ```
92
+
93
+ Terminal 1 (optional console, from any subdirectory):
94
+
95
+ ```bash
96
+ cd examples/conditional-fork && sf ui
97
+ ```
98
+
99
+ See [docs/quickstart.md](../docs/quickstart.md) and [docs/providers.md](../docs/providers.md).
@@ -0,0 +1,213 @@
1
+ # archify-on-pr
2
+
3
+ Manually triggered Archify diagrams: prepare deterministic PR context (paths +
4
+ diagram types), copy that into a detect-changes handoff, and author JSON specs
5
+ for GHA to deliver as HTML.
6
+
7
+ ## Layout
8
+
9
+ | Path | Role |
10
+ |------|------|
11
+ | `archify-on-pr.pipeline.yaml` | detect-changes Route `if` → author-diagrams; `verify` + `on_verify_fail` on detect |
12
+ | `detect-changes.yaml` | Thin copy/emit from `ci-context.json` → `changes.json` + envelope |
13
+ | `author-diagrams.yaml` | Writes `{type}.spec.json` per selected type (skill: archify on pipeline entry) |
14
+ | `archify-on-pr.task.yaml` | Task bound at run time |
15
+ | `../../scripts/prepare-ci-context.sh` | Deterministic PR/git context + diagram type selection before `sf run` |
16
+ | `../../scripts/validate-detect-envelope.mjs` | Verify helper: `changes.json` / envelope match `ci-context.json` |
17
+
18
+ ## Diagram types
19
+
20
+ Selection is **deterministic** in `prepare-ci-context.sh` from path rules on
21
+ `relevant_files` (not the detect agent). The table documents those rules:
22
+
23
+ | Type | Path rules (typical) |
24
+ |------|----------------------|
25
+ | `architecture` | `src/agent`, `src/server`, `src/mcp`, `src/runstore`, `ui/`, `skills/`, `stageflow.yaml`, `package.json` |
26
+ | `workflow` | `*.pipeline.yaml`, `examples/`, `.github/workflows/`, `scripts/`, `src/runtime`, `src/config` |
27
+ | `sequence` | `src/server`, `src/mcp`, `src/cli/runs*`, `ui/` |
28
+ | `dataflow` | `src/envelope`, `src/runstore`, `src/projection`, `src/config` |
29
+ | `lifecycle` | `src/runtime`, `src/tools` |
30
+
31
+ A path may map to more than one type. If `relevant_files` is non-empty but no
32
+ rule matches, the script defaults to `architecture`. Empty `relevant_files`
33
+ yields empty `diagram_types` / `author_diagrams: false` (and empty
34
+ `expected_fork_choice` as a CI-side signal).
35
+
36
+ detect-changes copies those types into `changes.json` and the envelope and
37
+ sets `author_diagrams` true iff `diagram_types` is non-empty. The pipeline
38
+ gates a single author-diagrams session with Route `if` (not a Clone Chain):
39
+
40
+ ```yaml
41
+ route:
42
+ - to: author-diagrams
43
+ if:
44
+ field: author_diagrams
45
+ op: eq
46
+ value: true
47
+ ```
48
+
49
+ ## Prerequisites
50
+
51
+ - Node.js ≥ 20, Stageflow built (`npm run build`)
52
+ - **OpenRouter** provider
53
+ (`openrouter/nvidia/nemotron-3-ultra-550b-a55b:free`) — set
54
+ `OPENROUTER_API_KEY`, then:
55
+ `sf providers login openrouter --type api_key --api-key-env OPENROUTER_API_KEY`
56
+ - **Archify skill** at `.pi/skills/archify/` (see below)
57
+ - Git checkout at the target head; run `prepare-ci-context.sh` before `sf run`
58
+ (GHA does this automatically)
59
+
60
+ ## CI context (`ci-context.json`)
61
+
62
+ Before Stageflow runs, GHA executes `scripts/prepare-ci-context.sh`. It resolves
63
+ `head_sha`, `repo_url`, file lists, and diagram selection:
64
+
65
+ | Field | Meaning |
66
+ |-------|---------|
67
+ | `changed_files` | Full three-dot diff vs base |
68
+ | `relevant_files` | Filtered subset for diagram decisions |
69
+ | `content_hash` | Hash of `relevant_files` only (empty string when none) |
70
+ | `verified_paths` | Whether each changed path exists at `head_sha` |
71
+ | `diagram_types` | Deterministic types from path rules on `relevant_files` |
72
+ | `change_summary` | Short summary derived from the relevant set |
73
+ | `expected_fork_choice` | CI-side list: `["author-diagrams"]` when types non-empty, else `[]` |
74
+
75
+ `relevant_files` excludes `docs/**`, `*.md` (except `skills/**`), lockfiles,
76
+ `tests/**` except `tests/fixtures/**/*.{yaml,yml}`, pitch-deck / pitch-assets,
77
+ and editor noise (`.editorconfig`, `.vscode/`, `.idea/`). When that list is
78
+ empty, `diagram_types` and `expected_fork_choice` are empty and GHA early-skips
79
+ the `sf-run` step. detect-changes copies `relevant_files` into
80
+ `changes.json` as `changed_files` and emits `author_diagrams` true iff
81
+ `diagram_types` is non-empty. Catalog routing uses that boolean, not
82
+ `fork_choice`.
83
+
84
+ Both pipeline stages read this file — agents do not use `GITHUB_SHA` or run
85
+ their own git diff. detect-changes does not re-derive types; it only copies and
86
+ emits. The pipeline enforces that with body `verify` (`type: artifact` on
87
+ `changes.json` at emit and after, plus after-phase payload and command checks)
88
+ and wiring `on_verify_fail: repair`.
89
+
90
+ Local dry-run:
91
+
92
+ ```bash
93
+ PR_HEAD_SHA="$(git rev-parse HEAD)" \
94
+ GITHUB_REPOSITORY="$(git remote get-url origin | sed -E 's#.*github.com[:/]([^/]+/[^/.]+).*#\1#')" \
95
+ GITHUB_BASE_REF=main \
96
+ ./scripts/prepare-ci-context.sh ci-context.json
97
+ ```
98
+
99
+ ## Install Archify skill
100
+
101
+ From the repository git root (after `npm run build`):
102
+
103
+ ```bash
104
+ node dist/cli.js skills install \
105
+ --from-zip "https://github.com/tt-a1i/archify/releases/download/v2.15.0/archify.zip" \
106
+ --skill-name archify
107
+ ```
108
+
109
+ For local development, install from an existing skill tree:
110
+
111
+ ```bash
112
+ node dist/cli.js skills install --from-path ~/.agents/skills/archify --skill-name archify
113
+ ```
114
+
115
+ Install runs `archify doctor` after copying to `.pi/skills/archify/`.
116
+
117
+ ## Commands
118
+
119
+ Local dry-run from repo root:
120
+
121
+ ```bash
122
+ sf validate --strict
123
+ export OPENROUTER_API_KEY=…
124
+ sf providers login openrouter --type api_key --api-key-env OPENROUTER_API_KEY
125
+ ./scripts/prepare-ci-context.sh ci-context.json
126
+ sf run \
127
+ --pipeline examples/archify-on-pr/archify-on-pr.pipeline.yaml \
128
+ --task examples/archify-on-pr/archify-on-pr.task.yaml \
129
+ --checkout "$PWD" \
130
+ --skip-gates \
131
+ --json > sf-run.json
132
+ ```
133
+
134
+ When prepare-ci-context selects no types (`author_diagrams: false`),
135
+ Route `if` skips `author-diagrams`. When types are selected, inspect
136
+ `{type}.spec.json` files in the run workspace.
137
+
138
+ ### Extract envelope
139
+
140
+ Mirrors the GHA deliver step — reads the author stage envelope via the CLI:
141
+
142
+ ```bash
143
+ node dist/cli.js envelope get --from sf-run.json --stage author-diagrams \
144
+ --detect-stage detect-changes --format handoff --json > envelope.json
145
+ ```
146
+
147
+ When author-diagrams ran, output is
148
+ `{ "skipped": false, "diagrams": [{ diagram_type, spec_path, summary }, …] }`.
149
+ When `author_diagrams` is false, Route `if` skips that stage; GHA usually
150
+ early-skips the whole `sf-run` step when `relevant_files` is empty.
151
+ Deliver manually:
152
+
153
+ ```bash
154
+ node dist/cli.js envelope get --from sf-run.json --stage author-diagrams \
155
+ --detect-stage detect-changes --format handoff --json > envelope.json
156
+ ./scripts/deliver-diagrams.sh envelope.json diagrams
157
+ ```
158
+
159
+ Or per diagram:
160
+
161
+ ```bash
162
+ mkdir -p diagrams
163
+ while IFS= read -r d; do
164
+ TYPE=$(jq -r .diagram_type <<<"$d")
165
+ SPEC=$(jq -r .spec_path <<<"$d")
166
+ node .pi/skills/archify/bin/archify.mjs deliver \
167
+ "$TYPE" "$SPEC" "diagrams/${TYPE}.html" --quality showcase
168
+ done < <(jq -c '.diagrams[]' envelope.json)
169
+ ```
170
+
171
+ ## Environment variables
172
+
173
+ | Variable | Used by | Description |
174
+ |----------|---------|-------------|
175
+ | `OPENROUTER_API_KEY` | `sf run` | OpenRouter provider auth (required) |
176
+ | `PR_NUMBER` | prepare-ci-context | PR number override (enables sticky comment in GHA when set) |
177
+ | `PR_HEAD_SHA` | prepare-ci-context | PR head commit SHA |
178
+ | `GITHUB_REPOSITORY` | prepare-ci-context | `owner/repo` |
179
+ | `GITHUB_BASE_REF` | prepare-ci-context | PR base branch (default: `main`) |
180
+ | `GITHUB_HEAD_REF` | prepare-ci-context | PR head branch name |
181
+ | `CI_CONTEXT_FILE` | deliver-diagrams.sh / validate-detect-envelope.mjs | Path to context JSON (default: `ci-context.json`) |
182
+ | `ARCHIFY_SOURCE_DIR` | GHA secret | Local Archify skill path (`sf skills install --from-path`) |
183
+ | `ARCHIFY_ZIP_URL` | GHA variable | Release zip URL (`sf skills install --from-zip`; defaults to Archify v2.15.0) |
184
+
185
+ ## Fork PR limitation
186
+
187
+ The workflow posts a sticky PR comment with `pull-requests: write` only when
188
+ `pr_number` is provided. On **fork PRs**, GitHub downgrades `GITHUB_TOKEN` — the
189
+ job may succeed but cannot post or update the comment. Same-repo branch PRs are
190
+ supported; fork comment posting is deferred.
191
+
192
+ ## GitHub Actions
193
+
194
+ See [`.github/workflows/archify-pr-diagrams.yml`](../../.github/workflows/archify-pr-diagrams.yml).
195
+
196
+ **Manual trigger only** (`workflow_dispatch` — not automatic on every PR).
197
+
198
+ 1. Open **Actions** → **Archify PR diagrams** → **Run workflow**
199
+ 2. Provide **one of**:
200
+ - `pr_number` — resolves head/base from the PR; enables the sticky PR comment
201
+ - `head_ref` — branch or commit SHA when not targeting a PR
202
+ 3. Optionally set `base_ref` (default: `main`) for the three-dot diff
203
+
204
+ The workflow uses the [`.github/actions/sf-run`](../../.github/actions/sf-run)
205
+ composite to run the pipeline and extract a handoff envelope via
206
+ `sf envelope get --format handoff`. `prepare-ci-context.sh` runs before the
207
+ pipeline; if `relevant_files` is empty, GHA skips `sf-run`, deliver, upload, and
208
+ comment. detect-changes only copies/validates against that context; agents
209
+ author JSON only in author-diagrams. GHA runs `deliver-diagrams.sh` (Archify
210
+ `deliver` per type), uploads each `{type}.html` unzipped (`upload-artifact@v7`,
211
+ `archive: false`) for in-browser viewing, also uploads a zipped `diagrams/`
212
+ bundle, and updates the sticky comment when `pr_number` is set. Debug artifacts
213
+ include `ci-context.json`, `sf-run.json`, `envelope.json`, and `run-export.json`.
@@ -0,0 +1,19 @@
1
+ id: archify-on-pr
2
+ stages:
3
+ - id: detect-changes
4
+ uses: ./detect-changes.yaml
5
+ entry: true
6
+ route:
7
+ - to: author-diagrams
8
+ if:
9
+ field: author_diagrams
10
+ op: eq
11
+ value: true
12
+ on_verify_fail:
13
+ mode: repair
14
+ max_attempts: 2
15
+ retry_safety: idempotent
16
+ include_failed_checks: true
17
+ - id: author-diagrams
18
+ uses: ./author-diagrams.yaml
19
+ skill: archify
@@ -0,0 +1,19 @@
1
+ id: archify-on-pr
2
+ goal: |
3
+ Detect pull-request changes that warrant diagrams and author one or more Archify
4
+ JSON specs (architecture, workflow, sequence, dataflow, lifecycle) when warranted.
5
+ context: |
6
+ GHA runs scripts/prepare-ci-context.sh before this pipeline, writing ci-context.json
7
+ at the repo root with head_sha, repo_url, changed_files, relevant_files,
8
+ diagram_types, change_summary, expected_fork_choice, and verified_paths.
9
+ Diagram type selection is deterministic in prepare-ci-context — detect-changes only
10
+ copies those fields into the envelope and sets author_diagrams from diagram_types.
11
+ CI uses OpenRouter (OPENROUTER_API_KEY).
12
+ Stage 1 emits the detect handoff (after-phase verify). Route if runs a single
13
+ author-diagrams session when author_diagrams is true. Stage 2 writes one spec
14
+ artifact per selected type for GHA to deliver as HTML outside the agent.
15
+ constraints: |
16
+ No HITL. Do not call ask_operator. Stages use OpenRouter models; ensure
17
+ OPENROUTER_API_KEY is available in CI. detect-changes must not invent diagram_types
18
+ or paths. The author stage must not install Archify, run npm install, or call
19
+ deliver or doctor — GHA owns tool provisioning and HTML delivery after the run.
@@ -0,0 +1,106 @@
1
+ id: author-diagrams
2
+ system_prompt: |
3
+ Author Archify diagram specs for every diagram type selected by detect-changes.
4
+
5
+ Read ci-context.json from the repository root and the detect-changes envelope for
6
+ pr_number, changed_files, diagram_types, change_summary, and content_hash. Use
7
+ verified_paths from ci-context.json — only cite source paths marked true.
8
+
9
+ When evidence exists in relevant paths, authored diagrams may reflect modern
10
+ verified stage execution, dual AgentPort (Pi/Claude), MCP + sf runs host-down,
11
+ and skills binding. Still require verified_paths and repo evidence; do not
12
+ invent components without source.
13
+
14
+ For each entry in diagram_types (architecture, workflow, sequence, dataflow,
15
+ lifecycle), write a separate spec artifact via write_stage_artifact:
16
+ architecture.spec.json, workflow.spec.json, sequence.spec.json,
17
+ dataflow.spec.json, or lifecycle.spec.json. Each JSON must be valid Archify IR
18
+ for that type with schema_version and meta.quality_profile set to showcase.
19
+
20
+ Read the Archify skill schema and one matching example for each type before
21
+ authoring. Keep layouts sparse: at most 12 primary nodes, short labels and
22
+ sublabels, and node widths/heights that fit the text (workflow nodes often
23
+ need width >= 140). Leave at least 8px between adjacent nodes in the same lane.
24
+
25
+ Do not set meta.repository in specs — GHA deliver injects it from ci-context.json
26
+ when sources[] are present. Omit component sources[] unless the path is true in
27
+ ci-context.json verified_paths and validate passes with --repo-root.
28
+
29
+ After each spec edit, run validate and fix every diagnostic before continuing:
30
+ node .pi/skills/archify/bin/archify.mjs validate <type> <spec.json> --quality showcase --json
31
+ For architecture with sources[], also pass --repo-root to the PR head checkout.
32
+ Require ok:true with 9/9 artifact checks and 0 composition errors per spec.
33
+
34
+ FORBIDDEN: deliver, npm install, doctor, ask_operator. Do not invoke deliver;
35
+ GHA runs deliver after this stage completes.
36
+
37
+ Call emit_stage_envelope exactly once with status success, every spec artifact
38
+ in artifacts, a one-sentence summary, and a payload matching the stage schema
39
+ with a diagrams array — one object per authored type:
40
+ { diagram_type, spec_artifact, summary }.
41
+ Do not stop after a chat reply.
42
+ model: openrouter/nvidia/nemotron-3-ultra-550b-a55b:free
43
+ io:
44
+ input:
45
+ schema:
46
+ type: object
47
+ required:
48
+ - pr_number
49
+ - base_ref
50
+ - head_sha
51
+ - changed_files
52
+ - diagram_types
53
+ - change_summary
54
+ - content_hash
55
+ - author_diagrams
56
+ properties:
57
+ pr_number:
58
+ type: string
59
+ base_ref:
60
+ type: string
61
+ head_sha:
62
+ type: string
63
+ changed_files:
64
+ type: array
65
+ items:
66
+ type: string
67
+ diagram_types:
68
+ type: array
69
+ items:
70
+ type: string
71
+ enum:
72
+ - architecture
73
+ - workflow
74
+ - sequence
75
+ - dataflow
76
+ - lifecycle
77
+ change_summary:
78
+ type: string
79
+ content_hash:
80
+ type: string
81
+ author_diagrams:
82
+ type: boolean
83
+ additionalProperties: false
84
+ output:
85
+ schema:
86
+ type: object
87
+ required:
88
+ - diagrams
89
+ properties:
90
+ diagrams:
91
+ type: array
92
+ items:
93
+ type: object
94
+ required:
95
+ - diagram_type
96
+ - spec_artifact
97
+ - summary
98
+ properties:
99
+ diagram_type:
100
+ type: string
101
+ spec_artifact:
102
+ type: string
103
+ summary:
104
+ type: string
105
+ additionalProperties: false
106
+ additionalProperties: false
@@ -0,0 +1,89 @@
1
+ id: detect-changes
2
+ system_prompt: |
3
+ Emit the detect-changes handoff from ci-context.json. Do not invent types or paths.
4
+
5
+ 1. Read ci-context.json at the repository root. It already has pr_number, base_ref,
6
+ head_sha, relevant_files, diagram_types, change_summary, and content_hash.
7
+ Do not run git diff or re-derive diagram types. Ignore expected_fork_choice.
8
+
9
+ 2. Write changes.json via write_stage_artifact with exactly:
10
+ - pr_number, base_ref, head_sha, content_hash — copied from ci-context.json
11
+ - changed_files — copy relevant_files as-is (same order)
12
+ - diagram_types — copy diagram_types as-is
13
+ - change_summary — copy change_summary as-is
14
+ - author_diagrams — true when diagram_types is non-empty, false when empty
15
+
16
+ 3. Call emit_stage_envelope exactly once with status success, changes.json in
17
+ artifacts, a one-sentence summary, and payload matching the stage schema
18
+ (same field values as changes.json). Set author_diagrams true iff
19
+ diagram_types is non-empty, false iff empty. Do not put fork_choice on
20
+ the envelope or in changes.json.
21
+
22
+ Do not call ask_operator. Do not stop after a chat reply. Do not select types yourself.
23
+ model: openrouter/nvidia/nemotron-3-ultra-550b-a55b:free
24
+ io:
25
+ input:
26
+ schema:
27
+ type: object
28
+ output:
29
+ schema:
30
+ type: object
31
+ required:
32
+ - pr_number
33
+ - base_ref
34
+ - head_sha
35
+ - changed_files
36
+ - diagram_types
37
+ - change_summary
38
+ - content_hash
39
+ - author_diagrams
40
+ properties:
41
+ pr_number:
42
+ type: string
43
+ base_ref:
44
+ type: string
45
+ head_sha:
46
+ type: string
47
+ changed_files:
48
+ type: array
49
+ items:
50
+ type: string
51
+ diagram_types:
52
+ type: array
53
+ items:
54
+ type: string
55
+ enum:
56
+ - architecture
57
+ - workflow
58
+ - sequence
59
+ - dataflow
60
+ - lifecycle
61
+ change_summary:
62
+ type: string
63
+ content_hash:
64
+ type: string
65
+ author_diagrams:
66
+ type: boolean
67
+ additionalProperties: false
68
+ verify:
69
+ - id: changes-json-declared
70
+ type: artifact
71
+ basename: changes.json
72
+ when:
73
+ - emit
74
+ - id: changes-on-disk
75
+ type: artifact
76
+ path: changes.json
77
+ nonempty: true
78
+ when:
79
+ - after
80
+ - id: payload-ok
81
+ type: payload_schema
82
+ when:
83
+ - after
84
+ - id: matches-ci-context
85
+ type: command
86
+ run: node scripts/validate-detect-envelope.mjs
87
+ timeout_ms: 30000
88
+ when:
89
+ - after
@@ -0,0 +1,77 @@
1
+ # browser-session
2
+
3
+ Stages that keep one browser login across runs: **check the login, ask a person to log in only when needed, then do the work in two parallel stages that share the login, then merge.** The target is a tiny local fixture site, so nothing here touches a third-party service.
4
+
5
+ | Stage | What it does |
6
+ |-------|--------------|
7
+ | `check-login` | The Host opens `/home` with the saved profile and computes `{ logged_in, url }`. The stage reports it. Routes to `human-login` only when `logged_in` is `false`. |
8
+ | `human-login` | Opens a visible window on `/login`, stops at a `confirm` gate. The operator logs in and confirms. The Host checks the login again (`browser_login` verify, repair policy, up to 3 attempts). |
9
+ | `work-a` | Reads `/a` with the same profile in its own tab and writes `result.md`. Joins `check-login` and `human-login`. |
10
+ | `work-b` | Reads `/b` with the same profile in its own tab, at the same time as `work-a`. Joins `check-login` and `human-login`. |
11
+ | `merge` | No browser. Joins `work-a` and `work-b` and writes one merged `result.md`. |
12
+
13
+ Only the `check-login` to `human-login` edge has an `if`. The work stages are joins, so their inbound edges carry none. See [docs/browser.md](../../docs/browser.md#login-pattern).
14
+
15
+ ## Prerequisites
16
+
17
+ - Node.js 20 or newer and this repo's CLI (`npm run build`)
18
+ - Provider auth for `sf run`
19
+ - agent-browser: `npm i -g agent-browser && agent-browser install`
20
+ - A screen on this machine. The login window is visible (headed is the default). A Host with no screen, including the Docker image, cannot run `human-login` yet.
21
+
22
+ ## Run (repo root)
23
+
24
+ Start the fixture site in one terminal:
25
+
26
+ ```bash
27
+ node examples/browser-session/fixture-server.mjs
28
+ ```
29
+
30
+ It listens on `http://localhost:4173`. Set `PORT` to change it, and update the URLs in `browser-session.pipeline.yaml` to match.
31
+
32
+ In another terminal:
33
+
34
+ ```bash
35
+ npm run build
36
+ node dist/cli.js validate --pipeline examples/browser-session/browser-session.pipeline.yaml --strict
37
+ node dist/cli.js run \
38
+ --pipeline examples/browser-session/browser-session.pipeline.yaml \
39
+ --task examples/browser-session/browser-session.task.yaml
40
+ ```
41
+
42
+ Use `sf ui` instead of `sf run` if you want to answer the gate in the console.
43
+
44
+ ## First run
45
+
46
+ 1. `check-login` finds no login (`/home` redirects to `/login`). It reports `logged_in: false`.
47
+ 2. `human-login` opens a browser window on the fixture login page and asks you to confirm.
48
+ 3. Press **Log in** in that window, then answer the gate with accept. You never give a password to the agent.
49
+ 4. The Host checks again. If you confirmed too early, the stage asks again.
50
+ 5. `work-a` and `work-b` start together. They share one Chrome, each in its own tab, and both see the login.
51
+ 6. `merge` joins them and writes `result.md`.
52
+
53
+ ## Next run
54
+
55
+ `check-login` finds the saved login and reports `logged_in: true`. `human-login` is skipped. There is no question. `work-a` and `work-b` run straight away.
56
+
57
+ The fixture sets two cookies. The persistent one (`fixture_login`) is what keeps you logged in across runs. The session-only one (`fixture_session`) is shared by all stages of one run because the browser stays open for the whole run. Do not rely on a session-only cookie across runs. See [docs/browser.md](../../docs/browser.md#cookies-across-runs).
58
+
59
+ The run holds the profile until it ends. A second run that needs `fixture-site` waits for the whole first run.
60
+
61
+ ## What is stored where
62
+
63
+ - The profile (a Chrome folder with the cookies) lives under the Stageflow home: `$STAGEFLOW_HOME/browser/local/fixture-site/` (default `~/.stageflow/browser/local/fixture-site/`), owner-only permissions.
64
+ - Nothing is written into this repo. Run state and envelopes hold the profile name, never cookie values or paths.
65
+ - Profile uses are recorded in `$STAGEFLOW_HOME/browser/audit.jsonl`.
66
+
67
+ ## Clean up
68
+
69
+ Clear the login with `sf browser clear fixture-site` (see [CLI reference](../../docs/cli-reference.md)).
70
+
71
+ ## Headed and headless
72
+
73
+ Stages are headed by default. All stages that share a profile should use the same mode, because headless Chrome reports a different user agent. `human-login` must stay headed. To run the check and work stages headless, set `headed: false` on all four `browser` blocks and log in once with a headed run first.
74
+
75
+ ## Real sites
76
+
77
+ This example is neutral on purpose. Some sites forbid automation in their terms. Read the rules of any site before you point a stage at it. See [docs/browser.md](../../docs/browser.md#sites-can-forbid-automation).
@@ -0,0 +1,50 @@
1
+ id: browser-session
2
+ stages:
3
+ - id: check-login
4
+ uses: ./check-login.yaml
5
+ entry: true
6
+ browser:
7
+ profile: fixture-site
8
+ check:
9
+ url: http://localhost:4173/home
10
+ logged_in_url: http://localhost:4173/home*
11
+ logged_out_url: [http://localhost:4173/login*]
12
+ route:
13
+ - to: human-login
14
+ if:
15
+ field: logged_in
16
+ op: eq
17
+ value: false
18
+ - to: work-a
19
+ - to: work-b
20
+ - id: human-login
21
+ uses: ./human-login.yaml
22
+ browser:
23
+ profile: fixture-site
24
+ login_url: http://localhost:4173/login
25
+ check:
26
+ url: http://localhost:4173/home
27
+ logged_in_url: http://localhost:4173/home*
28
+ logged_out_url: [http://localhost:4173/login*]
29
+ on_verify_fail:
30
+ mode: repair
31
+ max_attempts: 3
32
+ retry_safety: idempotent
33
+ include_failed_checks: true
34
+ route:
35
+ - to: work-a
36
+ - to: work-b
37
+ - id: work-a
38
+ uses: ./work-a.yaml
39
+ browser:
40
+ profile: fixture-site
41
+ route:
42
+ - to: merge
43
+ - id: work-b
44
+ uses: ./work-b.yaml
45
+ browser:
46
+ profile: fixture-site
47
+ route:
48
+ - to: merge
49
+ - id: merge
50
+ uses: ./merge.yaml