@growthub/cli 0.6.6 → 0.6.8
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/dist/index.js +30192 -1098
- package/package.json +1 -11
- package/dist/__tests__/agent-jwt-env.test.d.ts +0 -2
- package/dist/__tests__/agent-jwt-env.test.d.ts.map +0 -1
- package/dist/__tests__/agent-jwt-env.test.js +0 -57
- package/dist/__tests__/agent-jwt-env.test.js.map +0 -1
- package/dist/__tests__/allowed-hostname.test.d.ts +0 -2
- package/dist/__tests__/allowed-hostname.test.d.ts.map +0 -1
- package/dist/__tests__/allowed-hostname.test.js +0 -75
- package/dist/__tests__/allowed-hostname.test.js.map +0 -1
- package/dist/__tests__/auth-login-flow.test.d.ts +0 -2
- package/dist/__tests__/auth-login-flow.test.d.ts.map +0 -1
- package/dist/__tests__/auth-login-flow.test.js +0 -62
- package/dist/__tests__/auth-login-flow.test.js.map +0 -1
- package/dist/__tests__/auth-session.test.d.ts +0 -2
- package/dist/__tests__/auth-session.test.d.ts.map +0 -1
- package/dist/__tests__/auth-session.test.js +0 -128
- package/dist/__tests__/auth-session.test.js.map +0 -1
- package/dist/__tests__/common.test.d.ts +0 -2
- package/dist/__tests__/common.test.d.ts.map +0 -1
- package/dist/__tests__/common.test.js +0 -73
- package/dist/__tests__/common.test.js.map +0 -1
- package/dist/__tests__/company-delete.test.d.ts +0 -2
- package/dist/__tests__/company-delete.test.d.ts.map +0 -1
- package/dist/__tests__/company-delete.test.js +0 -78
- package/dist/__tests__/company-delete.test.js.map +0 -1
- package/dist/__tests__/context.test.d.ts +0 -2
- package/dist/__tests__/context.test.d.ts.map +0 -1
- package/dist/__tests__/context.test.js +0 -50
- package/dist/__tests__/context.test.js.map +0 -1
- package/dist/__tests__/create-growthub-local-installer.test.d.ts +0 -21
- package/dist/__tests__/create-growthub-local-installer.test.d.ts.map +0 -1
- package/dist/__tests__/create-growthub-local-installer.test.js +0 -205
- package/dist/__tests__/create-growthub-local-installer.test.js.map +0 -1
- package/dist/__tests__/data-dir.test.d.ts +0 -2
- package/dist/__tests__/data-dir.test.d.ts.map +0 -1
- package/dist/__tests__/data-dir.test.js +0 -61
- package/dist/__tests__/data-dir.test.js.map +0 -1
- package/dist/__tests__/doctor.test.d.ts +0 -2
- package/dist/__tests__/doctor.test.d.ts.map +0 -1
- package/dist/__tests__/doctor.test.js +0 -93
- package/dist/__tests__/doctor.test.js.map +0 -1
- package/dist/__tests__/effective-profile.test.d.ts +0 -2
- package/dist/__tests__/effective-profile.test.d.ts.map +0 -1
- package/dist/__tests__/effective-profile.test.js +0 -91
- package/dist/__tests__/effective-profile.test.js.map +0 -1
- package/dist/__tests__/execute-hosted-pipeline.test.d.ts +0 -2
- package/dist/__tests__/execute-hosted-pipeline.test.d.ts.map +0 -1
- package/dist/__tests__/execute-hosted-pipeline.test.js +0 -131
- package/dist/__tests__/execute-hosted-pipeline.test.js.map +0 -1
- package/dist/__tests__/fork-policy.test.d.ts +0 -12
- package/dist/__tests__/fork-policy.test.d.ts.map +0 -1
- package/dist/__tests__/fork-policy.test.js +0 -132
- package/dist/__tests__/fork-policy.test.js.map +0 -1
- package/dist/__tests__/fork-trace.test.d.ts +0 -12
- package/dist/__tests__/fork-trace.test.d.ts.map +0 -1
- package/dist/__tests__/fork-trace.test.js +0 -90
- package/dist/__tests__/fork-trace.test.js.map +0 -1
- package/dist/__tests__/home-paths.test.d.ts +0 -2
- package/dist/__tests__/home-paths.test.d.ts.map +0 -1
- package/dist/__tests__/home-paths.test.js +0 -32
- package/dist/__tests__/home-paths.test.js.map +0 -1
- package/dist/__tests__/hosted-execution-client.test.d.ts +0 -2
- package/dist/__tests__/hosted-execution-client.test.d.ts.map +0 -1
- package/dist/__tests__/hosted-execution-client.test.js +0 -100
- package/dist/__tests__/hosted-execution-client.test.js.map +0 -1
- package/dist/__tests__/http.test.d.ts +0 -2
- package/dist/__tests__/http.test.d.ts.map +0 -1
- package/dist/__tests__/http.test.js +0 -42
- package/dist/__tests__/http.test.js.map +0 -1
- package/dist/__tests__/integrations-github-resolver.test.d.ts +0 -14
- package/dist/__tests__/integrations-github-resolver.test.d.ts.map +0 -1
- package/dist/__tests__/integrations-github-resolver.test.js +0 -103
- package/dist/__tests__/integrations-github-resolver.test.js.map +0 -1
- package/dist/__tests__/kit-command.test.d.ts +0 -2
- package/dist/__tests__/kit-command.test.d.ts.map +0 -1
- package/dist/__tests__/kit-command.test.js +0 -134
- package/dist/__tests__/kit-command.test.js.map +0 -1
- package/dist/__tests__/kit-core.test.d.ts +0 -17
- package/dist/__tests__/kit-core.test.d.ts.map +0 -1
- package/dist/__tests__/kit-core.test.js +0 -403
- package/dist/__tests__/kit-core.test.js.map +0 -1
- package/dist/__tests__/kit-fork-command.test.d.ts +0 -11
- package/dist/__tests__/kit-fork-command.test.d.ts.map +0 -1
- package/dist/__tests__/kit-fork-command.test.js +0 -183
- package/dist/__tests__/kit-fork-command.test.js.map +0 -1
- package/dist/__tests__/kit-fork-phase-1.test.d.ts +0 -13
- package/dist/__tests__/kit-fork-phase-1.test.d.ts.map +0 -1
- package/dist/__tests__/kit-fork-phase-1.test.js +0 -220
- package/dist/__tests__/kit-fork-phase-1.test.js.map +0 -1
- package/dist/__tests__/kit-fork-registry.test.d.ts +0 -8
- package/dist/__tests__/kit-fork-registry.test.d.ts.map +0 -1
- package/dist/__tests__/kit-fork-registry.test.js +0 -183
- package/dist/__tests__/kit-fork-registry.test.js.map +0 -1
- package/dist/__tests__/kit-fork-sync-agent.test.d.ts +0 -13
- package/dist/__tests__/kit-fork-sync-agent.test.d.ts.map +0 -1
- package/dist/__tests__/kit-fork-sync-agent.test.js +0 -262
- package/dist/__tests__/kit-fork-sync-agent.test.js.map +0 -1
- package/dist/__tests__/kit-fork-sync.test.d.ts +0 -12
- package/dist/__tests__/kit-fork-sync.test.d.ts.map +0 -1
- package/dist/__tests__/kit-fork-sync.test.js +0 -455
- package/dist/__tests__/kit-fork-sync.test.js.map +0 -1
- package/dist/__tests__/kit-zernio-social.test.d.ts +0 -16
- package/dist/__tests__/kit-zernio-social.test.d.ts.map +0 -1
- package/dist/__tests__/kit-zernio-social.test.js +0 -528
- package/dist/__tests__/kit-zernio-social.test.js.map +0 -1
- package/dist/__tests__/kit.test.d.ts +0 -2
- package/dist/__tests__/kit.test.d.ts.map +0 -1
- package/dist/__tests__/kit.test.js +0 -359
- package/dist/__tests__/kit.test.js.map +0 -1
- package/dist/__tests__/native-intelligence-normalizer.test.d.ts +0 -2
- package/dist/__tests__/native-intelligence-normalizer.test.d.ts.map +0 -1
- package/dist/__tests__/native-intelligence-normalizer.test.js +0 -200
- package/dist/__tests__/native-intelligence-normalizer.test.js.map +0 -1
- package/dist/__tests__/native-intelligence-planner.test.d.ts +0 -2
- package/dist/__tests__/native-intelligence-planner.test.d.ts.map +0 -1
- package/dist/__tests__/native-intelligence-planner.test.js +0 -208
- package/dist/__tests__/native-intelligence-planner.test.js.map +0 -1
- package/dist/__tests__/native-intelligence-recommender.test.d.ts +0 -2
- package/dist/__tests__/native-intelligence-recommender.test.d.ts.map +0 -1
- package/dist/__tests__/native-intelligence-recommender.test.js +0 -212
- package/dist/__tests__/native-intelligence-recommender.test.js.map +0 -1
- package/dist/__tests__/native-intelligence-summarizer.test.d.ts +0 -2
- package/dist/__tests__/native-intelligence-summarizer.test.d.ts.map +0 -1
- package/dist/__tests__/native-intelligence-summarizer.test.js +0 -195
- package/dist/__tests__/native-intelligence-summarizer.test.js.map +0 -1
- package/dist/__tests__/open-agents.test.d.ts +0 -2
- package/dist/__tests__/open-agents.test.d.ts.map +0 -1
- package/dist/__tests__/open-agents.test.js +0 -174
- package/dist/__tests__/open-agents.test.js.map +0 -1
- package/dist/__tests__/progress.test.d.ts +0 -5
- package/dist/__tests__/progress.test.d.ts.map +0 -1
- package/dist/__tests__/progress.test.js +0 -55
- package/dist/__tests__/progress.test.js.map +0 -1
- package/dist/__tests__/qwen-code.test.d.ts +0 -2
- package/dist/__tests__/qwen-code.test.d.ts.map +0 -1
- package/dist/__tests__/qwen-code.test.js +0 -125
- package/dist/__tests__/qwen-code.test.js.map +0 -1
- package/dist/__tests__/source-import-agent.test.d.ts +0 -9
- package/dist/__tests__/source-import-agent.test.d.ts.map +0 -1
- package/dist/__tests__/source-import-agent.test.js +0 -124
- package/dist/__tests__/source-import-agent.test.js.map +0 -1
- package/dist/__tests__/source-import-detect.test.d.ts +0 -8
- package/dist/__tests__/source-import-detect.test.d.ts.map +0 -1
- package/dist/__tests__/source-import-detect.test.js +0 -91
- package/dist/__tests__/source-import-detect.test.js.map +0 -1
- package/dist/__tests__/source-import-plan.test.d.ts +0 -8
- package/dist/__tests__/source-import-plan.test.d.ts.map +0 -1
- package/dist/__tests__/source-import-plan.test.js +0 -170
- package/dist/__tests__/source-import-plan.test.js.map +0 -1
- package/dist/__tests__/source-import-security.test.d.ts +0 -8
- package/dist/__tests__/source-import-security.test.d.ts.map +0 -1
- package/dist/__tests__/source-import-security.test.js +0 -111
- package/dist/__tests__/source-import-security.test.js.map +0 -1
- package/dist/__tests__/source-import-skills-source.test.d.ts +0 -11
- package/dist/__tests__/source-import-skills-source.test.d.ts.map +0 -1
- package/dist/__tests__/source-import-skills-source.test.js +0 -181
- package/dist/__tests__/source-import-skills-source.test.js.map +0 -1
- package/dist/__tests__/table-renderer.test.d.ts +0 -12
- package/dist/__tests__/table-renderer.test.d.ts.map +0 -1
- package/dist/__tests__/table-renderer.test.js +0 -86
- package/dist/__tests__/table-renderer.test.js.map +0 -1
- package/dist/__tests__/worktree.test.d.ts +0 -2
- package/dist/__tests__/worktree.test.d.ts.map +0 -1
- package/dist/__tests__/worktree.test.js +0 -399
- package/dist/__tests__/worktree.test.js.map +0 -1
- package/dist/adapters/http/format-event.d.ts +0 -2
- package/dist/adapters/http/format-event.d.ts.map +0 -1
- package/dist/adapters/http/format-event.js +0 -6
- package/dist/adapters/http/format-event.js.map +0 -1
- package/dist/adapters/http/index.d.ts +0 -3
- package/dist/adapters/http/index.d.ts.map +0 -1
- package/dist/adapters/http/index.js +0 -6
- package/dist/adapters/http/index.js.map +0 -1
- package/dist/adapters/index.d.ts +0 -3
- package/dist/adapters/index.d.ts.map +0 -1
- package/dist/adapters/index.js +0 -2
- package/dist/adapters/index.js.map +0 -1
- package/dist/adapters/open-agents/format-event.d.ts +0 -2
- package/dist/adapters/open-agents/format-event.d.ts.map +0 -1
- package/dist/adapters/open-agents/format-event.js +0 -39
- package/dist/adapters/open-agents/format-event.js.map +0 -1
- package/dist/adapters/open-agents/index.d.ts +0 -3
- package/dist/adapters/open-agents/index.d.ts.map +0 -1
- package/dist/adapters/open-agents/index.js +0 -6
- package/dist/adapters/open-agents/index.js.map +0 -1
- package/dist/adapters/process/format-event.d.ts +0 -2
- package/dist/adapters/process/format-event.d.ts.map +0 -1
- package/dist/adapters/process/format-event.js +0 -6
- package/dist/adapters/process/format-event.js.map +0 -1
- package/dist/adapters/process/index.d.ts +0 -3
- package/dist/adapters/process/index.d.ts.map +0 -1
- package/dist/adapters/process/index.js +0 -6
- package/dist/adapters/process/index.js.map +0 -1
- package/dist/adapters/qwen/format-event.d.ts +0 -8
- package/dist/adapters/qwen/format-event.d.ts.map +0 -1
- package/dist/adapters/qwen/format-event.js +0 -28
- package/dist/adapters/qwen/format-event.js.map +0 -1
- package/dist/adapters/qwen/index.d.ts +0 -3
- package/dist/adapters/qwen/index.d.ts.map +0 -1
- package/dist/adapters/qwen/index.js +0 -6
- package/dist/adapters/qwen/index.js.map +0 -1
- package/dist/adapters/registry.d.ts +0 -3
- package/dist/adapters/registry.d.ts.map +0 -1
- package/dist/adapters/registry.js +0 -56
- package/dist/adapters/registry.js.map +0 -1
- package/dist/auth/effective-profile.d.ts +0 -61
- package/dist/auth/effective-profile.d.ts.map +0 -1
- package/dist/auth/effective-profile.js +0 -127
- package/dist/auth/effective-profile.js.map +0 -1
- package/dist/auth/hosted-client.d.ts +0 -107
- package/dist/auth/hosted-client.d.ts.map +0 -1
- package/dist/auth/hosted-client.js +0 -140
- package/dist/auth/hosted-client.js.map +0 -1
- package/dist/auth/hosted-integrations.d.ts +0 -33
- package/dist/auth/hosted-integrations.d.ts.map +0 -1
- package/dist/auth/hosted-integrations.js +0 -51
- package/dist/auth/hosted-integrations.js.map +0 -1
- package/dist/auth/login-flow.d.ts +0 -27
- package/dist/auth/login-flow.d.ts.map +0 -1
- package/dist/auth/login-flow.js +0 -212
- package/dist/auth/login-flow.js.map +0 -1
- package/dist/auth/overlay-store.d.ts +0 -52
- package/dist/auth/overlay-store.d.ts.map +0 -1
- package/dist/auth/overlay-store.js +0 -123
- package/dist/auth/overlay-store.js.map +0 -1
- package/dist/auth/paths.d.ts +0 -15
- package/dist/auth/paths.d.ts.map +0 -1
- package/dist/auth/paths.js +0 -27
- package/dist/auth/paths.js.map +0 -1
- package/dist/auth/session-store.d.ts +0 -35
- package/dist/auth/session-store.d.ts.map +0 -1
- package/dist/auth/session-store.js +0 -73
- package/dist/auth/session-store.js.map +0 -1
- package/dist/auth/workflow-access.d.ts +0 -7
- package/dist/auth/workflow-access.d.ts.map +0 -1
- package/dist/auth/workflow-access.js +0 -27
- package/dist/auth/workflow-access.js.map +0 -1
- package/dist/checks/agent-jwt-secret-check.d.ts +0 -3
- package/dist/checks/agent-jwt-secret-check.d.ts.map +0 -1
- package/dist/checks/agent-jwt-secret-check.js +0 -31
- package/dist/checks/agent-jwt-secret-check.js.map +0 -1
- package/dist/checks/config-check.d.ts +0 -3
- package/dist/checks/config-check.d.ts.map +0 -1
- package/dist/checks/config-check.js +0 -31
- package/dist/checks/config-check.js.map +0 -1
- package/dist/checks/database-check.d.ts +0 -4
- package/dist/checks/database-check.d.ts.map +0 -1
- package/dist/checks/database-check.js +0 -54
- package/dist/checks/database-check.js.map +0 -1
- package/dist/checks/deployment-auth-check.d.ts +0 -4
- package/dist/checks/deployment-auth-check.d.ts.map +0 -1
- package/dist/checks/deployment-auth-check.js +0 -83
- package/dist/checks/deployment-auth-check.js.map +0 -1
- package/dist/checks/index.d.ts +0 -18
- package/dist/checks/index.d.ts.map +0 -1
- package/dist/checks/index.js +0 -10
- package/dist/checks/index.js.map +0 -1
- package/dist/checks/llm-check.d.ts +0 -4
- package/dist/checks/llm-check.d.ts.map +0 -1
- package/dist/checks/llm-check.js +0 -80
- package/dist/checks/llm-check.js.map +0 -1
- package/dist/checks/log-check.d.ts +0 -4
- package/dist/checks/log-check.d.ts.map +0 -1
- package/dist/checks/log-check.js +0 -27
- package/dist/checks/log-check.js.map +0 -1
- package/dist/checks/path-resolver.d.ts +0 -2
- package/dist/checks/path-resolver.d.ts.map +0 -1
- package/dist/checks/path-resolver.js +0 -2
- package/dist/checks/path-resolver.js.map +0 -1
- package/dist/checks/port-check.d.ts +0 -4
- package/dist/checks/port-check.d.ts.map +0 -1
- package/dist/checks/port-check.js +0 -20
- package/dist/checks/port-check.js.map +0 -1
- package/dist/checks/secrets-check.d.ts +0 -4
- package/dist/checks/secrets-check.d.ts.map +0 -1
- package/dist/checks/secrets-check.js +0 -123
- package/dist/checks/secrets-check.js.map +0 -1
- package/dist/checks/storage-check.d.ts +0 -4
- package/dist/checks/storage-check.d.ts.map +0 -1
- package/dist/checks/storage-check.js +0 -46
- package/dist/checks/storage-check.js.map +0 -1
- package/dist/client/context.d.ts +0 -21
- package/dist/client/context.d.ts.map +0 -1
- package/dist/client/context.js +0 -136
- package/dist/client/context.js.map +0 -1
- package/dist/client/http.d.ts +0 -29
- package/dist/client/http.d.ts.map +0 -1
- package/dist/client/http.js +0 -120
- package/dist/client/http.js.map +0 -1
- package/dist/commands/allowed-hostname.d.ts +0 -4
- package/dist/commands/allowed-hostname.d.ts.map +0 -1
- package/dist/commands/allowed-hostname.js +0 -31
- package/dist/commands/allowed-hostname.js.map +0 -1
- package/dist/commands/artifact.d.ts +0 -12
- package/dist/commands/artifact.d.ts.map +0 -1
- package/dist/commands/artifact.js +0 -167
- package/dist/commands/artifact.js.map +0 -1
- package/dist/commands/auth-bootstrap-ceo.d.ts +0 -8
- package/dist/commands/auth-bootstrap-ceo.d.ts.map +0 -1
- package/dist/commands/auth-bootstrap-ceo.js +0 -108
- package/dist/commands/auth-bootstrap-ceo.js.map +0 -1
- package/dist/commands/auth-login.d.ts +0 -24
- package/dist/commands/auth-login.d.ts.map +0 -1
- package/dist/commands/auth-login.js +0 -270
- package/dist/commands/auth-login.js.map +0 -1
- package/dist/commands/capability.d.ts +0 -15
- package/dist/commands/capability.d.ts.map +0 -1
- package/dist/commands/capability.js +0 -366
- package/dist/commands/capability.js.map +0 -1
- package/dist/commands/client/activity.d.ts +0 -3
- package/dist/commands/client/activity.d.ts.map +0 -1
- package/dist/commands/client/activity.js +0 -49
- package/dist/commands/client/activity.js.map +0 -1
- package/dist/commands/client/agent.d.ts +0 -3
- package/dist/commands/client/agent.d.ts.map +0 -1
- package/dist/commands/client/agent.js +0 -224
- package/dist/commands/client/agent.js.map +0 -1
- package/dist/commands/client/approval.d.ts +0 -3
- package/dist/commands/client/approval.d.ts.map +0 -1
- package/dist/commands/client/approval.js +0 -193
- package/dist/commands/client/approval.js.map +0 -1
- package/dist/commands/client/common.d.ts +0 -33
- package/dist/commands/client/common.d.ts.map +0 -1
- package/dist/commands/client/common.js +0 -140
- package/dist/commands/client/common.js.map +0 -1
- package/dist/commands/client/company.d.ts +0 -14
- package/dist/commands/client/company.d.ts.map +0 -1
- package/dist/commands/client/company.js +0 -346
- package/dist/commands/client/company.js.map +0 -1
- package/dist/commands/client/context.d.ts +0 -3
- package/dist/commands/client/context.d.ts.map +0 -1
- package/dist/commands/client/context.js +0 -92
- package/dist/commands/client/context.js.map +0 -1
- package/dist/commands/client/dashboard.d.ts +0 -3
- package/dist/commands/client/dashboard.d.ts.map +0 -1
- package/dist/commands/client/dashboard.js +0 -19
- package/dist/commands/client/dashboard.js.map +0 -1
- package/dist/commands/client/issue.d.ts +0 -3
- package/dist/commands/client/issue.d.ts.map +0 -1
- package/dist/commands/client/issue.js +0 -229
- package/dist/commands/client/issue.js.map +0 -1
- package/dist/commands/client/plugin.d.ts +0 -3
- package/dist/commands/client/plugin.d.ts.map +0 -1
- package/dist/commands/client/plugin.js +0 -252
- package/dist/commands/client/plugin.js.map +0 -1
- package/dist/commands/configure.d.ts +0 -5
- package/dist/commands/configure.d.ts.map +0 -1
- package/dist/commands/configure.js +0 -167
- package/dist/commands/configure.js.map +0 -1
- package/dist/commands/db-backup.d.ts +0 -10
- package/dist/commands/db-backup.d.ts.map +0 -1
- package/dist/commands/db-backup.js +0 -74
- package/dist/commands/db-backup.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -10
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -154
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/env.d.ts +0 -4
- package/dist/commands/env.d.ts.map +0 -1
- package/dist/commands/env.js +0 -355
- package/dist/commands/env.js.map +0 -1
- package/dist/commands/fleet.d.ts +0 -39
- package/dist/commands/fleet.d.ts.map +0 -1
- package/dist/commands/fleet.js +0 -281
- package/dist/commands/fleet.js.map +0 -1
- package/dist/commands/github.d.ts +0 -29
- package/dist/commands/github.d.ts.map +0 -1
- package/dist/commands/github.js +0 -205
- package/dist/commands/github.js.map +0 -1
- package/dist/commands/gtm.d.ts +0 -3
- package/dist/commands/gtm.d.ts.map +0 -1
- package/dist/commands/gtm.js +0 -134
- package/dist/commands/gtm.js.map +0 -1
- package/dist/commands/heartbeat-run.d.ts +0 -16
- package/dist/commands/heartbeat-run.d.ts.map +0 -1
- package/dist/commands/heartbeat-run.js +0 -294
- package/dist/commands/heartbeat-run.js.map +0 -1
- package/dist/commands/integrations.d.ts +0 -20
- package/dist/commands/integrations.d.ts.map +0 -1
- package/dist/commands/integrations.js +0 -98
- package/dist/commands/integrations.js.map +0 -1
- package/dist/commands/kit-fork-remote.d.ts +0 -46
- package/dist/commands/kit-fork-remote.d.ts.map +0 -1
- package/dist/commands/kit-fork-remote.js +0 -489
- package/dist/commands/kit-fork-remote.js.map +0 -1
- package/dist/commands/kit-fork.d.ts +0 -39
- package/dist/commands/kit-fork.d.ts.map +0 -1
- package/dist/commands/kit-fork.js +0 -1338
- package/dist/commands/kit-fork.js.map +0 -1
- package/dist/commands/kit.d.ts +0 -7
- package/dist/commands/kit.d.ts.map +0 -1
- package/dist/commands/kit.js +0 -585
- package/dist/commands/kit.js.map +0 -1
- package/dist/commands/onboard.d.ts +0 -9
- package/dist/commands/onboard.d.ts.map +0 -1
- package/dist/commands/onboard.js +0 -425
- package/dist/commands/onboard.js.map +0 -1
- package/dist/commands/open-agents.d.ts +0 -19
- package/dist/commands/open-agents.d.ts.map +0 -1
- package/dist/commands/open-agents.js +0 -689
- package/dist/commands/open-agents.js.map +0 -1
- package/dist/commands/pipeline.d.ts +0 -20
- package/dist/commands/pipeline.d.ts.map +0 -1
- package/dist/commands/pipeline.js +0 -863
- package/dist/commands/pipeline.js.map +0 -1
- package/dist/commands/profile.d.ts +0 -3
- package/dist/commands/profile.d.ts.map +0 -1
- package/dist/commands/profile.js +0 -282
- package/dist/commands/profile.js.map +0 -1
- package/dist/commands/qwen-code.d.ts +0 -19
- package/dist/commands/qwen-code.d.ts.map +0 -1
- package/dist/commands/qwen-code.js +0 -286
- package/dist/commands/qwen-code.js.map +0 -1
- package/dist/commands/run.d.ts +0 -9
- package/dist/commands/run.d.ts.map +0 -1
- package/dist/commands/run.js +0 -156
- package/dist/commands/run.js.map +0 -1
- package/dist/commands/source-import-discovery.d.ts +0 -28
- package/dist/commands/source-import-discovery.d.ts.map +0 -1
- package/dist/commands/source-import-discovery.js +0 -327
- package/dist/commands/source-import-discovery.js.map +0 -1
- package/dist/commands/starter.d.ts +0 -27
- package/dist/commands/starter.d.ts.map +0 -1
- package/dist/commands/starter.js +0 -358
- package/dist/commands/starter.js.map +0 -1
- package/dist/commands/status.d.ts +0 -18
- package/dist/commands/status.d.ts.map +0 -1
- package/dist/commands/status.js +0 -84
- package/dist/commands/status.js.map +0 -1
- package/dist/commands/template.d.ts +0 -18
- package/dist/commands/template.d.ts.map +0 -1
- package/dist/commands/template.js +0 -341
- package/dist/commands/template.js.map +0 -1
- package/dist/commands/workflow.d.ts +0 -24
- package/dist/commands/workflow.d.ts.map +0 -1
- package/dist/commands/workflow.js +0 -1350
- package/dist/commands/workflow.js.map +0 -1
- package/dist/commands/worktree-lib.d.ts +0 -49
- package/dist/commands/worktree-lib.d.ts.map +0 -1
- package/dist/commands/worktree-lib.js +0 -220
- package/dist/commands/worktree-lib.js.map +0 -1
- package/dist/commands/worktree.d.ts +0 -60
- package/dist/commands/worktree.d.ts.map +0 -1
- package/dist/commands/worktree.js +0 -874
- package/dist/commands/worktree.js.map +0 -1
- package/dist/config/data-dir.d.ts +0 -12
- package/dist/config/data-dir.d.ts.map +0 -1
- package/dist/config/data-dir.js +0 -25
- package/dist/config/data-dir.js.map +0 -1
- package/dist/config/env.d.ts +0 -15
- package/dist/config/env.d.ts.map +0 -1
- package/dist/config/env.js +0 -105
- package/dist/config/env.js.map +0 -1
- package/dist/config/github-home.d.ts +0 -17
- package/dist/config/github-home.d.ts.map +0 -1
- package/dist/config/github-home.js +0 -29
- package/dist/config/github-home.js.map +0 -1
- package/dist/config/home.d.ts +0 -23
- package/dist/config/home.d.ts.map +0 -1
- package/dist/config/home.js +0 -65
- package/dist/config/home.js.map +0 -1
- package/dist/config/hostnames.d.ts +0 -3
- package/dist/config/hostnames.d.ts.map +0 -1
- package/dist/config/hostnames.js +0 -27
- package/dist/config/hostnames.js.map +0 -1
- package/dist/config/kit-forks-home.d.ts +0 -26
- package/dist/config/kit-forks-home.d.ts.map +0 -1
- package/dist/config/kit-forks-home.js +0 -44
- package/dist/config/kit-forks-home.js.map +0 -1
- package/dist/config/schema.d.ts +0 -2
- package/dist/config/schema.d.ts.map +0 -1
- package/dist/config/schema.js +0 -2
- package/dist/config/schema.js.map +0 -1
- package/dist/config/secrets-key.d.ts +0 -16
- package/dist/config/secrets-key.d.ts.map +0 -1
- package/dist/config/secrets-key.js +0 -34
- package/dist/config/secrets-key.js.map +0 -1
- package/dist/config/store.d.ts +0 -6
- package/dist/config/store.d.ts.map +0 -1
- package/dist/config/store.js +0 -102
- package/dist/config/store.js.map +0 -1
- package/dist/fleet/agent-plan.d.ts +0 -20
- package/dist/fleet/agent-plan.d.ts.map +0 -1
- package/dist/fleet/agent-plan.js +0 -61
- package/dist/fleet/agent-plan.js.map +0 -1
- package/dist/fleet/approvals.d.ts +0 -10
- package/dist/fleet/approvals.d.ts.map +0 -1
- package/dist/fleet/approvals.js +0 -33
- package/dist/fleet/approvals.js.map +0 -1
- package/dist/fleet/drift-summary.d.ts +0 -13
- package/dist/fleet/drift-summary.d.ts.map +0 -1
- package/dist/fleet/drift-summary.js +0 -120
- package/dist/fleet/drift-summary.js.map +0 -1
- package/dist/fleet/summary.d.ts +0 -9
- package/dist/fleet/summary.d.ts.map +0 -1
- package/dist/fleet/summary.js +0 -161
- package/dist/fleet/summary.js.map +0 -1
- package/dist/fleet/types.d.ts +0 -149
- package/dist/fleet/types.d.ts.map +0 -1
- package/dist/fleet/types.js +0 -12
- package/dist/fleet/types.js.map +0 -1
- package/dist/github/client.d.ts +0 -42
- package/dist/github/client.d.ts.map +0 -1
- package/dist/github/client.js +0 -174
- package/dist/github/client.js.map +0 -1
- package/dist/github/token-store.d.ts +0 -11
- package/dist/github/token-store.d.ts.map +0 -1
- package/dist/github/token-store.js +0 -74
- package/dist/github/token-store.js.map +0 -1
- package/dist/github/types.d.ts +0 -69
- package/dist/github/types.d.ts.map +0 -1
- package/dist/github/types.js +0 -8
- package/dist/github/types.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/integrations/bridge.d.ts +0 -43
- package/dist/integrations/bridge.d.ts.map +0 -1
- package/dist/integrations/bridge.js +0 -148
- package/dist/integrations/bridge.js.map +0 -1
- package/dist/integrations/github-resolver.d.ts +0 -31
- package/dist/integrations/github-resolver.d.ts.map +0 -1
- package/dist/integrations/github-resolver.js +0 -44
- package/dist/integrations/github-resolver.js.map +0 -1
- package/dist/integrations/types.d.ts +0 -46
- package/dist/integrations/types.d.ts.map +0 -1
- package/dist/integrations/types.js +0 -11
- package/dist/integrations/types.js.map +0 -1
- package/dist/kits/catalog.d.ts +0 -12
- package/dist/kits/catalog.d.ts.map +0 -1
- package/dist/kits/catalog.js +0 -93
- package/dist/kits/catalog.js.map +0 -1
- package/dist/kits/contract.d.ts +0 -153
- package/dist/kits/contract.d.ts.map +0 -1
- package/dist/kits/contract.js +0 -89
- package/dist/kits/contract.js.map +0 -1
- package/dist/kits/core/adapter-core/contracts.d.ts +0 -108
- package/dist/kits/core/adapter-core/contracts.d.ts.map +0 -1
- package/dist/kits/core/adapter-core/contracts.js +0 -17
- package/dist/kits/core/adapter-core/contracts.js.map +0 -1
- package/dist/kits/core/adapter-core/env-gate.d.ts +0 -29
- package/dist/kits/core/adapter-core/env-gate.d.ts.map +0 -1
- package/dist/kits/core/adapter-core/env-gate.js +0 -143
- package/dist/kits/core/adapter-core/env-gate.js.map +0 -1
- package/dist/kits/core/adapter-core/fork-inspector.d.ts +0 -42
- package/dist/kits/core/adapter-core/fork-inspector.d.ts.map +0 -1
- package/dist/kits/core/adapter-core/fork-inspector.js +0 -141
- package/dist/kits/core/adapter-core/fork-inspector.js.map +0 -1
- package/dist/kits/core/adapter-core/index.d.ts +0 -20
- package/dist/kits/core/adapter-core/index.d.ts.map +0 -1
- package/dist/kits/core/adapter-core/index.js +0 -13
- package/dist/kits/core/adapter-core/index.js.map +0 -1
- package/dist/kits/core/adapter-core/output-contract.d.ts +0 -25
- package/dist/kits/core/adapter-core/output-contract.d.ts.map +0 -1
- package/dist/kits/core/adapter-core/output-contract.js +0 -114
- package/dist/kits/core/adapter-core/output-contract.js.map +0 -1
- package/dist/kits/core/adapter-core/provider-adapter.d.ts +0 -26
- package/dist/kits/core/adapter-core/provider-adapter.d.ts.map +0 -1
- package/dist/kits/core/adapter-core/provider-adapter.js +0 -119
- package/dist/kits/core/adapter-core/provider-adapter.js.map +0 -1
- package/dist/kits/core/adapter-core/runtime-surface.d.ts +0 -25
- package/dist/kits/core/adapter-core/runtime-surface.d.ts.map +0 -1
- package/dist/kits/core/adapter-core/runtime-surface.js +0 -100
- package/dist/kits/core/adapter-core/runtime-surface.js.map +0 -1
- package/dist/kits/core/adapter-core/setup-validation.d.ts +0 -28
- package/dist/kits/core/adapter-core/setup-validation.d.ts.map +0 -1
- package/dist/kits/core/adapter-core/setup-validation.js +0 -145
- package/dist/kits/core/adapter-core/setup-validation.js.map +0 -1
- package/dist/kits/core/factory/index.d.ts +0 -25
- package/dist/kits/core/factory/index.d.ts.map +0 -1
- package/dist/kits/core/factory/index.js +0 -21
- package/dist/kits/core/factory/index.js.map +0 -1
- package/dist/kits/core/factory/operator-kit.d.ts +0 -50
- package/dist/kits/core/factory/operator-kit.d.ts.map +0 -1
- package/dist/kits/core/factory/operator-kit.js +0 -88
- package/dist/kits/core/factory/operator-kit.js.map +0 -1
- package/dist/kits/core/factory/ops-kit.d.ts +0 -57
- package/dist/kits/core/factory/ops-kit.d.ts.map +0 -1
- package/dist/kits/core/factory/ops-kit.js +0 -115
- package/dist/kits/core/factory/ops-kit.js.map +0 -1
- package/dist/kits/core/factory/studio-kit.d.ts +0 -39
- package/dist/kits/core/factory/studio-kit.d.ts.map +0 -1
- package/dist/kits/core/factory/studio-kit.js +0 -96
- package/dist/kits/core/factory/studio-kit.js.map +0 -1
- package/dist/kits/core/factory/workflow-kit.d.ts +0 -57
- package/dist/kits/core/factory/workflow-kit.d.ts.map +0 -1
- package/dist/kits/core/factory/workflow-kit.js +0 -107
- package/dist/kits/core/factory/workflow-kit.js.map +0 -1
- package/dist/kits/core/index.d.ts +0 -25
- package/dist/kits/core/index.d.ts.map +0 -1
- package/dist/kits/core/index.js +0 -111
- package/dist/kits/core/index.js.map +0 -1
- package/dist/kits/core/types/index.d.ts +0 -65
- package/dist/kits/core/types/index.d.ts.map +0 -1
- package/dist/kits/core/types/index.js +0 -49
- package/dist/kits/core/types/index.js.map +0 -1
- package/dist/kits/core/validation/index.d.ts +0 -42
- package/dist/kits/core/validation/index.d.ts.map +0 -1
- package/dist/kits/core/validation/index.js +0 -128
- package/dist/kits/core/validation/index.js.map +0 -1
- package/dist/kits/fork-policy.d.ts +0 -78
- package/dist/kits/fork-policy.d.ts.map +0 -1
- package/dist/kits/fork-policy.js +0 -92
- package/dist/kits/fork-policy.js.map +0 -1
- package/dist/kits/fork-registry.d.ts +0 -54
- package/dist/kits/fork-registry.d.ts.map +0 -1
- package/dist/kits/fork-registry.js +0 -201
- package/dist/kits/fork-registry.js.map +0 -1
- package/dist/kits/fork-remote.d.ts +0 -52
- package/dist/kits/fork-remote.d.ts.map +0 -1
- package/dist/kits/fork-remote.js +0 -116
- package/dist/kits/fork-remote.js.map +0 -1
- package/dist/kits/fork-sync-agent.d.ts +0 -51
- package/dist/kits/fork-sync-agent.d.ts.map +0 -1
- package/dist/kits/fork-sync-agent.js +0 -435
- package/dist/kits/fork-sync-agent.js.map +0 -1
- package/dist/kits/fork-sync.d.ts +0 -32
- package/dist/kits/fork-sync.d.ts.map +0 -1
- package/dist/kits/fork-sync.js +0 -590
- package/dist/kits/fork-sync.js.map +0 -1
- package/dist/kits/fork-trace.d.ts +0 -29
- package/dist/kits/fork-trace.d.ts.map +0 -1
- package/dist/kits/fork-trace.js +0 -54
- package/dist/kits/fork-trace.js.map +0 -1
- package/dist/kits/fork-types.d.ts +0 -198
- package/dist/kits/fork-types.d.ts.map +0 -1
- package/dist/kits/fork-types.js +0 -16
- package/dist/kits/fork-types.js.map +0 -1
- package/dist/kits/service.d.ts +0 -63
- package/dist/kits/service.d.ts.map +0 -1
- package/dist/kits/service.js +0 -630
- package/dist/kits/service.js.map +0 -1
- package/dist/prompts/database.d.ts +0 -3
- package/dist/prompts/database.d.ts.map +0 -1
- package/dist/prompts/database.js +0 -144
- package/dist/prompts/database.js.map +0 -1
- package/dist/prompts/llm.d.ts +0 -3
- package/dist/prompts/llm.d.ts.map +0 -1
- package/dist/prompts/llm.js +0 -37
- package/dist/prompts/llm.js.map +0 -1
- package/dist/prompts/logging.d.ts +0 -3
- package/dist/prompts/logging.d.ts.map +0 -1
- package/dist/prompts/logging.js +0 -31
- package/dist/prompts/logging.js.map +0 -1
- package/dist/prompts/secrets.d.ts +0 -4
- package/dist/prompts/secrets.d.ts.map +0 -1
- package/dist/prompts/secrets.js +0 -85
- package/dist/prompts/secrets.js.map +0 -1
- package/dist/prompts/server.d.ts +0 -9
- package/dist/prompts/server.d.ts.map +0 -1
- package/dist/prompts/server.js +0 -154
- package/dist/prompts/server.js.map +0 -1
- package/dist/prompts/storage.d.ts +0 -4
- package/dist/prompts/storage.d.ts.map +0 -1
- package/dist/prompts/storage.js +0 -129
- package/dist/prompts/storage.js.map +0 -1
- package/dist/runtime/agent-harness/auth-store.d.ts +0 -8
- package/dist/runtime/agent-harness/auth-store.d.ts.map +0 -1
- package/dist/runtime/agent-harness/auth-store.js +0 -92
- package/dist/runtime/agent-harness/auth-store.js.map +0 -1
- package/dist/runtime/artifact-contracts/index.d.ts +0 -47
- package/dist/runtime/artifact-contracts/index.d.ts.map +0 -1
- package/dist/runtime/artifact-contracts/index.js +0 -153
- package/dist/runtime/artifact-contracts/index.js.map +0 -1
- package/dist/runtime/artifact-contracts/types.d.ts +0 -82
- package/dist/runtime/artifact-contracts/types.d.ts.map +0 -1
- package/dist/runtime/artifact-contracts/types.js +0 -16
- package/dist/runtime/artifact-contracts/types.js.map +0 -1
- package/dist/runtime/cms-capability-registry/index.d.ts +0 -30
- package/dist/runtime/cms-capability-registry/index.d.ts.map +0 -1
- package/dist/runtime/cms-capability-registry/index.js +0 -183
- package/dist/runtime/cms-capability-registry/index.js.map +0 -1
- package/dist/runtime/cms-capability-registry/types.d.ts +0 -109
- package/dist/runtime/cms-capability-registry/types.d.ts.map +0 -1
- package/dist/runtime/cms-capability-registry/types.js +0 -19
- package/dist/runtime/cms-capability-registry/types.js.map +0 -1
- package/dist/runtime/cms-node-contracts/compile.d.ts +0 -6
- package/dist/runtime/cms-node-contracts/compile.d.ts.map +0 -1
- package/dist/runtime/cms-node-contracts/compile.js +0 -57
- package/dist/runtime/cms-node-contracts/compile.js.map +0 -1
- package/dist/runtime/cms-node-contracts/index.d.ts +0 -6
- package/dist/runtime/cms-node-contracts/index.d.ts.map +0 -1
- package/dist/runtime/cms-node-contracts/index.js +0 -5
- package/dist/runtime/cms-node-contracts/index.js.map +0 -1
- package/dist/runtime/cms-node-contracts/introspect.d.ts +0 -5
- package/dist/runtime/cms-node-contracts/introspect.d.ts.map +0 -1
- package/dist/runtime/cms-node-contracts/introspect.js +0 -61
- package/dist/runtime/cms-node-contracts/introspect.js.map +0 -1
- package/dist/runtime/cms-node-contracts/normalize.d.ts +0 -5
- package/dist/runtime/cms-node-contracts/normalize.d.ts.map +0 -1
- package/dist/runtime/cms-node-contracts/normalize.js +0 -112
- package/dist/runtime/cms-node-contracts/normalize.js.map +0 -1
- package/dist/runtime/cms-node-contracts/presenter.d.ts +0 -9
- package/dist/runtime/cms-node-contracts/presenter.d.ts.map +0 -1
- package/dist/runtime/cms-node-contracts/presenter.js +0 -117
- package/dist/runtime/cms-node-contracts/presenter.js.map +0 -1
- package/dist/runtime/cms-node-contracts/types.d.ts +0 -76
- package/dist/runtime/cms-node-contracts/types.d.ts.map +0 -1
- package/dist/runtime/cms-node-contracts/types.js +0 -2
- package/dist/runtime/cms-node-contracts/types.js.map +0 -1
- package/dist/runtime/dynamic-registry-pipeline/index.d.ts +0 -41
- package/dist/runtime/dynamic-registry-pipeline/index.d.ts.map +0 -1
- package/dist/runtime/dynamic-registry-pipeline/index.js +0 -224
- package/dist/runtime/dynamic-registry-pipeline/index.js.map +0 -1
- package/dist/runtime/dynamic-registry-pipeline/types.d.ts +0 -61
- package/dist/runtime/dynamic-registry-pipeline/types.d.ts.map +0 -1
- package/dist/runtime/dynamic-registry-pipeline/types.js +0 -14
- package/dist/runtime/dynamic-registry-pipeline/types.js.map +0 -1
- package/dist/runtime/hosted-execution-client/index.d.ts +0 -45
- package/dist/runtime/hosted-execution-client/index.d.ts.map +0 -1
- package/dist/runtime/hosted-execution-client/index.js +0 -527
- package/dist/runtime/hosted-execution-client/index.js.map +0 -1
- package/dist/runtime/hosted-execution-client/types.d.ts +0 -125
- package/dist/runtime/hosted-execution-client/types.d.ts.map +0 -1
- package/dist/runtime/hosted-execution-client/types.js +0 -9
- package/dist/runtime/hosted-execution-client/types.js.map +0 -1
- package/dist/runtime/index.d.ts +0 -24
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js +0 -24
- package/dist/runtime/index.js.map +0 -1
- package/dist/runtime/machine-capability-resolver/index.d.ts +0 -32
- package/dist/runtime/machine-capability-resolver/index.d.ts.map +0 -1
- package/dist/runtime/machine-capability-resolver/index.js +0 -131
- package/dist/runtime/machine-capability-resolver/index.js.map +0 -1
- package/dist/runtime/machine-capability-resolver/types.d.ts +0 -46
- package/dist/runtime/machine-capability-resolver/types.d.ts.map +0 -1
- package/dist/runtime/machine-capability-resolver/types.js +0 -13
- package/dist/runtime/machine-capability-resolver/types.js.map +0 -1
- package/dist/runtime/native-intelligence/contract.d.ts +0 -174
- package/dist/runtime/native-intelligence/contract.d.ts.map +0 -1
- package/dist/runtime/native-intelligence/contract.js +0 -23
- package/dist/runtime/native-intelligence/contract.js.map +0 -1
- package/dist/runtime/native-intelligence/index.d.ts +0 -38
- package/dist/runtime/native-intelligence/index.d.ts.map +0 -1
- package/dist/runtime/native-intelligence/index.js +0 -121
- package/dist/runtime/native-intelligence/index.js.map +0 -1
- package/dist/runtime/native-intelligence/normalizer.d.ts +0 -22
- package/dist/runtime/native-intelligence/normalizer.d.ts.map +0 -1
- package/dist/runtime/native-intelligence/normalizer.js +0 -307
- package/dist/runtime/native-intelligence/normalizer.js.map +0 -1
- package/dist/runtime/native-intelligence/planner.d.ts +0 -22
- package/dist/runtime/native-intelligence/planner.d.ts.map +0 -1
- package/dist/runtime/native-intelligence/planner.js +0 -312
- package/dist/runtime/native-intelligence/planner.js.map +0 -1
- package/dist/runtime/native-intelligence/provider.d.ts +0 -27
- package/dist/runtime/native-intelligence/provider.d.ts.map +0 -1
- package/dist/runtime/native-intelligence/provider.js +0 -221
- package/dist/runtime/native-intelligence/provider.js.map +0 -1
- package/dist/runtime/native-intelligence/recommender.d.ts +0 -23
- package/dist/runtime/native-intelligence/recommender.d.ts.map +0 -1
- package/dist/runtime/native-intelligence/recommender.js +0 -299
- package/dist/runtime/native-intelligence/recommender.js.map +0 -1
- package/dist/runtime/native-intelligence/summarizer.d.ts +0 -22
- package/dist/runtime/native-intelligence/summarizer.d.ts.map +0 -1
- package/dist/runtime/native-intelligence/summarizer.js +0 -228
- package/dist/runtime/native-intelligence/summarizer.js.map +0 -1
- package/dist/runtime/open-agents/contract.d.ts +0 -58
- package/dist/runtime/open-agents/contract.d.ts.map +0 -1
- package/dist/runtime/open-agents/contract.js +0 -26
- package/dist/runtime/open-agents/contract.js.map +0 -1
- package/dist/runtime/open-agents/index.d.ts +0 -15
- package/dist/runtime/open-agents/index.d.ts.map +0 -1
- package/dist/runtime/open-agents/index.js +0 -72
- package/dist/runtime/open-agents/index.js.map +0 -1
- package/dist/runtime/open-agents/provider.d.ts +0 -32
- package/dist/runtime/open-agents/provider.d.ts.map +0 -1
- package/dist/runtime/open-agents/provider.js +0 -190
- package/dist/runtime/open-agents/provider.js.map +0 -1
- package/dist/runtime/qwen-code/contract.d.ts +0 -79
- package/dist/runtime/qwen-code/contract.d.ts.map +0 -1
- package/dist/runtime/qwen-code/contract.js +0 -40
- package/dist/runtime/qwen-code/contract.js.map +0 -1
- package/dist/runtime/qwen-code/health.d.ts +0 -11
- package/dist/runtime/qwen-code/health.d.ts.map +0 -1
- package/dist/runtime/qwen-code/health.js +0 -111
- package/dist/runtime/qwen-code/health.js.map +0 -1
- package/dist/runtime/qwen-code/index.d.ts +0 -26
- package/dist/runtime/qwen-code/index.d.ts.map +0 -1
- package/dist/runtime/qwen-code/index.js +0 -93
- package/dist/runtime/qwen-code/index.js.map +0 -1
- package/dist/runtime/qwen-code/provider.d.ts +0 -23
- package/dist/runtime/qwen-code/provider.d.ts.map +0 -1
- package/dist/runtime/qwen-code/provider.js +0 -134
- package/dist/runtime/qwen-code/provider.js.map +0 -1
- package/dist/runtime/workflow-hygiene/index.d.ts +0 -4
- package/dist/runtime/workflow-hygiene/index.d.ts.map +0 -1
- package/dist/runtime/workflow-hygiene/index.js +0 -3
- package/dist/runtime/workflow-hygiene/index.js.map +0 -1
- package/dist/runtime/workflow-hygiene/labels.d.ts +0 -4
- package/dist/runtime/workflow-hygiene/labels.d.ts.map +0 -1
- package/dist/runtime/workflow-hygiene/labels.js +0 -64
- package/dist/runtime/workflow-hygiene/labels.js.map +0 -1
- package/dist/runtime/workflow-hygiene/summaries.d.ts +0 -11
- package/dist/runtime/workflow-hygiene/summaries.d.ts.map +0 -1
- package/dist/runtime/workflow-hygiene/summaries.js +0 -17
- package/dist/runtime/workflow-hygiene/summaries.js.map +0 -1
- package/dist/runtime/workflow-hygiene/types.d.ts +0 -12
- package/dist/runtime/workflow-hygiene/types.d.ts.map +0 -1
- package/dist/runtime/workflow-hygiene/types.js +0 -2
- package/dist/runtime/workflow-hygiene/types.js.map +0 -1
- package/dist/starter/init.d.ts +0 -18
- package/dist/starter/init.d.ts.map +0 -1
- package/dist/starter/init.js +0 -108
- package/dist/starter/init.js.map +0 -1
- package/dist/starter/source-import/agent.d.ts +0 -60
- package/dist/starter/source-import/agent.d.ts.map +0 -1
- package/dist/starter/source-import/agent.js +0 -302
- package/dist/starter/source-import/agent.js.map +0 -1
- package/dist/starter/source-import/detect.d.ts +0 -20
- package/dist/starter/source-import/detect.d.ts.map +0 -1
- package/dist/starter/source-import/detect.js +0 -197
- package/dist/starter/source-import/detect.js.map +0 -1
- package/dist/starter/source-import/github-source.d.ts +0 -66
- package/dist/starter/source-import/github-source.d.ts.map +0 -1
- package/dist/starter/source-import/github-source.js +0 -233
- package/dist/starter/source-import/github-source.js.map +0 -1
- package/dist/starter/source-import/index.d.ts +0 -31
- package/dist/starter/source-import/index.d.ts.map +0 -1
- package/dist/starter/source-import/index.js +0 -31
- package/dist/starter/source-import/index.js.map +0 -1
- package/dist/starter/source-import/materialize.d.ts +0 -61
- package/dist/starter/source-import/materialize.d.ts.map +0 -1
- package/dist/starter/source-import/materialize.js +0 -260
- package/dist/starter/source-import/materialize.js.map +0 -1
- package/dist/starter/source-import/plan.d.ts +0 -39
- package/dist/starter/source-import/plan.d.ts.map +0 -1
- package/dist/starter/source-import/plan.js +0 -158
- package/dist/starter/source-import/plan.js.map +0 -1
- package/dist/starter/source-import/security.d.ts +0 -42
- package/dist/starter/source-import/security.d.ts.map +0 -1
- package/dist/starter/source-import/security.js +0 -323
- package/dist/starter/source-import/security.js.map +0 -1
- package/dist/starter/source-import/skills-source.d.ts +0 -28
- package/dist/starter/source-import/skills-source.d.ts.map +0 -1
- package/dist/starter/source-import/skills-source.js +0 -419
- package/dist/starter/source-import/skills-source.js.map +0 -1
- package/dist/starter/source-import/summarize.d.ts +0 -25
- package/dist/starter/source-import/summarize.d.ts.map +0 -1
- package/dist/starter/source-import/summarize.js +0 -107
- package/dist/starter/source-import/summarize.js.map +0 -1
- package/dist/starter/source-import/types.d.ts +0 -357
- package/dist/starter/source-import/types.d.ts.map +0 -1
- package/dist/starter/source-import/types.js +0 -28
- package/dist/starter/source-import/types.js.map +0 -1
- package/dist/starter/types.d.ts +0 -46
- package/dist/starter/types.d.ts.map +0 -1
- package/dist/starter/types.js +0 -11
- package/dist/starter/types.js.map +0 -1
- package/dist/status/probes.d.ts +0 -25
- package/dist/status/probes.d.ts.map +0 -1
- package/dist/status/probes.js +0 -297
- package/dist/status/probes.js.map +0 -1
- package/dist/status/runner.d.ts +0 -18
- package/dist/status/runner.d.ts.map +0 -1
- package/dist/status/runner.js +0 -185
- package/dist/status/runner.js.map +0 -1
- package/dist/status/types.d.ts +0 -60
- package/dist/status/types.d.ts.map +0 -1
- package/dist/status/types.js +0 -13
- package/dist/status/types.js.map +0 -1
- package/dist/templates/catalog.d.ts +0 -12
- package/dist/templates/catalog.d.ts.map +0 -1
- package/dist/templates/catalog.js +0 -226
- package/dist/templates/catalog.js.map +0 -1
- package/dist/templates/contract.d.ts +0 -62
- package/dist/templates/contract.d.ts.map +0 -1
- package/dist/templates/contract.js +0 -12
- package/dist/templates/contract.js.map +0 -1
- package/dist/templates/index.d.ts +0 -5
- package/dist/templates/index.d.ts.map +0 -1
- package/dist/templates/index.js +0 -2
- package/dist/templates/index.js.map +0 -1
- package/dist/templates/service.d.ts +0 -19
- package/dist/templates/service.d.ts.map +0 -1
- package/dist/templates/service.js +0 -132
- package/dist/templates/service.js.map +0 -1
- package/dist/utils/banner.d.ts +0 -2
- package/dist/utils/banner.d.ts.map +0 -1
- package/dist/utils/banner.js.map +0 -1
- package/dist/utils/net.d.ts +0 -5
- package/dist/utils/net.d.ts.map +0 -1
- package/dist/utils/net.js +0 -19
- package/dist/utils/net.js.map +0 -1
- package/dist/utils/path-resolver.d.ts +0 -2
- package/dist/utils/path-resolver.d.ts.map +0 -1
- package/dist/utils/path-resolver.js +0 -22
- package/dist/utils/path-resolver.js.map +0 -1
- package/dist/utils/progress.d.ts +0 -24
- package/dist/utils/progress.d.ts.map +0 -1
- package/dist/utils/progress.js +0 -57
- package/dist/utils/progress.js.map +0 -1
- package/dist/utils/table-renderer.d.ts +0 -28
- package/dist/utils/table-renderer.d.ts.map +0 -1
- package/dist/utils/table-renderer.js +0 -83
- package/dist/utils/table-renderer.js.map +0 -1
|
@@ -1,1350 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CLI Commands — workflow
|
|
3
|
-
*
|
|
4
|
-
* Auth-gated workflow discovery and pipeline assembly.
|
|
5
|
-
*
|
|
6
|
-
* If the user is not authenticated (no active growthub auth session),
|
|
7
|
-
* the workflow path remains greyed out in the discovery hub. When
|
|
8
|
-
* authenticated, the user sees:
|
|
9
|
-
*
|
|
10
|
-
* 🔗 Workflows
|
|
11
|
-
* ├── CMS Node Contracts (contract discovery + inspection)
|
|
12
|
-
* ├── Dynamic Pipelines (hosted assembly + execution)
|
|
13
|
-
* └── Saved Workflows (user-persisted pipelines)
|
|
14
|
-
*
|
|
15
|
-
* Templates are the real production CMS workflow_node records.
|
|
16
|
-
* Only top-level items get emoji; sub-items have clean titles.
|
|
17
|
-
* Pagination at 10 options with extended view and search.
|
|
18
|
-
*/
|
|
19
|
-
import fs from "node:fs";
|
|
20
|
-
import path from "node:path";
|
|
21
|
-
import * as p from "@clack/prompts";
|
|
22
|
-
import pc from "picocolors";
|
|
23
|
-
import { getWorkflowAccess } from "../auth/workflow-access.js";
|
|
24
|
-
import { readSession, isSessionExpired } from "../auth/session-store.js";
|
|
25
|
-
import { archiveHostedWorkflow, deleteHostedWorkflow, fetchHostedWorkflow, listHostedWorkflows, saveHostedWorkflow, HostedEndpointUnavailableError, } from "../auth/hosted-client.js";
|
|
26
|
-
import { createCmsCapabilityRegistryClient, CAPABILITY_FAMILIES, } from "../runtime/cms-capability-registry/index.js";
|
|
27
|
-
import { createMachineCapabilityResolver, } from "../runtime/machine-capability-resolver/index.js";
|
|
28
|
-
import { createPipelineBuilder, deserializePipeline, } from "../runtime/dynamic-registry-pipeline/index.js";
|
|
29
|
-
import { introspectNodeContract, normalizeNodeBindings, compileToHostedWorkflowConfig, buildPreExecutionSummary, renderContractCard, renderPreExecutionSummary, renderPreSaveReview, } from "../runtime/cms-node-contracts/index.js";
|
|
30
|
-
import { createWorkflowHygieneStore, enrichWorkflowSummaries, renderWorkflowLabel, } from "../runtime/workflow-hygiene/index.js";
|
|
31
|
-
import { createNativeIntelligenceProvider, } from "../runtime/native-intelligence/index.js";
|
|
32
|
-
import { executeHostedPipeline, runPipelineAssembler } from "./pipeline.js";
|
|
33
|
-
import { printPaperclipCliBanner } from "../utils/banner.js";
|
|
34
|
-
import { resolvePaperclipHomeDir } from "../config/home.js";
|
|
35
|
-
// ---------------------------------------------------------------------------
|
|
36
|
-
// Constants
|
|
37
|
-
// ---------------------------------------------------------------------------
|
|
38
|
-
const PAGE_SIZE = 10;
|
|
39
|
-
// ---------------------------------------------------------------------------
|
|
40
|
-
// Display helpers
|
|
41
|
-
// ---------------------------------------------------------------------------
|
|
42
|
-
const FAMILY_CONFIG = {
|
|
43
|
-
video: { color: pc.magenta, label: "Video" },
|
|
44
|
-
image: { color: pc.cyan, label: "Image" },
|
|
45
|
-
slides: { color: pc.yellow, label: "Slides" },
|
|
46
|
-
text: { color: pc.green, label: "Text" },
|
|
47
|
-
data: { color: pc.blue, label: "Data" },
|
|
48
|
-
ops: { color: pc.red, label: "Ops" },
|
|
49
|
-
research: { color: pc.blue, label: "Research" },
|
|
50
|
-
vision: { color: pc.cyan, label: "Vision" },
|
|
51
|
-
};
|
|
52
|
-
const FAMILY_EMOJI = {
|
|
53
|
-
video: "🎬",
|
|
54
|
-
image: "🖼️",
|
|
55
|
-
slides: "🧩",
|
|
56
|
-
text: "📝",
|
|
57
|
-
data: "📊",
|
|
58
|
-
ops: "🛠️",
|
|
59
|
-
research: "🔎",
|
|
60
|
-
vision: "👁️",
|
|
61
|
-
};
|
|
62
|
-
function familyLabel(family) {
|
|
63
|
-
const cfg = FAMILY_CONFIG[family];
|
|
64
|
-
return cfg ? cfg.color(cfg.label) : family;
|
|
65
|
-
}
|
|
66
|
-
function hr(width = 72) {
|
|
67
|
-
return pc.dim("─".repeat(width));
|
|
68
|
-
}
|
|
69
|
-
function stripAnsi(str) {
|
|
70
|
-
// eslint-disable-next-line no-control-regex
|
|
71
|
-
return str.replace(/\x1B\[[0-9;]*m/g, "");
|
|
72
|
-
}
|
|
73
|
-
function box(lines) {
|
|
74
|
-
const padded = lines.map((l) => " " + l);
|
|
75
|
-
const width = Math.max(...padded.map((l) => stripAnsi(l).length)) + 4;
|
|
76
|
-
const top = pc.dim("┌" + "─".repeat(width) + "┐");
|
|
77
|
-
const bottom = pc.dim("└" + "─".repeat(width) + "┘");
|
|
78
|
-
const body = padded.map((l) => {
|
|
79
|
-
const pad = width - stripAnsi(l).length;
|
|
80
|
-
return pc.dim("│") + l + " ".repeat(pad) + pc.dim("│");
|
|
81
|
-
});
|
|
82
|
-
return [top, ...body, bottom].join("\n");
|
|
83
|
-
}
|
|
84
|
-
// ---------------------------------------------------------------------------
|
|
85
|
-
// Auth gate
|
|
86
|
-
// ---------------------------------------------------------------------------
|
|
87
|
-
function isAuthenticated() {
|
|
88
|
-
const session = readSession();
|
|
89
|
-
if (!session)
|
|
90
|
-
return false;
|
|
91
|
-
return !isSessionExpired(session);
|
|
92
|
-
}
|
|
93
|
-
// ---------------------------------------------------------------------------
|
|
94
|
-
// Saved workflows directory
|
|
95
|
-
// ---------------------------------------------------------------------------
|
|
96
|
-
function resolveSavedWorkflowsDir() {
|
|
97
|
-
return path.resolve(resolvePaperclipHomeDir(), "workflows");
|
|
98
|
-
}
|
|
99
|
-
function resolveDeletedWorkflowIdsPath() {
|
|
100
|
-
return path.resolve(resolvePaperclipHomeDir(), "workflow-hygiene", "deleted-workflows.json");
|
|
101
|
-
}
|
|
102
|
-
function readDeletedWorkflowIds() {
|
|
103
|
-
const filePath = resolveDeletedWorkflowIdsPath();
|
|
104
|
-
if (!fs.existsSync(filePath))
|
|
105
|
-
return new Set();
|
|
106
|
-
try {
|
|
107
|
-
const raw = JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
108
|
-
if (!Array.isArray(raw?.workflowIds))
|
|
109
|
-
return new Set();
|
|
110
|
-
return new Set(raw.workflowIds.filter((value) => typeof value === "string"));
|
|
111
|
-
}
|
|
112
|
-
catch {
|
|
113
|
-
return new Set();
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
function writeDeletedWorkflowIds(ids) {
|
|
117
|
-
const filePath = resolveDeletedWorkflowIdsPath();
|
|
118
|
-
fs.mkdirSync(path.dirname(filePath), { recursive: true });
|
|
119
|
-
fs.writeFileSync(filePath, `${JSON.stringify({ workflowIds: [...ids] }, null, 2)}\n`, "utf-8");
|
|
120
|
-
}
|
|
121
|
-
function markWorkflowDeletedLocally(workflowId) {
|
|
122
|
-
const ids = readDeletedWorkflowIds();
|
|
123
|
-
ids.add(workflowId);
|
|
124
|
-
writeDeletedWorkflowIds(ids);
|
|
125
|
-
}
|
|
126
|
-
function isWorkflowDeletedLocally(workflowId) {
|
|
127
|
-
return readDeletedWorkflowIds().has(workflowId);
|
|
128
|
-
}
|
|
129
|
-
function effectiveWorkflowLabel(entry, hygieneStore) {
|
|
130
|
-
const explicitLabel = hygieneStore.getLabel(entry.workflowId);
|
|
131
|
-
if (explicitLabel)
|
|
132
|
-
return explicitLabel;
|
|
133
|
-
if (entry.isActive === false)
|
|
134
|
-
return "archived";
|
|
135
|
-
return entry.workflowLabel ?? "experimental";
|
|
136
|
-
}
|
|
137
|
-
function withEffectiveWorkflowLabels(entries, hygieneStore) {
|
|
138
|
-
return entries.map((entry) => ({
|
|
139
|
-
...entry,
|
|
140
|
-
workflowLabel: effectiveWorkflowLabel(entry, hygieneStore),
|
|
141
|
-
}));
|
|
142
|
-
}
|
|
143
|
-
function filterLocallyDeletedWorkflows(entries) {
|
|
144
|
-
const deletedIds = readDeletedWorkflowIds();
|
|
145
|
-
return entries.filter((entry) => !deletedIds.has(entry.workflowId));
|
|
146
|
-
}
|
|
147
|
-
async function runBulkArchive(entries, hygieneStore) {
|
|
148
|
-
if (entries.length === 0) {
|
|
149
|
-
p.note("No workflows selected for archive.", "Bulk archive skipped");
|
|
150
|
-
return;
|
|
151
|
-
}
|
|
152
|
-
const spinner = p.spinner();
|
|
153
|
-
spinner.start(`Archiving ${entries.length} workflow${entries.length === 1 ? "" : "s"}...`);
|
|
154
|
-
let ok = 0;
|
|
155
|
-
let failed = 0;
|
|
156
|
-
let localFallback = 0;
|
|
157
|
-
for (const entry of entries) {
|
|
158
|
-
try {
|
|
159
|
-
await archiveSavedWorkflow(entry);
|
|
160
|
-
hygieneStore.setLabel(entry.workflowId, "archived");
|
|
161
|
-
ok += 1;
|
|
162
|
-
}
|
|
163
|
-
catch {
|
|
164
|
-
// Never dead-end archive cleanup: preserve archived state locally.
|
|
165
|
-
hygieneStore.setLabel(entry.workflowId, "archived");
|
|
166
|
-
ok += 1;
|
|
167
|
-
localFallback += 1;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
spinner.stop(`Archive complete: ${ok} succeeded, ${failed} failed${localFallback > 0 ? ` (${localFallback} local fallback)` : ""}.`);
|
|
171
|
-
}
|
|
172
|
-
async function runBulkDelete(entries) {
|
|
173
|
-
if (entries.length === 0) {
|
|
174
|
-
p.note("No workflows selected for deletion.", "Bulk delete skipped");
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
const spinner = p.spinner();
|
|
178
|
-
spinner.start(`Deleting ${entries.length} workflow${entries.length === 1 ? "" : "s"}...`);
|
|
179
|
-
let ok = 0;
|
|
180
|
-
let failed = 0;
|
|
181
|
-
let localFallback = 0;
|
|
182
|
-
for (const entry of entries) {
|
|
183
|
-
try {
|
|
184
|
-
await deleteSavedWorkflow(entry);
|
|
185
|
-
ok += 1;
|
|
186
|
-
}
|
|
187
|
-
catch {
|
|
188
|
-
// Never dead-end delete cleanup: hide locally when hosted delete fails.
|
|
189
|
-
markWorkflowDeletedLocally(entry.workflowId);
|
|
190
|
-
ok += 1;
|
|
191
|
-
localFallback += 1;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
spinner.stop(`Delete complete: ${ok} succeeded, ${failed} failed${localFallback > 0 ? ` (${localFallback} local fallback)` : ""}.`);
|
|
195
|
-
}
|
|
196
|
-
function runBulkUnarchive(entries, hygieneStore, restoreLabel) {
|
|
197
|
-
if (entries.length === 0) {
|
|
198
|
-
p.note("No workflows selected for unarchive.", "Bulk unarchive skipped");
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
for (const entry of entries) {
|
|
202
|
-
hygieneStore.setLabel(entry.workflowId, restoreLabel);
|
|
203
|
-
}
|
|
204
|
-
p.log.success(`Unarchived ${entries.length} workflow${entries.length === 1 ? "" : "s"} to ${renderWorkflowLabel(restoreLabel)}.`);
|
|
205
|
-
}
|
|
206
|
-
function listLocalSavedWorkflows() {
|
|
207
|
-
const dir = resolveSavedWorkflowsDir();
|
|
208
|
-
if (!fs.existsSync(dir))
|
|
209
|
-
return [];
|
|
210
|
-
const entries = fs.readdirSync(dir, { withFileTypes: true })
|
|
211
|
-
.filter((e) => e.isFile() && e.name.endsWith(".json"))
|
|
212
|
-
.map((e) => {
|
|
213
|
-
try {
|
|
214
|
-
const raw = JSON.parse(fs.readFileSync(path.resolve(dir, e.name), "utf-8"));
|
|
215
|
-
const pipeline = raw.pipeline ?? raw;
|
|
216
|
-
return {
|
|
217
|
-
filename: e.name,
|
|
218
|
-
workflowId: pipeline.metadata?.hostedWorkflowId ?? pipeline.pipelineId ?? e.name.replace(".json", ""),
|
|
219
|
-
pipelineId: pipeline.pipelineId ?? e.name.replace(".json", ""),
|
|
220
|
-
name: pipeline.metadata?.workflowName ?? pipeline.pipelineId ?? e.name.replace(".json", ""),
|
|
221
|
-
nodeCount: Array.isArray(pipeline.nodes) ? pipeline.nodes.length : 0,
|
|
222
|
-
executionMode: pipeline.executionMode ?? "hosted",
|
|
223
|
-
createdAt: raw.createdAt ?? "",
|
|
224
|
-
source: "local",
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
catch {
|
|
228
|
-
return null;
|
|
229
|
-
}
|
|
230
|
-
});
|
|
231
|
-
return entries
|
|
232
|
-
.filter((entry) => entry !== null)
|
|
233
|
-
.sort((a, b) => b.createdAt.localeCompare(a.createdAt));
|
|
234
|
-
}
|
|
235
|
-
async function listSavedWorkflows() {
|
|
236
|
-
const session = readSession();
|
|
237
|
-
if (!session || isSessionExpired(session)) {
|
|
238
|
-
return listLocalSavedWorkflows();
|
|
239
|
-
}
|
|
240
|
-
try {
|
|
241
|
-
const response = await listHostedWorkflows(session);
|
|
242
|
-
if (!response || !Array.isArray(response.workflows))
|
|
243
|
-
return listLocalSavedWorkflows();
|
|
244
|
-
return response.workflows.map((workflow) => ({
|
|
245
|
-
workflowId: workflow.workflowId,
|
|
246
|
-
pipelineId: workflow.workflowId,
|
|
247
|
-
name: workflow.name,
|
|
248
|
-
nodeCount: workflow.latestVersion?.nodeCount ?? 0,
|
|
249
|
-
executionMode: "hosted",
|
|
250
|
-
createdAt: workflow.createdAt,
|
|
251
|
-
updatedAt: workflow.updatedAt,
|
|
252
|
-
versionCount: workflow.versionCount,
|
|
253
|
-
source: "hosted",
|
|
254
|
-
isActive: workflow.isActive,
|
|
255
|
-
}));
|
|
256
|
-
}
|
|
257
|
-
catch (err) {
|
|
258
|
-
if (err instanceof HostedEndpointUnavailableError) {
|
|
259
|
-
return listLocalSavedWorkflows();
|
|
260
|
-
}
|
|
261
|
-
throw err;
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
async function archiveSavedWorkflow(entry) {
|
|
265
|
-
if (entry.source === "hosted") {
|
|
266
|
-
const session = readSession();
|
|
267
|
-
if (!session || isSessionExpired(session)) {
|
|
268
|
-
throw new Error("Hosted session expired while archiving workflow.");
|
|
269
|
-
}
|
|
270
|
-
const result = await archiveHostedWorkflow(session, { workflowId: entry.workflowId });
|
|
271
|
-
if (!result?.ok) {
|
|
272
|
-
throw new Error(`Failed to archive hosted workflow ${entry.workflowId}.`);
|
|
273
|
-
}
|
|
274
|
-
return;
|
|
275
|
-
}
|
|
276
|
-
if (!entry.filename) {
|
|
277
|
-
throw new Error("Local workflow entry is missing filename.");
|
|
278
|
-
}
|
|
279
|
-
const dir = resolveSavedWorkflowsDir();
|
|
280
|
-
const archiveDir = path.resolve(dir, "archived");
|
|
281
|
-
fs.mkdirSync(archiveDir, { recursive: true });
|
|
282
|
-
fs.renameSync(path.resolve(dir, entry.filename), path.resolve(archiveDir, entry.filename));
|
|
283
|
-
}
|
|
284
|
-
async function deleteSavedWorkflow(entry) {
|
|
285
|
-
if (entry.source === "hosted") {
|
|
286
|
-
const session = readSession();
|
|
287
|
-
if (!session || isSessionExpired(session)) {
|
|
288
|
-
throw new Error("Hosted session expired while deleting workflow.");
|
|
289
|
-
}
|
|
290
|
-
try {
|
|
291
|
-
const result = await deleteHostedWorkflow(session, { workflowId: entry.workflowId });
|
|
292
|
-
if (!result?.ok) {
|
|
293
|
-
throw new Error(`Failed to delete hosted workflow ${entry.workflowId}.`);
|
|
294
|
-
}
|
|
295
|
-
markWorkflowDeletedLocally(entry.workflowId);
|
|
296
|
-
return;
|
|
297
|
-
}
|
|
298
|
-
catch {
|
|
299
|
-
// Persist local delete intent so this workflow is hidden in CLI even when
|
|
300
|
-
// hosted lifecycle endpoints fail on this surface.
|
|
301
|
-
markWorkflowDeletedLocally(entry.workflowId);
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
if (!entry.filename) {
|
|
306
|
-
throw new Error("Local workflow entry is missing filename.");
|
|
307
|
-
}
|
|
308
|
-
fs.rmSync(path.resolve(resolveSavedWorkflowsDir(), entry.filename), { force: true });
|
|
309
|
-
markWorkflowDeletedLocally(entry.workflowId);
|
|
310
|
-
}
|
|
311
|
-
async function loadSavedWorkflowDetail(entry) {
|
|
312
|
-
if (entry.source === "hosted") {
|
|
313
|
-
const session = readSession();
|
|
314
|
-
if (!session || isSessionExpired(session)) {
|
|
315
|
-
throw new Error("Hosted session expired while loading workflow detail.");
|
|
316
|
-
}
|
|
317
|
-
const detail = await fetchHostedWorkflow(session, entry.workflowId);
|
|
318
|
-
if (!detail) {
|
|
319
|
-
throw new Error(`Hosted workflow ${entry.workflowId} not found.`);
|
|
320
|
-
}
|
|
321
|
-
return {
|
|
322
|
-
pipeline: (detail.latestVersion.config ?? {}),
|
|
323
|
-
createdAt: detail.latestVersion.createdAt,
|
|
324
|
-
};
|
|
325
|
-
}
|
|
326
|
-
const dir = resolveSavedWorkflowsDir();
|
|
327
|
-
const content = fs.readFileSync(path.resolve(dir, entry.filename), "utf-8");
|
|
328
|
-
const raw = JSON.parse(content);
|
|
329
|
-
return {
|
|
330
|
-
pipeline: (raw.pipeline ?? raw),
|
|
331
|
-
createdAt: raw.createdAt ?? "",
|
|
332
|
-
};
|
|
333
|
-
}
|
|
334
|
-
function toDynamicPipelineFromHostedWorkflow(entry, pipeline) {
|
|
335
|
-
const rawNodes = Array.isArray(pipeline.nodes) ? pipeline.nodes : [];
|
|
336
|
-
const rawEdges = Array.isArray(pipeline.edges) ? pipeline.edges : [];
|
|
337
|
-
const cmsNodes = rawNodes.filter((node) => {
|
|
338
|
-
return typeof node === "object" && node !== null && node.type === "cmsNode";
|
|
339
|
-
});
|
|
340
|
-
const upstreamNodeIdsByTarget = new Map();
|
|
341
|
-
for (const edge of rawEdges) {
|
|
342
|
-
if (typeof edge !== "object" || edge === null)
|
|
343
|
-
continue;
|
|
344
|
-
const source = typeof edge.source === "string"
|
|
345
|
-
? edge.source
|
|
346
|
-
: null;
|
|
347
|
-
const target = typeof edge.target === "string"
|
|
348
|
-
? edge.target
|
|
349
|
-
: null;
|
|
350
|
-
if (!source || !target || source === "start-1" || target === "end-1")
|
|
351
|
-
continue;
|
|
352
|
-
const existing = upstreamNodeIdsByTarget.get(target) ?? [];
|
|
353
|
-
existing.push(source);
|
|
354
|
-
upstreamNodeIdsByTarget.set(target, existing);
|
|
355
|
-
}
|
|
356
|
-
return {
|
|
357
|
-
pipelineId: entry.pipelineId,
|
|
358
|
-
executionMode: "hosted",
|
|
359
|
-
nodes: cmsNodes.map((node) => {
|
|
360
|
-
const id = typeof node.id === "string" ? node.id : `node-${Math.random().toString(36).slice(2, 8)}`;
|
|
361
|
-
const data = typeof node.data === "object" && node.data !== null
|
|
362
|
-
? node.data
|
|
363
|
-
: {};
|
|
364
|
-
return {
|
|
365
|
-
id,
|
|
366
|
-
slug: typeof data.slug === "string" ? data.slug : id,
|
|
367
|
-
bindings: typeof data.inputs === "object" && data.inputs !== null
|
|
368
|
-
? data.inputs
|
|
369
|
-
: {},
|
|
370
|
-
upstreamNodeIds: upstreamNodeIdsByTarget.get(id),
|
|
371
|
-
};
|
|
372
|
-
}),
|
|
373
|
-
metadata: {
|
|
374
|
-
hostedWorkflowId: entry.workflowId,
|
|
375
|
-
workflowName: entry.name,
|
|
376
|
-
},
|
|
377
|
-
};
|
|
378
|
-
}
|
|
379
|
-
function toExecutableSavedWorkflowPipeline(entry, pipeline) {
|
|
380
|
-
const looksLikeDynamicPipeline = Array.isArray(pipeline.nodes) &&
|
|
381
|
-
pipeline.nodes.every((node) => {
|
|
382
|
-
if (typeof node !== "object" || node === null)
|
|
383
|
-
return false;
|
|
384
|
-
const record = node;
|
|
385
|
-
return typeof record.id === "string" && typeof record.slug === "string";
|
|
386
|
-
});
|
|
387
|
-
if (looksLikeDynamicPipeline) {
|
|
388
|
-
const parsed = deserializePipeline(pipeline);
|
|
389
|
-
return {
|
|
390
|
-
...parsed,
|
|
391
|
-
metadata: {
|
|
392
|
-
...(parsed.metadata ?? {}),
|
|
393
|
-
hostedWorkflowId: entry.workflowId,
|
|
394
|
-
workflowName: entry.name,
|
|
395
|
-
},
|
|
396
|
-
};
|
|
397
|
-
}
|
|
398
|
-
return toDynamicPipelineFromHostedWorkflow(entry, pipeline);
|
|
399
|
-
}
|
|
400
|
-
async function paginatedSelect(message, allOptions, opts) {
|
|
401
|
-
let offset = 0;
|
|
402
|
-
let filtered = allOptions;
|
|
403
|
-
while (true) {
|
|
404
|
-
const page = filtered.slice(offset, offset + PAGE_SIZE);
|
|
405
|
-
const hasMore = offset + PAGE_SIZE < filtered.length;
|
|
406
|
-
const hasPrev = offset > 0;
|
|
407
|
-
const totalPages = Math.ceil(filtered.length / PAGE_SIZE);
|
|
408
|
-
const currentPage = Math.floor(offset / PAGE_SIZE) + 1;
|
|
409
|
-
const pageInfo = filtered.length > PAGE_SIZE
|
|
410
|
-
? pc.dim(` (${currentPage}/${totalPages} · ${filtered.length} total)`)
|
|
411
|
-
: "";
|
|
412
|
-
const options = [
|
|
413
|
-
...page.map((o) => ({
|
|
414
|
-
value: o.value,
|
|
415
|
-
label: o.label,
|
|
416
|
-
hint: o.hint,
|
|
417
|
-
})),
|
|
418
|
-
];
|
|
419
|
-
if (hasMore) {
|
|
420
|
-
options.push({ value: "__next_page", label: pc.dim("→ Next page") });
|
|
421
|
-
}
|
|
422
|
-
if (hasPrev) {
|
|
423
|
-
options.push({ value: "__prev_page", label: pc.dim("← Previous page") });
|
|
424
|
-
}
|
|
425
|
-
if (opts?.searchEnabled) {
|
|
426
|
-
options.push({ value: "__search", label: pc.dim("🔎 Search") });
|
|
427
|
-
}
|
|
428
|
-
options.push({
|
|
429
|
-
value: opts?.backValue ?? "__back",
|
|
430
|
-
label: opts?.backLabel ?? "← Back",
|
|
431
|
-
});
|
|
432
|
-
const choice = await p.select({
|
|
433
|
-
message: message + pageInfo,
|
|
434
|
-
options,
|
|
435
|
-
});
|
|
436
|
-
if (p.isCancel(choice))
|
|
437
|
-
return choice;
|
|
438
|
-
if (choice === "__next_page") {
|
|
439
|
-
offset += PAGE_SIZE;
|
|
440
|
-
continue;
|
|
441
|
-
}
|
|
442
|
-
if (choice === "__prev_page") {
|
|
443
|
-
offset = Math.max(0, offset - PAGE_SIZE);
|
|
444
|
-
continue;
|
|
445
|
-
}
|
|
446
|
-
if (choice === "__search") {
|
|
447
|
-
const term = await p.text({
|
|
448
|
-
message: "Search items",
|
|
449
|
-
placeholder: "Type to filter...",
|
|
450
|
-
});
|
|
451
|
-
if (p.isCancel(term))
|
|
452
|
-
return term;
|
|
453
|
-
const searchStr = term.toLowerCase().trim();
|
|
454
|
-
if (searchStr) {
|
|
455
|
-
filtered = allOptions.filter((o) => {
|
|
456
|
-
const haystack = `${o.value} ${o.label} ${o.hint ?? ""}`.toLowerCase();
|
|
457
|
-
return haystack.includes(searchStr);
|
|
458
|
-
});
|
|
459
|
-
offset = 0;
|
|
460
|
-
if (filtered.length === 0) {
|
|
461
|
-
p.note(`No results for "${term}".`, "No matches");
|
|
462
|
-
filtered = allOptions;
|
|
463
|
-
}
|
|
464
|
-
}
|
|
465
|
-
else {
|
|
466
|
-
filtered = allOptions;
|
|
467
|
-
offset = 0;
|
|
468
|
-
}
|
|
469
|
-
continue;
|
|
470
|
-
}
|
|
471
|
-
return choice;
|
|
472
|
-
}
|
|
473
|
-
}
|
|
474
|
-
// ---------------------------------------------------------------------------
|
|
475
|
-
// Template detail card
|
|
476
|
-
// ---------------------------------------------------------------------------
|
|
477
|
-
function printTemplateCard(node) {
|
|
478
|
-
const contract = introspectNodeContract(node);
|
|
479
|
-
const lines = renderContractCard(contract);
|
|
480
|
-
lines.splice(1, 0, `${familyLabel(node.family)} ${node.enabled ? pc.green("enabled") : pc.red("disabled")}`);
|
|
481
|
-
if (node.description)
|
|
482
|
-
lines.push("", pc.dim(node.description));
|
|
483
|
-
console.log("");
|
|
484
|
-
console.log(box(lines));
|
|
485
|
-
console.log("");
|
|
486
|
-
}
|
|
487
|
-
function renderTemplateTree(templates) {
|
|
488
|
-
const byFamily = new Map();
|
|
489
|
-
for (const template of templates) {
|
|
490
|
-
const key = template.family;
|
|
491
|
-
const existing = byFamily.get(key) ?? [];
|
|
492
|
-
existing.push(template);
|
|
493
|
-
byFamily.set(key, existing);
|
|
494
|
-
}
|
|
495
|
-
const families = [...byFamily.entries()].sort((a, b) => a[0].localeCompare(b[0]));
|
|
496
|
-
const lines = [pc.bold("Public CMS Node Tree")];
|
|
497
|
-
for (const [family, nodes] of families) {
|
|
498
|
-
lines.push(`${pc.cyan("•")} ${pc.bold(family)}`);
|
|
499
|
-
const sorted = [...nodes].sort((a, b) => a.slug.localeCompare(b.slug));
|
|
500
|
-
for (const [index, node] of sorted.entries()) {
|
|
501
|
-
const branch = index === sorted.length - 1 ? "└─" : "├─";
|
|
502
|
-
const contract = introspectNodeContract(node);
|
|
503
|
-
const requiredInputs = contract.inputs.filter((input) => input.required).length;
|
|
504
|
-
const optionalInputs = contract.inputs.length - requiredInputs;
|
|
505
|
-
lines.push(` ${branch} ${node.slug} ${pc.dim(`(req:${requiredInputs} opt:${optionalInputs} out:${contract.outputTypes.length})`)}`);
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
lines.push("");
|
|
509
|
-
lines.push(pc.dim("Shortcut: growthub workflow saved --json"));
|
|
510
|
-
return lines;
|
|
511
|
-
}
|
|
512
|
-
function renderWorkflowContractDiscoveryTree(nodes) {
|
|
513
|
-
const byFamily = new Map();
|
|
514
|
-
for (const node of nodes) {
|
|
515
|
-
const key = node.family;
|
|
516
|
-
const group = byFamily.get(key) ?? [];
|
|
517
|
-
group.push(node);
|
|
518
|
-
byFamily.set(key, group);
|
|
519
|
-
}
|
|
520
|
-
const families = [...byFamily.entries()].sort((a, b) => a[0].localeCompare(b[0]));
|
|
521
|
-
const lines = [pc.bold("CMS Node Contract Discovery")];
|
|
522
|
-
for (const [family, familyNodes] of families) {
|
|
523
|
-
const emoji = FAMILY_EMOJI[family] ?? "•";
|
|
524
|
-
lines.push(`${emoji} ${pc.bold(familyLabel(family))} ${pc.dim(`(${familyNodes.length})`)}`);
|
|
525
|
-
const sorted = [...familyNodes].sort((a, b) => a.slug.localeCompare(b.slug));
|
|
526
|
-
for (const [index, node] of sorted.entries()) {
|
|
527
|
-
const branch = index === sorted.length - 1 ? "└─" : "├─";
|
|
528
|
-
const contract = introspectNodeContract(node);
|
|
529
|
-
const requiredInputs = contract.inputs.filter((input) => input.required).length;
|
|
530
|
-
const optionalInputs = contract.inputs.length - requiredInputs;
|
|
531
|
-
lines.push(` ${branch} ${node.slug} ${pc.dim(`req:${requiredInputs} opt:${optionalInputs} bindings:${contract.requiredBindings.length} outputs:${contract.outputTypes.length}`)}`);
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
return lines;
|
|
535
|
-
}
|
|
536
|
-
function buildTemplateOption(template, viewMode) {
|
|
537
|
-
const contract = introspectNodeContract(template);
|
|
538
|
-
const requiredInputs = contract.inputs.filter((input) => input.required).length;
|
|
539
|
-
const optionalInputs = contract.inputs.length - requiredInputs;
|
|
540
|
-
if (viewMode === "expanded") {
|
|
541
|
-
return {
|
|
542
|
-
value: template.slug,
|
|
543
|
-
label: `${template.icon} ${template.displayName} ${pc.dim(template.slug)}`,
|
|
544
|
-
hint: `req:${requiredInputs} opt:${optionalInputs} outputs:${contract.outputTypes.join(", ") || "none"} exec:${contract.executionStrategy}`,
|
|
545
|
-
};
|
|
546
|
-
}
|
|
547
|
-
if (viewMode === "tree") {
|
|
548
|
-
return {
|
|
549
|
-
value: template.slug,
|
|
550
|
-
label: `${template.family} / ${template.slug}`,
|
|
551
|
-
hint: `req:${requiredInputs} opt:${optionalInputs}`,
|
|
552
|
-
};
|
|
553
|
-
}
|
|
554
|
-
return {
|
|
555
|
-
value: template.slug,
|
|
556
|
-
label: `${template.icon} ${template.displayName}`,
|
|
557
|
-
hint: template.description?.slice(0, 55),
|
|
558
|
-
};
|
|
559
|
-
}
|
|
560
|
-
// ---------------------------------------------------------------------------
|
|
561
|
-
// Interactive workflow picker — main entry
|
|
562
|
-
// ---------------------------------------------------------------------------
|
|
563
|
-
export async function runWorkflowPicker(opts) {
|
|
564
|
-
printPaperclipCliBanner();
|
|
565
|
-
const hygieneStore = createWorkflowHygieneStore();
|
|
566
|
-
const access = getWorkflowAccess();
|
|
567
|
-
if (access.state === "unauthenticated") {
|
|
568
|
-
p.intro(pc.bold("Workflows") + pc.dim(" (not connected)"));
|
|
569
|
-
p.note([
|
|
570
|
-
"Workflow assembly requires an authenticated Growthub session.",
|
|
571
|
-
"Run " + pc.cyan("growthub auth login") + " to connect your account.",
|
|
572
|
-
"",
|
|
573
|
-
"Once connected you can:",
|
|
574
|
-
" - Browse CMS node contracts",
|
|
575
|
-
" - Assemble dynamic hosted pipelines",
|
|
576
|
-
" - Save and execute workflows",
|
|
577
|
-
].join("\n"), "Authentication Required");
|
|
578
|
-
if (opts.allowBackToHub)
|
|
579
|
-
return "back";
|
|
580
|
-
return "done";
|
|
581
|
-
}
|
|
582
|
-
p.intro(pc.bold("Workflows"));
|
|
583
|
-
while (true) {
|
|
584
|
-
const refreshedAccess = getWorkflowAccess();
|
|
585
|
-
const topChoice = await p.select({
|
|
586
|
-
message: "What would you like to do?",
|
|
587
|
-
options: [
|
|
588
|
-
{
|
|
589
|
-
value: "contracts",
|
|
590
|
-
label: refreshedAccess.state === "ready"
|
|
591
|
-
? "0. CMS Node Contracts"
|
|
592
|
-
: pc.dim("0. CMS Node Contracts (locked)"),
|
|
593
|
-
hint: refreshedAccess.state === "ready"
|
|
594
|
-
? "Discovery tree for CMS node primitives"
|
|
595
|
-
: refreshedAccess.reason,
|
|
596
|
-
},
|
|
597
|
-
{
|
|
598
|
-
value: "pipelines",
|
|
599
|
-
label: refreshedAccess.state === "ready"
|
|
600
|
-
? "1. Dynamic Pipelines"
|
|
601
|
-
: pc.dim("1. Dynamic Pipelines (locked)"),
|
|
602
|
-
hint: refreshedAccess.state === "ready"
|
|
603
|
-
? "Create new pipelines and route into Saved Workflows"
|
|
604
|
-
: refreshedAccess.reason,
|
|
605
|
-
},
|
|
606
|
-
{
|
|
607
|
-
value: "saved",
|
|
608
|
-
label: "2. Saved Workflows",
|
|
609
|
-
hint: "Execute, label, archive, delete",
|
|
610
|
-
},
|
|
611
|
-
...(opts.allowBackToHub ? [{ value: "__back_to_hub", label: "← Back to main menu" }] : []),
|
|
612
|
-
],
|
|
613
|
-
});
|
|
614
|
-
if (p.isCancel(topChoice)) {
|
|
615
|
-
p.cancel("Cancelled.");
|
|
616
|
-
process.exit(0);
|
|
617
|
-
}
|
|
618
|
-
if (topChoice === "__back_to_hub")
|
|
619
|
-
return "back";
|
|
620
|
-
if (topChoice === "contracts" && refreshedAccess.state !== "ready") {
|
|
621
|
-
p.note([
|
|
622
|
-
"CMS Node Contracts are only available when the hosted user is linked to this local machine.",
|
|
623
|
-
refreshedAccess.reason,
|
|
624
|
-
].join("\n"), "Growthub Local Machine Required");
|
|
625
|
-
continue;
|
|
626
|
-
}
|
|
627
|
-
if (topChoice === "contracts") {
|
|
628
|
-
const contractsSpinner = p.spinner();
|
|
629
|
-
contractsSpinner.start("Loading CMS node contracts...");
|
|
630
|
-
try {
|
|
631
|
-
const registry = createCmsCapabilityRegistryClient();
|
|
632
|
-
const { nodes } = await registry.listCapabilities({ enabledOnly: false });
|
|
633
|
-
contractsSpinner.stop(`Loaded ${nodes.length} CMS node contract${nodes.length === 1 ? "" : "s"}.`);
|
|
634
|
-
if (nodes.length === 0) {
|
|
635
|
-
p.note("No CMS node contracts available.", "Nothing found");
|
|
636
|
-
continue;
|
|
637
|
-
}
|
|
638
|
-
let showDiscoveryTree = false;
|
|
639
|
-
while (true) {
|
|
640
|
-
if (showDiscoveryTree) {
|
|
641
|
-
console.log("");
|
|
642
|
-
console.log(box(renderWorkflowContractDiscoveryTree(nodes)));
|
|
643
|
-
console.log("");
|
|
644
|
-
showDiscoveryTree = false;
|
|
645
|
-
}
|
|
646
|
-
const contractsMenuChoice = await p.select({
|
|
647
|
-
message: "CMS Node Contracts",
|
|
648
|
-
options: [
|
|
649
|
-
{ value: "browse", label: "Browse contract list", hint: "Select a node and view full contract" },
|
|
650
|
-
{ value: "show_tree", label: "Show discovery tree", hint: "Family primitives and contract counts" },
|
|
651
|
-
{ value: "__back_to_workflow", label: "← Back to workflow menu" },
|
|
652
|
-
],
|
|
653
|
-
});
|
|
654
|
-
if (p.isCancel(contractsMenuChoice)) {
|
|
655
|
-
p.cancel("Cancelled.");
|
|
656
|
-
process.exit(0);
|
|
657
|
-
}
|
|
658
|
-
if (contractsMenuChoice === "__back_to_workflow")
|
|
659
|
-
break;
|
|
660
|
-
if (contractsMenuChoice === "show_tree") {
|
|
661
|
-
showDiscoveryTree = true;
|
|
662
|
-
continue;
|
|
663
|
-
}
|
|
664
|
-
const contractOptions = [...nodes]
|
|
665
|
-
.sort((a, b) => a.slug.localeCompare(b.slug))
|
|
666
|
-
.map((node) => {
|
|
667
|
-
const contract = introspectNodeContract(node);
|
|
668
|
-
const requiredInputs = contract.inputs.filter((input) => input.required).length;
|
|
669
|
-
return {
|
|
670
|
-
value: node.slug,
|
|
671
|
-
label: `${node.icon} ${node.displayName} ${pc.dim(node.slug)}`,
|
|
672
|
-
hint: `${node.family} · required:${requiredInputs} · bindings:${contract.requiredBindings.length} · outputs:${contract.outputTypes.length}`,
|
|
673
|
-
};
|
|
674
|
-
});
|
|
675
|
-
const contractChoice = await paginatedSelect("Select CMS node contract", contractOptions, {
|
|
676
|
-
backLabel: "← Back to CMS contracts menu",
|
|
677
|
-
searchEnabled: true,
|
|
678
|
-
});
|
|
679
|
-
if (p.isCancel(contractChoice)) {
|
|
680
|
-
p.cancel("Cancelled.");
|
|
681
|
-
process.exit(0);
|
|
682
|
-
}
|
|
683
|
-
if (contractChoice === "__back")
|
|
684
|
-
continue;
|
|
685
|
-
const selected = nodes.find((node) => node.slug === contractChoice);
|
|
686
|
-
if (!selected)
|
|
687
|
-
continue;
|
|
688
|
-
printTemplateCard(selected);
|
|
689
|
-
const contractAction = await p.select({
|
|
690
|
-
message: "Contract actions",
|
|
691
|
-
options: [
|
|
692
|
-
{ value: "inspect_json", label: "Inspect raw input template JSON" },
|
|
693
|
-
{ value: "back_to_contracts_menu", label: "← Back to CMS contracts menu" },
|
|
694
|
-
{ value: "back_to_workflow_menu", label: "← Back to workflow menu" },
|
|
695
|
-
],
|
|
696
|
-
});
|
|
697
|
-
if (p.isCancel(contractAction)) {
|
|
698
|
-
p.cancel("Cancelled.");
|
|
699
|
-
process.exit(0);
|
|
700
|
-
}
|
|
701
|
-
if (contractAction === "inspect_json") {
|
|
702
|
-
console.log(JSON.stringify(selected.executionTokens.input_template, null, 2));
|
|
703
|
-
continue;
|
|
704
|
-
}
|
|
705
|
-
if (contractAction === "back_to_workflow_menu") {
|
|
706
|
-
break;
|
|
707
|
-
}
|
|
708
|
-
}
|
|
709
|
-
}
|
|
710
|
-
catch (err) {
|
|
711
|
-
contractsSpinner.stop(pc.red("Failed to load CMS node contracts."));
|
|
712
|
-
p.log.error("Failed to load CMS node contracts: " + err.message);
|
|
713
|
-
}
|
|
714
|
-
continue;
|
|
715
|
-
}
|
|
716
|
-
if (topChoice === "pipelines") {
|
|
717
|
-
if (refreshedAccess.state !== "ready") {
|
|
718
|
-
p.note([
|
|
719
|
-
"Dynamic Pipelines are only available when the hosted user is linked to this local machine.",
|
|
720
|
-
refreshedAccess.reason,
|
|
721
|
-
].join("\n"), "Growthub Local Machine Required");
|
|
722
|
-
continue;
|
|
723
|
-
}
|
|
724
|
-
const result = await runPipelineAssembler({ allowBackToHub: true });
|
|
725
|
-
if (result === "back") {
|
|
726
|
-
continue;
|
|
727
|
-
}
|
|
728
|
-
return "done";
|
|
729
|
-
}
|
|
730
|
-
// ── Saved Workflows ──────────────────────────────────────────────────
|
|
731
|
-
if (topChoice === "saved") {
|
|
732
|
-
while (true) {
|
|
733
|
-
const savedSpinner = p.spinner();
|
|
734
|
-
savedSpinner.start("Loading saved workflows...");
|
|
735
|
-
let saved;
|
|
736
|
-
try {
|
|
737
|
-
const enriched = enrichWorkflowSummaries(filterLocallyDeletedWorkflows(await listSavedWorkflows()), hygieneStore);
|
|
738
|
-
saved = withEffectiveWorkflowLabels(enriched, hygieneStore);
|
|
739
|
-
savedSpinner.stop(`Loaded ${saved.length} saved workflow${saved.length === 1 ? "" : "s"}.`);
|
|
740
|
-
}
|
|
741
|
-
catch (err) {
|
|
742
|
-
savedSpinner.stop(pc.red("Failed to load saved workflows."));
|
|
743
|
-
throw err;
|
|
744
|
-
}
|
|
745
|
-
if (saved.length === 0) {
|
|
746
|
-
p.note([
|
|
747
|
-
"No saved workflows found.",
|
|
748
|
-
"Use " + pc.cyan("growthub pipeline assemble") + " to create a new workflow pipeline.",
|
|
749
|
-
].join("\n"), "Nothing saved");
|
|
750
|
-
break;
|
|
751
|
-
}
|
|
752
|
-
const allOptions = saved.map((w) => ({
|
|
753
|
-
value: w.workflowId,
|
|
754
|
-
label: `${w.name} ${pc.dim(`[${renderWorkflowLabel(w.workflowLabel)}]`)} ${pc.dim(`${w.nodeCount} node${w.nodeCount !== 1 ? "s" : ""}`)}`,
|
|
755
|
-
hint: `${w.executionMode} · ${w.updatedAt?.slice(0, 10) ?? w.createdAt.slice(0, 10)}`,
|
|
756
|
-
}));
|
|
757
|
-
const choice = await paginatedSelect("Select a saved workflow", allOptions, {
|
|
758
|
-
backLabel: "← Back to workflow menu",
|
|
759
|
-
searchEnabled: true,
|
|
760
|
-
});
|
|
761
|
-
if (p.isCancel(choice)) {
|
|
762
|
-
p.cancel("Cancelled.");
|
|
763
|
-
process.exit(0);
|
|
764
|
-
}
|
|
765
|
-
if (choice === "__back")
|
|
766
|
-
break;
|
|
767
|
-
// Show workflow detail
|
|
768
|
-
const entry = saved.find((w) => w.workflowId === choice);
|
|
769
|
-
if (entry) {
|
|
770
|
-
const detailSpinner = p.spinner();
|
|
771
|
-
detailSpinner.start(`Loading ${entry.name}...`);
|
|
772
|
-
let detail;
|
|
773
|
-
try {
|
|
774
|
-
detail = await loadSavedWorkflowDetail(entry);
|
|
775
|
-
detailSpinner.stop(`Loaded ${entry.name}.`);
|
|
776
|
-
}
|
|
777
|
-
catch (err) {
|
|
778
|
-
detailSpinner.stop(pc.red(`Failed to load ${entry.name}.`));
|
|
779
|
-
p.log.error(err.message);
|
|
780
|
-
continue;
|
|
781
|
-
}
|
|
782
|
-
const pipeline = detail.pipeline;
|
|
783
|
-
const nodes = Array.isArray(pipeline.nodes) ? pipeline.nodes : [];
|
|
784
|
-
console.log("");
|
|
785
|
-
console.log(box([
|
|
786
|
-
`${pc.bold("Workflow:")} ${entry.name}`,
|
|
787
|
-
`${pc.dim("ID:")} ${entry.workflowId}`,
|
|
788
|
-
`${pc.dim("Mode:")} hosted ${pc.dim("Nodes:")} ${nodes.length}`,
|
|
789
|
-
`${pc.dim("Label:")} ${renderWorkflowLabel(entry.workflowLabel ?? "experimental")}`,
|
|
790
|
-
`${pc.dim("Created:")} ${detail.createdAt || "—"}`,
|
|
791
|
-
"",
|
|
792
|
-
...nodes.map((n, i) => `${pc.dim(String(i + 1) + ".")} ${pc.bold(n.data?.slug ?? n.slug ?? n.id)} ${pc.dim(n.id)}`),
|
|
793
|
-
]));
|
|
794
|
-
console.log("");
|
|
795
|
-
const nextAction = await p.select({
|
|
796
|
-
message: "Action",
|
|
797
|
-
options: [
|
|
798
|
-
{ value: "execute", label: "Execute saved workflow" },
|
|
799
|
-
{ value: "set_label", label: "Set workflow label" },
|
|
800
|
-
{ value: "archive", label: "Archive workflow" },
|
|
801
|
-
{ value: "unarchive", label: "Unarchive workflow" },
|
|
802
|
-
{ value: "delete", label: pc.red("Delete workflow") },
|
|
803
|
-
{ value: "back_to_saved", label: "← Back to saved workflows" },
|
|
804
|
-
],
|
|
805
|
-
});
|
|
806
|
-
if (p.isCancel(nextAction)) {
|
|
807
|
-
p.cancel("Cancelled.");
|
|
808
|
-
process.exit(0);
|
|
809
|
-
}
|
|
810
|
-
if (nextAction === "execute") {
|
|
811
|
-
const confirmed = await p.confirm({
|
|
812
|
-
message: `Execute ${entry.name} now?`,
|
|
813
|
-
initialValue: false,
|
|
814
|
-
});
|
|
815
|
-
if (p.isCancel(confirmed) || !confirmed) {
|
|
816
|
-
continue;
|
|
817
|
-
}
|
|
818
|
-
const finalConfirmed = await p.confirm({
|
|
819
|
-
message: "This will run the hosted workflow and may spend credits. Continue?",
|
|
820
|
-
initialValue: false,
|
|
821
|
-
});
|
|
822
|
-
if (p.isCancel(finalConfirmed) || !finalConfirmed) {
|
|
823
|
-
continue;
|
|
824
|
-
}
|
|
825
|
-
try {
|
|
826
|
-
const executablePipeline = toExecutableSavedWorkflowPipeline(entry, pipeline);
|
|
827
|
-
const registry = createCmsCapabilityRegistryClient();
|
|
828
|
-
const { nodes: capabilities } = await registry.listCapabilities({ enabledOnly: false });
|
|
829
|
-
const capabilityMap = new Map(capabilities.map((n) => [n.slug, n]));
|
|
830
|
-
const preSummary = buildPreExecutionSummary({
|
|
831
|
-
pipeline: executablePipeline,
|
|
832
|
-
registryBySlug: capabilityMap,
|
|
833
|
-
});
|
|
834
|
-
console.log("");
|
|
835
|
-
console.log(box(renderPreExecutionSummary(preSummary)));
|
|
836
|
-
console.log("");
|
|
837
|
-
const intelligenceSummary = await renderWorkflowIntelligenceSummary(executablePipeline, capabilities, "pre-execution");
|
|
838
|
-
if (intelligenceSummary) {
|
|
839
|
-
console.log(box(intelligenceSummary));
|
|
840
|
-
console.log("");
|
|
841
|
-
}
|
|
842
|
-
await executeHostedPipeline(executablePipeline);
|
|
843
|
-
p.log.success(`Saved workflow execution completed for ${pc.bold(entry.name)}.`);
|
|
844
|
-
}
|
|
845
|
-
catch (err) {
|
|
846
|
-
p.log.error("Saved workflow execution failed: " + err.message);
|
|
847
|
-
}
|
|
848
|
-
}
|
|
849
|
-
if (nextAction === "set_label") {
|
|
850
|
-
const labelChoice = await p.select({
|
|
851
|
-
message: `Set label for ${entry.name}`,
|
|
852
|
-
options: [
|
|
853
|
-
{ value: "canonical", label: "Canonical" },
|
|
854
|
-
{ value: "experimental", label: "Experimental" },
|
|
855
|
-
{ value: "archived", label: "Archived" },
|
|
856
|
-
{ value: "__back", label: "← Back" },
|
|
857
|
-
],
|
|
858
|
-
});
|
|
859
|
-
if (p.isCancel(labelChoice) || labelChoice === "__back") {
|
|
860
|
-
continue;
|
|
861
|
-
}
|
|
862
|
-
hygieneStore.setLabel(entry.workflowId, labelChoice);
|
|
863
|
-
p.log.success(`Updated label for ${pc.bold(entry.name)} to ${renderWorkflowLabel(labelChoice)}.`);
|
|
864
|
-
continue;
|
|
865
|
-
}
|
|
866
|
-
if (nextAction === "archive") {
|
|
867
|
-
const confirmed = await p.confirm({
|
|
868
|
-
message: `Archive ${entry.name}?`,
|
|
869
|
-
initialValue: false,
|
|
870
|
-
});
|
|
871
|
-
if (p.isCancel(confirmed) || !confirmed) {
|
|
872
|
-
continue;
|
|
873
|
-
}
|
|
874
|
-
try {
|
|
875
|
-
await archiveSavedWorkflow(entry);
|
|
876
|
-
hygieneStore.setLabel(entry.workflowId, "archived");
|
|
877
|
-
p.log.success(`Archived ${pc.bold(entry.name)}.`);
|
|
878
|
-
}
|
|
879
|
-
catch {
|
|
880
|
-
hygieneStore.setLabel(entry.workflowId, "archived");
|
|
881
|
-
p.log.success(`Archived ${pc.bold(entry.name)} (local fallback).`);
|
|
882
|
-
}
|
|
883
|
-
continue;
|
|
884
|
-
}
|
|
885
|
-
if (nextAction === "unarchive") {
|
|
886
|
-
if ((entry.workflowLabel ?? "experimental") !== "archived") {
|
|
887
|
-
p.note("Workflow is already live.", "Unarchive skipped");
|
|
888
|
-
continue;
|
|
889
|
-
}
|
|
890
|
-
const restoreChoice = await p.select({
|
|
891
|
-
message: `Set label after unarchive for ${entry.name}`,
|
|
892
|
-
options: [
|
|
893
|
-
{ value: "experimental", label: "Experimental" },
|
|
894
|
-
{ value: "canonical", label: "Canonical" },
|
|
895
|
-
{ value: "__back", label: "← Back" },
|
|
896
|
-
],
|
|
897
|
-
});
|
|
898
|
-
if (p.isCancel(restoreChoice) || restoreChoice === "__back") {
|
|
899
|
-
continue;
|
|
900
|
-
}
|
|
901
|
-
hygieneStore.setLabel(entry.workflowId, restoreChoice);
|
|
902
|
-
p.log.success(`Unarchived ${pc.bold(entry.name)} to ${renderWorkflowLabel(restoreChoice)}.`);
|
|
903
|
-
continue;
|
|
904
|
-
}
|
|
905
|
-
if (nextAction === "delete") {
|
|
906
|
-
const confirmed = await p.confirm({
|
|
907
|
-
message: `Delete ${entry.name}? This cannot be undone.`,
|
|
908
|
-
initialValue: false,
|
|
909
|
-
});
|
|
910
|
-
if (p.isCancel(confirmed) || !confirmed) {
|
|
911
|
-
continue;
|
|
912
|
-
}
|
|
913
|
-
const finalConfirmed = await p.confirm({
|
|
914
|
-
message: "Final confirmation: permanently delete this workflow?",
|
|
915
|
-
initialValue: false,
|
|
916
|
-
});
|
|
917
|
-
if (p.isCancel(finalConfirmed) || !finalConfirmed) {
|
|
918
|
-
continue;
|
|
919
|
-
}
|
|
920
|
-
try {
|
|
921
|
-
await deleteSavedWorkflow(entry);
|
|
922
|
-
p.log.success(`Deleted ${pc.bold(entry.name)}.`);
|
|
923
|
-
}
|
|
924
|
-
catch {
|
|
925
|
-
markWorkflowDeletedLocally(entry.workflowId);
|
|
926
|
-
p.log.success(`Deleted ${pc.bold(entry.name)} (local fallback).`);
|
|
927
|
-
}
|
|
928
|
-
continue;
|
|
929
|
-
}
|
|
930
|
-
}
|
|
931
|
-
}
|
|
932
|
-
continue;
|
|
933
|
-
}
|
|
934
|
-
// ── Templates ────────────────────────────────────────────────────────
|
|
935
|
-
if (topChoice === "templates") {
|
|
936
|
-
const registry = createCmsCapabilityRegistryClient();
|
|
937
|
-
let hostedTemplates = [];
|
|
938
|
-
let templateViewMode = "condensed";
|
|
939
|
-
try {
|
|
940
|
-
const hosted = await registry.listCapabilities({ enabledOnly: false });
|
|
941
|
-
hostedTemplates = hosted.nodes;
|
|
942
|
-
}
|
|
943
|
-
catch (err) {
|
|
944
|
-
p.log.error("Hosted capability registry unavailable: " + err.message);
|
|
945
|
-
continue;
|
|
946
|
-
}
|
|
947
|
-
while (true) {
|
|
948
|
-
// Family filter
|
|
949
|
-
const availableFamilies = CAPABILITY_FAMILIES.filter((f) => {
|
|
950
|
-
const nodes = hostedTemplates.filter((node) => node.family === f);
|
|
951
|
-
return nodes.length > 0;
|
|
952
|
-
});
|
|
953
|
-
const familyChoice = await p.select({
|
|
954
|
-
message: "Filter by family",
|
|
955
|
-
options: [
|
|
956
|
-
{ value: "all", label: "All Templates" },
|
|
957
|
-
{ value: "__tree_view", label: "Tree View (all public nodes)" },
|
|
958
|
-
{ value: "__toggle_view_mode", label: `View Mode: ${templateViewMode}` },
|
|
959
|
-
...availableFamilies.map((f) => {
|
|
960
|
-
const cfg = FAMILY_CONFIG[f];
|
|
961
|
-
return {
|
|
962
|
-
value: f,
|
|
963
|
-
label: cfg ? cfg.label : f,
|
|
964
|
-
};
|
|
965
|
-
}),
|
|
966
|
-
{ value: "__back_to_workflow_menu", label: "← Back to workflow menu" },
|
|
967
|
-
],
|
|
968
|
-
});
|
|
969
|
-
if (p.isCancel(familyChoice)) {
|
|
970
|
-
p.cancel("Cancelled.");
|
|
971
|
-
process.exit(0);
|
|
972
|
-
}
|
|
973
|
-
if (familyChoice === "__back_to_workflow_menu")
|
|
974
|
-
break;
|
|
975
|
-
if (familyChoice === "__toggle_view_mode") {
|
|
976
|
-
const viewChoice = await p.select({
|
|
977
|
-
message: "Select template view mode",
|
|
978
|
-
options: [
|
|
979
|
-
{ value: "condensed", label: "Condensed", hint: "Fast scan" },
|
|
980
|
-
{ value: "expanded", label: "Expanded", hint: "Contract hints in list" },
|
|
981
|
-
{ value: "tree", label: "Tree", hint: "Family/tree style list" },
|
|
982
|
-
],
|
|
983
|
-
});
|
|
984
|
-
if (p.isCancel(viewChoice)) {
|
|
985
|
-
p.cancel("Cancelled.");
|
|
986
|
-
process.exit(0);
|
|
987
|
-
}
|
|
988
|
-
templateViewMode = viewChoice;
|
|
989
|
-
continue;
|
|
990
|
-
}
|
|
991
|
-
if (familyChoice === "__tree_view") {
|
|
992
|
-
console.log("");
|
|
993
|
-
console.log(box(renderTemplateTree(hostedTemplates)));
|
|
994
|
-
console.log("");
|
|
995
|
-
continue;
|
|
996
|
-
}
|
|
997
|
-
const query = familyChoice === "all"
|
|
998
|
-
? undefined
|
|
999
|
-
: { family: familyChoice };
|
|
1000
|
-
let templates;
|
|
1001
|
-
try {
|
|
1002
|
-
templates = query
|
|
1003
|
-
? hostedTemplates.filter((node) => node.family === query.family)
|
|
1004
|
-
: hostedTemplates;
|
|
1005
|
-
}
|
|
1006
|
-
catch (err) {
|
|
1007
|
-
p.log.error("Failed to load templates: " + err.message);
|
|
1008
|
-
continue;
|
|
1009
|
-
}
|
|
1010
|
-
if (templates.length === 0) {
|
|
1011
|
-
p.note("No templates for that family.", "Nothing found");
|
|
1012
|
-
continue;
|
|
1013
|
-
}
|
|
1014
|
-
// Template list with pagination and search
|
|
1015
|
-
while (true) {
|
|
1016
|
-
const templateOptions = templates.map((t) => buildTemplateOption(t, templateViewMode));
|
|
1017
|
-
const templateChoice = await paginatedSelect("Select a template", templateOptions, {
|
|
1018
|
-
backLabel: "← Back to family filter",
|
|
1019
|
-
searchEnabled: true,
|
|
1020
|
-
});
|
|
1021
|
-
if (p.isCancel(templateChoice)) {
|
|
1022
|
-
p.cancel("Cancelled.");
|
|
1023
|
-
process.exit(0);
|
|
1024
|
-
}
|
|
1025
|
-
if (templateChoice === "__back")
|
|
1026
|
-
break;
|
|
1027
|
-
const selected = templates.find((t) => t.slug === templateChoice);
|
|
1028
|
-
if (!selected)
|
|
1029
|
-
continue;
|
|
1030
|
-
printTemplateCard(selected);
|
|
1031
|
-
// Template actions
|
|
1032
|
-
while (true) {
|
|
1033
|
-
const action = await p.select({
|
|
1034
|
-
message: "What would you like to do with this template?",
|
|
1035
|
-
options: [
|
|
1036
|
-
{ value: "assemble", label: "Assemble a pipeline from this template" },
|
|
1037
|
-
{ value: "resolve", label: "Check machine binding" },
|
|
1038
|
-
{ value: "inspect_json", label: "Print input template as JSON" },
|
|
1039
|
-
{ value: "back_to_templates", label: "← Back to template list" },
|
|
1040
|
-
],
|
|
1041
|
-
});
|
|
1042
|
-
if (p.isCancel(action)) {
|
|
1043
|
-
p.cancel("Cancelled.");
|
|
1044
|
-
process.exit(0);
|
|
1045
|
-
}
|
|
1046
|
-
if (action === "back_to_templates")
|
|
1047
|
-
break;
|
|
1048
|
-
if (action === "resolve") {
|
|
1049
|
-
try {
|
|
1050
|
-
const resolver = createMachineCapabilityResolver();
|
|
1051
|
-
const binding = await resolver.resolveCapability(selected.slug);
|
|
1052
|
-
if (binding) {
|
|
1053
|
-
const statusColor = binding.allowed ? pc.green : pc.red;
|
|
1054
|
-
console.log("");
|
|
1055
|
-
console.log(box([
|
|
1056
|
-
`${pc.bold("Machine Binding:")} ${selected.slug}`,
|
|
1057
|
-
`${pc.dim("Allowed:")} ${statusColor(String(binding.allowed))}`,
|
|
1058
|
-
`${pc.dim("Reason:")} ${binding.reason ?? "—"}`,
|
|
1059
|
-
]));
|
|
1060
|
-
console.log("");
|
|
1061
|
-
}
|
|
1062
|
-
}
|
|
1063
|
-
catch (err) {
|
|
1064
|
-
p.log.error("Resolution failed: " + err.message);
|
|
1065
|
-
}
|
|
1066
|
-
continue;
|
|
1067
|
-
}
|
|
1068
|
-
if (action === "inspect_json") {
|
|
1069
|
-
console.log(JSON.stringify(selected.executionTokens.input_template, null, 2));
|
|
1070
|
-
continue;
|
|
1071
|
-
}
|
|
1072
|
-
if (action === "assemble") {
|
|
1073
|
-
// Quick pipeline assembly from template
|
|
1074
|
-
const builder = createPipelineBuilder({ executionMode: "hosted" });
|
|
1075
|
-
const contract = introspectNodeContract(selected);
|
|
1076
|
-
const rawBindings = {};
|
|
1077
|
-
for (const input of contract.inputs) {
|
|
1078
|
-
if (!input.required)
|
|
1079
|
-
continue;
|
|
1080
|
-
const value = await p.text({
|
|
1081
|
-
message: `${selected.displayName} → ${input.key}`,
|
|
1082
|
-
placeholder: `Enter ${input.key}`,
|
|
1083
|
-
});
|
|
1084
|
-
if (p.isCancel(value)) {
|
|
1085
|
-
p.cancel("Cancelled.");
|
|
1086
|
-
process.exit(0);
|
|
1087
|
-
}
|
|
1088
|
-
rawBindings[input.key] = value;
|
|
1089
|
-
}
|
|
1090
|
-
const normalized = normalizeNodeBindings(rawBindings, selected);
|
|
1091
|
-
p.note(`Provided ${normalized.providedCount}, defaulted ${normalized.defaultedCount}, normalized ${normalized.normalizedCount}.`, "Input normalization");
|
|
1092
|
-
const nodeId = builder.addNode(selected.slug, normalized.bindings);
|
|
1093
|
-
p.log.success(`Added ${pc.bold(selected.displayName)} (${pc.dim(nodeId)})`);
|
|
1094
|
-
// Ask if they want to add more nodes or save
|
|
1095
|
-
const next = await p.select({
|
|
1096
|
-
message: "Pipeline has 1 node. What next?",
|
|
1097
|
-
options: [
|
|
1098
|
-
{ value: "save", label: "Save pipeline" },
|
|
1099
|
-
{ value: "back_to_templates", label: "← Back to templates" },
|
|
1100
|
-
],
|
|
1101
|
-
});
|
|
1102
|
-
if (p.isCancel(next)) {
|
|
1103
|
-
p.cancel("Cancelled.");
|
|
1104
|
-
process.exit(0);
|
|
1105
|
-
}
|
|
1106
|
-
if (next === "save") {
|
|
1107
|
-
const pipeline = builder.build();
|
|
1108
|
-
const session = readSession();
|
|
1109
|
-
if (!session || isSessionExpired(session)) {
|
|
1110
|
-
throw new Error("Hosted session expired. Run `growthub auth login` again.");
|
|
1111
|
-
}
|
|
1112
|
-
const workflowName = `${selected.displayName} Workflow`;
|
|
1113
|
-
const pipelineSummary = buildPreExecutionSummary({
|
|
1114
|
-
pipeline,
|
|
1115
|
-
registryBySlug: new Map([[selected.slug, selected]]),
|
|
1116
|
-
});
|
|
1117
|
-
console.log("");
|
|
1118
|
-
console.log(box(renderPreSaveReview({
|
|
1119
|
-
workflowName,
|
|
1120
|
-
summary: pipelineSummary,
|
|
1121
|
-
})));
|
|
1122
|
-
console.log("");
|
|
1123
|
-
const saveResult = await saveHostedWorkflow(session, {
|
|
1124
|
-
name: workflowName,
|
|
1125
|
-
description: selected.description ?? "",
|
|
1126
|
-
config: compileToHostedWorkflowConfig(pipeline, { workflowName }),
|
|
1127
|
-
});
|
|
1128
|
-
if (!saveResult || typeof saveResult.workflowId !== "string") {
|
|
1129
|
-
throw new Error("Hosted workflow save returned no payload.");
|
|
1130
|
-
}
|
|
1131
|
-
p.log.success(`Hosted workflow saved as ${pc.bold(workflowName)} (${pc.dim(saveResult.workflowId)} · v${saveResult.version})`);
|
|
1132
|
-
}
|
|
1133
|
-
break;
|
|
1134
|
-
}
|
|
1135
|
-
}
|
|
1136
|
-
}
|
|
1137
|
-
}
|
|
1138
|
-
continue;
|
|
1139
|
-
}
|
|
1140
|
-
}
|
|
1141
|
-
}
|
|
1142
|
-
// ---------------------------------------------------------------------------
|
|
1143
|
-
// Native Intelligence summary helper
|
|
1144
|
-
// ---------------------------------------------------------------------------
|
|
1145
|
-
async function renderWorkflowIntelligenceSummary(pipeline, capabilities, phase) {
|
|
1146
|
-
try {
|
|
1147
|
-
const provider = createNativeIntelligenceProvider();
|
|
1148
|
-
const registryContext = capabilities.map((cap) => introspectNodeContract(cap));
|
|
1149
|
-
const capabilityMap = new Map(capabilities.map((n) => [n.slug, n]));
|
|
1150
|
-
const pipelineSummary = {
|
|
1151
|
-
pipelineId: pipeline.pipelineId,
|
|
1152
|
-
executionMode: pipeline.executionMode,
|
|
1153
|
-
nodes: pipeline.nodes.map((node) => {
|
|
1154
|
-
const cap = capabilityMap.get(node.slug);
|
|
1155
|
-
const contract = cap ? introspectNodeContract(cap) : null;
|
|
1156
|
-
const missingRequired = [];
|
|
1157
|
-
if (contract) {
|
|
1158
|
-
for (const input of contract.inputs) {
|
|
1159
|
-
if (!input.required)
|
|
1160
|
-
continue;
|
|
1161
|
-
const value = node.bindings[input.key];
|
|
1162
|
-
if (value === undefined || value === null || value === "") {
|
|
1163
|
-
missingRequired.push(input.key);
|
|
1164
|
-
}
|
|
1165
|
-
}
|
|
1166
|
-
}
|
|
1167
|
-
return {
|
|
1168
|
-
slug: node.slug,
|
|
1169
|
-
bindingCount: Object.keys(node.bindings).length,
|
|
1170
|
-
missingRequired,
|
|
1171
|
-
outputTypes: contract?.outputTypes ?? [],
|
|
1172
|
-
assetCount: 0,
|
|
1173
|
-
};
|
|
1174
|
-
}),
|
|
1175
|
-
warnings: [],
|
|
1176
|
-
};
|
|
1177
|
-
const input = {
|
|
1178
|
-
pipeline: pipelineSummary,
|
|
1179
|
-
registryContext,
|
|
1180
|
-
phase,
|
|
1181
|
-
};
|
|
1182
|
-
const result = await provider.summarizeExecution(input);
|
|
1183
|
-
const lines = [
|
|
1184
|
-
`${pc.bold("Intelligence Summary")} ${pc.dim(result.title)}`,
|
|
1185
|
-
result.explanation,
|
|
1186
|
-
];
|
|
1187
|
-
if (result.runtimeModeNote) {
|
|
1188
|
-
lines.push(`${pc.dim("Runtime:")} ${result.runtimeModeNote}`);
|
|
1189
|
-
}
|
|
1190
|
-
if (result.outputExpectation) {
|
|
1191
|
-
lines.push(`${pc.dim("Expected:")} ${result.outputExpectation}`);
|
|
1192
|
-
}
|
|
1193
|
-
if (result.missingBindingGuidance.length > 0) {
|
|
1194
|
-
lines.push("", pc.yellow("Missing Binding Guidance"));
|
|
1195
|
-
for (const guidance of result.missingBindingGuidance) {
|
|
1196
|
-
lines.push(` ${pc.dim("·")} ${guidance}`);
|
|
1197
|
-
}
|
|
1198
|
-
}
|
|
1199
|
-
if (result.costLatencyCautions.length > 0) {
|
|
1200
|
-
lines.push("", pc.yellow("Cost/Latency Notes"));
|
|
1201
|
-
for (const caution of result.costLatencyCautions) {
|
|
1202
|
-
lines.push(` ${pc.dim("·")} ${caution}`);
|
|
1203
|
-
}
|
|
1204
|
-
}
|
|
1205
|
-
if (result.warnings.length > 0) {
|
|
1206
|
-
lines.push("", pc.yellow("Warnings"));
|
|
1207
|
-
for (const warning of result.warnings) {
|
|
1208
|
-
lines.push(` ${pc.dim("·")} ${warning}`);
|
|
1209
|
-
}
|
|
1210
|
-
}
|
|
1211
|
-
return lines;
|
|
1212
|
-
}
|
|
1213
|
-
catch {
|
|
1214
|
-
return null;
|
|
1215
|
-
}
|
|
1216
|
-
}
|
|
1217
|
-
// ---------------------------------------------------------------------------
|
|
1218
|
-
// Command registration
|
|
1219
|
-
// ---------------------------------------------------------------------------
|
|
1220
|
-
export function registerWorkflowCommands(program) {
|
|
1221
|
-
const wf = program
|
|
1222
|
-
.command("workflow")
|
|
1223
|
-
.description("Browse CMS contracts, dynamic pipelines, and saved workflows (requires auth)")
|
|
1224
|
-
.addHelpText("after", `
|
|
1225
|
-
Examples:
|
|
1226
|
-
$ growthub workflow # interactive workflow browser
|
|
1227
|
-
$ growthub pipeline assemble # create new dynamic pipeline workflow
|
|
1228
|
-
$ growthub workflow saved # list saved workflows
|
|
1229
|
-
`);
|
|
1230
|
-
wf.action(async () => {
|
|
1231
|
-
await runWorkflowPicker({});
|
|
1232
|
-
});
|
|
1233
|
-
// ── templates ───────────────────────────────────────────────────────────
|
|
1234
|
-
const templatesCommandEnabled = false;
|
|
1235
|
-
if (templatesCommandEnabled) {
|
|
1236
|
-
wf
|
|
1237
|
-
.command("templates")
|
|
1238
|
-
.description("List CMS workflow node starter templates")
|
|
1239
|
-
.option("--family <family>", "Filter by family")
|
|
1240
|
-
.option("--search <term>", "Search templates")
|
|
1241
|
-
.option("--view <mode>", "List view mode: condensed | expanded | tree")
|
|
1242
|
-
.option("--json", "Output raw JSON")
|
|
1243
|
-
.action(async (opts) => {
|
|
1244
|
-
const access = getWorkflowAccess();
|
|
1245
|
-
if (access.state !== "ready") {
|
|
1246
|
-
console.error(pc.red(`${access.reason}.`));
|
|
1247
|
-
process.exitCode = 1;
|
|
1248
|
-
return;
|
|
1249
|
-
}
|
|
1250
|
-
const registry = createCmsCapabilityRegistryClient();
|
|
1251
|
-
const query = {};
|
|
1252
|
-
if (opts.family)
|
|
1253
|
-
query.family = opts.family;
|
|
1254
|
-
if (opts.search)
|
|
1255
|
-
query.search = opts.search;
|
|
1256
|
-
try {
|
|
1257
|
-
const { nodes, meta } = await registry.listCapabilities(Object.keys(query).length > 0 ? query : undefined);
|
|
1258
|
-
if (opts.json) {
|
|
1259
|
-
console.log(JSON.stringify({ nodes, meta }, null, 2));
|
|
1260
|
-
return;
|
|
1261
|
-
}
|
|
1262
|
-
if (nodes.length === 0) {
|
|
1263
|
-
console.error(pc.yellow("No templates found."));
|
|
1264
|
-
process.exitCode = 1;
|
|
1265
|
-
return;
|
|
1266
|
-
}
|
|
1267
|
-
const viewMode = (opts.view ?? "condensed");
|
|
1268
|
-
console.log("");
|
|
1269
|
-
console.log(pc.bold("Workflow Node Templates") +
|
|
1270
|
-
pc.dim(` ${nodes.length} template${nodes.length !== 1 ? "s" : ""}`));
|
|
1271
|
-
console.log(hr());
|
|
1272
|
-
console.log(pc.bold("Step 1: CMS Node Contract Validation"));
|
|
1273
|
-
console.log(pc.dim("Validate contract visibility before template selection."));
|
|
1274
|
-
console.log(pc.dim(`View mode: ${viewMode}`));
|
|
1275
|
-
console.log("");
|
|
1276
|
-
if (viewMode === "tree") {
|
|
1277
|
-
console.log(box(renderTemplateTree(nodes)));
|
|
1278
|
-
console.log(hr());
|
|
1279
|
-
console.log(pc.dim(` Source: ${meta.source} · growthub workflow`));
|
|
1280
|
-
console.log("");
|
|
1281
|
-
return;
|
|
1282
|
-
}
|
|
1283
|
-
for (const node of nodes) {
|
|
1284
|
-
const contract = introspectNodeContract(node);
|
|
1285
|
-
const requiredInputs = contract.inputs.filter((input) => input.required).length;
|
|
1286
|
-
const optionalInputs = contract.inputs.length - requiredInputs;
|
|
1287
|
-
const enabledTag = node.enabled ? pc.green("enabled") : pc.red("disabled");
|
|
1288
|
-
console.log(` ${node.icon} ${pc.bold(node.displayName)} ${pc.dim(node.slug)} ${enabledTag}`);
|
|
1289
|
-
console.log(` ${pc.dim("Contract:")} ` +
|
|
1290
|
-
`${pc.dim("required")}=${requiredInputs} ` +
|
|
1291
|
-
`${pc.dim("optional")}=${optionalInputs} ` +
|
|
1292
|
-
`${pc.dim("bindings")}=${contract.requiredBindings.length} ` +
|
|
1293
|
-
`${pc.dim("outputs")}=${contract.outputTypes.length}`);
|
|
1294
|
-
console.log(` ${pc.dim("Execution:")} ${contract.executionStrategy} · ${contract.executionKind}`);
|
|
1295
|
-
if (node.description) {
|
|
1296
|
-
console.log(` ${pc.dim(node.description)}`);
|
|
1297
|
-
}
|
|
1298
|
-
console.log("");
|
|
1299
|
-
}
|
|
1300
|
-
console.log(hr());
|
|
1301
|
-
console.log(pc.dim(` Source: ${meta.source} · growthub workflow`));
|
|
1302
|
-
console.log("");
|
|
1303
|
-
}
|
|
1304
|
-
catch (err) {
|
|
1305
|
-
console.error(pc.red("Failed: " + err.message));
|
|
1306
|
-
process.exitCode = 1;
|
|
1307
|
-
}
|
|
1308
|
-
});
|
|
1309
|
-
}
|
|
1310
|
-
// ── saved ───────────────────────────────────────────────────────────────
|
|
1311
|
-
wf
|
|
1312
|
-
.command("saved")
|
|
1313
|
-
.description("List saved workflow pipelines")
|
|
1314
|
-
.option("--include-archived", "Include archived workflows in output")
|
|
1315
|
-
.option("--json", "Output raw JSON")
|
|
1316
|
-
.action(async (opts) => {
|
|
1317
|
-
const hygieneStore = createWorkflowHygieneStore();
|
|
1318
|
-
const saved = withEffectiveWorkflowLabels(enrichWorkflowSummaries(filterLocallyDeletedWorkflows(await listSavedWorkflows()), hygieneStore), hygieneStore);
|
|
1319
|
-
const visibleSaved = opts.includeArchived
|
|
1320
|
-
? saved
|
|
1321
|
-
: saved.filter((entry) => entry.workflowLabel !== "archived");
|
|
1322
|
-
if (opts.json) {
|
|
1323
|
-
console.log(JSON.stringify(visibleSaved, null, 2));
|
|
1324
|
-
return;
|
|
1325
|
-
}
|
|
1326
|
-
if (visibleSaved.length === 0) {
|
|
1327
|
-
console.log(pc.dim("No saved workflows. Run `growthub workflow` to assemble one."));
|
|
1328
|
-
return;
|
|
1329
|
-
}
|
|
1330
|
-
console.log("");
|
|
1331
|
-
console.log(pc.bold("Saved Workflows") +
|
|
1332
|
-
pc.dim(` ${visibleSaved.length} workflow${visibleSaved.length !== 1 ? "s" : ""}`));
|
|
1333
|
-
if (!opts.includeArchived) {
|
|
1334
|
-
const hiddenArchivedCount = saved.length - visibleSaved.length;
|
|
1335
|
-
if (hiddenArchivedCount > 0) {
|
|
1336
|
-
console.log(pc.dim(` Archived hidden: ${hiddenArchivedCount} (use --include-archived to show)`));
|
|
1337
|
-
}
|
|
1338
|
-
}
|
|
1339
|
-
console.log(hr());
|
|
1340
|
-
for (const w of visibleSaved) {
|
|
1341
|
-
console.log(` ${pc.bold(w.name)} ` +
|
|
1342
|
-
pc.dim(`[${renderWorkflowLabel(w.workflowLabel)}] `) +
|
|
1343
|
-
pc.dim(`${w.nodeCount} node${w.nodeCount !== 1 ? "s" : ""} · ${w.executionMode} · ${w.updatedAt?.slice(0, 10) ?? w.createdAt.slice(0, 10)}`));
|
|
1344
|
-
}
|
|
1345
|
-
console.log("");
|
|
1346
|
-
console.log(pc.dim(` Source: ${visibleSaved[0]?.source === "hosted" ? "hosted workflow registry" : resolveSavedWorkflowsDir()}`));
|
|
1347
|
-
console.log("");
|
|
1348
|
-
});
|
|
1349
|
-
}
|
|
1350
|
-
//# sourceMappingURL=workflow.js.map
|