@aligndottech/cli 0.47.1 → 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 (220) 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 +20 -0
  6. package/dist/commands/agents.d.ts.map +1 -0
  7. package/dist/commands/agents.js +62 -0
  8. package/dist/commands/agents.js.map +1 -0
  9. package/dist/commands/ai.d.ts +11 -0
  10. package/dist/commands/ai.d.ts.map +1 -0
  11. package/dist/commands/ai.js +121 -0
  12. package/dist/commands/ai.js.map +1 -0
  13. package/dist/commands/default-action.js +2 -2
  14. package/dist/commands/default-action.js.map +1 -1
  15. package/dist/commands/registry.d.ts.map +1 -1
  16. package/dist/commands/registry.js +7 -0
  17. package/dist/commands/registry.js.map +1 -1
  18. package/dist/commands/setup.d.ts.map +1 -1
  19. package/dist/commands/setup.js +53 -191
  20. package/dist/commands/setup.js.map +1 -1
  21. package/dist/commands/use.js +1 -1
  22. package/dist/commands/use.js.map +1 -1
  23. package/dist/commands/why.d.ts.map +1 -1
  24. package/dist/commands/why.js +21 -0
  25. package/dist/commands/why.js.map +1 -1
  26. package/dist/index.d.ts +1 -1
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +1 -0
  29. package/dist/index.js.map +1 -1
  30. package/dist/lib/ask-key-offer.d.ts +38 -0
  31. package/dist/lib/ask-key-offer.d.ts.map +1 -0
  32. package/dist/lib/ask-key-offer.js +130 -0
  33. package/dist/lib/ask-key-offer.js.map +1 -0
  34. package/dist/lib/config.d.ts +25 -24
  35. package/dist/lib/config.d.ts.map +1 -1
  36. package/dist/lib/config.js +37 -45
  37. package/dist/lib/config.js.map +1 -1
  38. package/dist/lib/launch/adapters/amp.d.ts +18 -0
  39. package/dist/lib/launch/adapters/amp.d.ts.map +1 -0
  40. package/dist/lib/launch/adapters/amp.js +29 -0
  41. package/dist/lib/launch/adapters/amp.js.map +1 -0
  42. package/dist/lib/launch/adapters/claude-code.d.ts +8 -0
  43. package/dist/lib/launch/adapters/claude-code.d.ts.map +1 -1
  44. package/dist/lib/launch/adapters/claude-code.js.map +1 -1
  45. package/dist/lib/launch/adapters/codex.d.ts +17 -0
  46. package/dist/lib/launch/adapters/codex.d.ts.map +1 -0
  47. package/dist/lib/launch/adapters/codex.js +44 -0
  48. package/dist/lib/launch/adapters/codex.js.map +1 -0
  49. package/dist/lib/launch/adapters/copilot.d.ts +17 -0
  50. package/dist/lib/launch/adapters/copilot.d.ts.map +1 -0
  51. package/dist/lib/launch/adapters/copilot.js +29 -0
  52. package/dist/lib/launch/adapters/copilot.js.map +1 -0
  53. package/dist/lib/launch/adapters/droid.d.ts +19 -0
  54. package/dist/lib/launch/adapters/droid.d.ts.map +1 -0
  55. package/dist/lib/launch/adapters/droid.js +38 -0
  56. package/dist/lib/launch/adapters/droid.js.map +1 -0
  57. package/dist/lib/launch/adapters/gemini-cli.d.ts +25 -0
  58. package/dist/lib/launch/adapters/gemini-cli.d.ts.map +1 -0
  59. package/dist/lib/launch/adapters/gemini-cli.js +73 -0
  60. package/dist/lib/launch/adapters/gemini-cli.js.map +1 -0
  61. package/dist/lib/launch/adapters/grok-build.d.ts +16 -0
  62. package/dist/lib/launch/adapters/grok-build.d.ts.map +1 -0
  63. package/dist/lib/launch/adapters/grok-build.js +25 -0
  64. package/dist/lib/launch/adapters/grok-build.js.map +1 -0
  65. package/dist/lib/launch/adapters/kiro.d.ts +17 -0
  66. package/dist/lib/launch/adapters/kiro.d.ts.map +1 -0
  67. package/dist/lib/launch/adapters/kiro.js +25 -0
  68. package/dist/lib/launch/adapters/kiro.js.map +1 -0
  69. package/dist/lib/launch/adapters/qwen.d.ts +25 -0
  70. package/dist/lib/launch/adapters/qwen.d.ts.map +1 -0
  71. package/dist/lib/launch/adapters/qwen.js +67 -0
  72. package/dist/lib/launch/adapters/qwen.js.map +1 -0
  73. package/dist/lib/launch/agents.d.ts +16 -3
  74. package/dist/lib/launch/agents.d.ts.map +1 -1
  75. package/dist/lib/launch/agents.js +26 -4
  76. package/dist/lib/launch/agents.js.map +1 -1
  77. package/dist/lib/launch/amp-state.d.ts +21 -0
  78. package/dist/lib/launch/amp-state.d.ts.map +1 -0
  79. package/dist/lib/launch/amp-state.js +61 -0
  80. package/dist/lib/launch/amp-state.js.map +1 -0
  81. package/dist/lib/launch/codex-state.d.ts +31 -0
  82. package/dist/lib/launch/codex-state.d.ts.map +1 -0
  83. package/dist/lib/launch/codex-state.js +92 -0
  84. package/dist/lib/launch/codex-state.js.map +1 -0
  85. package/dist/lib/launch/config-writes.d.ts +7 -1
  86. package/dist/lib/launch/config-writes.d.ts.map +1 -1
  87. package/dist/lib/launch/config-writes.js +60 -7
  88. package/dist/lib/launch/config-writes.js.map +1 -1
  89. package/dist/lib/launch/copilot-state.d.ts +19 -0
  90. package/dist/lib/launch/copilot-state.d.ts.map +1 -0
  91. package/dist/lib/launch/copilot-state.js +51 -0
  92. package/dist/lib/launch/copilot-state.js.map +1 -0
  93. package/dist/lib/launch/detect.d.ts.map +1 -1
  94. package/dist/lib/launch/detect.js +2 -1
  95. package/dist/lib/launch/detect.js.map +1 -1
  96. package/dist/lib/launch/droid-state.d.ts +24 -0
  97. package/dist/lib/launch/droid-state.d.ts.map +1 -0
  98. package/dist/lib/launch/droid-state.js +74 -0
  99. package/dist/lib/launch/droid-state.js.map +1 -0
  100. package/dist/lib/launch/gemini-state.d.ts +32 -0
  101. package/dist/lib/launch/gemini-state.d.ts.map +1 -0
  102. package/dist/lib/launch/gemini-state.js +59 -0
  103. package/dist/lib/launch/gemini-state.js.map +1 -0
  104. package/dist/lib/launch/gemini-trust.d.ts +26 -0
  105. package/dist/lib/launch/gemini-trust.d.ts.map +1 -0
  106. package/dist/lib/launch/gemini-trust.js +103 -0
  107. package/dist/lib/launch/gemini-trust.js.map +1 -0
  108. package/dist/lib/launch/grok-state.d.ts +42 -0
  109. package/dist/lib/launch/grok-state.d.ts.map +1 -0
  110. package/dist/lib/launch/grok-state.js +128 -0
  111. package/dist/lib/launch/grok-state.js.map +1 -0
  112. package/dist/lib/launch/install.d.ts +33 -0
  113. package/dist/lib/launch/install.d.ts.map +1 -0
  114. package/dist/lib/launch/install.js +48 -0
  115. package/dist/lib/launch/install.js.map +1 -0
  116. package/dist/lib/launch/kiro-state.d.ts +22 -0
  117. package/dist/lib/launch/kiro-state.d.ts.map +1 -0
  118. package/dist/lib/launch/kiro-state.js +59 -0
  119. package/dist/lib/launch/kiro-state.js.map +1 -0
  120. package/dist/lib/launch/launch-files.d.ts +15 -0
  121. package/dist/lib/launch/launch-files.d.ts.map +1 -1
  122. package/dist/lib/launch/launch-files.js +64 -4
  123. package/dist/lib/launch/launch-files.js.map +1 -1
  124. package/dist/lib/launch/launch.d.ts +61 -6
  125. package/dist/lib/launch/launch.d.ts.map +1 -1
  126. package/dist/lib/launch/launch.js +98 -31
  127. package/dist/lib/launch/launch.js.map +1 -1
  128. package/dist/lib/launch/layer-files.d.ts +12 -0
  129. package/dist/lib/launch/layer-files.d.ts.map +1 -0
  130. package/dist/lib/launch/layer-files.js +43 -0
  131. package/dist/lib/launch/layer-files.js.map +1 -0
  132. package/dist/lib/launch/pick-agent.d.ts +12 -5
  133. package/dist/lib/launch/pick-agent.d.ts.map +1 -1
  134. package/dist/lib/launch/pick-agent.js +47 -19
  135. package/dist/lib/launch/pick-agent.js.map +1 -1
  136. package/dist/lib/launch/picker-options.d.ts +30 -0
  137. package/dist/lib/launch/picker-options.d.ts.map +1 -0
  138. package/dist/lib/launch/picker-options.js +42 -0
  139. package/dist/lib/launch/picker-options.js.map +1 -0
  140. package/dist/lib/launch/prompts.d.ts +11 -0
  141. package/dist/lib/launch/prompts.d.ts.map +1 -0
  142. package/dist/lib/launch/prompts.js +27 -0
  143. package/dist/lib/launch/prompts.js.map +1 -0
  144. package/dist/lib/launch/qwen-state.d.ts +30 -0
  145. package/dist/lib/launch/qwen-state.d.ts.map +1 -0
  146. package/dist/lib/launch/qwen-state.js +57 -0
  147. package/dist/lib/launch/qwen-state.js.map +1 -0
  148. package/dist/lib/launch/qwen-trust.d.ts +24 -0
  149. package/dist/lib/launch/qwen-trust.d.ts.map +1 -0
  150. package/dist/lib/launch/qwen-trust.js +100 -0
  151. package/dist/lib/launch/qwen-trust.js.map +1 -0
  152. package/dist/lib/launch/registry/agents/amp.d.ts +3 -0
  153. package/dist/lib/launch/registry/agents/amp.d.ts.map +1 -0
  154. package/dist/lib/launch/registry/agents/amp.js +14 -0
  155. package/dist/lib/launch/registry/agents/amp.js.map +1 -0
  156. package/dist/lib/launch/registry/agents/claude-code.js +1 -1
  157. package/dist/lib/launch/registry/agents/claude-code.js.map +1 -1
  158. package/dist/lib/launch/registry/agents/codex.d.ts.map +1 -1
  159. package/dist/lib/launch/registry/agents/codex.js +4 -2
  160. package/dist/lib/launch/registry/agents/codex.js.map +1 -1
  161. package/dist/lib/launch/registry/agents/copilot.d.ts +3 -0
  162. package/dist/lib/launch/registry/agents/copilot.d.ts.map +1 -0
  163. package/dist/lib/launch/registry/agents/copilot.js +11 -0
  164. package/dist/lib/launch/registry/agents/copilot.js.map +1 -0
  165. package/dist/lib/launch/registry/agents/cursor.js +1 -1
  166. package/dist/lib/launch/registry/agents/cursor.js.map +1 -1
  167. package/dist/lib/launch/registry/agents/droid.d.ts +3 -0
  168. package/dist/lib/launch/registry/agents/droid.d.ts.map +1 -0
  169. package/dist/lib/launch/registry/agents/droid.js +13 -0
  170. package/dist/lib/launch/registry/agents/droid.js.map +1 -0
  171. package/dist/lib/launch/registry/agents/gemini-cli.d.ts.map +1 -1
  172. package/dist/lib/launch/registry/agents/gemini-cli.js +4 -2
  173. package/dist/lib/launch/registry/agents/gemini-cli.js.map +1 -1
  174. package/dist/lib/launch/registry/agents/grok-build.d.ts +3 -0
  175. package/dist/lib/launch/registry/agents/grok-build.d.ts.map +1 -0
  176. package/dist/lib/launch/registry/agents/grok-build.js +14 -0
  177. package/dist/lib/launch/registry/agents/grok-build.js.map +1 -0
  178. package/dist/lib/launch/registry/agents/kiro.d.ts +3 -0
  179. package/dist/lib/launch/registry/agents/kiro.d.ts.map +1 -0
  180. package/dist/lib/launch/registry/agents/kiro.js +11 -0
  181. package/dist/lib/launch/registry/agents/kiro.js.map +1 -0
  182. package/dist/lib/launch/registry/agents/opencode.js +1 -1
  183. package/dist/lib/launch/registry/agents/opencode.js.map +1 -1
  184. package/dist/lib/launch/registry/agents/pi.js +1 -1
  185. package/dist/lib/launch/registry/agents/pi.js.map +1 -1
  186. package/dist/lib/launch/registry/agents/qwen.d.ts +3 -0
  187. package/dist/lib/launch/registry/agents/qwen.d.ts.map +1 -0
  188. package/dist/lib/launch/registry/agents/qwen.js +11 -0
  189. package/dist/lib/launch/registry/agents/qwen.js.map +1 -0
  190. package/dist/lib/launch/registry/index.d.ts +4 -1
  191. package/dist/lib/launch/registry/index.d.ts.map +1 -1
  192. package/dist/lib/launch/registry/index.js +11 -2
  193. package/dist/lib/launch/registry/index.js.map +1 -1
  194. package/dist/lib/launch/registry/types.d.ts +18 -2
  195. package/dist/lib/launch/registry/types.d.ts.map +1 -1
  196. package/dist/lib/launch/run-agent.d.ts +15 -0
  197. package/dist/lib/launch/run-agent.d.ts.map +1 -1
  198. package/dist/lib/launch/run-agent.js +23 -2
  199. package/dist/lib/launch/run-agent.js.map +1 -1
  200. package/dist/lib/launch/strict-entry.d.ts +49 -0
  201. package/dist/lib/launch/strict-entry.d.ts.map +1 -0
  202. package/dist/lib/launch/strict-entry.js +108 -0
  203. package/dist/lib/launch/strict-entry.js.map +1 -0
  204. package/dist/lib/llm-providers.d.ts +66 -0
  205. package/dist/lib/llm-providers.d.ts.map +1 -0
  206. package/dist/lib/llm-providers.js +150 -0
  207. package/dist/lib/llm-providers.js.map +1 -0
  208. package/dist/lib/local-llm.d.ts +63 -12
  209. package/dist/lib/local-llm.d.ts.map +1 -1
  210. package/dist/lib/local-llm.js +229 -104
  211. package/dist/lib/local-llm.js.map +1 -1
  212. package/dist/lib/safe-config-write.d.ts +12 -1
  213. package/dist/lib/safe-config-write.d.ts.map +1 -1
  214. package/dist/lib/safe-config-write.js +123 -7
  215. package/dist/lib/safe-config-write.js.map +1 -1
  216. package/dist/lib/startup-env.d.ts +8 -0
  217. package/dist/lib/startup-env.d.ts.map +1 -0
  218. package/dist/lib/startup-env.js +8 -0
  219. package/dist/lib/startup-env.js.map +1 -0
  220. package/package.json +3 -2
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/agents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGtD,MAAM,WAAW,WAAW;IAC1B,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;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,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,16 +1,38 @@
1
- import { AGENT_REGISTRY } from './registry/index.js';
2
- export const LAUNCH_AGENTS = AGENT_REGISTRY.map(({ name, label, bin, injection, supported, install }) => ({ name, label, bin, injection, supported, install }));
1
+ import { installText } from './install.js';
2
+ import { AGENT_REGISTRY, specByName } from './registry/index.js';
3
+ export const LAUNCH_AGENTS = AGENT_REGISTRY.map(({ name, label, bin, injection, supported, install }) => ({ name, label, bin, injection, supported, install: installText(install) }));
3
4
  export function agentByName(name) {
4
5
  return LAUNCH_AGENTS.find((a) => a.name === name);
5
6
  }
