@aligndottech/cli 0.48.0 → 0.49.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 (151) hide show
  1. package/README.md +6 -5
  2. package/dist/cli.d.ts.map +1 -1
  3. package/dist/cli.js +9 -18
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/agents.d.ts.map +1 -1
  6. package/dist/commands/agents.js +3 -1
  7. package/dist/commands/agents.js.map +1 -1
  8. package/dist/commands/ai.d.ts +11 -0
  9. package/dist/commands/ai.d.ts.map +1 -0
  10. package/dist/commands/ai.js +121 -0
  11. package/dist/commands/ai.js.map +1 -0
  12. package/dist/commands/default-action.js +2 -2
  13. package/dist/commands/default-action.js.map +1 -1
  14. package/dist/commands/registry.d.ts.map +1 -1
  15. package/dist/commands/registry.js +4 -0
  16. package/dist/commands/registry.js.map +1 -1
  17. package/dist/commands/setup.d.ts.map +1 -1
  18. package/dist/commands/setup.js +53 -191
  19. package/dist/commands/setup.js.map +1 -1
  20. package/dist/commands/why.d.ts.map +1 -1
  21. package/dist/commands/why.js +21 -0
  22. package/dist/commands/why.js.map +1 -1
  23. package/dist/index.d.ts +1 -1
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/lib/ask-key-offer.d.ts +38 -0
  28. package/dist/lib/ask-key-offer.d.ts.map +1 -0
  29. package/dist/lib/ask-key-offer.js +130 -0
  30. package/dist/lib/ask-key-offer.js.map +1 -0
  31. package/dist/lib/config.d.ts +25 -24
  32. package/dist/lib/config.d.ts.map +1 -1
  33. package/dist/lib/config.js +37 -45
  34. package/dist/lib/config.js.map +1 -1
  35. package/dist/lib/launch/adapters/amp.d.ts +18 -0
  36. package/dist/lib/launch/adapters/amp.d.ts.map +1 -0
  37. package/dist/lib/launch/adapters/amp.js +29 -0
  38. package/dist/lib/launch/adapters/amp.js.map +1 -0
  39. package/dist/lib/launch/adapters/droid.d.ts +19 -0
  40. package/dist/lib/launch/adapters/droid.d.ts.map +1 -0
  41. package/dist/lib/launch/adapters/droid.js +38 -0
  42. package/dist/lib/launch/adapters/droid.js.map +1 -0
  43. package/dist/lib/launch/adapters/grok-build.d.ts +16 -0
  44. package/dist/lib/launch/adapters/grok-build.d.ts.map +1 -0
  45. package/dist/lib/launch/adapters/grok-build.js +25 -0
  46. package/dist/lib/launch/adapters/grok-build.js.map +1 -0
  47. package/dist/lib/launch/adapters/kiro.d.ts +17 -0
  48. package/dist/lib/launch/adapters/kiro.d.ts.map +1 -0
  49. package/dist/lib/launch/adapters/kiro.js +25 -0
  50. package/dist/lib/launch/adapters/kiro.js.map +1 -0
  51. package/dist/lib/launch/adapters/qwen.d.ts +25 -0
  52. package/dist/lib/launch/adapters/qwen.d.ts.map +1 -0
  53. package/dist/lib/launch/adapters/qwen.js +67 -0
  54. package/dist/lib/launch/adapters/qwen.js.map +1 -0
  55. package/dist/lib/launch/agents.d.ts +4 -1
  56. package/dist/lib/launch/agents.d.ts.map +1 -1
  57. package/dist/lib/launch/agents.js +10 -4
  58. package/dist/lib/launch/agents.js.map +1 -1
  59. package/dist/lib/launch/amp-state.d.ts +21 -0
  60. package/dist/lib/launch/amp-state.d.ts.map +1 -0
  61. package/dist/lib/launch/amp-state.js +61 -0
  62. package/dist/lib/launch/amp-state.js.map +1 -0
  63. package/dist/lib/launch/config-writes.d.ts +7 -1
  64. package/dist/lib/launch/config-writes.d.ts.map +1 -1
  65. package/dist/lib/launch/config-writes.js +60 -7
  66. package/dist/lib/launch/config-writes.js.map +1 -1
  67. package/dist/lib/launch/detect.d.ts.map +1 -1
  68. package/dist/lib/launch/detect.js +2 -1
  69. package/dist/lib/launch/detect.js.map +1 -1
  70. package/dist/lib/launch/droid-state.d.ts +24 -0
  71. package/dist/lib/launch/droid-state.d.ts.map +1 -0
  72. package/dist/lib/launch/droid-state.js +74 -0
  73. package/dist/lib/launch/droid-state.js.map +1 -0
  74. package/dist/lib/launch/grok-state.d.ts +42 -0
  75. package/dist/lib/launch/grok-state.d.ts.map +1 -0
  76. package/dist/lib/launch/grok-state.js +128 -0
  77. package/dist/lib/launch/grok-state.js.map +1 -0
  78. package/dist/lib/launch/kiro-state.d.ts +22 -0
  79. package/dist/lib/launch/kiro-state.d.ts.map +1 -0
  80. package/dist/lib/launch/kiro-state.js +59 -0
  81. package/dist/lib/launch/kiro-state.js.map +1 -0
  82. package/dist/lib/launch/launch.d.ts +34 -0
  83. package/dist/lib/launch/launch.d.ts.map +1 -1
  84. package/dist/lib/launch/launch.js +34 -3
  85. package/dist/lib/launch/launch.js.map +1 -1
  86. package/dist/lib/launch/layer-files.d.ts +12 -0
  87. package/dist/lib/launch/layer-files.d.ts.map +1 -0
  88. package/dist/lib/launch/layer-files.js +43 -0
  89. package/dist/lib/launch/layer-files.js.map +1 -0
  90. package/dist/lib/launch/pick-agent.d.ts.map +1 -1
  91. package/dist/lib/launch/pick-agent.js +7 -6
  92. package/dist/lib/launch/pick-agent.js.map +1 -1
  93. package/dist/lib/launch/qwen-state.d.ts +30 -0
  94. package/dist/lib/launch/qwen-state.d.ts.map +1 -0
  95. package/dist/lib/launch/qwen-state.js +57 -0
  96. package/dist/lib/launch/qwen-state.js.map +1 -0
  97. package/dist/lib/launch/qwen-trust.d.ts +24 -0
  98. package/dist/lib/launch/qwen-trust.d.ts.map +1 -0
  99. package/dist/lib/launch/qwen-trust.js +100 -0
  100. package/dist/lib/launch/qwen-trust.js.map +1 -0
  101. package/dist/lib/launch/registry/agents/amp.d.ts +3 -0
  102. package/dist/lib/launch/registry/agents/amp.d.ts.map +1 -0
  103. package/dist/lib/launch/registry/agents/amp.js +14 -0
  104. package/dist/lib/launch/registry/agents/amp.js.map +1 -0
  105. package/dist/lib/launch/registry/agents/droid.d.ts +3 -0
  106. package/dist/lib/launch/registry/agents/droid.d.ts.map +1 -0
  107. package/dist/lib/launch/registry/agents/droid.js +13 -0
  108. package/dist/lib/launch/registry/agents/droid.js.map +1 -0
  109. package/dist/lib/launch/registry/agents/grok-build.d.ts +3 -0
  110. package/dist/lib/launch/registry/agents/grok-build.d.ts.map +1 -0
  111. package/dist/lib/launch/registry/agents/grok-build.js +14 -0
  112. package/dist/lib/launch/registry/agents/grok-build.js.map +1 -0
  113. package/dist/lib/launch/registry/agents/kiro.d.ts +3 -0
  114. package/dist/lib/launch/registry/agents/kiro.d.ts.map +1 -0
  115. package/dist/lib/launch/registry/agents/kiro.js +11 -0
  116. package/dist/lib/launch/registry/agents/kiro.js.map +1 -0
  117. package/dist/lib/launch/registry/agents/qwen.d.ts +3 -0
  118. package/dist/lib/launch/registry/agents/qwen.d.ts.map +1 -0
  119. package/dist/lib/launch/registry/agents/qwen.js +11 -0
  120. package/dist/lib/launch/registry/agents/qwen.js.map +1 -0
  121. package/dist/lib/launch/registry/index.d.ts +4 -1
  122. package/dist/lib/launch/registry/index.d.ts.map +1 -1
  123. package/dist/lib/launch/registry/index.js +10 -2
  124. package/dist/lib/launch/registry/index.js.map +1 -1
  125. package/dist/lib/launch/registry/types.d.ts +6 -1
  126. package/dist/lib/launch/registry/types.d.ts.map +1 -1
  127. package/dist/lib/launch/run-agent.d.ts +11 -0
  128. package/dist/lib/launch/run-agent.d.ts.map +1 -1
  129. package/dist/lib/launch/run-agent.js +22 -1
  130. package/dist/lib/launch/run-agent.js.map +1 -1
  131. package/dist/lib/launch/strict-entry.d.ts +1 -1
  132. package/dist/lib/launch/strict-entry.d.ts.map +1 -1
  133. package/dist/lib/launch/strict-entry.js +3 -1
  134. package/dist/lib/launch/strict-entry.js.map +1 -1
  135. package/dist/lib/llm-providers.d.ts +66 -0
  136. package/dist/lib/llm-providers.d.ts.map +1 -0
  137. package/dist/lib/llm-providers.js +150 -0
  138. package/dist/lib/llm-providers.js.map +1 -0
  139. package/dist/lib/local-llm.d.ts +63 -12
  140. package/dist/lib/local-llm.d.ts.map +1 -1
  141. package/dist/lib/local-llm.js +229 -104
  142. package/dist/lib/local-llm.js.map +1 -1
  143. package/dist/lib/safe-config-write.d.ts +12 -1
  144. package/dist/lib/safe-config-write.d.ts.map +1 -1
  145. package/dist/lib/safe-config-write.js +123 -7
  146. package/dist/lib/safe-config-write.js.map +1 -1
  147. package/dist/lib/startup-env.d.ts +8 -0
  148. package/dist/lib/startup-env.d.ts.map +1 -0
  149. package/dist/lib/startup-env.js +8 -0
  150. package/dist/lib/startup-env.js.map +1 -0
  151. package/package.json +1 -1
