@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.
Files changed (102) hide show
  1. package/dist/commands/agents.d.ts +20 -0
  2. package/dist/commands/agents.d.ts.map +1 -0
  3. package/dist/commands/agents.js +60 -0
  4. package/dist/commands/agents.js.map +1 -0
  5. package/dist/commands/registry.d.ts.map +1 -1
  6. package/dist/commands/registry.js +3 -0
  7. package/dist/commands/registry.js.map +1 -1
  8. package/dist/commands/setup.js.map +1 -1
  9. package/dist/commands/use.js +1 -1
  10. package/dist/commands/use.js.map +1 -1
  11. package/dist/lib/launch/adapters/claude-code.d.ts +8 -0
  12. package/dist/lib/launch/adapters/claude-code.d.ts.map +1 -1
  13. package/dist/lib/launch/adapters/claude-code.js.map +1 -1
  14. package/dist/lib/launch/adapters/codex.d.ts +17 -0
  15. package/dist/lib/launch/adapters/codex.d.ts.map +1 -0
  16. package/dist/lib/launch/adapters/codex.js +44 -0
  17. package/dist/lib/launch/adapters/codex.js.map +1 -0
  18. package/dist/lib/launch/adapters/copilot.d.ts +17 -0
  19. package/dist/lib/launch/adapters/copilot.d.ts.map +1 -0
  20. package/dist/lib/launch/adapters/copilot.js +29 -0
  21. package/dist/lib/launch/adapters/copilot.js.map +1 -0
  22. package/dist/lib/launch/adapters/gemini-cli.d.ts +25 -0
  23. package/dist/lib/launch/adapters/gemini-cli.d.ts.map +1 -0
  24. package/dist/lib/launch/adapters/gemini-cli.js +73 -0
  25. package/dist/lib/launch/adapters/gemini-cli.js.map +1 -0
  26. package/dist/lib/launch/agents.d.ts +12 -2
  27. package/dist/lib/launch/agents.d.ts.map +1 -1
  28. package/dist/lib/launch/agents.js +17 -1
  29. package/dist/lib/launch/agents.js.map +1 -1
  30. package/dist/lib/launch/codex-state.d.ts +31 -0
  31. package/dist/lib/launch/codex-state.d.ts.map +1 -0
  32. package/dist/lib/launch/codex-state.js +92 -0
  33. package/dist/lib/launch/codex-state.js.map +1 -0
  34. package/dist/lib/launch/copilot-state.d.ts +19 -0
  35. package/dist/lib/launch/copilot-state.d.ts.map +1 -0
  36. package/dist/lib/launch/copilot-state.js +51 -0
  37. package/dist/lib/launch/copilot-state.js.map +1 -0
  38. package/dist/lib/launch/gemini-state.d.ts +32 -0
  39. package/dist/lib/launch/gemini-state.d.ts.map +1 -0
  40. package/dist/lib/launch/gemini-state.js +59 -0
  41. package/dist/lib/launch/gemini-state.js.map +1 -0
  42. package/dist/lib/launch/gemini-trust.d.ts +26 -0
  43. package/dist/lib/launch/gemini-trust.d.ts.map +1 -0
  44. package/dist/lib/launch/gemini-trust.js +103 -0
  45. package/dist/lib/launch/gemini-trust.js.map +1 -0
  46. package/dist/lib/launch/install.d.ts +33 -0
  47. package/dist/lib/launch/install.d.ts.map +1 -0
  48. package/dist/lib/launch/install.js +48 -0
  49. package/dist/lib/launch/install.js.map +1 -0
  50. package/dist/lib/launch/launch-files.d.ts +15 -0
  51. package/dist/lib/launch/launch-files.d.ts.map +1 -1
  52. package/dist/lib/launch/launch-files.js +64 -4
  53. package/dist/lib/launch/launch-files.js.map +1 -1
  54. package/dist/lib/launch/launch.d.ts +27 -6
  55. package/dist/lib/launch/launch.d.ts.map +1 -1
  56. package/dist/lib/launch/launch.js +64 -28
  57. package/dist/lib/launch/launch.js.map +1 -1
  58. package/dist/lib/launch/pick-agent.d.ts +12 -5
  59. package/dist/lib/launch/pick-agent.d.ts.map +1 -1
  60. package/dist/lib/launch/pick-agent.js +46 -19
  61. package/dist/lib/launch/pick-agent.js.map +1 -1
  62. package/dist/lib/launch/picker-options.d.ts +30 -0
  63. package/dist/lib/launch/picker-options.d.ts.map +1 -0
  64. package/dist/lib/launch/picker-options.js +42 -0
  65. package/dist/lib/launch/picker-options.js.map +1 -0
  66. package/dist/lib/launch/prompts.d.ts +11 -0
  67. package/dist/lib/launch/prompts.d.ts.map +1 -0
  68. package/dist/lib/launch/prompts.js +27 -0
  69. package/dist/lib/launch/prompts.js.map +1 -0
  70. package/dist/lib/launch/registry/agents/claude-code.js +1 -1
  71. package/dist/lib/launch/registry/agents/claude-code.js.map +1 -1
  72. package/dist/lib/launch/registry/agents/codex.d.ts.map +1 -1
  73. package/dist/lib/launch/registry/agents/codex.js +4 -2
  74. package/dist/lib/launch/registry/agents/codex.js.map +1 -1
  75. package/dist/lib/launch/registry/agents/copilot.d.ts +3 -0
  76. package/dist/lib/launch/registry/agents/copilot.d.ts.map +1 -0
  77. package/dist/lib/launch/registry/agents/copilot.js +11 -0
  78. package/dist/lib/launch/registry/agents/copilot.js.map +1 -0
  79. package/dist/lib/launch/registry/agents/cursor.js +1 -1
  80. package/dist/lib/launch/registry/agents/cursor.js.map +1 -1
  81. package/dist/lib/launch/registry/agents/gemini-cli.d.ts.map +1 -1
  82. package/dist/lib/launch/registry/agents/gemini-cli.js +4 -2
  83. package/dist/lib/launch/registry/agents/gemini-cli.js.map +1 -1
  84. package/dist/lib/launch/registry/agents/opencode.js +1 -1
  85. package/dist/lib/launch/registry/agents/opencode.js.map +1 -1
  86. package/dist/lib/launch/registry/agents/pi.js +1 -1
  87. package/dist/lib/launch/registry/agents/pi.js.map +1 -1
  88. package/dist/lib/launch/registry/index.d.ts +1 -1
  89. package/dist/lib/launch/registry/index.d.ts.map +1 -1
  90. package/dist/lib/launch/registry/index.js +3 -2
  91. package/dist/lib/launch/registry/index.js.map +1 -1
  92. package/dist/lib/launch/registry/types.d.ts +13 -2
  93. package/dist/lib/launch/registry/types.d.ts.map +1 -1
  94. package/dist/lib/launch/run-agent.d.ts +4 -0
  95. package/dist/lib/launch/run-agent.d.ts.map +1 -1
  96. package/dist/lib/launch/run-agent.js +1 -1
  97. package/dist/lib/launch/run-agent.js.map +1 -1
  98. package/dist/lib/launch/strict-entry.d.ts +49 -0
  99. package/dist/lib/launch/strict-entry.d.ts.map +1 -0
  100. package/dist/lib/launch/strict-entry.js +106 -0
  101. package/dist/lib/launch/strict-entry.js.map +1 -0
  102. package/package.json +3 -2
