stageflow 0.23.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 +24 -5
- package/dist/a2a/configDiscovery.d.ts +9 -0
- package/dist/a2a/configDiscovery.js +18 -0
- package/dist/a2a/contracts.d.ts +94 -0
- package/dist/a2a/contracts.js +164 -0
- package/dist/a2a/limits.d.ts +14 -0
- package/dist/a2a/limits.js +29 -0
- package/dist/a2a/registry.d.ts +46 -0
- package/dist/a2a/registry.js +178 -0
- package/dist/a2a/server.d.ts +36 -0
- package/dist/a2a/server.js +344 -0
- package/dist/a2a/service.d.ts +97 -0
- package/dist/a2a/service.js +545 -0
- package/dist/a2a/store.d.ts +109 -0
- package/dist/a2a/store.js +202 -0
- 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/a2aCommand.d.ts +8 -0
- package/dist/cli/a2aCommand.js +131 -0
- 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 +34 -0
- package/dist/cli/runStageCommand.js +426 -0
- package/dist/cli/runsCommand.d.ts +1 -1
- package/dist/cli/runsCommand.js +162 -8
- package/dist/cli.js +190 -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 +591 -76
- 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 +27 -0
- package/dist/runstore/createStore.js +75 -7
- 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 +119 -8
- 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 +37 -3
- package/dist/runstore/sqlite/SqliteRunStore.js +401 -227
- 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 +283 -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/submission.d.ts +11 -0
- package/dist/runstore/submission.js +7 -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 +38 -1
- package/dist/runtime/pipelineRunner.js +179 -15
- package/dist/runtime/pipelineScheduler.d.ts +15 -0
- package/dist/runtime/pipelineScheduler.js +167 -42
- package/dist/runtime/reloadRunCatalog.js +12 -1
- package/dist/runtime/repositoryMaterialize.d.ts +47 -0
- package/dist/runtime/repositoryMaterialize.js +235 -0
- package/dist/runtime/resolveEnvelopeRef.d.ts +30 -0
- package/dist/runtime/resolveEnvelopeRef.js +79 -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 +179 -4
- package/dist/runtime/runManager.js +1644 -83
- 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 +38 -2
- package/dist/server/bootstrap.js +219 -4
- 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 +109 -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 +6 -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,31 @@
|
|
|
1
|
+
id: gather
|
|
2
|
+
system_prompt: |
|
|
3
|
+
You are the Clone Chain join. Summarize each clone instance's angle.md into
|
|
4
|
+
one note. Do not invent angles that were not cloned.
|
|
5
|
+
|
|
6
|
+
1. Call write_stage_artifact with path angles-brief.md.
|
|
7
|
+
2. Emit success with artifacts [angles-brief.md] and payload
|
|
8
|
+
{ "kind": "angles" }.
|
|
9
|
+
io:
|
|
10
|
+
input:
|
|
11
|
+
schema:
|
|
12
|
+
type: object
|
|
13
|
+
output:
|
|
14
|
+
schema:
|
|
15
|
+
type: object
|
|
16
|
+
required: [kind]
|
|
17
|
+
properties:
|
|
18
|
+
kind:
|
|
19
|
+
type: string
|
|
20
|
+
verify:
|
|
21
|
+
- id: angles-brief-declared
|
|
22
|
+
type: artifact
|
|
23
|
+
basename: angles-brief.md
|
|
24
|
+
when:
|
|
25
|
+
- emit
|
|
26
|
+
- id: angles-brief-on-disk
|
|
27
|
+
type: artifact
|
|
28
|
+
path: angles-brief.md
|
|
29
|
+
nonempty: true
|
|
30
|
+
when:
|
|
31
|
+
- after
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
id: intake
|
|
2
|
+
gate_kinds:
|
|
3
|
+
- free_text
|
|
4
|
+
system_prompt: |
|
|
5
|
+
You are the HITL intake for an MCP operator-host walkthrough.
|
|
6
|
+
|
|
7
|
+
The topic arrives as task input (io.input.topic). Do not invent a different topic.
|
|
8
|
+
|
|
9
|
+
Follow these steps exactly:
|
|
10
|
+
|
|
11
|
+
1. Call ask_operator with kind free_text. Ask which audience the brief is
|
|
12
|
+
for. Tell the operator to reply with exactly one of: operators or
|
|
13
|
+
executives.
|
|
14
|
+
- operators: concrete, how-it-works language
|
|
15
|
+
- executives: short, stakes-and-tradeoffs language
|
|
16
|
+
2. Wait for the operator answer. Do not call emit_stage_envelope before you
|
|
17
|
+
have that answer.
|
|
18
|
+
3. Call write_stage_artifact with path intake.md. Write the topic, the chosen
|
|
19
|
+
audience, and one sentence that both a clone-chain draft and a short
|
|
20
|
+
draft will run, then join at polish.
|
|
21
|
+
4. Call emit_stage_envelope exactly once with:
|
|
22
|
+
- status: success
|
|
23
|
+
- a non-empty summary
|
|
24
|
+
- artifacts: [intake.md]
|
|
25
|
+
- payload: { "topic": "<task topic>", "audience": "operators" } or
|
|
26
|
+
{ "topic": "<task topic>", "audience": "executives" }, matching the
|
|
27
|
+
operator reply exactly
|
|
28
|
+
|
|
29
|
+
Rules:
|
|
30
|
+
- Never emit before the operator answers.
|
|
31
|
+
- Never invent other audience values.
|
|
32
|
+
- Do not emit fork_choice. Both successor stages always run.
|
|
33
|
+
io:
|
|
34
|
+
input:
|
|
35
|
+
schema:
|
|
36
|
+
type: object
|
|
37
|
+
required:
|
|
38
|
+
- topic
|
|
39
|
+
properties:
|
|
40
|
+
topic:
|
|
41
|
+
type: string
|
|
42
|
+
output:
|
|
43
|
+
schema:
|
|
44
|
+
type: object
|
|
45
|
+
required: [topic, audience]
|
|
46
|
+
properties:
|
|
47
|
+
topic:
|
|
48
|
+
type: string
|
|
49
|
+
audience:
|
|
50
|
+
type: string
|
|
51
|
+
verify:
|
|
52
|
+
- id: intake-declared
|
|
53
|
+
type: artifact
|
|
54
|
+
basename: intake.md
|
|
55
|
+
when:
|
|
56
|
+
- emit
|
|
57
|
+
- id: intake-on-disk
|
|
58
|
+
type: artifact
|
|
59
|
+
path: intake.md
|
|
60
|
+
nonempty: true
|
|
61
|
+
when:
|
|
62
|
+
- after
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
id: mcp-hitl-tour-exhaust
|
|
2
|
+
goal: |
|
|
3
|
+
Same walkthrough as mcp-hitl-tour: send the brief back until the loop parks
|
|
4
|
+
for a human decision after intake HITL.
|
|
5
|
+
context: |
|
|
6
|
+
Pair with mcp-hitl-tour.pipeline.yaml. Answer intake with exactly operators
|
|
7
|
+
or executives. Every review success MUST emit send_back target polish —
|
|
8
|
+
never continue — until waiting_kind is feedback_loop_decision.
|
|
9
|
+
constraints: |
|
|
10
|
+
Docs only. First review: send_back polish. After the polish replay, second
|
|
11
|
+
review: send_back polish again so MCP can call decide_feedback_loop.
|
|
12
|
+
input:
|
|
13
|
+
topic: Local-first notes apps for small teams
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
id: mcp-hitl-tour
|
|
2
|
+
model: cursor/auto
|
|
3
|
+
schemas:
|
|
4
|
+
Angle:
|
|
5
|
+
type: object
|
|
6
|
+
required: [id, title, topic]
|
|
7
|
+
properties:
|
|
8
|
+
id:
|
|
9
|
+
type: string
|
|
10
|
+
title:
|
|
11
|
+
type: string
|
|
12
|
+
topic:
|
|
13
|
+
type: string
|
|
14
|
+
stages:
|
|
15
|
+
- id: intake
|
|
16
|
+
uses: ./intake.yaml
|
|
17
|
+
entry: true
|
|
18
|
+
route:
|
|
19
|
+
- to: emit-angles
|
|
20
|
+
- to: draft-short
|
|
21
|
+
- id: emit-angles
|
|
22
|
+
uses: ./emit-angles.yaml
|
|
23
|
+
clone_cap: 2
|
|
24
|
+
clone_mode: sequential
|
|
25
|
+
route:
|
|
26
|
+
- to: draft-angle
|
|
27
|
+
- id: draft-angle
|
|
28
|
+
uses: ./draft-angle.yaml
|
|
29
|
+
route:
|
|
30
|
+
- to: gather
|
|
31
|
+
- id: gather
|
|
32
|
+
uses: ./gather.yaml
|
|
33
|
+
route:
|
|
34
|
+
- to: polish
|
|
35
|
+
- id: draft-short
|
|
36
|
+
uses: ./draft-short.yaml
|
|
37
|
+
route:
|
|
38
|
+
- to: polish
|
|
39
|
+
- id: polish
|
|
40
|
+
uses: ./polish.yaml
|
|
41
|
+
route:
|
|
42
|
+
- to: review
|
|
43
|
+
- id: review
|
|
44
|
+
uses: ./review.yaml
|
|
45
|
+
route:
|
|
46
|
+
- to: ship
|
|
47
|
+
- type: loop
|
|
48
|
+
to: polish
|
|
49
|
+
max_replays: 1
|
|
50
|
+
on_max_replays: wait_for_human
|
|
51
|
+
replay_session: resume
|
|
52
|
+
- id: ship
|
|
53
|
+
uses: ./ship.yaml
|
|
54
|
+
replay_safe: false
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
id: mcp-hitl-tour
|
|
2
|
+
goal: |
|
|
3
|
+
Produce a short operator-readable brief on the given topic. At intake, the
|
|
4
|
+
operator chooses audience (operators or executives). Both a Clone Chain
|
|
5
|
+
draft and a short draft always run, then join at polish. Review always
|
|
6
|
+
sends the brief back once so the operator decides the loop.
|
|
7
|
+
context: |
|
|
8
|
+
MCP operator-host walkthrough. Answer the intake free_text gate with exactly
|
|
9
|
+
operators or executives. Every review success MUST emit send_back target
|
|
10
|
+
polish — never continue — until waiting_kind is feedback_loop_decision.
|
|
11
|
+
constraints: |
|
|
12
|
+
Docs only; no implementation code; no git push. First review: send_back
|
|
13
|
+
polish. After the polish replay, second review: send_back polish again so
|
|
14
|
+
the operator can call decide_feedback_loop.
|
|
15
|
+
input:
|
|
16
|
+
topic: Local-first notes apps for small teams
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
id: polish
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Produce the canonical brief.md the reviewer will read.
|
|
4
|
+
|
|
5
|
+
Both parents always ran: start from short.md and from angles-brief.md plus
|
|
6
|
+
the clone angle.md files. Match the intake audience. On a feedback replay,
|
|
7
|
+
read Feedback Loop Context and revise brief.md to address the send-back.
|
|
8
|
+
|
|
9
|
+
1. Call write_stage_artifact with path brief.md.
|
|
10
|
+
2. Emit success with artifacts [brief.md] and payload { "polished": true }.
|
|
11
|
+
io:
|
|
12
|
+
input:
|
|
13
|
+
schema:
|
|
14
|
+
type: object
|
|
15
|
+
output:
|
|
16
|
+
schema:
|
|
17
|
+
type: object
|
|
18
|
+
required: [polished]
|
|
19
|
+
properties:
|
|
20
|
+
polished:
|
|
21
|
+
type: boolean
|
|
22
|
+
verify:
|
|
23
|
+
- id: brief-declared
|
|
24
|
+
type: artifact
|
|
25
|
+
basename: brief.md
|
|
26
|
+
when:
|
|
27
|
+
- emit
|
|
28
|
+
- id: brief-on-disk
|
|
29
|
+
type: artifact
|
|
30
|
+
path: brief.md
|
|
31
|
+
nonempty: true
|
|
32
|
+
when:
|
|
33
|
+
- after
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
id: review
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Review brief.md against the task goal.
|
|
4
|
+
On every success you MUST emit feedback_loop send_back — never continue:
|
|
5
|
+
|
|
6
|
+
{"action":"send_back","target":"polish"}
|
|
7
|
+
|
|
8
|
+
This walkthrough always takes one polish replay, then parks for a human
|
|
9
|
+
feedback decision (MCP decide_feedback_loop). Do not continue to ship from
|
|
10
|
+
this stage.
|
|
11
|
+
io:
|
|
12
|
+
input:
|
|
13
|
+
schema:
|
|
14
|
+
type: object
|
|
15
|
+
output:
|
|
16
|
+
schema:
|
|
17
|
+
type: object
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
id: ship
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Ship the approved brief. Call write_stage_artifact with path ship.md
|
|
4
|
+
summarizing the final brief in a few sentences. Emit success with
|
|
5
|
+
artifacts [ship.md]. This stage is replay_safe: false — it runs only after
|
|
6
|
+
review continues.
|
|
7
|
+
io:
|
|
8
|
+
input:
|
|
9
|
+
schema:
|
|
10
|
+
type: object
|
|
11
|
+
output:
|
|
12
|
+
schema:
|
|
13
|
+
type: object
|
|
14
|
+
verify:
|
|
15
|
+
- id: ship-declared
|
|
16
|
+
type: artifact
|
|
17
|
+
basename: ship.md
|
|
18
|
+
when:
|
|
19
|
+
- emit
|
|
20
|
+
- id: ship-on-disk
|
|
21
|
+
type: artifact
|
|
22
|
+
path: ship.md
|
|
23
|
+
nonempty: true
|
|
24
|
+
when:
|
|
25
|
+
- after
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
# OSS issue contribution pipeline
|
|
2
|
+
|
|
3
|
+
Use a real upstream issue to demonstrate Stageflow's strongest runtime features:
|
|
4
|
+
evidence-preserving stages, parallel investigation, explicit handoffs, human
|
|
5
|
+
approval, one controlled writer, independent verification, parallel review, and
|
|
6
|
+
a final publication gate.
|
|
7
|
+
|
|
8
|
+
The pipeline is repository-neutral. Point the task's `checkout` at a dedicated,
|
|
9
|
+
clean branch in Mastra, Pydantic AI, or another project. It reads that project's
|
|
10
|
+
own contribution instructions before acting.
|
|
11
|
+
|
|
12
|
+
This catalog is **route-wired** (`entry` / `route` / multiple `to:`). Investigation
|
|
13
|
+
and review are parallel DAG fan-out, not a sealed
|
|
14
|
+
[Clone Chain](../../docs/yaml-catalog.md#clone-chain) (emitter → clone child → Join).
|
|
15
|
+
One Clone Instance per investigation or review item remains intended future
|
|
16
|
+
wiring; author that shape from
|
|
17
|
+
[`tests/fixtures/pipelines/clone-chain-*.pipeline.yaml`](../../tests/fixtures/pipelines/).
|
|
18
|
+
|
|
19
|
+
## Flow
|
|
20
|
+
|
|
21
|
+
1. Capture the issue, repository baseline, and contribution rules.
|
|
22
|
+
2. In parallel with reproduction, write a ce-explain HTML teaching artifact for the issue (no HITL).
|
|
23
|
+
3. Reproduce the failure without editing tracked files.
|
|
24
|
+
4. Intended Clone Chain: one Clone Instance per investigation item (parallel).
|
|
25
|
+
5. Join the evidence into an implementation plan and ask for approval.
|
|
26
|
+
6. Write the regression test in its own short stage, then implement the fix
|
|
27
|
+
and drive the plan's full validation command list to green in one
|
|
28
|
+
session — the only stage that can edit the checkout owns the whole
|
|
29
|
+
fix-and-validate loop, rather than handing an unfinished fix to a
|
|
30
|
+
read-only stage that could only report the gap.
|
|
31
|
+
7. Independently verify the diff and relevant tests.
|
|
32
|
+
8. In parallel with review planning, write a ce-explain HTML teaching artifact for the verified fix (no HITL).
|
|
33
|
+
9. Intended Clone Chain: one Clone Instance per focused review (parallel).
|
|
34
|
+
10. Address every blocking review finding in one fixup stage — sweeping for
|
|
35
|
+
every instance of the same category of problem, not only the ones
|
|
36
|
+
reviewers happened to cite. This catalog stays a DAG (parallel fan-out
|
|
37
|
+
via multiple `to:`); it does not declare `{ type: loop }` back to
|
|
38
|
+
oss-implement-source-fix or a second review pass.
|
|
39
|
+
11. Join into a PR-ready package, ask for final approval, and — once the
|
|
40
|
+
operator accepts — push the branch and open the pull request against the
|
|
41
|
+
fork in that same stage.
|
|
42
|
+
|
|
43
|
+
No stage ever targets the upstream repo, and no stage before the final one
|
|
44
|
+
commits, pushes, or opens a pull request. `oss-approve-contribution` writes
|
|
45
|
+
`contribution-package.md`, calls `ask_operator`, and only runs `git`/`gh`
|
|
46
|
+
against the fork after an explicit accept through its `artifact_backed` gate.
|
|
47
|
+
There is no separate publish flag or dry-run mode: the operator's accept is
|
|
48
|
+
the only gate between "package written" and "PR opened."
|
|
49
|
+
|
|
50
|
+
## Runtime contracts
|
|
51
|
+
|
|
52
|
+
Several stages opt into Stageflow runtime contracts that make the pipeline fail
|
|
53
|
+
closed when a stage skips its deliverable.
|
|
54
|
+
|
|
55
|
+
Every stage except the two approval stages declares `gate_kinds: []`, which
|
|
56
|
+
unregisters the `ask_operator` tool entirely. Those stages cannot pause for
|
|
57
|
+
operator input or offer to substitute a report for real work. Only
|
|
58
|
+
`oss-approve-plan` and `oss-approve-contribution` keep
|
|
59
|
+
`gate_kinds: [artifact_backed]`.
|
|
60
|
+
|
|
61
|
+
### Review feedback has no loop in this catalog
|
|
62
|
+
|
|
63
|
+
Loops exist via `{ type: loop }` on `route` (see
|
|
64
|
+
[`examples/feedback-loop/`](../feedback-loop/)). This pipeline does not use
|
|
65
|
+
one: it stays a DAG with parallel fan-out via multiple `to:`. If
|
|
66
|
+
`oss-review-change` finds a blocking problem, the run does not resume
|
|
67
|
+
`oss-implement-source-fix` or `oss-verify-fix`. `oss-address-review-feedback`
|
|
68
|
+
is the accommodation: a single fixup stage after review and before approval
|
|
69
|
+
that addresses every blocking finding — sweeping for other instances of the
|
|
70
|
+
same category of problem, not only the ones a reviewer happened to cite — then
|
|
71
|
+
hands off to `oss-approve-contribution`, which independently re-checks the
|
|
72
|
+
fix before accepting it. It cannot get a fresh review of its own fix,
|
|
73
|
+
though: if its patch introduces something new, `oss-approve-contribution`'s
|
|
74
|
+
fail-closed check is the backstop, and the operator has to intervene by hand —
|
|
75
|
+
see [docs/cli-reference.md](../../docs/cli-reference.md) for `sf runs retry`,
|
|
76
|
+
which can retry a succeeded stage in place and reset everything downstream.
|
|
77
|
+
|
|
78
|
+
Every stage declares `verify` with at least one `type: artifact` check, so a
|
|
79
|
+
success emit is rejected unless the named file appears in the envelope's
|
|
80
|
+
artifact list. Writer stages add `type: checkout_changes` with `path_fields`;
|
|
81
|
+
approval stages also declare a `type: gate` check (`kind: artifact_backed`).
|
|
82
|
+
Pipeline entries wire `on_verify_fail` (repair for most stages; `manual` on
|
|
83
|
+
`oss-approve-contribution`) so after-phase failures retry or wait for an
|
|
84
|
+
operator instead of silently advancing.
|
|
85
|
+
|
|
86
|
+
| Stage | Gate | Required artifacts | Other checks |
|
|
87
|
+
|-------|------|--------------------|--------------|
|
|
88
|
+
| `oss-issue-intake` | `[]` | `issue-intake.md` | — |
|
|
89
|
+
| `oss-explain-issue` | `[]` | `issue-explainer.html` | — |
|
|
90
|
+
| `oss-reproduce-issue` | `[]` | `reproduction.md` | — |
|
|
91
|
+
| `oss-plan-investigation` | `[]` | `investigation-map.md` | intended Clone Chain emitter |
|
|
92
|
+
| `oss-investigate-area` | `[]` | `investigation.md` | intended clone child |
|
|
93
|
+
| `oss-approve-plan` | `[artifact_backed]` | `implementation-plan.md` | — |
|
|
94
|
+
| `oss-write-regression-test` | `[]` | `regression-test-report.md` | `[test_files]` |
|
|
95
|
+
| `oss-implement-source-fix` | `[]` | `implementation-report.md` | `[changed_files]` |
|
|
96
|
+
| `oss-verify-fix` | `[]` | `verification.md` | — |
|
|
97
|
+
| `oss-explain-fix` | `[]` | `fix-explainer.html` | — |
|
|
98
|
+
| `oss-plan-review` | `[]` | `review-plan.md` | intended Clone Chain emitter |
|
|
99
|
+
| `oss-review-change` | `[]` | `review.md` | intended clone child |
|
|
100
|
+
| `oss-address-review-feedback` | `[]` | `review-feedback-report.md` | — |
|
|
101
|
+
| `oss-approve-contribution` | `[artifact_backed]` | `contribution-package.md`, `pull-request.md` | — |
|
|
102
|
+
|
|
103
|
+
Intended Clone Chains: `oss-plan-investigation` → `oss-investigate-area` → `oss-approve-plan`, and `oss-plan-review` → `oss-review-change` → join at address/approve. This directory's YAML is not yet that shape. See [YAML catalog — Clone Chain](../../docs/yaml-catalog.md#clone-chain).
|
|
104
|
+
|
|
105
|
+
`oss-investigate-area` and `oss-review-change` use empty `io.input` (a subset of each parent's `io.output`). Assignment fields (`area_id`/`objective`/`paths`/`questions`/`constraints` or the review equivalent) belong on intended Clone Chain payloads, not this DAG.
|
|
106
|
+
|
|
107
|
+
Plan approval (`oss-approve-plan`) and contribution approval
|
|
108
|
+
(`oss-approve-contribution`) use `artifact_backed` HITL and cannot self-approve;
|
|
109
|
+
the runtime checks the QA trail before accepting a success emit.
|
|
110
|
+
|
|
111
|
+
`oss-write-regression-test` and `oss-implement-source-fix` require an array
|
|
112
|
+
field (`test_files` or `changed_files`) with `minItems: 1` on `io.output.schema`.
|
|
113
|
+
That constraint only checks the array is non-empty — it does not verify the
|
|
114
|
+
entries are real edits in the checkout, and a Stageflow artifact path satisfies
|
|
115
|
+
it. A run that never touched the checkout has passed this way before.
|
|
116
|
+
|
|
117
|
+
Both writer stages therefore also declare a `verify` check of
|
|
118
|
+
`type: checkout_changes` with `path_fields` naming that array field, so the
|
|
119
|
+
runtime enforces after the stage what the prompts alone could not:
|
|
120
|
+
|
|
121
|
+
- `type: checkout_changes` rejects a success outcome when
|
|
122
|
+
`git status --porcelain` in the bound task checkout is empty.
|
|
123
|
+
- `path_fields: [changed_files]` (or `[test_files]`) rejects a success outcome
|
|
124
|
+
when any listed entry is not a path inside the checkout — including the
|
|
125
|
+
`stages/<id>/attempts/<n>/artifacts/...` paths returned by
|
|
126
|
+
`write_stage_artifact`.
|
|
127
|
+
|
|
128
|
+
Stageflow is a configurable-stage runtime. These contracts are opt-in per
|
|
129
|
+
catalog; this example is one consumer that uses them to enforce a strict
|
|
130
|
+
contribution workflow.
|
|
131
|
+
|
|
132
|
+
## Explainers
|
|
133
|
+
|
|
134
|
+
The two explainer stages are dead-end siblings: they do not pause investigation,
|
|
135
|
+
implementation, or review, and they do not call `ask_operator`. Each composes a
|
|
136
|
+
ce-explain HTML teaching artifact — concept for the issue, diff for the verified
|
|
137
|
+
fix — grounded in quoted checkout source and an inline SVG, written with
|
|
138
|
+
`write_stage_artifact`. Open `issue-explainer.html` and `fix-explainer.html`
|
|
139
|
+
from the run artifacts when you want them. They require the `ce-explain` skill
|
|
140
|
+
at `.pi/skills/ce-explain/` (copy the skill tree from Compound Engineering;
|
|
141
|
+
`sf skills install` expects a doctor binary this skill does not ship).
|
|
142
|
+
|
|
143
|
+
## Prepare the target repository
|
|
144
|
+
|
|
145
|
+
Use a dedicated branch and begin with a clean tracked worktree:
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
git clone https://github.com/mastra-ai/mastra.git
|
|
149
|
+
cd mastra
|
|
150
|
+
git switch -c investigate-22863
|
|
151
|
+
git status --short
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
## Create a task outside the target checkout
|
|
155
|
+
|
|
156
|
+
Task context is the pipeline's portable issue input. Include the issue body or
|
|
157
|
+
acceptance criteria so the run remains useful if GitHub access is unavailable.
|
|
158
|
+
|
|
159
|
+
```yaml
|
|
160
|
+
id: mastra-22863
|
|
161
|
+
goal: >
|
|
162
|
+
Deliver a verified minimal fix for Mastra issue #22863, applied as source and
|
|
163
|
+
test edits in the checkout working tree.
|
|
164
|
+
context: |
|
|
165
|
+
Issue: https://github.com/mastra-ai/mastra/issues/22863
|
|
166
|
+
Title: <copy the current issue title>
|
|
167
|
+
Reported behavior: <copy or summarize the concrete failure>
|
|
168
|
+
Expected behavior: <copy or summarize the acceptance criterion>
|
|
169
|
+
Current triage/maintainer status: <record what you verified today>
|
|
170
|
+
constraints: |
|
|
171
|
+
Respect all repository contribution and agent instructions.
|
|
172
|
+
Do not publish while the issue is awaiting maintainer direction.
|
|
173
|
+
Do not commit, push, or open a pull request.
|
|
174
|
+
Keep the change limited to the reproduced issue and its regression test.
|
|
175
|
+
checkout: /absolute/path/to/mastra
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
For Pydantic AI, use the same shape with a Pydantic issue and set `checkout` to
|
|
179
|
+
the absolute path of that clone. A ready task for issue #7971 is
|
|
180
|
+
`pydantic-ai-7971.task.yaml`. The stage definitions do not need to change.
|
|
181
|
+
|
|
182
|
+
## Run
|
|
183
|
+
|
|
184
|
+
From any directory with Stageflow installed:
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
sf validate \
|
|
188
|
+
--pipeline /path/to/stageflow/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml \
|
|
189
|
+
--strict
|
|
190
|
+
|
|
191
|
+
sf run \
|
|
192
|
+
--pipeline /path/to/stageflow/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml \
|
|
193
|
+
--task /path/to/mastra-22863.task.yaml
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
`oss-approve-contribution` pushes and opens the pull request against the fork
|
|
197
|
+
as soon as the operator accepts its `artifact_backed` gate — there is no
|
|
198
|
+
dry-run mode and no extra flag. `gh` must be on `PATH` and authenticated
|
|
199
|
+
(`GH_TOKEN` or `GITHUB_TOKEN`) before you accept, or the publish step will
|
|
200
|
+
fail after approval.
|
|
201
|
+
|
|
202
|
+
Run `sf ui` in another terminal to inspect envelopes, artifacts, Clone Instances,
|
|
203
|
+
and answer the two artifact-backed gates. The explainer HTML files are ordinary
|
|
204
|
+
stage artifacts; they do not appear as gates.
|
|
205
|
+
|
|
206
|
+
## Safety and interpretation
|
|
207
|
+
|
|
208
|
+
- Plan approval authorizes only local edits in the task checkout.
|
|
209
|
+
- Review Clone Instances always complete successfully and carry `pass` or
|
|
210
|
+
`changes_required` in their payload, allowing the Join to see every review.
|
|
211
|
+
- Any blocking review fails the final stage closed.
|
|
212
|
+
- The operator's accept through `oss-approve-contribution`'s `artifact_backed`
|
|
213
|
+
gate is the only authorization to publish, and it happens moments before the
|
|
214
|
+
stage runs `git push` / `gh pr create` in the same session — there is no
|
|
215
|
+
separate flag and no second chance to reconsider after accepting. It never
|
|
216
|
+
authorizes targeting upstream.
|
|
217
|
+
- Issue labels, assignments, and maintainer guidance can change. Re-verify them
|
|
218
|
+
before accepting the gate on a run that will open a pull request.
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
id: oss-address-review-feedback
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Address every blocking finding from oss-review-change before the
|
|
4
|
+
contribution package is assembled. There is no automatic path back to
|
|
5
|
+
oss-implement-source-fix or oss-verify-fix in this pipeline, and this is the
|
|
6
|
+
only stage positioned to edit the checkout after review — treat that as the
|
|
7
|
+
reason this stage exists, not as license to rewrite the fix. This stage is
|
|
8
|
+
the last-mile fixup for what reviewers found, not a second implementation
|
|
9
|
+
pass.
|
|
10
|
+
|
|
11
|
+
Reading upstream evidence. The user prompt contains a line
|
|
12
|
+
"Factory run workspace: <absolute path>". Prior artifacts arrive in the
|
|
13
|
+
prior envelope's artifacts[] as run-relative paths; read each one at
|
|
14
|
+
<Factory run workspace>/<artifact path>. Every oss-review-change
|
|
15
|
+
envelope's payload (review_id, verdict, blocking_findings) and its review.md
|
|
16
|
+
are authoritative; implementation-report.md and verification.md give the
|
|
17
|
+
context needed to make a correct, narrow fix. Prose summaries are secondary.
|
|
18
|
+
|
|
19
|
+
Definition of done — every line must hold before you emit success:
|
|
20
|
+
- Every oss-review-change envelope and its review.md have been read.
|
|
21
|
+
- If every verdict is pass: the checkout is untouched, fixed_files is empty,
|
|
22
|
+
and addressed_all_blocking is true.
|
|
23
|
+
- If any verdict is changes_required: every entry in every review's
|
|
24
|
+
blocking_findings has been addressed, not only the specific file/line
|
|
25
|
+
reviewers happened to cite — search for every other instance of the same
|
|
26
|
+
category of problem (for example, every other test still asserting
|
|
27
|
+
semantics the fix already inverted elsewhere, or every other call site
|
|
28
|
+
with the same missing type widening) and fix those too. A reviewer's
|
|
29
|
+
citation is a sample of the problem, not its full extent.
|
|
30
|
+
- git diff in the checkout is non-empty whenever any verdict was
|
|
31
|
+
changes_required; the emit is rejected if you claim to have addressed a
|
|
32
|
+
blocking finding while the working tree is clean.
|
|
33
|
+
- Every fixed_files entry is a repo-relative path inside the checkout that
|
|
34
|
+
also appears in git diff --name-only; the emit is rejected for any entry
|
|
35
|
+
pointing into the factory run workspace.
|
|
36
|
+
- Every check a blocking finding cited as failing has been re-run here and
|
|
37
|
+
now passes; verification_commands records each with its result.
|
|
38
|
+
- review-feedback-report.md is written and listed in the emitted artifacts;
|
|
39
|
+
the emit is rejected without it.
|
|
40
|
+
|
|
41
|
+
1. Read every oss-review-change envelope and review.md via the recipe
|
|
42
|
+
above. If every verdict is pass, skip to step 5 with nothing to fix.
|
|
43
|
+
2. For each changes_required review, read every blocking_findings entry and
|
|
44
|
+
its remediation guidance. Do not re-litigate a pass verdict or reopen
|
|
45
|
+
non-blocking findings or suggestions — those are out of scope here.
|
|
46
|
+
3. Fix each blocking finding at its cited location, then search the rest of
|
|
47
|
+
the checkout for other instances of the same category of problem and fix
|
|
48
|
+
those too (see Definition of done). Do not perform unrelated formatting,
|
|
49
|
+
refactors, or scope expansion beyond what the findings require. Do not
|
|
50
|
+
weaken, delete, or skip a test to make it pass.
|
|
51
|
+
4. Re-run every command a blocking finding cited as failing, plus the
|
|
52
|
+
specific test(s) it named, and confirm each now passes. If a fix cannot
|
|
53
|
+
be completed or a re-run still fails, emit failure and record exactly
|
|
54
|
+
what remains broken and why — do not present partial remediation as
|
|
55
|
+
success.
|
|
56
|
+
5. Write review-feedback-report.md listing every blocking finding, whether
|
|
57
|
+
it was addressed (with the fix location and the passing re-run), or
|
|
58
|
+
that there was nothing to address because every verdict was pass.
|
|
59
|
+
6. Emit exactly once, including review-feedback-report.md and all inherited
|
|
60
|
+
evidence artifacts, with a payload matching the schema.
|
|
61
|
+
|
|
62
|
+
Contract violations — emit failure rather than presenting these as success:
|
|
63
|
+
- addressed_all_blocking: true while any blocking_findings entry remains
|
|
64
|
+
unaddressed or unverified.
|
|
65
|
+
- Fixing only the literal file/line a reviewer cited when the same category
|
|
66
|
+
of problem exists elsewhere in the diff.
|
|
67
|
+
- Emitting success while git diff is empty and any verdict was
|
|
68
|
+
changes_required.
|
|
69
|
+
- A fixed_files entry under stages/.../artifacts/ or anywhere else in the
|
|
70
|
+
factory run workspace.
|
|
71
|
+
- Editing anything outside the scope of a blocking finding.
|
|
72
|
+
- verification_commands listing commands you did not execute.
|
|
73
|
+
|
|
74
|
+
Never commit, push, or open a pull request.
|
|
75
|
+
|
|
76
|
+
Write summary as outcomes and resulting state for oss-approve-contribution:
|
|
77
|
+
which blocking findings existed, what changed to address them, and
|
|
78
|
+
confirmation every cited check now passes (or, on failure, what remains
|
|
79
|
+
open). Downstream stages receive this summary verbatim and can mistake it
|
|
80
|
+
for their own instructions, so never restate this stage's prohibitions or
|
|
81
|
+
scope limits in it.
|
|
82
|
+
model: omniroute/auto
|
|
83
|
+
io:
|
|
84
|
+
input:
|
|
85
|
+
schema:
|
|
86
|
+
type: object
|
|
87
|
+
output:
|
|
88
|
+
schema:
|
|
89
|
+
type: object
|
|
90
|
+
required:
|
|
91
|
+
- addressed_all_blocking
|
|
92
|
+
- fixed_files
|
|
93
|
+
- verification_commands
|
|
94
|
+
- remaining_risks
|
|
95
|
+
properties:
|
|
96
|
+
addressed_all_blocking:
|
|
97
|
+
type: boolean
|
|
98
|
+
fixed_files:
|
|
99
|
+
type: array
|
|
100
|
+
items:
|
|
101
|
+
type: string
|
|
102
|
+
verification_commands:
|
|
103
|
+
type: array
|
|
104
|
+
items:
|
|
105
|
+
type: string
|
|
106
|
+
remaining_risks:
|
|
107
|
+
type: array
|
|
108
|
+
items:
|
|
109
|
+
type: string
|
|
110
|
+
verify:
|
|
111
|
+
- id: review-feedback-report
|
|
112
|
+
type: artifact
|
|
113
|
+
path: review-feedback-report.md
|
|
114
|
+
nonempty: true
|
|
115
|
+
when:
|
|
116
|
+
- after
|
|
117
|
+
gate_kinds: []
|