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,151 @@
|
|
|
1
|
+
# generic-fan-in
|
|
2
|
+
|
|
3
|
+
Dummy catalog for **manual operator-console testing** of generic multi-parent
|
|
4
|
+
fan-in. `research` and `validation` run in parallel after `clarify`, pause on
|
|
5
|
+
a free-text gate, then emit distinct payloads. `synthesize` waits for both and
|
|
6
|
+
must copy `priorEnvelopesByStage` into `payload.received` so you can inspect
|
|
7
|
+
what was handed across the join.
|
|
8
|
+
|
|
9
|
+
Catalog wiring is outbound `route`: `research` and `validation` each list `to: synthesize`. Join rules (shipped runtime): the child waits until every parent is terminal; it **runs** if at least one parent succeeded (skipped siblings do not block); it stays **pending** if any parent failed (even when `on` lists `failed`); it force-skips only if every parent skipped. Including `failed` or `skipped` in `on:` opts that edge out of skip-cascade; it does not launch the Join from a failed parent.
|
|
10
|
+
|
|
11
|
+
Wiring matches the fixture twins: [`diamond-fan-in.pipeline.yaml`](../../tests/fixtures/pipelines/diamond-fan-in.pipeline.yaml) and [`diamond-fan-in-accepted.pipeline.yaml`](../../tests/fixtures/pipelines/diamond-fan-in-accepted.pipeline.yaml). See [`docs/yaml-catalog.md#generic-fan-in`](../../docs/yaml-catalog.md#generic-fan-in).
|
|
12
|
+
|
|
13
|
+
Two pipelines:
|
|
14
|
+
|
|
15
|
+
| Pipeline | What it exercises |
|
|
16
|
+
|----------|-------------------|
|
|
17
|
+
| `generic-fan-in` | Default succeeded-only edges into `synthesize` |
|
|
18
|
+
| `generic-fan-in-accepted` | Research edge `on: [succeeded, failed, skipped]` — still does **not** run the Join after research fails |
|
|
19
|
+
|
|
20
|
+
## Prerequisites
|
|
21
|
+
|
|
22
|
+
Use this repo's CLI (`npm run build` / `npm run dev`) or a Stageflow release
|
|
23
|
+
that includes generic fan-in. A globally installed `sf` from npm may lag.
|
|
24
|
+
|
|
25
|
+
- Node.js ≥ 20
|
|
26
|
+
- From repo root: `npm run build` and `npm run ui:build`
|
|
27
|
+
- Provider auth connected (`sf ui` → Settings → Providers). Stages use `cursor/auto`.
|
|
28
|
+
|
|
29
|
+
Run state lives in `<repo>/.stageflow` even if you start the console from a subdirectory.
|
|
30
|
+
|
|
31
|
+
## Terminal 1 — operator console
|
|
32
|
+
|
|
33
|
+
From the **repository git root**:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm run build
|
|
37
|
+
npm run ui:build
|
|
38
|
+
PI_CURSOR_SETTING_SOURCES=all STAGEFLOW_ACTIVITY_VERBOSE=1 node dist/cli.js ui
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
`npm run dev -- ui` runs the TypeScript CLI via tsx; use `node dist/cli.js ui` after `ui:build` so the console is served from `dist/ui`. Do not use a globally installed `sf` — Homebrew `sf` is an older build that cannot load this catalog.
|
|
42
|
+
|
|
43
|
+
Open `http://127.0.0.1:3847`. Browse should list **generic-fan-in** and **generic-fan-in-accepted** (same names as the YAML files).
|
|
44
|
+
|
|
45
|
+
## Terminal 2 — start a run (repo root)
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
node dist/cli.js validate --pipeline examples/generic-fan-in/generic-fan-in.pipeline.yaml --strict
|
|
49
|
+
node dist/cli.js run \
|
|
50
|
+
--pipeline examples/generic-fan-in/generic-fan-in.pipeline.yaml \
|
|
51
|
+
--task examples/generic-fan-in/generic-fan-in.task.yaml
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Exit code `2` means waiting on operator input. Leave this terminal; do the rest in the console.
|
|
55
|
+
|
|
56
|
+
Start a **new run** for each scenario below. Do not reuse a finished run.
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## Scenario A — both parents succeed (main envelope check)
|
|
61
|
+
|
|
62
|
+
At **research**, answer exactly:
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
ok glaciers
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
At **validation**, answer exactly:
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
ok citations
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
Order of answers does not matter. `synthesize` starts only after both succeed.
|
|
75
|
+
|
|
76
|
+
### What to verify
|
|
77
|
+
|
|
78
|
+
1. Track is a diamond: `clarify` fans out to **research** and **validation**, then both wires inbound into **synthesize**.
|
|
79
|
+
2. While only one parent is answered, select **synthesize**. It stays blocked. Copy / `blocked_by` lists the remaining parent, not only the first YAML parent.
|
|
80
|
+
3. After `research` succeeds, select it and open **Files → Handoff envelope** (or `#/runs/<runId>/stages/research/envelope`). Payload should have `finding: glaciers`.
|
|
81
|
+
4. After `validation` succeeds, open its handoff envelope. Payload should have `finding: citations`.
|
|
82
|
+
5. **synthesize** runs once both parents succeeded. Open its handoff envelope. Confirm:
|
|
83
|
+
- `payload.received` has keys `research` then `validation` (YAML declaration order, not the order you answered).
|
|
84
|
+
- `received.research.finding` is `glaciers` and `received.validation.finding` is `citations`.
|
|
85
|
+
- Summary mentions both parent keys and their success status.
|
|
86
|
+
6. From the repo root, you can also print the same records:
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
node dist/cli.js envelope get --run <runId> --stage research --json
|
|
90
|
+
node dist/cli.js envelope get --run <runId> --stage validation --json
|
|
91
|
+
node dist/cli.js envelope get --run <runId> --stage synthesize --json
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
`<runId>` is on the run detail URL (`#/runs/<runId>/…`) and in the run list.
|
|
95
|
+
|
|
96
|
+
The synthesize payload is the join copy of `priorEnvelopesByStage`. That field is keyed; it is not a clone-list `priorEnvelopes` array, and `priorEnvelope` is null on the join.
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Scenario B — failed parent leaves the join pending
|
|
101
|
+
|
|
102
|
+
New run of **generic-fan-in**. At research, answer:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
fail
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
At validation, answer:
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
ok citations
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### What to verify
|
|
115
|
+
|
|
116
|
+
1. **research** is failed (open its handoff envelope — failure status, no finding).
|
|
117
|
+
2. **validation** still finishes; its envelope is success with `citations`.
|
|
118
|
+
3. **synthesize** stays **pending** (not skip-cascaded). A failed parent blocks the Join.
|
|
119
|
+
4. Run outcome **failed**.
|
|
120
|
+
5. Open synthesize anyway: there is no join envelope. The Join did not receive `priorEnvelopesByStage`.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Scenario C — listing `failed` on `on:` still does not open the join
|
|
125
|
+
|
|
126
|
+
New run:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
node dist/cli.js run \
|
|
130
|
+
--pipeline examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml \
|
|
131
|
+
--task examples/generic-fan-in/generic-fan-in-accepted.task.yaml
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
At research, answer `fail`. At validation, answer `ok citations`.
|
|
135
|
+
|
|
136
|
+
### What to verify
|
|
137
|
+
|
|
138
|
+
1. **research** stays visibly **failed**. **validation** succeeds.
|
|
139
|
+
2. **synthesize** stays **pending**. Listing `failed` on the research edge only opts that edge out of skip-cascade; it does not launch `synthesize`.
|
|
140
|
+
3. Run outcome **failed**. Skipped siblings would not block a Join that has a succeeded parent; a **failed** parent still does.
|
|
141
|
+
|
|
142
|
+
---
|
|
143
|
+
|
|
144
|
+
## Envelope inspector (any scenario)
|
|
145
|
+
|
|
146
|
+
On a completed stage, the first Files row is **Handoff envelope**. It opens the
|
|
147
|
+
inspector (`#/runs/<runId>/stages/<stageId>/envelope`) with `summary`, `payload`,
|
|
148
|
+
and artifact paths. Use that for the parent envelopes; use **synthesize** for the
|
|
149
|
+
keyed join copy.
|
|
150
|
+
|
|
151
|
+
CLI equivalent: `node dist/cli.js envelope get --run <runId> --stage <stageId> --json`.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
id: clarify
|
|
2
|
+
system_prompt: |
|
|
3
|
+
You are the root of a diamond pipeline. Call emit_stage_envelope exactly once.
|
|
4
|
+
|
|
5
|
+
Emit status success, artifacts [], payload { "brief": "diamond start" },
|
|
6
|
+
model: cursor/auto
|
|
7
|
+
io:
|
|
8
|
+
input:
|
|
9
|
+
schema:
|
|
10
|
+
type: object
|
|
11
|
+
output:
|
|
12
|
+
schema:
|
|
13
|
+
type: object
|
|
14
|
+
required:
|
|
15
|
+
- brief
|
|
16
|
+
properties:
|
|
17
|
+
brief:
|
|
18
|
+
type: string
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
id: generic-fan-in-accepted
|
|
2
|
+
stages:
|
|
3
|
+
- id: clarify
|
|
4
|
+
entry: true
|
|
5
|
+
route:
|
|
6
|
+
- to: research
|
|
7
|
+
- to: validation
|
|
8
|
+
uses: ./clarify.yaml
|
|
9
|
+
- id: research
|
|
10
|
+
route:
|
|
11
|
+
- to: synthesize
|
|
12
|
+
on: [succeeded, failed, skipped]
|
|
13
|
+
uses: ./research.yaml
|
|
14
|
+
- id: validation
|
|
15
|
+
route:
|
|
16
|
+
- to: synthesize
|
|
17
|
+
uses: ./validation.yaml
|
|
18
|
+
- id: synthesize
|
|
19
|
+
uses: ./synthesize.yaml
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
id: generic-fan-in-accepted
|
|
2
|
+
goal: |
|
|
3
|
+
Dummy walkthrough for an accepted-failure diamond. research may succeed or
|
|
4
|
+
fail. validation must succeed. synthesize still runs when research fails and
|
|
5
|
+
must copy that failure envelope under received.research.
|
|
6
|
+
context: |
|
|
7
|
+
Manual operator-console test. Reply fail at research and ok citations at
|
|
8
|
+
validation, then open synthesize to see the keyed failure + success pair.
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
id: generic-fan-in
|
|
2
|
+
stages:
|
|
3
|
+
- id: clarify
|
|
4
|
+
entry: true
|
|
5
|
+
route:
|
|
6
|
+
- to: research
|
|
7
|
+
- to: validation
|
|
8
|
+
uses: ./clarify.yaml
|
|
9
|
+
- id: research
|
|
10
|
+
route:
|
|
11
|
+
- to: synthesize
|
|
12
|
+
uses: ./research.yaml
|
|
13
|
+
- id: validation
|
|
14
|
+
route:
|
|
15
|
+
- to: synthesize
|
|
16
|
+
uses: ./validation.yaml
|
|
17
|
+
- id: synthesize
|
|
18
|
+
uses: ./synthesize.yaml
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
id: generic-fan-in
|
|
2
|
+
goal: |
|
|
3
|
+
Dummy walkthrough for generic multi-parent fan-in. research and validation
|
|
4
|
+
run in parallel after clarify. Reply to each with ok <finding> or fail.
|
|
5
|
+
synthesize waits for both and must copy priorEnvelopesByStage into payload.received.
|
|
6
|
+
context: |
|
|
7
|
+
Manual operator-console test. Distinct findings (for example glaciers and
|
|
8
|
+
citations) make it obvious which parent envelope landed under which key.
|
|
9
|
+
On fail of either parent, synthesize is skipped and the run fails.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
id: research
|
|
2
|
+
system_prompt: |
|
|
3
|
+
You are the research branch of a diamond join. Follow these steps exactly:
|
|
4
|
+
|
|
5
|
+
1. Call ask_operator with kind free_text. Ask the operator to reply with
|
|
6
|
+
exactly one of:
|
|
7
|
+
ok <finding>
|
|
8
|
+
fail
|
|
9
|
+
Tell them <finding> is one token (letters, digits, or hyphen). Examples:
|
|
10
|
+
ok glaciers
|
|
11
|
+
fail
|
|
12
|
+
2. Wait for the operator answer. Do not emit before you have that answer.
|
|
13
|
+
3. If the answer is fail (optionally with surrounding whitespace), emit
|
|
14
|
+
emit_stage_envelope with status failure, a short summary that research
|
|
15
|
+
failed, artifacts [], and no payload.
|
|
16
|
+
4. If the answer is ok followed by a finding token:
|
|
17
|
+
emit status success, artifacts [], payload { "finding": "<that token>" },
|
|
18
|
+
and a summary that includes the word research and the finding token.
|
|
19
|
+
Use the token after ok as-is; do not invent a different word.
|
|
20
|
+
5. If the answer is ok with no token, or anything else, emit status failure
|
|
21
|
+
explaining the reply was not ok <finding> or fail.
|
|
22
|
+
|
|
23
|
+
Rules:
|
|
24
|
+
- Never emit before the operator answers.
|
|
25
|
+
- Do not call ask_operator more than once.
|
|
26
|
+
model: cursor/auto
|
|
27
|
+
io:
|
|
28
|
+
input:
|
|
29
|
+
schema:
|
|
30
|
+
type: object
|
|
31
|
+
required:
|
|
32
|
+
- brief
|
|
33
|
+
properties:
|
|
34
|
+
brief:
|
|
35
|
+
type: string
|
|
36
|
+
output:
|
|
37
|
+
schema:
|
|
38
|
+
type: object
|
|
39
|
+
required:
|
|
40
|
+
- finding
|
|
41
|
+
properties:
|
|
42
|
+
finding:
|
|
43
|
+
type: string
|
|
44
|
+
gate_kinds:
|
|
45
|
+
- free_text
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
id: synthesize
|
|
2
|
+
system_prompt: |
|
|
3
|
+
You are the diamond join. The prompt includes priorEnvelopesByStage — a
|
|
4
|
+
record keyed in YAML declaration order (research, then validation).
|
|
5
|
+
priorEnvelope is null. There is no clone-list priorEnvelopes field.
|
|
6
|
+
|
|
7
|
+
Call emit_stage_envelope exactly once. Do not call ask_operator.
|
|
8
|
+
|
|
9
|
+
1. Read priorEnvelopesByStage.research and priorEnvelopesByStage.validation.
|
|
10
|
+
Do not invent keys. Do not reorder keys.
|
|
11
|
+
2. For each parent, copy status, summary, and payload.finding when present.
|
|
12
|
+
If a parent is a failure envelope with no finding, omit finding.
|
|
13
|
+
3. Emit status success, artifacts [], and payload:
|
|
14
|
+
{
|
|
15
|
+
"received": {
|
|
16
|
+
"research": { "status": "…", "summary": "…", "finding": "…" },
|
|
17
|
+
"validation": { "status": "…", "summary": "…", "finding": "…" }
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
Include finding only when that parent payload had it.
|
|
21
|
+
4. Summary must mention both parent keys and their status values, for
|
|
22
|
+
example: received research=success glaciers; validation=success citations
|
|
23
|
+
|
|
24
|
+
Rules:
|
|
25
|
+
- Copy from priorEnvelopesByStage only. Do not use a single priorEnvelope.
|
|
26
|
+
model: cursor/auto
|
|
27
|
+
io:
|
|
28
|
+
input:
|
|
29
|
+
schema:
|
|
30
|
+
type: object
|
|
31
|
+
output:
|
|
32
|
+
schema:
|
|
33
|
+
type: object
|
|
34
|
+
required:
|
|
35
|
+
- received
|
|
36
|
+
properties:
|
|
37
|
+
received:
|
|
38
|
+
type: object
|
|
39
|
+
required:
|
|
40
|
+
- research
|
|
41
|
+
- validation
|
|
42
|
+
properties:
|
|
43
|
+
research:
|
|
44
|
+
type: object
|
|
45
|
+
required:
|
|
46
|
+
- status
|
|
47
|
+
- summary
|
|
48
|
+
properties:
|
|
49
|
+
status:
|
|
50
|
+
type: string
|
|
51
|
+
summary:
|
|
52
|
+
type: string
|
|
53
|
+
finding:
|
|
54
|
+
type: string
|
|
55
|
+
validation:
|
|
56
|
+
type: object
|
|
57
|
+
required:
|
|
58
|
+
- status
|
|
59
|
+
- summary
|
|
60
|
+
properties:
|
|
61
|
+
status:
|
|
62
|
+
type: string
|
|
63
|
+
summary:
|
|
64
|
+
type: string
|
|
65
|
+
finding:
|
|
66
|
+
type: string
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
id: validation
|
|
2
|
+
system_prompt: |
|
|
3
|
+
You are the validation branch of a diamond join. Follow these steps exactly:
|
|
4
|
+
|
|
5
|
+
1. Call ask_operator with kind free_text. Ask the operator to reply with
|
|
6
|
+
exactly one of:
|
|
7
|
+
ok <finding>
|
|
8
|
+
fail
|
|
9
|
+
Tell them <finding> is one token (letters, digits, or hyphen). Examples:
|
|
10
|
+
ok citations
|
|
11
|
+
fail
|
|
12
|
+
2. Wait for the operator answer. Do not emit before you have that answer.
|
|
13
|
+
3. If the answer is fail (optionally with surrounding whitespace), emit
|
|
14
|
+
emit_stage_envelope with status failure, a short summary that validation
|
|
15
|
+
failed, artifacts [], and no payload.
|
|
16
|
+
4. If the answer is ok followed by a finding token:
|
|
17
|
+
emit status success, artifacts [], payload { "finding": "<that token>" },
|
|
18
|
+
and a summary that includes the word validation and the finding token.
|
|
19
|
+
Use the token after ok as-is; do not invent a different word.
|
|
20
|
+
5. If the answer is ok with no token, or anything else, emit status failure
|
|
21
|
+
explaining the reply was not ok <finding> or fail.
|
|
22
|
+
|
|
23
|
+
Rules:
|
|
24
|
+
- Never emit before the operator answers.
|
|
25
|
+
- Do not call ask_operator more than once.
|
|
26
|
+
model: cursor/auto
|
|
27
|
+
io:
|
|
28
|
+
input:
|
|
29
|
+
schema:
|
|
30
|
+
type: object
|
|
31
|
+
required:
|
|
32
|
+
- brief
|
|
33
|
+
properties:
|
|
34
|
+
brief:
|
|
35
|
+
type: string
|
|
36
|
+
output:
|
|
37
|
+
schema:
|
|
38
|
+
type: object
|
|
39
|
+
required:
|
|
40
|
+
- finding
|
|
41
|
+
properties:
|
|
42
|
+
finding:
|
|
43
|
+
type: string
|
|
44
|
+
gate_kinds:
|
|
45
|
+
- free_text
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# github-release
|
|
2
|
+
|
|
3
|
+
Dogfood release automation: draft operator-facing GitHub release notes, then publish with `gh`. This is an **ops / release example** — not SDLC planning.
|
|
4
|
+
|
|
5
|
+
Stageflow uses this catalog in `.github/workflows/publish.yml` and `release.yml` when publishing new npm versions.
|
|
6
|
+
|
|
7
|
+
One GitHub Release is created for the current tag. The notes body includes **every CHANGELOG version since the last GitHub Release**, not only the latest `package.json` bump. A publish that jumps from `0.3.0` to `0.8.0` therefore includes headings for `0.4.0` through `0.8.0`. Intermediate versions are not tagged or published as extra GitHub Releases.
|
|
8
|
+
|
|
9
|
+
## Layout
|
|
10
|
+
|
|
11
|
+
| Path | Role |
|
|
12
|
+
|------|------|
|
|
13
|
+
| `github-release.pipeline.yaml` | Two-stage linear pipeline |
|
|
14
|
+
| `draft-release-notes.yaml` | Collect changelog, write `RELEASE_NOTES.md` artifact |
|
|
15
|
+
| `publish-github-release.yaml` | `gh release create` from prior artifact |
|
|
16
|
+
| `github-release.task.yaml` | Task bound at run time |
|
|
17
|
+
|
|
18
|
+
CI helpers: `scripts/release-range.mjs` resolves previous from published GitHub Releases (git tags if `gh` is unavailable) and extracts the CHANGELOG slice.
|
|
19
|
+
|
|
20
|
+
## Prerequisites
|
|
21
|
+
|
|
22
|
+
- Node.js ≥ 20, Stageflow installed
|
|
23
|
+
- **Cursor** (`cursor/composer-2-5`) — set `CURSOR_API_KEY` and install `pi-cursor-sdk` (`pi install npm:pi-cursor-sdk`, or `npm i --prefix ~/.pi/agent/npm pi-cursor-sdk`)
|
|
24
|
+
- **`gh` CLI** and `GH_TOKEN` or `GITHUB_TOKEN` for publish stage
|
|
25
|
+
- Git checkout of the Stageflow repo (stages read version/tags from the bound checkout)
|
|
26
|
+
|
|
27
|
+
Optional env vars (set by publish workflow): `RELEASE_VERSION`, `RELEASE_TAG`, `RELEASE_PREVIOUS`, `RELEASE_CHANGELOG_SLICE`, `GITHUB_SHA`, `DRY_RUN=1` to skip actual release creation.
|
|
28
|
+
|
|
29
|
+
`RELEASE_PREVIOUS` is the last published GitHub Release version, not `HEAD^` `package.json`. `RELEASE_CHANGELOG_SLICE` is a markdown file of CHANGELOG sections in that range (workflows write `changelog-slice.md` before `sf run`).
|
|
30
|
+
|
|
31
|
+
## Commands
|
|
32
|
+
|
|
33
|
+
From the **repository git root**:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
sf validate --strict
|
|
37
|
+
export CURSOR_API_KEY=…
|
|
38
|
+
export GH_TOKEN=…
|
|
39
|
+
CURRENT="$(node -p "require('./package.json').version")"
|
|
40
|
+
PREVIOUS="$(node scripts/release-range.mjs previous --current "$CURRENT")"
|
|
41
|
+
if [ -n "$PREVIOUS" ]; then
|
|
42
|
+
node scripts/release-range.mjs changelog --after "$PREVIOUS" --through "$CURRENT" > changelog-slice.md
|
|
43
|
+
else
|
|
44
|
+
node scripts/release-range.mjs changelog --through "$CURRENT" > changelog-slice.md
|
|
45
|
+
fi
|
|
46
|
+
export RELEASE_VERSION="$CURRENT" RELEASE_TAG="v${CURRENT}" RELEASE_PREVIOUS="$PREVIOUS" RELEASE_CHANGELOG_SLICE="$PWD/changelog-slice.md"
|
|
47
|
+
sf run \
|
|
48
|
+
--pipeline examples/github-release/github-release.pipeline.yaml \
|
|
49
|
+
--task examples/github-release/github-release.task.yaml \
|
|
50
|
+
--checkout "$PWD"
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
For a dry run (no GitHub release created):
|
|
54
|
+
|
|
55
|
+
```bash
|
|
56
|
+
DRY_RUN=1 sf run \
|
|
57
|
+
--pipeline examples/github-release/github-release.pipeline.yaml \
|
|
58
|
+
--task examples/github-release/github-release.task.yaml \
|
|
59
|
+
--checkout "$PWD"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Repair published notes
|
|
63
|
+
|
|
64
|
+
If a GitHub Release was published with only the latest version's notes, run **Repair GitHub Release notes** from the Actions tab (`workflow_dispatch`). It overwrites that release's body with every CHANGELOG section since the previous GitHub Release. It does not create tags.
|
|
65
|
+
|
|
66
|
+
| Input | Effect |
|
|
67
|
+
|-------|--------|
|
|
68
|
+
| *(empty)* | Repair the latest GitHub Release (closes the current `v0.8.0` gap) |
|
|
69
|
+
| `tag` | Repair one tag (`v0.8.0` or `0.8.0`) |
|
|
70
|
+
| `all` | Repair every published GitHub Release |
|
|
71
|
+
| `dry_run` | Print notes in the job log; do not edit GitHub |
|
|
72
|
+
|
|
73
|
+
Use the branch that contains `scripts/release-range.mjs` (this change must be on the branch you run). Locally:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
node scripts/release-range.mjs repair --dry-run true
|
|
77
|
+
node scripts/release-range.mjs repair --tag v0.8.0
|
|
78
|
+
```
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
id: draft-release-notes
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Do exactly one thing: write GitHub release notes for this publish.
|
|
4
|
+
|
|
5
|
+
The bound checkout is the Stageflow git repository (agent cwd). Read
|
|
6
|
+
RELEASE_VERSION, RELEASE_TAG, RELEASE_PREVIOUS, and
|
|
7
|
+
RELEASE_CHANGELOG_SLICE from the environment when they are set.
|
|
8
|
+
|
|
9
|
+
RELEASE_PREVIOUS is the last published GitHub Release (or last v* git
|
|
10
|
+
tag), not the previous package.json bump. If it is missing, read
|
|
11
|
+
version from package.json, use tag v<version>, and resolve previous
|
|
12
|
+
the same way: last GitHub Release, else latest v* git tag that is
|
|
13
|
+
strictly older than the current version. Do not use HEAD^ package.json
|
|
14
|
+
as previous.
|
|
15
|
+
|
|
16
|
+
Notes must cover every version after previous through current,
|
|
17
|
+
inclusive. A jump from 0.3.0 to 0.8.0 must include 0.4.0, 0.5.0,
|
|
18
|
+
0.6.0, 0.7.0, and 0.8.0 as separate headings. Do not collapse the
|
|
19
|
+
range into the latest version only.
|
|
20
|
+
|
|
21
|
+
Source of truth for those sections:
|
|
22
|
+
- If RELEASE_CHANGELOG_SLICE is set, read that file first (absolute
|
|
23
|
+
or repo-relative). Keep every ## [x.y.z] section it contains.
|
|
24
|
+
- Else read CHANGELOG.md and take every ## [x.y.z] heading where
|
|
25
|
+
version is greater than previous and less than or equal to current.
|
|
26
|
+
You may polish wording for GitHub (short summary, Features / Fixes /
|
|
27
|
+
Docs) but do not drop a version or invent commits, PRs, or features.
|
|
28
|
+
If CHANGELOG is missing a version in the range, fill that version
|
|
29
|
+
from git log v$PREVIOUS..HEAD (or the first commit of previous
|
|
30
|
+
through HEAD). You may also use gh to list merged PRs in that range.
|
|
31
|
+
|
|
32
|
+
Write RELEASE_NOTES.md via write_stage_artifact. Newest version first.
|
|
33
|
+
Not a raw git log dump. Not "bumped the version" as the only content.
|
|
34
|
+
Do not create a git tag. Do not call gh release create. Do not call
|
|
35
|
+
ask_operator. Do not stop after a chat reply.
|
|
36
|
+
|
|
37
|
+
Call emit_stage_envelope exactly once with status success, that artifact
|
|
38
|
+
path, a one-sentence summary, and a payload matching the stage schema.
|
|
39
|
+
included_versions lists every x.y.z heading in the notes, newest first.
|
|
40
|
+
model: cursor/composer-2-5
|
|
41
|
+
io:
|
|
42
|
+
input:
|
|
43
|
+
schema:
|
|
44
|
+
type: object
|
|
45
|
+
output:
|
|
46
|
+
schema:
|
|
47
|
+
type: object
|
|
48
|
+
required:
|
|
49
|
+
- version
|
|
50
|
+
- tag
|
|
51
|
+
- previous_version
|
|
52
|
+
- included_versions
|
|
53
|
+
properties:
|
|
54
|
+
version:
|
|
55
|
+
type: string
|
|
56
|
+
tag:
|
|
57
|
+
type: string
|
|
58
|
+
previous_version:
|
|
59
|
+
type: string
|
|
60
|
+
included_versions:
|
|
61
|
+
type: array
|
|
62
|
+
items:
|
|
63
|
+
type: string
|
|
64
|
+
additionalProperties: false
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
id: github-release
|
|
2
|
+
goal: Draft operator-facing GitHub release notes for every version since the last GitHub Release, then publish them as one GitHub Release for the current tag.
|
|
3
|
+
context: |
|
|
4
|
+
Bound checkout is the Stageflow repository. Current version, tag,
|
|
5
|
+
previous published GitHub Release, and optional changelog slice path
|
|
6
|
+
are in RELEASE_VERSION, RELEASE_TAG, RELEASE_PREVIOUS, and
|
|
7
|
+
RELEASE_CHANGELOG_SLICE when those env vars are set; otherwise read
|
|
8
|
+
them from package.json, git tags / GitHub Releases, and CHANGELOG.md.
|
|
9
|
+
constraints: |
|
|
10
|
+
No HITL. Do not call ask_operator. Stage 1 writes notes that include
|
|
11
|
+
a heading for every CHANGELOG version after previous through current.
|
|
12
|
+
Stage 2 only publishes those notes with gh for the current tag. Do
|
|
13
|
+
not use GitHub auto-generated notes. Do not create extra tags.
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
id: publish-github-release
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Do exactly one thing: publish the prior stage's release notes as a
|
|
4
|
+
GitHub Release.
|
|
5
|
+
|
|
6
|
+
Use the prior envelope for version, tag, previous_version, and the
|
|
7
|
+
RELEASE_NOTES.md artifact path. Read that file from the factory run
|
|
8
|
+
workspace (STAGEFLOW_RUN_WORKSPACE plus the run-relative artifact
|
|
9
|
+
path). Do not rewrite or regenerate the notes. Do not call
|
|
10
|
+
--generate-notes. Do not call ask_operator.
|
|
11
|
+
|
|
12
|
+
Target commit is GITHUB_SHA if set, otherwise git rev-parse HEAD.
|
|
13
|
+
Auth uses GIT_ASKPASS from a declared secrets: [GITHUB_TOKEN] grant
|
|
14
|
+
(file-backed helper — not ambient GH_TOKEN/GITHUB_TOKEN). gh is on PATH.
|
|
15
|
+
|
|
16
|
+
If DRY_RUN is 1, do not create the release. Write publish.md via
|
|
17
|
+
write_stage_artifact recording the gh command you would have run,
|
|
18
|
+
then emit success with published false and html_url empty.
|
|
19
|
+
|
|
20
|
+
Otherwise run:
|
|
21
|
+
gh release create "$TAG" --title "$TAG" --target "$SHA" --notes-file "$NOTES_PATH"
|
|
22
|
+
Confirm with gh release view. Write publish.md via write_stage_artifact
|
|
23
|
+
with the tag and html_url. If the release already exists, emit status
|
|
24
|
+
failure. Do not stop after a chat reply.
|
|
25
|
+
|
|
26
|
+
Call emit_stage_envelope exactly once with status, that artifact path,
|
|
27
|
+
a one-sentence summary, and a payload matching the stage schema.
|
|
28
|
+
model: cursor/composer-2-5
|
|
29
|
+
io:
|
|
30
|
+
input:
|
|
31
|
+
schema:
|
|
32
|
+
type: object
|
|
33
|
+
required:
|
|
34
|
+
- version
|
|
35
|
+
- tag
|
|
36
|
+
- previous_version
|
|
37
|
+
- included_versions
|
|
38
|
+
properties:
|
|
39
|
+
version:
|
|
40
|
+
type: string
|
|
41
|
+
tag:
|
|
42
|
+
type: string
|
|
43
|
+
previous_version:
|
|
44
|
+
type: string
|
|
45
|
+
included_versions:
|
|
46
|
+
type: array
|
|
47
|
+
items:
|
|
48
|
+
type: string
|
|
49
|
+
additionalProperties: false
|
|
50
|
+
output:
|
|
51
|
+
schema:
|
|
52
|
+
type: object
|
|
53
|
+
required:
|
|
54
|
+
- tag
|
|
55
|
+
- published
|
|
56
|
+
- html_url
|
|
57
|
+
properties:
|
|
58
|
+
tag:
|
|
59
|
+
type: string
|
|
60
|
+
published:
|
|
61
|
+
type: boolean
|
|
62
|
+
html_url:
|
|
63
|
+
type: string
|
|
64
|
+
additionalProperties: false
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# hello-world
|
|
2
|
+
|
|
3
|
+
Minimal single-stage pipeline. Domain-neutral — the stage id and prompts are yours to define.
|
|
4
|
+
|
|
5
|
+
## What this demonstrates
|
|
6
|
+
|
|
7
|
+
- **`task.input` ↔ entry `io.input.schema`** — `my-task.task.yaml` supplies a structured `input` object; the entry stage (`research.yaml`) declares matching `io.input.schema`.
|
|
8
|
+
- **Unmet entry input** — if the entry stage declares `io.input` and the task omits `input`, `sf validate` of each file alone still succeeds; start-run / `preparePipeline` warn with `task.entry_input_unmet` and continue (existing product behavior).
|
|
9
|
+
|
|
10
|
+
This catalog uses `io` only (no `verify` / `on_verify_fail`). For upgrading older field names, see [YAML catalog — Upgrading older catalogs](../../docs/yaml-catalog.md#upgrading-older-catalogs).
|
|
11
|
+
|
|
12
|
+
## Prerequisites
|
|
13
|
+
|
|
14
|
+
- Node.js ≥ 20, Stageflow installed (`npm i -g stageflow`)
|
|
15
|
+
- A Pi-compatible provider connected via `sf ui` or `sf providers login`
|
|
16
|
+
|
|
17
|
+
## Commands
|
|
18
|
+
|
|
19
|
+
From the **repository git root**:
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
sf validate --pipeline examples/hello-world/hello.pipeline.yaml --strict
|
|
23
|
+
sf run \
|
|
24
|
+
--pipeline examples/hello-world/hello.pipeline.yaml \
|
|
25
|
+
--task examples/hello-world/my-task.task.yaml
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Use `sf ui` (from any subdirectory) to watch the run and inspect the stage envelope.
|