@@ -1,17 +1,24 @@
1
- import type { AgentName } from '../sessions/types.js';
1
+ import type { LaunchAgentId } from './registry/types.js';
2
2
  import { type LaunchAgent } from './agents.js';
3
+ import { type InstallOfferDeps } from './install.js';
4
+ import { type PickerOption } from './picker-options.js';
3
5
  /**
4
6
  * The wizard's "which coding agent?" step (C5). It reads the same table and the same PATH scan
5
7
  * the launcher does and stores through the same config key, so what the wizard picks is exactly
6
- * what bare `align` opens afterwards. Only supported agents that are installed are ever offered.
8
+ * what bare `align` opens afterwards. On a terminal the picker lists every supported agent,
9
+ * installed ones first; picking a missing one offers its install (plan Decision 4).
7
10
  */
8
11
  export interface PickAgentDeps {
9
12
  env: Record<string, string | undefined>;
10
13
  platform: string;
11
14
  agents: readonly LaunchAgent[];
12
15
  findOnPath(bin: string, env: Record<string, string | undefined>, platform: string): string | null;
13
- /** Resolves null when the user cancels. Only called on a terminal with several candidates. */
14
- select(candidates: LaunchAgent[]): Promise<AgentName | null>;
16
+ /** Resolves null when the user cancels. Only called on a terminal. `initial` is preselected. */
17
+ select(options: PickerOption[], initial?: LaunchAgentId): Promise<LaunchAgentId | null>;
18
+ /** Default-No question: true on yes, false on no, null on Ctrl-C (install-on-pick). */
19
+ confirm(message: string): Promise<boolean | null>;
20
+ /** Runs an install argv the user approved. */
21
+ spawn: InstallOfferDeps['spawn'];
15
22
  say(line: string): void;
16
23
  }
17
24
  /** The user cancelled the picker: the wizard stops, like any other cancelled prompt. */
@@ -24,5 +31,5 @@ export interface AgentConfig {
24
31
  export declare function pickAgent(config: AgentConfig, opts: {
25
32
  interactive: boolean;
26
33
  approve?: boolean;
27
- }, overrides?: Partial<PickAgentDeps>): Promise<AgentName | null | typeof PICK_CANCELLED>;
34
+ }, overrides?: Partial<PickAgentDeps>): Promise<LaunchAgentId | null | typeof PICK_CANCELLED>;
28
35
  //# sourceMappingURL=pick-agent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pick-agent.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/pick-agent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAe,KAAK,WAAW,EAAoC,MAAM,aAAa,CAAC;AAG9F;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IAC/B,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAClG,8FAA8F;IAC9F,MAAM,CAAC,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAAC;IAC7D,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wFAAwF;AACxF,eAAO,MAAM,cAAc,EAAG,WAAoB,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,QAAQ,IAAI,MAAM,GAAG,SAAS,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,CAAC,IAAI,OAAO,CAAC;CACzB;AAsBD,wBAAsB,SAAS,CAC7B,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EACjD,SAAS,GAAE,OAAO,CAAC,aAAa,CAAM,GACrC,OAAO,CAAC,SAAS,GAAG,IAAI,GAAG,OAAO,cAAc,CAAC,CAoCnD"}