@@ -0,0 +1,19 @@
1
+ import type { DroidProjectState } from '../droid-state.js';
2
+ import type { LaunchContext, LaunchSpec } from './claude-code.js';
3
+ export interface DroidLaunchContext extends Pick<LaunchContext, 'passthrough' | 'cachePath'>, DroidProjectState {
4
+ }
5
+ /**
6
+ * Factory Droid, per session, nothing written to the user's own config (droid 0.237.0):
7
+ * `--settings <path>` is a "runtime settings file merged for this process only", and its `mcp`
8
+ * key takes the mcp.json shape. Droid lists that server as `[runtime]` beside the user's own,
9
+ * and the runtime definition wins a same-named one (verified with `droid --settings f mcp list`).
10
+ * The instructions go in with `--append-system-prompt-file` unless an AGENTS.md already holds them.
11
+ *
12
+ * A user who runs Droid with their own runtime settings keeps them: Droid takes one, so align
13
+ * adds no second file and says so in one line.
14
+ *
15
+ * ORDER: our flags go FIRST. They are root options (`droid --settings f mcp list` is accepted),
16
+ * so in front they apply to a bare session and to `exec`, and never land after a user's `--`.
17
+ */
18
+ export declare function buildDroidLaunch(c: DroidLaunchContext): LaunchSpec;
19
+ //# sourceMappingURL=droid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"droid.d.ts","sourceRoot":"","sources":["../../../../src/lib/launch/adapters/droid.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAc,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9E,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,aAAa,EAAE,aAAa,GAAG,WAAW,CAAC,EAAE,iBAAiB;CAAG;AAMlH;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,kBAAkB,GAAG,UAAU,CAgBlE"}
@@ -0,0 +1,38 @@
1
+ import { alignNudgeBody } from '../../agent-rules.js';
2
+ import { alignServerEntry } from '../../mcp-setup.js';
3
+ /** Same reason as the Claude adapter: never shadow a user's own `align` server. */
4
+ const INJECTED_SERVER_NAME = 'align-local';
5
+ const SETTINGS_FILE = 'droid-settings.json';
6
+ /**
7
+ * Factory Droid, per session, nothing written to the user's own config (droid 0.237.0):
8
+ * `--settings <path>` is a "runtime settings file merged for this process only", and its `mcp`
9
+ * key takes the mcp.json shape. Droid lists that server as `[runtime]` beside the user's own,
10
+ * and the runtime definition wins a same-named one (verified with `droid --settings f mcp list`).
11
+ * The instructions go in with `--append-system-prompt-file` unless an AGENTS.md already holds them.
12
+ *
13
+ * A user who runs Droid with their own runtime settings keeps them: Droid takes one, so align
14
+ * adds no second file and says so in one line.
15
+ *
16
+ * ORDER: our flags go FIRST. They are root options (`droid --settings f mcp list` is accepted),
17
+ * so in front they apply to a bare session and to `exec`, and never land after a user's `--`.
18
+ */
19
+ export function buildDroidLaunch(c) {
20
+ const injected = [];
21
+ const files = [];
22
+ const notes = [];
23
+ if (c.ownSettings !== undefined) {
24
+ notes.push(`Droid is using your own runtime settings (${c.ownSettings}), so Align did not add its graph tools to this session.`);
25
+ }
26
+ else if (c.overridden.length > 0 || !c.present) {
27
+ files.push({ name: SETTINGS_FILE, content: `${JSON.stringify({ mcp: { mcpServers: { [INJECTED_SERVER_NAME]: alignServerEntry('vscode', 'local') } } }, null, 2)}\n` });
28
+ injected.push('--settings', c.cachePath(SETTINGS_FILE));
29
+ if (c.overridden.length > 0)
30
+ notes.push(`Droid will use Align's own align-local MCP server this session, not the one in ${c.overridden.join(', ')}.`);
31
+ }
32
+ if (!c.projectHasBlock) {
33
+ files.push({ name: 'align-instructions.md', content: `${alignNudgeBody()}\n` });
34
+ injected.push('--append-system-prompt-file', c.cachePath('align-instructions.md'));
35
+ }
36
+ return { bin: 'droid', args: [...injected, ...c.passthrough], env: { ALIGN_WRAPPED: '1' }, files, ...(notes.length > 0 ? { notes } : {}) };
37
+ }
38
+ //# sourceMappingURL=droid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"droid.js","sourceRoot":"","sources":["../../../../src/lib/launch/adapters/droid.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAMtD,mFAAmF;AACnF,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAC3C,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAE5C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAqB;IACpD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,KAAK,GAAiB,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC,WAAW,0DAA0D,CAAC,CAAC;IACnI,CAAC;SAAM,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,gBAAgB,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACvK,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxJ,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,GAAG,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC;QAChF,QAAQ,CAAC,IAAI,CAAC,6BAA6B,EAAE,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,GAAG,QAAQ,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7I,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { GrokProjectState } from '../grok-state.js';
2
+ import type { LaunchContext, LaunchSpec } from './claude-code.js';
3
+ export interface GrokLaunchContext extends Pick<LaunchContext, 'passthrough'>, GrokProjectState {
4
+ }
5
+ /**
6
+ * Grok Build (xAI's `grok`), written ONCE: grok 1.0.50 has no per-session MCP input (no flag in
7
+ * its CLI source; the GROK_CONFIG overlay is allowlisted and excludes `mcp_servers`), so the
8
+ * `[mcp_servers.align-local]` table is appended once to `$GROK_HOME/config.toml` inside an
9
+ * align-owned marked block, by the safe writer, with an exact `align use --undo` (verified in a
10
+ * sandbox: `grok mcp list` then shows the user's servers and align-local).
11
+ *
12
+ * No flags are injected: no `--trust`, Grok's folder trust stays the user's decision.
13
+ * Instructions come from AGENTS.md / CLAUDE.md, which Grok reads.
14
+ */
15
+ export declare function buildGrokLaunch(c: GrokLaunchContext): LaunchSpec;
16
+ //# sourceMappingURL=grok-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok-build.d.ts","sourceRoot":"","sources":["../../../../src/lib/launch/adapters/grok-build.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,gBAAgB;CAAG;AAIlG;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAUhE"}
@@ -0,0 +1,25 @@
1
+ import { alignServerEntry } from '../../mcp-setup.js';
2
+ const INJECTED_SERVER_NAME = 'align-local';
3
+ /**
4
+ * Grok Build (xAI's `grok`), written ONCE: grok 1.0.50 has no per-session MCP input (no flag in
5
+ * its CLI source; the GROK_CONFIG overlay is allowlisted and excludes `mcp_servers`), so the
6
+ * `[mcp_servers.align-local]` table is appended once to `$GROK_HOME/config.toml` inside an
7
+ * align-owned marked block, by the safe writer, with an exact `align use --undo` (verified in a
8
+ * sandbox: `grok mcp list` then shows the user's servers and align-local).
9
+ *
10
+ * No flags are injected: no `--trust`, Grok's folder trust stays the user's decision.
11
+ * Instructions come from AGENTS.md / CLAUDE.md, which Grok reads.
12
+ */
13
+ export function buildGrokLaunch(c) {
14
+ const writes = [];
15
+ const notes = [];
16
+ if (c.conflict) {
17
+ notes.push(`${c.conflict} defines its own align-local MCP server, so Align did not add its graph to Grok Build. Remove that entry to use the graph.`);
18
+ }
19
+ else if (!c.present) {
20
+ const { command, args } = alignServerEntry('mcpServers', 'local');
21
+ writes.push({ kind: 'toml-mcp-entry', file: c.configFile, topKey: 'mcp_servers', name: INJECTED_SERVER_NAME, entry: { command, args } });
22
+ }
23
+ return { bin: 'grok', args: [...c.passthrough], env: { ALIGN_WRAPPED: '1' }, files: [], ...(writes.length > 0 ? { writes } : {}), ...(notes.length > 0 ? { notes } : {}) };
24
+ }
25
+ //# sourceMappingURL=grok-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grok-build.js","sourceRoot":"","sources":["../../../../src/lib/launch/adapters/grok-build.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAOtD,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAE3C;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,CAAoB;IAClD,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,4HAA4H,CAAC,CAAC;IACxJ,CAAC;SAAM,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACtB,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAwC,CAAC;QACzG,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC3I,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAC7K,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { KiroProjectState } from '../kiro-state.js';
2
+ import type { LaunchContext, LaunchSpec } from './claude-code.js';
3
+ export interface KiroLaunchContext extends Pick<LaunchContext, 'passthrough'>, KiroProjectState {
4
+ }
5
+ /**
6
+ * Kiro CLI, written ONCE, from its docs only: no per-session MCP input is documented, so the
7
+ * `align-local` entry goes into the user's global `~/.kiro/settings/mcp.json` by the safe writer,
8
+ * once, with an exact `align use --undo`.
9
+ *
10
+ * Deliberately NOT a custom agent file launched with `--agent`: an agent file declares its own
11
+ * tools, and whether it keeps the user's own MCP servers and default tools could not be checked
12
+ * against a binary (no npm package; the installer is a script, which align never runs). An agent
13
+ * that silently hid the user's tools would be worse than none. No flags are injected: no
14
+ * `--trust-all-tools`, Kiro's own approval stays the user's. Instructions come from AGENTS.md.
15
+ */
16
+ export declare function buildKiroLaunch(c: KiroLaunchContext): LaunchSpec;
17
+ //# sourceMappingURL=kiro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kiro.d.ts","sourceRoot":"","sources":["../../../../src/lib/launch/adapters/kiro.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,gBAAgB;CAAG;AAIlG;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,iBAAiB,GAAG,UAAU,CAShE"}
@@ -0,0 +1,25 @@
1
+ import { alignServerEntry } from '../../mcp-setup.js';
2
+ const INJECTED_SERVER_NAME = 'align-local';
3
+ /**
4
+ * Kiro CLI, written ONCE, from its docs only: no per-session MCP input is documented, so the
5
+ * `align-local` entry goes into the user's global `~/.kiro/settings/mcp.json` by the safe writer,
6
+ * once, with an exact `align use --undo`.
7
+ *
8
+ * Deliberately NOT a custom agent file launched with `--agent`: an agent file declares its own
9
+ * tools, and whether it keeps the user's own MCP servers and default tools could not be checked
10
+ * against a binary (no npm package; the installer is a script, which align never runs). An agent
11
+ * that silently hid the user's tools would be worse than none. No flags are injected: no
12
+ * `--trust-all-tools`, Kiro's own approval stays the user's. Instructions come from AGENTS.md.
13
+ */
14
+ export function buildKiroLaunch(c) {
15
+ const writes = [];
16
+ const notes = [];
17
+ if (c.conflict) {
18
+ notes.push(`${c.conflict} defines its own align-local MCP server, so Align did not add its graph to Kiro. Remove that entry to use the graph.`);
19
+ }
20
+ else if (!c.present) {
21
+ writes.push({ kind: 'mcp-entry', file: c.mcpFile, topKey: 'mcpServers', name: INJECTED_SERVER_NAME, entry: alignServerEntry('mcpServers', 'local') });
22
+ }
23
+ return { bin: 'kiro-cli', args: [...c.passthrough], env: { ALIGN_WRAPPED: '1' }, files: [], ...(writes.length > 0 ? { writes } : {}), ...(notes.length > 0 ? { notes } : {}) };
24
+ }
25
+ //# sourceMappingURL=kiro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kiro.js","sourceRoot":"","sources":["../../../../src/lib/launch/adapters/kiro.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAOtD,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAE3C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,eAAe,CAAC,CAAoB;IAClD,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,sHAAsH,CAAC,CAAC;IAClJ,CAAC;SAAM,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACtB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,gBAAgB,CAAC,YAAY,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;IACxJ,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,WAAW,CAAC,EAAE,GAAG,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AACjL,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { type QwenProjectState } from '../qwen-state.js';
2
+ import type { LaunchContext, LaunchSpec } from './claude-code.js';
3
+ export interface QwenLaunchContext extends Pick<LaunchContext, 'passthrough' | 'cachePath'>, QwenProjectState {
4
+ /** The environment the child will inherit: the user's own QWEN_CODE_* are read from here. */
5
+ env: Record<string, string | undefined>;
6
+ platform: string;
7
+ }
8
+ export declare const QWEN_TRUST_NOTE = "Qwen Code turns off MCP servers, Align's included, in folders you haven't trusted. Trust this folder in Qwen Code to use the graph here.";
9
+ /**
10
+ * Qwen Code, per session, nothing written to the user's own config (qwen-code 0.25.0, a Gemini
11
+ * CLI fork with the same mechanism): QWEN_CODE_SYSTEM_SETTINGS_PATH names the system settings
12
+ * file, read LAST and merged shallowly, so align points it at a 0600 COPY of the file Qwen would
13
+ * otherwise read with align-local added (verified: `qwen mcp list` then shows the user's servers
14
+ * and align-local, and align's entry replaces a user or workspace align-local whole). The
15
+ * original system-defaults location is pinned with QWEN_CODE_SYSTEM_DEFAULTS_PATH unless the
16
+ * user set it. A system file align cannot read or parse is never replaced: no injection, one line.
17
+ *
18
+ * Not `--mcp-config`: Qwen has one, but how it ranks against a same-named server in a settings
19
+ * layer was not established, and the system tier's rank was.
20
+ *
21
+ * Trust: off by default in Qwen; when on, an untrusted folder gets MCP turned off, and align says
22
+ * so in one line. It never trusts a folder for the user. Pass-through args are the whole of the args.
23
+ */
24
+ export declare function buildQwenLaunch(c: QwenLaunchContext): LaunchSpec;
25
+ //# sourceMappingURL=qwen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qwen.d.ts","sourceRoot":"","sources":["../../../../src/lib/launch/adapters/qwen.ts"],"names":[],"mappings":"AACA,OAAO,EAAkC,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGzF,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAElE,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,aAAa,EAAE,aAAa,GAAG,WAAW,CAAC,EAAE,gBAAgB;IAC3G,6FAA6F;IAC7F,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD,eAAO,MAAM,eAAe,6IAA6I,CAAC;AAa1K;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,iBAAiB,GAAG,UAAU,CA6BhE"}
@@ -0,0 +1,67 @@
1
+ import { alignServerEntry } from '../../mcp-setup.js';
2
+ import { QWEN_COPY_PREFIX, qwenCopyName } from '../qwen-state.js';
3
+ import { qwenSystemDefaultsPath } from '../qwen-trust.js';
4
+ import { parseJsonc } from '../strict-entry.js';
5
+ /** Same reason as the Claude adapter: never shadow a user's own `align` server. */
6
+ const INJECTED_SERVER_NAME = 'align-local';
7
+ export const QWEN_TRUST_NOTE = "Qwen Code turns off MCP servers, Align's included, in folders you haven't trusted. Trust this folder in Qwen Code to use the graph here.";
8
+ const isObject = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
9
+ function parseTheirs(text) {
10
+ if (text === null)
11
+ return {};
12
+ const parsed = parseJsonc(text);
13
+ if (!parsed)
14
+ return null;
15
+ if (parsed['mcpServers'] !== undefined && !isObject(parsed['mcpServers']))
16
+ return null;
17
+ return parsed;
18
+ }
19
+ /**
20
+ * Qwen Code, per session, nothing written to the user's own config (qwen-code 0.25.0, a Gemini
21
+ * CLI fork with the same mechanism): QWEN_CODE_SYSTEM_SETTINGS_PATH names the system settings
22
+ * file, read LAST and merged shallowly, so align points it at a 0600 COPY of the file Qwen would
23
+ * otherwise read with align-local added (verified: `qwen mcp list` then shows the user's servers
24
+ * and align-local, and align's entry replaces a user or workspace align-local whole). The
25
+ * original system-defaults location is pinned with QWEN_CODE_SYSTEM_DEFAULTS_PATH unless the
26
+ * user set it. A system file align cannot read or parse is never replaced: no injection, one line.
27
+ *
28
+ * Not `--mcp-config`: Qwen has one, but how it ranks against a same-named server in a settings
29
+ * layer was not established, and the system tier's rank was.
30
+ *
31
+ * Trust: off by default in Qwen; when on, an untrusted folder gets MCP turned off, and align says
32
+ * so in one line. It never trusts a folder for the user. Pass-through args are the whole of the args.
33
+ */
34
+ export function buildQwenLaunch(c) {
35
+ const env = { ALIGN_WRAPPED: '1' };
36
+ const files = [];
37
+ const notes = [];
38
+ const copy = qwenCopyName(c.systemSettings.path);
39
+ let injected = false;
40
+ if (c.overridden.length > 0 || !c.present) {
41
+ const theirs = c.systemSettings.unreadable ? null : parseTheirs(c.systemSettings.text);
42
+ if (!theirs) {
43
+ notes.push(`Qwen Code's system settings file ${c.systemSettings.path} is not readable JSON with an object "mcpServers", so Align's graph tools were not added to this session. Fix the file, or point QWEN_CODE_SYSTEM_SETTINGS_PATH at one that is.`);
44
+ }
45
+ else {
46
+ const merged = { ...theirs, mcpServers: { ...(theirs['mcpServers'] ?? {}), [INJECTED_SERVER_NAME]: alignServerEntry('mcpServers', 'local') } };
47
+ files.push({ name: copy, content: `${JSON.stringify(merged, null, 2)}\n`, mode: 0o600 });
48
+ env['QWEN_CODE_SYSTEM_SETTINGS_PATH'] = c.cachePath(copy);
49
+ if (!c.env['QWEN_CODE_SYSTEM_DEFAULTS_PATH'])
50
+ env['QWEN_CODE_SYSTEM_DEFAULTS_PATH'] = qwenSystemDefaultsPath(c.systemSettings.path, c.platform);
51
+ if (c.overridden.length > 0)
52
+ notes.push(`Qwen Code will use Align's own align-local MCP server this session, not the one in ${c.overridden.join(', ')}.`);
53
+ injected = true;
54
+ }
55
+ }
56
+ if (c.trust === 'untrusted' || c.trust === 'unknown')
57
+ notes.push(QWEN_TRUST_NOTE);
58
+ return {
59
+ bin: 'qwen',
60
+ args: [...c.passthrough],
61
+ env,
62
+ files,
63
+ prune: { prefix: QWEN_COPY_PREFIX, ...(injected ? { keep: copy } : { remove: copy }) },
64
+ ...(notes.length > 0 ? { notes } : {}),
65
+ };
66
+ }
67
+ //# sourceMappingURL=qwen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qwen.js","sourceRoot":"","sources":["../../../../src/lib/launch/adapters/qwen.ts"],"names":[],"mappings":"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"}
@@ -21,11 +21,14 @@ export declare const supportedAgents: () => LaunchAgent[];
21
21
  export declare const PICK_PRIORITY: readonly LaunchAgentId[];
