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
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
id: run-compliance-check
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Read the four public-access-block field values, bucket, and check_id from
|
|
4
|
+
the prior stage's payload.
|
|
5
|
+
|
|
6
|
+
Apply the rule for bucket-level public access block (the same rule
|
|
7
|
+
Prowler's SOC2-labeled AWS S3 check uses, applied here to whichever
|
|
8
|
+
cloud the prior stage actually polled): the check passes only if
|
|
9
|
+
block_public_acls, ignore_public_acls, block_public_policy, and
|
|
10
|
+
restrict_public_buckets are all true. If any field is false, the check
|
|
11
|
+
fails; name which field(s) failed in failed_fields. Use an empty list
|
|
12
|
+
when nothing failed.
|
|
13
|
+
|
|
14
|
+
Write the verdict via write_stage_artifact (for example verdict.md),
|
|
15
|
+
including the field values and which failed, if any.
|
|
16
|
+
|
|
17
|
+
summary and payload are handed to the next stage verbatim. State outcomes
|
|
18
|
+
and artifact pointers only. Do not repeat this stage's prohibitions in
|
|
19
|
+
summary — downstream will obey them literally.
|
|
20
|
+
|
|
21
|
+
When finished, call emit_stage_envelope exactly once with status, summary,
|
|
22
|
+
artifacts, and a payload matching io.output.schema: everything carried
|
|
23
|
+
forward from the prior stage, plus verdict ("PASS" or "FAIL"), resource
|
|
24
|
+
(the bucket name), and failed_fields. Your last tool call in this attempt
|
|
25
|
+
must be emit_stage_envelope. An empty final message is a stage failure.
|
|
26
|
+
model: anthropic/claude-sonnet-4-5
|
|
27
|
+
io:
|
|
28
|
+
input:
|
|
29
|
+
schema:
|
|
30
|
+
type: object
|
|
31
|
+
required:
|
|
32
|
+
- bucket
|
|
33
|
+
- check_id
|
|
34
|
+
- scenario
|
|
35
|
+
- source
|
|
36
|
+
- block_public_acls
|
|
37
|
+
- ignore_public_acls
|
|
38
|
+
- block_public_policy
|
|
39
|
+
- restrict_public_buckets
|
|
40
|
+
properties:
|
|
41
|
+
bucket:
|
|
42
|
+
type: string
|
|
43
|
+
check_id:
|
|
44
|
+
type: string
|
|
45
|
+
scenario:
|
|
46
|
+
type: string
|
|
47
|
+
source:
|
|
48
|
+
type: string
|
|
49
|
+
block_public_acls:
|
|
50
|
+
type: boolean
|
|
51
|
+
ignore_public_acls:
|
|
52
|
+
type: boolean
|
|
53
|
+
block_public_policy:
|
|
54
|
+
type: boolean
|
|
55
|
+
restrict_public_buckets:
|
|
56
|
+
type: boolean
|
|
57
|
+
output:
|
|
58
|
+
schema:
|
|
59
|
+
type: object
|
|
60
|
+
required:
|
|
61
|
+
- bucket
|
|
62
|
+
- check_id
|
|
63
|
+
- scenario
|
|
64
|
+
- source
|
|
65
|
+
- block_public_acls
|
|
66
|
+
- ignore_public_acls
|
|
67
|
+
- block_public_policy
|
|
68
|
+
- restrict_public_buckets
|
|
69
|
+
- verdict
|
|
70
|
+
- resource
|
|
71
|
+
- failed_fields
|
|
72
|
+
properties:
|
|
73
|
+
bucket:
|
|
74
|
+
type: string
|
|
75
|
+
check_id:
|
|
76
|
+
type: string
|
|
77
|
+
scenario:
|
|
78
|
+
type: string
|
|
79
|
+
source:
|
|
80
|
+
type: string
|
|
81
|
+
block_public_acls:
|
|
82
|
+
type: boolean
|
|
83
|
+
ignore_public_acls:
|
|
84
|
+
type: boolean
|
|
85
|
+
block_public_policy:
|
|
86
|
+
type: boolean
|
|
87
|
+
restrict_public_buckets:
|
|
88
|
+
type: boolean
|
|
89
|
+
verdict:
|
|
90
|
+
type: string
|
|
91
|
+
resource:
|
|
92
|
+
type: string
|
|
93
|
+
failed_fields:
|
|
94
|
+
type: array
|
|
95
|
+
items:
|
|
96
|
+
type: string
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
id: store-evidence
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Append one row to the checkout-relative evidence log at
|
|
4
|
+
examples/compliance-review-demo/data/evidence-log.json.
|
|
5
|
+
|
|
6
|
+
Read that file with the Read tool if it exists and parse it as a JSON
|
|
7
|
+
array; if it does not exist yet, start from an empty array. Append a new
|
|
8
|
+
object with: timestamp (ISO 8601, now), check_id, resource, control_id,
|
|
9
|
+
verdict, reviewed, auto_approved, reviewer (use JSON null in this file
|
|
10
|
+
when reviewer is "") — all from the prior stage's payload. Write the full
|
|
11
|
+
updated array back to that same path with the checkout write/edit tool,
|
|
12
|
+
pretty-printed.
|
|
13
|
+
|
|
14
|
+
Success requires real checkout edits. Put
|
|
15
|
+
["examples/compliance-review-demo/data/evidence-log.json"] in
|
|
16
|
+
payload.changed_files. Do not put stages/.../artifacts paths there. A
|
|
17
|
+
report or map alone is a failure emit, not success.
|
|
18
|
+
|
|
19
|
+
summary and payload are handed to the next stage verbatim. State outcomes
|
|
20
|
+
and artifact pointers only. Do not repeat this stage's prohibitions in
|
|
21
|
+
summary — downstream will obey them literally.
|
|
22
|
+
|
|
23
|
+
When finished, call emit_stage_envelope exactly once with status, summary,
|
|
24
|
+
artifacts, and a payload matching io.output.schema: everything carried
|
|
25
|
+
forward from the prior stage, plus changed_files naming the evidence log
|
|
26
|
+
path. Your last tool call in this attempt must be emit_stage_envelope. An
|
|
27
|
+
empty final message is a stage failure.
|
|
28
|
+
model: anthropic/claude-sonnet-4-5
|
|
29
|
+
io:
|
|
30
|
+
input:
|
|
31
|
+
schema:
|
|
32
|
+
type: object
|
|
33
|
+
required:
|
|
34
|
+
- bucket
|
|
35
|
+
- check_id
|
|
36
|
+
- scenario
|
|
37
|
+
- source
|
|
38
|
+
- block_public_acls
|
|
39
|
+
- ignore_public_acls
|
|
40
|
+
- block_public_policy
|
|
41
|
+
- restrict_public_buckets
|
|
42
|
+
- verdict
|
|
43
|
+
- resource
|
|
44
|
+
- failed_fields
|
|
45
|
+
- reviewed
|
|
46
|
+
- auto_approved
|
|
47
|
+
- reviewer
|
|
48
|
+
- control_id
|
|
49
|
+
properties:
|
|
50
|
+
bucket:
|
|
51
|
+
type: string
|
|
52
|
+
check_id:
|
|
53
|
+
type: string
|
|
54
|
+
scenario:
|
|
55
|
+
type: string
|
|
56
|
+
source:
|
|
57
|
+
type: string
|
|
58
|
+
block_public_acls:
|
|
59
|
+
type: boolean
|
|
60
|
+
ignore_public_acls:
|
|
61
|
+
type: boolean
|
|
62
|
+
block_public_policy:
|
|
63
|
+
type: boolean
|
|
64
|
+
restrict_public_buckets:
|
|
65
|
+
type: boolean
|
|
66
|
+
verdict:
|
|
67
|
+
type: string
|
|
68
|
+
resource:
|
|
69
|
+
type: string
|
|
70
|
+
failed_fields:
|
|
71
|
+
type: array
|
|
72
|
+
items:
|
|
73
|
+
type: string
|
|
74
|
+
reviewed:
|
|
75
|
+
type: boolean
|
|
76
|
+
auto_approved:
|
|
77
|
+
type: boolean
|
|
78
|
+
reviewer:
|
|
79
|
+
type: string
|
|
80
|
+
control_id:
|
|
81
|
+
type: string
|
|
82
|
+
output:
|
|
83
|
+
schema:
|
|
84
|
+
type: object
|
|
85
|
+
required:
|
|
86
|
+
- bucket
|
|
87
|
+
- check_id
|
|
88
|
+
- scenario
|
|
89
|
+
- source
|
|
90
|
+
- block_public_acls
|
|
91
|
+
- ignore_public_acls
|
|
92
|
+
- block_public_policy
|
|
93
|
+
- restrict_public_buckets
|
|
94
|
+
- verdict
|
|
95
|
+
- resource
|
|
96
|
+
- failed_fields
|
|
97
|
+
- reviewed
|
|
98
|
+
- auto_approved
|
|
99
|
+
- reviewer
|
|
100
|
+
- control_id
|
|
101
|
+
- changed_files
|
|
102
|
+
properties:
|
|
103
|
+
bucket:
|
|
104
|
+
type: string
|
|
105
|
+
check_id:
|
|
106
|
+
type: string
|
|
107
|
+
scenario:
|
|
108
|
+
type: string
|
|
109
|
+
source:
|
|
110
|
+
type: string
|
|
111
|
+
block_public_acls:
|
|
112
|
+
type: boolean
|
|
113
|
+
ignore_public_acls:
|
|
114
|
+
type: boolean
|
|
115
|
+
block_public_policy:
|
|
116
|
+
type: boolean
|
|
117
|
+
restrict_public_buckets:
|
|
118
|
+
type: boolean
|
|
119
|
+
verdict:
|
|
120
|
+
type: string
|
|
121
|
+
resource:
|
|
122
|
+
type: string
|
|
123
|
+
failed_fields:
|
|
124
|
+
type: array
|
|
125
|
+
items:
|
|
126
|
+
type: string
|
|
127
|
+
reviewed:
|
|
128
|
+
type: boolean
|
|
129
|
+
auto_approved:
|
|
130
|
+
type: boolean
|
|
131
|
+
reviewer:
|
|
132
|
+
type: string
|
|
133
|
+
control_id:
|
|
134
|
+
type: string
|
|
135
|
+
changed_files:
|
|
136
|
+
type: array
|
|
137
|
+
items:
|
|
138
|
+
type: string
|
|
139
|
+
verify:
|
|
140
|
+
- id: evidence-log-written
|
|
141
|
+
type: checkout_changes
|
|
142
|
+
path_fields: [changed_files]
|
|
143
|
+
when: [after]
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# conditional-fork
|
|
2
|
+
|
|
3
|
+
Operator HITL, then exclusive Route `if`. The `decide` stage asks for **branch-a** or **branch-b**, emits that value on `payload.branch`, and listed successors stay on the DAG. After success, each `if` runs against that payload: the matching arm runs; the other is skipped. The completing agent does not pick YAML successors.
|
|
4
|
+
|
|
5
|
+
See [YAML catalog — Route wiring](../../docs/yaml-catalog.md#route) (Route `if`). `if.field` must be a required output property — optional fields cannot be used in `if`.
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
- Node.js ≥ 20, Stageflow installed (`npm i -g stageflow`), **or** this repo built (`npm run build`)
|
|
10
|
+
- Provider auth connected (`sf ui` → Settings → Providers, or `sf providers login …`)
|
|
11
|
+
- Operator console for the gate: `sf ui` (default `http://127.0.0.1:3847`)
|
|
12
|
+
|
|
13
|
+
## Manual test
|
|
14
|
+
|
|
15
|
+
Commands run from the **repository git root**. Run state lives in `<repo>/.stageflow` even if you start `sf ui` from a subdirectory.
|
|
16
|
+
|
|
17
|
+
### Terminal 1 — operator console
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
cd examples/conditional-fork
|
|
21
|
+
sf ui
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Terminal 2 — validate and run (repo root)
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
sf validate --pipeline examples/conditional-fork/fork-demo.pipeline.yaml --strict
|
|
28
|
+
sf run \
|
|
29
|
+
--pipeline examples/conditional-fork/fork-demo.pipeline.yaml \
|
|
30
|
+
--task examples/conditional-fork/fork-demo.task.yaml
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### From the Stageflow repo (no global install)
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm run build
|
|
37
|
+
npm run dev -- validate --pipeline examples/conditional-fork/fork-demo.pipeline.yaml --strict
|
|
38
|
+
npm run dev -- run \
|
|
39
|
+
--pipeline examples/conditional-fork/fork-demo.pipeline.yaml \
|
|
40
|
+
--task examples/conditional-fork/fork-demo.task.yaml
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### At the HITL gate
|
|
44
|
+
|
|
45
|
+
When `decide` blocks, open the run in the console and answer the free-text prompt with exactly:
|
|
46
|
+
|
|
47
|
+
- `branch-a`, or
|
|
48
|
+
- `branch-b`
|
|
49
|
+
|
|
50
|
+
Exit code `2` means waiting on operator input. See [docs/hitl.md](../../docs/hitl.md).
|
|
51
|
+
|
|
52
|
+
### What to verify in the UI
|
|
53
|
+
|
|
54
|
+
After you answer:
|
|
55
|
+
|
|
56
|
+
1. The chosen branch stage (`branch-a` or `branch-b`) reaches **succeeded**
|
|
57
|
+
2. The other branch is **skipped**
|
|
58
|
+
3. The run overall **succeeded**
|
|
59
|
+
|
|
60
|
+
### Re-test the other branch
|
|
61
|
+
|
|
62
|
+
Start a **new** run and answer the opposite id at the gate.
|
|
63
|
+
|
|
64
|
+
## How it works
|
|
65
|
+
|
|
66
|
+
`decide` is `entry: true` with two `route` targets, each gated by `if` (`field: branch`, `op: eq`). After the operator answers, the agent emits `payload: { "branch": "branch-a" }` or `{ "branch": "branch-b" }`. Stageflow evaluates those predicates against the success payload: the matching successor runs; the miss is skipped. Both `to:` stay on the DAG.
|
|
67
|
+
|
|
68
|
+
`io.output.schema` requires `branch` as a string so `if.field: branch` is valid. Branch stage `io.input` is an empty object (a subset of decide output).
|
|
69
|
+
|
|
70
|
+
Validate may warn `pipeline.route_all_gated` because every forward `to:` on `decide` has `if`. That warning keeps `ok: true`; `--strict` does not promote it.
|
|
71
|
+
|
|
72
|
+
## Layout
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
examples/conditional-fork/
|
|
76
|
+
fork-demo.pipeline.yaml
|
|
77
|
+
fork-demo.task.yaml
|
|
78
|
+
decide.yaml
|
|
79
|
+
branch-a.yaml
|
|
80
|
+
branch-b.yaml
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## References
|
|
84
|
+
|
|
85
|
+
- [YAML catalog — Route wiring](../../docs/yaml-catalog.md#route)
|
|
86
|
+
- [YAML catalog — Upgrading older catalogs](../../docs/yaml-catalog.md#upgrading-older-catalogs)
|
|
87
|
+
- [HITL](../../docs/hitl.md)
|
|
88
|
+
- Fixtures: [`route-if-eq.pipeline.yaml`](../../tests/fixtures/pipelines/route-if-eq.pipeline.yaml)
|
|
89
|
+
- Related walkthrough: [`../route-if-tour/`](../route-if-tour/)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
id: branch-a
|
|
2
|
+
system_prompt: |
|
|
3
|
+
You are branch-a. Call emit_stage_envelope exactly once with status success,
|
|
4
|
+
a short summary that acknowledges branch-a ran, and artifacts []. Do not call
|
|
5
|
+
ask_operator.
|
|
6
|
+
model: anthropic/claude-sonnet-4-5
|
|
7
|
+
io:
|
|
8
|
+
input:
|
|
9
|
+
schema:
|
|
10
|
+
type: object
|
|
11
|
+
output:
|
|
12
|
+
schema:
|
|
13
|
+
type: object
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
id: branch-b
|
|
2
|
+
system_prompt: |
|
|
3
|
+
You are branch-b. Call emit_stage_envelope exactly once with status success,
|
|
4
|
+
a short summary that acknowledges branch-b ran, and artifacts []. Do not call
|
|
5
|
+
ask_operator.
|
|
6
|
+
model: cursor/auto
|
|
7
|
+
io:
|
|
8
|
+
input:
|
|
9
|
+
schema:
|
|
10
|
+
type: object
|
|
11
|
+
output:
|
|
12
|
+
schema:
|
|
13
|
+
type: object
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: decide
|
|
2
|
+
gate_kinds:
|
|
3
|
+
- free_text
|
|
4
|
+
system_prompt: |
|
|
5
|
+
You are the deciding stage for exclusive Route if branching. The operator
|
|
6
|
+
chooses which branch runs. Follow these steps exactly:
|
|
7
|
+
|
|
8
|
+
1. Call ask_operator with kind free_text. Ask which branch to take. Tell the
|
|
9
|
+
operator to reply with exactly one of: branch-a or branch-b.
|
|
10
|
+
2. Wait for the operator answer. Do not call emit_stage_envelope before you
|
|
11
|
+
have that answer.
|
|
12
|
+
3. After the operator answers, call emit_stage_envelope exactly once with:
|
|
13
|
+
- status: success
|
|
14
|
+
- a non-empty summary
|
|
15
|
+
- artifacts: []
|
|
16
|
+
- payload: { "branch": "branch-a" } or { "branch": "branch-b" }, matching
|
|
17
|
+
the operator reply exactly
|
|
18
|
+
|
|
19
|
+
Rules:
|
|
20
|
+
- Never emit before the operator answers.
|
|
21
|
+
- Do not emit fork_choice. Routing is deterministic from payload.branch.
|
|
22
|
+
- Never invent other branch values.
|
|
23
|
+
- Put only the id the operator chose in payload.branch.
|
|
24
|
+
model: cursor/auto
|
|
25
|
+
io:
|
|
26
|
+
input:
|
|
27
|
+
schema:
|
|
28
|
+
type: object
|
|
29
|
+
output:
|
|
30
|
+
schema:
|
|
31
|
+
type: object
|
|
32
|
+
required: [branch]
|
|
33
|
+
properties:
|
|
34
|
+
branch:
|
|
35
|
+
type: string
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
id: fork-demo
|
|
2
|
+
stages:
|
|
3
|
+
- id: decide
|
|
4
|
+
uses: ./decide.yaml
|
|
5
|
+
entry: true
|
|
6
|
+
route:
|
|
7
|
+
- to: branch-a
|
|
8
|
+
if:
|
|
9
|
+
field: branch
|
|
10
|
+
op: eq
|
|
11
|
+
value: branch-a
|
|
12
|
+
- to: branch-b
|
|
13
|
+
if:
|
|
14
|
+
field: branch
|
|
15
|
+
op: eq
|
|
16
|
+
value: branch-b
|
|
17
|
+
- id: branch-a
|
|
18
|
+
uses: ./branch-a.yaml
|
|
19
|
+
- id: branch-b
|
|
20
|
+
uses: ./branch-b.yaml
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
id: fork-demo
|
|
2
|
+
goal: |
|
|
3
|
+
Operator chooses branch-a or branch-b at the decide gate; the pipeline routes
|
|
4
|
+
to that branch and skips the other.
|
|
5
|
+
context: |
|
|
6
|
+
Manual HITL then Route if walkthrough. At decide, answer the free_text gate
|
|
7
|
+
with exactly branch-a or branch-b. The chosen branch should succeed; the other
|
|
8
|
+
should be skipped.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# context7-mcp
|
|
2
|
+
|
|
3
|
+
Three-stage walkthrough: **resolve a library**, **fetch docs**, then **write a brief**, using Context7 MCP (`https://mcp.context7.com/mcp`) from git-root `.mcp.json`.
|
|
4
|
+
|
|
5
|
+
Each MCP stage is a **fresh Pi session**. Stage 1 cannot leave a live Context7 connection for stage 2. The `library_id` travels in the envelope; stage 2 calls `query-docs`. Stage 3 has **no** `mcp:` list — it only turns the excerpt into an artifact.
|
|
6
|
+
|
|
7
|
+
| Stage | MCP | What it does |
|
|
8
|
+
|-------|-----|----------------|
|
|
9
|
+
| `resolve-library` | `context7` | `resolve-library-id` → emit `library_id` |
|
|
10
|
+
| `fetch-docs` | `context7` | `query-docs` → `docs.md` + `excerpt` |
|
|
11
|
+
| `write-brief` | — | `brief.md` from the excerpt (no MCP) |
|
|
12
|
+
|
|
13
|
+
## Prerequisites
|
|
14
|
+
|
|
15
|
+
- Node.js ≥ 20 and this repo's CLI (`npm run build`), not an older global `sf`
|
|
16
|
+
- Provider auth (`sf ui` → Settings → Providers)
|
|
17
|
+
- `CONTEXT7_API_KEY` in the environment of the `sf run` / `sf ui` process (free key at [context7.com/dashboard](https://context7.com/dashboard)). The catalog interpolates `Authorization: Bearer ${CONTEXT7_API_KEY}`. `sf validate` does not require the var; the run does.
|
|
18
|
+
|
|
19
|
+
Git-root `.mcp.json` already names `context7`. Stages still pass `mcp: [context7]` — listing it in the catalog is not attach.
|
|
20
|
+
|
|
21
|
+
Optional: Settings → **Project MCP servers** → Check `context7` before the run.
|
|
22
|
+
|
|
23
|
+
## Run (repo root)
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
export CONTEXT7_API_KEY=... # from context7.com/dashboard
|
|
27
|
+
npm run build
|
|
28
|
+
node dist/cli.js validate --pipeline examples/context7-mcp/context7-mcp.pipeline.yaml --strict
|
|
29
|
+
node dist/cli.js run \
|
|
30
|
+
--pipeline examples/context7-mcp/context7-mcp.pipeline.yaml \
|
|
31
|
+
--task examples/context7-mcp/context7-mcp.task.yaml
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Inspect:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
node dist/cli.js envelope get --run <runId> --stage resolve-library --json
|
|
38
|
+
node dist/cli.js envelope get --run <runId> --stage fetch-docs --json
|
|
39
|
+
node dist/cli.js envelope get --run <runId> --stage write-brief --json
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The operator-facing write-up is the `write-brief` Files row `brief.md`.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
id: context7-mcp
|
|
2
|
+
stages:
|
|
3
|
+
- id: resolve-library
|
|
4
|
+
entry: true
|
|
5
|
+
route:
|
|
6
|
+
- to: fetch-docs
|
|
7
|
+
uses: ./resolve-library.yaml
|
|
8
|
+
mcp: [context7]
|
|
9
|
+
- id: fetch-docs
|
|
10
|
+
route:
|
|
11
|
+
- to: write-brief
|
|
12
|
+
uses: ./fetch-docs.yaml
|
|
13
|
+
mcp: [context7]
|
|
14
|
+
- id: write-brief
|
|
15
|
+
uses: ./write-brief.yaml
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
id: context7-mcp
|
|
2
|
+
goal: Look up how to register a GET route in Express, using current Context7 docs, then write a one-page brief.
|
|
3
|
+
context: Three-stage Context7 MCP walkthrough. Resolve a library id, fetch docs, then write a brief without MCP. Each MCP stage is a fresh session.
|
|
4
|
+
constraints: Use only the context7 server named on the stage. Do not call ask_operator. Do not invent APIs missing from the fetched docs.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
id: fetch-docs
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Fetch current docs for the library_id from the prior resolve-library
|
|
4
|
+
envelope. This stage has a new Context7 MCP session. Call query-docs
|
|
5
|
+
with that libraryId and the task question. Do not call
|
|
6
|
+
resolve-library-id unless the id is unusable. Do not call ask_operator.
|
|
7
|
+
|
|
8
|
+
Write docs.md via write_stage_artifact with the retrieved snippets
|
|
9
|
+
(trimmed to what answers the question). Checkout write/edit does not
|
|
10
|
+
satisfy the artifact.
|
|
11
|
+
|
|
12
|
+
When finished, call emit_stage_envelope exactly once with status success,
|
|
13
|
+
artifacts ["docs.md"], a short summary, and payload
|
|
14
|
+
{ "library_id": "<id>", "query": "<question>", "excerpt": "<short answer
|
|
15
|
+
plus one code sample from the docs>" }. summary and payload are handed
|
|
16
|
+
downstream verbatim. State outcomes and artifact pointers only.
|
|
17
|
+
|
|
18
|
+
Your last tool call in this attempt must be emit_stage_envelope.
|
|
19
|
+
model: cursor/auto
|
|
20
|
+
io:
|
|
21
|
+
input:
|
|
22
|
+
schema:
|
|
23
|
+
type: object
|
|
24
|
+
required:
|
|
25
|
+
- library_id
|
|
26
|
+
- library_name
|
|
27
|
+
properties:
|
|
28
|
+
library_id:
|
|
29
|
+
type: string
|
|
30
|
+
library_name:
|
|
31
|
+
type: string
|
|
32
|
+
output:
|
|
33
|
+
schema:
|
|
34
|
+
type: object
|
|
35
|
+
required:
|
|
36
|
+
- library_id
|
|
37
|
+
- query
|
|
38
|
+
- excerpt
|
|
39
|
+
properties:
|
|
40
|
+
library_id:
|
|
41
|
+
type: string
|
|
42
|
+
query:
|
|
43
|
+
type: string
|
|
44
|
+
excerpt:
|
|
45
|
+
type: string
|
|
46
|
+
verify:
|
|
47
|
+
- id: docs
|
|
48
|
+
type: artifact
|
|
49
|
+
path: docs.md
|
|
50
|
+
nonempty: true
|
|
51
|
+
when:
|
|
52
|
+
- after
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: resolve-library
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Resolve the library named in the task with Context7 MCP. Call
|
|
4
|
+
resolve-library-id with libraryName and the task question as query.
|
|
5
|
+
Pick one libraryId (prefer an official high-reputation match). Do not
|
|
6
|
+
call query-docs. Do not call ask_operator.
|
|
7
|
+
|
|
8
|
+
When finished, call emit_stage_envelope exactly once with status success,
|
|
9
|
+
artifacts [], a short summary, and payload
|
|
10
|
+
{ "library_id": "<id like /org/project>", "library_name": "<name>" }.
|
|
11
|
+
summary and payload are handed to the next stage verbatim. State outcomes
|
|
12
|
+
only.
|
|
13
|
+
|
|
14
|
+
Your last tool call in this attempt must be emit_stage_envelope.
|
|
15
|
+
The next stage starts a fresh MCP session — pass the id in the envelope.
|
|
16
|
+
model: cursor/auto
|
|
17
|
+
io:
|
|
18
|
+
input:
|
|
19
|
+
schema:
|
|
20
|
+
type: object
|
|
21
|
+
output:
|
|
22
|
+
schema:
|
|
23
|
+
type: object
|
|
24
|
+
required:
|
|
25
|
+
- library_id
|
|
26
|
+
- library_name
|
|
27
|
+
properties:
|
|
28
|
+
library_id:
|
|
29
|
+
type: string
|
|
30
|
+
library_name:
|
|
31
|
+
type: string
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
id: write-brief
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Turn the fetch-docs envelope into a one-page operator brief. You do not
|
|
4
|
+
have Context7 MCP on this stage. Use payload.excerpt, library_id, and
|
|
5
|
+
query only. Do not invent APIs that are not in the excerpt. Do not call
|
|
6
|
+
ask_operator.
|
|
7
|
+
|
|
8
|
+
Write brief.md via write_stage_artifact: the question, the library id,
|
|
9
|
+
a short answer, and the code sample from the excerpt. Checkout write/edit
|
|
10
|
+
does not satisfy the artifact.
|
|
11
|
+
|
|
12
|
+
When finished, call emit_stage_envelope exactly once with status success,
|
|
13
|
+
artifacts ["brief.md"], a short summary, and payload
|
|
14
|
+
{ "library_id": "<id>", "brief_artifact": "brief.md" }. summary and
|
|
15
|
+
payload are handed downstream verbatim. State outcomes and artifact
|
|
16
|
+
pointers only.
|
|
17
|
+
|
|
18
|
+
Your last tool call in this attempt must be emit_stage_envelope.
|
|
19
|
+
model: cursor/auto
|
|
20
|
+
io:
|
|
21
|
+
input:
|
|
22
|
+
schema:
|
|
23
|
+
type: object
|
|
24
|
+
required:
|
|
25
|
+
- library_id
|
|
26
|
+
- query
|
|
27
|
+
- excerpt
|
|
28
|
+
properties:
|
|
29
|
+
library_id:
|
|
30
|
+
type: string
|
|
31
|
+
query:
|
|
32
|
+
type: string
|
|
33
|
+
excerpt:
|
|
34
|
+
type: string
|
|
35
|
+
output:
|
|
36
|
+
schema:
|
|
37
|
+
type: object
|
|
38
|
+
required:
|
|
39
|
+
- library_id
|
|
40
|
+
- brief_artifact
|
|
41
|
+
properties:
|
|
42
|
+
library_id:
|
|
43
|
+
type: string
|
|
44
|
+
brief_artifact:
|
|
45
|
+
type: string
|
|
46
|
+
verify:
|
|
47
|
+
- id: brief
|
|
48
|
+
type: artifact
|
|
49
|
+
path: brief.md
|
|
50
|
+
nonempty: true
|
|
51
|
+
when:
|
|
52
|
+
- after
|