1
+ {"version":3,"file":"pick-agent.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/pick-agent.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EAA2B,KAAK,WAAW,EAAgD,MAAM,aAAa,CAAC;AAEtH,OAAO,EAAE,KAAK,gBAAgB,EAAgB,MAAM,cAAc,CAAC;AACnE,OAAO,EAAe,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIrE;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,WAAW,EAAE,CAAC;IAC/B,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAClG,gGAAgG;IAChG,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACxF,uFAAuF;IACvF,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IAClD,8CAA8C;IAC9C,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,CAAC;IACjC,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wFAAwF;AACxF,eAAO,MAAM,cAAc,EAAG,WAAoB,CAAC;AAEnD,MAAM,WAAW,WAAW;IAC1B,QAAQ,IAAI,MAAM,GAAG,SAAS,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,CAAC,IAAI,OAAO,CAAC;CACzB;AAeD,wBAAsB,SAAS,CAC7B,MAAM,EAAE,WAAW,EACnB,IAAI,EAAE;IAAE,WAAW,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EACjD,SAAS,GAAE,OAAO,CAAC,aAAa,CAAM,GACrC,OAAO,CAAC,aAAa,GAAG,IAAI,GAAG,OAAO,cAAc,CAAC,CAiEvD"}
@@ -1,49 +1,76 @@
1
- import { agentByName, resolveAgentBin, supportedAgents } from './agents.js';
1
+ import { spawn as nodeSpawn } from 'node:child_process';
2
+ import { agentByName, byPriority, PRE_WAVE_A, resolveAgentBin, supportedAgents } from './agents.js';
2
3
  import { findOnPath } from './detect.js';
4
+ import { offerInstall } from './install.js';
5
+ import { chooseAgent } from './picker-options.js';
6
+ import { confirmDefaultNo, selectAgent } from './prompts.js';
7
+ import { specByName } from './registry/index.js';
3
8
  /** The user cancelled the picker: the wizard stops, like any other cancelled prompt. */
4
9
  export const PICK_CANCELLED = 'cancelled';
5
- async function clackSelect(candidates) {
6
- const clack = await import('@clack/prompts');
7
- const answer = await clack.select({
8
- message: 'Which coding agent should `align` open?',
9
- options: candidates.map((a) => ({ value: a.name, label: a.label })),
10
- });
11
- return clack.isCancel(answer) ? null : answer;
12
- }
13
10
  function defaultDeps() {
14
11
  return {
15
12
  env: process.env,
16
13
  platform: process.platform,
17
14
  agents: supportedAgents(),
18
15
  findOnPath,
19
- select: clackSelect,
16
+ select: (options, initial) => selectAgent(options, initial),
17
+ confirm: (message) => confirmDefaultNo(message),
18
+ spawn: (command, args, options) => nodeSpawn(command, args, options),
20
19
  say: (l) => console.log(l),
21
20
  };
22
21
  }
