stageflow 0.25.0 → 0.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (501) hide show
  1. package/README.md +10 -3
  2. package/dist/a2a/contracts.d.ts +1 -0
  3. package/dist/a2a/contracts.js +1 -0
  4. package/dist/a2a/registry.d.ts +2 -0
  5. package/dist/a2a/registry.js +20 -1
  6. package/dist/a2a/server.d.ts +7 -0
  7. package/dist/a2a/server.js +5 -2
  8. package/dist/a2a/service.d.ts +1 -1
  9. package/dist/a2a/service.js +57 -8
  10. package/dist/a2a/store.d.ts +8 -5
  11. package/dist/a2a/store.js +24 -67
  12. package/dist/agent/activity.d.ts +3 -0
  13. package/dist/agent/bootProviderConfig.d.ts +21 -0
  14. package/dist/agent/bootProviderConfig.js +74 -0
  15. package/dist/agent/piAdapter.d.ts +9 -1
  16. package/dist/agent/piAdapter.js +58 -3
  17. package/dist/agent/piIsolatedMcp.d.ts +2 -0
  18. package/dist/agent/piIsolatedMcp.js +10 -2
  19. package/dist/agent/port.d.ts +6 -0
  20. package/dist/agent/streamLogRedact.d.ts +1 -1
  21. package/dist/agent/streamLogRedact.js +4 -11
  22. package/dist/cli/artifactCommand.js +9 -16
  23. package/dist/cli/backupCommand.d.ts +9 -0
  24. package/dist/cli/backupCommand.js +111 -0
  25. package/dist/cli/debugRunCommand.d.ts +10 -0
  26. package/dist/cli/debugRunCommand.js +109 -0
  27. package/dist/cli/doctorCommand.d.ts +32 -0
  28. package/dist/cli/doctorCommand.js +453 -0
  29. package/dist/cli/envelopeCommand.js +9 -2
  30. package/dist/cli/exportAllCommand.d.ts +55 -0
  31. package/dist/cli/exportAllCommand.js +218 -0
  32. package/dist/cli/exportRunCommand.js +23 -21
  33. package/dist/cli/hostClient.d.ts +21 -3
  34. package/dist/cli/hostClient.js +93 -12
  35. package/dist/cli/initTemplates.d.ts +1 -1
  36. package/dist/cli/initTemplates.js +8 -1
  37. package/dist/cli/resolveSafeOutPath.d.ts +2 -0
  38. package/dist/cli/resolveSafeOutPath.js +40 -0
  39. package/dist/cli/restoreCommand.d.ts +10 -0
  40. package/dist/cli/restoreCommand.js +90 -0
  41. package/dist/cli/runCommand.d.ts +3 -2
  42. package/dist/cli/runCommand.js +93 -11
  43. package/dist/cli/runOutput.d.ts +4 -0
  44. package/dist/cli/runOutput.js +33 -7
  45. package/dist/cli/runStageCommand.d.ts +1 -0
  46. package/dist/cli/runStageCommand.js +44 -25
  47. package/dist/cli/runsCommand.d.ts +1 -1
  48. package/dist/cli/runsCommand.js +162 -8
  49. package/dist/cli.js +171 -30
  50. package/dist/config/catalogRelativePath.d.ts +62 -0
  51. package/dist/config/catalogRelativePath.js +118 -0
  52. package/dist/config/configOrigin.d.ts +27 -0
  53. package/dist/config/configOrigin.js +59 -0
  54. package/dist/config/hostConfig.d.ts +55 -0
  55. package/dist/config/hostConfig.js +333 -0
  56. package/dist/config/listSkills.d.ts +26 -0
  57. package/dist/config/listSkills.js +190 -3
  58. package/dist/config/loadOutcome.d.ts +1 -1
  59. package/dist/config/loadPipeline.js +23 -2
  60. package/dist/config/loadStage.js +18 -0
  61. package/dist/config/loadTask.d.ts +2 -0
  62. package/dist/config/loadTask.js +57 -18
  63. package/dist/config/materializeStageModels.js +5 -1
  64. package/dist/config/mergePipelineIncludes.d.ts +3 -0
  65. package/dist/config/mergePipelineIncludes.js +19 -0
  66. package/dist/config/migrateYaml.js +6 -11
  67. package/dist/config/multiProjectCatalog.d.ts +30 -0
  68. package/dist/config/multiProjectCatalog.js +142 -0
  69. package/dist/config/normalizePipelineStageEntry.js +20 -1
  70. package/dist/config/pipelineStageKeys.js +2 -0
  71. package/dist/config/resolveCatalogRoots.d.ts +27 -0
  72. package/dist/config/resolveCatalogRoots.js +76 -0
  73. package/dist/config/resolveModel.d.ts +7 -1
  74. package/dist/config/resolveModel.js +11 -1
  75. package/dist/config/resolveStageMcpServers.d.ts +9 -1
  76. package/dist/config/resolveStageMcpServers.js +36 -9
  77. package/dist/config/secretFromEnvOrFile.d.ts +9 -0
  78. package/dist/config/secretFromEnvOrFile.js +34 -0
  79. package/dist/config/seededCatalog.d.ts +11 -0
  80. package/dist/config/seededCatalog.js +29 -0
  81. package/dist/config/toolRequires.d.ts +24 -0
  82. package/dist/config/toolRequires.js +115 -0
  83. package/dist/config/validateCatalog.d.ts +5 -1
  84. package/dist/config/validateCatalog.js +140 -1
  85. package/dist/diagnostics/checks.d.ts +39 -0
  86. package/dist/diagnostics/checks.js +135 -0
  87. package/dist/errors/codes.d.ts +14 -0
  88. package/dist/errors/codes.js +59 -0
  89. package/dist/git/cache.d.ts +14 -0
  90. package/dist/git/cache.js +150 -0
  91. package/dist/git/credentials.d.ts +9 -0
  92. package/dist/git/credentials.js +88 -0
  93. package/dist/git/errors.d.ts +20 -0
  94. package/dist/git/errors.js +94 -0
  95. package/dist/git/exec.d.ts +16 -0
  96. package/dist/git/exec.js +135 -0
  97. package/dist/git/operations.d.ts +29 -0
  98. package/dist/git/operations.js +153 -0
  99. package/dist/git/version.d.ts +1 -0
  100. package/dist/git/version.js +10 -0
  101. package/dist/logging/audit.d.ts +16 -0
  102. package/dist/logging/audit.js +19 -0
  103. package/dist/logging/commonWords.d.ts +2 -0
  104. package/dist/logging/commonWords.js +13 -0
  105. package/dist/logging/logger.d.ts +49 -0
  106. package/dist/logging/logger.js +193 -0
  107. package/dist/logging/namedSecrets.d.ts +6 -0
  108. package/dist/logging/namedSecrets.js +58 -0
  109. package/dist/logging/redact.d.ts +13 -0
  110. package/dist/logging/redact.js +88 -0
  111. package/dist/mcp/catalogTools.js +456 -80
  112. package/dist/mcp/checkoutTools.d.ts +52 -0
  113. package/dist/mcp/checkoutTools.js +332 -0
  114. package/dist/mcp/controlTools.js +179 -5
  115. package/dist/mcp/deps.d.ts +1 -0
  116. package/dist/mcp/getStartedTool.d.ts +3 -0
  117. package/dist/mcp/getStartedTool.js +62 -0
  118. package/dist/mcp/readArtifact.d.ts +11 -0
  119. package/dist/mcp/readArtifact.js +46 -30
  120. package/dist/mcp/server.js +1 -0
  121. package/dist/mcp/tools.js +4 -0
  122. package/dist/net/proxy.d.ts +14 -0
  123. package/dist/net/proxy.js +78 -0
  124. package/dist/package-meta.d.ts +2 -1
  125. package/dist/package-meta.js +2 -1
  126. package/dist/preflight/bash.d.ts +8 -0
  127. package/dist/preflight/bash.js +34 -0
  128. package/dist/preflight/claudeRoot.d.ts +11 -0
  129. package/dist/preflight/claudeRoot.js +23 -0
  130. package/dist/preflight/mcpCommands.d.ts +8 -0
  131. package/dist/preflight/mcpCommands.js +36 -0
  132. package/dist/preflight/pipelinePreflight.d.ts +40 -0
  133. package/dist/preflight/pipelinePreflight.js +192 -0
  134. package/dist/preflight/tls.d.ts +6 -0
  135. package/dist/preflight/tls.js +18 -0
  136. package/dist/preflight/toolchain.d.ts +45 -0
  137. package/dist/preflight/toolchain.js +219 -0
  138. package/dist/project/findProjectRoot.js +3 -4
  139. package/dist/project/globalHome.d.ts +7 -0
  140. package/dist/project/globalHome.js +63 -2
  141. package/dist/project/resolveProjectContext.js +2 -2
  142. package/dist/project/resolveStageflowContext.js +2 -2
  143. package/dist/projection/projectRun.d.ts +2 -1
  144. package/dist/projection/projectRun.js +1 -0
  145. package/dist/runstore/assertTmpdir.d.ts +1 -0
  146. package/dist/runstore/assertTmpdir.js +21 -0
  147. package/dist/runstore/backup.d.ts +52 -0
  148. package/dist/runstore/backup.js +292 -0
  149. package/dist/runstore/createStore.d.ts +18 -1
  150. package/dist/runstore/createStore.js +64 -5
  151. package/dist/runstore/debugBundle.d.ts +60 -0
  152. package/dist/runstore/debugBundle.js +143 -0
  153. package/dist/runstore/diskUsage.d.ts +50 -0
  154. package/dist/runstore/diskUsage.js +214 -0
  155. package/dist/runstore/exportRunPayload.d.ts +8 -0
  156. package/dist/runstore/exportRunPayload.js +23 -0
  157. package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
  158. package/dist/runstore/normalizeCatalogPath.js +10 -0
  159. package/dist/runstore/paths.d.ts +5 -0
  160. package/dist/runstore/paths.js +145 -1
  161. package/dist/runstore/port.d.ts +111 -13
  162. package/dist/runstore/port.js +8 -1
  163. package/dist/runstore/restore.d.ts +81 -0
  164. package/dist/runstore/restore.js +355 -0
  165. package/dist/runstore/retention.d.ts +27 -0
  166. package/dist/runstore/retention.js +74 -0
  167. package/dist/runstore/runManifest.d.ts +146 -0
  168. package/dist/runstore/runManifest.js +288 -0
  169. package/dist/runstore/runProjection.d.ts +3 -1
  170. package/dist/runstore/runProjection.js +63 -1
  171. package/dist/runstore/sqlite/SqliteRunStore.d.ts +28 -3
  172. package/dist/runstore/sqlite/SqliteRunStore.js +352 -219
  173. package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
  174. package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
  175. package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
  176. package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
  177. package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
  178. package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
  179. package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
  180. package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
  181. package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
  182. package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
  183. package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
  184. package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
  185. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
  186. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
  187. package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
  188. package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
  189. package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
  190. package/dist/runstore/sqlite/migrations/index.js +72 -0
  191. package/dist/runstore/sqlite/schema.d.ts +20 -1
  192. package/dist/runstore/sqlite/schema.js +277 -1
  193. package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
  194. package/dist/runstore/sqlite/storeOpenError.js +11 -0
  195. package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
  196. package/dist/runstore/sqlite/storeSchemaError.js +8 -0
  197. package/dist/runstore/stageExecution.js +3 -0
  198. package/dist/runstore/storeFilesystem.d.ts +32 -0
  199. package/dist/runstore/storeFilesystem.js +148 -0
  200. package/dist/runstore/trackProjection.js +2 -0
  201. package/dist/runstore/workspaceLayout.d.ts +13 -0
  202. package/dist/runstore/workspaceLayout.js +76 -0
  203. package/dist/runtime/completionCheckRunner.d.ts +3 -0
  204. package/dist/runtime/completionCheckRunner.js +45 -7
  205. package/dist/runtime/containerLimits.d.ts +16 -0
  206. package/dist/runtime/containerLimits.js +84 -0
  207. package/dist/runtime/credentialMaterialisation.d.ts +28 -0
  208. package/dist/runtime/credentialMaterialisation.js +128 -0
  209. package/dist/runtime/gitCheckoutCapability.js +7 -13
  210. package/dist/runtime/pipelineRunner.d.ts +36 -1
  211. package/dist/runtime/pipelineRunner.js +178 -17
  212. package/dist/runtime/pipelineScheduler.d.ts +15 -0
  213. package/dist/runtime/pipelineScheduler.js +135 -27
  214. package/dist/runtime/reloadRunCatalog.js +6 -1
  215. package/dist/runtime/repositoryMaterialize.d.ts +47 -0
  216. package/dist/runtime/repositoryMaterialize.js +235 -0
  217. package/dist/runtime/resumeTimedOut.d.ts +1 -1
  218. package/dist/runtime/resumeTimedOut.js +5 -2
  219. package/dist/runtime/runChangeBus.js +9 -0
  220. package/dist/runtime/runDeletion.d.ts +7 -0
  221. package/dist/runtime/runDeletion.js +37 -0
  222. package/dist/runtime/runManager.d.ts +158 -4
  223. package/dist/runtime/runManager.js +1596 -79
  224. package/dist/runtime/runRetentionSweep.d.ts +31 -0
  225. package/dist/runtime/runRetentionSweep.js +328 -0
  226. package/dist/runtime/runRetryCoordinator.d.ts +2 -0
  227. package/dist/runtime/runRetryCoordinator.js +19 -2
  228. package/dist/runtime/runSkills.d.ts +40 -0
  229. package/dist/runtime/runSkills.js +173 -0
  230. package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
  231. package/dist/runtime/stageAttemptBootstrap.js +195 -24
  232. package/dist/runtime/stageCacheEnv.d.ts +6 -0
  233. package/dist/runtime/stageCacheEnv.js +34 -0
  234. package/dist/runtime/stageConcurrency.d.ts +2 -1
  235. package/dist/runtime/stageConcurrency.js +4 -2
  236. package/dist/runtime/stageEnvironment.d.ts +38 -0
  237. package/dist/runtime/stageEnvironment.js +193 -0
  238. package/dist/runtime/stageProcessLauncher.d.ts +18 -0
  239. package/dist/runtime/stageProcessLauncher.js +194 -38
  240. package/dist/runtime/stageRecovery.d.ts +3 -1
  241. package/dist/runtime/stageRecovery.js +19 -4
  242. package/dist/runtime/stageRoots.d.ts +38 -1
  243. package/dist/runtime/stageRoots.js +118 -0
  244. package/dist/runtime/stageRunner.d.ts +1 -0
  245. package/dist/runtime/stageRunner.js +3 -1
  246. package/dist/runtime/stageSecretDecl.d.ts +9 -0
  247. package/dist/runtime/stageSecretDecl.js +102 -0
  248. package/dist/runtime/stageSecrets.d.ts +40 -0
  249. package/dist/runtime/stageSecrets.js +181 -0
  250. package/dist/runtime/stageWorker.d.ts +3 -2
  251. package/dist/runtime/stageWorker.js +58 -10
  252. package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
  253. package/dist/runtime/stageWorkerProtocol.js +8 -0
  254. package/dist/runtime/startPayload.d.ts +32 -0
  255. package/dist/runtime/startPayload.js +59 -0
  256. package/dist/runtime/taskInput.js +14 -5
  257. package/dist/runtime/verifiedStageExecution.d.ts +1 -0
  258. package/dist/runtime/verifiedStageExecution.js +2 -1
  259. package/dist/runtime/workspaceBinding.d.ts +20 -0
  260. package/dist/runtime/workspaceBinding.js +60 -0
  261. package/dist/server/allowedHosts.d.ts +19 -0
  262. package/dist/server/allowedHosts.js +179 -0
  263. package/dist/server/bootstrap.d.ts +36 -2
  264. package/dist/server/bootstrap.js +209 -5
  265. package/dist/server/controlToken.d.ts +47 -0
  266. package/dist/server/controlToken.js +241 -0
  267. package/dist/server/createHttpHost.d.ts +11 -2
  268. package/dist/server/createHttpHost.js +103 -10
  269. package/dist/server/ensureGlobalService.d.ts +5 -1
  270. package/dist/server/ensureGlobalService.js +35 -1
  271. package/dist/server/healthSurfaces.d.ts +6 -0
  272. package/dist/server/healthSurfaces.js +98 -0
  273. package/dist/server/http.d.ts +12 -1
  274. package/dist/server/http.js +1085 -485
  275. package/dist/server/listenHost.d.ts +5 -0
  276. package/dist/server/listenHost.js +56 -0
  277. package/dist/server/mcpHost.d.ts +10 -1
  278. package/dist/server/mcpHost.js +36 -6
  279. package/dist/server/operatorResults.d.ts +2 -2
  280. package/dist/server/operatorResults.js +40 -29
  281. package/dist/server/requestAuthContext.d.ts +12 -0
  282. package/dist/server/requestAuthContext.js +21 -0
  283. package/dist/server/shutdown.d.ts +69 -0
  284. package/dist/server/shutdown.js +219 -0
  285. package/dist/types/pipeline.d.ts +7 -0
  286. package/dist/types/stage.d.ts +8 -0
  287. package/dist/types/task.d.ts +8 -0
  288. package/dist/ui/assets/index-B6hlSXXn.js +120 -0
  289. package/dist/ui/index.html +1 -1
  290. package/examples/README.md +98 -0
  291. package/examples/archify-on-pr/README.md +213 -0
  292. package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
  293. package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
  294. package/examples/archify-on-pr/author-diagrams.yaml +106 -0
  295. package/examples/archify-on-pr/detect-changes.yaml +89 -0
  296. package/examples/ci-validate/README.md +35 -0
  297. package/examples/ci-validate/check.yaml +13 -0
  298. package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
  299. package/examples/ci-validate/validate.sh +5 -0
  300. package/examples/compliance-review-demo/README.md +125 -0
  301. package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
  302. package/examples/compliance-review-demo/connect-account.yaml +47 -0
  303. package/examples/compliance-review-demo/map-to-control.yaml +123 -0
  304. package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
  305. package/examples/compliance-review-demo/publish-report.yaml +79 -0
  306. package/examples/compliance-review-demo/review-verdict.yaml +122 -0
  307. package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
  308. package/examples/compliance-review-demo/store-evidence.yaml +143 -0
  309. package/examples/conditional-fork/README.md +89 -0
  310. package/examples/conditional-fork/branch-a.yaml +13 -0
  311. package/examples/conditional-fork/branch-b.yaml +13 -0
  312. package/examples/conditional-fork/decide.yaml +35 -0
  313. package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
  314. package/examples/conditional-fork/fork-demo.task.yaml +8 -0
  315. package/examples/context7-mcp/README.md +42 -0
  316. package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
  317. package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
  318. package/examples/context7-mcp/fetch-docs.yaml +52 -0
  319. package/examples/context7-mcp/resolve-library.yaml +31 -0
  320. package/examples/context7-mcp/write-brief.yaml +52 -0
  321. package/examples/feature-loop/README.md +104 -0
  322. package/examples/feature-loop/address-feedback.yaml +148 -0
  323. package/examples/feature-loop/align.yaml +116 -0
  324. package/examples/feature-loop/decompose.yaml +86 -0
  325. package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
  326. package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
  327. package/examples/feature-loop/feature-loop.task.yaml +25 -0
  328. package/examples/feature-loop/implement.yaml +128 -0
  329. package/examples/feature-loop/plan.yaml +111 -0
  330. package/examples/feature-loop/publish.yaml +167 -0
  331. package/examples/feature-loop/review.yaml +146 -0
  332. package/examples/feature-loop/verify.yaml +106 -0
  333. package/examples/feedback-loop/README.md +72 -0
  334. package/examples/feedback-loop/VERIFY.md +208 -0
  335. package/examples/feedback-loop/continue-only.task.yaml +4 -0
  336. package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
  337. package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
  338. package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
  339. package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
  340. package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
  341. package/examples/feedback-loop/implement.yaml +14 -0
  342. package/examples/feedback-loop/plan.yaml +14 -0
  343. package/examples/feedback-loop/review.yaml +15 -0
  344. package/examples/feedback-loop/send-back-once.task.yaml +6 -0
  345. package/examples/feedback-loop/submit.yaml +12 -0
  346. package/examples/generic-fan-in/README.md +151 -0
  347. package/examples/generic-fan-in/clarify.yaml +18 -0
  348. package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
  349. package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
  350. package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
  351. package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
  352. package/examples/generic-fan-in/research.yaml +45 -0
  353. package/examples/generic-fan-in/synthesize.yaml +66 -0
  354. package/examples/generic-fan-in/validation.yaml +45 -0
  355. package/examples/github-release/README.md +78 -0
  356. package/examples/github-release/draft-release-notes.yaml +64 -0
  357. package/examples/github-release/github-release.pipeline.yaml +11 -0
  358. package/examples/github-release/github-release.task.yaml +13 -0
  359. package/examples/github-release/publish-github-release.yaml +64 -0
  360. package/examples/hello-world/README.md +28 -0
  361. package/examples/hello-world/hello.pipeline.yaml +4 -0
  362. package/examples/hello-world/my-task.task.yaml +6 -0
  363. package/examples/hello-world/research.yaml +18 -0
  364. package/examples/mcp-hitl-tour/README.md +113 -0
  365. package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
  366. package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
  367. package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
  368. package/examples/mcp-hitl-tour/gather.yaml +31 -0
  369. package/examples/mcp-hitl-tour/intake.yaml +62 -0
  370. package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
  371. package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
  372. package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
  373. package/examples/mcp-hitl-tour/polish.yaml +33 -0
  374. package/examples/mcp-hitl-tour/review.yaml +17 -0
  375. package/examples/mcp-hitl-tour/ship.yaml +25 -0
  376. package/examples/oss-issue-contribution/README.md +218 -0
  377. package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
  378. package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
  379. package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
  380. package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
  381. package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
  382. package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
  383. package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
  384. package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
  385. package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
  386. package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
  387. package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
  388. package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
  389. package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
  390. package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
  391. package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
  392. package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
  393. package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
  394. package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
  395. package/examples/oss-quick-fix/README.md +65 -0
  396. package/examples/oss-quick-fix/implement-fix.yaml +84 -0
  397. package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
  398. package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
  399. package/examples/oss-quick-fix/ship-fix.yaml +81 -0
  400. package/examples/oss-quick-fix/understand-issue.yaml +67 -0
  401. package/examples/oss-quick-fix/verify-fix.yaml +73 -0
  402. package/examples/plan-review/README.md +37 -0
  403. package/examples/plan-review/plan-review-followup.yaml +13 -0
  404. package/examples/plan-review/plan-review.pipeline.yaml +9 -0
  405. package/examples/plan-review/plan-review.task.yaml +9 -0
  406. package/examples/plan-review/plan-review.yaml +25 -0
  407. package/examples/playwright-mcp/README.md +39 -0
  408. package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
  409. package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
  410. package/examples/playwright-mcp/screenshot.yaml +40 -0
  411. package/examples/retry-tour/README.md +75 -0
  412. package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
  413. package/examples/retry-tour/retry-tour.task.yaml +9 -0
  414. package/examples/route-if-tour/README.md +202 -0
  415. package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
  416. package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
  417. package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
  418. package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
  419. package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
  420. package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
  421. package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
  422. package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
  423. package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
  424. package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
  425. package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
  426. package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
  427. package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
  428. package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
  429. package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
  430. package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
  431. package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
  432. package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
  433. package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
  434. package/examples/route-wiring-smoke-test/README.md +377 -0
  435. package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
  436. package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
  437. package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
  438. package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
  439. package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
  440. package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
  441. package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
  442. package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
  443. package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
  444. package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
  445. package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
  446. package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
  447. package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
  448. package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
  449. package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
  450. package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
  451. package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
  452. package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
  453. package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
  454. package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
  455. package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
  456. package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
  457. package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
  458. package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
  459. package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
  460. package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
  461. package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
  462. package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
  463. package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
  464. package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
  465. package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
  466. package/examples/ship-feature/README.md +190 -0
  467. package/examples/ship-feature/feat-address-feedback.yaml +119 -0
  468. package/examples/ship-feature/feat-implement.yaml +180 -0
  469. package/examples/ship-feature/feat-plan.yaml +120 -0
  470. package/examples/ship-feature/feat-review.yaml +109 -0
  471. package/examples/ship-feature/feat-ship.yaml +203 -0
  472. package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
  473. package/examples/ship-feature/ship-feature.task.yaml +78 -0
  474. package/examples/stage-mcp/README.md +144 -0
  475. package/examples/stage-mcp/echo-mcp.mjs +20 -0
  476. package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
  477. package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
  478. package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
  479. package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
  480. package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
  481. package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
  482. package/examples/stage-mcp/use-echo.yaml +20 -0
  483. package/examples/verify-tour/README.md +80 -0
  484. package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
  485. package/examples/verify-tour/verify-tour.task.yaml +11 -0
  486. package/package.json +5 -1
  487. package/skills/stageflow/SKILL.md +6 -6
  488. package/skills/stageflow/references/control-surface.md +11 -5
  489. package/skills/stageflow/scripts/detect-host.mjs +14 -1
  490. package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
  491. package/skills/stageflow-author/SKILL.md +4 -3
  492. package/skills/stageflow-author/references/catalog-mapping.md +16 -0
  493. package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
  494. package/skills/stageflow-run/SKILL.md +20 -12
  495. package/skills/stageflow-run/references/mcp-call.md +9 -1
  496. package/skills/stageflow-run/references/task-and-pipeline-selection.md +16 -5
  497. package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
  498. package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
  499. package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
  500. package/skills/stageflow-setup/SKILL.md +40 -8
  501. package/dist/ui/assets/index-Da5EHU6M.js +0 -119
