@growthub/cli 0.5.1 → 0.6.1
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/__tests__/agent-jwt-env.test.d.ts +2 -0
- package/dist/__tests__/agent-jwt-env.test.d.ts.map +1 -0
- package/dist/__tests__/agent-jwt-env.test.js +57 -0
- package/dist/__tests__/agent-jwt-env.test.js.map +1 -0
- package/dist/__tests__/allowed-hostname.test.d.ts +2 -0
- package/dist/__tests__/allowed-hostname.test.d.ts.map +1 -0
- package/dist/__tests__/allowed-hostname.test.js +75 -0
- package/dist/__tests__/allowed-hostname.test.js.map +1 -0
- package/dist/__tests__/auth-login-flow.test.d.ts +2 -0
- package/dist/__tests__/auth-login-flow.test.d.ts.map +1 -0
- package/dist/__tests__/auth-login-flow.test.js +62 -0
- package/dist/__tests__/auth-login-flow.test.js.map +1 -0
- package/dist/__tests__/auth-session.test.d.ts +2 -0
- package/dist/__tests__/auth-session.test.d.ts.map +1 -0
- package/dist/__tests__/auth-session.test.js +128 -0
- package/dist/__tests__/auth-session.test.js.map +1 -0
- package/dist/__tests__/common.test.d.ts +2 -0
- package/dist/__tests__/common.test.d.ts.map +1 -0
- package/dist/__tests__/common.test.js +73 -0
- package/dist/__tests__/common.test.js.map +1 -0
- package/dist/__tests__/company-delete.test.d.ts +2 -0
- package/dist/__tests__/company-delete.test.d.ts.map +1 -0
- package/dist/__tests__/company-delete.test.js +78 -0
- package/dist/__tests__/company-delete.test.js.map +1 -0
- package/dist/__tests__/context.test.d.ts +2 -0
- package/dist/__tests__/context.test.d.ts.map +1 -0
- package/dist/__tests__/context.test.js +50 -0
- package/dist/__tests__/context.test.js.map +1 -0
- package/dist/__tests__/create-growthub-local-installer.test.d.ts +21 -0
- package/dist/__tests__/create-growthub-local-installer.test.d.ts.map +1 -0
- package/dist/__tests__/create-growthub-local-installer.test.js +205 -0
- package/dist/__tests__/create-growthub-local-installer.test.js.map +1 -0
- package/dist/__tests__/data-dir.test.d.ts +2 -0
- package/dist/__tests__/data-dir.test.d.ts.map +1 -0
- package/dist/__tests__/data-dir.test.js +61 -0
- package/dist/__tests__/data-dir.test.js.map +1 -0
- package/dist/__tests__/doctor.test.d.ts +2 -0
- package/dist/__tests__/doctor.test.d.ts.map +1 -0
- package/dist/__tests__/doctor.test.js +93 -0
- package/dist/__tests__/doctor.test.js.map +1 -0
- package/dist/__tests__/effective-profile.test.d.ts +2 -0
- package/dist/__tests__/effective-profile.test.d.ts.map +1 -0
- package/dist/__tests__/effective-profile.test.js +91 -0
- package/dist/__tests__/effective-profile.test.js.map +1 -0
- package/dist/__tests__/execute-hosted-pipeline.test.d.ts +2 -0
- package/dist/__tests__/execute-hosted-pipeline.test.d.ts.map +1 -0
- package/dist/__tests__/execute-hosted-pipeline.test.js +131 -0
- package/dist/__tests__/execute-hosted-pipeline.test.js.map +1 -0
- package/dist/__tests__/fork-policy.test.d.ts +12 -0
- package/dist/__tests__/fork-policy.test.d.ts.map +1 -0
- package/dist/__tests__/fork-policy.test.js +132 -0
- package/dist/__tests__/fork-policy.test.js.map +1 -0
- package/dist/__tests__/fork-trace.test.d.ts +12 -0
- package/dist/__tests__/fork-trace.test.d.ts.map +1 -0
- package/dist/__tests__/fork-trace.test.js +90 -0
- package/dist/__tests__/fork-trace.test.js.map +1 -0
- package/dist/__tests__/home-paths.test.d.ts +2 -0
- package/dist/__tests__/home-paths.test.d.ts.map +1 -0
- package/dist/__tests__/home-paths.test.js +32 -0
- package/dist/__tests__/home-paths.test.js.map +1 -0
- package/dist/__tests__/hosted-execution-client.test.d.ts +2 -0
- package/dist/__tests__/hosted-execution-client.test.d.ts.map +1 -0
- package/dist/__tests__/hosted-execution-client.test.js +100 -0
- package/dist/__tests__/hosted-execution-client.test.js.map +1 -0
- package/dist/__tests__/http.test.d.ts +2 -0
- package/dist/__tests__/http.test.d.ts.map +1 -0
- package/dist/__tests__/http.test.js +42 -0
- package/dist/__tests__/http.test.js.map +1 -0
- package/dist/__tests__/integrations-github-resolver.test.d.ts +14 -0
- package/dist/__tests__/integrations-github-resolver.test.d.ts.map +1 -0
- package/dist/__tests__/integrations-github-resolver.test.js +103 -0
- package/dist/__tests__/integrations-github-resolver.test.js.map +1 -0
- package/dist/__tests__/kit-command.test.d.ts +2 -0
- package/dist/__tests__/kit-command.test.d.ts.map +1 -0
- package/dist/__tests__/kit-command.test.js +134 -0
- package/dist/__tests__/kit-command.test.js.map +1 -0
- package/dist/__tests__/kit-core.test.d.ts +17 -0
- package/dist/__tests__/kit-core.test.d.ts.map +1 -0
- package/dist/__tests__/kit-core.test.js +403 -0
- package/dist/__tests__/kit-core.test.js.map +1 -0
- package/dist/__tests__/kit-fork-command.test.d.ts +11 -0
- package/dist/__tests__/kit-fork-command.test.d.ts.map +1 -0
- package/dist/__tests__/kit-fork-command.test.js +183 -0
- package/dist/__tests__/kit-fork-command.test.js.map +1 -0
- package/dist/__tests__/kit-fork-phase-1.test.d.ts +13 -0
- package/dist/__tests__/kit-fork-phase-1.test.d.ts.map +1 -0
- package/dist/__tests__/kit-fork-phase-1.test.js +220 -0
- package/dist/__tests__/kit-fork-phase-1.test.js.map +1 -0
- package/dist/__tests__/kit-fork-registry.test.d.ts +8 -0
- package/dist/__tests__/kit-fork-registry.test.d.ts.map +1 -0
- package/dist/__tests__/kit-fork-registry.test.js +183 -0
- package/dist/__tests__/kit-fork-registry.test.js.map +1 -0
- package/dist/__tests__/kit-fork-sync-agent.test.d.ts +13 -0
- package/dist/__tests__/kit-fork-sync-agent.test.d.ts.map +1 -0
- package/dist/__tests__/kit-fork-sync-agent.test.js +262 -0
- package/dist/__tests__/kit-fork-sync-agent.test.js.map +1 -0
- package/dist/__tests__/kit-fork-sync.test.d.ts +12 -0
- package/dist/__tests__/kit-fork-sync.test.d.ts.map +1 -0
- package/dist/__tests__/kit-fork-sync.test.js +455 -0
- package/dist/__tests__/kit-fork-sync.test.js.map +1 -0
- package/dist/__tests__/kit-zernio-social.test.d.ts +16 -0
- package/dist/__tests__/kit-zernio-social.test.d.ts.map +1 -0
- package/dist/__tests__/kit-zernio-social.test.js +528 -0
- package/dist/__tests__/kit-zernio-social.test.js.map +1 -0
- package/dist/__tests__/kit.test.d.ts +2 -0
- package/dist/__tests__/kit.test.d.ts.map +1 -0
- package/dist/__tests__/kit.test.js +359 -0
- package/dist/__tests__/kit.test.js.map +1 -0
- package/dist/__tests__/native-intelligence-normalizer.test.d.ts +2 -0
- package/dist/__tests__/native-intelligence-normalizer.test.d.ts.map +1 -0
- package/dist/__tests__/native-intelligence-normalizer.test.js +200 -0
- package/dist/__tests__/native-intelligence-normalizer.test.js.map +1 -0
- package/dist/__tests__/native-intelligence-planner.test.d.ts +2 -0
- package/dist/__tests__/native-intelligence-planner.test.d.ts.map +1 -0
- package/dist/__tests__/native-intelligence-planner.test.js +208 -0
- package/dist/__tests__/native-intelligence-planner.test.js.map +1 -0
- package/dist/__tests__/native-intelligence-recommender.test.d.ts +2 -0
- package/dist/__tests__/native-intelligence-recommender.test.d.ts.map +1 -0
- package/dist/__tests__/native-intelligence-recommender.test.js +212 -0
- package/dist/__tests__/native-intelligence-recommender.test.js.map +1 -0
- package/dist/__tests__/native-intelligence-summarizer.test.d.ts +2 -0
- package/dist/__tests__/native-intelligence-summarizer.test.d.ts.map +1 -0
- package/dist/__tests__/native-intelligence-summarizer.test.js +195 -0
- package/dist/__tests__/native-intelligence-summarizer.test.js.map +1 -0
- package/dist/__tests__/open-agents.test.d.ts +2 -0
- package/dist/__tests__/open-agents.test.d.ts.map +1 -0
- package/dist/__tests__/open-agents.test.js +174 -0
- package/dist/__tests__/open-agents.test.js.map +1 -0
- package/dist/__tests__/progress.test.d.ts +5 -0
- package/dist/__tests__/progress.test.d.ts.map +1 -0
- package/dist/__tests__/progress.test.js +55 -0
- package/dist/__tests__/progress.test.js.map +1 -0
- package/dist/__tests__/qwen-code.test.d.ts +2 -0
- package/dist/__tests__/qwen-code.test.d.ts.map +1 -0
- package/dist/__tests__/qwen-code.test.js +125 -0
- package/dist/__tests__/qwen-code.test.js.map +1 -0
- package/dist/__tests__/source-import-agent.test.d.ts +9 -0
- package/dist/__tests__/source-import-agent.test.d.ts.map +1 -0
- package/dist/__tests__/source-import-agent.test.js +124 -0
- package/dist/__tests__/source-import-agent.test.js.map +1 -0
- package/dist/__tests__/source-import-detect.test.d.ts +8 -0
- package/dist/__tests__/source-import-detect.test.d.ts.map +1 -0
- package/dist/__tests__/source-import-detect.test.js +91 -0
- package/dist/__tests__/source-import-detect.test.js.map +1 -0
- package/dist/__tests__/source-import-plan.test.d.ts +8 -0
- package/dist/__tests__/source-import-plan.test.d.ts.map +1 -0
- package/dist/__tests__/source-import-plan.test.js +170 -0
- package/dist/__tests__/source-import-plan.test.js.map +1 -0
- package/dist/__tests__/source-import-security.test.d.ts +8 -0
- package/dist/__tests__/source-import-security.test.d.ts.map +1 -0
- package/dist/__tests__/source-import-security.test.js +111 -0
- package/dist/__tests__/source-import-security.test.js.map +1 -0
- package/dist/__tests__/source-import-skills-source.test.d.ts +11 -0
- package/dist/__tests__/source-import-skills-source.test.d.ts.map +1 -0
- package/dist/__tests__/source-import-skills-source.test.js +181 -0
- package/dist/__tests__/source-import-skills-source.test.js.map +1 -0
- package/dist/__tests__/table-renderer.test.d.ts +12 -0
- package/dist/__tests__/table-renderer.test.d.ts.map +1 -0
- package/dist/__tests__/table-renderer.test.js +86 -0
- package/dist/__tests__/table-renderer.test.js.map +1 -0
- package/dist/__tests__/worktree.test.d.ts +2 -0
- package/dist/__tests__/worktree.test.d.ts.map +1 -0
- package/dist/__tests__/worktree.test.js +399 -0
- package/dist/__tests__/worktree.test.js.map +1 -0
- package/dist/adapters/http/format-event.d.ts +2 -0
- package/dist/adapters/http/format-event.d.ts.map +1 -0
- package/dist/adapters/http/format-event.js +6 -0
- package/dist/adapters/http/format-event.js.map +1 -0
- package/dist/adapters/http/index.d.ts +3 -0
- package/dist/adapters/http/index.d.ts.map +1 -0
- package/dist/adapters/http/index.js +6 -0
- package/dist/adapters/http/index.js.map +1 -0
- package/dist/adapters/index.d.ts +3 -0
- package/dist/adapters/index.d.ts.map +1 -0
- package/dist/adapters/index.js +2 -0
- package/dist/adapters/index.js.map +1 -0
- package/dist/adapters/open-agents/format-event.d.ts +2 -0
- package/dist/adapters/open-agents/format-event.d.ts.map +1 -0
- package/dist/adapters/open-agents/format-event.js +39 -0
- package/dist/adapters/open-agents/format-event.js.map +1 -0
- package/dist/adapters/open-agents/index.d.ts +3 -0
- package/dist/adapters/open-agents/index.d.ts.map +1 -0
- package/dist/adapters/open-agents/index.js +6 -0
- package/dist/adapters/open-agents/index.js.map +1 -0
- package/dist/adapters/process/format-event.d.ts +2 -0
- package/dist/adapters/process/format-event.d.ts.map +1 -0
- package/dist/adapters/process/format-event.js +6 -0
- package/dist/adapters/process/format-event.js.map +1 -0
- package/dist/adapters/process/index.d.ts +3 -0
- package/dist/adapters/process/index.d.ts.map +1 -0
- package/dist/adapters/process/index.js +6 -0
- package/dist/adapters/process/index.js.map +1 -0
- package/dist/adapters/qwen/format-event.d.ts +8 -0
- package/dist/adapters/qwen/format-event.d.ts.map +1 -0
- package/dist/adapters/qwen/format-event.js +28 -0
- package/dist/adapters/qwen/format-event.js.map +1 -0
- package/dist/adapters/qwen/index.d.ts +3 -0
- package/dist/adapters/qwen/index.d.ts.map +1 -0
- package/dist/adapters/qwen/index.js +6 -0
- package/dist/adapters/qwen/index.js.map +1 -0
- package/dist/adapters/registry.d.ts +3 -0
- package/dist/adapters/registry.d.ts.map +1 -0
- package/dist/adapters/registry.js +56 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/auth/effective-profile.d.ts +61 -0
- package/dist/auth/effective-profile.d.ts.map +1 -0
- package/dist/auth/effective-profile.js +127 -0
- package/dist/auth/effective-profile.js.map +1 -0
- package/dist/auth/hosted-client.d.ts +107 -0
- package/dist/auth/hosted-client.d.ts.map +1 -0
- package/dist/auth/hosted-client.js +140 -0
- package/dist/auth/hosted-client.js.map +1 -0
- package/dist/auth/hosted-integrations.d.ts +33 -0
- package/dist/auth/hosted-integrations.d.ts.map +1 -0
- package/dist/auth/hosted-integrations.js +51 -0
- package/dist/auth/hosted-integrations.js.map +1 -0
- package/dist/auth/login-flow.d.ts +27 -0
- package/dist/auth/login-flow.d.ts.map +1 -0
- package/dist/auth/login-flow.js +212 -0
- package/dist/auth/login-flow.js.map +1 -0
- package/dist/auth/overlay-store.d.ts +52 -0
- package/dist/auth/overlay-store.d.ts.map +1 -0
- package/dist/auth/overlay-store.js +123 -0
- package/dist/auth/overlay-store.js.map +1 -0
- package/dist/auth/paths.d.ts +15 -0
- package/dist/auth/paths.d.ts.map +1 -0
- package/dist/auth/paths.js +27 -0
- package/dist/auth/paths.js.map +1 -0
- package/dist/auth/session-store.d.ts +35 -0
- package/dist/auth/session-store.d.ts.map +1 -0
- package/dist/auth/session-store.js +73 -0
- package/dist/auth/session-store.js.map +1 -0
- package/dist/auth/workflow-access.d.ts +7 -0
- package/dist/auth/workflow-access.d.ts.map +1 -0
- package/dist/auth/workflow-access.js +27 -0
- package/dist/auth/workflow-access.js.map +1 -0
- package/dist/checks/agent-jwt-secret-check.d.ts +3 -0
- package/dist/checks/agent-jwt-secret-check.d.ts.map +1 -0
- package/dist/checks/agent-jwt-secret-check.js +31 -0
- package/dist/checks/agent-jwt-secret-check.js.map +1 -0
- package/dist/checks/config-check.d.ts +3 -0
- package/dist/checks/config-check.d.ts.map +1 -0
- package/dist/checks/config-check.js +31 -0
- package/dist/checks/config-check.js.map +1 -0
- package/dist/checks/database-check.d.ts +4 -0
- package/dist/checks/database-check.d.ts.map +1 -0
- package/dist/checks/database-check.js +54 -0
- package/dist/checks/database-check.js.map +1 -0
- package/dist/checks/deployment-auth-check.d.ts +4 -0
- package/dist/checks/deployment-auth-check.d.ts.map +1 -0
- package/dist/checks/deployment-auth-check.js +83 -0
- package/dist/checks/deployment-auth-check.js.map +1 -0
- package/dist/checks/index.d.ts +18 -0
- package/dist/checks/index.d.ts.map +1 -0
- package/dist/checks/index.js +10 -0
- package/dist/checks/index.js.map +1 -0
- package/dist/checks/llm-check.d.ts +4 -0
- package/dist/checks/llm-check.d.ts.map +1 -0
- package/dist/checks/llm-check.js +80 -0
- package/dist/checks/llm-check.js.map +1 -0
- package/dist/checks/log-check.d.ts +4 -0
- package/dist/checks/log-check.d.ts.map +1 -0
- package/dist/checks/log-check.js +27 -0
- package/dist/checks/log-check.js.map +1 -0
- package/dist/checks/path-resolver.d.ts +2 -0
- package/dist/checks/path-resolver.d.ts.map +1 -0
- package/dist/checks/path-resolver.js +2 -0
- package/dist/checks/path-resolver.js.map +1 -0
- package/dist/checks/port-check.d.ts +4 -0
- package/dist/checks/port-check.d.ts.map +1 -0
- package/dist/checks/port-check.js +20 -0
- package/dist/checks/port-check.js.map +1 -0
- package/dist/checks/secrets-check.d.ts +4 -0
- package/dist/checks/secrets-check.d.ts.map +1 -0
- package/dist/checks/secrets-check.js +123 -0
- package/dist/checks/secrets-check.js.map +1 -0
- package/dist/checks/storage-check.d.ts +4 -0
- package/dist/checks/storage-check.d.ts.map +1 -0
- package/dist/checks/storage-check.js +46 -0
- package/dist/checks/storage-check.js.map +1 -0
- package/dist/client/context.d.ts +21 -0
- package/dist/client/context.d.ts.map +1 -0
- package/dist/client/context.js +136 -0
- package/dist/client/context.js.map +1 -0
- package/dist/client/http.d.ts +29 -0
- package/dist/client/http.d.ts.map +1 -0
- package/dist/client/http.js +120 -0
- package/dist/client/http.js.map +1 -0
- package/dist/commands/allowed-hostname.d.ts +4 -0
- package/dist/commands/allowed-hostname.d.ts.map +1 -0
- package/dist/commands/allowed-hostname.js +31 -0
- package/dist/commands/allowed-hostname.js.map +1 -0
- package/dist/commands/artifact.d.ts +12 -0
- package/dist/commands/artifact.d.ts.map +1 -0
- package/dist/commands/artifact.js +167 -0
- package/dist/commands/artifact.js.map +1 -0
- package/dist/commands/auth-bootstrap-ceo.d.ts +8 -0
- package/dist/commands/auth-bootstrap-ceo.d.ts.map +1 -0
- package/dist/commands/auth-bootstrap-ceo.js +108 -0
- package/dist/commands/auth-bootstrap-ceo.js.map +1 -0
- package/dist/commands/auth-login.d.ts +24 -0
- package/dist/commands/auth-login.d.ts.map +1 -0
- package/dist/commands/auth-login.js +270 -0
- package/dist/commands/auth-login.js.map +1 -0
- package/dist/commands/capability.d.ts +15 -0
- package/dist/commands/capability.d.ts.map +1 -0
- package/dist/commands/capability.js +366 -0
- package/dist/commands/capability.js.map +1 -0
- package/dist/commands/client/activity.d.ts +3 -0
- package/dist/commands/client/activity.d.ts.map +1 -0
- package/dist/commands/client/activity.js +49 -0
- package/dist/commands/client/activity.js.map +1 -0
- package/dist/commands/client/agent.d.ts +3 -0
- package/dist/commands/client/agent.d.ts.map +1 -0
- package/dist/commands/client/agent.js +224 -0
- package/dist/commands/client/agent.js.map +1 -0
- package/dist/commands/client/approval.d.ts +3 -0
- package/dist/commands/client/approval.d.ts.map +1 -0
- package/dist/commands/client/approval.js +193 -0
- package/dist/commands/client/approval.js.map +1 -0
- package/dist/commands/client/common.d.ts +33 -0
- package/dist/commands/client/common.d.ts.map +1 -0
- package/dist/commands/client/common.js +140 -0
- package/dist/commands/client/common.js.map +1 -0
- package/dist/commands/client/company.d.ts +14 -0
- package/dist/commands/client/company.d.ts.map +1 -0
- package/dist/commands/client/company.js +346 -0
- package/dist/commands/client/company.js.map +1 -0
- package/dist/commands/client/context.d.ts +3 -0
- package/dist/commands/client/context.d.ts.map +1 -0
- package/dist/commands/client/context.js +92 -0
- package/dist/commands/client/context.js.map +1 -0
- package/dist/commands/client/dashboard.d.ts +3 -0
- package/dist/commands/client/dashboard.d.ts.map +1 -0
- package/dist/commands/client/dashboard.js +19 -0
- package/dist/commands/client/dashboard.js.map +1 -0
- package/dist/commands/client/issue.d.ts +3 -0
- package/dist/commands/client/issue.d.ts.map +1 -0
- package/dist/commands/client/issue.js +229 -0
- package/dist/commands/client/issue.js.map +1 -0
- package/dist/commands/client/plugin.d.ts +3 -0
- package/dist/commands/client/plugin.d.ts.map +1 -0
- package/dist/commands/client/plugin.js +252 -0
- package/dist/commands/client/plugin.js.map +1 -0
- package/dist/commands/configure.d.ts +5 -0
- package/dist/commands/configure.d.ts.map +1 -0
- package/dist/commands/configure.js +167 -0
- package/dist/commands/configure.js.map +1 -0
- package/dist/commands/db-backup.d.ts +10 -0
- package/dist/commands/db-backup.d.ts.map +1 -0
- package/dist/commands/db-backup.js +74 -0
- package/dist/commands/db-backup.js.map +1 -0
- package/dist/commands/doctor.d.ts +10 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +154 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/env.d.ts +4 -0
- package/dist/commands/env.d.ts.map +1 -0
- package/dist/commands/env.js +355 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/fleet.d.ts +39 -0
- package/dist/commands/fleet.d.ts.map +1 -0
- package/dist/commands/fleet.js +281 -0
- package/dist/commands/fleet.js.map +1 -0
- package/dist/commands/github.d.ts +29 -0
- package/dist/commands/github.d.ts.map +1 -0
- package/dist/commands/github.js +205 -0
- package/dist/commands/github.js.map +1 -0
- package/dist/commands/gtm.d.ts +3 -0
- package/dist/commands/gtm.d.ts.map +1 -0
- package/dist/commands/gtm.js +134 -0
- package/dist/commands/gtm.js.map +1 -0
- package/dist/commands/heartbeat-run.d.ts +16 -0
- package/dist/commands/heartbeat-run.d.ts.map +1 -0
- package/dist/commands/heartbeat-run.js +294 -0
- package/dist/commands/heartbeat-run.js.map +1 -0
- package/dist/commands/integrations.d.ts +20 -0
- package/dist/commands/integrations.d.ts.map +1 -0
- package/dist/commands/integrations.js +98 -0
- package/dist/commands/integrations.js.map +1 -0
- package/dist/commands/kit-fork-remote.d.ts +46 -0
- package/dist/commands/kit-fork-remote.d.ts.map +1 -0
- package/dist/commands/kit-fork-remote.js +489 -0
- package/dist/commands/kit-fork-remote.js.map +1 -0
- package/dist/commands/kit-fork.d.ts +39 -0
- package/dist/commands/kit-fork.d.ts.map +1 -0
- package/dist/commands/kit-fork.js +1338 -0
- package/dist/commands/kit-fork.js.map +1 -0
- package/dist/commands/kit.d.ts +7 -0
- package/dist/commands/kit.d.ts.map +1 -0
- package/dist/commands/kit.js +585 -0
- package/dist/commands/kit.js.map +1 -0
- package/dist/commands/onboard.d.ts +9 -0
- package/dist/commands/onboard.d.ts.map +1 -0
- package/dist/commands/onboard.js +425 -0
- package/dist/commands/onboard.js.map +1 -0
- package/dist/commands/open-agents.d.ts +19 -0
- package/dist/commands/open-agents.d.ts.map +1 -0
- package/dist/commands/open-agents.js +689 -0
- package/dist/commands/open-agents.js.map +1 -0
- package/dist/commands/pipeline.d.ts +20 -0
- package/dist/commands/pipeline.d.ts.map +1 -0
- package/dist/commands/pipeline.js +863 -0
- package/dist/commands/pipeline.js.map +1 -0
- package/dist/commands/profile.d.ts +3 -0
- package/dist/commands/profile.d.ts.map +1 -0
- package/dist/commands/profile.js +282 -0
- package/dist/commands/profile.js.map +1 -0
- package/dist/commands/qwen-code.d.ts +19 -0
- package/dist/commands/qwen-code.d.ts.map +1 -0
- package/dist/commands/qwen-code.js +286 -0
- package/dist/commands/qwen-code.js.map +1 -0
- package/dist/commands/run.d.ts +9 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +156 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/source-import-discovery.d.ts +28 -0
- package/dist/commands/source-import-discovery.d.ts.map +1 -0
- package/dist/commands/source-import-discovery.js +327 -0
- package/dist/commands/source-import-discovery.js.map +1 -0
- package/dist/commands/starter.d.ts +27 -0
- package/dist/commands/starter.d.ts.map +1 -0
- package/dist/commands/starter.js +358 -0
- package/dist/commands/starter.js.map +1 -0
- package/dist/commands/status.d.ts +18 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +84 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/template.d.ts +18 -0
- package/dist/commands/template.d.ts.map +1 -0
- package/dist/commands/template.js +341 -0
- package/dist/commands/template.js.map +1 -0
- package/dist/commands/workflow.d.ts +24 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +1350 -0
- package/dist/commands/workflow.js.map +1 -0
- package/dist/commands/worktree-lib.d.ts +49 -0
- package/dist/commands/worktree-lib.d.ts.map +1 -0
- package/dist/commands/worktree-lib.js +220 -0
- package/dist/commands/worktree-lib.js.map +1 -0
- package/dist/commands/worktree.d.ts +60 -0
- package/dist/commands/worktree.d.ts.map +1 -0
- package/dist/commands/worktree.js +874 -0
- package/dist/commands/worktree.js.map +1 -0
- package/dist/config/data-dir.d.ts +12 -0
- package/dist/config/data-dir.d.ts.map +1 -0
- package/dist/config/data-dir.js +25 -0
- package/dist/config/data-dir.js.map +1 -0
- package/dist/config/env.d.ts +15 -0
- package/dist/config/env.d.ts.map +1 -0
- package/dist/config/env.js +105 -0
- package/dist/config/env.js.map +1 -0
- package/dist/config/github-home.d.ts +17 -0
- package/dist/config/github-home.d.ts.map +1 -0
- package/dist/config/github-home.js +29 -0
- package/dist/config/github-home.js.map +1 -0
- package/dist/config/home.d.ts +23 -0
- package/dist/config/home.d.ts.map +1 -0
- package/dist/config/home.js +65 -0
- package/dist/config/home.js.map +1 -0
- package/dist/config/hostnames.d.ts +3 -0
- package/dist/config/hostnames.d.ts.map +1 -0
- package/dist/config/hostnames.js +27 -0
- package/dist/config/hostnames.js.map +1 -0
- package/dist/config/kit-forks-home.d.ts +26 -0
- package/dist/config/kit-forks-home.d.ts.map +1 -0
- package/dist/config/kit-forks-home.js +44 -0
- package/dist/config/kit-forks-home.js.map +1 -0
- package/dist/config/schema.d.ts +2 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +2 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/config/secrets-key.d.ts +16 -0
- package/dist/config/secrets-key.d.ts.map +1 -0
- package/dist/config/secrets-key.js +34 -0
- package/dist/config/secrets-key.js.map +1 -0
- package/dist/config/store.d.ts +6 -0
- package/dist/config/store.d.ts.map +1 -0
- package/dist/config/store.js +102 -0
- package/dist/config/store.js.map +1 -0
- package/dist/fleet/agent-plan.d.ts +20 -0
- package/dist/fleet/agent-plan.d.ts.map +1 -0
- package/dist/fleet/agent-plan.js +61 -0
- package/dist/fleet/agent-plan.js.map +1 -0
- package/dist/fleet/approvals.d.ts +10 -0
- package/dist/fleet/approvals.d.ts.map +1 -0
- package/dist/fleet/approvals.js +33 -0
- package/dist/fleet/approvals.js.map +1 -0
- package/dist/fleet/drift-summary.d.ts +13 -0
- package/dist/fleet/drift-summary.d.ts.map +1 -0
- package/dist/fleet/drift-summary.js +120 -0
- package/dist/fleet/drift-summary.js.map +1 -0
- package/dist/fleet/summary.d.ts +9 -0
- package/dist/fleet/summary.d.ts.map +1 -0
- package/dist/fleet/summary.js +161 -0
- package/dist/fleet/summary.js.map +1 -0
- package/dist/fleet/types.d.ts +149 -0
- package/dist/fleet/types.d.ts.map +1 -0
- package/dist/fleet/types.js +12 -0
- package/dist/fleet/types.js.map +1 -0
- package/dist/github/client.d.ts +42 -0
- package/dist/github/client.d.ts.map +1 -0
- package/dist/github/client.js +174 -0
- package/dist/github/client.js.map +1 -0
- package/dist/github/token-store.d.ts +11 -0
- package/dist/github/token-store.d.ts.map +1 -0
- package/dist/github/token-store.js +74 -0
- package/dist/github/token-store.js.map +1 -0
- package/dist/github/types.d.ts +69 -0
- package/dist/github/types.d.ts.map +1 -0
- package/dist/github/types.js +8 -0
- package/dist/github/types.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1100 -27800
- package/dist/index.js.map +1 -0
- package/dist/integrations/bridge.d.ts +43 -0
- package/dist/integrations/bridge.d.ts.map +1 -0
- package/dist/integrations/bridge.js +148 -0
- package/dist/integrations/bridge.js.map +1 -0
- package/dist/integrations/github-resolver.d.ts +31 -0
- package/dist/integrations/github-resolver.d.ts.map +1 -0
- package/dist/integrations/github-resolver.js +44 -0
- package/dist/integrations/github-resolver.js.map +1 -0
- package/dist/integrations/types.d.ts +46 -0
- package/dist/integrations/types.d.ts.map +1 -0
- package/dist/integrations/types.js +11 -0
- package/dist/integrations/types.js.map +1 -0
- package/dist/kits/catalog.d.ts +12 -0
- package/dist/kits/catalog.d.ts.map +1 -0
- package/dist/kits/catalog.js +93 -0
- package/dist/kits/catalog.js.map +1 -0
- package/dist/kits/contract.d.ts +153 -0
- package/dist/kits/contract.d.ts.map +1 -0
- package/dist/kits/contract.js +89 -0
- package/dist/kits/contract.js.map +1 -0
- package/dist/kits/core/adapter-core/contracts.d.ts +108 -0
- package/dist/kits/core/adapter-core/contracts.d.ts.map +1 -0
- package/dist/kits/core/adapter-core/contracts.js +17 -0
- package/dist/kits/core/adapter-core/contracts.js.map +1 -0
- package/dist/kits/core/adapter-core/env-gate.d.ts +29 -0
- package/dist/kits/core/adapter-core/env-gate.d.ts.map +1 -0
- package/dist/kits/core/adapter-core/env-gate.js +143 -0
- package/dist/kits/core/adapter-core/env-gate.js.map +1 -0
- package/dist/kits/core/adapter-core/fork-inspector.d.ts +42 -0
- package/dist/kits/core/adapter-core/fork-inspector.d.ts.map +1 -0
- package/dist/kits/core/adapter-core/fork-inspector.js +141 -0
- package/dist/kits/core/adapter-core/fork-inspector.js.map +1 -0
- package/dist/kits/core/adapter-core/index.d.ts +20 -0
- package/dist/kits/core/adapter-core/index.d.ts.map +1 -0
- package/dist/kits/core/adapter-core/index.js +13 -0
- package/dist/kits/core/adapter-core/index.js.map +1 -0
- package/dist/kits/core/adapter-core/output-contract.d.ts +25 -0
- package/dist/kits/core/adapter-core/output-contract.d.ts.map +1 -0
- package/dist/kits/core/adapter-core/output-contract.js +114 -0
- package/dist/kits/core/adapter-core/output-contract.js.map +1 -0
- package/dist/kits/core/adapter-core/provider-adapter.d.ts +26 -0
- package/dist/kits/core/adapter-core/provider-adapter.d.ts.map +1 -0
- package/dist/kits/core/adapter-core/provider-adapter.js +119 -0
- package/dist/kits/core/adapter-core/provider-adapter.js.map +1 -0
- package/dist/kits/core/adapter-core/runtime-surface.d.ts +25 -0
- package/dist/kits/core/adapter-core/runtime-surface.d.ts.map +1 -0
- package/dist/kits/core/adapter-core/runtime-surface.js +100 -0
- package/dist/kits/core/adapter-core/runtime-surface.js.map +1 -0
- package/dist/kits/core/adapter-core/setup-validation.d.ts +28 -0
- package/dist/kits/core/adapter-core/setup-validation.d.ts.map +1 -0
- package/dist/kits/core/adapter-core/setup-validation.js +145 -0
- package/dist/kits/core/adapter-core/setup-validation.js.map +1 -0
- package/dist/kits/core/factory/index.d.ts +25 -0
- package/dist/kits/core/factory/index.d.ts.map +1 -0
- package/dist/kits/core/factory/index.js +21 -0
- package/dist/kits/core/factory/index.js.map +1 -0
- package/dist/kits/core/factory/operator-kit.d.ts +50 -0
- package/dist/kits/core/factory/operator-kit.d.ts.map +1 -0
- package/dist/kits/core/factory/operator-kit.js +88 -0
- package/dist/kits/core/factory/operator-kit.js.map +1 -0
- package/dist/kits/core/factory/ops-kit.d.ts +57 -0
- package/dist/kits/core/factory/ops-kit.d.ts.map +1 -0
- package/dist/kits/core/factory/ops-kit.js +115 -0
- package/dist/kits/core/factory/ops-kit.js.map +1 -0
- package/dist/kits/core/factory/studio-kit.d.ts +39 -0
- package/dist/kits/core/factory/studio-kit.d.ts.map +1 -0
- package/dist/kits/core/factory/studio-kit.js +96 -0
- package/dist/kits/core/factory/studio-kit.js.map +1 -0
- package/dist/kits/core/factory/workflow-kit.d.ts +57 -0
- package/dist/kits/core/factory/workflow-kit.d.ts.map +1 -0
- package/dist/kits/core/factory/workflow-kit.js +107 -0
- package/dist/kits/core/factory/workflow-kit.js.map +1 -0
- package/dist/kits/core/index.d.ts +25 -0
- package/dist/kits/core/index.d.ts.map +1 -0
- package/dist/kits/core/index.js +111 -0
- package/dist/kits/core/index.js.map +1 -0
- package/dist/kits/core/types/index.d.ts +65 -0
- package/dist/kits/core/types/index.d.ts.map +1 -0
- package/dist/kits/core/types/index.js +49 -0
- package/dist/kits/core/types/index.js.map +1 -0
- package/dist/kits/core/validation/index.d.ts +42 -0
- package/dist/kits/core/validation/index.d.ts.map +1 -0
- package/dist/kits/core/validation/index.js +128 -0
- package/dist/kits/core/validation/index.js.map +1 -0
- package/dist/kits/fork-policy.d.ts +78 -0
- package/dist/kits/fork-policy.d.ts.map +1 -0
- package/dist/kits/fork-policy.js +92 -0
- package/dist/kits/fork-policy.js.map +1 -0
- package/dist/kits/fork-registry.d.ts +54 -0
- package/dist/kits/fork-registry.d.ts.map +1 -0
- package/dist/kits/fork-registry.js +201 -0
- package/dist/kits/fork-registry.js.map +1 -0
- package/dist/kits/fork-remote.d.ts +52 -0
- package/dist/kits/fork-remote.d.ts.map +1 -0
- package/dist/kits/fork-remote.js +116 -0
- package/dist/kits/fork-remote.js.map +1 -0
- package/dist/kits/fork-sync-agent.d.ts +51 -0
- package/dist/kits/fork-sync-agent.d.ts.map +1 -0
- package/dist/kits/fork-sync-agent.js +435 -0
- package/dist/kits/fork-sync-agent.js.map +1 -0
- package/dist/kits/fork-sync.d.ts +32 -0
- package/dist/kits/fork-sync.d.ts.map +1 -0
- package/dist/kits/fork-sync.js +590 -0
- package/dist/kits/fork-sync.js.map +1 -0
- package/dist/kits/fork-trace.d.ts +29 -0
- package/dist/kits/fork-trace.d.ts.map +1 -0
- package/dist/kits/fork-trace.js +54 -0
- package/dist/kits/fork-trace.js.map +1 -0
- package/dist/kits/fork-types.d.ts +198 -0
- package/dist/kits/fork-types.d.ts.map +1 -0
- package/dist/kits/fork-types.js +16 -0
- package/dist/kits/fork-types.js.map +1 -0
- package/dist/kits/service.d.ts +63 -0
- package/dist/kits/service.d.ts.map +1 -0
- package/dist/kits/service.js +630 -0
- package/dist/kits/service.js.map +1 -0
- package/dist/prompts/database.d.ts +3 -0
- package/dist/prompts/database.d.ts.map +1 -0
- package/dist/prompts/database.js +144 -0
- package/dist/prompts/database.js.map +1 -0
- package/dist/prompts/llm.d.ts +3 -0
- package/dist/prompts/llm.d.ts.map +1 -0
- package/dist/prompts/llm.js +37 -0
- package/dist/prompts/llm.js.map +1 -0
- package/dist/prompts/logging.d.ts +3 -0
- package/dist/prompts/logging.d.ts.map +1 -0
- package/dist/prompts/logging.js +31 -0
- package/dist/prompts/logging.js.map +1 -0
- package/dist/prompts/secrets.d.ts +4 -0
- package/dist/prompts/secrets.d.ts.map +1 -0
- package/dist/prompts/secrets.js +85 -0
- package/dist/prompts/secrets.js.map +1 -0
- package/dist/prompts/server.d.ts +9 -0
- package/dist/prompts/server.d.ts.map +1 -0
- package/dist/prompts/server.js +154 -0
- package/dist/prompts/server.js.map +1 -0
- package/dist/prompts/storage.d.ts +4 -0
- package/dist/prompts/storage.d.ts.map +1 -0
- package/dist/prompts/storage.js +129 -0
- package/dist/prompts/storage.js.map +1 -0
- package/dist/runtime/agent-harness/auth-store.d.ts +8 -0
- package/dist/runtime/agent-harness/auth-store.d.ts.map +1 -0
- package/dist/runtime/agent-harness/auth-store.js +92 -0
- package/dist/runtime/agent-harness/auth-store.js.map +1 -0
- package/dist/runtime/artifact-contracts/index.d.ts +47 -0
- package/dist/runtime/artifact-contracts/index.d.ts.map +1 -0
- package/dist/runtime/artifact-contracts/index.js +153 -0
- package/dist/runtime/artifact-contracts/index.js.map +1 -0
- package/dist/runtime/artifact-contracts/types.d.ts +82 -0
- package/dist/runtime/artifact-contracts/types.d.ts.map +1 -0
- package/dist/runtime/artifact-contracts/types.js +16 -0
- package/dist/runtime/artifact-contracts/types.js.map +1 -0
- package/dist/runtime/cms-capability-registry/index.d.ts +30 -0
- package/dist/runtime/cms-capability-registry/index.d.ts.map +1 -0
- package/dist/runtime/cms-capability-registry/index.js +183 -0
- package/dist/runtime/cms-capability-registry/index.js.map +1 -0
- package/dist/runtime/cms-capability-registry/types.d.ts +109 -0
- package/dist/runtime/cms-capability-registry/types.d.ts.map +1 -0
- package/dist/runtime/cms-capability-registry/types.js +19 -0
- package/dist/runtime/cms-capability-registry/types.js.map +1 -0
- package/dist/runtime/cms-node-contracts/compile.d.ts +6 -0
- package/dist/runtime/cms-node-contracts/compile.d.ts.map +1 -0
- package/dist/runtime/cms-node-contracts/compile.js +57 -0
- package/dist/runtime/cms-node-contracts/compile.js.map +1 -0
- package/dist/runtime/cms-node-contracts/index.d.ts +6 -0
- package/dist/runtime/cms-node-contracts/index.d.ts.map +1 -0
- package/dist/runtime/cms-node-contracts/index.js +5 -0
- package/dist/runtime/cms-node-contracts/index.js.map +1 -0
- package/dist/runtime/cms-node-contracts/introspect.d.ts +5 -0
- package/dist/runtime/cms-node-contracts/introspect.d.ts.map +1 -0
- package/dist/runtime/cms-node-contracts/introspect.js +61 -0
- package/dist/runtime/cms-node-contracts/introspect.js.map +1 -0
- package/dist/runtime/cms-node-contracts/normalize.d.ts +5 -0
- package/dist/runtime/cms-node-contracts/normalize.d.ts.map +1 -0
- package/dist/runtime/cms-node-contracts/normalize.js +112 -0
- package/dist/runtime/cms-node-contracts/normalize.js.map +1 -0
- package/dist/runtime/cms-node-contracts/presenter.d.ts +9 -0
- package/dist/runtime/cms-node-contracts/presenter.d.ts.map +1 -0
- package/dist/runtime/cms-node-contracts/presenter.js +117 -0
- package/dist/runtime/cms-node-contracts/presenter.js.map +1 -0
- package/dist/runtime/cms-node-contracts/types.d.ts +76 -0
- package/dist/runtime/cms-node-contracts/types.d.ts.map +1 -0
- package/dist/runtime/cms-node-contracts/types.js +2 -0
- package/dist/runtime/cms-node-contracts/types.js.map +1 -0
- package/dist/runtime/dynamic-registry-pipeline/index.d.ts +41 -0
- package/dist/runtime/dynamic-registry-pipeline/index.d.ts.map +1 -0
- package/dist/runtime/dynamic-registry-pipeline/index.js +224 -0
- package/dist/runtime/dynamic-registry-pipeline/index.js.map +1 -0
- package/dist/runtime/dynamic-registry-pipeline/types.d.ts +61 -0
- package/dist/runtime/dynamic-registry-pipeline/types.d.ts.map +1 -0
- package/dist/runtime/dynamic-registry-pipeline/types.js +14 -0
- package/dist/runtime/dynamic-registry-pipeline/types.js.map +1 -0
- package/dist/runtime/hosted-execution-client/index.d.ts +45 -0
- package/dist/runtime/hosted-execution-client/index.d.ts.map +1 -0
- package/dist/runtime/hosted-execution-client/index.js +527 -0
- package/dist/runtime/hosted-execution-client/index.js.map +1 -0
- package/dist/runtime/hosted-execution-client/types.d.ts +125 -0
- package/dist/runtime/hosted-execution-client/types.d.ts.map +1 -0
- package/dist/runtime/hosted-execution-client/types.js +9 -0
- package/dist/runtime/hosted-execution-client/types.js.map +1 -0
- package/dist/runtime/index.d.ts +24 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/index.js +24 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/runtime/machine-capability-resolver/index.d.ts +32 -0
- package/dist/runtime/machine-capability-resolver/index.d.ts.map +1 -0
- package/dist/runtime/machine-capability-resolver/index.js +131 -0
- package/dist/runtime/machine-capability-resolver/index.js.map +1 -0
- package/dist/runtime/machine-capability-resolver/types.d.ts +46 -0
- package/dist/runtime/machine-capability-resolver/types.d.ts.map +1 -0
- package/dist/runtime/machine-capability-resolver/types.js +13 -0
- package/dist/runtime/machine-capability-resolver/types.js.map +1 -0
- package/dist/runtime/native-intelligence/contract.d.ts +174 -0
- package/dist/runtime/native-intelligence/contract.d.ts.map +1 -0
- package/dist/runtime/native-intelligence/contract.js +23 -0
- package/dist/runtime/native-intelligence/contract.js.map +1 -0
- package/dist/runtime/native-intelligence/index.d.ts +38 -0
- package/dist/runtime/native-intelligence/index.d.ts.map +1 -0
- package/dist/runtime/native-intelligence/index.js +121 -0
- package/dist/runtime/native-intelligence/index.js.map +1 -0
- package/dist/runtime/native-intelligence/normalizer.d.ts +22 -0
- package/dist/runtime/native-intelligence/normalizer.d.ts.map +1 -0
- package/dist/runtime/native-intelligence/normalizer.js +307 -0
- package/dist/runtime/native-intelligence/normalizer.js.map +1 -0
- package/dist/runtime/native-intelligence/planner.d.ts +22 -0
- package/dist/runtime/native-intelligence/planner.d.ts.map +1 -0
- package/dist/runtime/native-intelligence/planner.js +312 -0
- package/dist/runtime/native-intelligence/planner.js.map +1 -0
- package/dist/runtime/native-intelligence/provider.d.ts +27 -0
- package/dist/runtime/native-intelligence/provider.d.ts.map +1 -0
- package/dist/runtime/native-intelligence/provider.js +221 -0
- package/dist/runtime/native-intelligence/provider.js.map +1 -0
- package/dist/runtime/native-intelligence/recommender.d.ts +23 -0
- package/dist/runtime/native-intelligence/recommender.d.ts.map +1 -0
- package/dist/runtime/native-intelligence/recommender.js +299 -0
- package/dist/runtime/native-intelligence/recommender.js.map +1 -0
- package/dist/runtime/native-intelligence/summarizer.d.ts +22 -0
- package/dist/runtime/native-intelligence/summarizer.d.ts.map +1 -0
- package/dist/runtime/native-intelligence/summarizer.js +228 -0
- package/dist/runtime/native-intelligence/summarizer.js.map +1 -0
- package/dist/runtime/open-agents/contract.d.ts +58 -0
- package/dist/runtime/open-agents/contract.d.ts.map +1 -0
- package/dist/runtime/open-agents/contract.js +26 -0
- package/dist/runtime/open-agents/contract.js.map +1 -0
- package/dist/runtime/open-agents/index.d.ts +15 -0
- package/dist/runtime/open-agents/index.d.ts.map +1 -0
- package/dist/runtime/open-agents/index.js +72 -0
- package/dist/runtime/open-agents/index.js.map +1 -0
- package/dist/runtime/open-agents/provider.d.ts +32 -0
- package/dist/runtime/open-agents/provider.d.ts.map +1 -0
- package/dist/runtime/open-agents/provider.js +190 -0
- package/dist/runtime/open-agents/provider.js.map +1 -0
- package/dist/runtime/qwen-code/contract.d.ts +79 -0
- package/dist/runtime/qwen-code/contract.d.ts.map +1 -0
- package/dist/runtime/qwen-code/contract.js +40 -0
- package/dist/runtime/qwen-code/contract.js.map +1 -0
- package/dist/runtime/qwen-code/health.d.ts +11 -0
- package/dist/runtime/qwen-code/health.d.ts.map +1 -0
- package/dist/runtime/qwen-code/health.js +111 -0
- package/dist/runtime/qwen-code/health.js.map +1 -0
- package/dist/runtime/qwen-code/index.d.ts +26 -0
- package/dist/runtime/qwen-code/index.d.ts.map +1 -0
- package/dist/runtime/qwen-code/index.js +93 -0
- package/dist/runtime/qwen-code/index.js.map +1 -0
- package/dist/runtime/qwen-code/provider.d.ts +23 -0
- package/dist/runtime/qwen-code/provider.d.ts.map +1 -0
- package/dist/runtime/qwen-code/provider.js +134 -0
- package/dist/runtime/qwen-code/provider.js.map +1 -0
- package/dist/runtime/workflow-hygiene/index.d.ts +4 -0
- package/dist/runtime/workflow-hygiene/index.d.ts.map +1 -0
- package/dist/runtime/workflow-hygiene/index.js +3 -0
- package/dist/runtime/workflow-hygiene/index.js.map +1 -0
- package/dist/runtime/workflow-hygiene/labels.d.ts +4 -0
- package/dist/runtime/workflow-hygiene/labels.d.ts.map +1 -0
- package/dist/runtime/workflow-hygiene/labels.js +64 -0
- package/dist/runtime/workflow-hygiene/labels.js.map +1 -0
- package/dist/runtime/workflow-hygiene/summaries.d.ts +11 -0
- package/dist/runtime/workflow-hygiene/summaries.d.ts.map +1 -0
- package/dist/runtime/workflow-hygiene/summaries.js +17 -0
- package/dist/runtime/workflow-hygiene/summaries.js.map +1 -0
- package/dist/runtime/workflow-hygiene/types.d.ts +12 -0
- package/dist/runtime/workflow-hygiene/types.d.ts.map +1 -0
- package/dist/runtime/workflow-hygiene/types.js +2 -0
- package/dist/runtime/workflow-hygiene/types.js.map +1 -0
- package/dist/starter/init.d.ts +18 -0
- package/dist/starter/init.d.ts.map +1 -0
- package/dist/starter/init.js +108 -0
- package/dist/starter/init.js.map +1 -0
- package/dist/starter/source-import/agent.d.ts +60 -0
- package/dist/starter/source-import/agent.d.ts.map +1 -0
- package/dist/starter/source-import/agent.js +302 -0
- package/dist/starter/source-import/agent.js.map +1 -0
- package/dist/starter/source-import/detect.d.ts +20 -0
- package/dist/starter/source-import/detect.d.ts.map +1 -0
- package/dist/starter/source-import/detect.js +197 -0
- package/dist/starter/source-import/detect.js.map +1 -0
- package/dist/starter/source-import/github-source.d.ts +66 -0
- package/dist/starter/source-import/github-source.d.ts.map +1 -0
- package/dist/starter/source-import/github-source.js +233 -0
- package/dist/starter/source-import/github-source.js.map +1 -0
- package/dist/starter/source-import/index.d.ts +31 -0
- package/dist/starter/source-import/index.d.ts.map +1 -0
- package/dist/starter/source-import/index.js +31 -0
- package/dist/starter/source-import/index.js.map +1 -0
- package/dist/starter/source-import/materialize.d.ts +61 -0
- package/dist/starter/source-import/materialize.d.ts.map +1 -0
- package/dist/starter/source-import/materialize.js +260 -0
- package/dist/starter/source-import/materialize.js.map +1 -0
- package/dist/starter/source-import/plan.d.ts +39 -0
- package/dist/starter/source-import/plan.d.ts.map +1 -0
- package/dist/starter/source-import/plan.js +158 -0
- package/dist/starter/source-import/plan.js.map +1 -0
- package/dist/starter/source-import/security.d.ts +42 -0
- package/dist/starter/source-import/security.d.ts.map +1 -0
- package/dist/starter/source-import/security.js +323 -0
- package/dist/starter/source-import/security.js.map +1 -0
- package/dist/starter/source-import/skills-source.d.ts +28 -0
- package/dist/starter/source-import/skills-source.d.ts.map +1 -0
- package/dist/starter/source-import/skills-source.js +419 -0
- package/dist/starter/source-import/skills-source.js.map +1 -0
- package/dist/starter/source-import/summarize.d.ts +25 -0
- package/dist/starter/source-import/summarize.d.ts.map +1 -0
- package/dist/starter/source-import/summarize.js +107 -0
- package/dist/starter/source-import/summarize.js.map +1 -0
- package/dist/starter/source-import/types.d.ts +357 -0
- package/dist/starter/source-import/types.d.ts.map +1 -0
- package/dist/starter/source-import/types.js +28 -0
- package/dist/starter/source-import/types.js.map +1 -0
- package/dist/starter/types.d.ts +46 -0
- package/dist/starter/types.d.ts.map +1 -0
- package/dist/starter/types.js +11 -0
- package/dist/starter/types.js.map +1 -0
- package/dist/status/probes.d.ts +25 -0
- package/dist/status/probes.d.ts.map +1 -0
- package/dist/status/probes.js +297 -0
- package/dist/status/probes.js.map +1 -0
- package/dist/status/runner.d.ts +18 -0
- package/dist/status/runner.d.ts.map +1 -0
- package/dist/status/runner.js +185 -0
- package/dist/status/runner.js.map +1 -0
- package/dist/status/types.d.ts +60 -0
- package/dist/status/types.d.ts.map +1 -0
- package/dist/status/types.js +13 -0
- package/dist/status/types.js.map +1 -0
- package/dist/templates/catalog.d.ts +12 -0
- package/dist/templates/catalog.d.ts.map +1 -0
- package/dist/templates/catalog.js +226 -0
- package/dist/templates/catalog.js.map +1 -0
- package/dist/templates/contract.d.ts +62 -0
- package/dist/templates/contract.d.ts.map +1 -0
- package/dist/templates/contract.js +12 -0
- package/dist/templates/contract.js.map +1 -0
- package/dist/templates/index.d.ts +5 -0
- package/dist/templates/index.d.ts.map +1 -0
- package/dist/templates/index.js +2 -0
- package/dist/templates/index.js.map +1 -0
- package/dist/templates/service.d.ts +19 -0
- package/dist/templates/service.d.ts.map +1 -0
- package/dist/templates/service.js +132 -0
- package/dist/templates/service.js.map +1 -0
- package/dist/utils/banner.d.ts +2 -0
- package/dist/utils/banner.d.ts.map +1 -0
- package/dist/utils/banner.js.map +1 -0
- package/dist/utils/net.d.ts +5 -0
- package/dist/utils/net.d.ts.map +1 -0
- package/dist/utils/net.js +19 -0
- package/dist/utils/net.js.map +1 -0
- package/dist/utils/path-resolver.d.ts +2 -0
- package/dist/utils/path-resolver.d.ts.map +1 -0
- package/dist/utils/path-resolver.js +22 -0
- package/dist/utils/path-resolver.js.map +1 -0
- package/dist/utils/progress.d.ts +24 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +57 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/table-renderer.d.ts +28 -0
- package/dist/utils/table-renderer.d.ts.map +1 -0
- package/dist/utils/table-renderer.js +83 -0
- package/dist/utils/table-renderer.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,1338 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kit Fork Commands
|
|
3
|
+
*
|
|
4
|
+
* CLI command surface for the worker kit fork & self-healing sync subsystem.
|
|
5
|
+
* Follows the exact same Clack + Commander patterns as kit.ts, template.ts, etc.
|
|
6
|
+
*
|
|
7
|
+
* Commands registered:
|
|
8
|
+
* growthub kit fork # interactive hub (also callable from discovery)
|
|
9
|
+
* growthub kit fork register <path> # register a fork directory
|
|
10
|
+
* growthub kit fork list # list registered forks
|
|
11
|
+
* growthub kit fork status <fork-id> # drift report
|
|
12
|
+
* growthub kit fork heal <fork-id> # heal interactively
|
|
13
|
+
* growthub kit fork jobs # background job queue
|
|
14
|
+
* growthub kit fork deregister <fork-id> # remove registration
|
|
15
|
+
*
|
|
16
|
+
* Top-level shortcut (also wired by index.ts):
|
|
17
|
+
* growthub fork-sync → same hub as above
|
|
18
|
+
*/
|
|
19
|
+
import * as p from "@clack/prompts";
|
|
20
|
+
import { registerKitForkRemoteSubcommands } from "./kit-fork-remote.js";
|
|
21
|
+
import pc from "picocolors";
|
|
22
|
+
import { printPaperclipCliBanner } from "../utils/banner.js";
|
|
23
|
+
import { renderTable } from "../utils/table-renderer.js";
|
|
24
|
+
import { renderProgressBar, formatRelative } from "../utils/progress.js";
|
|
25
|
+
import { registerKitFork, listKitForkRegistrations, deregisterKitFork, } from "../kits/fork-registry.js";
|
|
26
|
+
import { detectKitForkDrift, buildKitForkHealPlan, } from "../kits/fork-sync.js";
|
|
27
|
+
import { runKitForkSyncJob, dispatchKitForkSyncJobBackground, listKitForkSyncJobs, cancelKitForkSyncJob, pruneKitForkSyncJobs, getKitForkSyncJob, } from "../kits/fork-sync-agent.js";
|
|
28
|
+
import { listBundledKits } from "../kits/service.js";
|
|
29
|
+
import { readKitForkPolicy, isUntouchable, } from "../kits/fork-policy.js";
|
|
30
|
+
import { appendKitForkTraceEvent, readKitForkTrace } from "../kits/fork-trace.js";
|
|
31
|
+
// ---------------------------------------------------------------------------
|
|
32
|
+
// Display helpers (mirrors patterns from kit.ts)
|
|
33
|
+
// ---------------------------------------------------------------------------
|
|
34
|
+
function hr(width = 72) {
|
|
35
|
+
return pc.dim("─".repeat(width));
|
|
36
|
+
}
|
|
37
|
+
function severityBadge(s) {
|
|
38
|
+
switch (s) {
|
|
39
|
+
case "critical": return pc.red("● critical");
|
|
40
|
+
case "warning": return pc.yellow("● warning");
|
|
41
|
+
case "info": return pc.cyan("● info");
|
|
42
|
+
default: return pc.green("● in-sync");
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
function jobStatusBadge(status) {
|
|
46
|
+
switch (status) {
|
|
47
|
+
case "running": return pc.cyan("⟳ running");
|
|
48
|
+
case "completed": return pc.green("✓ completed");
|
|
49
|
+
case "failed": return pc.red("✗ failed");
|
|
50
|
+
case "cancelled": return pc.dim("○ cancelled");
|
|
51
|
+
default: return pc.dim("… pending");
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function formatDate(iso) {
|
|
55
|
+
if (!iso)
|
|
56
|
+
return pc.dim("—");
|
|
57
|
+
return new Date(iso).toLocaleString();
|
|
58
|
+
}
|
|
59
|
+
function printDriftReport(report) {
|
|
60
|
+
console.log("");
|
|
61
|
+
console.log(pc.bold(`Fork: ${report.forkId}`) + " " + severityBadge(report.overallSeverity));
|
|
62
|
+
console.log(pc.dim(`Kit: ${report.kitId}`) +
|
|
63
|
+
" " +
|
|
64
|
+
pc.dim(`fork v${report.forkVersion} → upstream v${report.upstreamVersion}`));
|
|
65
|
+
console.log(hr());
|
|
66
|
+
if (report.fileDrifts.length === 0 && report.packageDrifts.length === 0) {
|
|
67
|
+
console.log(pc.green(" No drift detected — fork is in sync."));
|
|
68
|
+
}
|
|
69
|
+
if (report.fileDrifts.length > 0) {
|
|
70
|
+
console.log(pc.bold("\n File Drift:"));
|
|
71
|
+
for (const d of report.fileDrifts) {
|
|
72
|
+
const badge = d.changeType === "added" ? pc.cyan(" +") :
|
|
73
|
+
d.changeType === "modified" ? pc.yellow(" ~") :
|
|
74
|
+
pc.red(" -");
|
|
75
|
+
console.log(`${badge} ${d.relativePath} ${pc.dim(d.description)}`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
if (report.packageDrifts.length > 0) {
|
|
79
|
+
console.log(pc.bold("\n Package Drift:"));
|
|
80
|
+
for (const d of report.packageDrifts) {
|
|
81
|
+
const badge = d.changeType === "added" ? pc.cyan(" +") :
|
|
82
|
+
d.changeType === "updated" ? pc.yellow(" ~") :
|
|
83
|
+
pc.red(" -");
|
|
84
|
+
const ver = d.forkVersion
|
|
85
|
+
? `${d.forkVersion} → ${d.upstreamVersion}`
|
|
86
|
+
: `(new) ${d.upstreamVersion}`;
|
|
87
|
+
console.log(`${badge} ${d.packageName} ${pc.dim(ver)}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
if (report.customSkillsDetected.length > 0) {
|
|
91
|
+
console.log(pc.bold("\n Custom Skills Detected (always preserved):"));
|
|
92
|
+
for (const s of report.customSkillsDetected) {
|
|
93
|
+
console.log(` ${pc.magenta("⚑")} ${s}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
console.log("");
|
|
97
|
+
console.log(hr());
|
|
98
|
+
}
|
|
99
|
+
function printHealPlan(plan) {
|
|
100
|
+
console.log("");
|
|
101
|
+
console.log(pc.bold(`Heal Plan: ${plan.forkId}`) +
|
|
102
|
+
pc.dim(` v${plan.fromVersion} → v${plan.toVersion}`));
|
|
103
|
+
console.log(pc.dim("Estimated risk: ") + severityBadge(plan.estimatedRisk));
|
|
104
|
+
console.log(hr());
|
|
105
|
+
if (plan.actions.length === 0) {
|
|
106
|
+
console.log(pc.green(" No actions needed."));
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
console.log(pc.bold(` ${plan.actions.length} action(s) planned:`));
|
|
110
|
+
for (const a of plan.actions) {
|
|
111
|
+
const icon = a.actionType === "skip_user_modified" ? pc.dim(" ○") : pc.cyan(" →");
|
|
112
|
+
console.log(`${icon} ${a.description}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
if (plan.preservedPaths.length > 0) {
|
|
116
|
+
console.log(pc.bold(`\n ${plan.preservedPaths.length} path(s) preserved (user modifications kept):`));
|
|
117
|
+
for (const pp of plan.preservedPaths) {
|
|
118
|
+
console.log(pc.dim(` ⚑ ${pp}`));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
console.log("");
|
|
122
|
+
console.log(hr());
|
|
123
|
+
}
|
|
124
|
+
function statusIconForDrift(severity) {
|
|
125
|
+
switch (severity) {
|
|
126
|
+
case "critical": return pc.red("✗ drift-major");
|
|
127
|
+
case "warning": return pc.yellow("⚠ drift-warn");
|
|
128
|
+
case "info": return pc.cyan("~ drift-minor");
|
|
129
|
+
default: return pc.green("✓ synced");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function summarizeFork(fork, opts = {}) {
|
|
133
|
+
let severity = "unknown";
|
|
134
|
+
let upstreamVersion = null;
|
|
135
|
+
let lastHealAt = fork.lastSyncedAt ?? null;
|
|
136
|
+
if (!opts.skipUpstreamCheck) {
|
|
137
|
+
try {
|
|
138
|
+
const report = detectKitForkDrift(fork);
|
|
139
|
+
severity = report.overallSeverity;
|
|
140
|
+
upstreamVersion = report.upstreamVersion;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
severity = "unknown";
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
let protectedPaths = [];
|
|
147
|
+
try {
|
|
148
|
+
const policy = readKitForkPolicy(fork.forkPath);
|
|
149
|
+
protectedPaths = policy.untouchablePaths.slice(0, 3);
|
|
150
|
+
}
|
|
151
|
+
catch { /* tolerant */ }
|
|
152
|
+
if (!lastHealAt) {
|
|
153
|
+
try {
|
|
154
|
+
const events = readKitForkTrace(fork.forkPath);
|
|
155
|
+
const last = [...events].reverse().find((e) => e.type === "heal_applied");
|
|
156
|
+
if (last)
|
|
157
|
+
lastHealAt = last.timestamp;
|
|
158
|
+
}
|
|
159
|
+
catch { /* tolerant */ }
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
forkId: fork.forkId,
|
|
163
|
+
label: fork.label ?? null,
|
|
164
|
+
kitId: fork.kitId,
|
|
165
|
+
baseVersion: fork.baseVersion,
|
|
166
|
+
forkPath: fork.forkPath,
|
|
167
|
+
severity,
|
|
168
|
+
upstreamVersion,
|
|
169
|
+
protectedPaths,
|
|
170
|
+
lastHealAt,
|
|
171
|
+
hasRemote: Boolean(fork.remote),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
function renderForkTable(summaries) {
|
|
175
|
+
return renderTable({
|
|
176
|
+
columns: [
|
|
177
|
+
{
|
|
178
|
+
key: "forkId",
|
|
179
|
+
label: "Fork ID",
|
|
180
|
+
maxWidth: 26,
|
|
181
|
+
format: (v, row) => pc.cyan(row.label ?? String(v)),
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
key: "kitId",
|
|
185
|
+
label: "Kit",
|
|
186
|
+
maxWidth: 22,
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
key: "baseVersion",
|
|
190
|
+
label: "Base",
|
|
191
|
+
format: (v) => `v${v}`,
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
key: "upstreamVersion",
|
|
195
|
+
label: "Upstream",
|
|
196
|
+
format: (v) => (v ? `v${v}` : pc.dim("—")),
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
key: "severity",
|
|
200
|
+
label: "Status",
|
|
201
|
+
format: (v) => v === "unknown" ? pc.dim("○ unknown") : statusIconForDrift(v),
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
key: "protectedPaths",
|
|
205
|
+
label: "Protected",
|
|
206
|
+
maxWidth: 18,
|
|
207
|
+
format: (v) => {
|
|
208
|
+
const arr = v;
|
|
209
|
+
if (!arr || arr.length === 0)
|
|
210
|
+
return pc.dim("—");
|
|
211
|
+
return arr.join(",");
|
|
212
|
+
},
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
key: "lastHealAt",
|
|
216
|
+
label: "Last Heal",
|
|
217
|
+
format: (v) => (v ? formatRelative(v) : pc.dim("—")),
|
|
218
|
+
},
|
|
219
|
+
],
|
|
220
|
+
rows: summaries,
|
|
221
|
+
emptyText: "No forks registered yet. Run `growthub kit fork register <path>` to get started.",
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
function printForkList(forks) {
|
|
225
|
+
if (forks.length === 0) {
|
|
226
|
+
console.log(pc.dim(" No forks registered yet. Run `growthub kit fork register <path>` to get started."));
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
const summaries = forks.map((f) => summarizeFork(f, { skipUpstreamCheck: true }));
|
|
230
|
+
console.log("");
|
|
231
|
+
console.log(pc.bold("Registered Kit Forks") + pc.dim(` ${forks.length} total`));
|
|
232
|
+
console.log(hr());
|
|
233
|
+
console.log(renderForkTable(summaries));
|
|
234
|
+
console.log("");
|
|
235
|
+
console.log(hr());
|
|
236
|
+
}
|
|
237
|
+
// ---------------------------------------------------------------------------
|
|
238
|
+
// Heal preview — rich grouped rendering
|
|
239
|
+
// ---------------------------------------------------------------------------
|
|
240
|
+
function groupHealActions(plan) {
|
|
241
|
+
const safeAdd = [];
|
|
242
|
+
const safeUpdate = [];
|
|
243
|
+
const protectedActions = [];
|
|
244
|
+
const unresolved = [];
|
|
245
|
+
for (const a of plan.actions) {
|
|
246
|
+
if (a.actionType === "skip_user_modified") {
|
|
247
|
+
protectedActions.push(a);
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
if (a.needsConfirmation) {
|
|
251
|
+
unresolved.push(a);
|
|
252
|
+
continue;
|
|
253
|
+
}
|
|
254
|
+
if (a.actionType === "add_file" || a.actionType === "add_custom_skill") {
|
|
255
|
+
safeAdd.push(a);
|
|
256
|
+
continue;
|
|
257
|
+
}
|
|
258
|
+
safeUpdate.push(a);
|
|
259
|
+
}
|
|
260
|
+
return { safeAdd, safeUpdate, protected: protectedActions, unresolved };
|
|
261
|
+
}
|
|
262
|
+
function printRichHealPreview(plan, policy) {
|
|
263
|
+
const g = groupHealActions(plan);
|
|
264
|
+
console.log("");
|
|
265
|
+
console.log(pc.bold(`Heal Plan: ${plan.forkId}`) +
|
|
266
|
+
pc.dim(` v${plan.fromVersion} → v${plan.toVersion}`));
|
|
267
|
+
console.log(pc.dim("Estimated risk: ") + severityBadge(plan.estimatedRisk));
|
|
268
|
+
console.log(hr());
|
|
269
|
+
if (g.safeAdd.length > 0) {
|
|
270
|
+
console.log(pc.bold(`\n SAFE ADDITIONS (${g.safeAdd.length}):`));
|
|
271
|
+
for (const a of g.safeAdd) {
|
|
272
|
+
console.log(` ${pc.green("+")} ${a.targetPath} ${pc.dim(a.description)}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
if (g.safeUpdate.length > 0) {
|
|
276
|
+
console.log(pc.bold(`\n SAFE UPDATES (${g.safeUpdate.length}):`));
|
|
277
|
+
for (const a of g.safeUpdate) {
|
|
278
|
+
console.log(` ${pc.yellow("~")} ${a.targetPath} ${pc.dim(a.description)}`);
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
if (g.protected.length > 0 || plan.preservedPaths.length > 0) {
|
|
282
|
+
const paths = new Set([
|
|
283
|
+
...g.protected.map((a) => a.targetPath),
|
|
284
|
+
...plan.preservedPaths,
|
|
285
|
+
]);
|
|
286
|
+
console.log(pc.bold(`\n PROTECTED (${paths.size}):`));
|
|
287
|
+
for (const pth of paths) {
|
|
288
|
+
const reason = policy && isUntouchable(policy, pth)
|
|
289
|
+
? "policy.untouchablePaths"
|
|
290
|
+
: "user-modified";
|
|
291
|
+
console.log(` ${pc.dim("○")} ${pth} ${pc.dim(`(${reason})`)}`);
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (g.unresolved.length > 0) {
|
|
295
|
+
console.log(pc.bold(`\n UNRESOLVED — needs confirmation (${g.unresolved.length}):`));
|
|
296
|
+
for (const a of g.unresolved) {
|
|
297
|
+
console.log(` ${pc.red("!")} ${a.targetPath} ${pc.dim(a.confirmationReason ?? "policy.confirmBeforeChange")}`);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
console.log("");
|
|
301
|
+
console.log(pc.bold(" DECISION:"));
|
|
302
|
+
const applyCount = g.safeAdd.length + g.safeUpdate.length;
|
|
303
|
+
const skipCount = g.protected.length + plan.preservedPaths.length;
|
|
304
|
+
console.log(` ${pc.green(String(applyCount))} will apply · ${pc.dim(String(skipCount) + " protected")} · ${g.unresolved.length > 0 ? pc.red(String(g.unresolved.length) + " unresolved") : pc.dim("0 unresolved")}`);
|
|
305
|
+
console.log(hr());
|
|
306
|
+
}
|
|
307
|
+
function printNextStepsAfterStatus(forkId, hasDrift) {
|
|
308
|
+
console.log("");
|
|
309
|
+
console.log(pc.bold(" Next steps:"));
|
|
310
|
+
if (hasDrift) {
|
|
311
|
+
console.log(` ${pc.cyan("growthub kit fork heal " + forkId + " --preview")} ${pc.dim("rich heal preview")}`);
|
|
312
|
+
console.log(` ${pc.cyan("growthub kit fork heal " + forkId)} ${pc.dim("apply interactively")}`);
|
|
313
|
+
}
|
|
314
|
+
console.log(` ${pc.cyan("growthub kit fork policy " + forkId)} ${pc.dim("interactive policy editor")}`);
|
|
315
|
+
console.log(` ${pc.cyan("growthub kit fork history " + forkId)} ${pc.dim("audit timeline")}`);
|
|
316
|
+
console.log("");
|
|
317
|
+
}
|
|
318
|
+
// ---------------------------------------------------------------------------
|
|
319
|
+
// Jobs table + watch + tail helpers
|
|
320
|
+
// ---------------------------------------------------------------------------
|
|
321
|
+
function estimateJobProgress(job) {
|
|
322
|
+
if (!job.healPlan)
|
|
323
|
+
return null;
|
|
324
|
+
const total = job.healPlan.actions.length;
|
|
325
|
+
if (total === 0)
|
|
326
|
+
return null;
|
|
327
|
+
if (job.healResult) {
|
|
328
|
+
const done = job.healResult.appliedCount + job.healResult.skippedCount;
|
|
329
|
+
return { current: Math.min(done, total), total };
|
|
330
|
+
}
|
|
331
|
+
return { current: 0, total };
|
|
332
|
+
}
|
|
333
|
+
function renderJobTable(jobs) {
|
|
334
|
+
return renderTable({
|
|
335
|
+
columns: [
|
|
336
|
+
{
|
|
337
|
+
key: "jobId",
|
|
338
|
+
label: "Job ID",
|
|
339
|
+
maxWidth: 28,
|
|
340
|
+
format: (v) => pc.cyan(String(v)),
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
key: "forkId",
|
|
344
|
+
label: "Fork ID",
|
|
345
|
+
maxWidth: 22,
|
|
346
|
+
format: (v) => pc.dim(String(v)),
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
key: "status",
|
|
350
|
+
label: "Status",
|
|
351
|
+
format: (v) => jobStatusBadge(v),
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
key: "healPlan",
|
|
355
|
+
label: "Progress",
|
|
356
|
+
maxWidth: 28,
|
|
357
|
+
format: (_v, row) => {
|
|
358
|
+
const prog = estimateJobProgress(row);
|
|
359
|
+
if (!prog) {
|
|
360
|
+
if (row.status === "completed")
|
|
361
|
+
return pc.green("✓ 100%");
|
|
362
|
+
if (row.status === "failed")
|
|
363
|
+
return pc.red("✗");
|
|
364
|
+
return pc.dim("—");
|
|
365
|
+
}
|
|
366
|
+
return renderProgressBar(prog.current, prog.total, { width: 14, showCounts: true });
|
|
367
|
+
},
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
key: "createdAt",
|
|
371
|
+
label: "Age",
|
|
372
|
+
format: (_v, row) => formatRelative(row.completedAt ?? row.createdAt),
|
|
373
|
+
},
|
|
374
|
+
],
|
|
375
|
+
rows: jobs,
|
|
376
|
+
emptyText: "No jobs found.",
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
function printJobDetail(job) {
|
|
380
|
+
console.log(` ${jobStatusBadge(job.status)} ${pc.cyan(job.jobId)} ${pc.dim(job.forkId)}`);
|
|
381
|
+
const prog = estimateJobProgress(job);
|
|
382
|
+
if (prog) {
|
|
383
|
+
console.log(` ${pc.dim("Progress:")} ${renderProgressBar(prog.current, prog.total, { width: 24 })}`);
|
|
384
|
+
}
|
|
385
|
+
if (job.healPlan) {
|
|
386
|
+
console.log(` ${pc.dim("Plan:")} ${job.healPlan.actions.length} action(s), risk=${job.healPlan.estimatedRisk}`);
|
|
387
|
+
}
|
|
388
|
+
if (job.startedAt)
|
|
389
|
+
console.log(` ${pc.dim("Started:")} ${formatRelative(job.startedAt)} (${job.startedAt})`);
|
|
390
|
+
if (job.completedAt)
|
|
391
|
+
console.log(` ${pc.dim("Completed:")} ${formatRelative(job.completedAt)} (${job.completedAt})`);
|
|
392
|
+
if (job.error)
|
|
393
|
+
console.log(` ${pc.red("Error:")} ${job.error}`);
|
|
394
|
+
}
|
|
395
|
+
const TERMINAL_JOB_STATUSES = [
|
|
396
|
+
"completed",
|
|
397
|
+
"failed",
|
|
398
|
+
"cancelled",
|
|
399
|
+
];
|
|
400
|
+
async function watchJob(jobId, jsonMode) {
|
|
401
|
+
const initial = getKitForkSyncJob(jobId);
|
|
402
|
+
if (!initial) {
|
|
403
|
+
console.error(pc.red(`Job not found: ${jobId}`));
|
|
404
|
+
process.exitCode = 1;
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
if (jsonMode) {
|
|
408
|
+
const snapshot = await pollUntilTerminal(jobId);
|
|
409
|
+
console.log(JSON.stringify(snapshot, null, 2));
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
console.log("");
|
|
413
|
+
console.log(pc.bold(`Watching job ${pc.cyan(jobId)}`));
|
|
414
|
+
console.log(hr());
|
|
415
|
+
let lastStatus = null;
|
|
416
|
+
let lastProgress = -1;
|
|
417
|
+
// Poll inline; exit as soon as the job reaches a terminal state.
|
|
418
|
+
// Poll interval is conservative (500ms) to avoid busy-waiting.
|
|
419
|
+
// eslint-disable-next-line no-constant-condition
|
|
420
|
+
while (true) {
|
|
421
|
+
const job = getKitForkSyncJob(jobId);
|
|
422
|
+
if (!job) {
|
|
423
|
+
console.error(pc.red(` Job disappeared: ${jobId}`));
|
|
424
|
+
process.exitCode = 1;
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
const prog = estimateJobProgress(job);
|
|
428
|
+
const progNum = prog ? Math.round((prog.current / (prog.total || 1)) * 100) : -1;
|
|
429
|
+
if (job.status !== lastStatus || progNum !== lastProgress) {
|
|
430
|
+
printJobDetail(job);
|
|
431
|
+
lastStatus = job.status;
|
|
432
|
+
lastProgress = progNum;
|
|
433
|
+
}
|
|
434
|
+
if (TERMINAL_JOB_STATUSES.includes(job.status)) {
|
|
435
|
+
console.log("");
|
|
436
|
+
if (job.status === "failed")
|
|
437
|
+
process.exitCode = 1;
|
|
438
|
+
return;
|
|
439
|
+
}
|
|
440
|
+
await sleep(500);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
async function pollUntilTerminal(jobId) {
|
|
444
|
+
// eslint-disable-next-line no-constant-condition
|
|
445
|
+
while (true) {
|
|
446
|
+
const job = getKitForkSyncJob(jobId);
|
|
447
|
+
if (!job)
|
|
448
|
+
throw new Error(`Job disappeared: ${jobId}`);
|
|
449
|
+
if (TERMINAL_JOB_STATUSES.includes(job.status))
|
|
450
|
+
return job;
|
|
451
|
+
await sleep(500);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
function sleep(ms) {
|
|
455
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
456
|
+
}
|
|
457
|
+
function tailJobTrace(jobId, limit, jsonMode) {
|
|
458
|
+
const job = getKitForkSyncJob(jobId);
|
|
459
|
+
if (!job) {
|
|
460
|
+
console.error(pc.red(`Job not found: ${jobId}`));
|
|
461
|
+
process.exitCode = 1;
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
const reg = listKitForkRegistrations().find((f) => f.forkId === job.forkId);
|
|
465
|
+
if (!reg) {
|
|
466
|
+
console.error(pc.red(`Fork not registered for job ${jobId}: ${job.forkId}`));
|
|
467
|
+
process.exitCode = 1;
|
|
468
|
+
return;
|
|
469
|
+
}
|
|
470
|
+
const events = readKitForkTrace(reg.forkPath)
|
|
471
|
+
.filter((e) => e.jobId === jobId)
|
|
472
|
+
.slice(-Math.max(1, limit));
|
|
473
|
+
if (jsonMode) {
|
|
474
|
+
console.log(JSON.stringify(events, null, 2));
|
|
475
|
+
return;
|
|
476
|
+
}
|
|
477
|
+
console.log("");
|
|
478
|
+
console.log(pc.bold(`Trace tail: ${pc.cyan(jobId)}`) + pc.dim(` ${events.length} event(s)`));
|
|
479
|
+
console.log(hr());
|
|
480
|
+
if (events.length === 0) {
|
|
481
|
+
console.log(pc.dim(` No trace events recorded for this job yet.`));
|
|
482
|
+
console.log("");
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
for (const e of events) {
|
|
486
|
+
const ts = e.timestamp.replace("T", " ").replace(/\..+Z$/, "Z");
|
|
487
|
+
console.log(` ${pc.dim(ts)} ${pc.cyan("[" + e.type + "]")} ${e.summary ?? ""}`);
|
|
488
|
+
}
|
|
489
|
+
console.log("");
|
|
490
|
+
}
|
|
491
|
+
// ---------------------------------------------------------------------------
|
|
492
|
+
// Interactive hub (exported for use in index.ts Discovery Hub)
|
|
493
|
+
// ---------------------------------------------------------------------------
|
|
494
|
+
export async function runKitForkHub(opts = {}) {
|
|
495
|
+
printPaperclipCliBanner();
|
|
496
|
+
p.intro(pc.bold("Kit Fork Sync Agent"));
|
|
497
|
+
while (true) {
|
|
498
|
+
const choice = await p.select({
|
|
499
|
+
message: "What do you want to do?",
|
|
500
|
+
options: [
|
|
501
|
+
{
|
|
502
|
+
value: "register",
|
|
503
|
+
label: "📂 Register a fork",
|
|
504
|
+
hint: "Track a downloaded and customised worker kit directory",
|
|
505
|
+
},
|
|
506
|
+
{
|
|
507
|
+
value: "list",
|
|
508
|
+
label: "📋 List forks",
|
|
509
|
+
hint: "Browse all registered forks",
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
value: "status",
|
|
513
|
+
label: "🔍 Check drift",
|
|
514
|
+
hint: "Detect what has changed between your fork and the latest upstream kit",
|
|
515
|
+
},
|
|
516
|
+
{
|
|
517
|
+
value: "heal",
|
|
518
|
+
label: "🔧 Heal fork",
|
|
519
|
+
hint: "Sync to latest upstream while preserving all your customisations",
|
|
520
|
+
},
|
|
521
|
+
{
|
|
522
|
+
value: "jobs",
|
|
523
|
+
label: "⚙️ Background jobs",
|
|
524
|
+
hint: "View status of async sync jobs",
|
|
525
|
+
},
|
|
526
|
+
...(opts.allowBackToHub
|
|
527
|
+
? [{ value: "__back_to_hub", label: "← Back to main menu" }]
|
|
528
|
+
: []),
|
|
529
|
+
],
|
|
530
|
+
});
|
|
531
|
+
if (p.isCancel(choice)) {
|
|
532
|
+
p.cancel("Cancelled.");
|
|
533
|
+
process.exit(0);
|
|
534
|
+
}
|
|
535
|
+
if (choice === "__back_to_hub")
|
|
536
|
+
return "back";
|
|
537
|
+
if (choice === "register") {
|
|
538
|
+
await runRegisterFlow();
|
|
539
|
+
continue;
|
|
540
|
+
}
|
|
541
|
+
if (choice === "list") {
|
|
542
|
+
runListFlow();
|
|
543
|
+
continue;
|
|
544
|
+
}
|
|
545
|
+
if (choice === "status") {
|
|
546
|
+
await runStatusFlow();
|
|
547
|
+
continue;
|
|
548
|
+
}
|
|
549
|
+
if (choice === "heal") {
|
|
550
|
+
await runHealFlow();
|
|
551
|
+
continue;
|
|
552
|
+
}
|
|
553
|
+
if (choice === "jobs") {
|
|
554
|
+
await runJobsFlow();
|
|
555
|
+
continue;
|
|
556
|
+
}
|
|
557
|
+
}
|
|
558
|
+
}
|
|
559
|
+
// ---------------------------------------------------------------------------
|
|
560
|
+
// Register flow
|
|
561
|
+
// ---------------------------------------------------------------------------
|
|
562
|
+
async function runRegisterFlow() {
|
|
563
|
+
const rawPath = await p.text({
|
|
564
|
+
message: "Enter the path to your fork directory",
|
|
565
|
+
placeholder: "/Users/you/kits/my-higgsfield-fork",
|
|
566
|
+
validate(v) { if (!v.trim())
|
|
567
|
+
return "Path is required"; },
|
|
568
|
+
});
|
|
569
|
+
if (p.isCancel(rawPath)) {
|
|
570
|
+
p.cancel("Cancelled.");
|
|
571
|
+
return;
|
|
572
|
+
}
|
|
573
|
+
const kits = listBundledKits();
|
|
574
|
+
const kitChoice = await p.select({
|
|
575
|
+
message: "Which worker kit is this fork based on?",
|
|
576
|
+
options: [
|
|
577
|
+
...kits.map((k) => ({
|
|
578
|
+
value: k.id,
|
|
579
|
+
label: k.id + " " + pc.dim("v" + k.version),
|
|
580
|
+
hint: k.description,
|
|
581
|
+
})),
|
|
582
|
+
{ value: "__cancel", label: "← Cancel" },
|
|
583
|
+
],
|
|
584
|
+
});
|
|
585
|
+
if (p.isCancel(kitChoice) || kitChoice === "__cancel") {
|
|
586
|
+
p.cancel("Cancelled.");
|
|
587
|
+
return;
|
|
588
|
+
}
|
|
589
|
+
const labelInput = await p.text({
|
|
590
|
+
message: "Friendly label for this fork (optional)",
|
|
591
|
+
placeholder: "My Production Higgsfield Setup",
|
|
592
|
+
});
|
|
593
|
+
if (p.isCancel(labelInput)) {
|
|
594
|
+
p.cancel("Cancelled.");
|
|
595
|
+
return;
|
|
596
|
+
}
|
|
597
|
+
const kitVersion = kits.find((k) => k.id === kitChoice)?.version ?? "0.0.0";
|
|
598
|
+
const spinner = p.spinner();
|
|
599
|
+
spinner.start("Registering fork...");
|
|
600
|
+
try {
|
|
601
|
+
const reg = registerKitFork({
|
|
602
|
+
forkPath: rawPath.trim(),
|
|
603
|
+
kitId: kitChoice,
|
|
604
|
+
baseVersion: kitVersion,
|
|
605
|
+
label: labelInput.trim() || undefined,
|
|
606
|
+
});
|
|
607
|
+
spinner.stop(pc.green("Fork registered."));
|
|
608
|
+
p.note([
|
|
609
|
+
`Fork ID: ${pc.cyan(reg.forkId)}`,
|
|
610
|
+
`Kit: ${reg.kitId} v${reg.baseVersion}`,
|
|
611
|
+
`Path: ${reg.forkPath}`,
|
|
612
|
+
"",
|
|
613
|
+
`Next: ${pc.cyan("growthub kit fork status " + reg.forkId)}`,
|
|
614
|
+
].join("\n"), "Registration complete");
|
|
615
|
+
}
|
|
616
|
+
catch (err) {
|
|
617
|
+
spinner.stop(pc.red("Registration failed."));
|
|
618
|
+
p.log.error(err.message);
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
// ---------------------------------------------------------------------------
|
|
622
|
+
// List flow
|
|
623
|
+
// ---------------------------------------------------------------------------
|
|
624
|
+
function runListFlow() {
|
|
625
|
+
printForkList(listKitForkRegistrations());
|
|
626
|
+
}
|
|
627
|
+
// ---------------------------------------------------------------------------
|
|
628
|
+
// Status / drift flow
|
|
629
|
+
// ---------------------------------------------------------------------------
|
|
630
|
+
async function runStatusFlow() {
|
|
631
|
+
const forks = listKitForkRegistrations();
|
|
632
|
+
if (forks.length === 0) {
|
|
633
|
+
p.note("No forks registered. Use 'Register a fork' first.", "Nothing to inspect");
|
|
634
|
+
return;
|
|
635
|
+
}
|
|
636
|
+
const choice = await p.select({
|
|
637
|
+
message: "Select a fork to check",
|
|
638
|
+
options: [
|
|
639
|
+
...forks.map((f) => ({
|
|
640
|
+
value: f.forkId,
|
|
641
|
+
label: (f.label ?? f.forkId) + " " + pc.dim("v" + f.baseVersion),
|
|
642
|
+
hint: f.kitId,
|
|
643
|
+
})),
|
|
644
|
+
{ value: "__back", label: "← Back" },
|
|
645
|
+
],
|
|
646
|
+
});
|
|
647
|
+
if (p.isCancel(choice) || choice === "__back")
|
|
648
|
+
return;
|
|
649
|
+
const reg = forks.find((f) => f.forkId === choice);
|
|
650
|
+
if (!reg) {
|
|
651
|
+
p.cancel("Fork not found.");
|
|
652
|
+
return;
|
|
653
|
+
}
|
|
654
|
+
const spinner = p.spinner();
|
|
655
|
+
spinner.start("Detecting drift...");
|
|
656
|
+
try {
|
|
657
|
+
const report = detectKitForkDrift(reg);
|
|
658
|
+
spinner.stop(pc.green("Analysis complete."));
|
|
659
|
+
printDriftReport(report);
|
|
660
|
+
}
|
|
661
|
+
catch (err) {
|
|
662
|
+
spinner.stop(pc.red("Drift detection failed."));
|
|
663
|
+
p.log.error(err.message);
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
// ---------------------------------------------------------------------------
|
|
667
|
+
// Heal flow
|
|
668
|
+
// ---------------------------------------------------------------------------
|
|
669
|
+
async function runHealFlow() {
|
|
670
|
+
const forks = listKitForkRegistrations();
|
|
671
|
+
if (forks.length === 0) {
|
|
672
|
+
p.note("No forks registered. Use 'Register a fork' first.", "Nothing to heal");
|
|
673
|
+
return;
|
|
674
|
+
}
|
|
675
|
+
const choice = await p.select({
|
|
676
|
+
message: "Select a fork to heal",
|
|
677
|
+
options: [
|
|
678
|
+
...forks.map((f) => ({
|
|
679
|
+
value: f.forkId,
|
|
680
|
+
label: (f.label ?? f.forkId) + " " + pc.dim("v" + f.baseVersion),
|
|
681
|
+
hint: f.kitId,
|
|
682
|
+
})),
|
|
683
|
+
{ value: "__back", label: "← Back" },
|
|
684
|
+
],
|
|
685
|
+
});
|
|
686
|
+
if (p.isCancel(choice) || choice === "__back")
|
|
687
|
+
return;
|
|
688
|
+
const reg = forks.find((f) => f.forkId === choice);
|
|
689
|
+
if (!reg) {
|
|
690
|
+
p.cancel("Fork not found.");
|
|
691
|
+
return;
|
|
692
|
+
}
|
|
693
|
+
// Drift detection
|
|
694
|
+
const driftSpinner = p.spinner();
|
|
695
|
+
driftSpinner.start("Detecting drift...");
|
|
696
|
+
let driftReport;
|
|
697
|
+
try {
|
|
698
|
+
driftReport = detectKitForkDrift(reg);
|
|
699
|
+
driftSpinner.stop("Drift analysis complete.");
|
|
700
|
+
}
|
|
701
|
+
catch (err) {
|
|
702
|
+
driftSpinner.stop(pc.red("Drift detection failed."));
|
|
703
|
+
p.log.error(err.message);
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
706
|
+
printDriftReport(driftReport);
|
|
707
|
+
if (!driftReport.hasUpstreamUpdate && driftReport.overallSeverity === "none") {
|
|
708
|
+
p.note("Your fork is already in sync with the latest upstream kit.", "Already up to date");
|
|
709
|
+
return;
|
|
710
|
+
}
|
|
711
|
+
const plan = buildKitForkHealPlan(driftReport);
|
|
712
|
+
printHealPlan(plan);
|
|
713
|
+
if (plan.actions.length === 0) {
|
|
714
|
+
p.note("No actions needed — fork is structurally clean.", "Nothing to apply");
|
|
715
|
+
return;
|
|
716
|
+
}
|
|
717
|
+
const mode = await p.select({
|
|
718
|
+
message: "How do you want to apply this heal plan?",
|
|
719
|
+
options: [
|
|
720
|
+
{ value: "foreground", label: "▶ Run now (foreground)", hint: "Watch live progress in this terminal" },
|
|
721
|
+
{ value: "background", label: "⚙️ Background job", hint: "Async — returns immediately, check with 'jobs'" },
|
|
722
|
+
{ value: "dry-run", label: "👁 Dry run", hint: "Preview what would happen — no files written" },
|
|
723
|
+
{ value: "__cancel", label: "← Cancel" },
|
|
724
|
+
],
|
|
725
|
+
});
|
|
726
|
+
if (p.isCancel(mode) || mode === "__cancel")
|
|
727
|
+
return;
|
|
728
|
+
if (mode === "background") {
|
|
729
|
+
const jobId = dispatchKitForkSyncJobBackground(reg.forkId, reg.kitId);
|
|
730
|
+
p.note([
|
|
731
|
+
`Job ID: ${pc.cyan(jobId)}`,
|
|
732
|
+
"",
|
|
733
|
+
`Check: ${pc.cyan("growthub kit fork jobs")}`,
|
|
734
|
+
].join("\n"), "Background sync dispatched");
|
|
735
|
+
return;
|
|
736
|
+
}
|
|
737
|
+
const isDryRun = mode === "dry-run";
|
|
738
|
+
const healSpinner = p.spinner();
|
|
739
|
+
healSpinner.start(isDryRun ? "Running dry run..." : "Applying heal plan...");
|
|
740
|
+
const job = await runKitForkSyncJob(reg.forkId, reg.kitId, {
|
|
741
|
+
dryRun: isDryRun,
|
|
742
|
+
onProgress: (step) => { healSpinner.message(step); },
|
|
743
|
+
});
|
|
744
|
+
healSpinner.stop(job.status === "completed"
|
|
745
|
+
? pc.green(isDryRun ? "Dry run complete." : "Heal complete.")
|
|
746
|
+
: pc.red("Heal encountered errors."));
|
|
747
|
+
if (job.healResult) {
|
|
748
|
+
const r = job.healResult;
|
|
749
|
+
console.log("");
|
|
750
|
+
console.log(pc.bold("Result:"));
|
|
751
|
+
console.log(` ${pc.green("Applied:")} ${r.appliedCount} ${pc.dim("Skipped:")} ${r.skippedCount} ${r.errorCount > 0 ? pc.red("Errors: " + r.errorCount) : pc.dim("Errors: 0")}`);
|
|
752
|
+
for (const ar of r.actionResults) {
|
|
753
|
+
if (ar.status === "error") {
|
|
754
|
+
console.log(` ${pc.red(" ✗")} ${ar.action.targetPath}: ${ar.detail}`);
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
console.log("");
|
|
758
|
+
}
|
|
759
|
+
if (job.status === "failed" && job.error) {
|
|
760
|
+
p.log.error(job.error);
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
// ---------------------------------------------------------------------------
|
|
764
|
+
// Jobs flow
|
|
765
|
+
// ---------------------------------------------------------------------------
|
|
766
|
+
async function runJobsFlow() {
|
|
767
|
+
while (true) {
|
|
768
|
+
const jobs = listKitForkSyncJobs();
|
|
769
|
+
if (jobs.length === 0) {
|
|
770
|
+
p.note("No fork-sync jobs recorded yet.", "Jobs");
|
|
771
|
+
return;
|
|
772
|
+
}
|
|
773
|
+
console.log("");
|
|
774
|
+
console.log(pc.bold("Kit Fork Sync Jobs") + pc.dim(` ${jobs.length} total`));
|
|
775
|
+
console.log(hr());
|
|
776
|
+
for (const job of jobs.slice(-10).reverse()) {
|
|
777
|
+
console.log(` ${jobStatusBadge(job.status)} ${pc.cyan(job.jobId)} ${pc.dim(job.forkId)}`);
|
|
778
|
+
if (job.completedAt)
|
|
779
|
+
console.log(` ${pc.dim("Completed:")} ${formatDate(job.completedAt)}`);
|
|
780
|
+
if (job.error)
|
|
781
|
+
console.log(` ${pc.red("Error:")} ${job.error}`);
|
|
782
|
+
}
|
|
783
|
+
console.log("");
|
|
784
|
+
console.log(hr());
|
|
785
|
+
const action = await p.select({
|
|
786
|
+
message: "Manage jobs",
|
|
787
|
+
options: [
|
|
788
|
+
{ value: "cancel", label: "Cancel a running job" },
|
|
789
|
+
{ value: "prune", label: "Prune completed/failed jobs" },
|
|
790
|
+
{ value: "__back", label: "← Back" },
|
|
791
|
+
],
|
|
792
|
+
});
|
|
793
|
+
if (p.isCancel(action) || action === "__back")
|
|
794
|
+
return;
|
|
795
|
+
if (action === "cancel") {
|
|
796
|
+
const active = jobs.filter((j) => j.status === "running" || j.status === "pending");
|
|
797
|
+
if (active.length === 0) {
|
|
798
|
+
p.note("No cancellable jobs.", "Cancel");
|
|
799
|
+
continue;
|
|
800
|
+
}
|
|
801
|
+
const jobChoice = await p.select({
|
|
802
|
+
message: "Select job to cancel",
|
|
803
|
+
options: active.map((j) => ({ value: j.jobId, label: j.jobId, hint: j.forkId })),
|
|
804
|
+
});
|
|
805
|
+
if (!p.isCancel(jobChoice)) {
|
|
806
|
+
const ok = cancelKitForkSyncJob(jobChoice);
|
|
807
|
+
p.log.info(ok ? `Job ${jobChoice} cancelled.` : `Could not cancel ${jobChoice}.`);
|
|
808
|
+
}
|
|
809
|
+
}
|
|
810
|
+
if (action === "prune") {
|
|
811
|
+
const n = pruneKitForkSyncJobs();
|
|
812
|
+
p.log.info(`Pruned ${n} job(s).`);
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
// ---------------------------------------------------------------------------
|
|
817
|
+
// Commander registration
|
|
818
|
+
// ---------------------------------------------------------------------------
|
|
819
|
+
/**
|
|
820
|
+
* Register `growthub kit fork <subcommand>` under the existing `kit` command tree.
|
|
821
|
+
* Called by kit.ts (registerKitCommands already has the `kit` Command object).
|
|
822
|
+
*/
|
|
823
|
+
export function registerKitForkSubcommands(kitCommand) {
|
|
824
|
+
const forkCmd = kitCommand
|
|
825
|
+
.command("fork")
|
|
826
|
+
.description("Fork Sync Agent — register, track, and self-heal forked worker kits")
|
|
827
|
+
.addHelpText("after", `
|
|
828
|
+
Examples:
|
|
829
|
+
# Interactive hub
|
|
830
|
+
$ growthub kit fork # start interactive fork menu
|
|
831
|
+
|
|
832
|
+
# List all forks (with drift + policy at a glance)
|
|
833
|
+
$ growthub kit fork list # beautiful table
|
|
834
|
+
$ growthub kit fork list --json # machine-readable
|
|
835
|
+
$ growthub kit fork list --filter status=drift-major
|
|
836
|
+
$ growthub kit fork list --sort-by last-heal
|
|
837
|
+
|
|
838
|
+
# Status with policy eval + heal plan preview + next steps
|
|
839
|
+
$ growthub kit fork status <fork-id>
|
|
840
|
+
$ growthub kit fork status <fork-id> --policy-only
|
|
841
|
+
$ growthub kit fork status <fork-id> --no-upstream-check
|
|
842
|
+
|
|
843
|
+
# Edit policy (interactive) or set fields non-interactively
|
|
844
|
+
$ growthub kit fork policy <fork-id> --edit
|
|
845
|
+
$ growthub kit fork policy <fork-id> --set autoApprove=all --set untouchablePaths+=skills/
|
|
846
|
+
|
|
847
|
+
# Heal (preview, apply, or background)
|
|
848
|
+
$ growthub kit fork heal <fork-id> --preview # rich grouped preview + decision prompt
|
|
849
|
+
$ growthub kit fork heal <fork-id> # apply (foreground)
|
|
850
|
+
$ growthub kit fork heal <fork-id> --background
|
|
851
|
+
$ growthub kit fork heal <fork-id> --dry-run
|
|
852
|
+
|
|
853
|
+
# Monitor background jobs
|
|
854
|
+
$ growthub kit fork jobs # table view with progress
|
|
855
|
+
$ growthub kit fork jobs --watch <job-id> # live progress until terminal
|
|
856
|
+
$ growthub kit fork jobs --tail <job-id> # trace events for a job
|
|
857
|
+
$ growthub kit fork jobs --filter status=running
|
|
858
|
+
|
|
859
|
+
# Audit history
|
|
860
|
+
$ growthub kit fork history <fork-id> # timeline
|
|
861
|
+
$ growthub kit fork history <fork-id> --csv > audit.csv
|
|
862
|
+
$ growthub kit fork history <fork-id> --since 2024-01-01
|
|
863
|
+
|
|
864
|
+
# Manage forks
|
|
865
|
+
$ growthub kit fork register ./my-fork # register existing fork
|
|
866
|
+
$ growthub kit fork deregister <fork-id>
|
|
867
|
+
`);
|
|
868
|
+
forkCmd.action(async () => {
|
|
869
|
+
await runKitForkHub();
|
|
870
|
+
});
|
|
871
|
+
addForkSubcommands(forkCmd);
|
|
872
|
+
registerKitForkRemoteSubcommands(forkCmd);
|
|
873
|
+
}
|
|
874
|
+
/**
|
|
875
|
+
* Register the top-level `growthub fork-sync` shortcut.
|
|
876
|
+
*
|
|
877
|
+
* `growthub fork-sync` is a convenience alias for the hub. Its subcommands
|
|
878
|
+
* (register, list, status, heal, jobs, deregister) are added directly onto
|
|
879
|
+
* the fork-sync command so both these paths work equivalently:
|
|
880
|
+
*
|
|
881
|
+
* growthub fork-sync register ./my-fork
|
|
882
|
+
* growthub kit fork register ./my-fork
|
|
883
|
+
*/
|
|
884
|
+
export function registerKitForkCommands(program) {
|
|
885
|
+
const forkSync = program
|
|
886
|
+
.command("fork-sync")
|
|
887
|
+
.description("Kit Fork Sync Agent — alias for `growthub kit fork`")
|
|
888
|
+
.addHelpText("after", `
|
|
889
|
+
Examples:
|
|
890
|
+
$ growthub fork-sync # interactive hub
|
|
891
|
+
$ growthub fork-sync list # beautiful table of all forks
|
|
892
|
+
$ growthub fork-sync status <fork-id> # drift + policy + next steps
|
|
893
|
+
$ growthub fork-sync policy <fork-id> --edit # interactive policy editor
|
|
894
|
+
$ growthub fork-sync heal <fork-id> --preview # rich heal preview
|
|
895
|
+
$ growthub fork-sync heal <fork-id> --background
|
|
896
|
+
$ growthub fork-sync jobs --watch <job-id> # live job progress
|
|
897
|
+
$ growthub fork-sync history <fork-id> # audit timeline
|
|
898
|
+
`);
|
|
899
|
+
forkSync.action(async () => {
|
|
900
|
+
await runKitForkHub();
|
|
901
|
+
});
|
|
902
|
+
// Add subcommands directly onto fork-sync (not inside a nested "fork" wrapper)
|
|
903
|
+
addForkSubcommands(forkSync);
|
|
904
|
+
registerKitForkRemoteSubcommands(forkSync);
|
|
905
|
+
}
|
|
906
|
+
/**
|
|
907
|
+
* Internal helper: add the six fork subcommands directly onto any Commander
|
|
908
|
+
* Command object. Used by both registerKitForkSubcommands (under kit fork)
|
|
909
|
+
* and registerKitForkCommands (under the top-level fork-sync alias).
|
|
910
|
+
*/
|
|
911
|
+
function addForkSubcommands(parentCmd) {
|
|
912
|
+
// ── register ──────────────────────────────────────────────────────────────
|
|
913
|
+
parentCmd
|
|
914
|
+
.command("register")
|
|
915
|
+
.description("Register a forked worker kit directory for sync tracking")
|
|
916
|
+
.argument("<path>", "Path to the fork directory")
|
|
917
|
+
.option("--kit <kit-id>", "Kit ID this fork is based on (auto-detected from kit.json if omitted)")
|
|
918
|
+
.option("--label <label>", "Friendly label for this fork")
|
|
919
|
+
.action(async (forkPath, opts) => {
|
|
920
|
+
const kits = listBundledKits();
|
|
921
|
+
let kitId = opts.kit;
|
|
922
|
+
if (!kitId) {
|
|
923
|
+
try {
|
|
924
|
+
const nodePath = await import("node:path");
|
|
925
|
+
const nodeFs = await import("node:fs");
|
|
926
|
+
const kitJsonPath = nodePath.resolve(forkPath, "kit.json");
|
|
927
|
+
if (nodeFs.existsSync(kitJsonPath)) {
|
|
928
|
+
const manifest = JSON.parse(nodeFs.readFileSync(kitJsonPath, "utf8"));
|
|
929
|
+
kitId = manifest?.kit?.id ?? undefined;
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
catch { /* fallthrough */ }
|
|
933
|
+
}
|
|
934
|
+
if (!kitId) {
|
|
935
|
+
console.error(pc.yellow("Could not auto-detect kit ID from kit.json. Use --kit <kit-id>."));
|
|
936
|
+
console.error(pc.dim("Available: " + kits.map((k) => k.id).join(", ")));
|
|
937
|
+
process.exitCode = 1;
|
|
938
|
+
return;
|
|
939
|
+
}
|
|
940
|
+
const kit = kits.find((k) => k.id === kitId);
|
|
941
|
+
if (!kit) {
|
|
942
|
+
console.error(pc.red(`Unknown kit: ${kitId}`));
|
|
943
|
+
process.exitCode = 1;
|
|
944
|
+
return;
|
|
945
|
+
}
|
|
946
|
+
try {
|
|
947
|
+
const reg = registerKitFork({
|
|
948
|
+
forkPath,
|
|
949
|
+
kitId,
|
|
950
|
+
baseVersion: kit.version,
|
|
951
|
+
label: opts.label,
|
|
952
|
+
});
|
|
953
|
+
console.log(pc.green("Fork registered:"), reg.forkId);
|
|
954
|
+
console.log(pc.dim("Kit: "), reg.kitId, "v" + reg.baseVersion);
|
|
955
|
+
console.log(pc.dim("Path: "), reg.forkPath);
|
|
956
|
+
}
|
|
957
|
+
catch (err) {
|
|
958
|
+
console.error(pc.red(err.message));
|
|
959
|
+
process.exitCode = 1;
|
|
960
|
+
}
|
|
961
|
+
});
|
|
962
|
+
// ── list ──────────────────────────────────────────────────────────────────
|
|
963
|
+
parentCmd
|
|
964
|
+
.command("list")
|
|
965
|
+
.description("List all registered forks with rich drift + policy summary")
|
|
966
|
+
.option("--kit <kit-id>", "Filter by kit ID")
|
|
967
|
+
.option("--filter <expr>", "Filter expression, e.g. status=synced, status=drift-major, kit=<id>")
|
|
968
|
+
.option("--sort-by <key>", "Sort by: id | kit | status | last-heal (default: id)")
|
|
969
|
+
.option("--no-upstream-check", "Skip upstream drift detection (faster, shows cached status only)")
|
|
970
|
+
.option("--json", "Output raw JSON")
|
|
971
|
+
.action((opts) => {
|
|
972
|
+
const raw = listKitForkRegistrations(opts.kit);
|
|
973
|
+
const skipUpstream = opts.upstreamCheck === false;
|
|
974
|
+
let summaries = raw.map((f) => summarizeFork(f, { skipUpstreamCheck: skipUpstream }));
|
|
975
|
+
if (opts.filter) {
|
|
976
|
+
const [key, value] = opts.filter.split("=").map((s) => s.trim());
|
|
977
|
+
if (!key || !value) {
|
|
978
|
+
console.error(pc.red(`Invalid --filter expression: ${opts.filter}`));
|
|
979
|
+
console.error(pc.dim("Use --filter status=<synced|drift-minor|drift-warn|drift-major|unknown> or kit=<id>"));
|
|
980
|
+
process.exitCode = 1;
|
|
981
|
+
return;
|
|
982
|
+
}
|
|
983
|
+
summaries = summaries.filter((s) => {
|
|
984
|
+
if (key === "kit")
|
|
985
|
+
return s.kitId === value;
|
|
986
|
+
if (key === "status") {
|
|
987
|
+
const mapping = {
|
|
988
|
+
synced: "none",
|
|
989
|
+
"drift-minor": "info",
|
|
990
|
+
"drift-warn": "warning",
|
|
991
|
+
"drift-major": "critical",
|
|
992
|
+
unknown: "unknown",
|
|
993
|
+
};
|
|
994
|
+
const want = mapping[value] ?? value;
|
|
995
|
+
return s.severity === want;
|
|
996
|
+
}
|
|
997
|
+
return true;
|
|
998
|
+
});
|
|
999
|
+
}
|
|
1000
|
+
const sortKey = opts.sortBy ?? "id";
|
|
1001
|
+
summaries.sort((a, b) => {
|
|
1002
|
+
if (sortKey === "kit")
|
|
1003
|
+
return a.kitId.localeCompare(b.kitId);
|
|
1004
|
+
if (sortKey === "status") {
|
|
1005
|
+
const order = ["none", "info", "warning", "critical", "unknown"];
|
|
1006
|
+
return order.indexOf(a.severity) - order.indexOf(b.severity);
|
|
1007
|
+
}
|
|
1008
|
+
if (sortKey === "last-heal") {
|
|
1009
|
+
return (b.lastHealAt ?? "").localeCompare(a.lastHealAt ?? "");
|
|
1010
|
+
}
|
|
1011
|
+
return a.forkId.localeCompare(b.forkId);
|
|
1012
|
+
});
|
|
1013
|
+
if (opts.json) {
|
|
1014
|
+
console.log(JSON.stringify(summaries, null, 2));
|
|
1015
|
+
return;
|
|
1016
|
+
}
|
|
1017
|
+
if (summaries.length === 0) {
|
|
1018
|
+
console.log(pc.dim(" No forks match the given filters."));
|
|
1019
|
+
return;
|
|
1020
|
+
}
|
|
1021
|
+
console.log("");
|
|
1022
|
+
console.log(pc.bold("Registered Kit Forks") + pc.dim(` ${summaries.length} total`));
|
|
1023
|
+
console.log(hr());
|
|
1024
|
+
console.log(renderForkTable(summaries));
|
|
1025
|
+
console.log("");
|
|
1026
|
+
console.log(hr());
|
|
1027
|
+
});
|
|
1028
|
+
// ── status ─────────────────────────────────────────────────────────────────
|
|
1029
|
+
parentCmd
|
|
1030
|
+
.command("status")
|
|
1031
|
+
.description("Detect drift + show policy evaluation + heal plan preview + next steps")
|
|
1032
|
+
.argument("<fork-id>", "Fork ID from list")
|
|
1033
|
+
.option("--policy-only", "Show only the fork's policy (skip drift detection)")
|
|
1034
|
+
.option("--no-upstream-check", "Use cached registration fields; do not query the upstream bundled kit")
|
|
1035
|
+
.option("--json", "Output raw JSON drift report")
|
|
1036
|
+
.action(async (forkId, opts) => {
|
|
1037
|
+
const reg = listKitForkRegistrations().find((f) => f.forkId === forkId);
|
|
1038
|
+
if (!reg) {
|
|
1039
|
+
console.error(pc.red(`Fork not found: ${forkId}`));
|
|
1040
|
+
console.error(pc.dim("Hint: run `growthub kit fork list` to see registered forks."));
|
|
1041
|
+
process.exitCode = 1;
|
|
1042
|
+
return;
|
|
1043
|
+
}
|
|
1044
|
+
const policy = readKitForkPolicy(reg.forkPath);
|
|
1045
|
+
if (opts.policyOnly) {
|
|
1046
|
+
if (opts.json) {
|
|
1047
|
+
console.log(JSON.stringify(policy, null, 2));
|
|
1048
|
+
return;
|
|
1049
|
+
}
|
|
1050
|
+
console.log("");
|
|
1051
|
+
console.log(pc.bold(`Policy: ${reg.forkId}`));
|
|
1052
|
+
console.log(hr());
|
|
1053
|
+
console.log(` ${pc.dim("autoApprove:")} ${policy.autoApprove}`);
|
|
1054
|
+
console.log(` ${pc.dim("autoApproveDepUpdates:")} ${policy.autoApproveDepUpdates}`);
|
|
1055
|
+
console.log(` ${pc.dim("remoteSyncMode:")} ${policy.remoteSyncMode}`);
|
|
1056
|
+
console.log(` ${pc.dim("interactiveConflicts:")} ${policy.interactiveConflicts}`);
|
|
1057
|
+
console.log(` ${pc.dim("untouchablePaths:")} [${policy.untouchablePaths.join(", ")}]`);
|
|
1058
|
+
console.log(` ${pc.dim("confirmBeforeChange:")} [${policy.confirmBeforeChange.join(", ")}]`);
|
|
1059
|
+
console.log(` ${pc.dim("allowedScripts:")} [${policy.allowedScripts.join(", ")}]`);
|
|
1060
|
+
console.log("");
|
|
1061
|
+
return;
|
|
1062
|
+
}
|
|
1063
|
+
if (opts.upstreamCheck === false) {
|
|
1064
|
+
if (opts.json) {
|
|
1065
|
+
console.log(JSON.stringify({ forkId: reg.forkId, kitId: reg.kitId, forkVersion: reg.baseVersion, policy }, null, 2));
|
|
1066
|
+
return;
|
|
1067
|
+
}
|
|
1068
|
+
console.log("");
|
|
1069
|
+
console.log(pc.bold(`Fork: ${reg.forkId}`) + " " + pc.dim("(no upstream check)"));
|
|
1070
|
+
console.log(pc.dim(`Kit: ${reg.kitId} v${reg.baseVersion}`));
|
|
1071
|
+
console.log(hr());
|
|
1072
|
+
console.log(` ${pc.dim("Path:")} ${reg.forkPath}`);
|
|
1073
|
+
console.log(` ${pc.dim("Policy:")} autoApprove=${policy.autoApprove}, remoteSyncMode=${policy.remoteSyncMode}`);
|
|
1074
|
+
if (policy.untouchablePaths.length > 0) {
|
|
1075
|
+
console.log(` ${pc.dim("Protected paths:")} ${policy.untouchablePaths.join(", ")}`);
|
|
1076
|
+
}
|
|
1077
|
+
console.log("");
|
|
1078
|
+
console.log(hr());
|
|
1079
|
+
printNextStepsAfterStatus(reg.forkId, true);
|
|
1080
|
+
return;
|
|
1081
|
+
}
|
|
1082
|
+
try {
|
|
1083
|
+
const report = detectKitForkDrift(reg);
|
|
1084
|
+
appendKitForkTraceEvent(reg.forkPath, {
|
|
1085
|
+
forkId: reg.forkId, kitId: reg.kitId, type: "status_ran",
|
|
1086
|
+
summary: `status inspected — severity=${report.overallSeverity}`,
|
|
1087
|
+
});
|
|
1088
|
+
if (opts.json) {
|
|
1089
|
+
const plan = buildKitForkHealPlan(report, { policy });
|
|
1090
|
+
console.log(JSON.stringify({ drift: report, plan, policy }, null, 2));
|
|
1091
|
+
return;
|
|
1092
|
+
}
|
|
1093
|
+
printDriftReport(report);
|
|
1094
|
+
const hasDrift = report.hasUpstreamUpdate || report.overallSeverity !== "none";
|
|
1095
|
+
if (hasDrift) {
|
|
1096
|
+
const plan = buildKitForkHealPlan(report, { policy });
|
|
1097
|
+
printRichHealPreview(plan, policy);
|
|
1098
|
+
}
|
|
1099
|
+
printNextStepsAfterStatus(reg.forkId, hasDrift);
|
|
1100
|
+
}
|
|
1101
|
+
catch (err) {
|
|
1102
|
+
console.error(pc.red(err.message));
|
|
1103
|
+
process.exitCode = 1;
|
|
1104
|
+
}
|
|
1105
|
+
});
|
|
1106
|
+
// ── heal ───────────────────────────────────────────────────────────────────
|
|
1107
|
+
parentCmd
|
|
1108
|
+
.command("heal")
|
|
1109
|
+
.description("Apply a safe non-destructive heal to bring a fork up to date")
|
|
1110
|
+
.argument("<fork-id>", "Fork ID from list")
|
|
1111
|
+
.option("--preview", "Rich grouped preview (safe additions / updates / protected / unresolved); does not write")
|
|
1112
|
+
.option("--dry-run", "Preview the plan without writing any files")
|
|
1113
|
+
.option("--background", "Dispatch as an async background job")
|
|
1114
|
+
.option("--skip <paths>", "Comma-separated relative paths to skip")
|
|
1115
|
+
.option("--json", "Output heal plan as JSON (implies --dry-run)")
|
|
1116
|
+
.action(async (forkId, opts) => {
|
|
1117
|
+
const reg = listKitForkRegistrations().find((f) => f.forkId === forkId);
|
|
1118
|
+
if (!reg) {
|
|
1119
|
+
console.error(pc.red(`Fork not found: ${forkId}`));
|
|
1120
|
+
console.error(pc.dim("Hint: run `growthub kit fork list` to see registered forks."));
|
|
1121
|
+
process.exitCode = 1;
|
|
1122
|
+
return;
|
|
1123
|
+
}
|
|
1124
|
+
const policy = readKitForkPolicy(reg.forkPath);
|
|
1125
|
+
if (opts.json) {
|
|
1126
|
+
const report = detectKitForkDrift(reg);
|
|
1127
|
+
const plan = buildKitForkHealPlan(report, { policy });
|
|
1128
|
+
console.log(JSON.stringify(plan, null, 2));
|
|
1129
|
+
return;
|
|
1130
|
+
}
|
|
1131
|
+
if (opts.preview) {
|
|
1132
|
+
const report = detectKitForkDrift(reg);
|
|
1133
|
+
const plan = buildKitForkHealPlan(report, { policy });
|
|
1134
|
+
appendKitForkTraceEvent(reg.forkPath, {
|
|
1135
|
+
forkId: reg.forkId, kitId: reg.kitId, type: "heal_proposed",
|
|
1136
|
+
summary: `preview requested — ${plan.actions.length} action(s), risk=${plan.estimatedRisk}`,
|
|
1137
|
+
detail: { mode: "preview" },
|
|
1138
|
+
});
|
|
1139
|
+
printRichHealPreview(plan, policy);
|
|
1140
|
+
if (plan.actions.length === 0) {
|
|
1141
|
+
console.log(pc.dim(" No actions needed. Fork is structurally clean."));
|
|
1142
|
+
return;
|
|
1143
|
+
}
|
|
1144
|
+
const decision = await p.select({
|
|
1145
|
+
message: "Apply this plan?",
|
|
1146
|
+
options: [
|
|
1147
|
+
{ value: "apply", label: "▶ Yes, apply now", hint: "Run synchronously in this terminal" },
|
|
1148
|
+
{ value: "background", label: "⚙️ Run in background", hint: "Dispatch as an async job" },
|
|
1149
|
+
{ value: "cancel", label: "← No, cancel" },
|
|
1150
|
+
],
|
|
1151
|
+
});
|
|
1152
|
+
if (p.isCancel(decision) || decision === "cancel") {
|
|
1153
|
+
console.log(pc.dim(" Cancelled. Plan was not applied."));
|
|
1154
|
+
console.log(pc.dim(` Next: ${pc.cyan("growthub kit fork policy " + reg.forkId)} or ${pc.cyan("growthub kit fork heal " + reg.forkId)}`));
|
|
1155
|
+
return;
|
|
1156
|
+
}
|
|
1157
|
+
if (decision === "background") {
|
|
1158
|
+
const jobId = dispatchKitForkSyncJobBackground(reg.forkId, reg.kitId, {
|
|
1159
|
+
skipFiles: opts.skip?.split(",").map((s) => s.trim()),
|
|
1160
|
+
});
|
|
1161
|
+
console.log("");
|
|
1162
|
+
console.log(pc.green(" ✓ Background heal dispatched"));
|
|
1163
|
+
console.log(` Job ID: ${pc.cyan(jobId)}`);
|
|
1164
|
+
console.log(` Watch: ${pc.cyan("growthub kit fork jobs --watch " + jobId)}`);
|
|
1165
|
+
return;
|
|
1166
|
+
}
|
|
1167
|
+
// decision === "apply" — fall through to foreground run below
|
|
1168
|
+
opts.dryRun = false;
|
|
1169
|
+
}
|
|
1170
|
+
if (opts.background) {
|
|
1171
|
+
const jobId = dispatchKitForkSyncJobBackground(reg.forkId, reg.kitId, {
|
|
1172
|
+
dryRun: opts.dryRun,
|
|
1173
|
+
skipFiles: opts.skip?.split(",").map((s) => s.trim()),
|
|
1174
|
+
});
|
|
1175
|
+
console.log(pc.green("Background job dispatched:"), jobId);
|
|
1176
|
+
console.log(pc.dim(` Watch: growthub kit fork jobs --watch ${jobId}`));
|
|
1177
|
+
console.log(pc.dim(` List: growthub kit fork jobs`));
|
|
1178
|
+
return;
|
|
1179
|
+
}
|
|
1180
|
+
const job = await runKitForkSyncJob(reg.forkId, reg.kitId, {
|
|
1181
|
+
dryRun: opts.dryRun,
|
|
1182
|
+
skipFiles: opts.skip?.split(",").map((s) => s.trim()),
|
|
1183
|
+
onProgress: (step) => process.stderr.write(pc.dim(step) + "\n"),
|
|
1184
|
+
});
|
|
1185
|
+
const r = job.healResult;
|
|
1186
|
+
if (r) {
|
|
1187
|
+
console.log(pc.bold("Heal result:"));
|
|
1188
|
+
console.log(` ${pc.green("Applied:")} ${r.appliedCount} ${pc.dim("Skipped:")} ${r.skippedCount} ${r.errorCount > 0 ? pc.red("Errors: " + r.errorCount) : pc.dim("Errors: 0")}`);
|
|
1189
|
+
}
|
|
1190
|
+
if (job.status === "failed") {
|
|
1191
|
+
console.error(pc.red("Heal failed: " + (job.error ?? "unknown error")));
|
|
1192
|
+
console.error(pc.dim(` Review: growthub kit fork history ${reg.forkId}`));
|
|
1193
|
+
process.exitCode = 1;
|
|
1194
|
+
}
|
|
1195
|
+
});
|
|
1196
|
+
// ── jobs ───────────────────────────────────────────────────────────────────
|
|
1197
|
+
parentCmd
|
|
1198
|
+
.command("jobs")
|
|
1199
|
+
.description("List background fork-sync jobs, watch live progress, or tail a job's trace")
|
|
1200
|
+
.option("--fork <fork-id>", "Filter by fork ID")
|
|
1201
|
+
.option("--status <status>", "Filter by status (pending | running | completed | failed | cancelled | awaiting_confirmation)")
|
|
1202
|
+
.option("--filter <expr>", "Filter expression, e.g. status=running")
|
|
1203
|
+
.option("--watch <job-id>", "Poll the given job and print live progress until terminal")
|
|
1204
|
+
.option("--tail <job-id>", "Print trace events from the fork of the given job (default 50)")
|
|
1205
|
+
.option("--limit <n>", "Limit entries when using --tail (default 50)", (v) => parseInt(v, 10))
|
|
1206
|
+
.option("--json", "Output raw JSON")
|
|
1207
|
+
.action(async (opts) => {
|
|
1208
|
+
if (opts.watch) {
|
|
1209
|
+
await watchJob(opts.watch, Boolean(opts.json));
|
|
1210
|
+
return;
|
|
1211
|
+
}
|
|
1212
|
+
if (opts.tail) {
|
|
1213
|
+
tailJobTrace(opts.tail, opts.limit ?? 50, Boolean(opts.json));
|
|
1214
|
+
return;
|
|
1215
|
+
}
|
|
1216
|
+
let effectiveStatus = opts.status;
|
|
1217
|
+
if (!effectiveStatus && opts.filter) {
|
|
1218
|
+
const [key, value] = opts.filter.split("=").map((s) => s.trim());
|
|
1219
|
+
if (key === "status" && value)
|
|
1220
|
+
effectiveStatus = value;
|
|
1221
|
+
}
|
|
1222
|
+
const jobs = listKitForkSyncJobs({
|
|
1223
|
+
forkId: opts.fork,
|
|
1224
|
+
status: effectiveStatus,
|
|
1225
|
+
});
|
|
1226
|
+
if (opts.json) {
|
|
1227
|
+
console.log(JSON.stringify(jobs, null, 2));
|
|
1228
|
+
return;
|
|
1229
|
+
}
|
|
1230
|
+
if (jobs.length === 0) {
|
|
1231
|
+
console.log(pc.dim(" No jobs found."));
|
|
1232
|
+
return;
|
|
1233
|
+
}
|
|
1234
|
+
console.log("");
|
|
1235
|
+
console.log(pc.bold("Kit Fork Sync Jobs") + pc.dim(` ${jobs.length} total`));
|
|
1236
|
+
console.log(hr());
|
|
1237
|
+
console.log(renderJobTable(jobs));
|
|
1238
|
+
console.log("");
|
|
1239
|
+
console.log(hr());
|
|
1240
|
+
console.log(pc.dim(" Live progress: growthub kit fork jobs --watch <job-id>"));
|
|
1241
|
+
console.log(pc.dim(" Trace events: growthub kit fork jobs --tail <job-id>"));
|
|
1242
|
+
console.log("");
|
|
1243
|
+
});
|
|
1244
|
+
// ── history (audit timeline) ──────────────────────────────────────────────
|
|
1245
|
+
parentCmd
|
|
1246
|
+
.command("history")
|
|
1247
|
+
.description("Export fork operation history from trace.jsonl")
|
|
1248
|
+
.argument("<fork-id>", "Fork ID from list")
|
|
1249
|
+
.option("--since <iso>", "ISO-8601 start date (inclusive)")
|
|
1250
|
+
.option("--until <iso>", "ISO-8601 end date (inclusive)")
|
|
1251
|
+
.option("--event-type <type>", "Filter by event type (e.g. heal_applied, policy_updated)")
|
|
1252
|
+
.option("--limit <n>", "Return at most N events (applied after filters)", (v) => parseInt(v, 10))
|
|
1253
|
+
.option("--json", "Emit machine-readable JSON")
|
|
1254
|
+
.option("--csv", "Emit CSV for compliance tools")
|
|
1255
|
+
.action((forkId, opts) => {
|
|
1256
|
+
const reg = listKitForkRegistrations().find((f) => f.forkId === forkId);
|
|
1257
|
+
if (!reg) {
|
|
1258
|
+
console.error(pc.red(`Fork not found: ${forkId}`));
|
|
1259
|
+
console.error(pc.dim("Hint: run `growthub kit fork list` to see registered forks."));
|
|
1260
|
+
process.exitCode = 1;
|
|
1261
|
+
return;
|
|
1262
|
+
}
|
|
1263
|
+
const all = readKitForkTrace(reg.forkPath);
|
|
1264
|
+
const sinceMs = opts.since ? new Date(opts.since).getTime() : undefined;
|
|
1265
|
+
const untilMs = opts.until ? new Date(opts.until).getTime() : undefined;
|
|
1266
|
+
let events = all.filter((e) => {
|
|
1267
|
+
const ts = new Date(e.timestamp).getTime();
|
|
1268
|
+
if (sinceMs !== undefined && ts < sinceMs)
|
|
1269
|
+
return false;
|
|
1270
|
+
if (untilMs !== undefined && ts > untilMs)
|
|
1271
|
+
return false;
|
|
1272
|
+
if (opts.eventType && e.type !== opts.eventType)
|
|
1273
|
+
return false;
|
|
1274
|
+
return true;
|
|
1275
|
+
});
|
|
1276
|
+
if (opts.limit && opts.limit > 0) {
|
|
1277
|
+
events = events.slice(-opts.limit);
|
|
1278
|
+
}
|
|
1279
|
+
if (opts.json) {
|
|
1280
|
+
console.log(JSON.stringify(events, null, 2));
|
|
1281
|
+
return;
|
|
1282
|
+
}
|
|
1283
|
+
if (opts.csv) {
|
|
1284
|
+
console.log("timestamp,forkId,kitId,jobId,type,summary");
|
|
1285
|
+
for (const e of events) {
|
|
1286
|
+
const summary = (e.summary ?? "").replace(/"/g, '""');
|
|
1287
|
+
console.log(`${e.timestamp},${e.forkId},${e.kitId},${e.jobId ?? ""},${e.type},"${summary}"`);
|
|
1288
|
+
}
|
|
1289
|
+
return;
|
|
1290
|
+
}
|
|
1291
|
+
console.log("");
|
|
1292
|
+
console.log(pc.bold(`Fork History: ${reg.forkId}`) + pc.dim(` ${events.length} event(s)`));
|
|
1293
|
+
console.log(hr());
|
|
1294
|
+
if (events.length === 0) {
|
|
1295
|
+
console.log(pc.dim(" No matching events."));
|
|
1296
|
+
console.log("");
|
|
1297
|
+
return;
|
|
1298
|
+
}
|
|
1299
|
+
for (const e of events) {
|
|
1300
|
+
const ts = e.timestamp.replace("T", " ").replace(/\..+Z$/, "Z");
|
|
1301
|
+
console.log(` ${pc.dim(ts)} ${pc.cyan("[" + e.type + "]")} ${e.summary ?? ""}`);
|
|
1302
|
+
}
|
|
1303
|
+
console.log("");
|
|
1304
|
+
console.log(hr());
|
|
1305
|
+
console.log("");
|
|
1306
|
+
});
|
|
1307
|
+
// ── deregister ─────────────────────────────────────────────────────────────
|
|
1308
|
+
parentCmd
|
|
1309
|
+
.command("deregister")
|
|
1310
|
+
.description("Remove a fork registration (does not delete your fork directory)")
|
|
1311
|
+
.argument("<fork-id>", "Fork ID to deregister")
|
|
1312
|
+
.action(async (forkId) => {
|
|
1313
|
+
const allForks = listKitForkRegistrations();
|
|
1314
|
+
const reg = allForks.find((f) => f.forkId === forkId);
|
|
1315
|
+
if (!reg) {
|
|
1316
|
+
console.error(pc.red(`Fork not found: ${forkId}`));
|
|
1317
|
+
process.exitCode = 1;
|
|
1318
|
+
return;
|
|
1319
|
+
}
|
|
1320
|
+
const confirmed = await p.confirm({
|
|
1321
|
+
message: `Remove registration for ${pc.cyan(forkId)}? (Your fork directory will not be touched)`,
|
|
1322
|
+
initialValue: false,
|
|
1323
|
+
});
|
|
1324
|
+
if (p.isCancel(confirmed) || !confirmed) {
|
|
1325
|
+
p.cancel("Cancelled.");
|
|
1326
|
+
return;
|
|
1327
|
+
}
|
|
1328
|
+
const ok = deregisterKitFork(reg.kitId, forkId);
|
|
1329
|
+
if (ok) {
|
|
1330
|
+
console.log(pc.green("Fork deregistered:"), forkId);
|
|
1331
|
+
}
|
|
1332
|
+
else {
|
|
1333
|
+
console.error(pc.red("Deregistration failed."));
|
|
1334
|
+
process.exitCode = 1;
|
|
1335
|
+
}
|
|
1336
|
+
});
|
|
1337
|
+
}
|
|
1338
|
+
//# sourceMappingURL=kit-fork.js.map
|