crewly 1.20.128 → 1.20.129

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.
Files changed (99) hide show
  1. package/config/templates/growth-marketing-team.json +12 -1
  2. package/config/templates/personal-assistant-team.json +28 -0
  3. package/dist/backend/backend/src/constants.d.ts +45 -0
  4. package/dist/backend/backend/src/constants.d.ts.map +1 -1
  5. package/dist/backend/backend/src/constants.js +51 -0
  6. package/dist/backend/backend/src/constants.js.map +1 -1
  7. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts +49 -0
  8. package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
  9. package/dist/backend/backend/src/controllers/chat/chat.controller.js +135 -106
  10. package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
  11. package/dist/backend/backend/src/controllers/onboarding/index.d.ts +1 -0
  12. package/dist/backend/backend/src/controllers/onboarding/index.d.ts.map +1 -1
  13. package/dist/backend/backend/src/controllers/onboarding/index.js +1 -0
  14. package/dist/backend/backend/src/controllers/onboarding/index.js.map +1 -1
  15. package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.d.ts +38 -0
  16. package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.d.ts.map +1 -0
  17. package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.js +106 -0
  18. package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.js.map +1 -0
  19. package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.d.ts +24 -0
  20. package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.d.ts.map +1 -0
  21. package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.js +34 -0
  22. package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.js.map +1 -0
  23. package/dist/backend/backend/src/index.d.ts.map +1 -1
  24. package/dist/backend/backend/src/index.js +17 -0
  25. package/dist/backend/backend/src/index.js.map +1 -1
  26. package/dist/backend/backend/src/routes/api.routes.d.ts.map +1 -1
  27. package/dist/backend/backend/src/routes/api.routes.js +5 -0
  28. package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
  29. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.d.ts.map +1 -1
  30. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js +10 -0
  31. package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
  32. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.d.ts +45 -0
  33. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.d.ts.map +1 -0
  34. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js +103 -0
  35. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js.map +1 -0
  36. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts +301 -0
  37. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -0
  38. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js +365 -0
  39. package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -0
  40. package/dist/backend/backend/src/services/onboarding/onboarding-state.store.d.ts +89 -0
  41. package/dist/backend/backend/src/services/onboarding/onboarding-state.store.d.ts.map +1 -0
  42. package/dist/backend/backend/src/services/onboarding/onboarding-state.store.js +122 -0
  43. package/dist/backend/backend/src/services/onboarding/onboarding-state.store.js.map +1 -0
  44. package/dist/backend/backend/src/services/template/template.service.d.ts +15 -1
  45. package/dist/backend/backend/src/services/template/template.service.d.ts.map +1 -1
  46. package/dist/backend/backend/src/services/template/template.service.js +22 -1
  47. package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
  48. package/dist/backend/backend/src/types/team-template.types.d.ts +30 -0
  49. package/dist/backend/backend/src/types/team-template.types.d.ts.map +1 -1
  50. package/dist/backend/backend/src/types/team-template.types.js +24 -0
  51. package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
  52. package/dist/backend/build-info.json +2 -2
  53. package/dist/cli/backend/src/constants.d.ts +45 -0
  54. package/dist/cli/backend/src/constants.d.ts.map +1 -1
  55. package/dist/cli/backend/src/constants.js +51 -0
  56. package/dist/cli/backend/src/constants.js.map +1 -1
  57. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts +301 -0
  58. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -0
  59. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js +365 -0
  60. package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -0
  61. package/dist/cli/backend/src/services/onboarding/onboarding-state.store.d.ts +89 -0
  62. package/dist/cli/backend/src/services/onboarding/onboarding-state.store.d.ts.map +1 -0
  63. package/dist/cli/backend/src/services/onboarding/onboarding-state.store.js +122 -0
  64. package/dist/cli/backend/src/services/onboarding/onboarding-state.store.js.map +1 -0
  65. package/dist/cli/backend/src/services/skill/skill-tier.service.d.ts +116 -0
  66. package/dist/cli/backend/src/services/skill/skill-tier.service.d.ts.map +1 -0
  67. package/dist/cli/backend/src/services/skill/skill-tier.service.js +155 -0
  68. package/dist/cli/backend/src/services/skill/skill-tier.service.js.map +1 -0
  69. package/dist/cli/backend/src/services/template/template.service.d.ts +152 -0
  70. package/dist/cli/backend/src/services/template/template.service.d.ts.map +1 -0
  71. package/dist/cli/backend/src/services/template/template.service.js +506 -0
  72. package/dist/cli/backend/src/services/template/template.service.js.map +1 -0
  73. package/dist/cli/backend/src/types/team-template.types.d.ts +30 -0
  74. package/dist/cli/backend/src/types/team-template.types.d.ts.map +1 -1
  75. package/dist/cli/backend/src/types/team-template.types.js +24 -0
  76. package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
  77. package/dist/cli/cli/src/commands/onboard-checklist.d.ts +152 -0
  78. package/dist/cli/cli/src/commands/onboard-checklist.d.ts.map +1 -0
  79. package/dist/cli/cli/src/commands/onboard-checklist.js +241 -0
  80. package/dist/cli/cli/src/commands/onboard-checklist.js.map +1 -0
  81. package/dist/cli/cli/src/commands/onboard.d.ts +87 -6
  82. package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
  83. package/dist/cli/cli/src/commands/onboard.js +203 -37
  84. package/dist/cli/cli/src/commands/onboard.js.map +1 -1
  85. package/dist/cli/cli/src/constants.d.ts +5 -0
  86. package/dist/cli/cli/src/constants.d.ts.map +1 -1
  87. package/dist/cli/cli/src/constants.js +5 -0
  88. package/dist/cli/cli/src/constants.js.map +1 -1
  89. package/dist/cli/cli/src/index.js +2 -1
  90. package/dist/cli/cli/src/index.js.map +1 -1
  91. package/dist/cli/cli/src/utils/templates.d.ts +27 -0
  92. package/dist/cli/cli/src/utils/templates.d.ts.map +1 -1
  93. package/dist/cli/cli/src/utils/templates.js +29 -0
  94. package/dist/cli/cli/src/utils/templates.js.map +1 -1
  95. package/frontend/dist/assets/index-2bdb57b9.css +42 -0
  96. package/frontend/dist/assets/{index-aaf65055.js → index-5b98bf77.js} +285 -285
  97. package/frontend/dist/index.html +2 -2
  98. package/package.json +1 -1
  99. package/frontend/dist/assets/index-0a2f783c.css +0 -42