22
22
  /** The agents launchable before wave A. */
23
23
  export declare const PRE_WAVE_A: ReadonlySet<LaunchAgentId>;
24
+ /** The agents launchable before wave B (wave A included). */
25
+ export declare const PRE_WAVE_B: ReadonlySet<LaunchAgentId>;
24
26
  export declare function byPriority(agents: LaunchAgent[]): LaunchAgent[];
25
27
  /**
26
28
  * The agent's binary on PATH, and where. Only `bin` is accepted: for Cursor that is `cursor-agent`,
27
29
  * which its installer always creates. Cursor's docs also call the command `agent`, but that name
28
- * is too generic to run on a guess, so a bare `agent` on PATH is not Cursor.
30
+ * is too generic to run on a guess, so a bare `agent` on PATH is not Cursor. A spec whose `bin` is
31
+ * generic (Grok Build's `grok`) also names `acceptsBin`, and a `bin` it refuses is not installed.
29
32
  */
30
33
  export declare function resolveAgentBin(a: LaunchAgent, find: (bin: string, env: Record<string, string | undefined>, platform: string) => string | null, env: Record<string, string | undefined>, platform: string): {
31
34
  bin: string;
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/agents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,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,wFAAwF;IACxF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAE/C,CAAC;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAE7E;AAED,eAAO,MAAM,eAAe,QAAO,WAAW,EAA8C,CAAC;AAE7F;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,aAAa,EAAkF,CAAC;AACrI,2CAA2C;AAC3C,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,aAAa,CAAwD,CAAC;AAE3G,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAM/D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,WAAW,EACd,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,EAC/F,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,QAAQ,EAAE,MAAM,GACf;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAGtC"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/agents.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC1B,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,wFAAwF;IACxF,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,aAAa,EAAE,SAAS,WAAW,EAE/C,CAAC;AAEF,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAE7E;AAED,eAAO,MAAM,eAAe,QAAO,WAAW,EAA8C,CAAC;AAE7F;;;;GAIG;AACH,eAAO,MAAM,aAAa,EAAE,SAAS,aAAa,EAAgI,CAAC;AACnL,2CAA2C;AAC3C,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,aAAa,CAAwD,CAAC;AAC3G,6DAA6D;AAC7D,eAAO,MAAM,UAAU,EAAE,WAAW,CAAC,aAAa,CAA8D,CAAC;AAEjH,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CAM/D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,WAAW,EACd,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,EAC/F,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,QAAQ,EAAE,MAAM,GACf;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAKtC"}
@@ -1,5 +1,5 @@
1
1
  import { installText } from './install.js';
