stageflow 0.25.0 → 0.30.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 +14 -3
- package/builtin-skills/browser/SKILL.md +42 -0
- 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/claudeAdapter.js +2 -2
- package/dist/agent/cursorProvider.d.ts +2 -0
- package/dist/agent/cursorProvider.js +30 -5
- package/dist/agent/fakeAgent.d.ts +1 -0
- package/dist/agent/fakeAgent.js +13 -0
- package/dist/agent/piAdapter.d.ts +11 -24
- package/dist/agent/piAdapter.js +107 -50
- package/dist/agent/piIsolatedMcp.d.ts +2 -0
- package/dist/agent/piIsolatedMcp.js +10 -2
- package/dist/agent/piSessionFactory.d.ts +38 -0
- package/dist/agent/piSessionFactory.js +60 -0
- package/dist/agent/port.d.ts +8 -0
- package/dist/agent/streamLogRedact.d.ts +7 -1
- package/dist/agent/streamLogRedact.js +26 -11
- package/dist/browser/anchor.d.ts +27 -0
- package/dist/browser/anchor.js +127 -0
- package/dist/browser/auditSink.d.ts +38 -0
- package/dist/browser/auditSink.js +34 -0
- package/dist/browser/browserHost.d.ts +86 -0
- package/dist/browser/browserHost.js +7 -0
- package/dist/browser/browserSweep.d.ts +14 -0
- package/dist/browser/browserSweep.js +54 -0
- package/dist/browser/browserTeardown.d.ts +56 -0
- package/dist/browser/browserTeardown.js +235 -0
- package/dist/browser/fakeRemoteBrowserHost.d.ts +2 -0
- package/dist/browser/fakeRemoteBrowserHost.js +34 -0
- package/dist/browser/gateHandoff.d.ts +25 -0
- package/dist/browser/gateHandoff.js +83 -0
- package/dist/browser/humanLogin.d.ts +18 -0
- package/dist/browser/humanLogin.js +34 -0
- package/dist/browser/keyProvider.d.ts +10 -0
- package/dist/browser/keyProvider.js +39 -0
- package/dist/browser/localBrowserHost.d.ts +10 -0
- package/dist/browser/localBrowserHost.js +152 -0
- package/dist/browser/localProfileLock.d.ts +2 -0
- package/dist/browser/localProfileLock.js +218 -0
- package/dist/browser/localProfileStore.d.ts +5 -0
- package/dist/browser/localProfileStore.js +91 -0
- package/dist/browser/loginCheck.d.ts +53 -0
- package/dist/browser/loginCheck.js +147 -0
- package/dist/browser/memoryProfileLock.d.ts +2 -0
- package/dist/browser/memoryProfileLock.js +53 -0
- package/dist/browser/memoryProfileStore.d.ts +2 -0
- package/dist/browser/memoryProfileStore.js +31 -0
- package/dist/browser/navigationAudit.d.ts +16 -0
- package/dist/browser/navigationAudit.js +53 -0
- package/dist/browser/persistedEnv.d.ts +3 -0
- package/dist/browser/persistedEnv.js +15 -0
- package/dist/browser/profileLock.d.ts +40 -0
- package/dist/browser/profileLock.js +10 -0
- package/dist/browser/profileStore.d.ts +23 -0
- package/dist/browser/profileStore.js +39 -0
- package/dist/browser/runLiveness.d.ts +13 -0
- package/dist/browser/runLiveness.js +39 -0
- package/dist/browser/sitePolicy.d.ts +10 -0
- package/dist/browser/sitePolicy.js +61 -0
- package/dist/browser/stageBrowserEnv.d.ts +22 -0
- package/dist/browser/stageBrowserEnv.js +147 -0
- package/dist/browser/stageProfileLock.d.ts +17 -0
- package/dist/browser/stageProfileLock.js +39 -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/browserCommand.d.ts +44 -0
- package/dist/cli/browserCommand.js +472 -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 +41 -3
- package/dist/cli/hostClient.js +129 -14
- package/dist/cli/initCommand.d.ts +1 -0
- package/dist/cli/initCommand.js +23 -7
- package/dist/cli/initTemplates.d.ts +5 -2
- package/dist/cli/initTemplates.js +32 -2
- 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 +168 -10
- package/dist/cli/triggerCommand.d.ts +12 -0
- package/dist/cli/triggerCommand.js +183 -0
- package/dist/cli/validateCommand.d.ts +1 -1
- package/dist/cli/validateCommand.js +23 -6
- package/dist/cli.js +202 -32
- package/dist/config/browseCatalog.d.ts +1 -0
- package/dist/config/browseCatalog.js +5 -4
- package/dist/config/builtinSkills.d.ts +4 -0
- package/dist/config/builtinSkills.js +23 -0
- package/dist/config/catalogRelativePath.d.ts +63 -0
- package/dist/config/catalogRelativePath.js +126 -0
- package/dist/config/configOrigin.d.ts +27 -0
- package/dist/config/configOrigin.js +59 -0
- package/dist/config/createTrigger.d.ts +27 -0
- package/dist/config/createTrigger.js +232 -0
- package/dist/config/draftPackage.d.ts +117 -0
- package/dist/config/draftPackage.js +550 -0
- package/dist/config/ensureCatalogScanRoot.d.ts +16 -0
- package/dist/config/ensureCatalogScanRoot.js +73 -0
- package/dist/config/hostConfig.d.ts +57 -0
- package/dist/config/hostConfig.js +360 -0
- package/dist/config/listSkills.d.ts +26 -0
- package/dist/config/listSkills.js +206 -5
- package/dist/config/loadOutcome.d.ts +7 -1
- package/dist/config/loadPipeline.js +39 -2
- package/dist/config/loadStage.js +25 -0
- package/dist/config/loadStageflowManifest.js +25 -0
- package/dist/config/loadTask.d.ts +2 -0
- package/dist/config/loadTask.js +57 -18
- package/dist/config/loadTrigger.d.ts +9 -0
- package/dist/config/loadTrigger.js +120 -0
- 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 +32 -0
- package/dist/config/multiProjectCatalog.js +150 -0
- package/dist/config/normalizePipelineStageEntry.js +27 -1
- package/dist/config/parseCompletionContract.js +6 -0
- package/dist/config/pipelineStageKeys.js +3 -0
- package/dist/config/publishDraftPackage.d.ts +7 -0
- package/dist/config/publishDraftPackage.js +25 -0
- package/dist/config/resolveCatalogContext.js +1 -1
- 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/resolvePipelineDag.js +1 -1
- package/dist/config/resolveStageMcpServers.d.ts +9 -1
- package/dist/config/resolveStageMcpServers.js +36 -9
- package/dist/config/scanCatalogPaths.d.ts +1 -1
- package/dist/config/scanCatalogPaths.js +6 -2
- 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/stageBrowser.d.ts +12 -0
- package/dist/config/stageBrowser.js +118 -0
- package/dist/config/toolRequires.d.ts +24 -0
- package/dist/config/toolRequires.js +115 -0
- package/dist/config/triggerCatalog.d.ts +10 -0
- package/dist/config/triggerCatalog.js +37 -0
- package/dist/config/validateCatalog.d.ts +17 -3
- package/dist/config/validateCatalog.js +223 -3
- package/dist/config/validateCompletionContract.js +8 -0
- package/dist/diagnostics/checks.d.ts +39 -0
- package/dist/diagnostics/checks.js +135 -0
- package/dist/envelope/preEmitChecks.d.ts +1 -1
- package/dist/envelope/preEmitChecks.js +8 -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 +17 -0
- package/dist/logging/redact.js +105 -0
- package/dist/mcp/catalogTools.js +492 -81
- package/dist/mcp/checkoutTools.d.ts +52 -0
- package/dist/mcp/checkoutTools.js +332 -0
- package/dist/mcp/controlTools.js +182 -6
- package/dist/mcp/deps.d.ts +3 -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 +2 -0
- package/dist/mcp/tools.js +6 -0
- package/dist/mcp/triggerTools.d.ts +3 -0
- package/dist/mcp/triggerTools.js +176 -0
- package/dist/net/proxy.d.ts +14 -0
- package/dist/net/proxy.js +78 -0
- package/dist/operatorAgent/docsRetrieval.d.ts +40 -0
- package/dist/operatorAgent/docsRetrieval.js +269 -0
- package/dist/operatorAgent/draftContext.d.ts +16 -0
- package/dist/operatorAgent/draftContext.js +68 -0
- package/dist/operatorAgent/fakeHost.d.ts +39 -0
- package/dist/operatorAgent/fakeHost.js +92 -0
- package/dist/operatorAgent/host.d.ts +40 -0
- package/dist/operatorAgent/host.js +179 -0
- package/dist/operatorAgent/index.d.ts +9 -0
- package/dist/operatorAgent/index.js +8 -0
- package/dist/operatorAgent/piModel.d.ts +80 -0
- package/dist/operatorAgent/piModel.js +528 -0
- package/dist/operatorAgent/profiles/workshopAuthor.d.ts +23 -0
- package/dist/operatorAgent/profiles/workshopAuthor.js +338 -0
- package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +6 -0
- package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +103 -0
- package/dist/operatorAgent/profiles/workshopAuthorTools.d.ts +57 -0
- package/dist/operatorAgent/profiles/workshopAuthorTools.js +623 -0
- package/dist/operatorAgent/proposals.d.ts +32 -0
- package/dist/operatorAgent/proposals.js +144 -0
- package/dist/operatorAgent/types.d.ts +128 -0
- package/dist/operatorAgent/types.js +1 -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/findManifestRoot.d.ts +3 -0
- package/dist/project/findManifestRoot.js +35 -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.d.ts +7 -0
- package/dist/project/resolveStageflowContext.js +46 -30
- 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 +25 -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 +139 -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 +35 -3
- package/dist/runstore/sqlite/SqliteRunStore.js +442 -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/008-triggers-table.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/008-triggers-table.js +19 -0
- package/dist/runstore/sqlite/migrations/009-trigger-next-run.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/009-trigger-next-run.js +19 -0
- package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.js +17 -0
- package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
- package/dist/runstore/sqlite/migrations/index.js +78 -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/answerResume.d.ts +1 -0
- package/dist/runtime/answerResume.js +3 -1
- package/dist/runtime/completionCheckRunner.d.ts +15 -1
- package/dist/runtime/completionCheckRunner.js +67 -7
- package/dist/runtime/containerLimits.d.ts +16 -0
- package/dist/runtime/containerLimits.js +84 -0
- package/dist/runtime/credentialBinding.d.ts +2 -0
- package/dist/runtime/credentialBinding.js +3 -0
- package/dist/runtime/credentialMaterialisation.d.ts +28 -0
- package/dist/runtime/credentialMaterialisation.js +128 -0
- package/dist/runtime/emailSource.d.ts +72 -0
- package/dist/runtime/emailSource.js +304 -0
- package/dist/runtime/gitCheckoutCapability.js +7 -13
- package/dist/runtime/githubPollSource.d.ts +86 -0
- package/dist/runtime/githubPollSource.js +284 -0
- package/dist/runtime/pipelineRunner.d.ts +40 -1
- package/dist/runtime/pipelineRunner.js +181 -17
- package/dist/runtime/pipelineScheduler.d.ts +17 -0
- package/dist/runtime/pipelineScheduler.js +220 -28
- 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 +169 -4
- package/dist/runtime/runManager.js +1748 -83
- package/dist/runtime/runRetentionSweep.d.ts +31 -0
- package/dist/runtime/runRetentionSweep.js +328 -0
- package/dist/runtime/runRetryCoordinator.d.ts +4 -0
- package/dist/runtime/runRetryCoordinator.js +20 -2
- package/dist/runtime/runSkills.d.ts +40 -0
- package/dist/runtime/runSkills.js +173 -0
- package/dist/runtime/scheduleSource.d.ts +38 -0
- package/dist/runtime/scheduleSource.js +119 -0
- package/dist/runtime/settingsFile.d.ts +5 -0
- package/dist/runtime/settingsFile.js +61 -54
- package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
- package/dist/runtime/stageAttemptBootstrap.js +250 -27
- 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 +194 -0
- package/dist/runtime/stageHitl.d.ts +1 -0
- package/dist/runtime/stageHitl.js +5 -1
- package/dist/runtime/stageProcessLauncher.d.ts +20 -0
- package/dist/runtime/stageProcessLauncher.js +236 -41
- 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 +6 -0
- package/dist/runtime/stageRunner.js +32 -6
- 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/stageStreamLog.d.ts +1 -0
- package/dist/runtime/stageStreamLog.js +2 -1
- 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/triggerCatalog.d.ts +6 -0
- package/dist/runtime/triggerCatalog.js +24 -0
- package/dist/runtime/triggerEventMatch.d.ts +2 -0
- package/dist/runtime/triggerEventMatch.js +6 -0
- package/dist/runtime/triggerPort.d.ts +14 -0
- package/dist/runtime/triggerPort.js +1 -0
- package/dist/runtime/triggerRunner.d.ts +17 -0
- package/dist/runtime/triggerRunner.js +89 -0
- package/dist/runtime/verifiedStageExecution.d.ts +8 -0
- package/dist/runtime/verifiedStageExecution.js +16 -1
- package/dist/runtime/webhookSignature.d.ts +1 -0
- package/dist/runtime/webhookSignature.js +12 -0
- 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 +42 -2
- package/dist/server/bootstrap.js +273 -5
- package/dist/server/controlToken.d.ts +47 -0
- package/dist/server/controlToken.js +254 -0
- package/dist/server/createHttpHost.d.ts +11 -2
- package/dist/server/createHttpHost.js +106 -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 +123 -0
- package/dist/server/http.d.ts +27 -1
- package/dist/server/http.js +2254 -477
- 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/server/triggerRoutes.d.ts +15 -0
- package/dist/server/triggerRoutes.js +268 -0
- package/dist/tools/askOperator.d.ts +3 -2
- package/dist/types/completion.d.ts +3 -0
- package/dist/types/pipeline.d.ts +10 -1
- package/dist/types/preEmitCheck.d.ts +7 -0
- package/dist/types/stage.d.ts +22 -0
- package/dist/types/stageflowManifest.d.ts +3 -0
- package/dist/types/task.d.ts +8 -0
- package/dist/types/trigger.d.ts +18 -0
- package/dist/types/trigger.js +1 -0
- package/dist/ui/assets/{index-CSsDued1.css → index-Bv4p1aPK.css} +1 -1
- package/dist/ui/assets/index-CntB4bZR.js +133 -0
- package/dist/ui/index.html +2 -2
- package/dist/workshop/autosave.d.ts +58 -0
- package/dist/workshop/autosave.js +222 -0
- package/dist/workshop/buildStore.d.ts +79 -0
- package/dist/workshop/buildStore.js +326 -0
- package/dist/workshop/chatTurn.d.ts +232 -0
- package/dist/workshop/chatTurn.js +475 -0
- package/dist/workshop/modelSettings.d.ts +18 -0
- package/dist/workshop/modelSettings.js +44 -0
- package/dist/workshop/sessionStore.d.ts +61 -0
- package/dist/workshop/sessionStore.js +254 -0
- package/dist/workshop/workshopPin.d.ts +72 -0
- package/dist/workshop/workshopPin.js +193 -0
- package/examples/README.md +99 -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/browser-session/README.md +77 -0
- package/examples/browser-session/browser-session.pipeline.yaml +50 -0
- package/examples/browser-session/browser-session.task.yaml +6 -0
- package/examples/browser-session/check-login.yaml +22 -0
- package/examples/browser-session/fixture-server.mjs +64 -0
- package/examples/browser-session/human-login.yaml +31 -0
- package/examples/browser-session/merge.yaml +36 -0
- package/examples/browser-session/work-a.yaml +41 -0
- package/examples/browser-session/work-b.yaml +41 -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 +145 -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/stageflow.yaml +51 -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 +9 -1
- package/skills/stageflow/SKILL.md +6 -6
- package/skills/stageflow/references/control-surface.md +13 -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-author/references/stage-prompt-template.md +4 -4
- package/skills/stageflow-run/SKILL.md +22 -12
- package/skills/stageflow-run/references/mcp-call.md +9 -1
- package/skills/stageflow-run/references/task-and-pipeline-selection.md +19 -6
- 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 +51 -8
- package/dist/ui/assets/index-Da5EHU6M.js +0 -119
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
id: branch-b
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Branch B -- an external stage file loaded via `uses:`. One sentence is enough.
|
|
4
|
+
Then emit a success envelope via emit_stage_envelope with status: success, a short summary, artifacts: [], and payload: {}.
|
|
5
|
+
model: cursor/auto
|
|
6
|
+
io:
|
|
7
|
+
input:
|
|
8
|
+
schema:
|
|
9
|
+
type: object
|
|
10
|
+
output:
|
|
11
|
+
schema:
|
|
12
|
+
type: object
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
id: decide
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Start both follow-up branches. branch-a and branch-b both run next. One sentence is enough.
|
|
4
|
+
Then emit a success envelope via emit_stage_envelope with status: success, a short summary, artifacts: [], and payload: {}.
|
|
5
|
+
model: cursor/auto
|
|
6
|
+
io:
|
|
7
|
+
input:
|
|
8
|
+
schema:
|
|
9
|
+
type: object
|
|
10
|
+
output:
|
|
11
|
+
schema:
|
|
12
|
+
type: object
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
id: finish
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Finish -- an external stage file loaded via `uses:`. One sentence is enough.
|
|
4
|
+
Then emit a success envelope via emit_stage_envelope with status: success, a short summary, artifacts: [], and payload: {}.
|
|
5
|
+
model: cursor/auto
|
|
6
|
+
io:
|
|
7
|
+
input:
|
|
8
|
+
schema:
|
|
9
|
+
type: object
|
|
10
|
+
output:
|
|
11
|
+
schema:
|
|
12
|
+
type: object
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# Ship-feature pipeline
|
|
2
|
+
|
|
3
|
+
A small, general-purpose "ship any small feature through a governed
|
|
4
|
+
pipeline" pattern: plan → implement → parallel review → address feedback →
|
|
5
|
+
ship. It is deliberately a trimmed sibling of
|
|
6
|
+
[`examples/oss-issue-contribution/`](../oss-issue-contribution/) — no intake,
|
|
7
|
+
no explainers, no read-only reproduction stage, no investigation fan-out —
|
|
8
|
+
built for the common case where a feature is already well understood and the
|
|
9
|
+
value is in a governed, evidence-backed path from plan to pull request, not
|
|
10
|
+
in a multi-stage investigation.
|
|
11
|
+
|
|
12
|
+
The pipeline is repository-neutral. Point the task's `checkout` at a
|
|
13
|
+
dedicated branch of whatever repository you're shipping into. It reads that
|
|
14
|
+
repository's own scripts and conventions before acting; nothing in the stage
|
|
15
|
+
files names a specific repository, feature, or keyword.
|
|
16
|
+
[`ship-feature.task.yaml`](ship-feature.task.yaml) is one concrete instance
|
|
17
|
+
of the pattern — extending Stageflow's envelope JSON Schema subset — not a
|
|
18
|
+
template you must follow.
|
|
19
|
+
|
|
20
|
+
## Flow
|
|
21
|
+
|
|
22
|
+
1. Plan and get explicit operator approval for the exact scope, edit sites,
|
|
23
|
+
and validation commands (`feat-plan`, one merged propose-and-approve
|
|
24
|
+
stage — there is no separate earlier planning stage).
|
|
25
|
+
2. Implement the approved plan and drive its full validation command list to
|
|
26
|
+
green in one session, writing any tests the plan calls for as part of
|
|
27
|
+
implementing rather than in a separate stage (`feat-implement`, the only
|
|
28
|
+
stage with edit access to the checkout).
|
|
29
|
+
3. Fan out two to four focused, non-overlapping reviews in parallel — no
|
|
30
|
+
human gate here, this is the one automated fan-out in the middle
|
|
31
|
+
4. Address every blocking review finding in one fixup stage — sweeping for
|
|
32
|
+
every instance of the same category of problem, not only the ones
|
|
33
|
+
reviewers happened to cite. This catalog stays a DAG; it does not
|
|
34
|
+
declare `{ type: loop }` back to `feat-implement` or a second review pass
|
|
35
|
+
(`feat-address-feedback`).
|
|
36
|
+
5. Assemble a ship package, ask for final approval, and — once the operator
|
|
37
|
+
accepts — push the current branch and open the pull request in that same
|
|
38
|
+
stage (`feat-ship`).
|
|
39
|
+
|
|
40
|
+
No stage before the last one commits, pushes, or opens a pull request, and
|
|
41
|
+
no stage ever creates or renames a branch — the checkout is expected to
|
|
42
|
+
already be on the correct feature branch when the run starts. `feat-ship`
|
|
43
|
+
writes `ship-package.md`, calls `ask_operator`, and only runs `git`/`gh`
|
|
44
|
+
against the checkout's current branch after an explicit accept through its
|
|
45
|
+
`artifact_backed` gate. There is no separate publish flag or dry-run mode:
|
|
46
|
+
the operator's accept is the only gate between "package written" and "PR
|
|
47
|
+
opened."
|
|
48
|
+
|
|
49
|
+
## Runtime contracts
|
|
50
|
+
|
|
51
|
+
Every stage declares `io.output.schema`, so a success emit is rejected unless
|
|
52
|
+
the payload matches it, and each stage file lists `verify` items so success
|
|
53
|
+
is independently checked rather than only claimed. Artifact paths below are
|
|
54
|
+
after-phase `type: artifact` checks on the stage body:
|
|
55
|
+
|
|
56
|
+
| Stage | `gate_kinds` | Required artifacts | Other `verify` |
|
|
57
|
+
|-------|--------------|--------------------|----------------|
|
|
58
|
+
| `feat-plan` | `[artifact_backed]` | `implementation-plan.md` | `gate` `artifact_backed` |
|
|
59
|
+
| `feat-implement` | `[]` | `implementation-report.md` | `checkout_changes` on `changed_files` |
|
|
60
|
+
| `feat-review` | `[]` | `review.md` | — |
|
|
61
|
+
| `feat-address-feedback` | `[]` | `review-feedback-report.md` | — |
|
|
62
|
+
| `feat-ship` | `[artifact_backed]` | `ship-package.md`, `pull-request.md` | `gate` `artifact_backed` |
|
|
63
|
+
|
|
64
|
+
`feat-implement`'s `checkout_changes` check (with `path_fields: [changed_files]`)
|
|
65
|
+
compares the checkout before and after the attempt and rejects a success emit
|
|
66
|
+
if `changed_files` is non-empty but the checkout never actually changed, or if
|
|
67
|
+
any listed path is not a real checkout-relative change. `feat-plan` and
|
|
68
|
+
`feat-ship` each also carry a `gate` verify item of kind `artifact_backed`, so
|
|
69
|
+
their `ask_operator` approval is independently verified, not just
|
|
70
|
+
self-reported. See [Verified Stage Execution](../../docs/verified-stage-execution.md)
|
|
71
|
+
and [YAML catalog — Verify](../../docs/yaml-catalog.md#verify).
|
|
72
|
+
|
|
73
|
+
it must partition the diff into two to four independent review assignments
|
|
74
|
+
and fan them out; it cannot skip review or hand it to a single clone.
|
|
75
|
+
`feat-review` `io.input` is an empty object so it stays a subset of
|
|
76
|
+
`feat-implement` `io.output`. See
|
|
77
|
+
|
|
78
|
+
Every stage but `feat-ship` uses `on_verify_fail: { mode: repair, max_attempts: 3,
|
|
79
|
+
retry_safety: idempotent, include_failed_checks: true }` on the pipeline
|
|
80
|
+
entry, so an after-phase verify failure starts a fresh attempt with the
|
|
81
|
+
failed-check evidence carried forward, up to three attempts. `feat-ship` uses
|
|
82
|
+
`on_verify_fail: { mode: manual, retry_safety: side_effecting }` instead,
|
|
83
|
+
because it publishes: a failed after-phase check there leaves the stage failed
|
|
84
|
+
until an operator explicitly retries or stops via `on_verify_fail` manual
|
|
85
|
+
handling. See
|
|
86
|
+
[Verified Stage Execution — Recovery policy](../../docs/verified-stage-execution.md#recovery-policy).
|
|
87
|
+
|
|
88
|
+
### Review feedback has no loop in this catalog
|
|
89
|
+
|
|
90
|
+
Loops exist via `{ type: loop }` on `route` (see
|
|
91
|
+
[`examples/feedback-loop/`](../feedback-loop/)). This pipeline does not use
|
|
92
|
+
one. If `feat-review` finds a blocking problem, the run does not resume
|
|
93
|
+
`feat-implement`. `feat-address-feedback` is the accommodation: a single
|
|
94
|
+
fixup stage after review and before shipping that addresses every blocking
|
|
95
|
+
finding — sweeping for other instances of the same category of problem, not
|
|
96
|
+
only the ones a reviewer happened to cite — then hands off to `feat-ship`,
|
|
97
|
+
which independently re-checks the fix before accepting it. It cannot get a
|
|
98
|
+
fresh review of its own fix, though: if its patch introduces something new,
|
|
99
|
+
`feat-ship`'s fail-closed check is the backstop, and the operator has to
|
|
100
|
+
intervene by hand — see [`sf runs retry`](../../docs/cli-reference.md), which
|
|
101
|
+
can retry a succeeded stage in place and reset everything downstream.
|
|
102
|
+
|
|
103
|
+
## Prepare a worktree
|
|
104
|
+
|
|
105
|
+
This pipeline expects to run against a checkout that is **already** on a
|
|
106
|
+
dedicated feature branch — no stage creates, renames, or switches a branch.
|
|
107
|
+
A `git worktree` keeps that branch isolated from whatever else you have
|
|
108
|
+
checked out in your primary clone of the target repository:
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
cd /path/to/your/repo
|
|
112
|
+
git fetch origin
|
|
113
|
+
git worktree add ../your-repo-feature-branch -b your-feature-branch origin/main
|
|
114
|
+
cd ../your-repo-feature-branch
|
|
115
|
+
npm install # or the target repository's equivalent bootstrap command
|
|
116
|
+
git status --short
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Point the task's `checkout` field at that worktree's absolute path. When the
|
|
120
|
+
run finishes (or if it fails partway through), remove the worktree with
|
|
121
|
+
`git worktree remove ../your-repo-feature-branch` from the main clone once
|
|
122
|
+
you no longer need it.
|
|
123
|
+
|
|
124
|
+
## Create a task
|
|
125
|
+
|
|
126
|
+
Task context is the pipeline's portable feature brief. Include enough detail
|
|
127
|
+
that `feat-plan` can ground a real plan in the actual repository rather than
|
|
128
|
+
re-deriving requirements from a one-line goal:
|
|
129
|
+
|
|
130
|
+
```yaml
|
|
131
|
+
id: my-feature
|
|
132
|
+
goal: >
|
|
133
|
+
Describe the concrete, scoped change to ship, ending in an
|
|
134
|
+
operator-approved pull request against <owner>/<repo>.
|
|
135
|
+
context: |
|
|
136
|
+
Name the exact files and symbols involved, the existing conventions to
|
|
137
|
+
follow (test style, doc sections to update), and the ship target: which
|
|
138
|
+
repository, which base branch, and which branch the checkout is already on.
|
|
139
|
+
constraints: |
|
|
140
|
+
Do not create, rename, or switch branches — the checkout is already on the
|
|
141
|
+
correct branch.
|
|
142
|
+
Do not commit, push, or open a pull request in any stage except feat-ship.
|
|
143
|
+
checkout: /absolute/path/to/your-repo-feature-branch
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
[`ship-feature.task.yaml`](ship-feature.task.yaml) is a complete example: it
|
|
147
|
+
targets this same Stageflow repository, adding `pattern`, `minLength`,
|
|
148
|
+
`maxLength`, and `nullable` support to `src/envelope/payloadSchema.ts`
|
|
149
|
+
against a worktree on branch `demo/richer-payload-schema-constraints`.
|
|
150
|
+
|
|
151
|
+
## Run
|
|
152
|
+
|
|
153
|
+
From any directory with Stageflow installed:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
sf validate \
|
|
157
|
+
--pipeline /path/to/stageflow/examples/ship-feature/ship-feature.pipeline.yaml \
|
|
158
|
+
--strict
|
|
159
|
+
|
|
160
|
+
sf run \
|
|
161
|
+
--pipeline /path/to/stageflow/examples/ship-feature/ship-feature.pipeline.yaml \
|
|
162
|
+
--task /path/to/my-feature.task.yaml
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
`feat-ship` pushes the checkout's current branch and opens the pull request
|
|
166
|
+
as soon as the operator accepts its `artifact_backed` gate — there is no
|
|
167
|
+
dry-run mode and no extra flag. `gh` must be on `PATH` and authenticated
|
|
168
|
+
(`GH_TOKEN` or `GITHUB_TOKEN`) before you accept, or the publish step will
|
|
169
|
+
fail after approval.
|
|
170
|
+
|
|
171
|
+
Run `sf ui` in another terminal to inspect envelopes, artifacts, clone
|
|
172
|
+
fan-out, and answer the two artifact-backed gates.
|
|
173
|
+
|
|
174
|
+
## Safety and interpretation
|
|
175
|
+
|
|
176
|
+
- Plan approval authorizes only local edits in the task checkout.
|
|
177
|
+
- Review clones always complete successfully and carry `pass` or
|
|
178
|
+
`changes_required` in their payload, so `feat-address-feedback` sees every
|
|
179
|
+
review even when some pass and some don't.
|
|
180
|
+
- Any blocking review that survives `feat-address-feedback` fails the final
|
|
181
|
+
stage closed — `feat-ship` cross-checks `addressed_all_blocking` against
|
|
182
|
+
the original `blocking_findings` rather than trusting the fixup stage's
|
|
183
|
+
own claim.
|
|
184
|
+
- The operator's accept through `feat-ship`'s `artifact_backed` gate is the
|
|
185
|
+
only authorization to publish, and it happens moments before the stage
|
|
186
|
+
runs `git push` / `gh pr create` in the same session — there is no
|
|
187
|
+
separate flag and no second chance to reconsider after accepting.
|
|
188
|
+
- No stage creates, renames, or switches a branch. If the checkout is not
|
|
189
|
+
already on the intended feature branch when the run starts, fix that
|
|
190
|
+
before running — the pipeline will not do it for you.
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
id: feat-address-feedback
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Address every blocking finding from feat-review before the ship package is
|
|
4
|
+
assembled. There is no automatic path back to feat-implement in this
|
|
5
|
+
pipeline, and this is the only stage positioned to edit the checkout after
|
|
6
|
+
review — treat that as the reason this stage exists, not as license to
|
|
7
|
+
rewrite the implementation. This stage is the last-mile fixup for what
|
|
8
|
+
reviewers found, not a second implementation pass.
|
|
9
|
+
|
|
10
|
+
Reading upstream evidence. The user prompt contains a line
|
|
11
|
+
"Factory run workspace: <absolute path>". Prior artifacts arrive in the
|
|
12
|
+
prior envelope's artifacts[] as run-relative paths; read each one at
|
|
13
|
+
<Factory run workspace>/<artifact path>. Every feat-review envelope's
|
|
14
|
+
payload (review_id, verdict, blocking_findings) and its review.md are
|
|
15
|
+
authoritative; implementation-report.md gives the context needed to make a
|
|
16
|
+
correct, narrow fix. Prose summaries are secondary.
|
|
17
|
+
|
|
18
|
+
Definition of done — every line must hold before you emit success:
|
|
19
|
+
- Every feat-review envelope and its review.md have been read.
|
|
20
|
+
- If every verdict is pass: the checkout is untouched, fixed_files is
|
|
21
|
+
empty, and addressed_all_blocking is true.
|
|
22
|
+
- If any verdict is changes_required: every entry in every review's
|
|
23
|
+
blocking_findings has been addressed, not only the specific file/line
|
|
24
|
+
reviewers happened to cite — search for every other instance of the same
|
|
25
|
+
category of problem (for example, every other call site with the same
|
|
26
|
+
missing validation, or every other test still asserting the old
|
|
27
|
+
behavior) and fix those too. A reviewer's citation is a sample of the
|
|
28
|
+
problem, not its full extent.
|
|
29
|
+
- git diff in the checkout is non-empty whenever any verdict was
|
|
30
|
+
changes_required; the emit is rejected if you claim to have addressed a
|
|
31
|
+
blocking finding while the working tree is clean.
|
|
32
|
+
- Every fixed_files entry is a repo-relative path inside the checkout that
|
|
33
|
+
also appears in git diff --name-only; the emit is rejected for any entry
|
|
34
|
+
pointing into the factory run workspace.
|
|
35
|
+
- Every check a blocking finding cited as failing has been re-run here and
|
|
36
|
+
now passes; verification_commands records each with its result.
|
|
37
|
+
- review-feedback-report.md was written through write_stage_artifact and
|
|
38
|
+
appears in the emitted artifacts list; the emit is rejected without it.
|
|
39
|
+
|
|
40
|
+
1. Read every feat-review envelope and review.md via the recipe
|
|
41
|
+
above. If every verdict is pass, skip to step 5 with nothing to fix.
|
|
42
|
+
2. For each changes_required review, read every blocking_findings entry
|
|
43
|
+
and its remediation guidance. Do not re-litigate a pass verdict or
|
|
44
|
+
reopen non-blocking findings or suggestions — those are out of scope
|
|
45
|
+
here.
|
|
46
|
+
3. Fix each blocking finding at its cited location, then search the rest
|
|
47
|
+
of the checkout for other instances of the same category of problem and
|
|
48
|
+
fix those too (see Definition of done). Do not perform unrelated
|
|
49
|
+
formatting, refactors, or scope expansion beyond what the findings
|
|
50
|
+
require. Do not 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. Call write_stage_artifact with path review-feedback-report.md listing
|
|
57
|
+
every blocking finding, whether it was addressed (with the fix location
|
|
58
|
+
and the passing re-run), or that there was nothing to address because
|
|
59
|
+
every verdict was pass.
|
|
60
|
+
6. Emit exactly once, including review-feedback-report.md and all
|
|
61
|
+
inherited evidence artifacts, with a payload matching the schema.
|
|
62
|
+
|
|
63
|
+
Contract violations — emit failure rather than presenting these as
|
|
64
|
+
success:
|
|
65
|
+
- addressed_all_blocking: true while any blocking_findings entry remains
|
|
66
|
+
unaddressed or unverified.
|
|
67
|
+
- Fixing only the literal file/line a reviewer cited when the same
|
|
68
|
+
category of problem exists elsewhere in the diff.
|
|
69
|
+
- Emitting success while git diff is empty and any verdict was
|
|
70
|
+
changes_required.
|
|
71
|
+
- A fixed_files entry under stages/.../artifacts/ or anywhere else in the
|
|
72
|
+
factory run workspace.
|
|
73
|
+
- Editing anything outside the scope of a blocking finding.
|
|
74
|
+
- verification_commands listing commands you did not execute.
|
|
75
|
+
|
|
76
|
+
Never commit, push, or open a pull request.
|
|
77
|
+
|
|
78
|
+
Write summary as outcomes and resulting state for feat-ship: which
|
|
79
|
+
blocking findings existed, what changed to address them, and confirmation
|
|
80
|
+
every cited check now passes (or, on failure, what remains open).
|
|
81
|
+
Downstream stages receive this summary verbatim and can mistake it for
|
|
82
|
+
their own instructions, so never restate this stage's prohibitions or
|
|
83
|
+
scope limits in it.
|
|
84
|
+
model: omniroute/auto
|
|
85
|
+
io:
|
|
86
|
+
input:
|
|
87
|
+
schema:
|
|
88
|
+
type: object
|
|
89
|
+
output:
|
|
90
|
+
schema:
|
|
91
|
+
type: object
|
|
92
|
+
required:
|
|
93
|
+
- addressed_all_blocking
|
|
94
|
+
- fixed_files
|
|
95
|
+
- verification_commands
|
|
96
|
+
- remaining_risks
|
|
97
|
+
properties:
|
|
98
|
+
addressed_all_blocking:
|
|
99
|
+
type: boolean
|
|
100
|
+
fixed_files:
|
|
101
|
+
type: array
|
|
102
|
+
items:
|
|
103
|
+
type: string
|
|
104
|
+
verification_commands:
|
|
105
|
+
type: array
|
|
106
|
+
items:
|
|
107
|
+
type: string
|
|
108
|
+
remaining_risks:
|
|
109
|
+
type: array
|
|
110
|
+
items:
|
|
111
|
+
type: string
|
|
112
|
+
verify:
|
|
113
|
+
- id: review-feedback-report
|
|
114
|
+
type: artifact
|
|
115
|
+
path: review-feedback-report.md
|
|
116
|
+
nonempty: true
|
|
117
|
+
when:
|
|
118
|
+
- after
|
|
119
|
+
gate_kinds: []
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
id: feat-implement
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Edit the checkout so the accepted plan is fully implemented and every one
|
|
4
|
+
of its validation_commands passes — not just the commands you find
|
|
5
|
+
convenient. Modified files under the project checkout are the only
|
|
6
|
+
acceptable output of this stage; no map, excerpt, document, or report can
|
|
7
|
+
substitute for them. If the plan calls for test coverage, write it here —
|
|
8
|
+
there is no separate stage that writes tests before this one.
|
|
9
|
+
|
|
10
|
+
You own the whole loop: implement, run the plan's full validation_commands,
|
|
11
|
+
and if anything fails, diagnose and fix it and run them again. Repeat until
|
|
12
|
+
every command passes or you have a concrete, evidence-backed reason further
|
|
13
|
+
iteration in this attempt will not help. This stage is the only one with
|
|
14
|
+
edit access to the checkout — nothing downstream can fix what you leave
|
|
15
|
+
broken, so do not hand off a partially-green result as success.
|
|
16
|
+
|
|
17
|
+
Reading upstream work: the prior envelope's artifacts[] holds run-relative
|
|
18
|
+
paths. Read each one at <Factory run workspace>/<artifact path>, using the
|
|
19
|
+
absolute "Factory run workspace" value given in this stage's user prompt.
|
|
20
|
+
implementation-plan.md is the authoritative approved scope — its
|
|
21
|
+
validation_commands list is the actual definition of done, not a
|
|
22
|
+
suggestion — and it outranks any prose in the prior envelope's summary.
|
|
23
|
+
That summary describes the PREVIOUS stage: any prohibition it carries, for
|
|
24
|
+
example "no source edits", applied to that stage and does not apply here.
|
|
25
|
+
|
|
26
|
+
Definition of done — every line must hold before you emit success:
|
|
27
|
+
- git diff in the checkout is non-empty and contains your edits; the emit
|
|
28
|
+
is rejected while the working tree is clean.
|
|
29
|
+
- Every changed_files entry is a repo-relative path inside the checkout
|
|
30
|
+
that also appears in git diff --name-only; the emit is rejected for any
|
|
31
|
+
entry pointing into the factory run workspace.
|
|
32
|
+
- Every command in implementation-plan.md's validation_commands has been
|
|
33
|
+
run here, in order, with its exit code recorded, and every one exited
|
|
34
|
+
zero. all_passed is true only when that is actually the case.
|
|
35
|
+
- implementation-report.md was written through write_stage_artifact and
|
|
36
|
+
appears in the emitted artifacts list; the emit is rejected without it.
|
|
37
|
+
- commands_run lists only commands you actually executed, each with its
|
|
38
|
+
outcome — the full validation_commands list plus anything else you ran
|
|
39
|
+
while diagnosing failures.
|
|
40
|
+
|
|
41
|
+
1. Resolve implementation-plan.md from the prior envelope's artifacts[]
|
|
42
|
+
against the Factory run workspace absolute path and read it. If it
|
|
43
|
+
cannot be read, emit failure — do not substitute a plan you re-derived
|
|
44
|
+
yourself.
|
|
45
|
+
2. Edit the source files — and add any test files
|
|
46
|
+
implementation-plan.md's validation_commands require that do not exist
|
|
47
|
+
yet — to satisfy the accepted plan. Do not perform unrelated
|
|
48
|
+
formatting, refactors, dependency upgrades, generated-file changes, or
|
|
49
|
+
scope expansion beyond what the plan describes.
|
|
50
|
+
3. Run every command in implementation-plan.md's validation_commands, in
|
|
51
|
+
order, recording exit code and a stdout tail for each.
|
|
52
|
+
4. If any command fails, treat that as unfinished work, not a report
|
|
53
|
+
footnote: diagnose the specific cause, make the corresponding source or
|
|
54
|
+
test edit, and return to step 3. Do not move on while a
|
|
55
|
+
validation_commands entry is red.
|
|
56
|
+
5. Once every command passes, run git status --porcelain and git diff
|
|
57
|
+
--stat in the checkout and inspect the complete diff. If either output
|
|
58
|
+
is empty, this stage has not done its job: return to step 2 or emit
|
|
59
|
+
failure.
|
|
60
|
+
6. Call write_stage_artifact with path implementation-report.md containing
|
|
61
|
+
the verbatim non-empty git diff --stat and git status --porcelain
|
|
62
|
+
output, the files changed, before/after behavior, every validation
|
|
63
|
+
command with its result, how many iterations it took, assumptions, and
|
|
64
|
+
any deviation from the plan.
|
|
65
|
+
7. Partition the resulting diff into two to four independent,
|
|
66
|
+
non-overlapping review assignments (for example: correctness and edge
|
|
67
|
+
cases, test quality and coverage, and — only when the diff materially
|
|
68
|
+
involves compatibility, security, or public API surface — a scope and
|
|
69
|
+
compatibility assignment). Each assignment needs a review_id,
|
|
70
|
+
objective, the concrete repo-relative paths it owns (taken from the
|
|
71
|
+
actual diff, not guessed), specific questions a reviewer can answer by
|
|
72
|
+
reading those paths, and constraints. Scopes must not overlap and must
|
|
73
|
+
collectively cover every changed file.
|
|
74
|
+
8. Emit exactly once, including implementation-report.md and all inherited
|
|
75
|
+
evidence artifacts, with a payload matching the schema, and the
|
|
76
|
+
definition-of-done line holds; otherwise emit failure while preserving
|
|
77
|
+
the working-tree evidence for the operator, and record in the summary
|
|
78
|
+
exactly which validation_commands entries remain red and why. On
|
|
79
|
+
|
|
80
|
+
Contract violations — emit failure rather than presenting these as
|
|
81
|
+
success:
|
|
82
|
+
- Emitting success while git diff in the checkout is empty.
|
|
83
|
+
- Emitting success while any validation_commands entry has not been run,
|
|
84
|
+
was skipped, or exited non-zero. all_passed: true when that is not the
|
|
85
|
+
case is a contract violation, not a reporting choice.
|
|
86
|
+
- A changed_files entry under stages/.../artifacts/ or anywhere else in
|
|
87
|
+
the factory run workspace. Such a path is never a valid entry.
|
|
88
|
+
- commands_run listing commands you did not execute.
|
|
89
|
+
- Treating a markdown map, excerpt file, or report as the deliverable.
|
|
90
|
+
Exploration-only completion is a failure of this stage.
|
|
91
|
+
four clones, overlapping scopes, or an assignment with empty paths or
|
|
92
|
+
questions.
|
|
93
|
+
|
|
94
|
+
only — skipping review is not permitted.
|
|
95
|
+
|
|
96
|
+
Write summary as outcomes and resulting state for downstream stages: what
|
|
97
|
+
now differs in the checkout, which tests cover it, confirmation that every
|
|
98
|
+
validation command passed, and which review scopes were assigned and why.
|
|
99
|
+
Downstream stages receive this summary verbatim and can mistake it for
|
|
100
|
+
their own instructions, so never restate this stage's prohibitions or
|
|
101
|
+
scope limits in it.
|
|
102
|
+
model: omniroute/auto
|
|
103
|
+
timeout_ms: 3600000
|
|
104
|
+
io:
|
|
105
|
+
input:
|
|
106
|
+
schema:
|
|
107
|
+
type: object
|
|
108
|
+
required:
|
|
109
|
+
- approved
|
|
110
|
+
- scope_summary
|
|
111
|
+
- planned_files
|
|
112
|
+
- validation_commands
|
|
113
|
+
- risks
|
|
114
|
+
properties:
|
|
115
|
+
approved:
|
|
116
|
+
type: boolean
|
|
117
|
+
scope_summary:
|
|
118
|
+
type: string
|
|
119
|
+
planned_files:
|
|
120
|
+
type: array
|
|
121
|
+
items:
|
|
122
|
+
type: string
|
|
123
|
+
validation_commands:
|
|
124
|
+
type: array
|
|
125
|
+
items:
|
|
126
|
+
type: string
|
|
127
|
+
risks:
|
|
128
|
+
type: array
|
|
129
|
+
items:
|
|
130
|
+
type: string
|
|
131
|
+
output:
|
|
132
|
+
schema:
|
|
133
|
+
type: object
|
|
134
|
+
required:
|
|
135
|
+
- changed_files
|
|
136
|
+
- implementation_summary
|
|
137
|
+
- tests_added
|
|
138
|
+
- commands_run
|
|
139
|
+
- all_passed
|
|
140
|
+
- review_count
|
|
141
|
+
- review_strategy
|
|
142
|
+
properties:
|
|
143
|
+
changed_files:
|
|
144
|
+
type: array
|
|
145
|
+
minItems: 1
|
|
146
|
+
items:
|
|
147
|
+
type: string
|
|
148
|
+
implementation_summary:
|
|
149
|
+
type: string
|
|
150
|
+
tests_added:
|
|
151
|
+
type: array
|
|
152
|
+
items:
|
|
153
|
+
type: string
|
|
154
|
+
commands_run:
|
|
155
|
+
type: array
|
|
156
|
+
minItems: 1
|
|
157
|
+
items:
|
|
158
|
+
type: string
|
|
159
|
+
all_passed:
|
|
160
|
+
type: boolean
|
|
161
|
+
review_count:
|
|
162
|
+
type: integer
|
|
163
|
+
minimum: 2
|
|
164
|
+
maximum: 4
|
|
165
|
+
review_strategy:
|
|
166
|
+
type: string
|
|
167
|
+
verify:
|
|
168
|
+
- id: implementation-report
|
|
169
|
+
type: artifact
|
|
170
|
+
path: implementation-report.md
|
|
171
|
+
nonempty: true
|
|
172
|
+
when:
|
|
173
|
+
- after
|
|
174
|
+
- id: checkout-changed
|
|
175
|
+
type: checkout_changes
|
|
176
|
+
path_fields:
|
|
177
|
+
- changed_files
|
|
178
|
+
when:
|
|
179
|
+
- after
|
|
180
|
+
gate_kinds: []
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
id: feat-plan
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Write implementation-plan.md as a mechanical checklist the implement stage
|
|
4
|
+
can execute, and get explicit operator approval of it before any source
|
|
5
|
+
edit happens anywhere in this pipeline. This stage is the only planner —
|
|
6
|
+
there is no separate proposal stage before it and no separate approval
|
|
7
|
+
stage after it, so both concerns live here.
|
|
8
|
+
|
|
9
|
+
Reading the task. There is no prior stage in this pipeline; the task goal,
|
|
10
|
+
context, and constraints are the only input. Read the actual repository at
|
|
11
|
+
the checkout path in this stage's user prompt — the files the task names,
|
|
12
|
+
their neighbors, and any docs the task points at — rather than planning
|
|
13
|
+
from the task text alone. A plan that restates the goal without grounding
|
|
14
|
+
it in the real files is not done.
|
|
15
|
+
|
|
16
|
+
Definition of done — every line must hold before you emit success:
|
|
17
|
+
- implementation-plan.md was written through write_stage_artifact and
|
|
18
|
+
appears in the emitted artifacts list; the emit is rejected without it.
|
|
19
|
+
- The plan names the exact files to touch, the exact symbol or region at
|
|
20
|
+
each edit site, and the exact validation commands to run — copied
|
|
21
|
+
verbatim from this repository's own scripts (for example package.json),
|
|
22
|
+
never invented or guessed.
|
|
23
|
+
- If the task's goal implies new behavior needs test coverage, the plan
|
|
24
|
+
says so explicitly and names where that coverage belongs; it does not
|
|
25
|
+
silently omit tests.
|
|
26
|
+
- The operator explicitly accepted the plan through the artifact_backed
|
|
27
|
+
gate, and that accepted decision is recorded verbatim inside
|
|
28
|
+
implementation-plan.md.
|
|
29
|
+
- approved is true only after that explicit accept; planned_files and
|
|
30
|
+
validation_commands are non-empty and concrete.
|
|
31
|
+
|
|
32
|
+
1. Read the task goal, context, and constraints. Read every file the task
|
|
33
|
+
names and enough of their neighbors to ground a real plan — the current
|
|
34
|
+
shape of the code to change, the existing test style to match, and any
|
|
35
|
+
doc sections that need updating alongside the code.
|
|
36
|
+
2. Call write_stage_artifact with path implementation-plan.md containing:
|
|
37
|
+
the root cause or approach in plain terms, each file to edit with the
|
|
38
|
+
symbol/region of the edit site and the minimal change intended there,
|
|
39
|
+
the exact validation commands to run in the checkout (verified against
|
|
40
|
+
this repo's own script names, not guessed), any test coverage the plan
|
|
41
|
+
requires, and risks or open questions worth flagging before
|
|
42
|
+
implementation starts.
|
|
43
|
+
3. Call ask_operator with kind artifact_backed referencing that artifact.
|
|
44
|
+
Ask whether to approve the exact scope for implementation.
|
|
45
|
+
4. On rejection or requested changes, revise the artifact and ask again.
|
|
46
|
+
5. After explicit acceptance, rewrite implementation-plan.md to include an
|
|
47
|
+
operator-decision section holding the accepted decision, the operator's
|
|
48
|
+
wording, and any conditions attached. The HITL question-and-answer
|
|
49
|
+
trail is not replayed into downstream prompts, so this artifact is the
|
|
50
|
+
only durable record the implement stage can read.
|
|
51
|
+
6. Emit exactly one envelope, including implementation-plan.md, with a
|
|
52
|
+
payload matching the schema. Emit success only after explicit
|
|
53
|
+
acceptance. If the operator declines, emit failure with a concise
|
|
54
|
+
reason.
|
|
55
|
+
|
|
56
|
+
Contract violations — do not present these as success:
|
|
57
|
+
- approved: true without an explicit operator accept, or interpreting
|
|
58
|
+
silence as approval.
|
|
59
|
+
- planned_files or validation_commands left empty, generic, or expressed
|
|
60
|
+
as intent rather than concrete paths and runnable commands.
|
|
61
|
+
- A validation command you did not verify exists in this repository (check
|
|
62
|
+
package.json or the equivalent script manifest before naming one).
|
|
63
|
+
- A plan that describes the problem without naming exact edit sites.
|
|
64
|
+
|
|
65
|
+
Never edit source files in this stage. Never commit, push, or open a pull
|
|
66
|
+
request.
|
|
67
|
+
|
|
68
|
+
Write summary as outcomes and resulting state for downstream stages: what
|
|
69
|
+
the approved scope is, which artifact carries the checklist, and what the
|
|
70
|
+
operator accepted. The implement stage receives this summary verbatim and
|
|
71
|
+
can mistake it for its own instructions, so never put this stage's own
|
|
72
|
+
prohibitions or scope limits in it — in particular, no "no source edits"
|
|
73
|
+
language, which applies here and not downstream.
|
|
74
|
+
model: omniroute/auto
|
|
75
|
+
timeout_ms: 3600000
|
|
76
|
+
io:
|
|
77
|
+
input:
|
|
78
|
+
schema:
|
|
79
|
+
type: object
|
|
80
|
+
output:
|
|
81
|
+
schema:
|
|
82
|
+
type: object
|
|
83
|
+
required:
|
|
84
|
+
- approved
|
|
85
|
+
- scope_summary
|
|
86
|
+
- planned_files
|
|
87
|
+
- validation_commands
|
|
88
|
+
- risks
|
|
89
|
+
properties:
|
|
90
|
+
approved:
|
|
91
|
+
type: boolean
|
|
92
|
+
scope_summary:
|
|
93
|
+
type: string
|
|
94
|
+
planned_files:
|
|
95
|
+
type: array
|
|
96
|
+
items:
|
|
97
|
+
type: string
|
|
98
|
+
validation_commands:
|
|
99
|
+
type: array
|
|
100
|
+
items:
|
|
101
|
+
type: string
|
|
102
|
+
risks:
|
|
103
|
+
type: array
|
|
104
|
+
items:
|
|
105
|
+
type: string
|
|
106
|
+
verify:
|
|
107
|
+
- id: plan-approved
|
|
108
|
+
type: gate
|
|
109
|
+
kind: artifact_backed
|
|
110
|
+
when:
|
|
111
|
+
- emit
|
|
112
|
+
- after
|
|
113
|
+
- id: implementation-plan
|
|
114
|
+
type: artifact
|
|
115
|
+
path: implementation-plan.md
|
|
116
|
+
nonempty: true
|
|
117
|
+
when:
|
|
118
|
+
- after
|
|
119
|
+
gate_kinds:
|
|
120
|
+
- artifact_backed
|