@@ -0,0 +1,152 @@
1
+ /**
2
+ * `crewly onboard` steps after the harness (specs/onboarding-harness-login.md,
3
+ * Phase 3): pick the first team, send it a first task, and point the owner at
4
+ * Crewly Cloud and Slack.
5
+ *
6
+ * Mirrors the web setup page and uses the same backend pieces:
7
+ * - starters are the templates marked `onboarding` (Personal Assistant is
8
+ * the default), plus Blank (the orchestrator only);
9
+ * - the first task goes to `POST /api/onboarding/first-task` when this
10
+ * user's backend is running; otherwise it is kept in
11
+ * `<crewlyHome>/onboarding.json` and the backend hands it to the
12
+ * orchestrator when it starts;
13
+ * - Cloud and Slack never block: the CLI prints links that work on a phone.
14
+ *
15
+ * @module cli/commands/onboard-checklist
16
+ */
17
+ import { OnboardingStateStore } from '../../../backend/src/services/onboarding/onboarding-state.store.js';
18
+ import type { TeamTemplate } from '../utils/templates.js';
19
+ import { type HttpJson } from '../utils/harness-engine.js';
20
+ /** Question asker (readline in the wizard). */
21
+ export type Ask = (question: string) => Promise<string>;
22
+ /** Output line writer. */
23
+ export type Log = (line: string) => void;
24
+ /** What the owner picked for the first team. */
25
+ export type StarterChoice = {
26
+ kind: 'template';
27
+ template: TeamTemplate;
28
+ } | {
29
+ kind: 'blank';
30
+ };
31
+ /**
32
+ * Step header, e.g. `Step 4/7: First team`.
33
+ *
34
+ * @param step - Step number
35
+ * @param title - Step title
36
+ * @returns Header text
37
+ */
38
+ export declare function stepHeader(step: number, title: string): string;
39
+ /**
40
+ * Ask which starter team to create. Enter picks the recommended one
41
+ * (the Personal Assistant).
42
+ *
43
+ * @param ask - Question asker
44
+ * @param starters - Starter templates, in display order
45
+ * @param log - Output
46
+ * @returns The choice
47
+ */
48
+ export declare function chooseStarter(ask: Ask, starters: Array<TeamTemplate & {
49
+ onboarding: NonNullable<TeamTemplate['onboarding']>;
50
+ }>, log?: Log): Promise<StarterChoice>;
51
+ /**
52
+ * Record that the owner chose Blank, which completes the checklist's team step.
53
+ *
54
+ * @param store - State store
55
+ * @param now - Clock
56
+ */
57
+ export declare function recordBlankChoice(store?: OnboardingStateStore, now?: Date): Promise<void>;
58
+ /**
59
+ * Example first tasks for a starter (Blank has its own).
60
+ *
61
+ * @param template - The chosen template, or null for Blank
62
+ * @returns Three suggestions
63
+ */
64
+ export declare function starterSuggestions(template: TeamTemplate | null): string[];
65
+ /**
66
+ * Ask for the first task ("派第一件事"). A number picks a suggestion, Enter skips.
67
+ *
68
+ * @param ask - Question asker
69
+ * @param suggestions - Example tasks
70
+ * @param log - Output
71
+ * @returns The task text, or null when skipped
72
+ */
73
+ export declare function askFirstTask(ask: Ask, suggestions: readonly string[], log?: Log): Promise<string | null>;
74
+ /** How the first task was handled. */
75
+ export type FirstTaskOutcome = {
76
+ status: 'sent';
77
+ queued: boolean;
78
+ } | {
79
+ status: 'pending';
80
+ } | {
81
+ status: 'failed';
82
+ message: string;
83
+ };
84
+ /** Dependencies of {@link deliverFirstTask} (tests). */
85
+ export interface FirstTaskDeps {
86
+ isRunning?: () => Promise<boolean>;
87
+ http?: HttpJson;
88
+ baseUrl?: string;
89
+ store?: OnboardingStateStore;
90
+ now?: () => Date;
91
+ }
92
+ /**
93
+ * Hand the first task to the orchestrator: through this user's running
94
+ * backend, or kept for the backend to deliver when it starts.
95
+ *
96
+ * @param text - The owner's words
97
+ * @param teamId - Team it is for, or null for the orchestrator itself
98
+ * @param deps - Backend probe, HTTP client, state store (tests)
99
+ * @returns What happened
100
+ */
101
+ export declare function deliverFirstTask(text: string, teamId: string | null, deps?: FirstTaskDeps): Promise<FirstTaskOutcome>;
102
+ /**
103
+ * Print how the first task was handled.
104
+ *
105
+ * @param outcome - Delivery outcome
106
+ * @param log - Output
107
+ */
108
+ export declare function reportFirstTask(outcome: FirstTaskOutcome, log?: Log): void;
109
+ /** Links that finish Cloud and Slack from a phone. */
110
+ export interface ConnectLinks {
111
+ /** Google sign-in on Crewly Cloud that ends on the portal's token page */
112
+ cloudSignInUrl: string;
113
+ /** This machine's setup page at the Cloud step (carries the API token) */
114
+ cloudSetupUrl: string;
115
+ /** This machine's setup page at the Slack step (carries the API token) */
116
+ slackSetupUrl: string;
117
+ }
118
+ /**
119
+ * Build the phone links for Cloud and Slack.
120
+ *
121
+ * @param host - Host the phone can reach (LAN address)
122
+ * @param port - Backend port
123
+ * @param apiToken - API token non-loopback callers need (consumed once by the web app)
124
+ * @returns Links
125
+ */
126
+ export declare function buildConnectLinks(host: string, port: number, apiToken: string | null): ConnectLinks;
127
+ /** Cloud / Slack state, when the backend could be asked. */
128
+ export interface ConnectState {
129
+ cloud: boolean;
130
+ slack: boolean;
131
+ }
132
+ /**
133
+ * Read Cloud / Slack state from this user's running backend.
134
+ *
135
+ * @param deps - Backend probe and HTTP client (tests)
136
+ * @returns The state, or null when the backend is not running or did not answer
137
+ */
138
+ export declare function readConnectState(deps?: {
139
+ isRunning?: () => Promise<boolean>;
140
+ http?: HttpJson;
141
+ baseUrl?: string;
142
+ }): Promise<ConnectState | null>;
143
+ /**
144
+ * Print the Cloud and Slack step: done marks when known, otherwise links
145
+ * that work from a phone. Never waits for the owner.
146
+ *
147
+ * @param links - Phone links
148
+ * @param state - Known state, or null
149
+ * @param log - Output
150
+ */
151
+ export declare function printConnectSteps(links: ConnectLinks, state: ConnectState | null, log?: Log): void;
152
+ //# sourceMappingURL=onboard-checklist.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboard-checklist.d.ts","sourceRoot":"","sources":["../../../../../cli/src/commands/onboard-checklist.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,241 @@
1
+ /**
2
+ * `crewly onboard` steps after the harness (specs/onboarding-harness-login.md,
3
+ * Phase 3): pick the first team, send it a first task, and point the owner at
4
+ * Crewly Cloud and Slack.
5
+ *
6
+ * Mirrors the web setup page and uses the same backend pieces:
7
+ * - starters are the templates marked `onboarding` (Personal Assistant is
8
+ * the default), plus Blank (the orchestrator only);
9
+ * - the first task goes to `POST /api/onboarding/first-task` when this
10
+ * user's backend is running; otherwise it is kept in
11
+ * `<crewlyHome>/onboarding.json` and the backend hands it to the
12
+ * orchestrator when it starts;
13
+ * - Cloud and Slack never block: the CLI prints links that work on a phone.
14
+ *
15
+ * @module cli/commands/onboard-checklist
16
+ */
17
+ import chalk from 'chalk';
18
+ import { CLI_CONSTANTS } from '../constants.js';
19
+ import { ONBOARDING_CONSTANTS, HARNESS_CONSTANTS } from '../../../backend/src/constants.js';
20
+ import { OnboardingStateStore } from '../../../backend/src/services/onboarding/onboarding-state.store.js';
21
+ import { buildTokenPageSignInUrl } from '../../../backend/src/services/onboarding/onboarding-checklist.service.js';
22
+ import { defaultHttpJson, isBackendRunning, localBackendUrl } from '../utils/harness-engine.js';
23
+ /**
24
+ * Step header, e.g. `Step 4/7: First team`.
25
+ *
26
+ * @param step - Step number
27
+ * @param title - Step title
28
+ * @returns Header text
29
+ */
30
+ export function stepHeader(step, title) {
31
+ return chalk.bold(` Step ${step}/${CLI_CONSTANTS.ONBOARD.TOTAL_STEPS}: ${title}`);
32
+ }
33
+ /**
34
+ * Ask which starter team to create. Enter picks the recommended one
35
+ * (the Personal Assistant).
36
+ *
37
+ * @param ask - Question asker
38
+ * @param starters - Starter templates, in display order
39
+ * @param log - Output
40
+ * @returns The choice
41
+ */
42
+ export async function chooseStarter(ask, starters, log = (line) => console.log(line)) {
43
+ log(' Choose your first team (you can add more later):\n');
44
+ starters.forEach((t, i) => {
45
+ const tag = t.onboarding.recommended ? chalk.green(' (recommended / 推荐)') : '';
46
+ log(` ${i + 1}. ${chalk.bold(`${t.onboarding.label} · ${t.name}`)}${tag}`);
47
+ log(chalk.gray(` ${t.onboarding.tagline}`));
48
+ log(chalk.gray(` Members: ${t.members.map((m) => m.name).join(', ')}\n`));
49
+ });
50
+ const blankIndex = starters.length + 1;
51
+ const blank = ONBOARDING_CONSTANTS.BLANK_STARTER;
52
+ log(` ${blankIndex}. ${chalk.bold(`${blank.LABEL} · ${blank.NAME}`)}`);
53
+ log(chalk.gray(` ${blank.TAGLINE}\n`));
54
+ const recommended = Math.max(0, starters.findIndex((t) => t.onboarding.recommended));
55
+ const defaultChoice = starters.length > 0 ? recommended + 1 : blankIndex;
56
+ for (;;) {
57
+ const answer = (await ask(` Enter choice (1-${blankIndex}) [${defaultChoice}]: `)).trim().toLowerCase();
58
+ const num = answer === '' ? defaultChoice : Number.parseInt(answer, 10);
59
+ if (num >= 1 && num <= starters.length) {
60
+ log(chalk.green(` ✓ Selected: ${starters[num - 1].name}\n`));
61
+ return { kind: 'template', template: starters[num - 1] };
62
+ }
63
+ if (num === blankIndex || answer === 'blank') {
64
+ log(chalk.green(' ✓ Blank: just the orchestrator for now\n'));
65
+ return { kind: 'blank' };
66
+ }
67
+ log(chalk.yellow(` Please enter 1-${blankIndex}.`));
68
+ }
69
+ }
70
+ /**
71
+ * Record that the owner chose Blank, which completes the checklist's team step.
72
+ *
73
+ * @param store - State store
74
+ * @param now - Clock
75
+ */
76
+ export async function recordBlankChoice(store = new OnboardingStateStore(), now = new Date()) {
77
+ await store.update((cur) => ({ blankChosenAt: cur.blankChosenAt ?? now.toISOString() }));
78
+ }
79
+ /**
80
+ * Example first tasks for a starter (Blank has its own).
81
+ *
82
+ * @param template - The chosen template, or null for Blank
83
+ * @returns Three suggestions
84
+ */
85
+ export function starterSuggestions(template) {
86
+ return [...(template?.onboarding?.suggestions ?? ONBOARDING_CONSTANTS.BLANK_STARTER.SUGGESTIONS)];
87
+ }
88
+ /**
89
+ * Ask for the first task ("派第一件事"). A number picks a suggestion, Enter skips.
90
+ *
91
+ * @param ask - Question asker
92
+ * @param suggestions - Example tasks
93
+ * @param log - Output
94
+ * @returns The task text, or null when skipped
95
+ */
96
+ export async function askFirstTask(ask, suggestions, log = (line) => console.log(line)) {
97
+ log(' What should your team do first? (派第一件事) For example:\n');
98
+ suggestions.forEach((s, i) => log(` ${i + 1}. ${s}`));
99
+ log('');
100
+ for (;;) {
101
+ const answer = (await ask(` Type a task, 1-${suggestions.length} for an example, or Enter to skip: `)).trim();
102
+ if (answer === '') {
103
+ log(chalk.gray(' Skipped. Send it any time from the dashboard or Slack.\n'));
104
+ return null;
105
+ }
106
+ const num = /^\d+$/.test(answer) ? Number.parseInt(answer, 10) : NaN;
107
+ if (Number.isFinite(num)) {
108
+ if (num >= 1 && num <= suggestions.length)
109
+ return suggestions[num - 1];
110
+ log(chalk.yellow(` Please enter 1-${suggestions.length}, a task, or Enter.`));
111
+ continue;
112
+ }
113
+ if (answer.length > ONBOARDING_CONSTANTS.FIRST_TASK_MAX_LENGTH) {
114
+ log(chalk.yellow(` Keep it under ${ONBOARDING_CONSTANTS.FIRST_TASK_MAX_LENGTH} characters.`));
115
+ continue;
116
+ }
117
+ return answer;
118
+ }
119
+ }
120
+ /**
121
+ * Hand the first task to the orchestrator: through this user's running
122
+ * backend, or kept for the backend to deliver when it starts.
123
+ *
124
+ * @param text - The owner's words
125
+ * @param teamId - Team it is for, or null for the orchestrator itself
126
+ * @param deps - Backend probe, HTTP client, state store (tests)
127
+ * @returns What happened
128
+ */
129
+ export async function deliverFirstTask(text, teamId, deps = {}) {
130
+ const isRunning = deps.isRunning ?? (() => isBackendRunning());
131
+ if (await isRunning()) {
132
+ const http = deps.http ?? defaultHttpJson;
133
+ try {
134
+ const { status, body } = await http('POST', `${deps.baseUrl ?? localBackendUrl()}${CLI_CONSTANTS.ONBOARD.FIRST_TASK_ENDPOINT}`, {
135
+ text,
136
+ ...(teamId ? { teamId } : {}),
137
+ });
138
+ const data = body;
139
+ if (status < 300 && data?.success)
140
+ return { status: 'sent', queued: data.data?.queued === true };
141
+ return { status: 'failed', message: data?.error ?? `HTTP ${status}` };
142
+ }
143
+ catch (error) {
144
+ return { status: 'failed', message: error instanceof Error ? error.message : String(error) };
145
+ }
146
+ }
147
+ const store = deps.store ?? new OnboardingStateStore();
148
+ const createdAt = (deps.now ?? (() => new Date()))().toISOString();
149
+ await store.update(() => ({ pendingFirstTask: { text: text.trim(), teamId, createdAt } }));
150
+ return { status: 'pending' };
151
+ }
152
+ /**
153
+ * Print how the first task was handled.
154
+ *
155
+ * @param outcome - Delivery outcome
156
+ * @param log - Output
157
+ */
158
+ export function reportFirstTask(outcome, log = (line) => console.log(line)) {
159
+ if (outcome.status === 'sent') {
160
+ log(chalk.green(outcome.queued ? ' ✓ Sent to the orchestrator; it picks it up as soon as it is running.\n' : ' ✓ Sent to the orchestrator.\n'));
161
+ }
162
+ else if (outcome.status === 'pending') {
163
+ log(chalk.green(' ✓ Saved. The orchestrator gets it when Crewly starts.\n'));
164
+ }
165
+ else {
166
+ log(chalk.yellow(` ⚠ Could not send it: ${outcome.message}`));
167
+ log(chalk.gray(' Send it from the dashboard (Setup → 派第一件事) or Slack instead.\n'));
168
+ }
169
+ }
170
+ /**
171
+ * Build the phone links for Cloud and Slack.
172
+ *
173
+ * @param host - Host the phone can reach (LAN address)
174
+ * @param port - Backend port
175
+ * @param apiToken - API token non-loopback callers need (consumed once by the web app)
176
+ * @returns Links
177
+ */
178
+ export function buildConnectLinks(host, port, apiToken) {
179
+ const setup = (step) => {
180
+ const params = new URLSearchParams({ [ONBOARDING_CONSTANTS.WEB_STEP_QUERY]: step });
181
+ if (apiToken)
182
+ params.set('token', apiToken);
183
+ return `http://${host}:${port}${HARNESS_CONSTANTS.WEB_SETUP_PATH}?${params.toString()}`;
184
+ };
185
+ return {
186
+ cloudSignInUrl: buildTokenPageSignInUrl(),
187
+ cloudSetupUrl: setup(ONBOARDING_CONSTANTS.STEP_IDS.CLOUD),
188
+ slackSetupUrl: setup(ONBOARDING_CONSTANTS.STEP_IDS.SLACK),
189
+ };
190
+ }
191
+ /**
192
+ * Read Cloud / Slack state from this user's running backend.
193
+ *
194
+ * @param deps - Backend probe and HTTP client (tests)
195
+ * @returns The state, or null when the backend is not running or did not answer
196
+ */
197
+ export async function readConnectState(deps = {}) {
198
+ const isRunning = deps.isRunning ?? (() => isBackendRunning());
199
+ if (!(await isRunning()))
200
+ return null;
201
+ try {
202
+ const { status, body } = await (deps.http ?? defaultHttpJson)('GET', `${deps.baseUrl ?? localBackendUrl()}${CLI_CONSTANTS.ONBOARD.CHECKLIST_ENDPOINT}`);
203
+ const steps = body?.data?.steps;
204
+ if (status !== 200 || !Array.isArray(steps))
205
+ return null;
206
+ const done = (id) => steps.some((s) => s.id === id && s.done);
207
+ return { cloud: done(ONBOARDING_CONSTANTS.STEP_IDS.CLOUD), slack: done(ONBOARDING_CONSTANTS.STEP_IDS.SLACK) };
208
+ }
209
+ catch {
210
+ return null;
211
+ }
212
+ }
213
+ /**
214
+ * Print the Cloud and Slack step: done marks when known, otherwise links
215
+ * that work from a phone. Never waits for the owner.
216
+ *
217
+ * @param links - Phone links
218
+ * @param state - Known state, or null
219
+ * @param log - Output
220
+ */
221
+ export function printConnectSteps(links, state, log = (line) => console.log(line)) {
222
+ log(chalk.gray(' Optional, and all doable from your phone. Setup does not wait for them.\n'));
223
+ if (state?.cloud) {
224
+ log(chalk.green(' ✓ Crewly Cloud connected'));
225
+ }
226
+ else {
227
+ log(` ${chalk.bold('Crewly Cloud')} (remote access, backups, Slack):`);
228
+ log(` 1. On your phone, sign in: ${chalk.cyan(links.cloudSignInUrl)}`);
229
+ log(` 2. Paste the token and refresh token it shows into Setup → Cloud:`);
230
+ log(` ${chalk.cyan(links.cloudSetupUrl)}`);
231
+ log(chalk.gray(' (Or run `crewly cloud login --no-browser` here.)'));
232
+ }
233
+ if (state?.slack) {
234
+ log(chalk.green(' ✓ Slack connected\n'));
235
+ }
236
+ else {
237
+ log(` ${chalk.bold('Slack')} (talk to your team from Slack, after Cloud):`);
238
+ log(` ${chalk.cyan(links.slackSetupUrl)}\n`);
239
+ }
240
+ }
241
+ //# sourceMappingURL=onboard-checklist.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboard-checklist.js","sourceRoot":"","sources":["../../../../../cli/src/commands/onboard-checklist.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC5F,OAAO,EAAE,oBAAoB,EAAE,MAAM,oEAAoE,CAAC;AAC1G,OAAO,EAAE,uBAAuB,EAAE,MAAM,0EAA0E,CAAC;AAEnH,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAiB,MAAM,4BAA4B,CAAC;AAW/G;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,KAAa;IACrD,OAAO,KAAK,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,aAAa,CAAC,OAAO,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC,CAAC;AACpF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,GAAQ,EACR,QAAuF,EACvF,MAAW,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAEtC,GAAG,CAAC,sDAAsD,CAAC,CAAC;IAC5D,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACzB,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,KAAK,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;QAC9E,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAClD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;IACH,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,oBAAoB,CAAC,aAAa,CAAC;IACjD,GAAG,CAAC,OAAO,UAAU,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1E,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IAE7C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;IACrF,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;IACzE,SAAS,CAAC;QACT,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,qBAAqB,UAAU,MAAM,aAAa,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACzG,MAAM,GAAG,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACxE,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;YACxC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,iBAAiB,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YAC9D,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC;QAC1D,CAAC;QACD,IAAI,GAAG,KAAK,UAAU,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;YAC9C,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;YAC/D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC1B,CAAC;QACD,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,UAAU,GAAG,CAAC,CAAC,CAAC;IACtD,CAAC;AACF,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,QAA8B,IAAI,oBAAoB,EAAE,EAAE,MAAY,IAAI,IAAI,EAAE;IACvH,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;AAC1F,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAA6B;IAC/D,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,IAAI,oBAAoB,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;AACnG,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAQ,EAAE,WAA8B,EAAE,MAAW,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAClH,GAAG,CAAC,0DAA0D,CAAC,CAAC;IAChE,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;IACzD,GAAG,CAAC,EAAE,CAAC,CAAC;IACR,SAAS,CAAC;QACT,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,oBAAoB,WAAW,CAAC,MAAM,qCAAqC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC/G,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;YACnB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4DAA4D,CAAC,CAAC,CAAC;YAC9E,OAAO,IAAI,CAAC;QACb,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACrE,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1B,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CAAC,MAAM;gBAAE,OAAO,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACvE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,WAAW,CAAC,MAAM,qBAAqB,CAAC,CAAC,CAAC;YAC/E,SAAS;QACV,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,GAAG,oBAAoB,CAAC,qBAAqB,EAAE,CAAC;YAChE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,oBAAoB,CAAC,qBAAqB,cAAc,CAAC,CAAC,CAAC;YAC/F,SAAS;QACV,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;AACF,CAAC;AAiBD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAAqB,EAAE,OAAsB,EAAE;IACnG,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC/D,IAAI,MAAM,SAAS,EAAE,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,eAAe,CAAC;QAC1C,IAAI,CAAC;YACJ,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,eAAe,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,mBAAmB,EAAE,EAAE;gBAC/H,IAAI;gBACJ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7B,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,IAAiF,CAAC;YAC/F,IAAI,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,OAAO;gBAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,CAAC;YACjG,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,IAAI,QAAQ,MAAM,EAAE,EAAE,CAAC;QACvE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC9F,CAAC;IACF,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,oBAAoB,EAAE,CAAC;IACvD,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC;IACnE,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3F,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;AAC9B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAyB,EAAE,MAAW,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAChG,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;QAC/B,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,0EAA0E,CAAC,CAAC,CAAC,iCAAiC,CAAC,CAAC,CAAC;IACnJ,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACzC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,2DAA2D,CAAC,CAAC,CAAC;IAC/E,CAAC;SAAM,CAAC;QACP,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0BAA0B,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC/D,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC,CAAC;IACvF,CAAC;AACF,CAAC;AAYD;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,IAAY,EAAE,QAAuB;IACpF,MAAM,KAAK,GAAG,CAAC,IAAY,EAAU,EAAE;QACtC,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,CAAC,oBAAoB,CAAC,cAAc,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACpF,IAAI,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5C,OAAO,UAAU,IAAI,IAAI,IAAI,GAAG,iBAAiB,CAAC,cAAc,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC;IACzF,CAAC,CAAC;IACF,OAAO;QACN,cAAc,EAAE,uBAAuB,EAAE;QACzC,aAAa,EAAE,KAAK,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC;QACzD,aAAa,EAAE,KAAK,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC;KACzD,CAAC;AACH,CAAC;AAQD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAkF,EAAE;IAC1H,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,CAAC,gBAAgB,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,CAAC,MAAM,SAAS,EAAE,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,CAAC;QACJ,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,eAAe,CAAC,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,IAAI,eAAe,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACxJ,MAAM,KAAK,GAAI,IAA2E,EAAE,IAAI,EAAE,KAAK,CAAC;QACxG,IAAI,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACzD,MAAM,IAAI,GAAG,CAAC,EAAU,EAAW,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAC/E,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;IAC/G,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,IAAI,CAAC;IACb,CAAC;AACF,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAmB,EAAE,KAA0B,EAAE,MAAW,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IACxH,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAC,CAAC;IAC/F,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;QAClB,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC,CAAC;IAChD,CAAC;SAAM,CAAC;QACP,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,mCAAmC,CAAC,CAAC;QACxE,GAAG,CAAC,mCAAmC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAC3E,GAAG,CAAC,uEAAuE,CAAC,CAAC;QAC7E,GAAG,CAAC,UAAU,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QACjD,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,yDAAyD,CAAC,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;QAClB,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACP,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC;QAC7E,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;AACF,CAAC"}
@@ -11,7 +11,13 @@
11
11
  * 2. Login — the harness's own login command runs in Crewly's login broker;