2
- import { AGENT_REGISTRY } from './registry/index.js';
2
+ import { AGENT_REGISTRY, specByName } from './registry/index.js';
3
3
  export const LAUNCH_AGENTS = AGENT_REGISTRY.map(({ name, label, bin, injection, supported, install }) => ({ name, label, bin, injection, supported, install: installText(install) }));
4
4
  export function agentByName(name) {
5
5
  return LAUNCH_AGENTS.find((a) => a.name === name);
@@ -10,9 +10,11 @@ export const supportedAgents = () => LAUNCH_AGENTS.filter((a) => a.supported);
10
10
  * --approve). The agents launchable before wave A keep their old order, Claude Code first, so a
11
11
  * scripted first run picks what it picked before; the wave A agents come after them.
12
12
  */
13
- export const PICK_PRIORITY = ['claude-code', 'cursor', 'opencode', 'pi', 'codex', 'copilot', 'gemini-cli'];
13
+ export const PICK_PRIORITY = ['claude-code', 'cursor', 'opencode', 'pi', 'codex', 'copilot', 'gemini-cli', 'amp', 'droid', 'grok-build', 'kiro', 'qwen'];
14
14
  /** The agents launchable before wave A. */
15
15
  export const PRE_WAVE_A = new Set(['claude-code', 'cursor', 'opencode', 'pi']);
