@aligndottech/cli 0.47.1 → 0.48.0
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/commands/agents.d.ts +20 -0
- package/dist/commands/agents.d.ts.map +1 -0
- package/dist/commands/agents.js +60 -0
- package/dist/commands/agents.js.map +1 -0
- package/dist/commands/registry.d.ts.map +1 -1
- package/dist/commands/registry.js +3 -0
- package/dist/commands/registry.js.map +1 -1
- package/dist/commands/setup.js.map +1 -1
- package/dist/commands/use.js +1 -1
- package/dist/commands/use.js.map +1 -1
- package/dist/lib/launch/adapters/claude-code.d.ts +8 -0
- package/dist/lib/launch/adapters/claude-code.d.ts.map +1 -1
- package/dist/lib/launch/adapters/claude-code.js.map +1 -1
- package/dist/lib/launch/adapters/codex.d.ts +17 -0
- package/dist/lib/launch/adapters/codex.d.ts.map +1 -0
- package/dist/lib/launch/adapters/codex.js +44 -0
- package/dist/lib/launch/adapters/codex.js.map +1 -0
- package/dist/lib/launch/adapters/copilot.d.ts +17 -0
- package/dist/lib/launch/adapters/copilot.d.ts.map +1 -0
- package/dist/lib/launch/adapters/copilot.js +29 -0
- package/dist/lib/launch/adapters/copilot.js.map +1 -0
- package/dist/lib/launch/adapters/gemini-cli.d.ts +25 -0
- package/dist/lib/launch/adapters/gemini-cli.d.ts.map +1 -0
- package/dist/lib/launch/adapters/gemini-cli.js +73 -0
- package/dist/lib/launch/adapters/gemini-cli.js.map +1 -0
- package/dist/lib/launch/agents.d.ts +12 -2
- package/dist/lib/launch/agents.d.ts.map +1 -1
- package/dist/lib/launch/agents.js +17 -1
- package/dist/lib/launch/agents.js.map +1 -1
- package/dist/lib/launch/codex-state.d.ts +31 -0
- package/dist/lib/launch/codex-state.d.ts.map +1 -0
- package/dist/lib/launch/codex-state.js +92 -0
- package/dist/lib/launch/codex-state.js.map +1 -0
- package/dist/lib/launch/copilot-state.d.ts +19 -0
- package/dist/lib/launch/copilot-state.d.ts.map +1 -0
- package/dist/lib/launch/copilot-state.js +51 -0
- package/dist/lib/launch/copilot-state.js.map +1 -0
- package/dist/lib/launch/gemini-state.d.ts +32 -0
- package/dist/lib/launch/gemini-state.d.ts.map +1 -0
- package/dist/lib/launch/gemini-state.js +59 -0
- package/dist/lib/launch/gemini-state.js.map +1 -0
- package/dist/lib/launch/gemini-trust.d.ts +26 -0
- package/dist/lib/launch/gemini-trust.d.ts.map +1 -0
- package/dist/lib/launch/gemini-trust.js +103 -0
- package/dist/lib/launch/gemini-trust.js.map +1 -0
- package/dist/lib/launch/install.d.ts +33 -0
- package/dist/lib/launch/install.d.ts.map +1 -0
- package/dist/lib/launch/install.js +48 -0
- package/dist/lib/launch/install.js.map +1 -0
- package/dist/lib/launch/launch-files.d.ts +15 -0
- package/dist/lib/launch/launch-files.d.ts.map +1 -1
- package/dist/lib/launch/launch-files.js +64 -4
- package/dist/lib/launch/launch-files.js.map +1 -1
- package/dist/lib/launch/launch.d.ts +27 -6
- package/dist/lib/launch/launch.d.ts.map +1 -1
- package/dist/lib/launch/launch.js +64 -28
- package/dist/lib/launch/launch.js.map +1 -1
- package/dist/lib/launch/pick-agent.d.ts +12 -5
- package/dist/lib/launch/pick-agent.d.ts.map +1 -1
- package/dist/lib/launch/pick-agent.js +46 -19
- package/dist/lib/launch/pick-agent.js.map +1 -1
- package/dist/lib/launch/picker-options.d.ts +30 -0
- package/dist/lib/launch/picker-options.d.ts.map +1 -0
- package/dist/lib/launch/picker-options.js +42 -0
- package/dist/lib/launch/picker-options.js.map +1 -0
- package/dist/lib/launch/prompts.d.ts +11 -0
- package/dist/lib/launch/prompts.d.ts.map +1 -0
- package/dist/lib/launch/prompts.js +27 -0
- package/dist/lib/launch/prompts.js.map +1 -0
- package/dist/lib/launch/registry/agents/claude-code.js +1 -1
- package/dist/lib/launch/registry/agents/claude-code.js.map +1 -1
- package/dist/lib/launch/registry/agents/codex.d.ts.map +1 -1
- package/dist/lib/launch/registry/agents/codex.js +4 -2
- package/dist/lib/launch/registry/agents/codex.js.map +1 -1
- package/dist/lib/launch/registry/agents/copilot.d.ts +3 -0
- package/dist/lib/launch/registry/agents/copilot.d.ts.map +1 -0
- package/dist/lib/launch/registry/agents/copilot.js +11 -0
- package/dist/lib/launch/registry/agents/copilot.js.map +1 -0
- package/dist/lib/launch/registry/agents/cursor.js +1 -1
- package/dist/lib/launch/registry/agents/cursor.js.map +1 -1
- package/dist/lib/launch/registry/agents/gemini-cli.d.ts.map +1 -1
- package/dist/lib/launch/registry/agents/gemini-cli.js +4 -2
- package/dist/lib/launch/registry/agents/gemini-cli.js.map +1 -1
- package/dist/lib/launch/registry/agents/opencode.js +1 -1
- package/dist/lib/launch/registry/agents/opencode.js.map +1 -1
- package/dist/lib/launch/registry/agents/pi.js +1 -1
- package/dist/lib/launch/registry/agents/pi.js.map +1 -1
- package/dist/lib/launch/registry/index.d.ts +1 -1
- package/dist/lib/launch/registry/index.d.ts.map +1 -1
- package/dist/lib/launch/registry/index.js +3 -2
- package/dist/lib/launch/registry/index.js.map +1 -1
- package/dist/lib/launch/registry/types.d.ts +13 -2
- package/dist/lib/launch/registry/types.d.ts.map +1 -1
- package/dist/lib/launch/run-agent.d.ts +4 -0
- package/dist/lib/launch/run-agent.d.ts.map +1 -1
- package/dist/lib/launch/run-agent.js +1 -1
- package/dist/lib/launch/run-agent.js.map +1 -1
- package/dist/lib/launch/strict-entry.d.ts +49 -0
- package/dist/lib/launch/strict-entry.d.ts.map +1 -0
- package/dist/lib/launch/strict-entry.js +106 -0
- package/dist/lib/launch/strict-entry.js.map +1 -0
- package/package.json +3 -2
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { existsSync, readFileSync, realpathSync } from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { parseJsonc } from './strict-entry.js';
|
|
4
|
+
const LEVELS = new Set(['TRUST_FOLDER', 'TRUST_PARENT', 'DO_NOT_TRUST']);
|
|
5
|
+
/** Gemini reads these files through strip-json-comments, so comments are allowed. */
|
|
6
|
+
function readJson(file) {
|
|
7
|
+
try {
|
|
8
|
+
return parseJsonc(readFileSync(file, 'utf8'));
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
const pathFor = (platform) => (platform === 'win32' ? path.win32 : path.posix);
|
|
15
|
+
/** Gemini's own default system settings file, used when GEMINI_CLI_SYSTEM_SETTINGS_PATH is unset. */
|
|
16
|
+
export function geminiSystemSettingsPath(env, platform) {
|
|
17
|
+
if (env['GEMINI_CLI_SYSTEM_SETTINGS_PATH'])
|
|
18
|
+
return env['GEMINI_CLI_SYSTEM_SETTINGS_PATH'];
|
|
19
|
+
if (platform === 'darwin')
|
|
20
|
+
return '/Library/Application Support/GeminiCli/settings.json';
|
|
21
|
+
if (platform === 'win32')
|
|
22
|
+
return 'C:\\ProgramData\\gemini-cli\\settings.json';
|
|
23
|
+
return '/etc/gemini-cli/settings.json';
|
|
24
|
+
}
|
|
25
|
+
/** GEMINI_CLI_SYSTEM_DEFAULTS_PATH, else `system-defaults.json` beside the system settings file. */
|
|
26
|
+
export function geminiSystemDefaultsPath(systemSettingsPath, platform) {
|
|
27
|
+
const p = pathFor(platform);
|
|
28
|
+
return p.join(p.dirname(systemSettingsPath), 'system-defaults.json');
|
|
29
|
+
}
|
|
30
|
+
/** ~/.gemini, or $GEMINI_CLI_HOME/.gemini when set. */
|
|
31
|
+
export function geminiDir(home, env) {
|
|
32
|
+
return path.join(env['GEMINI_CLI_HOME'] ? env['GEMINI_CLI_HOME'] : home, '.gemini');
|
|
33
|
+
}
|
|
34
|
+
const folderTrustSetting = (s) => s?.['security']?.['folderTrust']?.['enabled'];
|
|
35
|
+
/** security.folderTrust.enabled, merged system-defaults < user < system as Gemini does; default on. */
|
|
36
|
+
function folderTrustEnabled(home, env, platform) {
|
|
37
|
+
const system = geminiSystemSettingsPath(env, platform);
|
|
38
|
+
const defaults = env['GEMINI_CLI_SYSTEM_DEFAULTS_PATH'] ? env['GEMINI_CLI_SYSTEM_DEFAULTS_PATH'] : geminiSystemDefaultsPath(system, platform);
|
|
39
|
+
let enabled = true;
|
|
40
|
+
for (const file of [defaults, path.join(geminiDir(home, env), 'settings.json'), system]) {
|
|
41
|
+
const v = folderTrustSetting(readJson(file));
|
|
42
|
+
if (typeof v === 'boolean')
|
|
43
|
+
enabled = v;
|
|
44
|
+
}
|
|
45
|
+
return enabled;
|
|
46
|
+
}
|
|
47
|
+
function realPath(p) {
|
|
48
|
+
try {
|
|
49
|
+
return existsSync(p) ? realpathSync(p) : p;
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return p;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** Gemini's normalizePath: absolute, and lower-cased where the filesystem is case-insensitive. */
|
|
56
|
+
function normalize(p, platform) {
|
|
57
|
+
const abs = pathFor(platform).resolve(p);
|
|
58
|
+
return platform === 'win32' || platform === 'darwin' ? abs.toLowerCase() : abs;
|
|
59
|
+
}
|
|
60
|
+
/** Gemini's isSubpath: `child` is `parent` or below it. A shared string prefix is not enough. */
|
|
61
|
+
function isSubpath(parent, child, platform) {
|
|
62
|
+
const p = pathFor(platform);
|
|
63
|
+
const rel = p.relative(parent, child);
|
|
64
|
+
return !rel.startsWith(`..${p.sep}`) && rel !== '..' && !p.isAbsolute(rel);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Gemini CLI 0.58.0's folder-trust verdict for `cwd`, read from its own files and never written
|
|
68
|
+
* (packages/core/src/utils/trust.ts, cli/src/config/trustedFolders.ts):
|
|
69
|
+
* - GEMINI_CLI_TRUST_WORKSPACE=true|false decides outright;
|
|
70
|
+
* - folder trust turned off in settings means nothing is disabled;
|
|
71
|
+
* - else the LONGEST matching rule in trustedFolders.json decides, where TRUST_PARENT matches
|
|
72
|
+
* the rule's parent directory, and no matching rule is untrusted.
|
|
73
|
+
* Gemini also accepts a trust decision from a connected IDE; align cannot see that, so in an IDE
|
|
74
|
+
* terminal this can say untrusted for a folder Gemini will treat as trusted (one extra line).
|
|
75
|
+
*/
|
|
76
|
+
export function geminiFolderTrust(cwd, home, env, platform) {
|
|
77
|
+
if (env['GEMINI_CLI_TRUST_WORKSPACE'] === 'true')
|
|
78
|
+
return 'trusted';
|
|
79
|
+
if (env['GEMINI_CLI_TRUST_WORKSPACE'] === 'false')
|
|
80
|
+
return 'untrusted';
|
|
81
|
+
if (!folderTrustEnabled(home, env, platform))
|
|
82
|
+
return 'off';
|
|
83
|
+
const file = env['GEMINI_CLI_TRUSTED_FOLDERS_PATH'] ? env['GEMINI_CLI_TRUSTED_FOLDERS_PATH'] : path.join(geminiDir(home, env), 'trustedFolders.json');
|
|
84
|
+
if (!existsSync(file))
|
|
85
|
+
return 'untrusted';
|
|
86
|
+
const rules = readJson(file);
|
|
87
|
+
if (!rules || !Object.values(rules).every((v) => typeof v === 'string' && LEVELS.has(v)))
|
|
88
|
+
return 'unknown';
|
|
89
|
+
const p = pathFor(platform);
|
|
90
|
+
const location = normalize(realPath(cwd), platform);
|
|
91
|
+
let longest = -1;
|
|
92
|
+
let verdict;
|
|
93
|
+
for (const [raw, level] of Object.entries(rules)) {
|
|
94
|
+
const rule = normalize(raw, platform);
|
|
95
|
+
const effective = normalize(realPath(level === 'TRUST_PARENT' ? p.dirname(rule) : rule), platform);
|
|
96
|
+
if (isSubpath(effective, location, platform) && rule.length > longest) {
|
|
97
|
+
longest = rule.length;
|
|
98
|
+
verdict = level;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return verdict === 'TRUST_FOLDER' || verdict === 'TRUST_PARENT' ? 'trusted' : 'untrusted';
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=gemini-trust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gemini-trust.js","sourceRoot":"","sources":["../../../src/lib/launch/gemini-trust.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ChildProcess, SpawnOptions } from 'node:child_process';
|
|
2
|
+
import type { AgentSpec } from './registry/types.js';
|
|
3
|
+
/**
|
|
4
|
+
* How an agent is installed (plan Decision 4). `npm`: one package-manager argv, which Align may
|
|
5
|
+
* run after the user says yes. `docs`: a script or URL installer; piping a remote script into a
|
|
6
|
+
* shell is the user's decision, so Align only ever prints it.
|
|
7
|
+
*/
|
|
8
|
+
export type AgentInstall = {
|
|
9
|
+
kind: 'npm';
|
|
10
|
+
argv: readonly string[];
|
|
11
|
+
} | {
|
|
12
|
+
kind: 'docs';
|
|
13
|
+
url: string;
|
|
14
|
+
text?: string;
|
|
15
|
+
};
|
|
16
|
+
/** `cancelled`: Ctrl-C at the question, which leaves the picker; `declined`: a plain No. */
|
|
17
|
+
export type InstallOutcome = 'installed' | 'declined' | 'cancelled' | 'manual' | 'failed';
|
|
18
|
+
export interface InstallOfferDeps {
|
|
19
|
+
isTTY: boolean;
|
|
20
|
+
platform: string;
|
|
21
|
+
/** true only on an explicit yes, false on No (the default), null on Ctrl-C. */
|
|
22
|
+
confirm(message: string): Promise<boolean | null>;
|
|
23
|
+
spawn(command: string, args: string[], options: SpawnOptions): ChildProcess;
|
|
24
|
+
onPath(bin: string): string | null;
|
|
25
|
+
say(line: string): void;
|
|
26
|
+
}
|
|
27
|
+
export declare function installText(i: AgentInstall): string;
|
|
28
|
+
/**
|
|
29
|
+
* Offer to install an agent the user picked. Never runs anything without a TTY and a yes, and
|
|
30
|
+
* never runs a script or URL installer. The argv runs with no shell, output visible.
|
|
31
|
+
*/
|
|
32
|
+
export declare function offerInstall(spec: Pick<AgentSpec, 'label' | 'install'>, d: InstallOfferDeps): Promise<InstallOutcome>;
|
|
33
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/install.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGrD;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AACnH,4FAA4F;AAC5F,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE1F,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,+EAA+E;IAC/E,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAClD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,GAAG,YAAY,CAAC;IAC5E,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACnC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,YAAY,GAAG,MAAM,CAEnD;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,SAAS,CAAC,EAAE,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,cAAc,CAAC,CAmC3H"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { winShimCommand } from './run-agent.js';
|
|
2
|
+
export function installText(i) {
|
|
3
|
+
return i.kind === 'npm' ? i.argv.join(' ') : (i.text ?? i.url);
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Offer to install an agent the user picked. Never runs anything without a TTY and a yes, and
|
|
7
|
+
* never runs a script or URL installer. The argv runs with no shell, output visible.
|
|
8
|
+
*/
|
|
9
|
+
export async function offerInstall(spec, d) {
|
|
10
|
+
const text = installText(spec.install);
|
|
11
|
+
const manager = spec.install.kind === 'npm' ? d.onPath(spec.install.argv[0]) : null;
|
|
12
|
+
if (spec.install.kind !== 'npm' || !d.isTTY || !manager) {
|
|
13
|
+
d.say(`${spec.label} is not installed. Install it with: ${text}`);
|
|
14
|
+
return 'manual';
|
|
15
|
+
}
|
|
16
|
+
const answer = await d.confirm(`Install ${spec.label} now? (runs: ${text})`);
|
|
17
|
+
if (answer === null)
|
|
18
|
+
return 'cancelled';
|
|
19
|
+
if (answer !== true)
|
|
20
|
+
return 'declined';
|
|
21
|
+
const args = spec.install.argv.slice(1);
|
|
22
|
+
let code;
|
|
23
|
+
try {
|
|
24
|
+
// Run the npm the PATH scan found, by its path: the one the question just named. npm on
|
|
25
|
+
// Windows is npm.cmd, which cannot be spawned without a shell, so it goes through the same
|
|
26
|
+
// quoted cmd.exe line the agent launch uses (which refuses a path cmd.exe would reinterpret).
|
|
27
|
+
const shim = d.platform === 'win32' && /\.(cmd|bat)$/i.test(manager);
|
|
28
|
+
const cmd = shim ? winShimCommand({ bin: manager, args }) : { command: manager, args };
|
|
29
|
+
const options = { shell: false, stdio: 'inherit' };
|
|
30
|
+
if (shim)
|
|
31
|
+
options.windowsVerbatimArguments = true;
|
|
32
|
+
code = await new Promise((resolve, reject) => {
|
|
33
|
+
const child = d.spawn(cmd.command, cmd.args, options);
|
|
34
|
+
child.on('error', reject);
|
|
35
|
+
child.on('exit', (c) => resolve(c ?? 1));
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
d.say(`Could not run ${text} (${e.message}). ${spec.label} is not installed.`);
|
|
40
|
+
return 'failed';
|
|
41
|
+
}
|
|
42
|
+
if (code !== 0) {
|
|
43
|
+
d.say(`${spec.install.argv[0]} exited ${code}. ${spec.label} is not installed.`);
|
|
44
|
+
return 'failed';
|
|
45
|
+
}
|
|
46
|
+
return 'installed';
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../../../src/lib/launch/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,5 +11,20 @@ export declare function launchCacheDir(env: Record<string, string | undefined>):
|
|
|
11
11
|
*/
|
|
12
12
|
export declare function writeIfChanged(dir: string, name: string, content: string, opts?: {
|
|
13
13
|
uid?: number;
|
|
14
|
+
mode?: number;
|
|
14
15
|
}): boolean;
|
|
16
|
+
/** How long a copy nobody launched with is kept: long enough for any session still reading it to have started. */
|
|
17
|
+
export declare const STALE_AFTER_MS: number;
|
|
18
|
+
/**
|
|
19
|
+
* Tidy launch files named `<prefix>...` without pulling one from under a concurrent session:
|
|
20
|
+
* - `keep`: the file this launch uses; its mtime is refreshed, so it is never aged out while in use;
|
|
21
|
+
* - `remove`: this launch's own file when it is NOT used (its source no longer injects);
|
|
22
|
+
* - any other `<prefix>` file untouched for longer than STALE_AFTER_MS.
|
|
23
|
+
* A missing dir is fine.
|
|
24
|
+
*/
|
|
25
|
+
export declare function pruneLaunchFiles(dir: string, prefix: string, opts?: {
|
|
26
|
+
keep?: string;
|
|
27
|
+
remove?: string;
|
|
28
|
+
now?: number;
|
|
29
|
+
}): void;
|
|
15
30
|
//# sourceMappingURL=launch-files.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch-files.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/launch-files.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAG9E;AAgBD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"launch-files.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/launch-files.ts"],"names":[],"mappings":"AAIA;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAG9E;AAgBD;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAqC9H;AAED,kHAAkH;AAClH,eAAO,MAAM,cAAc,QAAsB,CAAC;AAElD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,IAAI,CAuB/H"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import envPaths from 'env-paths';
|
|
2
|
-
import { mkdirSync, readFileSync, renameSync, statSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { chmodSync, lstatSync, mkdirSync, readdirSync, readFileSync, renameSync, rmSync, statSync, utimesSync, writeFileSync } from 'node:fs';
|
|
3
3
|
import path from 'node:path';
|
|
4
4
|
/**
|
|
5
5
|
* $XDG_CACHE_HOME/align-cli/launch, honoured on every platform; else the OS cache dir.
|
|
@@ -33,24 +33,84 @@ function defaultCacheDir() {
|
|
|
33
33
|
export function writeIfChanged(dir, name, content, opts = {}) {
|
|
34
34
|
mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
35
35
|
const uid = 'uid' in opts ? opts.uid : process.getuid?.();
|
|
36
|
-
|
|
36
|
+
const posix = process.platform !== 'win32';
|
|
37
|
+
const st = statSync(dir);
|
|
38
|
+
if (uid !== undefined && posix && st.uid !== uid) {
|
|
37
39
|
throw new Error(`${dir} is owned by another user; refusing to use it for launch files`);
|
|
38
40
|
}
|
|
41
|
+
// A dir made before mkdir's 0700 (or by hand) can be looser; it is ours, so tighten it.
|
|
42
|
+
if (posix && (st.mode & 0o077) !== 0)
|
|
43
|
+
chmodSync(dir, 0o700);
|
|
39
44
|
const target = path.join(dir, name);
|
|
40
45
|
// A name may carry sub-directories (OpenCode loads plugins/align.js from a config dir).
|
|
41
46
|
const targetDir = path.dirname(target);
|
|
42
47
|
if (targetDir !== dir)
|
|
43
48
|
mkdirSync(targetDir, { recursive: true, mode: 0o700 });
|
|
44
49
|
try {
|
|
45
|
-
|
|
50
|
+
// Only a regular file counts as up to date: a link here (planted, or left by hand) is replaced.
|
|
51
|
+
if (lstatSync(target).isFile() && readFileSync(target, 'utf8') === content) {
|
|
52
|
+
if (opts.mode !== undefined && posix && (statSync(target).mode & 0o777) !== opts.mode)
|
|
53
|
+
chmodSync(target, opts.mode);
|
|
46
54
|
return false;
|
|
55
|
+
}
|
|
47
56
|
}
|
|
48
57
|
catch {
|
|
49
58
|
// missing: write it
|
|
50
59
|
}
|
|
51
60
|
const tmp = path.join(targetDir, `.${path.basename(name)}.${process.pid}.tmp`);
|
|
52
|
-
|
|
61
|
+
// Never through whatever sits at the temp path: create it exclusively (wx), with the mode from
|
|
62
|
+
// the first byte (a umask only removes bits). Something already there (a crashed launch's
|
|
63
|
+
// leftover, or a planted link) is removed, not followed, and the exclusive create is retried.
|
|
64
|
+
const create = () => writeFileSync(tmp, content, { encoding: 'utf8', flag: 'wx', ...(opts.mode === undefined ? {} : { mode: opts.mode }) });
|
|
65
|
+
try {
|
|
66
|
+
create();
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
if (e.code !== 'EEXIST')
|
|
70
|
+
throw e;
|
|
71
|
+
rmSync(tmp, { force: true });
|
|
72
|
+
create();
|
|
73
|
+
}
|
|
53
74
|
renameSync(tmp, target);
|
|
54
75
|
return true;
|
|
55
76
|
}
|
|
77
|
+
/** How long a copy nobody launched with is kept: long enough for any session still reading it to have started. */
|
|
78
|
+
export const STALE_AFTER_MS = 24 * 60 * 60 * 1000;
|
|
79
|
+
/**
|
|
80
|
+
* Tidy launch files named `<prefix>...` without pulling one from under a concurrent session:
|
|
81
|
+
* - `keep`: the file this launch uses; its mtime is refreshed, so it is never aged out while in use;
|
|
82
|
+
* - `remove`: this launch's own file when it is NOT used (its source no longer injects);
|
|
83
|
+
* - any other `<prefix>` file untouched for longer than STALE_AFTER_MS.
|
|
84
|
+
* A missing dir is fine.
|
|
85
|
+
*/
|
|
86
|
+
export function pruneLaunchFiles(dir, prefix, opts = {}) {
|
|
87
|
+
const now = opts.now ?? Date.now();
|
|
88
|
+
let names;
|
|
89
|
+
try {
|
|
90
|
+
names = readdirSync(dir);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
for (const n of names) {
|
|
96
|
+
if (!n.startsWith(prefix))
|
|
97
|
+
continue;
|
|
98
|
+
const file = path.join(dir, n);
|
|
99
|
+
if (n === opts.keep) {
|
|
100
|
+
utimesSync(file, new Date(now), new Date(now));
|
|
101
|
+
}
|
|
102
|
+
else if (n === opts.remove) {
|
|
103
|
+
rmSync(file, { force: true });
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
try {
|
|
107
|
+
if (now - lstatSync(file).mtimeMs > STALE_AFTER_MS)
|
|
108
|
+
rmSync(file, { force: true });
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// gone already
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
56
116
|
//# sourceMappingURL=launch-files.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch-files.js","sourceRoot":"","sources":["../../../src/lib/launch/launch-files.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"launch-files.js","sourceRoot":"","sources":["../../../src/lib/launch/launch-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,15 @@
|
|
|
1
|
-
import type { AgentName } from '../sessions/types.js';
|
|
2
|
-
import { type LaunchAgent } from './agents.js';
|
|
3
1
|
import type { LaunchSpec } from './adapters/claude-code.js';
|
|
4
2
|
import { type ConfigWrite } from './config-writes.js';
|
|
3
|
+
import { type CodexProjectState } from './codex-state.js';
|
|
4
|
+
import { type CopilotProjectState } from './copilot-state.js';
|
|
5
5
|
import { type CursorProjectState } from './cursor-state.js';
|
|
6
|
+
import { type InstallOfferDeps } from './install.js';
|
|
7
|
+
import { type PickerOption } from './picker-options.js';
|
|
8
|
+
import { type GeminiProjectState } from './gemini-state.js';
|
|
6
9
|
import { type OpenCodeProjectState } from './opencode-state.js';
|
|
7
10
|
import { type PiProjectState } from './pi-state.js';
|
|
8
11
|
import { type ProjectState } from './project-state.js';
|
|
12
|
+
import type { LaunchAgentId } from './registry/types.js';
|
|
9
13
|
export interface LaunchDeps {
|
|
10
14
|
env: Record<string, string | undefined>;
|
|
11
15
|
argv: string[];
|
|
@@ -26,15 +30,32 @@ export interface LaunchDeps {
|
|
|
26
30
|
readPiState(cwd: string, home: string, env: Record<string, string | undefined>): PiProjectState;
|
|
27
31
|
/** What Cursor would already read. */
|
|
28
32
|
readCursorState(cwd: string, home: string): CursorProjectState;
|
|
33
|
+
/** What Codex would already load (/etc/codex, $CODEX_HOME or ~/.codex, a -p profile in the user's args, every ancestor .codex/). */
|
|
34
|
+
readCodexState(cwd: string, home: string, env: Record<string, string | undefined>, platform: string, passthrough: string[]): CodexProjectState;
|
|
35
|
+
/** What Gemini CLI would already load, the system settings file it reads, and folder trust. */
|
|
36
|
+
readGeminiState(cwd: string, home: string, env: Record<string, string | undefined>, platform: string): GeminiProjectState;
|
|
37
|
+
/** What Copilot CLI would already load ($COPILOT_HOME or ~/.copilot, and the workspace). */
|
|
38
|
+
readCopilotState(cwd: string, home: string, env: Record<string, string | undefined>, platform: string): CopilotProjectState;
|
|
29
39
|
/** Add to a file in the user's own agent config, once (C4). Lines go to `note`. */
|
|
30
40
|
applyConfigWrite(w: ConfigWrite, note: (line: string) => void): void;
|
|
31
41
|
cacheDir(env: Record<string, string | undefined>): string;
|
|
32
|
-
writeIfChanged(dir: string, name: string, content: string
|
|
42
|
+
writeIfChanged(dir: string, name: string, content: string, opts?: {
|
|
43
|
+
mode?: number;
|
|
44
|
+
}): boolean;
|
|
45
|
+
/** Tidy launch files from earlier launches without removing one a concurrent session uses. */
|
|
46
|
+
pruneLaunchFiles(dir: string, prefix: string, opts: {
|
|
47
|
+
keep?: string;
|
|
48
|
+
remove?: string;
|
|
49
|
+
}): void;
|
|
33
50
|
runAgent(spec: LaunchSpec): Promise<number>;
|
|
34
51
|
/** Fire and forget: the caller never awaits what this returns. */
|
|
35
|
-
record(agent:
|
|
36
|
-
/** Ask which agent. Only called on a TTY with
|
|
37
|
-
pick(
|
|
52
|
+
record(agent: LaunchAgentId): void;
|
|
53
|
+
/** Ask which agent. Only called on a TTY with no stored agent. `initial` is preselected. */
|
|
54
|
+
pick(options: PickerOption[], initial?: LaunchAgentId): Promise<LaunchAgentId | null>;
|
|
55
|
+
/** Default-No question: true on yes, false on no, null on Ctrl-C. Only asked on a TTY (Decision 4). */
|
|
56
|
+
confirm(message: string): Promise<boolean | null>;
|
|
57
|
+
/** Runs an install argv the user approved. Never reached without a TTY and a yes. */
|
|
58
|
+
spawnInstall: InstallOfferDeps['spawn'];
|
|
38
59
|
/** Every line align itself writes on this path. stderr only: stdout belongs to the agent (`align -- -p ... | jq`). */
|
|
39
60
|
err(line: string): void;
|
|
40
61
|
now(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/launch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"launch.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/launch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,19 @@
|
|
|
1
|
+
import { spawn as nodeSpawn } from 'node:child_process';
|
|
1
2
|
import os from 'node:os';
|
|
2
3
|
import { performance } from 'node:perf_hooks';
|
|
3
4
|
import { createConfigStore } from '../config.js';
|
|
4
5
|
import { resolveEnv } from '../resolve-env.js';
|
|
5
|
-
import { agentByName, resolveAgentBin, supportedAgents } from './agents.js';
|
|
6
|
+
import { agentByName, byPriority, resolveAgentBin, supportedAgents } from './agents.js';
|
|
6
7
|
import { applyConfigWrite } from './config-writes.js';
|
|
8
|
+
import { readCodexState } from './codex-state.js';
|
|
9
|
+
import { readCopilotState } from './copilot-state.js';
|
|
7
10
|
import { readCursorState } from './cursor-state.js';
|
|
8
11
|
import { findOnPath } from './detect.js';
|
|
9
|
-
import {
|
|
12
|
+
import { offerInstall } from './install.js';
|
|
13
|
+
import { chooseAgent } from './picker-options.js';
|
|
14
|
+
import { confirmDefaultNo, selectAgent } from './prompts.js';
|
|
15
|
+
import { readGeminiState } from './gemini-state.js';
|
|
16
|
+
import { launchCacheDir, pruneLaunchFiles, writeIfChanged } from './launch-files.js';
|
|
10
17
|
import { readOpenCodeState } from './opencode-state.js';
|
|
11
18
|
import { readPiState } from './pi-state.js';
|
|
12
19
|
import { readProjectState } from './project-state.js';
|
|
@@ -35,9 +42,13 @@ function defaultDeps() {
|
|
|
35
42
|
readOpenCodeState: (cwd, home) => readOpenCodeState(cwd, home, { localIsDefault: isLocalDefault() }, process.env),
|
|
36
43
|
readPiState: (cwd, home, env) => readPiState(cwd, home, { localIsDefault: isLocalDefault() }, env),
|
|
37
44
|
readCursorState: (cwd, home) => readCursorState(cwd, home, { localIsDefault: isLocalDefault() }),
|
|
45
|
+
readCodexState: (cwd, home, env, platform, passthrough) => readCodexState(cwd, home, { localIsDefault: isLocalDefault() }, env, platform, passthrough),
|
|
46
|
+
readGeminiState: (cwd, home, env, platform) => readGeminiState(cwd, home, { localIsDefault: isLocalDefault() }, env, platform),
|
|
47
|
+
readCopilotState: (cwd, home, env, platform) => readCopilotState(cwd, home, { localIsDefault: isLocalDefault() }, env, platform),
|
|
38
48
|
applyConfigWrite: (w, note) => applyConfigWrite(w, note, { has: (f) => config.wasWriteRefused(f), add: (f) => config.markWriteRefused(f), remove: (f) => config.unmarkWriteRefused(f) }),
|
|
39
49
|
cacheDir: launchCacheDir,
|
|
40
50
|
writeIfChanged,
|
|
51
|
+
pruneLaunchFiles,
|
|
41
52
|
runAgent: (spec) => runAgent(spec),
|
|
42
53
|
record: (agent) => {
|
|
43
54
|
// Dynamic and un-awaited: telemetry consent rules live in recordFunnelStage, and none of
|
|
@@ -46,14 +57,9 @@ function defaultDeps() {
|
|
|
46
57
|
.then((m) => m.recordFunnelStage(config.getEnvironment('local'), 'agent_launched', 'align', { agent }))
|
|
47
58
|
.catch(() => undefined);
|
|
48
59
|
},
|
|
49
|
-
pick:
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
message: 'Which coding agent should `align` open?',
|
|
53
|
-
options: candidates.map((a) => ({ value: a.name, label: a.label })),
|
|
54
|
-
});
|
|
55
|
-
return clack.isCancel(answer) ? null : answer;
|
|
56
|
-
},
|
|
60
|
+
pick: (options, initial) => selectAgent(options, initial, process.stderr),
|
|
61
|
+
confirm: (message) => confirmDefaultNo(message, process.stderr),
|
|
62
|
+
spawnInstall: (command, args, options) => nodeSpawn(command, args, options),
|
|
57
63
|
err: (l) => console.error(l),
|
|
58
64
|
now: () => performance.now(),
|
|
59
65
|
};
|
|
@@ -96,30 +102,45 @@ export async function launchIfChosen(overrides = {}) {
|
|
|
96
102
|
const stored = agent !== undefined;
|
|
97
103
|
let announce;
|
|
98
104
|
if (!agent) {
|
|
99
|
-
const
|
|
100
|
-
|
|
101
|
-
|
|
105
|
+
const works = supportedAgents();
|
|
106
|
+
const isInstalled = (a) => resolveAgentBin(a, d.findOnPath, d.env, d.platform) !== null;
|
|
107
|
+
const installed = works.filter(isInstalled);
|
|
108
|
+
if (d.isTTY) {
|
|
109
|
+
// Every agent Align supports, installed ones first; a missing one can be installed from
|
|
110
|
+
// here. Always asked on a terminal: with one installed it is preselected, so Enter keeps it.
|
|
111
|
+
const chosen = await chooseAgent(works, {
|
|
112
|
+
isInstalled,
|
|
113
|
+
select: (options, initial) => d.pick(options, initial),
|
|
114
|
+
offer: (a) => offerInstall(specByName(a.name), {
|
|
115
|
+
isTTY: d.isTTY,
|
|
116
|
+
platform: d.platform,
|
|
117
|
+
confirm: (m) => d.confirm(m),
|
|
118
|
+
spawn: d.spawnInstall,
|
|
119
|
+
onPath: (bin) => d.findOnPath(bin, d.env, d.platform),
|
|
120
|
+
say: d.err,
|
|
121
|
+
}),
|
|
122
|
+
say: d.err,
|
|
123
|
+
});
|
|
124
|
+
if (!chosen)
|
|
125
|
+
return { handled: true, code: 1 };
|
|
126
|
+
agent = chosen;
|
|
127
|
+
}
|
|
128
|
+
else if (installed.length === 0) {
|
|
102
129
|
d.err(`No coding agent that Align can open was found on your PATH. Align works with: ${works.map((a) => a.label).join(', ')}.`);
|
|
103
130
|
for (const a of works)
|
|
104
131
|
d.err(`Install ${a.label}: ${a.install}`);
|
|
105
|
-
d.err('Then run `align` again.');
|
|
132
|
+
d.err('Then run `align` again. `align agents` lists them all.');
|
|
106
133
|
return { handled: true, code: 1 };
|
|
107
134
|
}
|
|
108
|
-
if (installed.length === 1) {
|
|
135
|
+
else if (installed.length === 1) {
|
|
109
136
|
agent = installed[0];
|
|
110
137
|
announce = `Opening ${agent.label}. Switch any time with \`align use\`.`;
|
|
111
138
|
}
|
|
112
|
-
else if (d.isTTY) {
|
|
113
|
-
const choice = await d.pick(installed);
|
|
114
|
-
agent = installed.find((a) => a.name === choice);
|
|
115
|
-
if (!agent)
|
|
116
|
-
return { handled: true, code: 1 };
|
|
117
|
-
}
|
|
118
139
|
else {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
140
|
+
// An explicit `align -- ...` with no terminal (a script's first run). Take the old order, so
|
|
141
|
+
// what a script opened before wave A it still opens, and say which one.
|
|
142
|
+
agent = byPriority(installed)[0];
|
|
143
|
+
announce = `Opening ${agent.label}: more than one coding agent is installed and there is no terminal to ask. Change it with: align use <agent>`;
|
|
123
144
|
}
|
|
124
145
|
}
|
|
125
146
|
const build = specByName(agent.name)?.build;
|
|
@@ -137,12 +158,27 @@ export async function launchIfChosen(overrides = {}) {
|
|
|
137
158
|
return explicit ? { handled: true, code: 127 } : { handled: false };
|
|
138
159
|
}
|
|
139
160
|
const dir = d.cacheDir(d.env);
|
|
140
|
-
|
|
161
|
+
let built;
|
|
162
|
+
try {
|
|
163
|
+
built = build(d, { passthrough, cachePath: (name) => `${dir}/${name}` });
|
|
164
|
+
}
|
|
165
|
+
catch (e) {
|
|
166
|
+
// Reading the user's or a repo's config is reading untrusted input. Whatever it does to the
|
|
167
|
+
// reader, the user still gets their agent, without Align, and one line instead of a trace.
|
|
168
|
+
d.err(`Could not prepare Align for ${agent.label} (${e.message}). Opening it without Align's graph.`);
|
|
169
|
+
built = { bin: agent.bin, args: [...passthrough], env: { ALIGN_WRAPPED: '1' }, files: [] };
|
|
170
|
+
}
|
|
141
171
|
// The adapter names the agent's usual binary; run whichever name is actually installed.
|
|
142
172
|
const spec = resolved && resolved.bin !== built.bin ? { ...built, bin: resolved.bin } : built;
|
|
143
173
|
try {
|
|
144
|
-
for (const f of spec.files)
|
|
145
|
-
|
|
174
|
+
for (const f of spec.files) {
|
|
175
|
+
if (f.mode === undefined)
|
|
176
|
+
d.writeIfChanged(dir, f.name, f.content);
|
|
177
|
+
else
|
|
178
|
+
d.writeIfChanged(dir, f.name, f.content, { mode: f.mode });
|
|
179
|
+
}
|
|
180
|
+
if (spec.prune)
|
|
181
|
+
d.pruneLaunchFiles(dir, spec.prune.prefix, { keep: spec.prune.keep, remove: spec.prune.remove });
|
|
146
182
|
}
|
|
147
183
|
catch (e) {
|
|
148
184
|
d.err(`Could not write launch files (${e.message}). Showing your graph instead.`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/lib/launch/launch.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"launch.js","sourceRoot":"","sources":["../../../src/lib/launch/launch.ts"],"names":[],"mappings":"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"}
|