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.
- package/config/templates/growth-marketing-team.json +12 -1
- package/config/templates/personal-assistant-team.json +28 -0
- package/dist/backend/backend/src/constants.d.ts +45 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +51 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts +49 -0
- package/dist/backend/backend/src/controllers/chat/chat.controller.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/chat/chat.controller.js +135 -106
- package/dist/backend/backend/src/controllers/chat/chat.controller.js.map +1 -1
- package/dist/backend/backend/src/controllers/onboarding/index.d.ts +1 -0
- package/dist/backend/backend/src/controllers/onboarding/index.d.ts.map +1 -1
- package/dist/backend/backend/src/controllers/onboarding/index.js +1 -0
- package/dist/backend/backend/src/controllers/onboarding/index.js.map +1 -1
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.d.ts +38 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.js +106 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.d.ts +24 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.js +34 -0
- package/dist/backend/backend/src/controllers/onboarding/onboarding-checklist.routes.js.map +1 -0
- package/dist/backend/backend/src/index.d.ts.map +1 -1
- package/dist/backend/backend/src/index.js +17 -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 +5 -0
- package/dist/backend/backend/src/routes/api.routes.js.map +1 -1
- 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 +10 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.d.ts +45 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.d.ts.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js +103 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.factory.js.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts +301 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js +365 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-state.store.d.ts +89 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-state.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-state.store.js +122 -0
- package/dist/backend/backend/src/services/onboarding/onboarding-state.store.js.map +1 -0
- package/dist/backend/backend/src/services/template/template.service.d.ts +15 -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 +22 -1
- package/dist/backend/backend/src/services/template/template.service.js.map +1 -1
- package/dist/backend/backend/src/types/team-template.types.d.ts +30 -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 +24 -0
- package/dist/backend/backend/src/types/team-template.types.js.map +1 -1
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +45 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +51 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts +301 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js +365 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-checklist.service.js.map +1 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-state.store.d.ts +89 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-state.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-state.store.js +122 -0
- package/dist/cli/backend/src/services/onboarding/onboarding-state.store.js.map +1 -0
- package/dist/cli/backend/src/services/skill/skill-tier.service.d.ts +116 -0
- package/dist/cli/backend/src/services/skill/skill-tier.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/skill/skill-tier.service.js +155 -0
- package/dist/cli/backend/src/services/skill/skill-tier.service.js.map +1 -0
- package/dist/cli/backend/src/services/template/template.service.d.ts +152 -0
- package/dist/cli/backend/src/services/template/template.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/template/template.service.js +506 -0
- package/dist/cli/backend/src/services/template/template.service.js.map +1 -0
- package/dist/cli/backend/src/types/team-template.types.d.ts +30 -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 +24 -0
- package/dist/cli/backend/src/types/team-template.types.js.map +1 -1
- package/dist/cli/cli/src/commands/onboard-checklist.d.ts +152 -0
- package/dist/cli/cli/src/commands/onboard-checklist.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/onboard-checklist.js +241 -0
- package/dist/cli/cli/src/commands/onboard-checklist.js.map +1 -0
- package/dist/cli/cli/src/commands/onboard.d.ts +87 -6
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +203 -37
- 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 +2 -1
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/templates.d.ts +27 -0
- package/dist/cli/cli/src/utils/templates.d.ts.map +1 -1
- package/dist/cli/cli/src/utils/templates.js +29 -0
- package/dist/cli/cli/src/utils/templates.js.map +1 -1
- package/frontend/dist/assets/index-2bdb57b9.css +42 -0
- package/frontend/dist/assets/{index-aaf65055.js → index-5b98bf77.js} +285 -285
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
- 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":"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"}
|
|
@@ -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
|
|
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>`, `--
|
|
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
|
-
*
|
|
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.
|
|
281
|
-
* 5.
|
|
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,
|
|
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":"AAAA
|
|
1
|
+
{"version":3,"file":"onboard.d.ts","sourceRoot":"","sources":["../../../../../cli/src/commands/onboard.ts"],"names":[],"mappings":"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"}
|