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,53 @@
|
|
|
1
|
+
id: pydantic-ai-7971
|
|
2
|
+
goal: >
|
|
3
|
+
Deliver a verified minimal local fix for Pydantic AI issue #7971, Carry a
|
|
4
|
+
durable unit's emitted events and enqueued messages in its recorded output,
|
|
5
|
+
applied as source and test edits in the checkout working tree, plus an
|
|
6
|
+
operator-approved pull request opened against tejasghutukade/pydantic-ai
|
|
7
|
+
rather than pydantic/pydantic-ai.
|
|
8
|
+
context: |
|
|
9
|
+
Issue: https://github.com/pydantic/pydantic-ai/issues/7971
|
|
10
|
+
Title: Carry a durable unit's emitted events and enqueued messages in its recorded output
|
|
11
|
+
Upstream repo: https://github.com/pydantic/pydantic-ai
|
|
12
|
+
Fork (PR target after the run): https://github.com/tejasghutukade/pydantic-ai
|
|
13
|
+
State: OPEN, unassigned. Pydantic contributing guidance asks for assignment
|
|
14
|
+
before an upstream PR, so this run prepares a local change for a fork PR only.
|
|
15
|
+
|
|
16
|
+
Reported behavior: under durable execution, ctx.emit() and ctx.enqueue() are
|
|
17
|
+
side effects of running a durable unit rather than part of its recorded
|
|
18
|
+
result, so they do not survive replay. On Prefect/DBOS a replayed result
|
|
19
|
+
never re-emits; on Temporal emit from a tool or event stream handler raises;
|
|
20
|
+
ctx.enqueue() is rejected on all three engines. A capability therefore cannot
|
|
21
|
+
emit from its own tools under durable execution.
|
|
22
|
+
|
|
23
|
+
Expected behavior (proposal on the issue): carry the emitted events and
|
|
24
|
+
enqueued messages back in the unit's recorded output and replay them
|
|
25
|
+
container-side. (1) Worker-side, install capture sinks on the unit's
|
|
26
|
+
RunContext so emit and enqueue append instead of raising or reaching the live
|
|
27
|
+
buffer. (2) Return them alongside the operation's value in an envelope over
|
|
28
|
+
ResultT. (3) Container-side, re-emit the captured events and extend
|
|
29
|
+
pending_messages before handing the value back. DurableOperation already has
|
|
30
|
+
the shape: one handler, one result_codec, and declaration sites in
|
|
31
|
+
durable_exec/_base.py.
|
|
32
|
+
|
|
33
|
+
Care needed: liveness on in-process engines (live delivery vs
|
|
34
|
+
capture-then-replay), and wire compatibility (decode both the bare value and
|
|
35
|
+
the envelope; see test_durable_exec_compat.py).
|
|
36
|
+
|
|
37
|
+
The full issue write-up, including per-engine detail and related issues, is
|
|
38
|
+
captured by the intake stage in issue-intake.md.
|
|
39
|
+
constraints: |
|
|
40
|
+
Respect pydantic-ai AGENTS.md, CONTRIBUTING.md, and test docs.
|
|
41
|
+
Do not commit, push, create a branch, or open a pull request in any stage
|
|
42
|
+
except oss-approve-contribution, which may do so only after the operator
|
|
43
|
+
has explicitly accepted the contribution package through its
|
|
44
|
+
artifact_backed gate.
|
|
45
|
+
Do not target pydantic/pydantic-ai. The PR base is always
|
|
46
|
+
tejasghutukade/pydantic-ai (gh pr create --repo tejasghutukade/pydantic-ai).
|
|
47
|
+
Keep the change limited to the reproduced issue and its regression test.
|
|
48
|
+
Do not treat missing maintainer assignment as a reason to skip local work.
|
|
49
|
+
Source and test edits belong in the checkout working tree and must never be
|
|
50
|
+
replaced by a Stageflow artifact or report describing the change.
|
|
51
|
+
In the explainer stages only (oss-explain-issue, oss-explain-fix), the
|
|
52
|
+
explainer HTML belongs in Stageflow artifacts, never in the checkout.
|
|
53
|
+
checkout: /Users/tejasghutukade/Projects/pydantic-ai
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# oss-quick-fix
|
|
2
|
+
|
|
3
|
+
A minimal, fully unattended sibling of
|
|
4
|
+
[`oss-issue-contribution`](../oss-issue-contribution/): one straight-line
|
|
5
|
+
spine from "understand the issue" to "PR opened against my fork," with no
|
|
6
|
+
operator gate anywhere in the run.
|
|
7
|
+
|
|
8
|
+
Every stage declares `gate_kinds: []`, which unregisters `ask_operator`
|
|
9
|
+
entirely — stages must decide and proceed, never pause for a human. Use this
|
|
10
|
+
shape for issues small enough that you trust a single unsupervised pass; use
|
|
11
|
+
`oss-issue-contribution` when you want parallel investigation/review and an
|
|
12
|
+
operator approval before anything ships.
|
|
13
|
+
|
|
14
|
+
## Flow
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
understand-issue → implement-fix → verify-fix → ship-fix
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
1. **understand-issue** — Reads the task goal/context, locates the responsible
|
|
21
|
+
code, reproduces the bug if practical, and writes `investigation.md`.
|
|
22
|
+
2. **implement-fix** — Writes a failing regression test, fixes the root cause,
|
|
23
|
+
confirms the test (and the broader suite) passes, and writes
|
|
24
|
+
`fix-report.md`. `changed_files` must match `git diff --name-only` exactly.
|
|
25
|
+
3. **verify-fix** — Independently re-runs the repo's real check/lint/test
|
|
26
|
+
commands against the actual diff (not the report's description of it) and
|
|
27
|
+
writes `verification.md`. `all_passed` is true only if every command it
|
|
28
|
+
ran actually exited zero.
|
|
29
|
+
4. **ship-fix** — Commits, pushes, and opens a pull request against
|
|
30
|
+
`publish_repo` — the fork named in the task, never the upstream repo — and
|
|
31
|
+
writes `ship-report.md`. Refuses to proceed if `verify-fix` did not pass or
|
|
32
|
+
if the task does not name a fork.
|
|
33
|
+
|
|
34
|
+
Every stage declares `on_verify_fail: { mode: repair, retry_safety: idempotent, max_attempts: 3 }`
|
|
35
|
+
except `ship-fix`, which uses `mode: manual` / `retry_safety: side_effecting`
|
|
36
|
+
because it is the only stage with side effects (git push, PR creation).
|
|
37
|
+
|
|
38
|
+
## Runtime contracts
|
|
39
|
+
|
|
40
|
+
| Stage | Required artifact | Other checks |
|
|
41
|
+
|-------|--------------------|---------------|
|
|
42
|
+
| `understand-issue` | `investigation.md` | — |
|
|
43
|
+
| `implement-fix` | `fix-report.md` | `type: checkout_changes` on `changed_files` |
|
|
44
|
+
| `verify-fix` | `verification.md` | — |
|
|
45
|
+
| `ship-fix` | `ship-report.md` | — |
|
|
46
|
+
|
|
47
|
+
## Run
|
|
48
|
+
|
|
49
|
+
Fill in [`oss-quick-fix.task.yaml`](oss-quick-fix.task.yaml) — the issue, the
|
|
50
|
+
fork to publish to, and `checkout` pointed at a clean working tree of the
|
|
51
|
+
target repository.
|
|
52
|
+
|
|
53
|
+
```bash
|
|
54
|
+
sf validate --pipeline examples/oss-quick-fix/oss-quick-fix.pipeline.yaml --strict
|
|
55
|
+
sf run \
|
|
56
|
+
--pipeline examples/oss-quick-fix/oss-quick-fix.pipeline.yaml \
|
|
57
|
+
--task examples/oss-quick-fix/oss-quick-fix.task.yaml
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Needs a configured provider (`sf providers status`), and `gh` on `PATH`
|
|
61
|
+
authenticated (`GH_TOKEN` or `GITHUB_TOKEN`) before `ship-fix` runs, or the
|
|
62
|
+
publish step fails after the fix is already verified.
|
|
63
|
+
|
|
64
|
+
Run `sf ui` in another terminal to inspect envelopes and artifacts — there are
|
|
65
|
+
no gates to answer.
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
id: implement-fix
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Fix the issue in the checkout: edit source, add a regression test, and get
|
|
4
|
+
both passing. Never call ask_operator — decide and proceed.
|
|
5
|
+
|
|
6
|
+
Read investigation.md from the prior envelope's artifacts (a run-relative
|
|
7
|
+
path under the "Factory run workspace" value given in this stage's user
|
|
8
|
+
prompt) for the root cause, target files, and fix approach. Treat it as the
|
|
9
|
+
starting point, not gospel — if the real fix differs once you're in the
|
|
10
|
+
code, take the correct one and say why in fix-report.md.
|
|
11
|
+
|
|
12
|
+
1. Write a regression test that fails against the current (buggy) code for
|
|
13
|
+
the reason described in investigation.md, using the repo's actual test
|
|
14
|
+
framework and conventions (find an existing test file near the affected
|
|
15
|
+
code and match its style; do not invent a new test setup pattern).
|
|
16
|
+
Confirm it fails, and capture that failing output.
|
|
17
|
+
2. Edit the source to fix the root cause. Keep the change minimal and
|
|
18
|
+
scoped to this issue — do not refactor, rename, or clean up unrelated
|
|
19
|
+
code along the way.
|
|
20
|
+
3. Run the regression test again and confirm it now passes. Then run the
|
|
21
|
+
broader test suite (or the most relevant scoped slice if a full run is
|
|
22
|
+
impractical) to check you haven't broken anything else. If something
|
|
23
|
+
breaks, fix it before moving on — you own this loop end to end; nothing
|
|
24
|
+
downstream can repair a broken implementation.
|
|
25
|
+
4. Call write_stage_artifact with path fix-report.md containing: what you
|
|
26
|
+
changed and why, the regression test's id/path and its before/after
|
|
27
|
+
output, every command you ran with its result, and anything from
|
|
28
|
+
investigation.md you deviated from and why.
|
|
29
|
+
5. Call emit_stage_envelope exactly once. changed_files must match
|
|
30
|
+
git diff --name-only exactly — no more, no fewer.
|
|
31
|
+
model: openrouter/minimax/minimax-m3:free
|
|
32
|
+
timeout_ms: 7200000
|
|
33
|
+
io:
|
|
34
|
+
input:
|
|
35
|
+
schema:
|
|
36
|
+
type: object
|
|
37
|
+
required:
|
|
38
|
+
- root_cause
|
|
39
|
+
- target_files
|
|
40
|
+
- repro_confirmed
|
|
41
|
+
- fix_approach
|
|
42
|
+
properties:
|
|
43
|
+
root_cause:
|
|
44
|
+
type: string
|
|
45
|
+
target_files:
|
|
46
|
+
type: array
|
|
47
|
+
items:
|
|
48
|
+
type: string
|
|
49
|
+
repro_confirmed:
|
|
50
|
+
type: boolean
|
|
51
|
+
fix_approach:
|
|
52
|
+
type: string
|
|
53
|
+
additionalProperties: false
|
|
54
|
+
output:
|
|
55
|
+
schema:
|
|
56
|
+
type: object
|
|
57
|
+
required:
|
|
58
|
+
- changed_files
|
|
59
|
+
- regression_test
|
|
60
|
+
- tests_passed
|
|
61
|
+
properties:
|
|
62
|
+
changed_files:
|
|
63
|
+
type: array
|
|
64
|
+
items:
|
|
65
|
+
type: string
|
|
66
|
+
regression_test:
|
|
67
|
+
type: string
|
|
68
|
+
tests_passed:
|
|
69
|
+
type: boolean
|
|
70
|
+
additionalProperties: false
|
|
71
|
+
verify:
|
|
72
|
+
- id: fix-report
|
|
73
|
+
type: artifact
|
|
74
|
+
path: fix-report.md
|
|
75
|
+
nonempty: true
|
|
76
|
+
when:
|
|
77
|
+
- after
|
|
78
|
+
- id: checkout-changed
|
|
79
|
+
type: checkout_changes
|
|
80
|
+
path_fields:
|
|
81
|
+
- changed_files
|
|
82
|
+
when:
|
|
83
|
+
- after
|
|
84
|
+
gate_kinds: []
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: oss-quick-fix
|
|
2
|
+
stages:
|
|
3
|
+
- id: understand-issue
|
|
4
|
+
entry: true
|
|
5
|
+
route:
|
|
6
|
+
- to: implement-fix
|
|
7
|
+
uses: ./understand-issue.yaml
|
|
8
|
+
on_verify_fail:
|
|
9
|
+
mode: repair
|
|
10
|
+
max_attempts: 3
|
|
11
|
+
retry_safety: idempotent
|
|
12
|
+
include_failed_checks: true
|
|
13
|
+
- id: implement-fix
|
|
14
|
+
route:
|
|
15
|
+
- to: verify-fix
|
|
16
|
+
uses: ./implement-fix.yaml
|
|
17
|
+
on_verify_fail:
|
|
18
|
+
mode: repair
|
|
19
|
+
max_attempts: 3
|
|
20
|
+
retry_safety: idempotent
|
|
21
|
+
include_failed_checks: true
|
|
22
|
+
- id: verify-fix
|
|
23
|
+
route:
|
|
24
|
+
- to: ship-fix
|
|
25
|
+
uses: ./verify-fix.yaml
|
|
26
|
+
on_verify_fail:
|
|
27
|
+
mode: repair
|
|
28
|
+
max_attempts: 3
|
|
29
|
+
retry_safety: idempotent
|
|
30
|
+
include_failed_checks: true
|
|
31
|
+
- id: ship-fix
|
|
32
|
+
uses: ./ship-fix.yaml
|
|
33
|
+
on_verify_fail:
|
|
34
|
+
mode: manual
|
|
35
|
+
retry_safety: side_effecting
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
id: oss-quick-fix-template
|
|
2
|
+
goal: >
|
|
3
|
+
Deliver a verified minimal local fix for <issue URL / short description>,
|
|
4
|
+
applied as source and test edits in the checkout working tree, plus a pull
|
|
5
|
+
request opened against your own fork (never the upstream repository).
|
|
6
|
+
context: |
|
|
7
|
+
Issue: <issue URL>
|
|
8
|
+
Title: <copy the current issue title>
|
|
9
|
+
Upstream repo: <owner/repo>
|
|
10
|
+
Fork (PR target): <your-username>/<repo>
|
|
11
|
+
Reported behavior: <copy or summarize the concrete failure>
|
|
12
|
+
Expected behavior: <copy or summarize the acceptance criterion>
|
|
13
|
+
constraints: |
|
|
14
|
+
Respect the target repository's AGENTS.md / CONTRIBUTING.md and test
|
|
15
|
+
conventions.
|
|
16
|
+
publish_repo in the final stage must be exactly the fork named above —
|
|
17
|
+
never the upstream owner/repo.
|
|
18
|
+
Keep the change limited to the reported issue and its regression test.
|
|
19
|
+
checkout: /absolute/path/to/checkout
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
id: ship-fix
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Publish the verified fix as a pull request against your own fork —
|
|
4
|
+
never the upstream project. Opening a PR against upstream is a separate,
|
|
5
|
+
explicitly-authorized manual step outside this pipeline; this stage never
|
|
6
|
+
does that. Never call ask_operator or pause for review — within that
|
|
7
|
+
fork-only boundary, commit, push, and open the pull request yourself.
|
|
8
|
+
|
|
9
|
+
Read verification.md, fix-report.md, and investigation.md from prior
|
|
10
|
+
envelopes' artifacts (run-relative paths under the "Factory run workspace"
|
|
11
|
+
value given in this stage's user prompt). Do not proceed if
|
|
12
|
+
verification.md's all_passed is not true — emit failure instead and say
|
|
13
|
+
what's unresolved.
|
|
14
|
+
|
|
15
|
+
publish_repo is exactly the fork repository the task goal/context names as
|
|
16
|
+
the PR target (e.g. your-username/project, not the original upstream
|
|
17
|
+
owner/project). If the task does not explicitly name a fork, emit failure
|
|
18
|
+
instead of guessing — never push or open a PR against a repository nobody
|
|
19
|
+
named, and never target the upstream repository under any circumstance.
|
|
20
|
+
|
|
21
|
+
1. Run git status to confirm the diff from implement-fix/verify-fix is
|
|
22
|
+
still present and is the only thing you're about to commit.
|
|
23
|
+
2. Stage exactly the changed files (never a blanket add), commit with a
|
|
24
|
+
concise message describing the fix and why (match the target repo's
|
|
25
|
+
commit conventions from investigation.md if it recorded any), and push
|
|
26
|
+
to a new branch on publish_repo (your fork).
|
|
27
|
+
3. Open a pull request with gh pr create --repo <publish_repo> against that
|
|
28
|
+
fork's default branch: title stating the fix, body with the issue
|
|
29
|
+
reference, root cause, what changed, and the verification commands that
|
|
30
|
+
passed. Note in the body that this targets the fork and that opening it
|
|
31
|
+
against upstream is a separate manual step.
|
|
32
|
+
4. Confirm the PR exists with gh pr view. Call write_stage_artifact with
|
|
33
|
+
path ship-report.md containing the branch, commit sha, PR url, and the
|
|
34
|
+
exact git/gh commands you ran.
|
|
35
|
+
5. Call emit_stage_envelope exactly once. opened is true only if gh pr view
|
|
36
|
+
confirmed the PR exists.
|
|
37
|
+
model: openrouter/minimax/minimax-m3:free
|
|
38
|
+
timeout_ms: 7200000
|
|
39
|
+
io:
|
|
40
|
+
input:
|
|
41
|
+
schema:
|
|
42
|
+
type: object
|
|
43
|
+
required:
|
|
44
|
+
- commands_run
|
|
45
|
+
- all_passed
|
|
46
|
+
properties:
|
|
47
|
+
commands_run:
|
|
48
|
+
type: array
|
|
49
|
+
items:
|
|
50
|
+
type: string
|
|
51
|
+
all_passed:
|
|
52
|
+
type: boolean
|
|
53
|
+
notes:
|
|
54
|
+
type: string
|
|
55
|
+
additionalProperties: false
|
|
56
|
+
output:
|
|
57
|
+
schema:
|
|
58
|
+
type: object
|
|
59
|
+
required:
|
|
60
|
+
- publish_repo
|
|
61
|
+
- branch
|
|
62
|
+
- opened
|
|
63
|
+
- pr_url
|
|
64
|
+
properties:
|
|
65
|
+
publish_repo:
|
|
66
|
+
type: string
|
|
67
|
+
branch:
|
|
68
|
+
type: string
|
|
69
|
+
opened:
|
|
70
|
+
type: boolean
|
|
71
|
+
pr_url:
|
|
72
|
+
type: string
|
|
73
|
+
additionalProperties: false
|
|
74
|
+
verify:
|
|
75
|
+
- id: ship-report
|
|
76
|
+
type: artifact
|
|
77
|
+
path: ship-report.md
|
|
78
|
+
nonempty: true
|
|
79
|
+
when:
|
|
80
|
+
- after
|
|
81
|
+
gate_kinds: []
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
id: understand-issue
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Understand the reported issue well enough to fix it, then write
|
|
4
|
+
investigation.md as the durable record downstream stages read instead of
|
|
5
|
+
re-deriving this work. Do not edit source files in this stage. Never call
|
|
6
|
+
ask_operator — this pipeline runs unattended; make the best defensible call
|
|
7
|
+
yourself and keep going.
|
|
8
|
+
|
|
9
|
+
1. Read the task goal and context for the issue statement (what's broken,
|
|
10
|
+
why, why it matters). If the checkout has AGENTS.md, CONTRIBUTING.md, or
|
|
11
|
+
other repo-instruction files, read the ones that govern the suspected
|
|
12
|
+
code area and note anything that constrains how a fix should look
|
|
13
|
+
(commit conventions, test runner, things you must not touch).
|
|
14
|
+
2. Locate the actual code responsible, by reading it — not by guessing from
|
|
15
|
+
the issue text. Trace the failure to specific files and line ranges.
|
|
16
|
+
3. Reproduce the bug if at all practical: write and run a minimal script,
|
|
17
|
+
failing test, or repro command that demonstrates the broken behavior
|
|
18
|
+
right now, in this checkout. If true reproduction isn't practical
|
|
19
|
+
(e.g. needs hardware or a live external service you don't have), say so
|
|
20
|
+
explicitly and explain what you verified by reading the code instead —
|
|
21
|
+
do not claim a reproduction that didn't happen.
|
|
22
|
+
4. Call write_stage_artifact with path investigation.md containing: the
|
|
23
|
+
issue restated in full (not abbreviated — downstream stages rely on
|
|
24
|
+
this, not on the task text), root cause with file:line references,
|
|
25
|
+
repro method and its actual output, the fix approach you intend to take
|
|
26
|
+
and why, and any repo rules from step 1 that constrain the fix.
|
|
27
|
+
5. Call emit_stage_envelope exactly once with a payload matching the
|
|
28
|
+
schema.
|
|
29
|
+
|
|
30
|
+
No placeholder values (n/a, tbd, unknown, "see issue") anywhere in the
|
|
31
|
+
payload or artifact — if something is genuinely unknown, say what you'd
|
|
32
|
+
need to find out and why you couldn't, and still record what you did
|
|
33
|
+
verify.
|
|
34
|
+
model: openrouter/minimax/minimax-m3:free
|
|
35
|
+
timeout_ms: 7200000
|
|
36
|
+
io:
|
|
37
|
+
input:
|
|
38
|
+
schema:
|
|
39
|
+
type: object
|
|
40
|
+
output:
|
|
41
|
+
schema:
|
|
42
|
+
type: object
|
|
43
|
+
required:
|
|
44
|
+
- root_cause
|
|
45
|
+
- target_files
|
|
46
|
+
- repro_confirmed
|
|
47
|
+
- fix_approach
|
|
48
|
+
properties:
|
|
49
|
+
root_cause:
|
|
50
|
+
type: string
|
|
51
|
+
target_files:
|
|
52
|
+
type: array
|
|
53
|
+
items:
|
|
54
|
+
type: string
|
|
55
|
+
repro_confirmed:
|
|
56
|
+
type: boolean
|
|
57
|
+
fix_approach:
|
|
58
|
+
type: string
|
|
59
|
+
additionalProperties: false
|
|
60
|
+
verify:
|
|
61
|
+
- id: investigation
|
|
62
|
+
type: artifact
|
|
63
|
+
path: investigation.md
|
|
64
|
+
nonempty: true
|
|
65
|
+
when:
|
|
66
|
+
- after
|
|
67
|
+
gate_kinds: []
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
id: verify-fix
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Independently verify the fix is correct, complete, and clean before it
|
|
4
|
+
ships — you are the only check this pipeline has; there is no human review
|
|
5
|
+
step. Never call ask_operator. If you find a problem, fix it yourself and
|
|
6
|
+
re-verify rather than reporting it downstream.
|
|
7
|
+
|
|
8
|
+
Read fix-report.md and investigation.md from prior envelopes' artifacts
|
|
9
|
+
(run-relative paths under the "Factory run workspace" value given in this
|
|
10
|
+
stage's user prompt).
|
|
11
|
+
|
|
12
|
+
1. Read the actual diff (git diff) rather than trusting fix-report.md's
|
|
13
|
+
description of it. Confirm the change matches the claimed root cause
|
|
14
|
+
and is scoped to the issue — flag and fix anything unrelated, debug
|
|
15
|
+
leftovers, commented-out code, or stray files.
|
|
16
|
+
2. Run the repo's real check/lint/typecheck command and its real test
|
|
17
|
+
command (found in AGENTS.md, package scripts, or equivalent — use
|
|
18
|
+
whatever investigation.md recorded, or find it yourself if that's
|
|
19
|
+
incomplete). Run the regression test by its exact id, and the broader
|
|
20
|
+
suite. Record every command and its exit status.
|
|
21
|
+
3. If anything fails or looks wrong, fix it in this stage and re-run until
|
|
22
|
+
it's clean. Do not report success on a red run, and do not hand a known
|
|
23
|
+
problem downstream with a note about it instead of fixing it.
|
|
24
|
+
4. Call write_stage_artifact with path verification.md containing: every
|
|
25
|
+
command run and its result, confirmation the regression test passes,
|
|
26
|
+
confirmation of no unrelated changes, and any issues you found and
|
|
27
|
+
fixed in this stage.
|
|
28
|
+
5. Call emit_stage_envelope exactly once with all_passed true only if
|
|
29
|
+
every command you ran actually exited zero.
|
|
30
|
+
model: openrouter/minimax/minimax-m3:free
|
|
31
|
+
timeout_ms: 7200000
|
|
32
|
+
io:
|
|
33
|
+
input:
|
|
34
|
+
schema:
|
|
35
|
+
type: object
|
|
36
|
+
required:
|
|
37
|
+
- changed_files
|
|
38
|
+
- regression_test
|
|
39
|
+
- tests_passed
|
|
40
|
+
properties:
|
|
41
|
+
changed_files:
|
|
42
|
+
type: array
|
|
43
|
+
items:
|
|
44
|
+
type: string
|
|
45
|
+
regression_test:
|
|
46
|
+
type: string
|
|
47
|
+
tests_passed:
|
|
48
|
+
type: boolean
|
|
49
|
+
additionalProperties: false
|
|
50
|
+
output:
|
|
51
|
+
schema:
|
|
52
|
+
type: object
|
|
53
|
+
required:
|
|
54
|
+
- commands_run
|
|
55
|
+
- all_passed
|
|
56
|
+
properties:
|
|
57
|
+
commands_run:
|
|
58
|
+
type: array
|
|
59
|
+
items:
|
|
60
|
+
type: string
|
|
61
|
+
all_passed:
|
|
62
|
+
type: boolean
|
|
63
|
+
notes:
|
|
64
|
+
type: string
|
|
65
|
+
additionalProperties: false
|
|
66
|
+
verify:
|
|
67
|
+
- id: verification
|
|
68
|
+
type: artifact
|
|
69
|
+
path: verification.md
|
|
70
|
+
nonempty: true
|
|
71
|
+
when:
|
|
72
|
+
- after
|
|
73
|
+
gate_kinds: []
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# plan-review
|
|
2
|
+
|
|
3
|
+
Two-stage pipeline with an **artifact-backed operator gate** (`ask_operator`). This is an **SDLC-style example** — plan review before implementation — but the same HITL pattern applies to any workflow you author.
|
|
4
|
+
|
|
5
|
+
Fixture twin: `tests/fixtures/pipelines/plan-review-proving.pipeline.yaml`.
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
- Node.js ≥ 20, Stageflow installed
|
|
10
|
+
- Provider auth connected
|
|
11
|
+
- Operator console: `sf ui` (default `http://127.0.0.1:3847`)
|
|
12
|
+
|
|
13
|
+
## Commands
|
|
14
|
+
|
|
15
|
+
From the **repository git root**:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
sf validate --pipeline examples/plan-review/plan-review.pipeline.yaml --strict
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Terminal 1:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
sf ui
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Terminal 2:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
sf run \
|
|
31
|
+
--pipeline examples/plan-review/plan-review.pipeline.yaml \
|
|
32
|
+
--task examples/plan-review/plan-review.task.yaml
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
When the first stage blocks on HITL, open the run in the console, review the plan artifact, and accept or reject. Exit code `2` means waiting on operator input.
|
|
36
|
+
|
|
37
|
+
See [docs/hitl.md](../../docs/hitl.md).
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
id: plan-review-followup
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Acknowledge that the prior plan-review stage completed with operator acceptance
|
|
4
|
+
of the plan. Call emit_stage_envelope once with a short summary. Do not call
|
|
5
|
+
ask_operator. Do not perform further HITL.
|
|
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,9 @@
|
|
|
1
|
+
id: plan-review
|
|
2
|
+
goal: Prove plan-review HITL through artifact-backed accept/reject then follow-up
|
|
3
|
+
context: |
|
|
4
|
+
Operator-console proving task for the plan-review pipeline. The first stage
|
|
5
|
+
must write a plan artifact, gate on ask_operator kind artifact_backed, and
|
|
6
|
+
emit only after accept. The follow-up stage only acknowledges acceptance.
|
|
7
|
+
constraints: |
|
|
8
|
+
Do not skip ask_operator. Do not emit_stage_envelope before plan accept.
|
|
9
|
+
Follow-up must not call ask_operator.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
id: plan-review
|
|
2
|
+
gate_kinds:
|
|
3
|
+
- artifact_backed
|
|
4
|
+
system_prompt: |
|
|
5
|
+
Your job is to produce a concise feature plan for the task and get operator
|
|
6
|
+
acceptance before completing this stage.
|
|
7
|
+
|
|
8
|
+
1. Write a concise feature plan via write_stage_artifact to a stage artifact
|
|
9
|
+
path (for example plan.md under stages/plan-review/attempts/1/artifacts/).
|
|
10
|
+
2. Call ask_operator with kind artifact_backed referencing that artifact path
|
|
11
|
+
so the operator can review the plan.
|
|
12
|
+
3. On reject or change text: revise the plan artifact and call ask_operator
|
|
13
|
+
again with artifact_backed in this same stage. Do not complete yet.
|
|
14
|
+
4. Call emit_stage_envelope with an advancing success status only after the
|
|
15
|
+
operator accepts/confirms the plan. Never emit before plan accept.
|
|
16
|
+
5. Optionally, before the plan gate, you may ask one clarifying free_text or
|
|
17
|
+
multi_question via ask_operator if needed. Never emit before plan accept.
|
|
18
|
+
model: anthropic/claude-sonnet-4-5
|
|
19
|
+
io:
|
|
20
|
+
input:
|
|
21
|
+
schema:
|
|
22
|
+
type: object
|
|
23
|
+
output:
|
|
24
|
+
schema:
|
|
25
|
+
type: object
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# playwright-mcp
|
|
2
|
+
|
|
3
|
+
One-stage walkthrough: **open a page and screenshot it**, using Microsoft Playwright MCP (`npx @playwright/mcp@latest`) from git-root `.mcp.json`.
|
|
4
|
+
|
|
5
|
+
Playwright's `--output-dir` is interpolated to `STAGEFLOW_STAGE_ARTIFACTS_DIR` (this attempt's artifacts folder). Auto-named snapshots use that directory. A named `browser_take_screenshot` `filename` does **not** — Playwright MCP resolves it against the MCP client workspace (the project checkout). The stage prompt therefore passes `${STAGEFLOW_STAGE_ARTIFACTS_DIR}/page.png` (stamped to an absolute artifacts path at attach) so the PNG lands in the run Files pane instead of the git root.
|
|
6
|
+
|
|
7
|
+
| Stage | MCP | What it does |
|
|
8
|
+
|-------|-----|----------------|
|
|
9
|
+
| `screenshot` | `playwright` | `browser_navigate` → `browser_take_screenshot` (`page.png`) |
|
|
10
|
+
|
|
11
|
+
Completion requires `page.png` on disk. Settings Check (no stage) falls back to `examples/playwright-mcp/.playwright-mcp/` (gitignored).
|
|
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
|
+
- First run may download Chromium via Playwright (needs network)
|
|
18
|
+
|
|
19
|
+
Git-root `.mcp.json` already names `playwright`. The stage still passes `mcp: [playwright]` — listing it in the catalog is not attach.
|
|
20
|
+
|
|
21
|
+
Optional: Settings → **Project MCP servers** → Check `playwright` before the run.
|
|
22
|
+
|
|
23
|
+
## Run (repo root)
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm run build
|
|
27
|
+
node dist/cli.js validate --pipeline examples/playwright-mcp/playwright-mcp.pipeline.yaml --strict
|
|
28
|
+
node dist/cli.js run \
|
|
29
|
+
--pipeline examples/playwright-mcp/playwright-mcp.pipeline.yaml \
|
|
30
|
+
--task examples/playwright-mcp/playwright-mcp.task.yaml
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Inspect:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
node dist/cli.js envelope get --run <runId> --stage screenshot --json
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
The Files row is `page.png`.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
id: playwright-mcp
|
|
2
|
+
goal: Open https://google.com and take a screenshot of that page as a PNG artifact.
|
|
3
|
+
context: One-stage Playwright MCP walkthrough. Playwright must save page.png under this attempt's artifacts directory (absolute path in the stage prompt), not the repo root.
|
|
4
|
+
constraints: Use only the playwright server named on the stage. Do not call ask_operator. The screenshot must be page.png in artifacts, not markdown and not the git root.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
id: screenshot
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Open the URL from the task in Playwright MCP, then take a screenshot.
|
|
4
|
+
Call browser_navigate, then browser_take_screenshot with type png and
|
|
5
|
+
filename exactly ${STAGEFLOW_STAGE_ARTIFACTS_DIR}/page.png — copy that
|
|
6
|
+
path verbatim. Playwright resolves a bare filename like page.png against
|
|
7
|
+
the project checkout (repo root), not --output-dir. Do not pass filename
|
|
8
|
+
page.png without the artifacts-directory prefix. Do not write screenshot.md.
|
|
9
|
+
Do not call write_stage_artifact for the image. Do not call ask_operator.
|
|
10
|
+
|
|
11
|
+
When finished, call emit_stage_envelope exactly once with status success,
|
|
12
|
+
a short summary, payload { "url": "<final page URL>", "screenshot": "page.png" },
|
|
13
|
+
and artifacts listing the run-relative PNG path this session already names
|
|
14
|
+
(stages/screenshot/attempts/<n>/artifacts/page.png). summary and payload are
|
|
15
|
+
handed downstream verbatim. State outcomes and artifact pointers only.
|
|
16
|
+
|
|
17
|
+
Your last tool call in this attempt must be emit_stage_envelope.
|
|
18
|
+
model: cursor/auto
|
|
19
|
+
io:
|
|
20
|
+
input:
|
|
21
|
+
schema:
|
|
22
|
+
type: object
|
|
23
|
+
output:
|
|
24
|
+
schema:
|
|
25
|
+
type: object
|
|
26
|
+
required:
|
|
27
|
+
- url
|
|
28
|
+
- screenshot
|
|
29
|
+
properties:
|
|
30
|
+
url:
|
|
31
|
+
type: string
|
|
32
|
+
screenshot:
|
|
33
|
+
type: string
|
|
34
|
+
verify:
|
|
35
|
+
- id: png
|
|
36
|
+
type: artifact
|
|
37
|
+
path: page.png
|
|
38
|
+
nonempty: true
|
|
39
|
+
when:
|
|
40
|
+
- after
|