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,104 @@
|
|
|
1
|
+
# feature-loop
|
|
2
|
+
|
|
3
|
+
Epic-to-PR walkthrough: split a requirements document into stories,
|
|
4
|
+
plan them in parallel, align the plans, implement them **sequentially**,
|
|
5
|
+
verify nothing was missed, review the whole diff, fix review blockers
|
|
6
|
+
(with a send-back loop), then open an operator-approved pull request.
|
|
7
|
+
|
|
8
|
+
This is the shape for work that starts as one epic and must not land
|
|
9
|
+
as overlapping parallel edits. It is repository-neutral — point the
|
|
10
|
+
task `checkout` at a feature branch of whatever tree you are shipping.
|
|
11
|
+
Nothing in the stage files names a product, repo, or keyword.
|
|
12
|
+
|
|
13
|
+
The shipped YAML is two sealed [Clone Chains](../../docs/yaml-catalog.md#clone-chain)
|
|
14
|
+
plus a `{ type: loop }` from `address-feedback` back to `review`. Wiring
|
|
15
|
+
is outbound `route` (`entry`, `clone_cap` / `clone_mode` on emitters).
|
|
16
|
+
`sf validate --strict` against this pipeline is expected to pass.
|
|
17
|
+
|
|
18
|
+
## Flow
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
decompose ──Clone Array (parallel)──► plan~N ──Join──► align
|
|
22
|
+
│
|
|
23
|
+
sequential Clone Array │
|
|
24
|
+
▼
|
|
25
|
+
implement~1 → implement~2 → …
|
|
26
|
+
│
|
|
27
|
+
▼
|
|
28
|
+
verify → review ⇄ address-feedback → publish
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
1. **decompose** — Read the epic (task + requirements doc). Cut 1–8
|
|
32
|
+
stories into a Clone Array (`stories` items `$ref` `story-assignment`).
|
|
33
|
+
Writes `epic-split.md`. Emitter: `clone_cap: 8`, `clone_mode: parallel`.
|
|
34
|
+
2. **plan** — One Clone Instance per story (`clone_mode: parallel`). Each
|
|
35
|
+
writes `story-plan.md` (edit sites, validation commands, neighbor
|
|
36
|
+
boundaries). No source edits. Entire `io.input.schema` is
|
|
37
|
+
`{ $ref: "#/schemas/story-assignment" }`.
|
|
38
|
+
3. **align** — Join of every plan Clone Instance. Fix overlapping files and
|
|
39
|
+
contradictions, choose **implementation order**, ask the operator to
|
|
40
|
+
accept. Then this stage is the emitter of the next Clone Chain
|
|
41
|
+
(`clone_mode: sequential`): `stories` items `$ref` `story-work`, with
|
|
42
|
+
`order` / `depends_on` on each item.
|
|
43
|
+
4. **implement** — Sequential Clone Instances in array order; `~N`
|
|
44
|
+
starts only after `~N-1` succeeded, so earlier edits are already in
|
|
45
|
+
the tree. Each instance executes only its story and must change the
|
|
46
|
+
checkout. Entire `io.input.schema` is `{ $ref: "#/schemas/story-work" }`.
|
|
47
|
+
5. **verify** — Join of implement Clone Instances. Fail if any aligned
|
|
48
|
+
`story_id` is missing from the instance set or the union diff. Writes
|
|
49
|
+
`coverage.md`.
|
|
50
|
+
6. **review** — One whole-diff review of every story together
|
|
51
|
+
(ce-code-review style). Report-only. `verdict: pass | changes_required`.
|
|
52
|
+
7. **address-feedback** — Fix blockers. Envelope `feedback_loop`
|
|
53
|
+
`send_back` to `review` when the tree changed so the whole diff is re-read;
|
|
54
|
+
`continue` when review is clean. Catalog loop:
|
|
55
|
+
`{ type: loop, to: review, max_replays: 2, on_max_replays: wait_for_human,
|
|
56
|
+
replay_session: new_session }`. After two send-backs the run waits
|
|
57
|
+
for an operator decision. `publish` is `replay_safe: false`.
|
|
58
|
+
8. **publish** — Operator accepts `ship-package.md`, then this same
|
|
59
|
+
attempt commits, pushes the current branch, and opens the PR.
|
|
60
|
+
|
|
61
|
+
No stage before `publish` commits, pushes, or opens a PR. No stage
|
|
62
|
+
creates or switches branches.
|
|
63
|
+
|
|
64
|
+
## Runtime contracts
|
|
65
|
+
|
|
66
|
+
| Stage | Gate | Required artifacts | Other checks |
|
|
67
|
+
|-------|------|--------------------|--------------|
|
|
68
|
+
| `plan` | — | `story-plan.md` | `io.input` assignment |
|
|
69
|
+
| `implement` | — | `implementation-report.md` | `checkout_changes` |
|
|
70
|
+
| `verify` | — | `coverage.md` | `io.output` |
|
|
71
|
+
| `review` | — | `review-report.md` | whole-diff, report-only |
|
|
72
|
+
| `address-feedback` | — | `review-feedback-report.md` | `{ type: loop }` → `review` |
|
|
73
|
+
| `publish` | `artifact_backed` | `ship-package.md`, `pull-request.md` | `on_verify_fail: manual` |
|
|
74
|
+
|
|
75
|
+
`on_verify_fail` repair (idempotent, 3 attempts) sits on every stage except
|
|
76
|
+
`publish` (`manual` / `side_effecting`). Stage files use `io` / `verify` /
|
|
77
|
+
`on_verify_fail`.
|
|
78
|
+
|
|
79
|
+
Shared JSON Schema lives on the pipeline under `schemas:` —
|
|
80
|
+
`story-assignment` is the first Clone Array item (`plan` input `$ref`);
|
|
81
|
+
`story-work` is the second (`implement` input `$ref`). See
|
|
82
|
+
[YAML catalog — Pipeline schemas](../../docs/yaml-catalog.md#pipeline-schemas)
|
|
83
|
+
and [Clone Chain](../../docs/yaml-catalog.md#clone-chain).
|
|
84
|
+
|
|
85
|
+
## Run
|
|
86
|
+
|
|
87
|
+
Fill in [`feature-loop.task.yaml`](feature-loop.task.yaml) (epic path,
|
|
88
|
+
publish repo, base branch, `checkout` on the feature branch). Operator
|
|
89
|
+
accepts twice: aligned plans, then the ship package.
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
node dist/cli.js validate --pipeline examples/feature-loop/feature-loop.pipeline.yaml --strict
|
|
93
|
+
node dist/cli.js run \
|
|
94
|
+
--pipeline examples/feature-loop/feature-loop.pipeline.yaml \
|
|
95
|
+
--task examples/feature-loop/feature-loop.task.yaml
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Needs a configured provider (`sf providers status`), `gh` on PATH, and
|
|
99
|
+
`GH_TOKEN` or `GITHUB_TOKEN` for the publish stage. Optional: add
|
|
100
|
+
`mcp: [context7]` on the `plan` pipeline entry when `CONTEXT7_API_KEY`
|
|
101
|
+
is set so story plans can query current library docs.
|
|
102
|
+
|
|
103
|
+
Inspect Clone Instance tracks and envelopes in the operator console (`sf ui`)
|
|
104
|
+
on the `plan` and `implement` stages, then the `align` / `verify` Joins.
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
id: address-feedback
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Address every blocking finding from review. This is the only stage
|
|
4
|
+
after implement that may edit the checkout. It is last-mile fixup,
|
|
5
|
+
not a second epic. Do not commit, push, or open a pull request.
|
|
6
|
+
|
|
7
|
+
On success you MUST include feedback_loop in emit_stage_envelope:
|
|
8
|
+
- {"action":"continue"} when verdict was pass, or when you fixed
|
|
9
|
+
every blocker and a further review pass is not needed (no remaining
|
|
10
|
+
blocking risk).
|
|
11
|
+
- {"action":"send_back","target":"review"} when you changed the
|
|
12
|
+
checkout to address blockers — review must re-read the whole diff
|
|
13
|
+
before publish. Do not combine send_back with fork_choice or
|
|
14
|
+
|
|
15
|
+
Reading upstream work: the user prompt contains "Factory run
|
|
16
|
+
workspace: <absolute path>". review-report.md and review payload
|
|
17
|
+
(verdict, blocking_findings) are authoritative. If Feedback Loop
|
|
18
|
+
Context is present, that is a prior send-back: fix what the latest
|
|
19
|
+
review still blocks.
|
|
20
|
+
|
|
21
|
+
Definition of done — every line must hold before you emit success:
|
|
22
|
+
- review-report.md and the review envelope were read.
|
|
23
|
+
- If verdict is pass and blocking_findings is empty: the checkout is
|
|
24
|
+
untouched, fixed_files is empty, addressed_all_blocking is true,
|
|
25
|
+
feedback_loop is continue.
|
|
26
|
+
- If any blocker exists: every blocking_findings entry is fixed, then
|
|
27
|
+
search for other instances of the same category and fix those too.
|
|
28
|
+
git diff is non-empty. Every cited failing check was re-run and
|
|
29
|
+
now passes. addressed_all_blocking is true. feedback_loop is
|
|
30
|
+
send_back to review unless a Feedback Loop Context remaining-replay
|
|
31
|
+
count is already exhausted — then continue only if the latest
|
|
32
|
+
review is actually clean; otherwise emit failure.
|
|
33
|
+
- Every fixed_files entry is a repo-relative checkout path in
|
|
34
|
+
git diff --name-only.
|
|
35
|
+
- review-feedback-report.md was written through write_stage_artifact
|
|
36
|
+
and appears in the emitted artifacts list.
|
|
37
|
+
|
|
38
|
+
1. Read review-report.md. If every verdict is pass, skip to the
|
|
39
|
+
report step with nothing to fix and continue.
|
|
40
|
+
2. Fix each blocker at the cited location, then sweep the rest of
|
|
41
|
+
the diff for the same category. No unrelated refactors. Do not
|
|
42
|
+
weaken or delete tests to go green.
|
|
43
|
+
3. Re-run every command a blocker cited. If a fix cannot complete,
|
|
44
|
+
emit failure — do not present partial remediation as success.
|
|
45
|
+
4. Call write_stage_artifact with path review-feedback-report.md
|
|
46
|
+
listing each blocker, the fix, the passing re-run, or that there
|
|
47
|
+
was nothing to address.
|
|
48
|
+
5. Emit exactly once, including the report and inherited evidence,
|
|
49
|
+
with a payload matching the schema and feedback_loop as above.
|
|
50
|
+
|
|
51
|
+
Success requires real checkout edits when blockers existed. Put
|
|
52
|
+
checkout-relative paths in payload.fixed_files. Do not put
|
|
53
|
+
stages/.../artifacts paths there.
|
|
54
|
+
|
|
55
|
+
Contract violations — emit failure rather than presenting these as
|
|
56
|
+
success:
|
|
57
|
+
- addressed_all_blocking: true while any blocker remains unverified.
|
|
58
|
+
- continue after checkout edits that have not been re-reviewed, when
|
|
59
|
+
a send_back replay remains available.
|
|
60
|
+
- send_back when the tree was not changed.
|
|
61
|
+
- A fixed_files entry under stages/.../artifacts/.
|
|
62
|
+
|
|
63
|
+
summary and payload are handed to the next stage verbatim. State
|
|
64
|
+
what was fixed, whether review must run again, and remaining risk.
|
|
65
|
+
Do not repeat this stage's prohibitions in summary.
|
|
66
|
+
|
|
67
|
+
When finished, call emit_stage_envelope exactly once. Your last tool
|
|
68
|
+
call in this attempt must be emit_stage_envelope. An empty final
|
|
69
|
+
message is a stage failure.
|
|
70
|
+
model: cursor/auto
|
|
71
|
+
timeout_ms: 3600000
|
|
72
|
+
io:
|
|
73
|
+
input:
|
|
74
|
+
schema:
|
|
75
|
+
type: object
|
|
76
|
+
required:
|
|
77
|
+
- verdict
|
|
78
|
+
- findings
|
|
79
|
+
- blocking_findings
|
|
80
|
+
- suggestions
|
|
81
|
+
- evidence
|
|
82
|
+
- reviewed_files
|
|
83
|
+
properties:
|
|
84
|
+
verdict:
|
|
85
|
+
type: string
|
|
86
|
+
enum:
|
|
87
|
+
- pass
|
|
88
|
+
- changes_required
|
|
89
|
+
findings:
|
|
90
|
+
type: array
|
|
91
|
+
items:
|
|
92
|
+
type: string
|
|
93
|
+
blocking_findings:
|
|
94
|
+
type: array
|
|
95
|
+
items:
|
|
96
|
+
type: string
|
|
97
|
+
suggestions:
|
|
98
|
+
type: array
|
|
99
|
+
items:
|
|
100
|
+
type: string
|
|
101
|
+
evidence:
|
|
102
|
+
type: array
|
|
103
|
+
items:
|
|
104
|
+
type: string
|
|
105
|
+
reviewed_files:
|
|
106
|
+
type: array
|
|
107
|
+
minItems: 1
|
|
108
|
+
items:
|
|
109
|
+
type: string
|
|
110
|
+
output:
|
|
111
|
+
schema:
|
|
112
|
+
type: object
|
|
113
|
+
required:
|
|
114
|
+
- addressed_all_blocking
|
|
115
|
+
- fixed_files
|
|
116
|
+
- verification_commands
|
|
117
|
+
- remaining_risks
|
|
118
|
+
- sent_back
|
|
119
|
+
properties:
|
|
120
|
+
addressed_all_blocking:
|
|
121
|
+
type: boolean
|
|
122
|
+
fixed_files:
|
|
123
|
+
type: array
|
|
124
|
+
items:
|
|
125
|
+
type: string
|
|
126
|
+
verification_commands:
|
|
127
|
+
type: array
|
|
128
|
+
items:
|
|
129
|
+
type: string
|
|
130
|
+
remaining_risks:
|
|
131
|
+
type: array
|
|
132
|
+
items:
|
|
133
|
+
type: string
|
|
134
|
+
sent_back:
|
|
135
|
+
type: boolean
|
|
136
|
+
verify:
|
|
137
|
+
- id: review-feedback-report-declared
|
|
138
|
+
type: artifact
|
|
139
|
+
basename: review-feedback-report.md
|
|
140
|
+
when:
|
|
141
|
+
- emit
|
|
142
|
+
- id: review-feedback-report
|
|
143
|
+
type: artifact
|
|
144
|
+
path: review-feedback-report.md
|
|
145
|
+
nonempty: true
|
|
146
|
+
when:
|
|
147
|
+
- after
|
|
148
|
+
gate_kinds: []
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
id: align
|
|
2
|
+
system_prompt: |
|
|
3
|
+
You are the join after plan. Read all story plans together,
|
|
4
|
+
fix overlaps and contradictions in the plan artifacts, choose the
|
|
5
|
+
sequential implementation order, and get operator acceptance before any
|
|
6
|
+
source edit. Do not implement, commit, push, or open a pull request.
|
|
7
|
+
|
|
8
|
+
Prior plan envelopes' payload (story_id, planned_files, validation_commands) and
|
|
9
|
+
story-plan.md are authoritative over any prose summary.
|
|
10
|
+
|
|
11
|
+
Reading upstream work: the user prompt contains "Factory run workspace:
|
|
12
|
+
<absolute path>". Read each prior artifact at <Factory run workspace>/
|
|
13
|
+
<artifact path>.
|
|
14
|
+
|
|
15
|
+
Definition of done — every line must hold before you emit success:
|
|
16
|
+
- Every plan envelope and story-plan.md was read.
|
|
17
|
+
- Overlapping planned_files, contradictory approaches, and missing
|
|
18
|
+
epic coverage were resolved by editing the affected story plans via
|
|
19
|
+
write_stage_artifact (new aligned copies named
|
|
20
|
+
story-plan-<story_id>.md in this attempt) — not by hoping implement
|
|
21
|
+
will notice.
|
|
22
|
+
- aligned-plans.md was written through write_stage_artifact, appears
|
|
23
|
+
in the emitted artifacts list, and records the final story set, the
|
|
24
|
+
implementation order, what changed in which plan, and remaining
|
|
25
|
+
risks.
|
|
26
|
+
- payload.stories is a Clone Array of story-work objects, one per
|
|
27
|
+
aligned story, in implementation order. Each item has story_id,
|
|
28
|
+
title, plan_artifact, order (1-based), depends_on, planned_files, and
|
|
29
|
+
validation_commands. The first item has no unmet neighbor
|
|
30
|
+
dependency; later items may depend only on earlier story_ids.
|
|
31
|
+
Encode order in each item; do not emit a sibling implementation_order
|
|
32
|
+
or story_ids array.
|
|
33
|
+
- remaining_risks is a string. approved is a boolean. alignment_notes
|
|
34
|
+
is a string.
|
|
35
|
+
- The operator accepted aligned-plans.md through artifact_backed, and
|
|
36
|
+
that accepted decision is recorded inside the artifact.
|
|
37
|
+
|
|
38
|
+
1. Read every plan envelope and story-plan.md. Diff planned_files across stories. Flag overlap, gaps
|
|
39
|
+
against epic-split.md, and validation commands that do not exist
|
|
40
|
+
in this repo.
|
|
41
|
+
2. Rewrite any story plan that needs a fix into
|
|
42
|
+
story-plan-<story_id>.md via write_stage_artifact. Unchanged plans
|
|
43
|
+
are still copied so implement reads from this attempt.
|
|
44
|
+
3. Choose a sequential order that respects neighbor_dependencies and
|
|
45
|
+
file coupling (shared types and contracts first). Put that order
|
|
46
|
+
on each stories item as order and depends_on.
|
|
47
|
+
4. Call write_stage_artifact with path aligned-plans.md covering the
|
|
48
|
+
matrix of stories, order, diffs you made, and why sequential
|
|
49
|
+
implement will not thrash shared files.
|
|
50
|
+
5. Call ask_operator with kind artifact_backed referencing
|
|
51
|
+
aligned-plans.md. Ask whether this set and order are ready to
|
|
52
|
+
implement. On reject or change text: revise artifacts and ask
|
|
53
|
+
again in this same stage. Never emit before accept.
|
|
54
|
+
6. After explicit acceptance, rewrite aligned-plans.md to include an
|
|
55
|
+
operator-decision section (accepted wording and any conditions).
|
|
56
|
+
Then emit the stories Clone Array plus approved, alignment_notes,
|
|
57
|
+
and remaining_risks as scalars.
|
|
58
|
+
|
|
59
|
+
Required files must be created with write_stage_artifact. Checkout
|
|
60
|
+
write/edit does not satisfy after-phase verify.
|
|
61
|
+
|
|
62
|
+
this same attempt. Do not pause after accept. Do not ask_operator for
|
|
63
|
+
emit/schema errors.
|
|
64
|
+
|
|
65
|
+
summary and payload are handed to the next stage verbatim. State the
|
|
66
|
+
approved story set, order, and artifact pointers only. Do not repeat
|
|
67
|
+
this stage's prohibitions in summary.
|
|
68
|
+
|
|
69
|
+
When finished, call emit_stage_envelope exactly once. Your last tool
|
|
70
|
+
call in this attempt must be emit_stage_envelope (or ask_operator if
|
|
71
|
+
waiting on HITL). An empty final message is a stage failure.
|
|
72
|
+
model: cursor/auto
|
|
73
|
+
timeout_ms: 3600000
|
|
74
|
+
io:
|
|
75
|
+
input:
|
|
76
|
+
schema:
|
|
77
|
+
type: object
|
|
78
|
+
output:
|
|
79
|
+
schema:
|
|
80
|
+
type: object
|
|
81
|
+
required:
|
|
82
|
+
- stories
|
|
83
|
+
- approved
|
|
84
|
+
- alignment_notes
|
|
85
|
+
- remaining_risks
|
|
86
|
+
properties:
|
|
87
|
+
stories:
|
|
88
|
+
type: array
|
|
89
|
+
items:
|
|
90
|
+
$ref: "#/schemas/story-work"
|
|
91
|
+
approved:
|
|
92
|
+
type: boolean
|
|
93
|
+
alignment_notes:
|
|
94
|
+
type: string
|
|
95
|
+
remaining_risks:
|
|
96
|
+
type: string
|
|
97
|
+
verify:
|
|
98
|
+
- id: plans-approved
|
|
99
|
+
type: gate
|
|
100
|
+
kind: artifact_backed
|
|
101
|
+
when:
|
|
102
|
+
- emit
|
|
103
|
+
- after
|
|
104
|
+
- id: aligned-plans-declared
|
|
105
|
+
type: artifact
|
|
106
|
+
basename: aligned-plans.md
|
|
107
|
+
when:
|
|
108
|
+
- emit
|
|
109
|
+
- id: aligned-plans
|
|
110
|
+
type: artifact
|
|
111
|
+
path: aligned-plans.md
|
|
112
|
+
nonempty: true
|
|
113
|
+
when:
|
|
114
|
+
- after
|
|
115
|
+
gate_kinds:
|
|
116
|
+
- artifact_backed
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
id: decompose
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Split the task's requirements document (the epic) into independent
|
|
4
|
+
implementation stories for the next stage to plan. Do not write story plans here, edit source, commit, push, or
|
|
5
|
+
open a pull request.
|
|
6
|
+
|
|
7
|
+
There is no prior stage. The task goal, context, and constraints name
|
|
8
|
+
the epic: a requirements path, pasted epic, or equivalent. Read that
|
|
9
|
+
document from the checkout when a path is given, plus the files and
|
|
10
|
+
neighbors the epic implies. A split that restates the epic without
|
|
11
|
+
grounding it in the real tree is not done.
|
|
12
|
+
|
|
13
|
+
Definition of done — every line must hold before you emit success:
|
|
14
|
+
- epic-split.md was written through write_stage_artifact and appears in
|
|
15
|
+
the emitted artifacts list.
|
|
16
|
+
- payload.stories is an array of 1–8 story-assignment objects. Each item
|
|
17
|
+
has story_id, title, epic_slice, acceptance, neighboring_story_ids, and
|
|
18
|
+
constraints. Do not emit a parallel story_ids string array.
|
|
19
|
+
- Each story is a slice the next stage can plan in isolation: one
|
|
20
|
+
story_id (stable kebab-case), a title, an epic_slice that quotes or
|
|
21
|
+
paraphrases only the epic text that slice owns, acceptance the
|
|
22
|
+
implementer can falsify, neighboring_story_ids it must not steal
|
|
23
|
+
work from, and constraints that clone must honor.
|
|
24
|
+
- Stories do not overlap files or acceptance. Together they cover the
|
|
25
|
+
epic; leftover epic text with no owner is a contract violation.
|
|
26
|
+
- Emit 1–8 stories. Never zero stories, never more than eight.
|
|
27
|
+
|
|
28
|
+
1. Read the task and the named requirements document in the checkout.
|
|
29
|
+
Map the epic onto real files before cutting stories.
|
|
30
|
+
2. Cut 1–8 stories. Prefer seams the checkout already has (modules,
|
|
31
|
+
APIs, UI vs runtime, tests vs prod) over arbitrary chapter splits.
|
|
32
|
+
If the epic is one tight change, emit one story — do not invent filler
|
|
33
|
+
stories.
|
|
34
|
+
3. Call write_stage_artifact with path epic-split.md listing each
|
|
35
|
+
story_id, title, owned epic text, likely files, acceptance, and why
|
|
36
|
+
the slices can be planned in parallel.
|
|
37
|
+
4. Emit exactly one success envelope with payload matching the schema,
|
|
38
|
+
artifacts containing epic-split.md, and stories as those objects in
|
|
39
|
+
deterministic order. Sibling fields requirements_source and
|
|
40
|
+
split_rationale are strings only.
|
|
41
|
+
|
|
42
|
+
Required files must be created with write_stage_artifact. Checkout
|
|
43
|
+
write/edit does not satisfy after-phase verify.
|
|
44
|
+
|
|
45
|
+
summary and payload are handed to the next stage verbatim. State
|
|
46
|
+
outcomes and artifact pointers only. Do not repeat this stage's
|
|
47
|
+
prohibitions in summary — downstream will obey them literally.
|
|
48
|
+
|
|
49
|
+
When finished, call emit_stage_envelope exactly once with status,
|
|
50
|
+
this attempt must be emit_stage_envelope. An empty final message is a
|
|
51
|
+
stage failure.
|
|
52
|
+
model: cursor/auto
|
|
53
|
+
timeout_ms: 3600000
|
|
54
|
+
io:
|
|
55
|
+
input:
|
|
56
|
+
schema:
|
|
57
|
+
type: object
|
|
58
|
+
output:
|
|
59
|
+
schema:
|
|
60
|
+
type: object
|
|
61
|
+
required:
|
|
62
|
+
- stories
|
|
63
|
+
- requirements_source
|
|
64
|
+
- split_rationale
|
|
65
|
+
properties:
|
|
66
|
+
stories:
|
|
67
|
+
type: array
|
|
68
|
+
items:
|
|
69
|
+
$ref: "#/schemas/story-assignment"
|
|
70
|
+
requirements_source:
|
|
71
|
+
type: string
|
|
72
|
+
split_rationale:
|
|
73
|
+
type: string
|
|
74
|
+
verify:
|
|
75
|
+
- id: epic-split-declared
|
|
76
|
+
type: artifact
|
|
77
|
+
basename: epic-split.md
|
|
78
|
+
when:
|
|
79
|
+
- emit
|
|
80
|
+
- id: epic-split
|
|
81
|
+
type: artifact
|
|
82
|
+
path: epic-split.md
|
|
83
|
+
nonempty: true
|
|
84
|
+
when:
|
|
85
|
+
- after
|
|
86
|
+
gate_kinds: []
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
id: default-model-hierarchy
|
|
2
|
+
goal: >
|
|
3
|
+
Implement default model resolution across Stageflow YAML layers so a
|
|
4
|
+
model can be set once on stageflow.yaml or a pipeline and inherited by
|
|
5
|
+
stages that omit model. Resolution priority must be stage first, then
|
|
6
|
+
pipeline, then the global stageflow.yaml default. Split the work into
|
|
7
|
+
stories, plan each story, align the plans, implement them in the agreed
|
|
8
|
+
order, verify coverage, review the whole diff, address review feedback,
|
|
9
|
+
and open an operator-approved pull request.
|
|
10
|
+
context: |
|
|
11
|
+
This repository is Stageflow itself (tejasghutukade/stageflow). The
|
|
12
|
+
checkout for this run is a dedicated git worktree already on branch
|
|
13
|
+
scratch/extra-workspace, tracking origin/main.
|
|
14
|
+
|
|
15
|
+
Epic (pasted — treat this block as the requirements document):
|
|
16
|
+
|
|
17
|
+
Today every stage must declare model (string). Omitting it fails load.
|
|
18
|
+
There is no pipeline-level or stageflow.yaml default for model. The
|
|
19
|
+
agent backend already resolves as stage > pipeline > global > "pi";
|
|
20
|
+
model needs the same shape of hierarchy, without reusing the agent key.
|
|
21
|
+
|
|
22
|
+
Required behavior:
|
|
23
|
+
1. Optional top-level model on stageflow.yaml (global default).
|
|
24
|
+
2. Optional top-level model on *.pipeline.yaml (pipeline default for
|
|
25
|
+
all stages in that pipeline).
|
|
26
|
+
3. Stage model remains allowed on inline stage bodies and external
|
|
27
|
+
stage YAML, but becomes optional when a higher default can fill it.
|
|
28
|
+
4. Effective resolution for each stage at load or run time:
|
|
29
|
+
stage.model ?? pipeline.model ?? stageflow.yaml model.
|
|
30
|
+
If still unset after that chain, load/run must fail with a clear
|
|
31
|
+
error — never invent a silent hardcoded model string.
|
|
32
|
+
5. Priority is always stage override, then pipeline, then global.
|
|
33
|
+
|
|
34
|
+
Likely touch points (verify against the tree; do not assume line
|
|
35
|
+
numbers): src/types/stageflowManifest.ts, src/types/pipeline.ts,
|
|
36
|
+
src/types for StageConfig, src/config/loadStageflowManifest.ts,
|
|
37
|
+
src/config load/merge pipeline helpers, src/config/loadStage.ts,
|
|
38
|
+
resolveAgentPort.ts (pattern to mirror for model, not to conflate),
|
|
39
|
+
stage worker / adapters that read stage.model, docs/yaml-catalog.md,
|
|
40
|
+
fixtures under tests/fixtures/, and any create/init surfaces that
|
|
41
|
+
currently require stage model.
|
|
42
|
+
|
|
43
|
+
Keep model (LLM id string) distinct from agent (pi | claude backend).
|
|
44
|
+
|
|
45
|
+
- Publish target: tejasghutukade/stageflow
|
|
46
|
+
- Base branch: main
|
|
47
|
+
- Head branch: the checkout's current branch (do not create or switch)
|
|
48
|
+
constraints: |
|
|
49
|
+
Do not create, rename, or switch branches — the checkout is already
|
|
50
|
+
on the correct feature branch (scratch/extra-workspace).
|
|
51
|
+
Do not commit, push, or open a pull request except in publish, and
|
|
52
|
+
only after the operator accepts ship-package.md.
|
|
53
|
+
Do not expand scope past the epic. Story plans and sequential
|
|
54
|
+
implement clones must stay inside their assigned slices.
|
|
55
|
+
Do not change agent-backend resolution semantics except where
|
|
56
|
+
documentation must clarify that model and agent are separate.
|
|
57
|
+
publish_repo and base_branch must be the values named here, never guessed.
|
|
58
|
+
checkout: /Users/tejasghutukade/Projects/software-factory/.worktrees/scratch/extra-workspace
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
id: feature-loop
|
|
2
|
+
schemas:
|
|
3
|
+
story-assignment:
|
|
4
|
+
type: object
|
|
5
|
+
required:
|
|
6
|
+
- story_id
|
|
7
|
+
- title
|
|
8
|
+
- epic_slice
|
|
9
|
+
- acceptance
|
|
10
|
+
- neighboring_story_ids
|
|
11
|
+
- constraints
|
|
12
|
+
properties:
|
|
13
|
+
story_id:
|
|
14
|
+
type: string
|
|
15
|
+
title:
|
|
16
|
+
type: string
|
|
17
|
+
epic_slice:
|
|
18
|
+
type: string
|
|
19
|
+
acceptance:
|
|
20
|
+
type: string
|
|
21
|
+
neighboring_story_ids:
|
|
22
|
+
type: array
|
|
23
|
+
items:
|
|
24
|
+
type: string
|
|
25
|
+
constraints:
|
|
26
|
+
type: array
|
|
27
|
+
items:
|
|
28
|
+
type: string
|
|
29
|
+
story-work:
|
|
30
|
+
type: object
|
|
31
|
+
required:
|
|
32
|
+
- story_id
|
|
33
|
+
- title
|
|
34
|
+
- plan_artifact
|
|
35
|
+
- order
|
|
36
|
+
- depends_on
|
|
37
|
+
- planned_files
|
|
38
|
+
- validation_commands
|
|
39
|
+
properties:
|
|
40
|
+
story_id:
|
|
41
|
+
type: string
|
|
42
|
+
title:
|
|
43
|
+
type: string
|
|
44
|
+
plan_artifact:
|
|
45
|
+
type: string
|
|
46
|
+
order:
|
|
47
|
+
type: integer
|
|
48
|
+
minimum: 1
|
|
49
|
+
depends_on:
|
|
50
|
+
type: array
|
|
51
|
+
items:
|
|
52
|
+
type: string
|
|
53
|
+
planned_files:
|
|
54
|
+
type: array
|
|
55
|
+
items:
|
|
56
|
+
type: string
|
|
57
|
+
validation_commands:
|
|
58
|
+
type: array
|
|
59
|
+
items:
|
|
60
|
+
type: string
|
|
61
|
+
stages:
|
|
62
|
+
- id: decompose
|
|
63
|
+
uses: ./decompose.yaml
|
|
64
|
+
entry: true
|
|
65
|
+
clone_cap: 8
|
|
66
|
+
clone_mode: parallel
|
|
67
|
+
route:
|
|
68
|
+
- to: plan
|
|
69
|
+
on_verify_fail:
|
|
70
|
+
mode: repair
|
|
71
|
+
max_attempts: 3
|
|
72
|
+
retry_safety: idempotent
|
|
73
|
+
include_failed_checks: true
|
|
74
|
+
- id: plan
|
|
75
|
+
uses: ./plan.yaml
|
|
76
|
+
route:
|
|
77
|
+
- to: align
|
|
78
|
+
on_verify_fail:
|
|
79
|
+
mode: repair
|
|
80
|
+
max_attempts: 3
|
|
81
|
+
retry_safety: idempotent
|
|
82
|
+
include_failed_checks: true
|
|
83
|
+
- id: align
|
|
84
|
+
uses: ./align.yaml
|
|
85
|
+
clone_cap: 8
|
|
86
|
+
clone_mode: sequential
|
|
87
|
+
route:
|
|
88
|
+
- to: implement
|
|
89
|
+
on_verify_fail:
|
|
90
|
+
mode: repair
|
|
91
|
+
max_attempts: 3
|
|
92
|
+
retry_safety: idempotent
|
|
93
|
+
include_failed_checks: true
|
|
94
|
+
- id: implement
|
|
95
|
+
uses: ./implement.yaml
|
|
96
|
+
route:
|
|
97
|
+
- to: verify
|
|
98
|
+
on_verify_fail:
|
|
99
|
+
mode: repair
|
|
100
|
+
max_attempts: 3
|
|
101
|
+
retry_safety: idempotent
|
|
102
|
+
include_failed_checks: true
|
|
103
|
+
- id: verify
|
|
104
|
+
uses: ./verify.yaml
|
|
105
|
+
route:
|
|
106
|
+
- to: review
|
|
107
|
+
on_verify_fail:
|
|
108
|
+
mode: repair
|
|
109
|
+
max_attempts: 3
|
|
110
|
+
retry_safety: idempotent
|
|
111
|
+
include_failed_checks: true
|
|
112
|
+
- id: review
|
|
113
|
+
uses: ./review.yaml
|
|
114
|
+
route:
|
|
115
|
+
- to: address-feedback
|
|
116
|
+
on_verify_fail:
|
|
117
|
+
mode: repair
|
|
118
|
+
max_attempts: 3
|
|
119
|
+
retry_safety: idempotent
|
|
120
|
+
include_failed_checks: true
|
|
121
|
+
- id: address-feedback
|
|
122
|
+
uses: ./address-feedback.yaml
|
|
123
|
+
route:
|
|
124
|
+
- to: publish
|
|
125
|
+
- type: loop
|
|
126
|
+
to: review
|
|
127
|
+
max_replays: 2
|
|
128
|
+
on_max_replays: wait_for_human
|
|
129
|
+
replay_session: new_session
|
|
130
|
+
on_verify_fail:
|
|
131
|
+
mode: repair
|
|
132
|
+
max_attempts: 3
|
|
133
|
+
retry_safety: idempotent
|
|
134
|
+
include_failed_checks: true
|
|
135
|
+
- id: publish
|
|
136
|
+
uses: ./publish.yaml
|
|
137
|
+
on_verify_fail:
|
|
138
|
+
mode: manual
|
|
139
|
+
retry_safety: side_effecting
|
|
140
|
+
replay_safe: false
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
id: feature-loop
|
|
2
|
+
goal: >
|
|
3
|
+
Implement the epic in the requirements document named in context:
|
|
4
|
+
split it into stories, plan each story, align the plans, implement
|
|
5
|
+
them in the agreed order, verify coverage, review the whole diff,
|
|
6
|
+
address review feedback, and open an operator-approved pull request.
|
|
7
|
+
context: |
|
|
8
|
+
Point this task at a real checkout already on the feature branch.
|
|
9
|
+
Name the requirements/epic path (checkout-relative), the publish
|
|
10
|
+
repository (owner/name), and the base branch.
|
|
11
|
+
|
|
12
|
+
Replace the placeholders below before running:
|
|
13
|
+
|
|
14
|
+
- Requirements/epic: <path-to-requirements.md>
|
|
15
|
+
- Publish target: <owner/repo>
|
|
16
|
+
- Base branch: main
|
|
17
|
+
- Head branch: the checkout's current branch (do not create or switch)
|
|
18
|
+
constraints: |
|
|
19
|
+
Do not create, rename, or switch branches — the checkout is already
|
|
20
|
+
on the correct feature branch.
|
|
21
|
+
Do not commit, push, or open a pull request except in publish, and
|
|
22
|
+
only after the operator accepts ship-package.md.
|
|
23
|
+
Do not expand scope past the epic. Story plans and sequential
|
|
24
|
+
implement clones must stay inside their assigned slices.
|
|
25
|
+
publish_repo and base_branch must be the values named here, never guessed.
|