12
12
  * the sign-in link (and code) is printed so it can be opened on a phone,
13
13
  * and Claude's code is read back from this terminal.
14
- * 3. Agent skills, 4. team template, 5. summary.
14
+ * 3. Agent skills.
15
+ * 4. First team: a starter (Personal Assistant by default, Marketing) or
16
+ * Blank (the orchestrator only).
17
+ * 5. First task ("派第一件事"), optional: sent to the orchestrator through the
18
+ * running backend, or kept for it until Crewly starts.
19
+ * 6. Crewly Cloud and Slack: phone links only, never waits.
20
+ * 7. Summary.
15
21
  *
16
22
  * The owner is assumed not to be at the machine: nothing opens a local
17
23
  * browser for login, and `--yes` never prompts. With `--yes`, a login that
@@ -19,7 +25,8 @@
19
25
  * can finish it) or skipped with a note.
20
26
  *
21
27
  * Used directly via `crewly onboard`, by the curl install script, and by the
22
- * desktop app. Flags: `--yes`, `--template <id>`, `--harness <id>`, `--web`, `--cli`.
28
+ * desktop app. Flags: `--yes`, `--template <id>`, `--harness <id>`, `--task <text>`,
29
+ * `--web`, `--cli`.
23
30
  *
24
31
  * @module cli/commands/onboard