16
+ /** The agents launchable before wave B (wave A included). */
17
+ export const PRE_WAVE_B = new Set([...PRE_WAVE_A, 'codex', 'copilot', 'gemini-cli']);
16
18
  export function byPriority(agents) {
17
19
  const rank = (a) => {
18
20
  const i = PICK_PRIORITY.indexOf(a.name);
@@ -23,10 +25,14 @@ export function byPriority(agents) {
23
25
  /**
24
26
  * The agent's binary on PATH, and where. Only `bin` is accepted: for Cursor that is `cursor-agent`,
25
27
  * which its installer always creates. Cursor's docs also call the command `agent`, but that name
26
- * is too generic to run on a guess, so a bare `agent` on PATH is not Cursor.
28
+ * is too generic to run on a guess, so a bare `agent` on PATH is not Cursor. A spec whose `bin` is
29
+ * generic (Grok Build's `grok`) also names `acceptsBin`, and a `bin` it refuses is not installed.
27
30
  */
28
31
  export function resolveAgentBin(a, find, env, platform) {
29
32
  const found = find(a.bin, env, platform);
30
- return found ? { bin: a.bin, path: found } : null;
33
+ if (!found)
34
+ return null;
35
+ const accepts = specByName(a.name)?.acceptsBin;
36
+ return accepts && !accepts(found, env, platform) ? null : { bin: a.bin, path: found };
31
37
  }
32
38
  //# sourceMappingURL=agents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/lib/launch/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAerD,MAAM,CAAC,MAAM,aAAa,GAA2B,cAAc,CAAC,GAAG,CACrE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CACrI,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAwB;IAClD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,GAAkB,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAE7F;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAA6B,CAAC,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;AACrI,2CAA2C;AAC3C,MAAM,CAAC,MAAM,UAAU,GAA+B,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AAE3G,MAAM,UAAU,UAAU,CAAC,MAAqB;IAC9C,MAAM,IAAI,GAAG,CAAC,CAAc,EAAU,EAAE;QACtC,MAAM,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC;IACF,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,CAAc,EACd,IAA+F,EAC/F,GAAuC,EACvC,QAAgB;IAEhB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AACpD,CAAC"}
1
+ {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/lib/launch/agents.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAejE,MAAM,CAAC,MAAM,aAAa,GAA2B,cAAc,CAAC,GAAG,CACrE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CACrI,CAAC;AAEF,MAAM,UAAU,WAAW,CAAC,IAAwB;IAClD,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,GAAkB,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AAE7F;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAA6B,CAAC,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACnL,2CAA2C;AAC3C,MAAM,CAAC,MAAM,UAAU,GAA+B,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC;AAC3G,6DAA6D;AAC7D,MAAM,CAAC,MAAM,UAAU,GAA+B,IAAI,GAAG,CAAC,CAAC,GAAG,UAAU,EAAE,OAAO,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC;AAEjH,MAAM,UAAU,UAAU,CAAC,MAAqB;IAC9C,MAAM,IAAI,GAAG,CAAC,CAAc,EAAU,EAAE;QACtC,MAAM,CAAC,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC;IACF,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,CAAc,EACd,IAA+F,EAC/F,GAAuC,EACvC,QAAgB;IAEhB,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IACzC,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC/C,OAAO,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACxF,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { type AlignLocalState } from './strict-entry.js';
2
+ export interface AmpProjectState extends AlignLocalState {
3
+ /** The user settings file Amp reads this session: the one align adds to. */
4
+ settingsFile: string;
5
+ /** It parses only with its comments stripped: align never rewrites it (the comments would go). */
6
+ commented: boolean;
7
+ }
8
+ /** Amp's user settings file: `--settings-file`, else AMP_SETTINGS_FILE, else $XDG_CONFIG_HOME (or ~/.config)/amp/settings.json. */
9
+ export declare function ampSettingsFile(home: string, env: Record<string, string | undefined>, passthrough: string[]): string;
10
+ /**
11
+ * What Amp would already load for align (amp 0.0.1791576029; it reads its settings as JSONC):
12
+ * - the user settings file align adds to: a canonical `align` or align-local there is present;
13
+ * a non-canonical align-local is a conflict, because the writer adds and never edits;
14
+ * - a workspace `.amp/settings.json` (Amp uses the nearest one, up to the git root; every
15
+ * ancestor is read here, a superset): a non-canonical align-local there is a conflict. A
16
+ * workspace server waits for `amp mcp approve`, so it never stands in for us.
17
+ */
18
+ export declare function readAmpState(cwd: string, home: string, opts: {
19
+ localIsDefault: boolean;
20
+ }, env: Record<string, string | undefined>, platform: string, passthrough: string[]): AmpProjectState;
21
+ //# sourceMappingURL=amp-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amp-state.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/amp-state.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAqC,MAAM,mBAAmB,CAAC;AAE5F,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,4EAA4E;IAC5E,YAAY,EAAE,MAAM,CAAC;IACrB,kGAAkG;IAClG,SAAS,EAAE,OAAO,CAAC;CACpB;AAMD,mIAAmI;AACnI,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,CAKpH;AAWD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,cAAc,EAAE,OAAO,CAAA;CAAE,EACjC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM,EAAE,GACpB,eAAe,CA0BjB"}
@@ -0,0 +1,61 @@
1
+ import path from 'node:path';
2
+ import { ancestors, optionValue, readText } from './layer-files.js';
3
+ import { isCanonicalLocalEntry, parseJsonc } from './strict-entry.js';
4
+ const KEY = 'amp.mcpServers';
5
+ const isObject = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
6
+ /** Amp's user settings file: `--settings-file`, else AMP_SETTINGS_FILE, else $XDG_CONFIG_HOME (or ~/.config)/amp/settings.json. */
7
+ export function ampSettingsFile(home, env, passthrough) {
8
+ const flag = optionValue(passthrough, '--settings-file');
9
+ if (flag)
10
+ return path.resolve(flag);
11
+ if (env['AMP_SETTINGS_FILE'])
12
+ return path.resolve(env['AMP_SETTINGS_FILE']);
13
+ return path.join(env['XDG_CONFIG_HOME'] ? env['XDG_CONFIG_HOME'] : path.join(home, '.config'), 'amp', 'settings.json');
14
+ }
15
+ function strictParse(text) {
16
+ try {
17
+ JSON.parse(text);
18
+ return true;
19
+ }
20
+ catch {
21
+ return false;
22
+ }
23
+ }
24
+ /**
25
+ * What Amp would already load for align (amp 0.0.1791576029; it reads its settings as JSONC):
26
+ * - the user settings file align adds to: a canonical `align` or align-local there is present;
27
+ * a non-canonical align-local is a conflict, because the writer adds and never edits;
28
+ * - a workspace `.amp/settings.json` (Amp uses the nearest one, up to the git root; every
29
+ * ancestor is read here, a superset): a non-canonical align-local there is a conflict. A
30
+ * workspace server waits for `amp mcp approve`, so it never stands in for us.
31
+ */
32
+ export function readAmpState(cwd, home, opts, env, platform, passthrough) {
33
+ const o = { ...opts, platform, host: 'mcpServers' };
34
+ const settingsFile = ampSettingsFile(home, env, passthrough);
35
+ const servers = (text) => {
36
+ const s = parseJsonc(text)?.[KEY];
37
+ return isObject(s) ? s : undefined;
38
+ };
39
+ const text = readText(settingsFile);
40
+ const user = servers(text);
41
+ const state = {
42
+ present: isCanonicalLocalEntry(user?.['align'], o) || isCanonicalLocalEntry(user?.['align-local'], o),
43
+ overridden: [],
44
+ settingsFile,
45
+ commented: text !== null && text.trim() !== '' && !strictParse(text) && parseJsonc(text) !== null,
46
+ };
47
+ if (user && 'align-local' in user && !isCanonicalLocalEntry(user['align-local'], o))
48
+ state.conflict = settingsFile;
49
+ for (const dir of ancestors(cwd)) {
50
+ const file = path.join(dir, '.amp', 'settings.json');
51
+ if (file === settingsFile)
52
+ continue;
53
+ const ws = servers(readText(file));
54
+ if (ws && 'align-local' in ws && !isCanonicalLocalEntry(ws['align-local'], o)) {
55
+ state.conflict ??= file;
56
+ break;
57
+ }
58
+ }
59
+ return state;
60
+ }
61
+ //# sourceMappingURL=amp-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"amp-state.js","sourceRoot":"","sources":["../../../src/lib/launch/amp-state.ts"],"names":[],"mappings":"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"}
@@ -8,7 +8,8 @@
8
8
  * hooks.json entry written for a CLI launch would not be known to run.
9
9
  */
10
10
  export interface ConfigWrite {
11
- kind: 'mcp-entry';
11
+ /** mcp-entry: a key under `topKey` in a JSON file. toml-mcp-entry: a `[mcp_servers.<name>]` table appended to a TOML file. */
12
+ kind: 'mcp-entry' | 'toml-mcp-entry';
12
13
  file: string;
13
14
  topKey: string;
14
15
  name: string;
@@ -34,4 +35,9 @@ export interface RefusedMemo {
34
35
  * the caller reports it and launches anyway.
35
36
  */
36
37
  export declare function applyConfigWrite(w: ConfigWrite, note: (line: string) => void, memo?: RefusedMemo): void;
38
+ /** The block align owns in a TOML file: `align use --undo` takes out exactly this region. */
39
+ export declare function tomlMarkers(name: string): {
40
+ start: string;
41
+ end: string;
42
+ };
37
43
  //# sourceMappingURL=config-writes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-writes.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/config-writes.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,yHAAyH;IACzH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAKD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAiBvG"}
1
+ {"version":3,"file":"config-writes.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/config-writes.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,MAAM,WAAW,WAAW;IAC1B,8HAA8H;IAC9H,IAAI,EAAE,WAAW,GAAG,gBAAgB,CAAC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,yHAAyH;IACzH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2EAA2E;IAC3E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAKD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,IAAI,CAoBvG;AAED,6FAA6F;AAC7F,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAExE"}
@@ -1,4 +1,5 @@
1
- import { BACKUP_SUFFIX, safeWriteJson } from '../safe-config-write.js';
1
+ import { parse } from 'smol-toml';
2
+ import { BACKUP_SUFFIX, safeWriteJson, safeWriteText } from '../safe-config-write.js';
2
3
  const isObject = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
3
4
  /**
4
5
  * Every line goes to `note` (stderr). An entry that is already there, under any shape, is
@@ -7,12 +8,15 @@ const isObject = (v) => typeof v === 'object' && v !== null && !Array.isArray(v)
7
8
  */
8
9
  export function applyConfigWrite(w, note, memo) {
9
10
  const quiet = memo?.has(w.file) === true;
10
- const status = safeWriteJson(w.file, (cur) => {
11
- const servers = isObject(cur[w.topKey]) ? cur[w.topKey] : {};
12
- if (w.name in servers)
13
- return undefined;
14
- return { ...cur, [w.topKey]: { ...servers, [w.name]: w.entry } };
15
- }, { note: quiet ? () => undefined : note, trailingNewline: true, ...(w.root ? { root: w.root } : {}) });
11
+ const opts = { note: quiet ? () => undefined : note, ...(w.root ? { root: w.root } : {}) };
12
+ const status = w.kind === 'toml-mcp-entry'
13
+ ? safeWriteText(w.file, (cur) => appendTomlServer(w, cur), { ...opts, markers: tomlMarkers(w.name), tomlTable: [w.topKey, w.name] })
14
+ : safeWriteJson(w.file, (cur) => {
15
+ const servers = isObject(cur[w.topKey]) ? cur[w.topKey] : {};
16
+ if (w.name in servers)
17
+ return undefined;
18
+ return { ...cur, [w.topKey]: { ...servers, [w.name]: w.entry } };
19
+ }, { ...opts, trailingNewline: true });
16
20
  if (status === 'symlink')
17
21
  memo?.add(w.file);
18
22
  else if (quiet)
@@ -23,4 +27,53 @@ export function applyConfigWrite(w, note, memo) {
23
27
  note(w.hint);
24
28
  }
25
29
  }
30
+ /** The block align owns in a TOML file: `align use --undo` takes out exactly this region. */
31
+ export function tomlMarkers(name) {
32
+ return { start: `# >>> ${name}: added by align (undo: align use --undo)`, end: `# <<< ${name}` };
33
+ }
34
+ /** A TOML basic string. JSON's string syntax is valid TOML for the plain ASCII align writes. */
35
+ const tomlString = (v) => {
36
+ if (typeof v !== 'string' || /[^\x20-\x7e]/.test(v))
37
+ throw new Error(`cannot write ${JSON.stringify(v)} as a TOML string`);
38
+ return JSON.stringify(v);
39
+ };
40
+ /**
41
+ * The new text of a TOML config with `[mcp_servers.<name>]` appended at the end, which keeps
42
+ * every byte the user wrote (comments included). undefined when a server of that name is
43
+ * already there, under any shape. Throws, and so writes nothing, when the file does not parse
44
+ * as TOML, or when the appended table would not land as written (an inline `mcp_servers = {...}`
45
+ * table cannot be extended): the result is parsed back and compared before it is accepted.
46
+ */
47
+ function appendTomlServer(w, current) {
48
+ const before = current ?? '';
49
+ const { start, end } = tomlMarkers(w.name);
50
+ let parsed;
51
+ try {
52
+ parsed = parse(before);
53
+ }
54
+ catch {
55
+ throw new Error(`${w.file} is not valid TOML, so align left it alone`);
56
+ }
57
+ const servers = parsed['mcp_servers'];
58
+ if (isObject(servers) && w.name in servers)
59
+ return undefined;
60
+ // A marker already in the file (a stale one from a write that was cut short, or pasted text)
61
+ // would pair with ours, and undo would take out whatever sits between them.
62
+ if (before.includes(start) || before.includes(end)) {
63
+ throw new Error(`${w.file} already holds an align marker line ("${before.includes(start) ? start : end}"), so align left it alone. Remove that marker line by hand, then run align again`);
64
+ }
65
+ const body = Object.entries(w.entry).map(([k, v]) => `${k} = ${Array.isArray(v) ? `[${v.map(tomlString).join(', ')}]` : tomlString(v)}`);
66
+ const sep = before === '' ? '' : before.endsWith('\n') ? '\n' : '\n\n';
67
+ const next = `${before}${sep}${start}\n[mcp_servers.${w.name}]\n${body.join('\n')}\n${end}\n`;
68
+ let landed;
69
+ try {
70
+ landed = parse(next)['mcp_servers']?.[w.name];
71
+ }
72
+ catch {
73
+ landed = undefined;
74
+ }
75
+ if (JSON.stringify(landed) !== JSON.stringify(w.entry))
76
+ throw new Error(`align could not add [mcp_servers.${w.name}] to ${w.file} without changing what it means (an inline mcp_servers table?), so it left the file alone`);
77
+ return next;
78
+ }
26
79
  //# sourceMappingURL=config-writes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-writes.js","sourceRoot":"","sources":["../../../src/lib/launch/config-writes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAmCvE,MAAM,QAAQ,GAAG,CAAC,CAAU,EAAa,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAErG;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,CAAc,EAAE,IAA4B,EAAE,IAAkB;IAC/F,MAAM,KAAK,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IACzC,MAAM,MAAM,GAAG,aAAa,CAC1B,CAAC,CAAC,IAAI,EACN,CAAC,GAAG,EAAE,EAAE;QACN,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAE,GAAG,CAAC,CAAC,CAAC,MAAM,CAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,IAAI,CAAC,CAAC,IAAI,IAAI,OAAO;YAAE,OAAO,SAAS,CAAC;QACxC,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;IACnE,CAAC,EACD,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CACrG,CAAC;IACF,IAAI,MAAM,KAAK,SAAS;QAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACvC,IAAI,KAAK;QAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC,aAAa,CAAC,CAAC,IAAI,kBAAkB,CAAC,CAAC,IAAI,sBAAsB,CAAC,CAAC,IAAI,GAAG,aAAa,2BAA2B,CAAC,CAAC;QACzH,IAAI,CAAC,CAAC,IAAI;YAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"config-writes.js","sourceRoot":"","sources":["../../../src/lib/launch/config-writes.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/detect.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoBhH"}
1
+ {"version":3,"file":"detect.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/detect.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqBhH"}
@@ -16,7 +16,8 @@ export function findOnPath(bin, env, platform) {
16
16
  if (!dir)
17
17
  continue;
18
18
  for (const name of names) {
19
- const candidate = path.join(dir, name);
19
+ // Absolute, so what was checked here is what gets spawned whatever the cwd is by then.
20
+ const candidate = path.resolve(dir, name);
20
21
  try {
21
22
  if (!statSync(candidate).isFile())
22
23
  continue;
@@ -1 +1 @@
1
- {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/lib/launch/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,GAAuC,EAAE,QAAgB;IAC/F,MAAM,GAAG,GAAG,QAAQ,KAAK,OAAO,CAAC;IACjC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,qBAAqB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/F,MAAM,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;oBAAE,SAAS;gBAC5C,IAAI,CAAC,GAAG;oBAAE,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChD,OAAO,SAAS,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,6CAA6C;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../../src/lib/launch/detect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1D,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,GAAW,EAAE,GAAuC,EAAE,QAAgB;IAC/F,MAAM,GAAG,GAAG,QAAQ,KAAK,OAAO,CAAC;IACjC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,qBAAqB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC/F,MAAM,KAAK,GAAG,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpG,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,uFAAuF;YACvF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC;gBACH,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE;oBAAE,SAAS;gBAC5C,IAAI,CAAC,GAAG;oBAAE,UAAU,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;gBAChD,OAAO,SAAS,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,6CAA6C;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}