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.
- package/README.md +10 -3
- package/dist/a2a/contracts.d.ts +1 -0
- package/dist/a2a/contracts.js +1 -0
- package/dist/a2a/registry.d.ts +2 -0
- package/dist/a2a/registry.js +20 -1
- package/dist/a2a/server.d.ts +7 -0
- package/dist/a2a/server.js +5 -2
- package/dist/a2a/service.d.ts +1 -1
- package/dist/a2a/service.js +57 -8
- package/dist/a2a/store.d.ts +8 -5
- package/dist/a2a/store.js +24 -67
- package/dist/agent/activity.d.ts +3 -0
- package/dist/agent/bootProviderConfig.d.ts +21 -0
- package/dist/agent/bootProviderConfig.js +74 -0
- package/dist/agent/piAdapter.d.ts +9 -1
- package/dist/agent/piAdapter.js +58 -3
- package/dist/agent/piIsolatedMcp.d.ts +2 -0
- package/dist/agent/piIsolatedMcp.js +10 -2
- package/dist/agent/port.d.ts +6 -0
- package/dist/agent/streamLogRedact.d.ts +1 -1
- package/dist/agent/streamLogRedact.js +4 -11
- package/dist/cli/artifactCommand.js +9 -16
- package/dist/cli/backupCommand.d.ts +9 -0
- package/dist/cli/backupCommand.js +111 -0
- package/dist/cli/debugRunCommand.d.ts +10 -0
- package/dist/cli/debugRunCommand.js +109 -0
- package/dist/cli/doctorCommand.d.ts +32 -0
- package/dist/cli/doctorCommand.js +453 -0
- package/dist/cli/envelopeCommand.js +9 -2
- package/dist/cli/exportAllCommand.d.ts +55 -0
- package/dist/cli/exportAllCommand.js +218 -0
- package/dist/cli/exportRunCommand.js +23 -21
- package/dist/cli/hostClient.d.ts +21 -3
- package/dist/cli/hostClient.js +93 -12
- package/dist/cli/initTemplates.d.ts +1 -1
- package/dist/cli/initTemplates.js +8 -1
- package/dist/cli/resolveSafeOutPath.d.ts +2 -0
- package/dist/cli/resolveSafeOutPath.js +40 -0
- package/dist/cli/restoreCommand.d.ts +10 -0
- package/dist/cli/restoreCommand.js +90 -0
- package/dist/cli/runCommand.d.ts +3 -2
- package/dist/cli/runCommand.js +93 -11
- package/dist/cli/runOutput.d.ts +4 -0
- package/dist/cli/runOutput.js +33 -7
- package/dist/cli/runStageCommand.d.ts +1 -0
- package/dist/cli/runStageCommand.js +44 -25
- package/dist/cli/runsCommand.d.ts +1 -1
- package/dist/cli/runsCommand.js +162 -8
- package/dist/cli.js +171 -30
- package/dist/config/catalogRelativePath.d.ts +62 -0
- package/dist/config/catalogRelativePath.js +118 -0
- package/dist/config/configOrigin.d.ts +27 -0
- package/dist/config/configOrigin.js +59 -0
- package/dist/config/hostConfig.d.ts +55 -0
- package/dist/config/hostConfig.js +333 -0
- package/dist/config/listSkills.d.ts +26 -0
- package/dist/config/listSkills.js +190 -3
- package/dist/config/loadOutcome.d.ts +1 -1
- package/dist/config/loadPipeline.js +23 -2
- package/dist/config/loadStage.js +18 -0
- package/dist/config/loadTask.d.ts +2 -0
- package/dist/config/loadTask.js +57 -18
- package/dist/config/materializeStageModels.js +5 -1
- package/dist/config/mergePipelineIncludes.d.ts +3 -0
- package/dist/config/mergePipelineIncludes.js +19 -0
- package/dist/config/migrateYaml.js +6 -11
- package/dist/config/multiProjectCatalog.d.ts +30 -0
- package/dist/config/multiProjectCatalog.js +142 -0
- package/dist/config/normalizePipelineStageEntry.js +20 -1
- package/dist/config/pipelineStageKeys.js +2 -0
- package/dist/config/resolveCatalogRoots.d.ts +27 -0
- package/dist/config/resolveCatalogRoots.js +76 -0
- package/dist/config/resolveModel.d.ts +7 -1
- package/dist/config/resolveModel.js +11 -1
- package/dist/config/resolveStageMcpServers.d.ts +9 -1
- package/dist/config/resolveStageMcpServers.js +36 -9
- package/dist/config/secretFromEnvOrFile.d.ts +9 -0
- package/dist/config/secretFromEnvOrFile.js +34 -0
- package/dist/config/seededCatalog.d.ts +11 -0
- package/dist/config/seededCatalog.js +29 -0
- package/dist/config/toolRequires.d.ts +24 -0
- package/dist/config/toolRequires.js +115 -0
- package/dist/config/validateCatalog.d.ts +5 -1
- package/dist/config/validateCatalog.js +140 -1
- package/dist/diagnostics/checks.d.ts +39 -0
- package/dist/diagnostics/checks.js +135 -0
- package/dist/errors/codes.d.ts +14 -0
- package/dist/errors/codes.js +59 -0
- package/dist/git/cache.d.ts +14 -0
- package/dist/git/cache.js +150 -0
- package/dist/git/credentials.d.ts +9 -0
- package/dist/git/credentials.js +88 -0
- package/dist/git/errors.d.ts +20 -0
- package/dist/git/errors.js +94 -0
- package/dist/git/exec.d.ts +16 -0
- package/dist/git/exec.js +135 -0
- package/dist/git/operations.d.ts +29 -0
- package/dist/git/operations.js +153 -0
- package/dist/git/version.d.ts +1 -0
- package/dist/git/version.js +10 -0
- package/dist/logging/audit.d.ts +16 -0
- package/dist/logging/audit.js +19 -0
- package/dist/logging/commonWords.d.ts +2 -0
- package/dist/logging/commonWords.js +13 -0
- package/dist/logging/logger.d.ts +49 -0
- package/dist/logging/logger.js +193 -0
- package/dist/logging/namedSecrets.d.ts +6 -0
- package/dist/logging/namedSecrets.js +58 -0
- package/dist/logging/redact.d.ts +13 -0
- package/dist/logging/redact.js +88 -0
- package/dist/mcp/catalogTools.js +456 -80
- package/dist/mcp/checkoutTools.d.ts +52 -0
- package/dist/mcp/checkoutTools.js +332 -0
- package/dist/mcp/controlTools.js +179 -5
- package/dist/mcp/deps.d.ts +1 -0
- package/dist/mcp/getStartedTool.d.ts +3 -0
- package/dist/mcp/getStartedTool.js +62 -0
- package/dist/mcp/readArtifact.d.ts +11 -0
- package/dist/mcp/readArtifact.js +46 -30
- package/dist/mcp/server.js +1 -0
- package/dist/mcp/tools.js +4 -0
- package/dist/net/proxy.d.ts +14 -0
- package/dist/net/proxy.js +78 -0
- package/dist/package-meta.d.ts +2 -1
- package/dist/package-meta.js +2 -1
- package/dist/preflight/bash.d.ts +8 -0
- package/dist/preflight/bash.js +34 -0
- package/dist/preflight/claudeRoot.d.ts +11 -0
- package/dist/preflight/claudeRoot.js +23 -0
- package/dist/preflight/mcpCommands.d.ts +8 -0
- package/dist/preflight/mcpCommands.js +36 -0
- package/dist/preflight/pipelinePreflight.d.ts +40 -0
- package/dist/preflight/pipelinePreflight.js +192 -0
- package/dist/preflight/tls.d.ts +6 -0
- package/dist/preflight/tls.js +18 -0
- package/dist/preflight/toolchain.d.ts +45 -0
- package/dist/preflight/toolchain.js +219 -0
- package/dist/project/findProjectRoot.js +3 -4
- package/dist/project/globalHome.d.ts +7 -0
- package/dist/project/globalHome.js +63 -2
- package/dist/project/resolveProjectContext.js +2 -2
- package/dist/project/resolveStageflowContext.js +2 -2
- package/dist/projection/projectRun.d.ts +2 -1
- package/dist/projection/projectRun.js +1 -0
- package/dist/runstore/assertTmpdir.d.ts +1 -0
- package/dist/runstore/assertTmpdir.js +21 -0
- package/dist/runstore/backup.d.ts +52 -0
- package/dist/runstore/backup.js +292 -0
- package/dist/runstore/createStore.d.ts +18 -1
- package/dist/runstore/createStore.js +64 -5
- package/dist/runstore/debugBundle.d.ts +60 -0
- package/dist/runstore/debugBundle.js +143 -0
- package/dist/runstore/diskUsage.d.ts +50 -0
- package/dist/runstore/diskUsage.js +214 -0
- package/dist/runstore/exportRunPayload.d.ts +8 -0
- package/dist/runstore/exportRunPayload.js +23 -0
- package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
- package/dist/runstore/normalizeCatalogPath.js +10 -0
- package/dist/runstore/paths.d.ts +5 -0
- package/dist/runstore/paths.js +145 -1
- package/dist/runstore/port.d.ts +111 -13
- package/dist/runstore/port.js +8 -1
- package/dist/runstore/restore.d.ts +81 -0
- package/dist/runstore/restore.js +355 -0
- package/dist/runstore/retention.d.ts +27 -0
- package/dist/runstore/retention.js +74 -0
- package/dist/runstore/runManifest.d.ts +146 -0
- package/dist/runstore/runManifest.js +288 -0
- package/dist/runstore/runProjection.d.ts +3 -1
- package/dist/runstore/runProjection.js +63 -1
- package/dist/runstore/sqlite/SqliteRunStore.d.ts +28 -3
- package/dist/runstore/sqlite/SqliteRunStore.js +352 -219
- package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
- package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
- package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
- package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
- package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
- package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
- package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
- package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
- package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
- package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
- package/dist/runstore/sqlite/migrations/index.js +72 -0
- package/dist/runstore/sqlite/schema.d.ts +20 -1
- package/dist/runstore/sqlite/schema.js +277 -1
- package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
- package/dist/runstore/sqlite/storeOpenError.js +11 -0
- package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
- package/dist/runstore/sqlite/storeSchemaError.js +8 -0
- package/dist/runstore/stageExecution.js +3 -0
- package/dist/runstore/storeFilesystem.d.ts +32 -0
- package/dist/runstore/storeFilesystem.js +148 -0
- package/dist/runstore/trackProjection.js +2 -0
- package/dist/runstore/workspaceLayout.d.ts +13 -0
- package/dist/runstore/workspaceLayout.js +76 -0
- package/dist/runtime/completionCheckRunner.d.ts +3 -0
- package/dist/runtime/completionCheckRunner.js +45 -7
- package/dist/runtime/containerLimits.d.ts +16 -0
- package/dist/runtime/containerLimits.js +84 -0
- package/dist/runtime/credentialMaterialisation.d.ts +28 -0
- package/dist/runtime/credentialMaterialisation.js +128 -0
- package/dist/runtime/gitCheckoutCapability.js +7 -13
- package/dist/runtime/pipelineRunner.d.ts +36 -1
- package/dist/runtime/pipelineRunner.js +178 -17
- package/dist/runtime/pipelineScheduler.d.ts +15 -0
- package/dist/runtime/pipelineScheduler.js +135 -27
- package/dist/runtime/reloadRunCatalog.js +6 -1
- package/dist/runtime/repositoryMaterialize.d.ts +47 -0
- package/dist/runtime/repositoryMaterialize.js +235 -0
- package/dist/runtime/resumeTimedOut.d.ts +1 -1
- package/dist/runtime/resumeTimedOut.js +5 -2
- package/dist/runtime/runChangeBus.js +9 -0
- package/dist/runtime/runDeletion.d.ts +7 -0
- package/dist/runtime/runDeletion.js +37 -0
- package/dist/runtime/runManager.d.ts +158 -4
- package/dist/runtime/runManager.js +1596 -79
- package/dist/runtime/runRetentionSweep.d.ts +31 -0
- package/dist/runtime/runRetentionSweep.js +328 -0
- package/dist/runtime/runRetryCoordinator.d.ts +2 -0
- package/dist/runtime/runRetryCoordinator.js +19 -2
- package/dist/runtime/runSkills.d.ts +40 -0
- package/dist/runtime/runSkills.js +173 -0
- package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
- package/dist/runtime/stageAttemptBootstrap.js +195 -24
- package/dist/runtime/stageCacheEnv.d.ts +6 -0
- package/dist/runtime/stageCacheEnv.js +34 -0
- package/dist/runtime/stageConcurrency.d.ts +2 -1
- package/dist/runtime/stageConcurrency.js +4 -2
- package/dist/runtime/stageEnvironment.d.ts +38 -0
- package/dist/runtime/stageEnvironment.js +193 -0
- package/dist/runtime/stageProcessLauncher.d.ts +18 -0
- package/dist/runtime/stageProcessLauncher.js +194 -38
- package/dist/runtime/stageRecovery.d.ts +3 -1
- package/dist/runtime/stageRecovery.js +19 -4
- package/dist/runtime/stageRoots.d.ts +38 -1
- package/dist/runtime/stageRoots.js +118 -0
- package/dist/runtime/stageRunner.d.ts +1 -0
- package/dist/runtime/stageRunner.js +3 -1
- package/dist/runtime/stageSecretDecl.d.ts +9 -0
- package/dist/runtime/stageSecretDecl.js +102 -0
- package/dist/runtime/stageSecrets.d.ts +40 -0
- package/dist/runtime/stageSecrets.js +181 -0
- package/dist/runtime/stageWorker.d.ts +3 -2
- package/dist/runtime/stageWorker.js +58 -10
- package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
- package/dist/runtime/stageWorkerProtocol.js +8 -0
- package/dist/runtime/startPayload.d.ts +32 -0
- package/dist/runtime/startPayload.js +59 -0
- package/dist/runtime/taskInput.js +14 -5
- package/dist/runtime/verifiedStageExecution.d.ts +1 -0
- package/dist/runtime/verifiedStageExecution.js +2 -1
- package/dist/runtime/workspaceBinding.d.ts +20 -0
- package/dist/runtime/workspaceBinding.js +60 -0
- package/dist/server/allowedHosts.d.ts +19 -0
- package/dist/server/allowedHosts.js +179 -0
- package/dist/server/bootstrap.d.ts +36 -2
- package/dist/server/bootstrap.js +209 -5
- package/dist/server/controlToken.d.ts +47 -0
- package/dist/server/controlToken.js +241 -0
- package/dist/server/createHttpHost.d.ts +11 -2
- package/dist/server/createHttpHost.js +103 -10
- package/dist/server/ensureGlobalService.d.ts +5 -1
- package/dist/server/ensureGlobalService.js +35 -1
- package/dist/server/healthSurfaces.d.ts +6 -0
- package/dist/server/healthSurfaces.js +98 -0
- package/dist/server/http.d.ts +12 -1
- package/dist/server/http.js +1085 -485
- package/dist/server/listenHost.d.ts +5 -0
- package/dist/server/listenHost.js +56 -0
- package/dist/server/mcpHost.d.ts +10 -1
- package/dist/server/mcpHost.js +36 -6
- package/dist/server/operatorResults.d.ts +2 -2
- package/dist/server/operatorResults.js +40 -29
- package/dist/server/requestAuthContext.d.ts +12 -0
- package/dist/server/requestAuthContext.js +21 -0
- package/dist/server/shutdown.d.ts +69 -0
- package/dist/server/shutdown.js +219 -0
- package/dist/types/pipeline.d.ts +7 -0
- package/dist/types/stage.d.ts +8 -0
- package/dist/types/task.d.ts +8 -0
- package/dist/ui/assets/index-B6hlSXXn.js +120 -0
- package/dist/ui/index.html +1 -1
- package/examples/README.md +98 -0
- package/examples/archify-on-pr/README.md +213 -0
- package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
- package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
- package/examples/archify-on-pr/author-diagrams.yaml +106 -0
- package/examples/archify-on-pr/detect-changes.yaml +89 -0
- package/examples/ci-validate/README.md +35 -0
- package/examples/ci-validate/check.yaml +13 -0
- package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
- package/examples/ci-validate/validate.sh +5 -0
- package/examples/compliance-review-demo/README.md +125 -0
- package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
- package/examples/compliance-review-demo/connect-account.yaml +47 -0
- package/examples/compliance-review-demo/map-to-control.yaml +123 -0
- package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
- package/examples/compliance-review-demo/publish-report.yaml +79 -0
- package/examples/compliance-review-demo/review-verdict.yaml +122 -0
- package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
- package/examples/compliance-review-demo/store-evidence.yaml +143 -0
- package/examples/conditional-fork/README.md +89 -0
- package/examples/conditional-fork/branch-a.yaml +13 -0
- package/examples/conditional-fork/branch-b.yaml +13 -0
- package/examples/conditional-fork/decide.yaml +35 -0
- package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
- package/examples/conditional-fork/fork-demo.task.yaml +8 -0
- package/examples/context7-mcp/README.md +42 -0
- package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
- package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
- package/examples/context7-mcp/fetch-docs.yaml +52 -0
- package/examples/context7-mcp/resolve-library.yaml +31 -0
- package/examples/context7-mcp/write-brief.yaml +52 -0
- package/examples/feature-loop/README.md +104 -0
- package/examples/feature-loop/address-feedback.yaml +148 -0
- package/examples/feature-loop/align.yaml +116 -0
- package/examples/feature-loop/decompose.yaml +86 -0
- package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
- package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
- package/examples/feature-loop/feature-loop.task.yaml +25 -0
- package/examples/feature-loop/implement.yaml +128 -0
- package/examples/feature-loop/plan.yaml +111 -0
- package/examples/feature-loop/publish.yaml +167 -0
- package/examples/feature-loop/review.yaml +146 -0
- package/examples/feature-loop/verify.yaml +106 -0
- package/examples/feedback-loop/README.md +72 -0
- package/examples/feedback-loop/VERIFY.md +208 -0
- package/examples/feedback-loop/continue-only.task.yaml +4 -0
- package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
- package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
- package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
- package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
- package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
- package/examples/feedback-loop/implement.yaml +14 -0
- package/examples/feedback-loop/plan.yaml +14 -0
- package/examples/feedback-loop/review.yaml +15 -0
- package/examples/feedback-loop/send-back-once.task.yaml +6 -0
- package/examples/feedback-loop/submit.yaml +12 -0
- package/examples/generic-fan-in/README.md +151 -0
- package/examples/generic-fan-in/clarify.yaml +18 -0
- package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
- package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
- package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
- package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
- package/examples/generic-fan-in/research.yaml +45 -0
- package/examples/generic-fan-in/synthesize.yaml +66 -0
- package/examples/generic-fan-in/validation.yaml +45 -0
- package/examples/github-release/README.md +78 -0
- package/examples/github-release/draft-release-notes.yaml +64 -0
- package/examples/github-release/github-release.pipeline.yaml +11 -0
- package/examples/github-release/github-release.task.yaml +13 -0
- package/examples/github-release/publish-github-release.yaml +64 -0
- package/examples/hello-world/README.md +28 -0
- package/examples/hello-world/hello.pipeline.yaml +4 -0
- package/examples/hello-world/my-task.task.yaml +6 -0
- package/examples/hello-world/research.yaml +18 -0
- package/examples/mcp-hitl-tour/README.md +113 -0
- package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
- package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
- package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
- package/examples/mcp-hitl-tour/gather.yaml +31 -0
- package/examples/mcp-hitl-tour/intake.yaml +62 -0
- package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
- package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
- package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
- package/examples/mcp-hitl-tour/polish.yaml +33 -0
- package/examples/mcp-hitl-tour/review.yaml +17 -0
- package/examples/mcp-hitl-tour/ship.yaml +25 -0
- package/examples/oss-issue-contribution/README.md +218 -0
- package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
- package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
- package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
- package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
- package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
- package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
- package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
- package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
- package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
- package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
- package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
- package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
- package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
- package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
- package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
- package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
- package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
- package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
- package/examples/oss-quick-fix/README.md +65 -0
- package/examples/oss-quick-fix/implement-fix.yaml +84 -0
- package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
- package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
- package/examples/oss-quick-fix/ship-fix.yaml +81 -0
- package/examples/oss-quick-fix/understand-issue.yaml +67 -0
- package/examples/oss-quick-fix/verify-fix.yaml +73 -0
- package/examples/plan-review/README.md +37 -0
- package/examples/plan-review/plan-review-followup.yaml +13 -0
- package/examples/plan-review/plan-review.pipeline.yaml +9 -0
- package/examples/plan-review/plan-review.task.yaml +9 -0
- package/examples/plan-review/plan-review.yaml +25 -0
- package/examples/playwright-mcp/README.md +39 -0
- package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
- package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
- package/examples/playwright-mcp/screenshot.yaml +40 -0
- package/examples/retry-tour/README.md +75 -0
- package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
- package/examples/retry-tour/retry-tour.task.yaml +9 -0
- package/examples/route-if-tour/README.md +202 -0
- package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
- package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
- package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
- package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
- package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
- package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
- package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
- package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
- package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
- package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
- package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
- package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
- package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
- package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
- package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
- package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
- package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
- package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
- package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
- package/examples/route-wiring-smoke-test/README.md +377 -0
- package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
- package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
- package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
- package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
- package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
- package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
- package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
- package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
- package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
- package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
- package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
- package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
- package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
- package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
- package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
- package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
- package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
- package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
- package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
- package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
- package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
- package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
- package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
- package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
- package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
- package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
- package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
- package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
- package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
- package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
- package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
- package/examples/ship-feature/README.md +190 -0
- package/examples/ship-feature/feat-address-feedback.yaml +119 -0
- package/examples/ship-feature/feat-implement.yaml +180 -0
- package/examples/ship-feature/feat-plan.yaml +120 -0
- package/examples/ship-feature/feat-review.yaml +109 -0
- package/examples/ship-feature/feat-ship.yaml +203 -0
- package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
- package/examples/ship-feature/ship-feature.task.yaml +78 -0
- package/examples/stage-mcp/README.md +144 -0
- package/examples/stage-mcp/echo-mcp.mjs +20 -0
- package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
- package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
- package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
- package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
- package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
- package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
- package/examples/stage-mcp/use-echo.yaml +20 -0
- package/examples/verify-tour/README.md +80 -0
- package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
- package/examples/verify-tour/verify-tour.task.yaml +11 -0
- package/package.json +5 -1
- package/skills/stageflow/SKILL.md +6 -6
- package/skills/stageflow/references/control-surface.md +11 -5
- package/skills/stageflow/scripts/detect-host.mjs +14 -1
- package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
- package/skills/stageflow-author/SKILL.md +4 -3
- package/skills/stageflow-author/references/catalog-mapping.md +16 -0
- package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
- package/skills/stageflow-run/SKILL.md +20 -12
- package/skills/stageflow-run/references/mcp-call.md +9 -1
- package/skills/stageflow-run/references/task-and-pipeline-selection.md +16 -5
- package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
- package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
- package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
- package/skills/stageflow-setup/SKILL.md +40 -8
- package/dist/ui/assets/index-Da5EHU6M.js +0 -119
package/dist/ui/index.html
CHANGED
|
@@ -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-
|
|
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
|