@@ -13,7 +13,7 @@
13
13
  <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Figtree:wght@400;500;600;700&display=swap" />
14
14
  <link rel="icon" type="image/svg+xml" href="/stageflow-icon.svg" />
15
15
  <title>Stageflow</title>
16
- <script type="module" crossorigin src="/assets/index-Da5EHU6M.js"></script>
16
+ <script type="module" crossorigin src="/assets/index-B6hlSXXn.js"></script>
17
17
  <link rel="stylesheet" crossorigin href="/assets/index-CSsDued1.css">
18
18
  </head>
19
19
  <body>
@@ -0,0 +1,98 @@
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
+ | [context7-mcp](context7-mcp/) | Three stages: resolve a library, fetch docs, write a brief (Context7 MCP) | `sf validate`, then `sf run` from git root |
34
+ | [feedback-loop](feedback-loop/) | Source-owned review loop (`continue` / `send_back`) | `sf validate`, then `sf run` |
35
+ | [feature-loop](feature-loop/) | Epic-to-PR; two Clone Chains + `{ type: loop }` | `sf validate`, then `sf run` |
36
+ | [ship-feature](ship-feature/) | Plan → implement → parallel review → operator-approved PR | `sf validate`, then `sf run` |
37
+ | [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` |
38
+ | [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` |
39
+ | [github-release](github-release/) | Dogfood: draft + publish GitHub Release | Used in publish/release workflows |
40
+ | [archify-on-pr](archify-on-pr/) | **Featured** — PR diagrams via Route `if` + Archify handoff | [README](archify-on-pr/README.md), archify-pr-diagrams workflow |
41
+ | [ci-validate](ci-validate/) | Strict manifest validate in CI | `./validate.sh` |
42
+ | [route-if-tour](route-if-tour/) | Deterministic `if` tour: operators, composition, skip, join fire/miss | `sf ui`, then pick `route-if-tour` |
43
+ | [verify-tour](verify-tour/) | Verify check types: artifact, command, checklist, payload_schema, gate, checkout_changes | `sf ui`, then pick `verify-tour` |
44
+ | [retry-tour](retry-tour/) | Retry surfaces: emit soft-reject, automatic repair, manual recover, ordinary Retry | `sf ui`, then pick `retry-tour` |
45
+ | [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) |
46
+
47
+ Current wiring tours: [`route-wiring-smoke-test`](route-wiring-smoke-test/), [`route-if-tour`](route-if-tour/).
48
+
49
+ Browse scope is declared in repo-root [`stageflow.yaml`](../stageflow.yaml). **`sf ui` started from any subdirectory** still uses `<repo>/.stageflow` for run state.
50
+
51
+ ## Prerequisites (all examples)
52
+
53
+ - **Node.js ≥ 20**
54
+ - Stageflow CLI: `npm i -g stageflow` (or `npm run build` in this repo)
55
+ - **Provider auth** for `sf run` (not required for `sf validate`)
56
+
57
+ ## Validate all examples
58
+
59
+ From repo root after `npm run build`:
60
+
61
+ ```bash
62
+ npm run validate:examples
63
+ ```
64
+
65
+ ## Run an example (repo root)
66
+
67
+ ```bash
68
+ sf validate --strict
69
+ sf run \
70
+ --pipeline examples/hello-world/hello.pipeline.yaml \
71
+ --task examples/hello-world/my-task.task.yaml
72
+ ```
73
+
74
+ 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/).
75
+
76
+ ```bash
77
+ sf run \
78
+ --pipeline examples/conditional-fork/fork-demo.pipeline.yaml \
79
+ --task examples/conditional-fork/fork-demo.task.yaml
80
+ ```
81
+
82
+ Archify-on-PR local dry-run (requires `OPENAI_API_KEY` + Archify skill — see example README):
83
+
84
+ ```bash
85
+ ./scripts/prepare-ci-context.sh ci-context.json
86
+ sf run \
87
+ --pipeline examples/archify-on-pr/archify-on-pr.pipeline.yaml \
88
+ --task examples/archify-on-pr/archify-on-pr.task.yaml \
89
+ --skip-gates --json > sf-run.json
90
+ ```
91
+
92
+ Terminal 1 (optional console, from any subdirectory):
93
+
94
+ ```bash
95
+ cd examples/conditional-fork && sf ui
96
+ ```
97
+
98
+ 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,35 @@
1
+ # ci-validate
2
+
3
+ Validate-only CI demo. Checks the repo manifest and example catalogs with `sf validate --strict` — no provider auth or agent run required.
4
+
5
+ ## Prerequisites
6
+
7
+ - Node.js ≥ 20
8
+ - Stageflow CLI (`npm i -g stageflow` or built from this repo)
9
+
10
+ ## Commands
11
+
12
+ From the **repository git root**:
13
+
14
+ ```bash
15
+ chmod +x examples/ci-validate/validate.sh
16
+ ./examples/ci-validate/validate.sh
17
+ ```
18
+
19
+ Or directly:
20
+
21
+ ```bash
22
+ sf validate --strict --json
23
+ ```
24
+
25
+ ## GitHub Actions snippet
26
+
27
+ ```yaml
28
+ - uses: actions/setup-node@v4
29
+ with:
30
+ node-version: "24"
31
+ - run: npm i -g stageflow
32
+ - run: sf validate --strict --json
33
+ ```
34
+
35
+ Run from the workspace root where `stageflow.yaml` lives.
@@ -0,0 +1,13 @@
1
+ id: check
2
+ system_prompt: |
3
+ Validate-only CI demo stage. In real CI you typically run sf validate
4
+ without invoking agents; this stage exists so the catalog is a valid,
5
+ runnable example if you extend it later.
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,4 @@
1
+ id: ci-demo
2
+ stages:
3
+ - id: check
4
+ uses: ./check.yaml
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ ROOT="$(cd "$(dirname "$0")/../.." && pwd)"
4
+ cd "$ROOT"
5
+ sf validate --strict --json