crewly 1.20.133 → 1.20.135
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/config/skills/agent/core/block-task/SKILL.md +16 -3
- package/dist/backend/backend/src/constants.d.ts +82 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +87 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/bundle/bundle.controller.d.ts +44 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.controller.js +122 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.routes.d.ts +25 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.routes.js +33 -0
- package/dist/backend/backend/src/controllers/bundle/bundle.routes.js.map +1 -0
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts +6 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js +9 -2
- package/dist/backend/backend/src/controllers/task-pool/task-pool.controller.js.map +1 -1
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +28 -0
- package/dist/backend/backend/src/index.js.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
- package/dist/backend/backend/src/routes/api.routes.js +4 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts +43 -7
- package/dist/backend/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/agent/agent-registration.service.js +144 -51
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/agent/registration-flow-registry.d.ts +92 -0
- package/dist/backend/backend/src/services/agent/registration-flow-registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/registration-flow-registry.js +121 -0
- package/dist/backend/backend/src/services/agent/registration-flow-registry.js.map +1 -0
- package/dist/backend/backend/src/services/agent/resumed-kickoff.d.ts +66 -0
- package/dist/backend/backend/src/services/agent/resumed-kickoff.d.ts.map +1 -0
- package/dist/backend/backend/src/services/agent/resumed-kickoff.js +72 -0
- package/dist/backend/backend/src/services/agent/resumed-kickoff.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.factory.d.ts +62 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.factory.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.factory.js +173 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.factory.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.service.d.ts +359 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.service.js +888 -0
- package/dist/backend/backend/src/services/bundle/bundle-apply.service.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-catalog.d.ts +167 -0
- package/dist/backend/backend/src/services/bundle/bundle-catalog.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-catalog.js +248 -0
- package/dist/backend/backend/src/services/bundle/bundle-catalog.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-connectors.d.ts +43 -0
- package/dist/backend/backend/src/services/bundle/bundle-connectors.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-connectors.js +57 -0
- package/dist/backend/backend/src/services/bundle/bundle-connectors.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-deps.d.ts +37 -0
- package/dist/backend/backend/src/services/bundle/bundle-deps.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-deps.js +60 -0
- package/dist/backend/backend/src/services/bundle/bundle-deps.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-manifest.d.ts +93 -0
- package/dist/backend/backend/src/services/bundle/bundle-manifest.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-manifest.js +532 -0
- package/dist/backend/backend/src/services/bundle/bundle-manifest.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-placeholders.d.ts +100 -0
- package/dist/backend/backend/src/services/bundle/bundle-placeholders.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-placeholders.js +183 -0
- package/dist/backend/backend/src/services/bundle/bundle-placeholders.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-runtime.d.ts +36 -0
- package/dist/backend/backend/src/services/bundle/bundle-runtime.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-runtime.js +38 -0
- package/dist/backend/backend/src/services/bundle/bundle-runtime.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-skill-installer.d.ts +105 -0
- package/dist/backend/backend/src/services/bundle/bundle-skill-installer.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-skill-installer.js +144 -0
- package/dist/backend/backend/src/services/bundle/bundle-skill-installer.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-state.store.d.ts +48 -0
- package/dist/backend/backend/src/services/bundle/bundle-state.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-state.store.js +90 -0
- package/dist/backend/backend/src/services/bundle/bundle-state.store.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-team.builder.d.ts +81 -0
- package/dist/backend/backend/src/services/bundle/bundle-team.builder.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-team.builder.js +172 -0
- package/dist/backend/backend/src/services/bundle/bundle-team.builder.js.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-time.d.ts +59 -0
- package/dist/backend/backend/src/services/bundle/bundle-time.d.ts.map +1 -0
- package/dist/backend/backend/src/services/bundle/bundle-time.js +98 -0
- package/dist/backend/backend/src/services/bundle/bundle-time.js.map +1 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +5 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js +1 -1
- package/dist/backend/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/backend/backend/src/services/core/teams-backup.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/core/teams-backup.service.js +4 -2
- package/dist/backend/backend/src/services/core/teams-backup.service.js.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.d.ts.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js +2 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts +14 -2
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js +37 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js +9 -1
- package/dist/backend/backend/src/services/reconciler/reconcile-rules.js.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.d.ts.map +1 -1
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js +8 -0
- package/dist/backend/backend/src/services/reconciler/reconciler-data-provider.js.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts +21 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js +85 -0
- package/dist/backend/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts +32 -0
- package/dist/backend/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js +60 -1
- package/dist/backend/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/template/template.service.js +5 -2
- package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/workflow/cron-task.service.js +4 -2
- package/dist/backend/backend/src/services/workflow/cron-task.service.js.map +1 -1
- package/dist/backend/backend/src/types/solution-bundle.types.d.ts +367 -0
- package/dist/backend/backend/src/types/solution-bundle.types.d.ts.map +1 -0
- package/dist/backend/backend/src/types/solution-bundle.types.js +17 -0
- package/dist/backend/backend/src/types/solution-bundle.types.js.map +1 -0
- package/dist/backend/backend/src/types/team-template.types.d.ts +8 -0
- package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts +37 -0
- package/dist/backend/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/backend/backend/src/types/v2/work-item.types.js +33 -0
- package/dist/backend/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +82 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +87 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +43 -7
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.js +144 -51
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/agent/registration-flow-registry.d.ts +92 -0
- package/dist/cli/backend/src/services/agent/registration-flow-registry.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/registration-flow-registry.js +121 -0
- package/dist/cli/backend/src/services/agent/registration-flow-registry.js.map +1 -0
- package/dist/cli/backend/src/services/agent/resumed-kickoff.d.ts +66 -0
- package/dist/cli/backend/src/services/agent/resumed-kickoff.d.ts.map +1 -0
- package/dist/cli/backend/src/services/agent/resumed-kickoff.js +72 -0
- package/dist/cli/backend/src/services/agent/resumed-kickoff.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-apply.service.d.ts +359 -0
- package/dist/cli/backend/src/services/bundle/bundle-apply.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-apply.service.js +888 -0
- package/dist/cli/backend/src/services/bundle/bundle-apply.service.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-catalog.d.ts +167 -0
- package/dist/cli/backend/src/services/bundle/bundle-catalog.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-catalog.js +248 -0
- package/dist/cli/backend/src/services/bundle/bundle-catalog.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-deps.d.ts +37 -0
- package/dist/cli/backend/src/services/bundle/bundle-deps.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-deps.js +60 -0
- package/dist/cli/backend/src/services/bundle/bundle-deps.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-manifest.d.ts +93 -0
- package/dist/cli/backend/src/services/bundle/bundle-manifest.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-manifest.js +532 -0
- package/dist/cli/backend/src/services/bundle/bundle-manifest.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-placeholders.d.ts +100 -0
- package/dist/cli/backend/src/services/bundle/bundle-placeholders.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-placeholders.js +183 -0
- package/dist/cli/backend/src/services/bundle/bundle-placeholders.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-runtime.d.ts +36 -0
- package/dist/cli/backend/src/services/bundle/bundle-runtime.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-runtime.js +38 -0
- package/dist/cli/backend/src/services/bundle/bundle-runtime.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-skill-installer.d.ts +105 -0
- package/dist/cli/backend/src/services/bundle/bundle-skill-installer.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-skill-installer.js +144 -0
- package/dist/cli/backend/src/services/bundle/bundle-skill-installer.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-state.store.d.ts +48 -0
- package/dist/cli/backend/src/services/bundle/bundle-state.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-state.store.js +90 -0
- package/dist/cli/backend/src/services/bundle/bundle-state.store.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-team.builder.d.ts +81 -0
- package/dist/cli/backend/src/services/bundle/bundle-team.builder.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-team.builder.js +172 -0
- package/dist/cli/backend/src/services/bundle/bundle-team.builder.js.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-time.d.ts +59 -0
- package/dist/cli/backend/src/services/bundle/bundle-time.d.ts.map +1 -0
- package/dist/cli/backend/src/services/bundle/bundle-time.js +98 -0
- package/dist/cli/backend/src/services/bundle/bundle-time.js.map +1 -0
- package/dist/cli/backend/src/services/core/storage.service.js +1 -1
- package/dist/cli/backend/src/services/core/storage.service.js.map +1 -1
- package/dist/cli/backend/src/services/core/teams-backup.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/core/teams-backup.service.js +4 -2
- package/dist/cli/backend/src/services/core/teams-backup.service.js.map +1 -1
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts +72 -0
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js +389 -0
- package/dist/cli/backend/src/services/marketplace/marketplace-installer.service.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/index.d.ts +15 -0
- package/dist/cli/backend/src/services/messaging/index.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/index.js +20 -0
- package/dist/cli/backend/src/services/messaging/index.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts +224 -0
- package/dist/cli/backend/src/services/messaging/queue-processor.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js +969 -0
- package/dist/cli/backend/src/services/messaging/queue-processor.service.js.map +1 -0
- package/dist/cli/backend/src/services/messaging/response-router.service.d.ts +110 -0
- package/dist/cli/backend/src/services/messaging/response-router.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/messaging/response-router.service.js +268 -0
- package/dist/cli/backend/src/services/messaging/response-router.service.js.map +1 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts +14 -2
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js +37 -1
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -1
- package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.d.ts +133 -0
- package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.d.ts.map +1 -0
- package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.js +232 -0
- package/dist/cli/backend/src/services/orchestrator/commitment-approval-guard.js.map +1 -0
- package/dist/cli/backend/src/services/skill/skill-catalog.service.d.ts +277 -0
- package/dist/cli/backend/src/services/skill/skill-catalog.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill/skill-catalog.service.js +708 -0
- package/dist/cli/backend/src/services/skill/skill-catalog.service.js.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.d.ts +243 -0
- package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.js +439 -0
- package/dist/cli/backend/src/services/skill-setup/skill-install-job.service.js.map +1 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts +21 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js +85 -0
- package/dist/cli/backend/src/services/slack/slack-team-channel.service.js.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts +32 -0
- package/dist/cli/backend/src/services/task-pool/task-pool.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js +60 -1
- package/dist/cli/backend/src/services/task-pool/task-pool.service.js.map +1 -1
- package/dist/cli/backend/src/services/template/template.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/template/template.service.js +5 -2
- package/dist/cli/backend/src/services/template/template.service.js.map +1 -1
- package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts +316 -0
- package/dist/cli/backend/src/services/workflow/cron-task.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/workflow/cron-task.service.js +1043 -0
- package/dist/cli/backend/src/services/workflow/cron-task.service.js.map +1 -0
- package/dist/cli/backend/src/types/cron-task.types.d.ts +95 -0
- package/dist/cli/backend/src/types/cron-task.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/cron-task.types.js +10 -0
- package/dist/cli/backend/src/types/cron-task.types.js.map +1 -0
- package/dist/cli/backend/src/types/solution-bundle.types.d.ts +367 -0
- package/dist/cli/backend/src/types/solution-bundle.types.d.ts.map +1 -0
- package/dist/cli/backend/src/types/solution-bundle.types.js +17 -0
- package/dist/cli/backend/src/types/solution-bundle.types.js.map +1 -0
- package/dist/cli/backend/src/types/team-template.types.d.ts +8 -0
- package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts +37 -0
- package/dist/cli/backend/src/types/v2/work-item.types.d.ts.map +1 -1
- package/dist/cli/backend/src/types/v2/work-item.types.js +33 -0
- package/dist/cli/backend/src/types/v2/work-item.types.js.map +1 -1
- package/dist/cli/cli/src/commands/deploy-bundle.d.ts +160 -0
- package/dist/cli/cli/src/commands/deploy-bundle.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/deploy-bundle.js +386 -0
- package/dist/cli/cli/src/commands/deploy-bundle.js.map +1 -0
- package/dist/cli/cli/src/commands/onboard.d.ts +32 -1
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +80 -3
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/constants.d.ts +5 -0
- package/dist/cli/cli/src/constants.d.ts.map +1 -1
- package/dist/cli/cli/src/constants.js +5 -0
- package/dist/cli/cli/src/constants.js.map +1 -1
- package/dist/cli/cli/src/index.js +15 -0
- package/dist/cli/cli/src/index.js.map +1 -1
- package/frontend/dist/assets/{index-e6c403b6.js → index-2c7ee4a6.js} +276 -276
- package/frontend/dist/index.html +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,386 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI: deploy a solution bundle (specs/solution-bundles.md).
|
|
3
|
+
*
|
|
4
|
+
* crewly deploy-bundle <template-id> --answers answers.json [--runtime crewly-agent]
|
|
5
|
+
* [--templates-dir <dir>] [--dry-run] [--allow-draft] [--json]
|
|
6
|
+
*
|
|
7
|
+
* Scripted deploys (hosted servers run it from cloud-init) and
|
|
8
|
+
* `crewly onboard --template <bundle>` both come here. When this user's
|
|
9
|
+
* backend is running, the deploy goes through `POST /api/bundles/apply` and
|
|
10
|
+
* the job is followed until it finishes, so Slack, connector checks and the
|
|
11
|
+
* first-week hand-offs happen right away. Otherwise the same engine runs
|
|
12
|
+
* in-process: the team, norms, SOPs, skills and schedules are written, and
|
|
13
|
+
* the steps that need a running Crewly are left pending — the backend
|
|
14
|
+
* finishes them when it starts.
|
|
15
|
+
*
|
|
16
|
+
* @module cli/commands/deploy-bundle
|
|
17
|
+
*/
|
|
18
|
+
import { readFileSync } from 'fs';
|
|
19
|
+
import * as path from 'path';
|
|
20
|
+
import chalk from 'chalk';
|
|
21
|
+
import { BUNDLE_CONSTANTS } from '../../../backend/src/constants.js';
|
|
22
|
+
import { getCrewlyHomePath } from '../../../backend/src/services/core/crewly-home.utils.js';
|
|
23
|
+
import { BundleApplyService, BundleError } from '../../../backend/src/services/bundle/bundle-apply.service.js';
|
|
24
|
+
import { BundleCatalog, bundleTemplateDirs, toBundleDetail } from '../../../backend/src/services/bundle/bundle-catalog.js';
|
|
25
|
+
import { BundleAnswersError, resolveAnswers } from '../../../backend/src/services/bundle/bundle-placeholders.js';
|
|
26
|
+
import { CLI_CONSTANTS } from '../constants.js';
|
|
27
|
+
import { defaultHttpJson, isBackendRunning, localBackendUrl } from '../utils/harness-engine.js';
|
|
28
|
+
import { getTemplatesDir } from '../utils/templates.js';
|
|
29
|
+
/**
|
|
30
|
+
* The Crewly package root the CLI runs from.
|
|
31
|
+
*
|
|
32
|
+
* @returns Absolute path (parent of `config/templates`)
|
|
33
|
+
*/
|
|
34
|
+
export function cliPackageRoot() {
|
|
35
|
+
return path.dirname(path.dirname(getTemplatesDir()));
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Read a JSON answers file.
|
|
39
|
+
*
|
|
40
|
+
* @param file - Path
|
|
41
|
+
* @param readFile - File reader
|
|
42
|
+
* @returns Answers object
|
|
43
|
+
* @throws Error with an owner-readable message when missing or not a JSON object
|
|
44
|
+
*/
|
|
45
|
+
export function loadAnswersFile(file, readFile = (f) => readFileSync(f, 'utf-8')) {
|
|
46
|
+
let text;
|
|
47
|
+
try {
|
|
48
|
+
text = readFile(file);
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
throw new Error(`Cannot read the answers file: ${file}`);
|
|
52
|
+
}
|
|
53
|
+
let parsed;
|
|
54
|
+
try {
|
|
55
|
+
parsed = JSON.parse(text);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
throw new Error(`The answers file is not valid JSON (${file}): ${error instanceof Error ? error.message : String(error)}`);
|
|
59
|
+
}
|
|
60
|
+
if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
61
|
+
throw new Error(`The answers file must be a JSON object like {"business_name": "…"} (${file})`);
|
|
62
|
+
}
|
|
63
|
+
return parsed;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* An answers-file skeleton for a bundle (printed when answers are missing).
|
|
67
|
+
*
|
|
68
|
+
* @param questions - Bundle questions
|
|
69
|
+
* @returns Pretty JSON with every question id
|
|
70
|
+
*/
|
|
71
|
+
export function answersSkeleton(questions) {
|
|
72
|
+
const skeleton = {};
|
|
73
|
+
for (const q of questions) {
|
|
74
|
+
skeleton[q.id] = q.type === 'multiselect' ? (Array.isArray(q.default) ? q.default : []) : typeof q.default === 'string' ? q.default : '';
|
|
75
|
+
}
|
|
76
|
+
return JSON.stringify(skeleton, null, 2);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* The running backend as a deploy target.
|
|
80
|
+
*
|
|
81
|
+
* @param baseUrl - Loopback URL
|
|
82
|
+
* @param http - HTTP helper
|
|
83
|
+
* @returns Target
|
|
84
|
+
*/
|
|
85
|
+
export function createRemoteTarget(baseUrl = localBackendUrl(), http = defaultHttpJson) {
|
|
86
|
+
/** Unwrap `{ success, data }`, turning errors into BundleError-like errors. */
|
|
87
|
+
const unwrap = (status, body) => {
|
|
88
|
+
const b = body;
|
|
89
|
+
if (status < 300 && b?.success && b.data !== undefined)
|
|
90
|
+
return b.data;
|
|
91
|
+
const code = (b?.code ?? 'unknown_bundle');
|
|
92
|
+
const details = Array.isArray(b?.missing) || Array.isArray(b?.invalid)
|
|
93
|
+
? { missing: (b?.missing ?? []), invalid: (b?.invalid ?? []) }
|
|
94
|
+
: undefined;
|
|
95
|
+
throw new BundleError(code, b?.error ?? `HTTP ${status}`, details);
|
|
96
|
+
};
|
|
97
|
+
return {
|
|
98
|
+
where: 'backend',
|
|
99
|
+
async start(request) {
|
|
100
|
+
const { status, body } = await http('POST', `${baseUrl}${CLI_CONSTANTS.BUNDLE.APPLY_ENDPOINT}`, request);
|
|
101
|
+
return unwrap(status, body).deployment;
|
|
102
|
+
},
|
|
103
|
+
async getJob(jobId) {
|
|
104
|
+
const { status, body } = await http('GET', `${baseUrl}${CLI_CONSTANTS.BUNDLE.APPLY_ENDPOINT}/${encodeURIComponent(jobId)}`);
|
|
105
|
+
return unwrap(status, body);
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The in-process engine as a deploy target (no Slack, connector checks or
|
|
111
|
+
* orchestrator: those steps stay pending until the backend starts).
|
|
112
|
+
*
|
|
113
|
+
* Loaded lazily: the engine's collaborators pull in the marketplace
|
|
114
|
+
* installer and the harness store, which `crewly onboard` / `crewly doctor`
|
|
115
|
+
* should not load unless a bundle is actually deployed.
|
|
116
|
+
*
|
|
117
|
+
* @param templateDirs - Extra template directories
|
|
118
|
+
* @returns Target
|
|
119
|
+
*/
|
|
120
|
+
export async function createLocalTarget(templateDirs) {
|
|
121
|
+
const [{ createBaseBundleDeps }, { OrcHarnessStore }] = await Promise.all([
|
|
122
|
+
import('../../../backend/src/services/bundle/bundle-deps.js'),
|
|
123
|
+
import('../../../backend/src/services/harness/orc-harness.store.js'),
|
|
124
|
+
]);
|
|
125
|
+
const store = new OrcHarnessStore();
|
|
126
|
+
const service = new BundleApplyService(createBaseBundleDeps({
|
|
127
|
+
crewlyHome: getCrewlyHomePath(),
|
|
128
|
+
packageRoot: cliPackageRoot(),
|
|
129
|
+
extraTemplateDirs: templateDirs,
|
|
130
|
+
getOrcHarness: () => store.get(),
|
|
131
|
+
}));
|
|
132
|
+
return {
|
|
133
|
+
where: 'in-process',
|
|
134
|
+
start: (request) => service.start(request),
|
|
135
|
+
getJob: (jobId) => service.getJob(jobId),
|
|
136
|
+
wait: (request) => service.applyAndWait(request),
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
/** Status marks for the step list. */
|
|
140
|
+
const STEP_MARKS = {
|
|
141
|
+
done: chalk.green('✓'),
|
|
142
|
+
skipped: chalk.gray('–'),
|
|
143
|
+
pending: chalk.yellow('…'),
|
|
144
|
+
failed: chalk.red('✗'),
|
|
145
|
+
running: chalk.cyan('→'),
|
|
146
|
+
queued: chalk.gray('·'),
|
|
147
|
+
};
|
|
148
|
+
/**
|
|
149
|
+
* Human-readable lines for a deployment.
|
|
150
|
+
*
|
|
151
|
+
* @param deployment - Deployment
|
|
152
|
+
* @returns Lines (no trailing newline)
|
|
153
|
+
*/
|
|
154
|
+
export function formatDeployment(deployment) {
|
|
155
|
+
const lines = [];
|
|
156
|
+
for (const step of deployment.steps) {
|
|
157
|
+
const detail = step.error ?? step.message ?? '';
|
|
158
|
+
lines.push(` ${STEP_MARKS[step.status] ?? '·'} ${step.label}${detail ? chalk.gray(` — ${detail}`) : ''}`);
|
|
159
|
+
for (const item of step.items ?? []) {
|
|
160
|
+
if (item.status === 'done' && step.status === 'done')
|
|
161
|
+
continue;
|
|
162
|
+
lines.push(chalk.gray(` ${STEP_MARKS[item.status] ?? '·'} ${item.label}${item.message ? `: ${item.message}` : ''}`));
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
const missing = deployment.connectors.filter((c) => c.status !== 'connected');
|
|
166
|
+
if (missing.length > 0) {
|
|
167
|
+
lines.push('');
|
|
168
|
+
lines.push(chalk.bold(' Connect these (on the Connections page, works from a phone):'));
|
|
169
|
+
for (const c of missing) {
|
|
170
|
+
lines.push(` ${c.required ? '•' : '◦'} ${c.id}${c.products.length ? ` (${c.products.join(', ')})` : ''} — ${c.why} → ${c.connectPath}`);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return lines;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Whether a finished deployment should fail the command.
|
|
177
|
+
*
|
|
178
|
+
* @param deployment - Deployment
|
|
179
|
+
* @returns True when the team failed or any step failed
|
|
180
|
+
*/
|
|
181
|
+
export function deploymentFailed(deployment) {
|
|
182
|
+
return deployment.status === 'failed' || deployment.steps.some((s) => s.status === 'failed');
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Explain a refused deploy.
|
|
186
|
+
*
|
|
187
|
+
* @param error - BundleError
|
|
188
|
+
* @param template - The bundle (for the answers skeleton), if known
|
|
189
|
+
* @param log - Output
|
|
190
|
+
*/
|
|
191
|
+
function reportBundleError(error, template, log) {
|
|
192
|
+
log(chalk.red(` ✗ ${error.message}`));
|
|
193
|
+
if (error.code === 'invalid_answers' && template) {
|
|
194
|
+
log(chalk.gray(' Answers file template (fill in and pass with --answers):'));
|
|
195
|
+
for (const line of answersSkeleton(template.bundle.questions ?? []).split('\n'))
|
|
196
|
+
log(chalk.gray(` ${line}`));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Deploy a bundle (shared by `crewly deploy-bundle` and `crewly onboard`).
|
|
201
|
+
*
|
|
202
|
+
* @param templateId - Bundle template id
|
|
203
|
+
* @param options - Answers (object or file), runtime, flags
|
|
204
|
+
* @param deps - Injectable pieces
|
|
205
|
+
* @returns Process exit code (0 = deployed, possibly with pending steps; 1 = refused or failed)
|
|
206
|
+
*/
|
|
207
|
+
export async function deployBundle(templateId, options, deps = {}) {
|
|
208
|
+
const log = deps.log ?? ((line) => console.log(line));
|
|
209
|
+
const templateDirs = (options.templatesDir ?? []).map((d) => path.resolve(d));
|
|
210
|
+
const catalog = deps.catalog ?? new BundleCatalog(() => bundleTemplateDirs(cliPackageRoot(), templateDirs));
|
|
211
|
+
const entry = catalog.get(templateId);
|
|
212
|
+
const template = entry?.template ?? null;
|
|
213
|
+
// Validate locally first for a clear message (the backend checks again).
|
|
214
|
+
// A dry run without answers only validates the template itself.
|
|
215
|
+
if (template && !(options.dryRun && !options.answers)) {
|
|
216
|
+
try {
|
|
217
|
+
resolveAnswers(template.bundle.questions ?? [], options.answers ?? {});
|
|
218
|
+
}
|
|
219
|
+
catch (error) {
|
|
220
|
+
if (error instanceof BundleAnswersError) {
|
|
221
|
+
reportBundleError(new BundleError('invalid_answers', error.message), template, log);
|
|
222
|
+
return CLI_CONSTANTS.EXIT_CODES.ERROR;
|
|
223
|
+
}
|
|
224
|
+
throw error;
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
if (options.dryRun) {
|
|
228
|
+
if (!template) {
|
|
229
|
+
log(chalk.red(` ✗ No bundle "${templateId}" in ${bundleTemplateDirs(cliPackageRoot(), templateDirs).join(', ')}`));
|
|
230
|
+
return CLI_CONSTANTS.EXIT_CODES.ERROR;
|
|
231
|
+
}
|
|
232
|
+
const detail = toBundleDetail(template);
|
|
233
|
+
log(chalk.bold(` ${detail.label} (${detail.id}) — ${detail.status}`));
|
|
234
|
+
log(` ${detail.tagline}`);
|
|
235
|
+
for (const team of detail.teams)
|
|
236
|
+
log(` Team ${team.name}: ${team.members.map((m) => `${m.name} (${m.title})`).join(', ')}`);
|
|
237
|
+
log(` Runtime: ${detail.recommendedRuntime} · Server: ${detail.serverTier}`);
|
|
238
|
+
log(` Skills: ${detail.skills.join(', ') || '—'}`);
|
|
239
|
+
log(` Connectors: ${detail.connectors.map((c) => c.id).join(', ') || '—'}`);
|
|
240
|
+
log(` Schedules: ${detail.schedules.map((s) => `${s.title} (${s.cron})`).join(', ') || '—'}`);
|
|
241
|
+
log(` First week: ${detail.firstWeek.map((t) => `day ${t.day + 1} ${t.title}`).join(', ') || '—'}`);
|
|
242
|
+
log(chalk.green(' ✓ Valid. Nothing was deployed (--dry-run).'));
|
|
243
|
+
return CLI_CONSTANTS.EXIT_CODES.SUCCESS;
|
|
244
|
+
}
|
|
245
|
+
const running = await (deps.isRunning ?? (() => isBackendRunning()))();
|
|
246
|
+
const target = running ? (deps.remote ?? (() => createRemoteTarget()))() : await (deps.local ?? createLocalTarget)(templateDirs);
|
|
247
|
+
if (running && templateDirs.length > 0) {
|
|
248
|
+
log(chalk.yellow(' ⚠ Crewly is running: --templates-dir is not seen by it. Start it with CREWLY_TEMPLATE_DIRS set instead.'));
|
|
249
|
+
}
|
|
250
|
+
const request = {
|
|
251
|
+
templateId,
|
|
252
|
+
...(options.answers ? { answers: options.answers } : {}),
|
|
253
|
+
...(options.runtime ? { runtime: options.runtime } : {}),
|
|
254
|
+
...(options.allowDraft ? { allowDraft: true } : {}),
|
|
255
|
+
};
|
|
256
|
+
log(chalk.blue(` Deploying ${template?.bundle.label ?? templateId} ${running ? 'through the running Crewly' : '(Crewly is not running; finishing the rest when it starts)'}…`));
|
|
257
|
+
let final;
|
|
258
|
+
try {
|
|
259
|
+
if (target.wait) {
|
|
260
|
+
final = await target.wait(request);
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
const started = await target.start(request);
|
|
264
|
+
const sleep = deps.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
|
|
265
|
+
const now = deps.now ?? (() => Date.now());
|
|
266
|
+
const deadline = now() + BUNDLE_CONSTANTS.CLI_JOB_TIMEOUT_MS;
|
|
267
|
+
final = started;
|
|
268
|
+
while (final.status === 'running' && now() < deadline) {
|
|
269
|
+
await sleep(BUNDLE_CONSTANTS.CLI_POLL_INTERVAL_MS);
|
|
270
|
+
final = await target.getJob(started.jobId);
|
|
271
|
+
}
|
|
272
|
+
if (final.status === 'running') {
|
|
273
|
+
log(chalk.yellow(` ⚠ Still running after ${BUNDLE_CONSTANTS.CLI_JOB_TIMEOUT_MS / 60000} min; follow it at /api/bundles/apply/${started.jobId}`));
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
catch (error) {
|
|
278
|
+
if (error instanceof BundleError) {
|
|
279
|
+
reportBundleError(error, template, log);
|
|
280
|
+
return CLI_CONSTANTS.EXIT_CODES.ERROR;
|
|
281
|
+
}
|
|
282
|
+
log(chalk.red(` ✗ ${error instanceof Error ? error.message : String(error)}`));
|
|
283
|
+
return CLI_CONSTANTS.EXIT_CODES.ERROR;
|
|
284
|
+
}
|
|
285
|
+
if (options.json) {
|
|
286
|
+
log(JSON.stringify(final, null, 2));
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
for (const line of formatDeployment(final))
|
|
290
|
+
log(line);
|
|
291
|
+
log('');
|
|
292
|
+
if (final.status === 'done')
|
|
293
|
+
log(chalk.green(' ✓ Deployed.'));
|
|
294
|
+
else if (!deploymentFailed(final))
|
|
295
|
+
log(chalk.green(' ✓ Deployed; the steps marked … finish by themselves once they can.'));
|
|
296
|
+
else
|
|
297
|
+
log(chalk.red(' ✗ Some steps failed. Run the same command again to retry them; finished steps are kept.'));
|
|
298
|
+
}
|
|
299
|
+
return deploymentFailed(final) ? CLI_CONSTANTS.EXIT_CODES.ERROR : CLI_CONSTANTS.EXIT_CODES.SUCCESS;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* `crewly deploy-bundle <id>` action.
|
|
303
|
+
*
|
|
304
|
+
* @param templateId - Bundle template id
|
|
305
|
+
* @param options - Commander options
|
|
306
|
+
* @param deps - Injectable pieces
|
|
307
|
+
*/
|
|
308
|
+
export async function deployBundleCommand(templateId, options = {}, deps = {}) {
|
|
309
|
+
const log = deps.log ?? ((line) => console.log(line));
|
|
310
|
+
let answers;
|
|
311
|
+
if (options.answers) {
|
|
312
|
+
try {
|
|
313
|
+
answers = loadAnswersFile(options.answers, deps.readFile);
|
|
314
|
+
}
|
|
315
|
+
catch (error) {
|
|
316
|
+
log(chalk.red(` ✗ ${error instanceof Error ? error.message : String(error)}`));
|
|
317
|
+
process.exitCode = CLI_CONSTANTS.EXIT_CODES.ERROR;
|
|
318
|
+
return;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
const code = await deployBundle(templateId, { ...options, answers }, deps);
|
|
322
|
+
if (code !== CLI_CONSTANTS.EXIT_CODES.SUCCESS)
|
|
323
|
+
process.exitCode = code;
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Ask a bundle's questions in the terminal. An answer from `preset` is
|
|
327
|
+
* kept; Enter takes the default; a select takes a number or a value; a
|
|
328
|
+
* multiselect takes comma-separated numbers or values.
|
|
329
|
+
*
|
|
330
|
+
* @param ask - Prompt function
|
|
331
|
+
* @param questions - Bundle questions
|
|
332
|
+
* @param preset - Answers already given (e.g. from --answers)
|
|
333
|
+
* @param log - Output
|
|
334
|
+
* @returns Answers
|
|
335
|
+
*/
|
|
336
|
+
export async function askBundleQuestions(ask, questions, preset = {}, log = (line) => console.log(line)) {
|
|
337
|
+
const answers = { ...preset };
|
|
338
|
+
for (const q of questions) {
|
|
339
|
+
if (answers[q.id] !== undefined && answers[q.id] !== '')
|
|
340
|
+
continue;
|
|
341
|
+
const options = q.options ?? [];
|
|
342
|
+
for (;;) {
|
|
343
|
+
log(chalk.bold(` ${q.label}${q.required ? '' : chalk.gray('(可选)')}`));
|
|
344
|
+
if (q.help)
|
|
345
|
+
log(chalk.gray(` ${q.help}`));
|
|
346
|
+
options.forEach((o, i) => log(` ${i + 1}. ${o.label ?? o.value}`));
|
|
347
|
+
const fallback = Array.isArray(q.default) ? q.default.join(', ') : q.default ?? '';
|
|
348
|
+
const raw = (await ask(` > ${fallback ? chalk.gray(`[${fallback}] `) : ''}`)).trim();
|
|
349
|
+
if (raw === '') {
|
|
350
|
+
if (q.required) {
|
|
351
|
+
log(chalk.yellow(' 这一项必填。'));
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
break; // default applies
|
|
355
|
+
}
|
|
356
|
+
const pick = (token) => {
|
|
357
|
+
const n = Number.parseInt(token, 10);
|
|
358
|
+
if (String(n) === token && n >= 1 && n <= options.length)
|
|
359
|
+
return options[n - 1].value;
|
|
360
|
+
return options.some((o) => o.value === token) ? token : null;
|
|
361
|
+
};
|
|
362
|
+
if (q.type === 'select') {
|
|
363
|
+
const value = pick(raw);
|
|
364
|
+
if (!value) {
|
|
365
|
+
log(chalk.yellow(` 请输入 1-${options.length}。`));
|
|
366
|
+
continue;
|
|
367
|
+
}
|
|
368
|
+
answers[q.id] = value;
|
|
369
|
+
}
|
|
370
|
+
else if (q.type === 'multiselect') {
|
|
371
|
+
const values = raw.split(/[,,、\s]+/).filter(Boolean).map(pick);
|
|
372
|
+
if (values.some((v) => v === null)) {
|
|
373
|
+
log(chalk.yellow(` 用逗号分开,比如 1,3。`));
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
answers[q.id] = values;
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
answers[q.id] = raw;
|
|
380
|
+
}
|
|
381
|
+
break;
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
return answers;
|
|
385
|
+
}
|
|
386
|
+
//# sourceMappingURL=deploy-bundle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-bundle.js","sourceRoot":"","sources":["../../../../../cli/src/commands/deploy-bundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,10 @@
|
|
|
26
26
|
*
|
|
27
27
|
* Used directly via `crewly onboard`, by the curl install script, and by the
|
|
28
28
|
* desktop app. Flags: `--yes`, `--template <id>`, `--harness <id>`, `--task <text>`,
|
|
29
|
-
* `--web`, `--cli
|
|
29
|
+
* `--web`, `--cli`, and for a solution bundle (`--template <bundle id>`)
|
|
30
|
+
* `--answers <file>` / `--runtime <id>`: the bundle's questions are asked
|
|
31
|
+
* (or read from the file) and it is deployed in one step
|
|
32
|
+
* (specs/solution-bundles.md).
|
|
30
33
|
*
|
|
31
34
|
* @module cli/commands/onboard
|
|
32
35
|
*/
|
|
@@ -35,6 +38,7 @@ import { type TeamTemplate } from '../utils/templates.js';
|
|
|
35
38
|
import type { HarnessService } from '../../../backend/src/services/harness/harness.service.js';
|
|
36
39
|
import { type LoginDriver } from '../utils/harness-engine.js';
|
|
37
40
|
import { type HarnessSetupResult, type SetupIO } from './harness-setup.js';
|
|
41
|
+
import type { BundleTemplate } from '../../../backend/src/types/solution-bundle.types.js';
|
|
38
42
|
import { type ConnectLinks, type ConnectState, type FirstTaskOutcome, type StarterChoice } from './onboard-checklist.js';
|
|
39
43
|
/** Options passed from Commander.js for the onboard command */
|
|
40
44
|
export interface OnboardOptions {
|
|
@@ -50,6 +54,10 @@ export interface OnboardOptions {
|
|
|
50
54
|
cli?: boolean;
|
|
51
55
|
/** First task for the new team (with --yes; otherwise it is asked) */
|
|
52
56
|
task?: string;
|
|
57
|
+
/** Answers file (JSON) for a solution bundle's questions */
|
|
58
|
+
answers?: string;
|
|
59
|
+
/** Runtime for a solution bundle's members */
|
|
60
|
+
runtime?: string;
|
|
53
61
|
}
|
|
54
62
|
/** Where the rest of setup happens. */
|
|
55
63
|
export type SetupMode = 'web' | 'cli';
|
|
@@ -71,6 +79,10 @@ export interface OnboardDeps {
|
|
|
71
79
|
connectLinks?: () => ConnectLinks;
|
|
72
80
|
/** Cloud / Slack state from the running backend (null when unknown) */
|
|
73
81
|
readConnectState?: () => Promise<ConnectState | null>;
|
|
82
|
+
/** Find a solution bundle by template id (null when the id is not a bundle) */
|
|
83
|
+
findBundle?: (templateId: string) => BundleTemplate | null;
|
|
84
|
+
/** Deploy a solution bundle; returns the exit code */
|
|
85
|
+
deployBundle?: (templateId: string, answers: Record<string, unknown>, runtime: string | undefined) => Promise<number>;
|
|
74
86
|
}
|
|
75
87
|
/**
|
|
76
88
|
* Prints the Crewly ASCII art banner to stdout.
|
|
@@ -345,6 +357,25 @@ export declare function runConnectStep(links: () => ConnectLinks, readState: ()
|
|
|
345
357
|
* @param projectDir - The project directory path for next-steps output
|
|
346
358
|
*/
|
|
347
359
|
export declare function printSummary(selectedTemplate?: TeamTemplate | null, projectDir?: string): void;
|
|
360
|
+
/**
|
|
361
|
+
* A solution bundle by template id, from the OSS templates and
|
|
362
|
+
* CREWLY_TEMPLATE_DIRS (e.g. Crewly Pro's templates).
|
|
363
|
+
*
|
|
364
|
+
* @param templateId - Template id
|
|
365
|
+
* @returns The bundle, or null when the id is not a bundle
|
|
366
|
+
*/
|
|
367
|
+
export declare function findBundleTemplate(templateId: string): BundleTemplate | null;
|
|
368
|
+
/**
|
|
369
|
+
* Step 4 for a solution bundle: its questions (unless `--answers` covers
|
|
370
|
+
* them, or `--yes` forbids asking), then the one-step deploy.
|
|
371
|
+
*
|
|
372
|
+
* @param bundle - Bundle template
|
|
373
|
+
* @param options - `--answers`, `--runtime`
|
|
374
|
+
* @param ask - Prompt function, or null in non-interactive mode
|
|
375
|
+
* @param deploy - Deploy function (exit code)
|
|
376
|
+
* @returns Whether the bundle deployed (possibly with pending steps)
|
|
377
|
+
*/
|
|
378
|
+
export declare function runBundleStep(bundle: BundleTemplate, options: Pick<OnboardOptions, 'answers' | 'runtime'>, ask: ((question: string) => Promise<string>) | null, deploy: (templateId: string, answers: Record<string, unknown>, runtime: string | undefined) => Promise<number>): Promise<boolean>;
|
|
348
379
|
/**
|
|
349
380
|
* Runs the onboarding wizard.
|
|
350
381
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../../../../cli/src/commands/onboard.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../../../../cli/src/commands/onboard.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,7 +26,10 @@
|
|
|
26
26
|
*
|
|
27
27
|
* Used directly via `crewly onboard`, by the curl install script, and by the
|
|
28
28
|
* desktop app. Flags: `--yes`, `--template <id>`, `--harness <id>`, `--task <text>`,
|
|
29
|
-
* `--web`, `--cli
|
|
29
|
+
* `--web`, `--cli`, and for a solution bundle (`--template <bundle id>`)
|
|
30
|
+
* `--answers <file>` / `--runtime <id>`: the bundle's questions are asked
|
|
31
|
+
* (or read from the file) and it is deployed in one step
|
|
32
|
+
* (specs/solution-bundles.md).
|
|
30
33
|
*
|
|
31
34
|
* @module cli/commands/onboard
|
|
32
35
|
*/
|
|
@@ -43,6 +46,8 @@ import { HARNESS_CONSTANTS } from '../../../backend/src/constants.js';
|
|
|
43
46
|
import { createCliHarnessService, getBackendPort, isBackendRunning, localBackendUrl, pickLoginDriver, } from '../utils/harness-engine.js';
|
|
44
47
|
import { createReadlineIO } from '../utils/prompt-io.js';
|
|
45
48
|
import { runHarnessSetup } from './harness-setup.js';
|
|
49
|
+
import { askBundleQuestions, cliPackageRoot, deployBundle, loadAnswersFile } from './deploy-bundle.js';
|
|
50
|
+
import { BundleCatalog, bundleTemplateDirs } from '../../../backend/src/services/bundle/bundle-catalog.js';
|
|
46
51
|
import { getCrewlyHomePath } from '../../../backend/src/services/core/crewly-home.utils.js';
|
|
47
52
|
import { resolveApiToken } from '../../../backend/src/services/core/api-token.service.js';
|
|
48
53
|
import { pickAdvertisedHost } from './token.js';
|
|
@@ -727,6 +732,53 @@ export function printSummary(selectedTemplate = null, projectDir) {
|
|
|
727
732
|
console.log(' and start your agents.\n');
|
|
728
733
|
}
|
|
729
734
|
}
|
|
735
|
+
// ========================= Solution bundles =========================
|
|
736
|
+
/**
|
|
737
|
+
* A solution bundle by template id, from the OSS templates and
|
|
738
|
+
* CREWLY_TEMPLATE_DIRS (e.g. Crewly Pro's templates).
|
|
739
|
+
*
|
|
740
|
+
* @param templateId - Template id
|
|
741
|
+
* @returns The bundle, or null when the id is not a bundle
|
|
742
|
+
*/
|
|
743
|
+
export function findBundleTemplate(templateId) {
|
|
744
|
+
try {
|
|
745
|
+
return new BundleCatalog(() => bundleTemplateDirs(cliPackageRoot())).get(templateId)?.template ?? null;
|
|
746
|
+
}
|
|
747
|
+
catch {
|
|
748
|
+
return null;
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
/**
|
|
752
|
+
* Step 4 for a solution bundle: its questions (unless `--answers` covers
|
|
753
|
+
* them, or `--yes` forbids asking), then the one-step deploy.
|
|
754
|
+
*
|
|
755
|
+
* @param bundle - Bundle template
|
|
756
|
+
* @param options - `--answers`, `--runtime`
|
|
757
|
+
* @param ask - Prompt function, or null in non-interactive mode
|
|
758
|
+
* @param deploy - Deploy function (exit code)
|
|
759
|
+
* @returns Whether the bundle deployed (possibly with pending steps)
|
|
760
|
+
*/
|
|
761
|
+
export async function runBundleStep(bundle, options, ask, deploy) {
|
|
762
|
+
console.log(stepHeader(4, `First team: ${bundle.bundle.label}`));
|
|
763
|
+
console.log(chalk.gray(` ${bundle.bundle.tagline}\n`));
|
|
764
|
+
let answers = {};
|
|
765
|
+
if (options.answers) {
|
|
766
|
+
try {
|
|
767
|
+
answers = loadAnswersFile(options.answers);
|
|
768
|
+
}
|
|
769
|
+
catch (error) {
|
|
770
|
+
console.log(chalk.red(` ✗ ${error instanceof Error ? error.message : String(error)}`));
|
|
771
|
+
return false;
|
|
772
|
+
}
|
|
773
|
+
}
|
|
774
|
+
if (ask) {
|
|
775
|
+
console.log(chalk.bold(' 先回答几个问题,团队会按你的情况来做事:\n'));
|
|
776
|
+
answers = await askBundleQuestions(ask, bundle.bundle.questions ?? [], answers);
|
|
777
|
+
}
|
|
778
|
+
const code = await deploy(bundle.id, answers, options.runtime);
|
|
779
|
+
console.log('');
|
|
780
|
+
return code === CLI_EXIT_CODES.SUCCESS;
|
|
781
|
+
}
|
|
730
782
|
// ========================= Main command =========================
|
|
731
783
|
/**
|
|
732
784
|
* Runs the onboarding wizard.
|
|
@@ -760,9 +812,12 @@ export function printSummary(selectedTemplate = null, projectDir) {
|
|
|
760
812
|
export async function onboardCommand(options = {}, deps = {}) {
|
|
761
813
|
printBanner();
|
|
762
814
|
const autoYes = options.yes === true;
|
|
763
|
-
// Handle --template flag:
|
|
815
|
+
// Handle --template flag: a solution bundle, else a template by ID
|
|
764
816
|
let preselectedTemplate = null;
|
|
765
|
-
|
|
817
|
+
const findBundle = deps.findBundle ?? findBundleTemplate;
|
|
818
|
+
const preselectedBundle = options.template ? findBundle(options.template) : null;
|
|
819
|
+
const runBundleDeploy = deps.deployBundle ?? ((templateId, answers, runtime) => deployBundle(templateId, { answers, ...(runtime ? { runtime } : {}) }));
|
|
820
|
+
if (options.template && !preselectedBundle) {
|
|
766
821
|
const found = getTemplate(options.template);
|
|
767
822
|
if (found) {
|
|
768
823
|
preselectedTemplate = found;
|
|
@@ -832,6 +887,17 @@ export async function onboardCommand(options = {}, deps = {}) {
|
|
|
832
887
|
const harness = await runHarnessStep(noPrompt, getService(), getDriver, { interactive: false, harness: options.harness });
|
|
833
888
|
// Step 3: Skills
|
|
834
889
|
await ensureSkills();
|
|
890
|
+
// Step 4 for a solution bundle: deploy it with --answers; its
|
|
891
|
+
// first-week tasks replace the first-task step.
|
|
892
|
+
if (preselectedBundle) {
|
|
893
|
+
await runBundleStep(preselectedBundle, options, null, runBundleDeploy);
|
|
894
|
+
scaffoldCrewlyDirectory(process.cwd(), null);
|
|
895
|
+
if (options.task)
|
|
896
|
+
await runFirstTaskStep(null, preselectedBundle.id, { task: options.task }, deliver);
|
|
897
|
+
await runConnectStep(links, readState);
|
|
898
|
+
printSummary(null);
|
|
899
|
+
return;
|
|
900
|
+
}
|
|
835
901
|
// Step 4: First team — --template, else the recommended starter
|
|
836
902
|
// (Personal Assistant), never simply the first template by name.
|
|
837
903
|
console.log(stepHeader(4, 'First team'));
|
|
@@ -874,6 +940,17 @@ export async function onboardCommand(options = {}, deps = {}) {
|
|
|
874
940
|
const harness = await runHarnessStep(io, getService(), getDriver, { interactive: true, harness: options.harness });
|
|
875
941
|
// Step 3: Skills
|
|
876
942
|
await ensureSkills();
|
|
943
|
+
// Step 4 for a solution bundle: ask its questions and deploy it; its
|
|
944
|
+
// first-week tasks replace the first-task step.
|
|
945
|
+
if (preselectedBundle) {
|
|
946
|
+
await runBundleStep(preselectedBundle, options, io.ask, runBundleDeploy);
|
|
947
|
+
scaffoldCrewlyDirectory(process.cwd(), null);
|
|
948
|
+
if (options.task)
|
|
949
|
+
await runFirstTaskStep(null, preselectedBundle.id, { task: options.task }, deliver);
|
|
950
|
+
await runConnectStep(links, readState);
|
|
951
|
+
printSummary(null);
|
|
952
|
+
return;
|
|
953
|
+
}
|
|
877
954
|
// Step 4: First team — preselected or chosen (Enter = Personal Assistant)
|
|
878
955
|
let choice;
|
|
879
956
|
if (preselectedTemplate) {
|