25
32
  */
@@ -28,6 +35,7 @@ import { type TeamTemplate } from '../utils/templates.js';
28
35
  import type { HarnessService } from '../../../backend/src/services/harness/harness.service.js';
29
36
  import { type LoginDriver } from '../utils/harness-engine.js';
30
37
  import { type HarnessSetupResult, type SetupIO } from './harness-setup.js';
38
+ import { type ConnectLinks, type ConnectState, type FirstTaskOutcome, type StarterChoice } from './onboard-checklist.js';
31
39
  /** Options passed from Commander.js for the onboard command */
32
40
  export interface OnboardOptions {
33
41
  /** Skip all interactive prompts and use defaults */
@@ -40,6 +48,8 @@ export interface OnboardOptions {
40
48
  web?: boolean;
41
49
  /** Continue setup in this terminal */
42
50
  cli?: boolean;
51
+ /** First task for the new team (with --yes; otherwise it is asked) */
52
+ task?: string;
43
53
  }
44
54
  /** Where the rest of setup happens. */
45
55
  export type SetupMode = 'web' | 'cli';
@@ -53,6 +63,14 @@ export interface OnboardDeps {
53
63
  hasDesktop?: boolean;
54
64
  /** Hand-off to the web app */
55
65
  continueInWeb?: () => Promise<void>;
66
+ /** Send / keep the first task */
67
+ deliverFirstTask?: (text: string, teamId: string | null) => Promise<FirstTaskOutcome>;
68
+ /** Record the Blank choice */
69
+ recordBlank?: () => Promise<void>;
70
+ /** Phone links for Cloud and Slack */
71
+ connectLinks?: () => ConnectLinks;
72
+ /** Cloud / Slack state from the running backend (null when unknown) */
73
+ readConnectState?: () => Promise<ConnectState | null>;
56
74
  }
57
75
  /**
58
76
  * Prints the Crewly ASCII art banner to stdout.
@@ -213,10 +231,31 @@ export declare function ensureSkills(): Promise<void>;
213
231
  */
214
232
  export declare function selectTemplate(rl: ReadlineInterface): Promise<TeamTemplate | null>;
215
233
  /**
216
- * Creates a team from a template by writing it to ~/.crewly/teams/{team-id}/config.json.
234
+ * Step 4: choose the first team. With starter templates present (the normal
235
+ * case) this is Personal Assistant (default) / Marketing / Blank; without
236
+ * them it falls back to the full template list.
237
+ *
238
+ * @param rl - Readline interface
239
+ * @returns The choice, or null when skipped
240
+ */
241
+ export declare function selectFirstTeam(rl: ReadlineInterface): Promise<StarterChoice | null>;
242
+ /**
243
+ * The id of an existing team created from a template: the CLI's own
244
+ * `teams/<template-id>/` or a team the web app created (UUID directory) that
245
+ * records the same `templateId`.
246
+ *
247
+ * @param templateId - Template id
248
+ * @returns Team id, or null when there is none
249
+ */
250
+ export declare function findTeamIdForTemplate(templateId: string): string | null;
251
+ /**
252
+ * Creates a team from a template by writing it to <crewlyHome>/teams/{template-id}/config.json
253
+ * (`CREWLY_HOME`, else ~/.crewly).
217
254
  *
218
255
  * Converts template members into full TeamMember objects with UUIDs, session names,
219
256
  * and default status fields. The team is immediately available when `crewly start` runs.
257
+ * An existing team from the same template is kept as it is (running onboard
258
+ * twice must not replace a team the owner already uses).
220
259
  *
221
260
  * @param template - The team template to create from
222
261
  * @param runtimeType - Harness the members run on (the orchestrator's harness,
@@ -257,6 +296,45 @@ export declare function scaffoldCrewlyDirectory(projectDir?: string, template?:
257
296
  * @param template - The template whose directory to copy from
258
297
  */
259
298
  export declare function copyTemplateProjectFiles(crewlyDir: string, template: TeamTemplate): void;
299
+ /**
300
+ * The team a first task goes to: the team from the template (the CLI names
301
+ * it after the template id; a web-created one has its own id), or null for
302
+ * Blank / no team.
303
+ *
304
+ * @param choice - First-team choice
305
+ * @param created - Whether the team exists
306
+ * @returns Team id, or null
307
+ */
308
+ export declare function firstTaskTeamId(choice: StarterChoice | null, created: boolean): string | null;
309
+ /**
310
+ * Step 5: the first task. Interactive mode asks (Enter skips); `--yes` uses
311
+ * `--task` and never asks.
312
+ *
313
+ * @param choice - First-team choice (for the suggestions)
314
+ * @param teamId - Team the task is for, or null for the orchestrator
315
+ * @param options - `ask` (interactive) or `task` (preset)
316
+ * @param deliver - Sends / keeps the task
317
+ * @returns The outcome, or null when skipped
318
+ */
319
+ export declare function runFirstTaskStep(choice: StarterChoice | null, teamId: string | null, options: {
320
+ ask?: (question: string) => Promise<string>;
321
+ task?: string;
322
+ }, deliver: (text: string, teamId: string | null) => Promise<FirstTaskOutcome>): Promise<FirstTaskOutcome | null>;
323
+ /**
324
+ * The phone links for Cloud and Slack on this machine: LAN address, backend
325
+ * port and the API token a non-loopback browser needs.
326
+ *
327
+ * @returns Links
328
+ */
329
+ export declare function defaultConnectLinks(): ConnectLinks;
330
+ /**
331
+ * Step 6: Crewly Cloud and Slack. Prints phone links (or done marks when the
332
+ * running backend says so) and moves on.
333
+ *
334
+ * @param links - Phone links
335
+ * @param readState - Cloud / Slack state from the running backend
336
+ */
337
+ export declare function runConnectStep(links: () => ConnectLinks, readState: () => Promise<ConnectState | null>): Promise<void>;
260
338
  /**
261
339
  * Prints the setup-complete summary with next-step instructions.
262
340
  *
@@ -277,11 +355,14 @@ export declare function printSummary(selectedTemplate?: TeamTemplate | null, pro
277
355
  * (default Claude Code), install only that one, record the choice
278
356
  * 2. Log in through the login broker (link + code printed for a phone)
279
357
  * 3. Agent skills
280
- * 4. Team template (or skip)
281
- * 5. Summary
358
+ * 4. First team: Personal Assistant (default), Marketing or Blank
359
+ * 5. First task, optional (`--task` with `--yes`)
360
+ * 6. Crewly Cloud & Slack: phone links, never waits
361
+ * 7. Summary
282
362
  *
283
363
  * `--yes` uses the defaults and never prompts: the default harness (or
284
- * `--harness`), auto-install, and a login that is either handed to the
364
+ * `--harness`), auto-install, the recommended starter team (or `--template`),
365
+ * and a login that is either handed to the
285
366
  * running backend (web app / phone finish it), a device-code login that
286
367
  * needs no reply, or skipped with a note.
287
368
  *
@@ -1 +1 @@
1
- {"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../../../../cli/src/commands/onboard.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../../../../cli/src/commands/onboard.ts"],"names":[],"mappings":"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"}