6
7
  export const supportedAgents = () => LAUNCH_AGENTS.filter((a) => a.supported);
8
+ /**
9
+ * Which agent to take when several are installed and nobody can be asked (no terminal, or
10
+ * --approve). The agents launchable before wave A keep their old order, Claude Code first, so a
11
+ * scripted first run picks what it picked before; the wave A agents come after them.
12
+ */
13
+ export const PICK_PRIORITY = ['claude-code', 'cursor', 'opencode', 'pi', 'codex', 'copilot', 'gemini-cli', 'amp', 'droid', 'grok-build', 'kiro', 'qwen'];
14
+ /** The agents launchable before wave A. */
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']);
18
+ export function byPriority(agents) {
19
+ const rank = (a) => {
20
+ const i = PICK_PRIORITY.indexOf(a.name);
21
+ return i < 0 ? PICK_PRIORITY.length : i;
22
+ };
23
+ return [...agents].sort((a, b) => rank(a) - rank(b));
24
+ }
7
25
  /**
8
26
  * The agent's binary on PATH, and where. Only `bin` is accepted: for Cursor that is `cursor-agent`,
9
27
  * which its installer always creates. Cursor's docs also call the command `agent`, but that name
10
- * 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.
11
30
  */
12
31
  export function resolveAgentBin(a, find, env, platform) {
13
32
  const found = find(a.bin, env, platform);
14
- 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 };
15
37
  }