23
22
  export async function pickAgent(config, opts, overrides = {}) {
24
23
  const d = { ...defaultDeps(), ...overrides };
25
- const installed = d.agents.filter((a) => resolveAgentBin(a, d.findOnPath, d.env, d.platform) !== null);
24
+ const isInstalled = (a) => resolveAgentBin(a, d.findOnPath, d.env, d.platform) !== null;
25
+ const installed = d.agents.filter(isInstalled);
26
26
  // A re-run keeps the choice, provided it can still be launched; `align use` changes it. A
27
27
  // stored agent that has left PATH is treated as no choice at all.
28
28
  const stored = agentByName(config.getAgent());
29
29
  if (stored && installed.some((a) => a.name === stored.name))
30
30
  return stored.name;
31
- if (installed.length === 0) {
31
+ if (installed.length === 0 && (!opts.interactive || opts.approve)) {
32
32
  d.say('No coding agent that Align can open was found on your PATH. Align works with:');
33
33
  for (const a of d.agents)
34
34
  d.say(` ${a.label}: ${a.install}`);
35
- d.say('Install one, then run `align` again.');
35
+ d.say('Install one, then run `align` again. `align agents` lists them all.');
36
36
  return null;
37
37
  }
38
+ // Without a terminal and without --approve, only the agents launchable before wave A are
39
+ // weighed when any is installed: a machine with Claude Code plus Codex picks Claude Code, as it
40
+ // did before Codex could be launched, and two older agents still are not guessed between.
41
+ const preWaveA = installed.filter((a) => PRE_WAVE_A.has(a.name));
42
+ const unattended = !opts.interactive && !opts.approve && preWaveA.length > 0 ? preWaveA : installed;
38
43
  let chosen;
39
- if (installed.length === 1 || opts.approve) {
40
- chosen = installed[0];
44
+ if (opts.approve) {
45
+ chosen = byPriority(installed)[0];
41
46
  }
42
47
  else if (opts.interactive) {
43
- const name = await d.select(installed);
44
- if (name === null)
48
+ // Always asked on a terminal: with one installed it is preselected, so Enter keeps it.
49
+ chosen = await chooseAgent(d.agents, {
50
+ isInstalled,
51
+ select: (options, initial) => d.select(options, initial),
52
+ offer: (a) => offerInstall(specByName(a.name), {
53
+ isTTY: true,
54
+ platform: d.platform,
55
+ confirm: (m) => d.confirm(m),
56
+ spawn: d.spawn,
57
+ onPath: (bin) => d.findOnPath(bin, d.env, d.platform),
58
+ say: d.say,
59
+ }),
60
+ say: d.say,
61
+ });
62
+ if (chosen === null) {
63
+ // With nothing installed, leaving the picker is not cancelling setup: it carries on with no
64
+ // agent chosen, as it did before the picker listed missing agents.
65
+ if (installed.length === 0) {
66
+ d.say('No agent chosen. Install one, then run `align` again. `align agents` lists them all.');
67
+ return null;
68
+ }
45
69
  return PICK_CANCELLED;
46
- chosen = installed.find((a) => a.name === name);
70
+ }
71
+ }
72
+ else if (unattended.length === 1) {
73
+ chosen = unattended[0];
47
74
  }
48
75
  else {
49
76
  d.say(`More than one coding agent is installed (${installed.map((a) => a.label).join(', ')}) and there is no terminal to ask in.`);
@@ -56,7 +83,7 @@ export async function pickAgent(config, opts, overrides = {}) {
56
83
  config.setAgent(chosen.name);
57
84
  if (wasOff)
58
85
  d.say('Launching is on again: `align use --undo` had turned it off.');
59
- if (installed.length === 1)
86
+ if (installed.length === 1 || unattended.length === 1)
60
87
  d.say(`Using ${chosen.label}. Switch any time with \`align use\`.`);
61
88
  return chosen.name;
62
89
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pick-agent.js","sourceRoot":"","sources":["../../../src/lib/launch/pick-agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pick-agent.js","sourceRoot":"","sources":["../../../src/lib/launch/pick-agent.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { LaunchAgent } from './agents.js';
2
+ import type { InstallOutcome } from './install.js';
3
+ import type { LaunchAgentId } from './registry/types.js';
4
+ export interface PickerOption {
5
+ value: LaunchAgentId;
6
+ label: string;
7
+ hint?: string;
8
+ }
9
+ /**
10
+ * Every agent Align supports, for the "which coding agent?" picker: the installed ones first,
11
+ * then the rest, each by label, the rest marked with how to install them. Built from whatever
12
+ * list it is given, so a new registry spec appears with no change here.
13
+ */
14
+ export declare function pickerOptions(agents: readonly LaunchAgent[], isInstalled: (a: LaunchAgent) => boolean): PickerOption[];
15
+ export interface ChooseDeps {
16
+ isInstalled(a: LaunchAgent): boolean;
17
+ /** Resolves null when the user cancels. `initial` is the row the cursor starts on. */
18
+ select(options: PickerOption[], initial?: LaunchAgentId): Promise<LaunchAgentId | null>;
19
+ /** Decision 4: offer to install a picked agent that is missing (install.ts). */
20
+ offer(a: LaunchAgent): Promise<InstallOutcome>;
21
+ say(line: string): void;
22
+ }
23
+ /**
24
+ * Show the picker until the user picks an installed agent (or one that installs and is then
25
+ * found on PATH) or cancels, at the picker or at the install question. A plain No, a printed
26
+ * installer or a failed install returns to the picker. With exactly one agent installed the
27
+ * cursor starts on it, so Enter keeps what bare `align` used to pick without asking.
28
+ */
29
+ export declare function chooseAgent(agents: readonly LaunchAgent[], d: ChooseDeps): Promise<LaunchAgent | null>;
30
+ //# sourceMappingURL=picker-options.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker-options.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/picker-options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAKD;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,EAAE,WAAW,KAAK,OAAO,GAAG,YAAY,EAAE,CAOtH;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;IACrC,sFAAsF;IACtF,MAAM,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IACxF,gFAAgF;IAChF,KAAK,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC/C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,SAAS,WAAW,EAAE,EAAE,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAe5G"}
@@ -0,0 +1,42 @@
1
+ /** Code-unit order, never locale order: the same list on every machine. */
2
+ const byLabel = (a, b) => (a.label < b.label ? -1 : a.label > b.label ? 1 : 0);
3
+ /**
4
+ * Every agent Align supports, for the "which coding agent?" picker: the installed ones first,
5
+ * then the rest, each by label, the rest marked with how to install them. Built from whatever
6
+ * list it is given, so a new registry spec appears with no change here.
7
+ */
8
+ export function pickerOptions(agents, isInstalled) {
9
+ const installed = agents.filter(isInstalled).sort(byLabel);
10
+ const missing = agents.filter((a) => !isInstalled(a)).sort(byLabel);
11
+ return [
12
+ ...installed.map((a) => ({ value: a.name, label: a.label })),
13
+ ...missing.map((a) => ({ value: a.name, label: `${a.label} (not installed)`, hint: `install: ${a.install}` })),
14
+ ];
15
+ }
16
+ /**
17
+ * Show the picker until the user picks an installed agent (or one that installs and is then
18
+ * found on PATH) or cancels, at the picker or at the install question. A plain No, a printed
19
+ * installer or a failed install returns to the picker. With exactly one agent installed the
20
+ * cursor starts on it, so Enter keeps what bare `align` used to pick without asking.
21
+ */
22
+ export async function chooseAgent(agents, d) {
23
+ for (;;) {
24
+ const installed = agents.filter(d.isInstalled);
25
+ const initial = installed.length === 1 ? installed[0].name : undefined;
26
+ const name = await d.select(pickerOptions(agents, d.isInstalled), initial);
27
+ const chosen = agents.find((a) => a.name === name);
28
+ if (!chosen)
29
+ return null;
30
+ if (d.isInstalled(chosen))
31
+ return chosen;
32
+ const outcome = await d.offer(chosen);
33
+ if (outcome === 'cancelled')
34
+ return null;
35
+ if (outcome === 'installed') {
36
+ if (d.isInstalled(chosen))
37
+ return chosen;
38
+ d.say(`${chosen.label} installed, but ${chosen.bin} is still not on your PATH. Open a new terminal, or pick another.`);
39
+ }
40
+ }
41
+ }
42
+ //# sourceMappingURL=picker-options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"picker-options.js","sourceRoot":"","sources":["../../../src/lib/launch/picker-options.ts"],"names":[],"mappings":"AAUA,2EAA2E;AAC3E,MAAM,OAAO,GAAG,CAAC,CAAc,EAAE,CAAc,EAAU,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAEjH;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,MAA8B,EAAE,WAAwC;IACpG,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpE,OAAO;QACL,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAC5D,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,KAAK,kBAAkB,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;KAC/G,CAAC;AACJ,CAAC;AAWD;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,MAA8B,EAAE,CAAa;IAC7E,SAAS,CAAC;QACR,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QACxE,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,CAAC;QAC3E,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;QACzB,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QACzC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,OAAO,KAAK,WAAW;YAAE,OAAO,IAAI,CAAC;QACzC,IAAI,OAAO,KAAK,WAAW,EAAE,CAAC;YAC5B,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC;YACzC,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,KAAK,mBAAmB,MAAM,CAAC,GAAG,mEAAmE,CAAC,CAAC;QACzH,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Writable } from 'node:stream';
2
+ import type { PickerOption } from './picker-options.js';
3
+ import type { LaunchAgentId } from './registry/types.js';
4
+ /** "Which coding agent?". Resolves null on cancel. `initial` is the row the cursor starts on. */
5
+ export declare function selectAgent(options: PickerOption[], initial: LaunchAgentId | undefined, output?: Writable): Promise<LaunchAgentId | null>;
6
+ /**
7
+ * A yes/no question with No preselected. true only on an explicit yes, false on anything else,
8
+ * null on Ctrl-C (which the picker treats as leaving it, not as a No).
9
+ */
10
+ export declare function confirmDefaultNo(message: string, output?: Writable): Promise<boolean | null>;
11
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/prompts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAOzD,iGAAiG;AACjG,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,aAAa,GAAG,SAAS,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAS/I;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAKlG"}
@@ -0,0 +1,27 @@
1
+ /*
2
+ * The two clack prompts behind the agent picker, shared by bare `align` and the wizard. clack is
3
+ * imported on use, never at module load, so the launch path pays nothing for it (cost rule).
4
+ */
5
+ /** "Which coding agent?". Resolves null on cancel. `initial` is the row the cursor starts on. */
6
+ export async function selectAgent(options, initial, output) {
7
+ const clack = await import('@clack/prompts');
8
+ const answer = await clack.select({
9
+ message: 'Which coding agent should `align` open?',
10
+ options,
11
+ ...(initial !== undefined ? { initialValue: initial } : {}),
12
+ ...(output ? { output } : {}),
13
+ });
14
+ return clack.isCancel(answer) ? null : answer;
15
+ }
16
+ /**
17
+ * A yes/no question with No preselected. true only on an explicit yes, false on anything else,
18
+ * null on Ctrl-C (which the picker treats as leaving it, not as a No).
19
+ */
20
+ export async function confirmDefaultNo(message, output) {
21
+ const clack = await import('@clack/prompts');
22
+ const answer = await clack.confirm({ message, initialValue: false, ...(output ? { output } : {}) });
23
+ if (clack.isCancel(answer))
24
+ return null;
25
+ return answer === true;
26
+ }
27
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../../src/lib/launch/prompts.ts"],"names":[],"mappings":"AAIA;;;GAGG;AAEH,iGAAiG;AACjG,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAuB,EAAE,OAAkC,EAAE,MAAiB;IAC9G,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC;QAChC,OAAO,EAAE,yCAAyC;QAClD,OAAO;QACP,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9B,CAAC,CAAC;IACH,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAE,MAAwB,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,OAAe,EAAE,MAAiB;IACvE,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpG,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,MAAM,KAAK,IAAI,CAAC;AACzB,CAAC"}
@@ -5,7 +5,7 @@ export const claudeCode = {
5
5
  bin: 'claude',
6
6
  injection: 'per-session',
7
7
  supported: true,
8
- install: 'npm i -g @anthropic-ai/claude-code',
8
+ install: { kind: 'npm', argv: ['npm', 'i', '-g', '@anthropic-ai/claude-code'] },
9
9
  build: (d, base) => buildClaudeLaunch({ ...base, ...d.readProjectState(d.cwd, d.home) }),
10
10
  };
11
11
  //# sourceMappingURL=claude-code.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGlE,MAAM,CAAC,MAAM,UAAU,GAAc;IACnC,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,aAAa;IACpB,GAAG,EAAE,QAAQ;IACb,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,oCAAoC;IAC7C,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;CACzF,CAAC"}
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGlE,MAAM,CAAC,MAAM,UAAU,GAAc;IACnC,IAAI,EAAE,aAAa;IACnB,KAAK,EAAE,aAAa;IACpB,GAAG,EAAE,QAAQ;IACb,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,2BAA2B,CAAC,EAAE;IAC/E,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;CACzF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/codex.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAO,MAAM,KAAK,EAAE,SAOnB,CAAC"}
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/codex.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAO,MAAM,KAAK,EAAE,SAQnB,CAAC"}
@@ -1,9 +1,11 @@
1
+ import { buildCodexLaunch } from '../../adapters/codex.js';
1
2
  export const codex = {
2
3
  name: 'codex',
3
4
  label: 'Codex',
4
5
  bin: 'codex',
5
6
  injection: 'per-session',
6
- supported: false,
7
- install: 'npm i -g @openai/codex',
7
+ supported: true,
8
+ install: { kind: 'npm', argv: ['npm', 'i', '-g', '@openai/codex'] },
9
+ build: (d, base) => buildCodexLaunch({ ...base, ...d.readCodexState(d.cwd, d.home, d.env, d.platform, base.passthrough) }),
8
10
  };
9
11
  //# sourceMappingURL=codex.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/codex.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,KAAK,GAAc;IAC9B,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,OAAO;IACZ,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,KAAK;IAChB,OAAO,EAAE,wBAAwB;CAClC,CAAC"}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAG3D,MAAM,CAAC,MAAM,KAAK,GAAc;IAC9B,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,OAAO;IACZ,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,eAAe,CAAC,EAAE;IACnE,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,gBAAgB,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;CAC3H,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { AgentSpec } from '../types.js';
2
+ export declare const copilot: AgentSpec;
3
+ //# sourceMappingURL=copilot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/copilot.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAO,MAAM,OAAO,EAAE,SAQrB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { buildCopilotLaunch } from '../../adapters/copilot.js';
2
+ export const copilot = {
3
+ name: 'copilot',
4
+ label: 'GitHub Copilot CLI',
5
+ bin: 'copilot',
6
+ injection: 'per-session',
7
+ supported: true,
8
+ install: { kind: 'npm', argv: ['npm', 'i', '-g', '@github/copilot'] },
9
+ build: (d, base) => buildCopilotLaunch({ ...base, ...d.readCopilotState(d.cwd, d.home, d.env, d.platform) }),
10
+ };
11
+ //# sourceMappingURL=copilot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/copilot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAG/D,MAAM,CAAC,MAAM,OAAO,GAAc;IAChC,IAAI,EAAE,SAAS;IACf,KAAK,EAAE,oBAAoB;IAC3B,GAAG,EAAE,SAAS;IACd,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,iBAAiB,CAAC,EAAE;IACrE,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,kBAAkB,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;CAC7G,CAAC"}
@@ -5,7 +5,7 @@ export const cursor = {
5
5
  bin: 'cursor-agent',
6
6
  injection: 'written-once',
7
7
  supported: true,
8
- install: 'https://cursor.com/cli',
8
+ install: { kind: 'docs', url: 'https://cursor.com/cli' },
9
9
  build: (d, base) => buildCursorLaunch({ ...base, ...d.readCursorState(d.cwd, d.home) }),
10
10
  };
11
11
  //# sourceMappingURL=cursor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,MAAM,CAAC,MAAM,MAAM,GAAc;IAC/B,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,QAAQ;IACf,GAAG,EAAE,cAAc;IACnB,SAAS,EAAE,cAAc;IACzB,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,wBAAwB;IACjC,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;CACxF,CAAC"}
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/cursor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAG7D,MAAM,CAAC,MAAM,MAAM,GAAc;IAC/B,IAAI,EAAE,QAAQ;IACd,KAAK,EAAE,QAAQ;IACf,GAAG,EAAE,cAAc;IACnB,SAAS,EAAE,cAAc;IACzB,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,wBAAwB,EAAE;IACxD,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;CACxF,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-cli.d.ts","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/gemini-cli.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAO,MAAM,SAAS,EAAE,SAOvB,CAAC"}
1
+ {"version":3,"file":"gemini-cli.d.ts","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/gemini-cli.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,eAAO,MAAM,SAAS,EAAE,SAQvB,CAAC"}
@@ -1,9 +1,11 @@
1
+ import { buildGeminiLaunch } from '../../adapters/gemini-cli.js';
1
2
  export const geminiCli = {
2
3
  name: 'gemini-cli',
3
4
  label: 'Gemini CLI',
4
5
  bin: 'gemini',
5
6
  injection: 'per-session',
6
- supported: false,
7
- install: 'npm i -g @google/gemini-cli',
7
+ supported: true,
8
+ install: { kind: 'npm', argv: ['npm', 'i', '-g', '@google/gemini-cli'] },
9
+ build: (d, base) => buildGeminiLaunch({ ...base, env: d.env, platform: d.platform, ...d.readGeminiState(d.cwd, d.home, d.env, d.platform) }),
8
10
  };
9
11
  //# sourceMappingURL=gemini-cli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gemini-cli.js","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/gemini-cli.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,YAAY;IACnB,GAAG,EAAE,QAAQ;IACb,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,KAAK;IAChB,OAAO,EAAE,6BAA6B;CACvC,CAAC"}
1
+ {"version":3,"file":"gemini-cli.js","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/gemini-cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AAGjE,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,YAAY;IACnB,GAAG,EAAE,QAAQ;IACb,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,oBAAoB,CAAC,EAAE;IACxE,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,iBAAiB,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;CAC7I,CAAC"}
@@ -5,7 +5,7 @@ export const opencode = {
5
5
  bin: 'opencode',
6
6
  injection: 'per-session',
7
7
  supported: true,
8
- install: 'npm i -g opencode-ai',
8
+ install: { kind: 'npm', argv: ['npm', 'i', '-g', 'opencode-ai'] },
9
9
  build: (d, base) => buildOpenCodeLaunch({ ...base, env: d.env, ...d.readOpenCodeState(d.cwd, d.home) }),
10
10
  };
11
11
  //# sourceMappingURL=opencode.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,MAAM,CAAC,MAAM,QAAQ,GAAc;IACjC,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,UAAU;IACf,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,sBAAsB;IAC/B,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;CACxG,CAAC"}
1
+ {"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAGjE,MAAM,CAAC,MAAM,QAAQ,GAAc;IACjC,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,GAAG,EAAE,UAAU;IACf,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,aAAa,CAAC,EAAE;IACjE,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;CACxG,CAAC"}
@@ -5,7 +5,7 @@ export const pi = {
5
5
  bin: 'pi',
6
6
  injection: 'written-once',
7
7
  supported: true,
8
- install: 'https://pi.dev',
8
+ install: { kind: 'docs', url: 'https://pi.dev' },
9
9
  build: (d, base) => buildPiLaunch({ ...base, ...d.readPiState(d.cwd, d.home, d.env) }),
10
10
  };
11
11
  //# sourceMappingURL=pi.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pi.js","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/pi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,MAAM,CAAC,MAAM,EAAE,GAAc;IAC3B,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,IAAI;IACX,GAAG,EAAE,IAAI;IACT,SAAS,EAAE,cAAc;IACzB,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,gBAAgB;IACzB,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;CACvF,CAAC"}
1
+ {"version":3,"file":"pi.js","sourceRoot":"","sources":["../../../../../src/lib/launch/registry/agents/pi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,MAAM,CAAC,MAAM,EAAE,GAAc;IAC3B,IAAI,EAAE,IAAI;IACV,KAAK,EAAE,IAAI;IACX,GAAG,EAAE,IAAI;IACT,SAAS,EAAE,cAAc;IACzB,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,gBAAgB,EAAE;IAChD,KAAK,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;CACvF,CAAC"}
@@ -1,5 +1,5 @@
1
1
  import type { AgentSpec } from './types.js';
2
- /** Picker order. Same order `LAUNCH_AGENTS` always had. */
2
+ /** Picker order: the order `LAUNCH_AGENTS` always had, with Copilot in its alphabetical place. */
3
3
  export declare const AGENT_REGISTRY: readonly AgentSpec[];
4
4
  export declare function specByName(name: string | undefined): AgentSpec | undefined;
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/launch/registry/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,2DAA2D;AAC3D,eAAO,MAAM,cAAc,EAAE,SAAS,SAAS,EAAyD,CAAC;AAEzG,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAE1E"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/launch/registry/index.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,kGAAkG;AAClG,eAAO,MAAM,cAAc,EAAE,SAAS,SAAS,EAAkE,CAAC;AAElH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,SAAS,CAE1E"}
@@ -1,11 +1,12 @@
1
1
  import { claudeCode } from './agents/claude-code.js';
2
2
  import { codex } from './agents/codex.js';
3
+ import { copilot } from './agents/copilot.js';
3
4
  import { cursor } from './agents/cursor.js';
4
5
  import { geminiCli } from './agents/gemini-cli.js';
5
6
  import { opencode } from './agents/opencode.js';
6
7
  import { pi } from './agents/pi.js';
7
- /** Picker order. Same order `LAUNCH_AGENTS` always had. */
8
- export const AGENT_REGISTRY = [claudeCode, codex, cursor, geminiCli, opencode, pi];
8
+ /** Picker order: the order `LAUNCH_AGENTS` always had, with Copilot in its alphabetical place. */
9
+ export const AGENT_REGISTRY = [claudeCode, codex, copilot, cursor, geminiCli, opencode, pi];
9
10
  export function specByName(name) {
10
11
  return AGENT_REGISTRY.find((a) => a.name === name);
11
12
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/launch/registry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAGpC,2DAA2D;AAC3D,MAAM,CAAC,MAAM,cAAc,GAAyB,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;AAEzG,MAAM,UAAU,UAAU,CAAC,IAAwB;IACjD,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACrD,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/launch/registry/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AAGpC,kGAAkG;AAClG,MAAM,CAAC,MAAM,cAAc,GAAyB,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;AAElH,MAAM,UAAU,UAAU,CAAC,IAAwB;IACjD,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACrD,CAAC"}
@@ -1,19 +1,30 @@
1
1
  import type { AgentName } from '../../sessions/types.js';
2
2
  import type { LaunchSpec } from '../adapters/claude-code.js';
3
+ import type { AgentInstall } from '../install.js';
3
4
  import type { BuildInput, LaunchDeps } from '../launch.js';
5
+ /**
6
+ * Every agent the launcher knows. Wider than the session parsers' AgentName: an agent can be a
7
+ * launch target before align reads its session history (Copilot), and widening AgentName would
8
+ * reach every parser's exhaustive switch for nothing.
9
+ */
10
+ export type LaunchAgentId = AgentName | 'copilot';
4
11
  /**
5
12
  * One launchable (or planned) coding agent. R1 carries today's `LaunchAgent` fields plus the
6
13
  * adapter that builds its launch; later phases replace adapters with data.
7
14
  */
8
15
  export interface AgentSpec {
9
- name: AgentName;
16
+ name: LaunchAgentId;
10
17
  label: string;
11
18
  bin: string;
12
19
  /** per-session: nothing written to the user's config. written-once: later phases. */
13
20
  injection: 'per-session' | 'written-once';
14
21
  /** A launch target today. Later phases flip more entries to true; nothing else changes. */
15
22
  supported: boolean;
16
- install: string;
23
+ /**
24
+ * How a user installs it. `npm`: one argv the picker may offer to run after an explicit yes.
25
+ * `docs`: a script or URL installer, which Align only ever prints (plan Decision 4).
26
+ */
27
+ install: AgentInstall;
17
28
  /** The adapter. Absent for agents that are not launch targets yet. */
18
29
  build?: (d: LaunchDeps, base: BuildInput) => LaunchSpec;
19
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/lib/launch/registry/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE3D;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,qFAAqF;IACrF,SAAS,EAAE,aAAa,GAAG,cAAc,CAAC;IAC1C,2FAA2F;IAC3F,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,KAAK,UAAU,CAAC;CACzD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/lib/launch/registry/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE3D;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,CAAC;AAElD;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,qFAAqF;IACrF,SAAS,EAAE,aAAa,GAAG,cAAc,CAAC;IAC1C,2FAA2F;IAC3F,SAAS,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,OAAO,EAAE,YAAY,CAAC;IACtB,sEAAsE;IACtE,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,KAAK,UAAU,CAAC;CACzD"}
@@ -6,6 +6,10 @@ export interface RunDeps {
6
6
  /** The process whose signals are forwarded. A parameter so tests need not signal themselves. */
7
7
  proc: Pick<typeof process, 'on' | 'off'>;
8
8
  }
9
+ export declare function winShimCommand(spec: Pick<LaunchSpec, 'bin' | 'args'>): {
10
+ command: string;
11
+ args: string[];
12
+ };
9
13
  /**
10
14
  * Run the agent with the terminal handed to it and resolve with the exit code align should
11
15
  * leave with. align stays alive until the child is gone:
@@ -1 +1 @@
1
- {"version":3,"file":"run-agent.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/run-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAsB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG9F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,KAAK,YAAY,CAAC;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB,gGAAgG;IAChG,IAAI,EAAE,IAAI,CAAC,OAAO,OAAO,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC;CAC1C;AAqBD;;;;;;;;;;GAUG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,GAAE,OAAO,CAAC,OAAO,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiC7F"}
1
+ {"version":3,"file":"run-agent.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/run-agent.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAAsB,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAG9F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,MAAM,WAAW,OAAO;IACtB,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,YAAY,KAAK,YAAY,CAAC;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB,gGAAgG;IAChG,IAAI,EAAE,IAAI,CAAC,OAAO,OAAO,EAAE,IAAI,GAAG,KAAK,CAAC,CAAC;CAC1C;AAQD,wBAAgB,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG,MAAM,CAAC,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAW1G;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,GAAE,OAAO,CAAC,OAAO,CAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiC7F"}
@@ -5,7 +5,7 @@ import path from 'node:path';
5
5
  const WIN_SHELL_CHARS = /[&|<>^%"]/;
6
6
  /** One CRT-quoted argument: trailing backslashes are doubled so they cannot escape the closing quote. */
7
7
  const winQuote = (a) => `"${a.replace(/(\\+)$/, '$1$1')}"`;
8
- function winShimCommand(spec) {
8
+ export function winShimCommand(spec) {
9
9
  const binHit = WIN_SHELL_CHARS.exec(spec.bin);
10
10
  if (binHit)
11
11
  throw new Error(`the path to ${path.win32.basename(spec.bin)} (${spec.bin}) holds the shell character ${binHit[0]}, which cmd.exe would interpret. Move or reinstall the agent to a path without it.`);
@@ -1 +1 @@
1
- {"version":3,"file":"run-agent.js","sourceRoot":"","sources":["../../../src/lib/launch/run-agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run-agent.js","sourceRoot":"","sources":["../../../src/lib/launch/run-agent.ts"],"names":[],"mappings":"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"}