crewly 1.20.123 → 1.20.124
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backend/backend/src/constants.d.ts +118 -0
- package/dist/backend/backend/src/constants.d.ts.map +1 -1
- package/dist/backend/backend/src/constants.js +118 -0
- package/dist/backend/backend/src/constants.js.map +1 -1
- package/dist/backend/backend/src/controllers/harness/harness.controller.d.ts +54 -0
- package/dist/backend/backend/src/controllers/harness/harness.controller.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/harness/harness.controller.js +204 -0
- package/dist/backend/backend/src/controllers/harness/harness.controller.js.map +1 -0
- package/dist/backend/backend/src/controllers/harness/harness.routes.d.ts +27 -0
- package/dist/backend/backend/src/controllers/harness/harness.routes.d.ts.map +1 -0
- package/dist/backend/backend/src/controllers/harness/harness.routes.js +43 -0
- package/dist/backend/backend/src/controllers/harness/harness.routes.js.map +1 -0
- 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 +5 -0
- 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 +7 -0
- package/dist/backend/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts +2 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
- package/dist/backend/backend/src/services/cloud/cloud-client.service.js +4 -3
- package/dist/backend/backend/src/services/cloud/cloud-client.service.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 +14 -0
- package/dist/backend/backend/src/services/cloud/mobile-api-relay.service.js.map +1 -1
- package/dist/backend/backend/src/services/harness/claude-config.utils.d.ts +67 -0
- package/dist/backend/backend/src/services/harness/claude-config.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/claude-config.utils.js +118 -0
- package/dist/backend/backend/src/services/harness/claude-config.utils.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-api-key.service.d.ts +99 -0
- package/dist/backend/backend/src/services/harness/harness-api-key.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-api-key.service.js +157 -0
- package/dist/backend/backend/src/services/harness/harness-api-key.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts +135 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.js +208 -0
- package/dist/backend/backend/src/services/harness/harness-credentials.store.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-exec.utils.d.ts +85 -0
- package/dist/backend/backend/src/services/harness/harness-exec.utils.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-exec.utils.js +183 -0
- package/dist/backend/backend/src/services/harness/harness-exec.utils.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-install.service.d.ts +106 -0
- package/dist/backend/backend/src/services/harness/harness-install.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-install.service.js +205 -0
- package/dist/backend/backend/src/services/harness/harness-install.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-registry.d.ts +86 -0
- package/dist/backend/backend/src/services/harness/harness-registry.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-registry.js +121 -0
- package/dist/backend/backend/src/services/harness/harness-registry.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-status.service.d.ts +173 -0
- package/dist/backend/backend/src/services/harness/harness-status.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness-status.service.js +324 -0
- package/dist/backend/backend/src/services/harness/harness-status.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness.service.d.ts +146 -0
- package/dist/backend/backend/src/services/harness/harness.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness.service.js +193 -0
- package/dist/backend/backend/src/services/harness/harness.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/harness.types.d.ts +138 -0
- package/dist/backend/backend/src/services/harness/harness.types.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/harness.types.js +51 -0
- package/dist/backend/backend/src/services/harness/harness.types.js.map +1 -0
- package/dist/backend/backend/src/services/harness/login-broker.service.d.ts +238 -0
- package/dist/backend/backend/src/services/harness/login-broker.service.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/login-broker.service.js +495 -0
- package/dist/backend/backend/src/services/harness/login-broker.service.js.map +1 -0
- package/dist/backend/backend/src/services/harness/login-rules.d.ts +162 -0
- package/dist/backend/backend/src/services/harness/login-rules.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/login-rules.js +344 -0
- package/dist/backend/backend/src/services/harness/login-rules.js.map +1 -0
- package/dist/backend/backend/src/services/harness/orc-harness.store.d.ts +59 -0
- package/dist/backend/backend/src/services/harness/orc-harness.store.d.ts.map +1 -0
- package/dist/backend/backend/src/services/harness/orc-harness.store.js +108 -0
- package/dist/backend/backend/src/services/harness/orc-harness.store.js.map +1 -0
- package/dist/backend/build-info.json +2 -2
- package/dist/cli/backend/src/constants.d.ts +118 -0
- package/dist/cli/backend/src/constants.d.ts.map +1 -1
- package/dist/cli/backend/src/constants.js +118 -0
- package/dist/cli/backend/src/constants.js.map +1 -1
- package/dist/cli/backend/src/services/agent/agent-registration.service.d.ts +5 -0
- 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 +7 -0
- package/dist/cli/backend/src/services/agent/agent-registration.service.js.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-client.service.d.ts +2 -1
- package/dist/cli/backend/src/services/cloud/cloud-client.service.d.ts.map +1 -1
- package/dist/cli/backend/src/services/cloud/cloud-client.service.js +4 -3
- package/dist/cli/backend/src/services/cloud/cloud-client.service.js.map +1 -1
- package/dist/cli/backend/src/services/harness/claude-config.utils.d.ts +67 -0
- package/dist/cli/backend/src/services/harness/claude-config.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/claude-config.utils.js +118 -0
- package/dist/cli/backend/src/services/harness/claude-config.utils.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-api-key.service.d.ts +99 -0
- package/dist/cli/backend/src/services/harness/harness-api-key.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-api-key.service.js +157 -0
- package/dist/cli/backend/src/services/harness/harness-api-key.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts +135 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.js +208 -0
- package/dist/cli/backend/src/services/harness/harness-credentials.store.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-exec.utils.d.ts +85 -0
- package/dist/cli/backend/src/services/harness/harness-exec.utils.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-exec.utils.js +183 -0
- package/dist/cli/backend/src/services/harness/harness-exec.utils.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-install.service.d.ts +106 -0
- package/dist/cli/backend/src/services/harness/harness-install.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-install.service.js +205 -0
- package/dist/cli/backend/src/services/harness/harness-install.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-registry.d.ts +86 -0
- package/dist/cli/backend/src/services/harness/harness-registry.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-registry.js +121 -0
- package/dist/cli/backend/src/services/harness/harness-registry.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-status.service.d.ts +173 -0
- package/dist/cli/backend/src/services/harness/harness-status.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness-status.service.js +324 -0
- package/dist/cli/backend/src/services/harness/harness-status.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness.service.d.ts +146 -0
- package/dist/cli/backend/src/services/harness/harness.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness.service.js +193 -0
- package/dist/cli/backend/src/services/harness/harness.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/harness.types.d.ts +138 -0
- package/dist/cli/backend/src/services/harness/harness.types.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/harness.types.js +51 -0
- package/dist/cli/backend/src/services/harness/harness.types.js.map +1 -0
- package/dist/cli/backend/src/services/harness/login-broker.service.d.ts +238 -0
- package/dist/cli/backend/src/services/harness/login-broker.service.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/login-broker.service.js +495 -0
- package/dist/cli/backend/src/services/harness/login-broker.service.js.map +1 -0
- package/dist/cli/backend/src/services/harness/login-rules.d.ts +162 -0
- package/dist/cli/backend/src/services/harness/login-rules.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/login-rules.js +344 -0
- package/dist/cli/backend/src/services/harness/login-rules.js.map +1 -0
- package/dist/cli/backend/src/services/harness/orc-harness.store.d.ts +59 -0
- package/dist/cli/backend/src/services/harness/orc-harness.store.d.ts.map +1 -0
- package/dist/cli/backend/src/services/harness/orc-harness.store.js +108 -0
- package/dist/cli/backend/src/services/harness/orc-harness.store.js.map +1 -0
- package/dist/cli/cli/src/commands/harness-setup.d.ts +159 -0
- package/dist/cli/cli/src/commands/harness-setup.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/harness-setup.js +377 -0
- package/dist/cli/cli/src/commands/harness-setup.js.map +1 -0
- package/dist/cli/cli/src/commands/harness.d.ts +56 -0
- package/dist/cli/cli/src/commands/harness.d.ts.map +1 -0
- package/dist/cli/cli/src/commands/harness.js +97 -0
- package/dist/cli/cli/src/commands/harness.js.map +1 -0
- package/dist/cli/cli/src/commands/onboard.d.ts +108 -50
- package/dist/cli/cli/src/commands/onboard.d.ts.map +1 -1
- package/dist/cli/cli/src/commands/onboard.js +200 -191
- package/dist/cli/cli/src/commands/onboard.js.map +1 -1
- package/dist/cli/cli/src/constants.d.ts +18 -0
- package/dist/cli/cli/src/constants.d.ts.map +1 -1
- package/dist/cli/cli/src/constants.js +18 -0
- package/dist/cli/cli/src/constants.js.map +1 -1
- package/dist/cli/cli/src/index.js +22 -3
- package/dist/cli/cli/src/index.js.map +1 -1
- package/dist/cli/cli/src/utils/harness-engine.d.ts +99 -0
- package/dist/cli/cli/src/utils/harness-engine.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/harness-engine.js +143 -0
- package/dist/cli/cli/src/utils/harness-engine.js.map +1 -0
- package/dist/cli/cli/src/utils/prompt-io.d.ts +25 -0
- package/dist/cli/cli/src/utils/prompt-io.d.ts.map +1 -0
- package/dist/cli/cli/src/utils/prompt-io.js +47 -0
- package/dist/cli/cli/src/utils/prompt-io.js.map +1 -0
- package/frontend/dist/assets/{index-8327e63e.css → index-0a2f783c.css} +1 -1
- package/frontend/dist/assets/{index-daf43f1a.js → index-aaf65055.js} +309 -309
- package/frontend/dist/index.html +2 -2
- package/package.json +1 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `crewly harness` and `crewly login <claude|codex>`.
|
|
3
|
+
*
|
|
4
|
+
* - `crewly harness` prints each harness (installed version, newer version,
|
|
5
|
+
* login state), the orchestrator's harness and the system tools.
|
|
6
|
+
* - `crewly login <name>` logs a harness in with the same broker the web
|
|
7
|
+
* setup page uses: it prints the sign-in link (open it on any device) and
|
|
8
|
+
* reads Claude's code from this terminal. When Crewly is running, the
|
|
9
|
+
* session lives in the backend, so it can also be finished from the web
|
|
10
|
+
* app or phone.
|
|
11
|
+
*
|
|
12
|
+
* @module cli/commands/harness
|
|
13
|
+
*/
|
|
14
|
+
import chalk from 'chalk';
|
|
15
|
+
import { createInterface } from 'readline';
|
|
16
|
+
import { getHarnessDefinition, resolveHarnessAlias } from '../../../backend/src/services/harness/harness-registry.js';
|
|
17
|
+
import { CLI_CONSTANTS } from '../constants.js';
|
|
18
|
+
import { createCliHarnessService, pickLoginDriver } from '../utils/harness-engine.js';
|
|
19
|
+
import { createReadlineIO } from '../utils/prompt-io.js';
|
|
20
|
+
import { loginHarness, printHarnessOverview } from './harness-setup.js';
|
|
21
|
+
/** Error thrown when stdin closes during `crewly login`. */
|
|
22
|
+
export class LoginInputClosedError extends Error {
|
|
23
|
+
constructor() {
|
|
24
|
+
super('Input closed before the login finished');
|
|
25
|
+
this.name = 'LoginInputClosedError';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* `crewly harness`: print harness status.
|
|
30
|
+
*
|
|
31
|
+
* @param deps - Injectable dependencies
|
|
32
|
+
* @returns Exit code
|
|
33
|
+
*/
|
|
34
|
+
export async function harnessCommand(deps = {}) {
|
|
35
|
+
const service = deps.service ?? createCliHarnessService();
|
|
36
|
+
const io = deps.io ?? { ask: async () => '', askSecret: async () => '', log: (line) => console.log(line) };
|
|
37
|
+
const overview = await service.getOverview();
|
|
38
|
+
io.log(chalk.bold('Harnesses'));
|
|
39
|
+
printHarnessOverview(io, overview);
|
|
40
|
+
io.log('');
|
|
41
|
+
io.log(`Orchestrator harness: ${overview.orcHarness ?? chalk.gray('not chosen yet (crewly onboard)')}`);
|
|
42
|
+
return CLI_CONSTANTS.EXIT_CODES.SUCCESS;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* `crewly login <name>`: log a harness in.
|
|
46
|
+
*
|
|
47
|
+
* @param name - `claude`, `codex` (or a full harness id)
|
|
48
|
+
* @param options - Command options
|
|
49
|
+
* @param deps - Injectable dependencies
|
|
50
|
+
* @returns Exit code
|
|
51
|
+
*/
|
|
52
|
+
export async function loginCommand(name, options = {}, deps = {}) {
|
|
53
|
+
const harnessId = resolveHarnessAlias(name);
|
|
54
|
+
if (!harnessId) {
|
|
55
|
+
console.log(chalk.red(`Unknown harness "${name}". Use: crewly login claude | codex`));
|
|
56
|
+
return CLI_CONSTANTS.EXIT_CODES.INVALID_ARGS;
|
|
57
|
+
}
|
|
58
|
+
const service = deps.service ?? createCliHarnessService();
|
|
59
|
+
const interactive = options.yes !== true && (deps.interactive ?? process.stdin.isTTY === true);
|
|
60
|
+
let rl = null;
|
|
61
|
+
let io;
|
|
62
|
+
if (deps.io) {
|
|
63
|
+
io = deps.io;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
67
|
+
io = createReadlineIO(rl, () => new LoginInputClosedError());
|
|
68
|
+
}
|
|
69
|
+
const getDriver = deps.getDriver ?? (() => pickLoginDriver(service));
|
|
70
|
+
let outcome = 'failed';
|
|
71
|
+
try {
|
|
72
|
+
const status = await service.getStatus(harnessId);
|
|
73
|
+
if (!status.installed) {
|
|
74
|
+
io.log(chalk.red(`${status.displayName} is not installed. Run \`crewly onboard\` or: npm install -g ${getHarnessDefinition(harnessId)?.npmPackage}`));
|
|
75
|
+
return CLI_CONSTANTS.EXIT_CODES.ERROR;
|
|
76
|
+
}
|
|
77
|
+
io.log(chalk.bold(`Logging in to ${status.displayName}`));
|
|
78
|
+
outcome = await loginHarness(io, service, getDriver, status, {
|
|
79
|
+
interactive,
|
|
80
|
+
force: options.force,
|
|
81
|
+
method: options.method,
|
|
82
|
+
timing: deps.timing,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (!(error instanceof LoginInputClosedError))
|
|
87
|
+
throw error;
|
|
88
|
+
io.log(chalk.yellow('Input closed; login not finished.'));
|
|
89
|
+
outcome = 'failed';
|
|
90
|
+
}
|
|
91
|
+
finally {
|
|
92
|
+
rl?.close();
|
|
93
|
+
service.broker.shutdown();
|
|
94
|
+
}
|
|
95
|
+
return outcome === 'failed' ? CLI_CONSTANTS.EXIT_CODES.ERROR : CLI_CONSTANTS.EXIT_CODES.SUCCESS;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"harness.js","sourceRoot":"","sources":["../../../../../cli/src/commands/harness.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +1,58 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CLI Onboard Command
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
4
|
+
* Setup wizard for new Crewly users. It can hand off to the web app (for
|
|
5
|
+
* non-technical users) or run fully in the terminal; both call the same
|
|
6
|
+
* harness engine (backend/src/services/harness):
|
|
7
|
+
*
|
|
8
|
+
* 1. AI harness — detect Claude Code / Codex / Gemini CLI, choose the one the
|
|
9
|
+
* orchestrator uses (default Claude Code), install only that one when it
|
|
10
|
+
* is missing or outdated, and record the choice.
|
|
11
|
+
* 2. Login — the harness's own login command runs in Crewly's login broker;
|
|
12
|
+
* the sign-in link (and code) is printed so it can be opened on a phone,
|
|
13
|
+
* and Claude's code is read back from this terminal.
|
|
14
|
+
* 3. Agent skills, 4. team template, 5. summary.
|
|
15
|
+
*
|
|
16
|
+
* The owner is assumed not to be at the machine: nothing opens a local
|
|
17
|
+
* browser for login, and `--yes` never prompts. With `--yes`, a login that
|
|
18
|
+
* needs a reply is started in the running backend (so the web app / phone
|
|
19
|
+
* can finish it) or skipped with a note.
|
|
20
|
+
*
|
|
21
|
+
* Used directly via `crewly onboard`, by the curl install script, and by the
|
|
22
|
+
* desktop app. Flags: `--yes`, `--template <id>`, `--harness <id>`, `--web`, `--cli`.
|
|
13
23
|
*
|
|
14
24
|
* @module cli/commands/onboard
|
|
15
25
|
*/
|
|
16
26
|
import { type Interface as ReadlineInterface } from 'readline';
|
|
17
27
|
import { type TeamTemplate } from '../utils/templates.js';
|
|
18
|
-
|
|
19
|
-
|
|
28
|
+
import type { HarnessService } from '../../../backend/src/services/harness/harness.service.js';
|
|
29
|
+
import { type LoginDriver } from '../utils/harness-engine.js';
|
|
30
|
+
import { type HarnessSetupResult, type SetupIO } from './harness-setup.js';
|
|
20
31
|
/** Options passed from Commander.js for the onboard command */
|
|
21
32
|
export interface OnboardOptions {
|
|
22
33
|
/** Skip all interactive prompts and use defaults */
|
|
23
34
|
yes?: boolean;
|
|
24
35
|
/** Select a team template by ID (e.g. "web-dev-team") */
|
|
25
36
|
template?: string;
|
|
37
|
+
/** Harness for the orchestrator (claude | codex | gemini, or a full id) */
|
|
38
|
+
harness?: string;
|
|
39
|
+
/** Continue setup in the web app */
|
|
40
|
+
web?: boolean;
|
|
41
|
+
/** Continue setup in this terminal */
|
|
42
|
+
cli?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/** Where the rest of setup happens. */
|
|
45
|
+
export type SetupMode = 'web' | 'cli';
|
|
46
|
+
/** Injectable dependencies (tests). */
|
|
47
|
+
export interface OnboardDeps {
|
|
48
|
+
/** Harness engine (defaults to an in-process one) */
|
|
49
|
+
service?: HarnessService;
|
|
50
|
+
/** Login driver resolver (defaults to backend when running, else in-process) */
|
|
51
|
+
getDriver?: () => Promise<LoginDriver>;
|
|
52
|
+
/** Whether a local desktop session is available */
|
|
53
|
+
hasDesktop?: boolean;
|
|
54
|
+
/** Hand-off to the web app */
|
|
55
|
+
continueInWeb?: () => Promise<void>;
|
|
26
56
|
}
|
|
27
57
|
/**
|
|
28
58
|
* Prints the Crewly ASCII art banner to stdout.
|
|
@@ -66,18 +96,48 @@ export declare function isInteractiveInput(stdin?: {
|
|
|
66
96
|
*/
|
|
67
97
|
export declare function reportNonInteractiveInput(reason: string, startedSetup?: boolean): void;
|
|
68
98
|
/**
|
|
69
|
-
*
|
|
99
|
+
* Whether a person is likely sitting at a local desktop session.
|
|
70
100
|
*
|
|
71
|
-
*
|
|
101
|
+
* False over SSH and inside a Crewly agent shell; on Linux a display
|
|
102
|
+
* (`DISPLAY` / `WAYLAND_DISPLAY`) is required.
|
|
72
103
|
*
|
|
73
|
-
* @param
|
|
74
|
-
* @
|
|
104
|
+
* @param env - Environment
|
|
105
|
+
* @param platform - OS platform
|
|
106
|
+
* @returns True when a local browser would reach the user
|
|
107
|
+
*/
|
|
108
|
+
export declare function hasLocalDesktop(env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform): boolean;
|
|
109
|
+
/**
|
|
110
|
+
* Decide whether setup continues in the web app or in this terminal.
|
|
111
|
+
*
|
|
112
|
+
* `--web` / `--cli` win; `--yes` means the terminal; otherwise the user is
|
|
113
|
+
* asked, with the web app as the default when a desktop is available.
|
|
114
|
+
*
|
|
115
|
+
* @param ask - Prompt function
|
|
116
|
+
* @param options - Command options
|
|
117
|
+
* @param desktop - Whether a local desktop session is available
|
|
118
|
+
* @returns Setup mode
|
|
75
119
|
*/
|
|
76
|
-
export declare function
|
|
120
|
+
export declare function chooseSetupMode(ask: (question: string) => Promise<string>, options: OnboardOptions, desktop: boolean): Promise<SetupMode>;
|
|
121
|
+
/**
|
|
122
|
+
* Hand setup over to the web app.
|
|
123
|
+
*
|
|
124
|
+
* Opens the setup page when Crewly is already running; otherwise starts
|
|
125
|
+
* Crewly in this terminal (like `crewly start`) and opens the page once it
|
|
126
|
+
* answers. The URL is always printed, so it also works from another device.
|
|
127
|
+
* Loopback needs no API token.
|
|
128
|
+
*
|
|
129
|
+
* @param deps - Browser opener, backend probe, starter (tests)
|
|
130
|
+
*/
|
|
131
|
+
export declare function continueInWebApp(deps?: {
|
|
132
|
+
openUrl?: (url: string) => Promise<unknown>;
|
|
133
|
+
isRunning?: () => Promise<boolean>;
|
|
134
|
+
start?: () => Promise<void>;
|
|
135
|
+
port?: number;
|
|
136
|
+
}): Promise<void>;
|
|
77
137
|
/**
|
|
78
138
|
* Checks whether a CLI tool is installed by running `which <command>`.
|
|
79
139
|
*
|
|
80
|
-
* @param command - The command name to look for (e.g. "
|
|
140
|
+
* @param command - The command name to look for (e.g. "jq")
|
|
81
141
|
* @returns True if the command is found on the PATH
|
|
82
142
|
*/
|
|
83
143
|
export declare function checkToolInstalled(command: string): boolean;
|
|
@@ -89,14 +149,6 @@ export declare function checkToolInstalled(command: string): boolean;
|
|
|
89
149
|
* @returns The version string or null if not determinable
|
|
90
150
|
*/
|
|
91
151
|
export declare function getToolVersion(command: string, versionFlag?: string): string | null;
|
|
92
|
-
/**
|
|
93
|
-
* Installs a tool via npm globally.
|
|
94
|
-
*
|
|
95
|
-
* @param displayName - Human-readable tool name for output
|
|
96
|
-
* @param npmPackage - The npm package name to install
|
|
97
|
-
* @returns True if installation succeeded
|
|
98
|
-
*/
|
|
99
|
-
export declare function installTool(displayName: string, npmPackage: string): boolean;
|
|
100
152
|
/** A system (non-npm) tool the Crewly agent runtime cannot work without. */
|
|
101
153
|
export interface SystemToolInfo {
|
|
102
154
|
displayName: string;
|
|
@@ -130,17 +182,19 @@ export declare const REQUIRED_SYSTEM_TOOLS: readonly SystemToolInfo[];
|
|
|
130
182
|
*/
|
|
131
183
|
export declare function ensureSystemTools(): number;
|
|
132
184
|
/**
|
|
133
|
-
*
|
|
134
|
-
*
|
|
135
|
-
*
|
|
136
|
-
*
|
|
137
|
-
*
|
|
138
|
-
*
|
|
139
|
-
* @param
|
|
140
|
-
* @
|
|
141
|
-
* @param autoYes - When true, skip prompts and install missing tools automatically
|
|
185
|
+
* Steps 1 and 2: system tools, then the harness engine's setup (detect →
|
|
186
|
+
* choose → install the orc's harness only → record → log in).
|
|
187
|
+
*
|
|
188
|
+
* @param io - Prompting and output
|
|
189
|
+
* @param service - Harness engine
|
|
190
|
+
* @param getDriver - Login driver resolver
|
|
191
|
+
* @param options - `interactive`, `harness` preset
|
|
192
|
+
* @returns What was set up
|
|
142
193
|
*/
|
|
143
|
-
export declare function
|
|
194
|
+
export declare function runHarnessStep(io: SetupIO, service: HarnessService, getDriver: () => Promise<LoginDriver>, options: {
|
|
195
|
+
interactive: boolean;
|
|
196
|
+
harness?: string;
|
|
197
|
+
}): Promise<HarnessSetupResult>;
|
|
144
198
|
/**
|
|
145
199
|
* Checks for and installs agent skills from the marketplace.
|
|
146
200
|
*
|
|
@@ -165,10 +219,11 @@ export declare function selectTemplate(rl: ReadlineInterface): Promise<TeamTempl
|
|
|
165
219
|
* and default status fields. The team is immediately available when `crewly start` runs.
|
|
166
220
|
*
|
|
167
221
|
* @param template - The team template to create from
|
|
168
|
-
* @param
|
|
222
|
+
* @param runtimeType - Harness the members run on (the orchestrator's harness,
|
|
223
|
+
* the only one first-time setup installs)
|
|
169
224
|
* @returns True if the team was created successfully
|
|
170
225
|
*/
|
|
171
|
-
export declare function createTeamFromTemplate(template: TeamTemplate,
|
|
226
|
+
export declare function createTeamFromTemplate(template: TeamTemplate, runtimeType?: string): boolean;
|
|
172
227
|
/**
|
|
173
228
|
* Scaffolds the .crewly/ directory in the current working directory.
|
|
174
229
|
*
|
|
@@ -215,18 +270,20 @@ export declare function printSummary(selectedTemplate?: TeamTemplate | null, pro
|
|
|
215
270
|
/**
|
|
216
271
|
* Runs the onboarding wizard.
|
|
217
272
|
*
|
|
218
|
-
*
|
|
219
|
-
*
|
|
220
|
-
*
|
|
221
|
-
*
|
|
222
|
-
*
|
|
223
|
-
*
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
*
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
* -
|
|
273
|
+
* First asks whether to continue in the web app or here (`--web` / `--cli`
|
|
274
|
+
* skip the question; the web app is the default when a desktop is
|
|
275
|
+
* available). In the terminal it walks through:
|
|
276
|
+
* 1. AI harness: jq check, detect harnesses, choose the orchestrator's
|
|
277
|
+
* (default Claude Code), install only that one, record the choice
|
|
278
|
+
* 2. Log in through the login broker (link + code printed for a phone)
|
|
279
|
+
* 3. Agent skills
|
|
280
|
+
* 4. Team template (or skip)
|
|
281
|
+
* 5. Summary
|
|
282
|
+
*
|
|
283
|
+
* `--yes` uses the defaults and never prompts: the default harness (or
|
|
284
|
+
* `--harness`), auto-install, and a login that is either handed to the
|
|
285
|
+
* running backend (web app / phone finish it), a device-code login that
|
|
286
|
+
* needs no reply, or skipped with a note.
|
|
230
287
|
*
|
|
231
288
|
* Interactive mode requires stdin to be a terminal. When it is not (a pipe,
|
|
232
289
|
* as under `curl ... | bash` without `< /dev/tty`), or when the input closes
|
|
@@ -234,6 +291,7 @@ export declare function printSummary(selectedTemplate?: TeamTemplate | null, pro
|
|
|
234
291
|
* of finishing with nothing set up (#772).
|
|
235
292
|
*
|
|
236
293
|
* @param options - Command options from Commander.js
|
|
294
|
+
* @param deps - Injectable dependencies (tests)
|
|
237
295
|
*/
|
|
238
|
-
export declare function onboardCommand(options?: OnboardOptions): Promise<void>;
|
|
296
|
+
export declare function onboardCommand(options?: OnboardOptions, deps?: OnboardDeps): Promise<void>;
|
|
239
297
|
//# sourceMappingURL=onboard.d.ts.map
|
|
@@ -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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"}
|