16
38
  //# sourceMappingURL=agents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"agents.js","sourceRoot":"","sources":["../../../src/lib/launch/agents.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAarD,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,CAAC,CAC/G,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,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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"}
@@ -0,0 +1,31 @@
1
+ import { type AlignLocalState } from './strict-entry.js';
2
+ export type CodexProjectState = AlignLocalState;
3
+ /**
4
+ * The profile a user's own args select (`-p name`, `--profile name`, `--profile=name`, before
5
+ * any `--`). Codex layers $CODEX_HOME/<name>.config.toml for it. A name that could leave that
6
+ * directory (a separator, `..`) is never made into a path: undefined.
7
+ */
8
+ export declare function codexProfile(passthrough: string[]): string | undefined;
9
+ /**
10
+ * What Codex would already load for align, read with a TOML parser (sub-tables, dotted keys and
11
+ * inline tables all land on the same object).
12
+ *
13
+ * The CONFLICT scan reads every layer Codex might load, whatever the trust state, and fails
14
+ * closed. align cannot reproduce Codex's project resolution: a worktree resolves to its main
15
+ * repo's trust, an untrusted repo becomes trusted with one Enter at Codex's prompt and reloads
16
+ * WITH our -c overrides, and `project_root_markers` can put the project root ABOVE the git
17
+ * root (all verified on 0.153.0). So: /etc/codex/config.toml and managed_config.toml (both
18
+ * named in the 0.153.0 binary), $CODEX_HOME (or ~/.codex)/config.toml, the profile file a
19
+ * `-p`/`--profile` in the user's args selects, and EVERY .codex/config.toml from cwd up to the
20
+ * filesystem root (a superset, so it can only over-refuse). The user config met again as an
21
+ * ancestor is read once, as the user layer.
22
+ *
23
+ * "Already present" counts only the user, profile and system layers. A project's canonical
24
+ * align-local is simply overwritten by our identical -c values; a project's canonical `align`
25
+ * at worst duplicates tools.
26
+ */
27
+ export declare function readCodexState(cwd: string, home: string, opts: {
28
+ localIsDefault: boolean;
29
+ systemDir?: string;
30
+ }, env: Record<string, string | undefined>, platform: string, passthrough?: string[]): CodexProjectState;
31
+ //# sourceMappingURL=codex-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-state.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/codex-state.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,eAAe,EAA0B,MAAM,mBAAmB,CAAC;AAEjF,MAAM,MAAM,iBAAiB,GAAG,eAAe,CAAC;AA4BhD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAUtE;AAKD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;IAAE,cAAc,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,EACrD,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,QAAQ,EAAE,MAAM,EAChB,WAAW,GAAE,MAAM,EAAO,GACzB,iBAAiB,CA0BnB"}
@@ -0,0 +1,92 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { parse } from 'smol-toml';
4
+ import { foldLayers } from './strict-entry.js';
5
+ const isObject = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
6
+ /**
7
+ * A config.toml as an object. Missing or unparseable reads as empty: Codex itself refuses to
8
+ * start on a config.toml it cannot parse and names the error, so no entry in it can run
9
+ * either, and injecting as if it were absent changes nothing about what the user sees.
10
+ */
11
+ function readToml(file) {
12
+ try {
13
+ const parsed = parse(readFileSync(file, 'utf8'));
14
+ return isObject(parsed) ? parsed : {};
15
+ }
16
+ catch {
17
+ return {};
18
+ }
19
+ }
20
+ /** cwd and every directory above it, to the filesystem root. */
21
+ function ancestors(cwd) {
22
+ const dirs = [];
23
+ for (let dir = path.resolve(cwd);; dir = path.dirname(dir)) {
24
+ dirs.push(dir);
25
+ if (path.dirname(dir) === dir)
26
+ return dirs;
27
+ }
28
+ }
29
+ /**
30
+ * The profile a user's own args select (`-p name`, `--profile name`, `--profile=name`, before
31
+ * any `--`). Codex layers $CODEX_HOME/<name>.config.toml for it. A name that could leave that
32
+ * directory (a separator, `..`) is never made into a path: undefined.
33
+ */
34
+ export function codexProfile(passthrough) {
35
+ let name;
36
+ for (let i = 0; i < passthrough.length; i++) {
37
+ const a = passthrough[i];
38
+ if (a === '--')
39
+ break;
40
+ if (a === '-p' || a === '--profile')
41
+ name = passthrough[++i];
42
+ else if (a.startsWith('--profile='))
43
+ name = a.slice('--profile='.length);
44
+ }
45
+ if (!name || /[/\\]/.test(name) || name.includes('..'))
46
+ return undefined;
47
+ return name;
48
+ }
49
+ /** Every key -c overrides when it replaces align-local: command, args, and enabled=true. */
50
+ const REPLACEABLE = new Set(['command', 'args', 'enabled']);
51
+ /**
52
+ * What Codex would already load for align, read with a TOML parser (sub-tables, dotted keys and
53
+ * inline tables all land on the same object).
54
+ *
55
+ * The CONFLICT scan reads every layer Codex might load, whatever the trust state, and fails
56
+ * closed. align cannot reproduce Codex's project resolution: a worktree resolves to its main
57
+ * repo's trust, an untrusted repo becomes trusted with one Enter at Codex's prompt and reloads
58
+ * WITH our -c overrides, and `project_root_markers` can put the project root ABOVE the git
59
+ * root (all verified on 0.153.0). So: /etc/codex/config.toml and managed_config.toml (both
60
+ * named in the 0.153.0 binary), $CODEX_HOME (or ~/.codex)/config.toml, the profile file a
61
+ * `-p`/`--profile` in the user's args selects, and EVERY .codex/config.toml from cwd up to the
62
+ * filesystem root (a superset, so it can only over-refuse). The user config met again as an
63
+ * ancestor is read once, as the user layer.
64
+ *
65
+ * "Already present" counts only the user, profile and system layers. A project's canonical
66
+ * align-local is simply overwritten by our identical -c values; a project's canonical `align`
67
+ * at worst duplicates tools.
68
+ */
69
+ export function readCodexState(cwd, home, opts, env, platform, passthrough = []) {
70
+ const o = { localIsDefault: opts.localIsDefault, platform, host: 'codex' };
71
+ const replaceable = (e) => isObject(e) && Object.keys(e).every((k) => REPLACEABLE.has(k));
72
+ const at = (file) => ({ file, servers: readToml(file)['mcp_servers'] });
73
+ const systemDir = opts.systemDir ?? '/etc/codex';
74
+ const codexHome = env['CODEX_HOME'] ? env['CODEX_HOME'] : path.join(home, '.codex');
75
+ const userFile = path.resolve(codexHome, 'config.toml');
76
+ const profile = codexProfile(passthrough);
77
+ const base = foldLayers([
78
+ at(path.join(systemDir, 'config.toml')),
79
+ at(userFile),
80
+ ...(profile ? [at(path.join(codexHome, `${profile}.config.toml`))] : []),
81
+ at(path.join(systemDir, 'managed_config.toml')),
82
+ ], o, replaceable);
83
+ const projectFiles = ancestors(cwd).map((d) => path.join(d, '.codex', 'config.toml')).filter((f) => f !== userFile);
84
+ const project = foldLayers(projectFiles.map(at), o, replaceable);
85
+ const conflict = base.conflict ?? project.conflict;
86
+ return {
87
+ present: base.present,
88
+ overridden: [...base.overridden, ...project.overridden],
89
+ ...(conflict ? { conflict } : {}),
90
+ };
91
+ }
92
+ //# sourceMappingURL=codex-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-state.js","sourceRoot":"","sources":["../../../src/lib/launch/codex-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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"}
@@ -0,0 +1,19 @@
1
+ import { type AlignLocalState } from './strict-entry.js';
2
+ export type CopilotProjectState = AlignLocalState;
3
+ /**
4
+ * What Copilot CLI (1.0.95) would already load for align. User: $COPILOT_HOME (or ~/.copilot)
5
+ * /mcp-config.json. Workspace: .mcp.json and .github/mcp.json from cwd up to the git root.
6
+ *
7
+ * Copilot loads the workspace files only in a trusted folder, but that verdict comes from its
8
+ * native runtime and several sources (its own store, IDE workspace folders, settings), none of
9
+ * which align can read reliably; only COPILOT_ALLOW_ALL=true is certain. And whether
10
+ * --additional-mcp-config replaces a same-named server whole is also native. So, both ways safe:
11
+ * - a workspace entry counts as "already present" only under COPILOT_ALLOW_ALL=true
12
+ * (otherwise inject: the worst case is a duplicate server, never a missing graph);
13
+ * - a non-canonical align-local in ANY of these files is a conflict (no injection), because
14
+ * a merged, repo-shaped align-local must never be launched.
15
+ */
16
+ export declare function readCopilotState(cwd: string, home: string, opts: {
17
+ localIsDefault: boolean;
18
+ }, env: Record<string, string | undefined>, platform: string): CopilotProjectState;
19
+ //# sourceMappingURL=copilot-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-state.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/copilot-state.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,eAAe,EAAsC,MAAM,mBAAmB,CAAC;AAE7F,MAAM,MAAM,mBAAmB,GAAG,eAAe,CAAC;AAsBlD;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAC9B,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,GACf,mBAAmB,CAgBrB"}
@@ -0,0 +1,51 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { foldLayers, parseJsonc } from './strict-entry.js';
4
+ function layer(file) {
5
+ let text = null;
6
+ try {
7
+ text = readFileSync(file, 'utf8');
8
+ }
9
+ catch {
10
+ // missing or unreadable: no servers
11
+ }
12
+ return { file, servers: parseJsonc(text)?.['mcpServers'] };
13
+ }
14
+ /** cwd up to and including the git root; with no .git anywhere above, cwd alone. Never past the root. */
15
+ function workspaceDirs(cwd) {
16
+ const dirs = [];
17
+ for (let dir = cwd;; dir = path.dirname(dir)) {
18
+ dirs.push(dir);
19
+ if (existsSync(path.join(dir, '.git')))
20
+ return dirs;
21
+ if (path.dirname(dir) === dir)
22
+ return [cwd];
23
+ }
24
+ }
25
+ /**
26
+ * What Copilot CLI (1.0.95) would already load for align. User: $COPILOT_HOME (or ~/.copilot)
27
+ * /mcp-config.json. Workspace: .mcp.json and .github/mcp.json from cwd up to the git root.
28
+ *
29
+ * Copilot loads the workspace files only in a trusted folder, but that verdict comes from its
30
+ * native runtime and several sources (its own store, IDE workspace folders, settings), none of
31
+ * which align can read reliably; only COPILOT_ALLOW_ALL=true is certain. And whether
32
+ * --additional-mcp-config replaces a same-named server whole is also native. So, both ways safe:
33
+ * - a workspace entry counts as "already present" only under COPILOT_ALLOW_ALL=true
34
+ * (otherwise inject: the worst case is a duplicate server, never a missing graph);
35
+ * - a non-canonical align-local in ANY of these files is a conflict (no injection), because
36
+ * a merged, repo-shaped align-local must never be launched.
37
+ */
38
+ export function readCopilotState(cwd, home, opts, env, platform) {
39
+ const o = { ...opts, platform, host: 'copilot' };
40
+ const userFile = path.join(env['COPILOT_HOME'] ? env['COPILOT_HOME'] : path.join(home, '.copilot'), 'mcp-config.json');
41
+ const never = () => false;
42
+ const user = foldLayers([layer(userFile)], o, never);
43
+ const workspace = foldLayers(workspaceDirs(cwd).reverse().flatMap((d) => [layer(path.join(d, '.mcp.json')), layer(path.join(d, '.github', 'mcp.json'))]), o, never);
44
+ const conflict = user.conflict ?? workspace.conflict;
45
+ return {
46
+ present: user.present || (env['COPILOT_ALLOW_ALL'] === 'true' && workspace.present),
47
+ overridden: [],
48
+ ...(conflict ? { conflict } : {}),
49
+ };
50
+ }
51
+ //# sourceMappingURL=copilot-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-state.js","sourceRoot":"","sources":["../../../src/lib/launch/copilot-state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAwB,UAAU,EAAc,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAI7F,SAAS,KAAK,CAAC,IAAY;IACzB,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,CAAC;QACH,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC;AAC7D,CAAC;AAED,yGAAyG;AACzG,SAAS,aAAa,CAAC,GAAW;IAChC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,IAAI,GAAG,GAAG,GAAG,GAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QACpD,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG;YAAE,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAW,EACX,IAAY,EACZ,IAAiC,EACjC,GAAuC,EACvC,QAAgB;IAEhB,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAkB,EAAE,CAAC;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACvH,MAAM,KAAK,GAAG,GAAY,EAAE,CAAC,KAAK,CAAC;IACnC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,UAAU,CAC1B,aAAa,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,EAC3H,CAAC,EACD,KAAK,CACN,CAAC;IACF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,QAAQ,CAAC;IACrD,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,mBAAmB,CAAC,KAAK,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC;QACnF,UAAU,EAAE,EAAE;QACd,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClC,CAAC;AACJ,CAAC"}
@@ -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"}
@@ -0,0 +1,24 @@
1
+ import { type AlignLocalState } from './strict-entry.js';
2
+ export interface DroidProjectState extends AlignLocalState {
3
+ /** The user runs Droid with their own runtime settings (`--settings` or FACTORY_RUNTIME_SETTINGS_PATH). */
4
+ ownSettings?: string;
5
+ /** A guideline file Droid reads already carries align's managed instructions block. */
6
+ projectHasBlock: boolean;
7
+ }
8
+ /**
9
+ * What Factory Droid (droid 0.237.0) would already load for align. The project is `--cwd` when
10
+ * the user passes one (relative to the cwd), else the cwd; "home" is FACTORY_HOME_OVERRIDE when
11
+ * set (Droid's own home resolution).
12
+ * - MCP: $home/.factory/mcp.json, and a `.factory/mcp.json` from the project up to the git root
13
+ * (to the filesystem root with no git root). The per-process runtime settings win a same-named
14
+ * server (verified with `droid --settings f mcp list`), so a non-canonical align-local is
15
+ * overridden. Only the user's own canonical `align` stands in for us.
16
+ * - Instructions: Droid's own guideline discovery (agentsMdGuidelines): the project up to the
17
+ * git root, or only the project with none, each dir plus its .factory/.agents/.agent, plus
18
+ * $home/.factory, .agents and .agent; CLAUDE.md, AGENTS.md and case variants; a linked file or
19
+ * directory is ignored, as Droid's lstat checks ignore it.
20
+ */
21
+ export declare function readDroidState(cwd: string, home: string, opts: {
22
+ localIsDefault: boolean;
23
+ }, env: Record<string, string | undefined>, platform: string, passthrough: string[]): DroidProjectState;
24
+ //# sourceMappingURL=droid-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"droid-state.d.ts","sourceRoot":"","sources":["../../../src/lib/launch/droid-state.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,eAAe,EAA6D,MAAM,mBAAmB,CAAC;AAEpH,MAAM,WAAW,iBAAkB,SAAQ,eAAe;IACxD,2GAA2G;IAC3G,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uFAAuF;IACvF,eAAe,EAAE,OAAO,CAAC;CAC1B;AAsCD;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,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,iBAAiB,CAoBnB"}