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,20 @@
|
|
|
1
|
+
id: fork-demo
|
|
2
|
+
stages:
|
|
3
|
+
- id: decide
|
|
4
|
+
uses: ./decide.yaml
|
|
5
|
+
entry: true
|
|
6
|
+
route:
|
|
7
|
+
- to: branch-a
|
|
8
|
+
if:
|
|
9
|
+
field: branch
|
|
10
|
+
op: eq
|
|
11
|
+
value: branch-a
|
|
12
|
+
- to: branch-b
|
|
13
|
+
if:
|
|
14
|
+
field: branch
|
|
15
|
+
op: eq
|
|
16
|
+
value: branch-b
|
|
17
|
+
- id: branch-a
|
|
18
|
+
uses: ./branch-a.yaml
|
|
19
|
+
- id: branch-b
|
|
20
|
+
uses: ./branch-b.yaml
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
id: fork-demo
|
|
2
|
+
goal: |
|
|
3
|
+
Operator chooses branch-a or branch-b at the decide gate; the pipeline routes
|
|
4
|
+
to that branch and skips the other.
|
|
5
|
+
context: |
|
|
6
|
+
Manual HITL then Route if walkthrough. At decide, answer the free_text gate
|
|
7
|
+
with exactly branch-a or branch-b. The chosen branch should succeed; the other
|
|
8
|
+
should be skipped.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# context7-mcp
|
|
2
|
+
|
|
3
|
+
Three-stage walkthrough: **resolve a library**, **fetch docs**, then **write a brief**, using Context7 MCP (`https://mcp.context7.com/mcp`) from git-root `.mcp.json`.
|
|
4
|
+
|
|
5
|
+
Each MCP stage is a **fresh Pi session**. Stage 1 cannot leave a live Context7 connection for stage 2. The `library_id` travels in the envelope; stage 2 calls `query-docs`. Stage 3 has **no** `mcp:` list — it only turns the excerpt into an artifact.
|
|
6
|
+
|
|
7
|
+
| Stage | MCP | What it does |
|
|
8
|
+
|-------|-----|----------------|
|
|
9
|
+
| `resolve-library` | `context7` | `resolve-library-id` → emit `library_id` |
|
|
10
|
+
| `fetch-docs` | `context7` | `query-docs` → `docs.md` + `excerpt` |
|
|
11
|
+
| `write-brief` | — | `brief.md` from the excerpt (no MCP) |
|
|
12
|
+
|
|
13
|
+
## Prerequisites
|
|
14
|
+
|
|
15
|
+
- Node.js ≥ 20 and this repo's CLI (`npm run build`), not an older global `sf`
|
|
16
|
+
- Provider auth (`sf ui` → Settings → Providers)
|
|
17
|
+
- `CONTEXT7_API_KEY` in the environment of the `sf run` / `sf ui` process (free key at [context7.com/dashboard](https://context7.com/dashboard)). The catalog interpolates `Authorization: Bearer ${CONTEXT7_API_KEY}`. `sf validate` does not require the var; the run does.
|
|
18
|
+
|
|
19
|
+
Git-root `.mcp.json` already names `context7`. Stages still pass `mcp: [context7]` — listing it in the catalog is not attach.
|
|
20
|
+
|
|
21
|
+
Optional: Settings → **Project MCP servers** → Check `context7` before the run.
|
|
22
|
+
|
|
23
|
+
## Run (repo root)
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
export CONTEXT7_API_KEY=... # from context7.com/dashboard
|
|
27
|
+
npm run build
|
|
28
|
+
node dist/cli.js validate --pipeline examples/context7-mcp/context7-mcp.pipeline.yaml --strict
|
|
29
|
+
node dist/cli.js run \
|
|
30
|
+
--pipeline examples/context7-mcp/context7-mcp.pipeline.yaml \
|
|
31
|
+
--task examples/context7-mcp/context7-mcp.task.yaml
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Inspect:
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
node dist/cli.js envelope get --run <runId> --stage resolve-library --json
|
|
38
|
+
node dist/cli.js envelope get --run <runId> --stage fetch-docs --json
|
|
39
|
+
node dist/cli.js envelope get --run <runId> --stage write-brief --json
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
The operator-facing write-up is the `write-brief` Files row `brief.md`.
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
id: context7-mcp
|
|
2
|
+
stages:
|
|
3
|
+
- id: resolve-library
|
|
4
|
+
entry: true
|
|
5
|
+
route:
|
|
6
|
+
- to: fetch-docs
|
|
7
|
+
uses: ./resolve-library.yaml
|
|
8
|
+
mcp: [context7]
|
|
9
|
+
- id: fetch-docs
|
|
10
|
+
route:
|
|
11
|
+
- to: write-brief
|
|
12
|
+
uses: ./fetch-docs.yaml
|
|
13
|
+
mcp: [context7]
|
|
14
|
+
- id: write-brief
|
|
15
|
+
uses: ./write-brief.yaml
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
id: context7-mcp
|
|
2
|
+
goal: Look up how to register a GET route in Express, using current Context7 docs, then write a one-page brief.
|
|
3
|
+
context: Three-stage Context7 MCP walkthrough. Resolve a library id, fetch docs, then write a brief without MCP. Each MCP stage is a fresh session.
|
|
4
|
+
constraints: Use only the context7 server named on the stage. Do not call ask_operator. Do not invent APIs missing from the fetched docs.
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
id: fetch-docs
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Fetch current docs for the library_id from the prior resolve-library
|
|
4
|
+
envelope. This stage has a new Context7 MCP session. Call query-docs
|
|
5
|
+
with that libraryId and the task question. Do not call
|
|
6
|
+
resolve-library-id unless the id is unusable. Do not call ask_operator.
|
|
7
|
+
|
|
8
|
+
Write docs.md via write_stage_artifact with the retrieved snippets
|
|
9
|
+
(trimmed to what answers the question). Checkout write/edit does not
|
|
10
|
+
satisfy the artifact.
|
|
11
|
+
|
|
12
|
+
When finished, call emit_stage_envelope exactly once with status success,
|
|
13
|
+
artifacts ["docs.md"], a short summary, and payload
|
|
14
|
+
{ "library_id": "<id>", "query": "<question>", "excerpt": "<short answer
|
|
15
|
+
plus one code sample from the docs>" }. summary and payload are handed
|
|
16
|
+
downstream verbatim. State outcomes and artifact pointers only.
|
|
17
|
+
|
|
18
|
+
Your last tool call in this attempt must be emit_stage_envelope.
|
|
19
|
+
model: cursor/auto
|
|
20
|
+
io:
|
|
21
|
+
input:
|
|
22
|
+
schema:
|
|
23
|
+
type: object
|
|
24
|
+
required:
|
|
25
|
+
- library_id
|
|
26
|
+
- library_name
|
|
27
|
+
properties:
|
|
28
|
+
library_id:
|
|
29
|
+
type: string
|
|
30
|
+
library_name:
|
|
31
|
+
type: string
|
|
32
|
+
output:
|
|
33
|
+
schema:
|
|
34
|
+
type: object
|
|
35
|
+
required:
|
|
36
|
+
- library_id
|
|
37
|
+
- query
|
|
38
|
+
- excerpt
|
|
39
|
+
properties:
|
|
40
|
+
library_id:
|
|
41
|
+
type: string
|
|
42
|
+
query:
|
|
43
|
+
type: string
|
|
44
|
+
excerpt:
|
|
45
|
+
type: string
|
|
46
|
+
verify:
|
|
47
|
+
- id: docs
|
|
48
|
+
type: artifact
|
|
49
|
+
path: docs.md
|
|
50
|
+
nonempty: true
|
|
51
|
+
when:
|
|
52
|
+
- after
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
id: resolve-library
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Resolve the library named in the task with Context7 MCP. Call
|
|
4
|
+
resolve-library-id with libraryName and the task question as query.
|
|
5
|
+
Pick one libraryId (prefer an official high-reputation match). Do not
|
|
6
|
+
call query-docs. Do not call ask_operator.
|
|
7
|
+
|
|
8
|
+
When finished, call emit_stage_envelope exactly once with status success,
|
|
9
|
+
artifacts [], a short summary, and payload
|
|
10
|
+
{ "library_id": "<id like /org/project>", "library_name": "<name>" }.
|
|
11
|
+
summary and payload are handed to the next stage verbatim. State outcomes
|
|
12
|
+
only.
|
|
13
|
+
|
|
14
|
+
Your last tool call in this attempt must be emit_stage_envelope.
|
|
15
|
+
The next stage starts a fresh MCP session — pass the id in the envelope.
|
|
16
|
+
model: cursor/auto
|
|
17
|
+
io:
|
|
18
|
+
input:
|
|
19
|
+
schema:
|
|
20
|
+
type: object
|
|
21
|
+
output:
|
|
22
|
+
schema:
|
|
23
|
+
type: object
|
|
24
|
+
required:
|
|
25
|
+
- library_id
|
|
26
|
+
- library_name
|
|
27
|
+
properties:
|
|
28
|
+
library_id:
|
|
29
|
+
type: string
|
|
30
|
+
library_name:
|
|
31
|
+
type: string
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
id: write-brief
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Turn the fetch-docs envelope into a one-page operator brief. You do not
|
|
4
|
+
have Context7 MCP on this stage. Use payload.excerpt, library_id, and
|
|
5
|
+
query only. Do not invent APIs that are not in the excerpt. Do not call
|
|
6
|
+
ask_operator.
|
|
7
|
+
|
|
8
|
+
Write brief.md via write_stage_artifact: the question, the library id,
|
|
9
|
+
a short answer, and the code sample from the excerpt. Checkout write/edit
|
|
10
|
+
does not satisfy the artifact.
|
|
11
|
+
|
|
12
|
+
When finished, call emit_stage_envelope exactly once with status success,
|
|
13
|
+
artifacts ["brief.md"], a short summary, and payload
|
|
14
|
+
{ "library_id": "<id>", "brief_artifact": "brief.md" }. summary and
|
|
15
|
+
payload are handed downstream verbatim. State outcomes and artifact
|
|
16
|
+
pointers only.
|
|
17
|
+
|
|
18
|
+
Your last tool call in this attempt must be emit_stage_envelope.
|
|
19
|
+
model: cursor/auto
|
|
20
|
+
io:
|
|
21
|
+
input:
|
|
22
|
+
schema:
|
|
23
|
+
type: object
|
|
24
|
+
required:
|
|
25
|
+
- library_id
|
|
26
|
+
- query
|
|
27
|
+
- excerpt
|
|
28
|
+
properties:
|
|
29
|
+
library_id:
|
|
30
|
+
type: string
|
|
31
|
+
query:
|
|
32
|
+
type: string
|
|
33
|
+
excerpt:
|
|
34
|
+
type: string
|
|
35
|
+
output:
|
|
36
|
+
schema:
|
|
37
|
+
type: object
|
|
38
|
+
required:
|
|
39
|
+
- library_id
|
|
40
|
+
- brief_artifact
|
|
41
|
+
properties:
|
|
42
|
+
library_id:
|
|
43
|
+
type: string
|
|
44
|
+
brief_artifact:
|
|
45
|
+
type: string
|
|
46
|
+
verify:
|
|
47
|
+
- id: brief
|
|
48
|
+
type: artifact
|
|
49
|
+
path: brief.md
|
|
50
|
+
nonempty: true
|
|
51
|
+
when:
|
|
52
|
+
- after
|
|
@@ -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: []
|