expandai 0.0.2 → 0.0.3

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 (271) hide show
  1. package/README.md +42 -5
  2. package/build/dts/ApiClient.d.ts +128 -194
  3. package/build/dts/ApiClient.d.ts.map +1 -1
  4. package/build/dts/Auth/Domain.d.ts +95 -0
  5. package/build/dts/Auth/Domain.d.ts.map +1 -0
  6. package/build/dts/Auth/ManualAuthorization.d.ts +107 -0
  7. package/build/dts/Auth/ManualAuthorization.d.ts.map +1 -0
  8. package/build/dts/Auth/PendingInit.d.ts +35 -0
  9. package/build/dts/Auth/PendingInit.d.ts.map +1 -0
  10. package/build/dts/Auth/Pkce.d.ts +10 -0
  11. package/build/dts/Auth/Pkce.d.ts.map +1 -0
  12. package/build/dts/Auth/SetupGrantAuthorization.d.ts +34 -0
  13. package/build/dts/Auth/SetupGrantAuthorization.d.ts.map +1 -0
  14. package/build/dts/Authentication.d.ts +10 -9
  15. package/build/dts/Authentication.d.ts.map +1 -1
  16. package/build/dts/BrowserOAuth.d.ts +7 -7
  17. package/build/dts/BrowserOAuth.d.ts.map +1 -1
  18. package/build/dts/CommandPath.d.ts +2 -0
  19. package/build/dts/CommandPath.d.ts.map +1 -0
  20. package/build/dts/Commands/Fetch.d.ts.map +1 -1
  21. package/build/dts/Commands/Hook.d.ts +5 -5
  22. package/build/dts/Commands/Init.d.ts +55 -0
  23. package/build/dts/Commands/Init.d.ts.map +1 -0
  24. package/build/dts/Commands/Mcp.d.ts +6 -6
  25. package/build/dts/Commands/Search.d.ts.map +1 -1
  26. package/build/dts/Commands/Skill.d.ts +4 -4
  27. package/build/dts/Commands/Status.d.ts +27 -0
  28. package/build/dts/Commands/Status.d.ts.map +1 -0
  29. package/build/dts/Commands/Telemetry.d.ts +7 -0
  30. package/build/dts/Commands/Telemetry.d.ts.map +1 -0
  31. package/build/dts/Commands/Uninstall.d.ts +4 -4
  32. package/build/dts/Config.d.ts +108 -17
  33. package/build/dts/Config.d.ts.map +1 -1
  34. package/build/dts/Hook/SnapshotNote.d.ts +8 -4
  35. package/build/dts/Hook/SnapshotNote.d.ts.map +1 -1
  36. package/build/dts/Init/ClaudeAdapter.d.ts +61 -0
  37. package/build/dts/Init/ClaudeAdapter.d.ts.map +1 -0
  38. package/build/dts/Init/ClaudeProfile.d.ts +78 -0
  39. package/build/dts/Init/ClaudeProfile.d.ts.map +1 -0
  40. package/build/dts/Init/Domain.d.ts +139 -0
  41. package/build/dts/Init/Domain.d.ts.map +1 -0
  42. package/build/dts/Init/HarnessAdapter.d.ts +33 -0
  43. package/build/dts/Init/HarnessAdapter.d.ts.map +1 -0
  44. package/build/dts/Init/HarnessDetector.d.ts +19 -0
  45. package/build/dts/Init/HarnessDetector.d.ts.map +1 -0
  46. package/build/dts/Init/HarnessRegistry.d.ts +50 -0
  47. package/build/dts/Init/HarnessRegistry.d.ts.map +1 -0
  48. package/build/dts/Init/MutationTransaction.d.ts +96 -0
  49. package/build/dts/Init/MutationTransaction.d.ts.map +1 -0
  50. package/build/dts/Init/Service.d.ts +72 -0
  51. package/build/dts/Init/Service.d.ts.map +1 -0
  52. package/build/dts/Init/StandardAdapters.d.ts +42 -0
  53. package/build/dts/Init/StandardAdapters.d.ts.map +1 -0
  54. package/build/dts/Init/Status.d.ts +149 -0
  55. package/build/dts/Init/Status.d.ts.map +1 -0
  56. package/build/dts/Install/Claude/Hook.d.ts +85 -25
  57. package/build/dts/Install/Claude/Hook.d.ts.map +1 -1
  58. package/build/dts/Install/Claude/Mcp.d.ts +21 -18
  59. package/build/dts/Install/Claude/Mcp.d.ts.map +1 -1
  60. package/build/dts/Install/Claude/Skill.d.ts +14 -15
  61. package/build/dts/Install/Claude/Skill.d.ts.map +1 -1
  62. package/build/dts/Install/Codex/Mcp.d.ts +14 -8
  63. package/build/dts/Install/Codex/Mcp.d.ts.map +1 -1
  64. package/build/dts/Install/Codex/Skill.d.ts +4 -2
  65. package/build/dts/Install/Codex/Skill.d.ts.map +1 -1
  66. package/build/dts/Install/Cursor/Mcp.d.ts +13 -13
  67. package/build/dts/Install/Cursor/Mcp.d.ts.map +1 -1
  68. package/build/dts/Install/Cursor/Skill.d.ts +4 -2
  69. package/build/dts/Install/Cursor/Skill.d.ts.map +1 -1
  70. package/build/dts/Install/Domain.d.ts +35 -5
  71. package/build/dts/Install/Domain.d.ts.map +1 -1
  72. package/build/dts/Install/Hook.d.ts +4 -4
  73. package/build/dts/Install/Hook.d.ts.map +1 -1
  74. package/build/dts/Install/Mcp.d.ts +5 -5
  75. package/build/dts/Install/Mcp.d.ts.map +1 -1
  76. package/build/dts/Install/Opencode/Hook.d.ts +4 -3
  77. package/build/dts/Install/Opencode/Hook.d.ts.map +1 -1
  78. package/build/dts/Install/Opencode/Mcp.d.ts +11 -11
  79. package/build/dts/Install/Opencode/Mcp.d.ts.map +1 -1
  80. package/build/dts/Install/Opencode/Skill.d.ts +4 -2
  81. package/build/dts/Install/Opencode/Skill.d.ts.map +1 -1
  82. package/build/dts/Install/Skill.d.ts +3 -3
  83. package/build/dts/Install/Uninstall.d.ts +6 -6
  84. package/build/dts/Install/Uninstall.d.ts.map +1 -1
  85. package/build/dts/MarkdownAnsi.d.ts +29 -0
  86. package/build/dts/MarkdownAnsi.d.ts.map +1 -0
  87. package/build/dts/Mcp/ExpandDocs.d.ts +17 -5
  88. package/build/dts/Mcp/ExpandDocs.d.ts.map +1 -1
  89. package/build/dts/Mcp/Server.d.ts +1 -1
  90. package/build/dts/Mcp/Server.d.ts.map +1 -1
  91. package/build/dts/Mcp/tools/Citations.d.ts +100 -71
  92. package/build/dts/Mcp/tools/Citations.d.ts.map +1 -1
  93. package/build/dts/Mcp/tools/Fetch.d.ts +16 -15
  94. package/build/dts/Mcp/tools/Fetch.d.ts.map +1 -1
  95. package/build/dts/SecureFile.d.ts +23 -0
  96. package/build/dts/SecureFile.d.ts.map +1 -0
  97. package/build/dts/Snippets.d.ts +11 -12
  98. package/build/dts/Snippets.d.ts.map +1 -1
  99. package/build/dts/Telemetry.d.ts +30 -0
  100. package/build/dts/Telemetry.d.ts.map +1 -0
  101. package/build/dts/Version.d.ts +2 -0
  102. package/build/dts/Version.d.ts.map +1 -0
  103. package/build/dts/Xdg.d.ts +11 -0
  104. package/build/dts/Xdg.d.ts.map +1 -0
  105. package/build/esm/ApiClient.js +133 -10
  106. package/build/esm/ApiClient.js.map +1 -1
  107. package/build/esm/Auth/Domain.js +56 -0
  108. package/build/esm/Auth/Domain.js.map +1 -0
  109. package/build/esm/Auth/ManualAuthorization.js +253 -0
  110. package/build/esm/Auth/ManualAuthorization.js.map +1 -0
  111. package/build/esm/Auth/PendingInit.js +267 -0
  112. package/build/esm/Auth/PendingInit.js.map +1 -0
  113. package/build/esm/Auth/Pkce.js +23 -0
  114. package/build/esm/Auth/Pkce.js.map +1 -0
  115. package/build/esm/Auth/SetupGrantAuthorization.js +91 -0
  116. package/build/esm/Auth/SetupGrantAuthorization.js.map +1 -0
  117. package/build/esm/Authentication.js +38 -7
  118. package/build/esm/Authentication.js.map +1 -1
  119. package/build/esm/BrowserOAuth.js +7 -10
  120. package/build/esm/BrowserOAuth.js.map +1 -1
  121. package/build/esm/CommandPath.js +31 -0
  122. package/build/esm/CommandPath.js.map +1 -0
  123. package/build/esm/Commands/Fetch.js +30 -6
  124. package/build/esm/Commands/Fetch.js.map +1 -1
  125. package/build/esm/Commands/Init.js +371 -0
  126. package/build/esm/Commands/Init.js.map +1 -0
  127. package/build/esm/Commands/Search.js +6 -3
  128. package/build/esm/Commands/Search.js.map +1 -1
  129. package/build/esm/Commands/Status.js +186 -0
  130. package/build/esm/Commands/Status.js.map +1 -0
  131. package/build/esm/Commands/Telemetry.js +23 -0
  132. package/build/esm/Commands/Telemetry.js.map +1 -0
  133. package/build/esm/Config.js +502 -28
  134. package/build/esm/Config.js.map +1 -1
  135. package/build/esm/Hook/Claude.js +1 -1
  136. package/build/esm/Hook/Claude.js.map +1 -1
  137. package/build/esm/Hook/SnapshotNote.js +54 -7
  138. package/build/esm/Hook/SnapshotNote.js.map +1 -1
  139. package/build/esm/Init/ClaudeAdapter.js +137 -0
  140. package/build/esm/Init/ClaudeAdapter.js.map +1 -0
  141. package/build/esm/Init/ClaudeProfile.js +380 -0
  142. package/build/esm/Init/ClaudeProfile.js.map +1 -0
  143. package/build/esm/Init/Domain.js +118 -0
  144. package/build/esm/Init/Domain.js.map +1 -0
  145. package/build/esm/Init/HarnessAdapter.js +21 -0
  146. package/build/esm/Init/HarnessAdapter.js.map +1 -0
  147. package/build/esm/Init/HarnessDetector.js +65 -0
  148. package/build/esm/Init/HarnessDetector.js.map +1 -0
  149. package/build/esm/Init/HarnessRegistry.js +58 -0
  150. package/build/esm/Init/HarnessRegistry.js.map +1 -0
  151. package/build/esm/Init/MutationTransaction.js +494 -0
  152. package/build/esm/Init/MutationTransaction.js.map +1 -0
  153. package/build/esm/Init/Service.js +319 -0
  154. package/build/esm/Init/Service.js.map +1 -0
  155. package/build/esm/Init/StandardAdapters.js +116 -0
  156. package/build/esm/Init/StandardAdapters.js.map +1 -0
  157. package/build/esm/Init/Status.js +215 -0
  158. package/build/esm/Init/Status.js.map +1 -0
  159. package/build/esm/Install/Claude/Hook.js +182 -50
  160. package/build/esm/Install/Claude/Hook.js.map +1 -1
  161. package/build/esm/Install/Claude/Mcp.js +56 -26
  162. package/build/esm/Install/Claude/Mcp.js.map +1 -1
  163. package/build/esm/Install/Claude/Skill.js +49 -27
  164. package/build/esm/Install/Claude/Skill.js.map +1 -1
  165. package/build/esm/Install/Codex/Mcp.js +9 -4
  166. package/build/esm/Install/Codex/Mcp.js.map +1 -1
  167. package/build/esm/Install/Codex/Skill.js +4 -1
  168. package/build/esm/Install/Codex/Skill.js.map +1 -1
  169. package/build/esm/Install/Cursor/Mcp.js +7 -4
  170. package/build/esm/Install/Cursor/Mcp.js.map +1 -1
  171. package/build/esm/Install/Cursor/Skill.js +4 -1
  172. package/build/esm/Install/Cursor/Skill.js.map +1 -1
  173. package/build/esm/Install/Domain.js +60 -3
  174. package/build/esm/Install/Domain.js.map +1 -1
  175. package/build/esm/Install/Hook.js.map +1 -1
  176. package/build/esm/Install/Mcp.js +1 -1
  177. package/build/esm/Install/Mcp.js.map +1 -1
  178. package/build/esm/Install/Opencode/Hook.js +1 -1
  179. package/build/esm/Install/Opencode/Hook.js.map +1 -1
  180. package/build/esm/Install/Opencode/Mcp.js +6 -3
  181. package/build/esm/Install/Opencode/Mcp.js.map +1 -1
  182. package/build/esm/Install/Opencode/Skill.js +4 -1
  183. package/build/esm/Install/Opencode/Skill.js.map +1 -1
  184. package/build/esm/Install/Opencode/expandai-webfetch.js +27 -9
  185. package/build/esm/Install/Skill.js.map +1 -1
  186. package/build/esm/Install/Uninstall.js +2 -2
  187. package/build/esm/Install/Uninstall.js.map +1 -1
  188. package/build/esm/MarkdownAnsi.js +142 -0
  189. package/build/esm/MarkdownAnsi.js.map +1 -0
  190. package/build/esm/Mcp/ExpandDocs.js +44 -52
  191. package/build/esm/Mcp/ExpandDocs.js.map +1 -1
  192. package/build/esm/Mcp/RequestHeaders.js.map +1 -1
  193. package/build/esm/Mcp/Server.js +2 -1
  194. package/build/esm/Mcp/Server.js.map +1 -1
  195. package/build/esm/Mcp/tools/Citations.js +109 -8
  196. package/build/esm/Mcp/tools/Citations.js.map +1 -1
  197. package/build/esm/Mcp/tools/Fetch.js +36 -12
  198. package/build/esm/Mcp/tools/Fetch.js.map +1 -1
  199. package/build/esm/SecureFile.js +36 -0
  200. package/build/esm/SecureFile.js.map +1 -0
  201. package/build/esm/Snippets.js +12 -1
  202. package/build/esm/Snippets.js.map +1 -1
  203. package/build/esm/Telemetry.js +157 -0
  204. package/build/esm/Telemetry.js.map +1 -0
  205. package/build/esm/Version.js +4 -0
  206. package/build/esm/Version.js.map +1 -0
  207. package/build/esm/Xdg.js +15 -0
  208. package/build/esm/Xdg.js.map +1 -0
  209. package/build/esm/main.js +122 -14
  210. package/build/esm/main.js.map +1 -1
  211. package/build/skills/expandai/SKILL.md +26 -3
  212. package/package.json +4 -4
  213. package/src/ApiClient.ts +206 -13
  214. package/src/Auth/Domain.ts +63 -0
  215. package/src/Auth/ManualAuthorization.ts +296 -0
  216. package/src/Auth/PendingInit.ts +338 -0
  217. package/src/Auth/Pkce.ts +26 -0
  218. package/src/Auth/SetupGrantAuthorization.ts +116 -0
  219. package/src/Authentication.ts +49 -11
  220. package/src/BrowserOAuth.ts +10 -12
  221. package/src/CommandPath.ts +30 -0
  222. package/src/Commands/Fetch.ts +42 -11
  223. package/src/Commands/Init.ts +489 -0
  224. package/src/Commands/Search.ts +8 -3
  225. package/src/Commands/Status.ts +228 -0
  226. package/src/Commands/Telemetry.ts +42 -0
  227. package/src/Config.ts +695 -50
  228. package/src/Hook/Claude.ts +1 -1
  229. package/src/Hook/SnapshotNote.ts +55 -7
  230. package/src/Init/ClaudeAdapter.ts +191 -0
  231. package/src/Init/ClaudeProfile.ts +496 -0
  232. package/src/Init/Domain.ts +153 -0
  233. package/src/Init/HarnessAdapter.ts +35 -0
  234. package/src/Init/HarnessDetector.ts +77 -0
  235. package/src/Init/HarnessRegistry.ts +87 -0
  236. package/src/Init/MutationTransaction.ts +747 -0
  237. package/src/Init/Service.ts +385 -0
  238. package/src/Init/StandardAdapters.ts +141 -0
  239. package/src/Init/Status.ts +253 -0
  240. package/src/Install/Claude/Hook.ts +234 -81
  241. package/src/Install/Claude/Mcp.ts +80 -33
  242. package/src/Install/Claude/Skill.ts +70 -37
  243. package/src/Install/Codex/Mcp.ts +14 -9
  244. package/src/Install/Codex/Skill.ts +9 -5
  245. package/src/Install/Cursor/Mcp.ts +12 -9
  246. package/src/Install/Cursor/Skill.ts +9 -5
  247. package/src/Install/Domain.ts +77 -4
  248. package/src/Install/Hook.ts +3 -3
  249. package/src/Install/Mcp.ts +6 -6
  250. package/src/Install/Opencode/Hook.ts +5 -5
  251. package/src/Install/Opencode/Mcp.ts +11 -8
  252. package/src/Install/Opencode/Skill.ts +9 -5
  253. package/src/Install/Opencode/expandai-webfetch.js +27 -9
  254. package/src/Install/Skill.ts +3 -3
  255. package/src/Install/Uninstall.ts +3 -3
  256. package/src/MarkdownAnsi.ts +162 -0
  257. package/src/Mcp/ExpandDocs.ts +46 -55
  258. package/src/Mcp/Server.ts +2 -1
  259. package/src/Mcp/tools/Citations.ts +117 -8
  260. package/src/Mcp/tools/Fetch.ts +40 -14
  261. package/src/SecureFile.ts +70 -0
  262. package/src/Snippets.ts +19 -12
  263. package/src/Telemetry.ts +186 -0
  264. package/src/Version.ts +3 -0
  265. package/src/Xdg.ts +18 -0
  266. package/src/main.ts +171 -12
  267. package/build/dts/DeviceAuth.d.ts +0 -87
  268. package/build/dts/DeviceAuth.d.ts.map +0 -1
  269. package/build/esm/DeviceAuth.js +0 -127
  270. package/build/esm/DeviceAuth.js.map +0 -1
  271. package/src/DeviceAuth.ts +0 -193
@@ -0,0 +1,380 @@
1
+ import { homedir } from 'node:os';
2
+ import { FileSystem, Path } from '@effect/platform';
3
+ import { NodeFileSystem, NodePath } from '@effect/platform-node';
4
+ import { Array, Config, Effect, Either, Layer, Option, Schema } from 'effect';
5
+ import { hookCommandFor, isExpandaiHookCommand, planClaudeHook, planClaudeWebFetchDeny, SettingsSchema, WEBFETCH_MATCHER, } from '../Install/Claude/Hook.js';
6
+ import { planClaudeMcp } from '../Install/Claude/Mcp.js';
7
+ import { planClaudeSkill, SKILL_FILE_NAME, SKILL_NAME } from '../Install/Claude/Skill.js';
8
+ import { CliInvocation, McpServersConfigSchema, SERVER_KEY } from '../Install/Domain.js';
9
+ import { CLI_VERSION } from '../Version.js';
10
+ export const CLAUDE_PROFILE_VERSION = CLI_VERSION;
11
+ export const CLAUDE_POLICY_MANAGED_HOOKS = 'managed_hooks_only';
12
+ export const CLAUDE_POLICY_MANAGED_MCP = 'managed_mcp_only';
13
+ export const CLAUDE_POLICY_MCP_DENIED = 'managed_mcp_denied';
14
+ export const CLAUDE_POLICY_MCP_NOT_ALLOWED = 'managed_mcp_not_allowed';
15
+ export const CLAUDE_POLICY_READ_ONLY = 'target_read_only';
16
+ const JsonRecord = Schema.parseJson(Schema.Record({ key: Schema.String, value: Schema.Unknown }));
17
+ const PROFILE_VERSION_PATTERN = /^\s*expandai-profile-version:\s*([^\s]+)\s*$/mu;
18
+ const textEncoder = new TextEncoder();
19
+ const textDecoder = new TextDecoder();
20
+ const MODE_MAX = 0o7777;
21
+ function isUnknownRecord(value) {
22
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
23
+ }
24
+ function defaultManagedSettingsLocations() {
25
+ if (process.platform === 'darwin') {
26
+ const root = '/Library/Application Support/ClaudeCode';
27
+ return {
28
+ files: [`${root}/managed-settings.json`, `${root}/managed-mcp.json`],
29
+ directories: [`${root}/managed-settings.d`],
30
+ };
31
+ }
32
+ if (process.platform === 'win32') {
33
+ const root = 'C:\\Program Files\\ClaudeCode';
34
+ return {
35
+ files: [`${root}\\managed-settings.json`, `${root}\\managed-mcp.json`],
36
+ directories: [`${root}\\managed-settings.d`],
37
+ };
38
+ }
39
+ return {
40
+ files: ['/etc/claude-code/managed-settings.json', '/etc/claude-code/managed-mcp.json'],
41
+ directories: ['/etc/claude-code/managed-settings.d'],
42
+ };
43
+ }
44
+ /** Discoverable file-based Claude managed-policy locations for the current platform. */
45
+ export class ClaudeManagedSettingsLocations extends Effect.Service()('@expandai/cli/Init/ClaudeManagedSettingsLocations', {
46
+ sync: defaultManagedSettingsLocations,
47
+ }) {
48
+ static testLayer(locations) {
49
+ return Layer.succeed(ClaudeManagedSettingsLocations, ClaudeManagedSettingsLocations.make(locations));
50
+ }
51
+ }
52
+ function listContainsExpandai(value) {
53
+ if (!Array.isArray(value))
54
+ return false;
55
+ return value.some((entry) => {
56
+ if (entry === SERVER_KEY)
57
+ return true;
58
+ if (!isUnknownRecord(entry))
59
+ return false;
60
+ return entry.name === SERVER_KEY || entry.serverName === SERVER_KEY;
61
+ });
62
+ }
63
+ function managedPolicyBlocks(settings) {
64
+ const blocks = new Set();
65
+ const managedMcpOnly = settings.some((value) => value.allowManagedMcpServersOnly === true);
66
+ const allowedMcpConfigured = settings.some((value) => Array.isArray(value.allowedMcpServers));
67
+ const expandaiAllowed = settings.some((value) => listContainsExpandai(value.allowedMcpServers));
68
+ for (const value of settings) {
69
+ if (value.allowManagedHooksOnly === true)
70
+ blocks.add(CLAUDE_POLICY_MANAGED_HOOKS);
71
+ if (listContainsExpandai(value.deniedMcpServers))
72
+ blocks.add(CLAUDE_POLICY_MCP_DENIED);
73
+ }
74
+ if (managedMcpOnly && !expandaiAllowed)
75
+ blocks.add(CLAUDE_POLICY_MANAGED_MCP);
76
+ if (allowedMcpConfigured && !expandaiAllowed)
77
+ blocks.add(CLAUDE_POLICY_MCP_NOT_ALLOWED);
78
+ return [...blocks].sort();
79
+ }
80
+ function skillVersion(text) {
81
+ if (text === undefined)
82
+ return undefined;
83
+ return PROFILE_VERSION_PATTERN.exec(text)?.[1];
84
+ }
85
+ function mcpLegacyVariant(value) {
86
+ if (!isUnknownRecord(value))
87
+ return value === undefined ? [] : ['owned-entry'];
88
+ const command = value.command;
89
+ const args = value.args;
90
+ if (command === 'npx' && Array.isArray(args) && args[0] === '-y')
91
+ return ['npx-y'];
92
+ if (typeof command === 'string' && command !== 'expandai' && /(?:^|[\\/])expandai(?:\.exe)?$/u.test(command)) {
93
+ return ['absolute-path'];
94
+ }
95
+ return ['owned-entry'];
96
+ }
97
+ function hookLegacyVariant(command) {
98
+ if (/^npx\s+-y\s+/u.test(command.trim()))
99
+ return 'npx-y';
100
+ if (/\shook\s+claude\s*$/u.test(command))
101
+ return 'old-command-spelling';
102
+ if (/^(?:"|'|\/|[A-Za-z]:\\)/u.test(command.trim()))
103
+ return 'absolute-path';
104
+ if (/^if\s+command\s+-v\s+expandai/u.test(command.trim()))
105
+ return 'npx-shell-fallback';
106
+ return 'unversioned';
107
+ }
108
+ function makeInspection(scope, loaded, cli) {
109
+ const hookPlan = planClaudeHook(loaded.settings, CLAUDE_PROFILE_VERSION, cli);
110
+ const denyPlan = planClaudeWebFetchDeny(hookPlan.settings);
111
+ const hookEntries = (loaded.settings.hooks.PreToolUse ?? []).flatMap((entry) => entry.hooks.filter((hook) => isExpandaiHookCommand(hook.command)).map((hook) => ({ entry, hook })));
112
+ const hookVersion = hookEntries.length === 1 ? hookEntries[0]?.hook.expandaiProfileVersion : undefined;
113
+ const hookCurrent = !hookPlan.changed && !denyPlan.changed;
114
+ const hookLegacy = hookCurrent
115
+ ? []
116
+ : hookEntries.map(({ entry, hook }) => entry.matcher === WEBFETCH_MATCHER && hook.command === hookCommandFor(cli)
117
+ ? 'unversioned'
118
+ : hookLegacyVariant(hook.command));
119
+ const plannedSkill = planClaudeSkill(loaded.skillText, loaded.bundledSkillText, CLAUDE_PROFILE_VERSION);
120
+ const currentSkillVersion = skillVersion(loaded.skillText);
121
+ const skillCurrent = loaded.skillText !== undefined && !plannedSkill.changed;
122
+ const mcpValue = loaded.mcp.mcpServers[SERVER_KEY];
123
+ const mcpCurrent = !planClaudeMcp(loaded.mcp, cli).changed;
124
+ const components = [];
125
+ if (hookCurrent)
126
+ components.push('webfetch-hook');
127
+ if (skillCurrent)
128
+ components.push('runtime-skill');
129
+ if (mcpCurrent)
130
+ components.push('mcp');
131
+ const policyBlocks = managedPolicyBlocks(loaded.managedSettings);
132
+ if (loaded.readOnlyTargets.length > 0)
133
+ policyBlocks.push(CLAUDE_POLICY_READ_ONLY);
134
+ return {
135
+ scope,
136
+ targets: loaded.targets,
137
+ hook: {
138
+ current: hookCurrent,
139
+ installed: hookEntries.length > 0,
140
+ legacyVariants: hookLegacy,
141
+ ...(hookVersion === undefined ? {} : { version: hookVersion }),
142
+ },
143
+ skill: {
144
+ current: skillCurrent,
145
+ installed: loaded.skillText !== undefined,
146
+ legacyVariants: loaded.skillText === undefined || skillCurrent ? [] : ['outdated-runtime-skill'],
147
+ ...(currentSkillVersion === undefined ? {} : { version: currentSkillVersion }),
148
+ },
149
+ mcp: {
150
+ current: mcpCurrent,
151
+ installed: mcpValue !== undefined,
152
+ legacyVariants: mcpCurrent ? [] : mcpLegacyVariant(mcpValue),
153
+ },
154
+ components,
155
+ configured: components.length === 3,
156
+ profileVersion: CLAUDE_PROFILE_VERSION,
157
+ componentVersions: {
158
+ ...(hookVersion === undefined ? {} : { hook: hookVersion }),
159
+ ...(currentSkillVersion === undefined ? {} : { skill: currentSkillVersion }),
160
+ ...(mcpCurrent ? { mcp: CLAUDE_PROFILE_VERSION } : {}),
161
+ },
162
+ policyBlocks: [...new Set(policyBlocks)].sort(),
163
+ remotePolicyMayApply: true,
164
+ reloadMayBeRequired: !hookCurrent || !mcpCurrent,
165
+ consentMayBeRequired: scope === 'project',
166
+ };
167
+ }
168
+ const makeClaudeProfile = Effect.gen(function* () {
169
+ const fileSystem = yield* FileSystem.FileSystem;
170
+ const path = yield* Path.Path;
171
+ const managedSettingsLocations = yield* ClaudeManagedSettingsLocations;
172
+ // Resolved once per service: whether `expandai` is on PATH decides what the
173
+ // written hook and MCP entries invoke, and it cannot change mid-install.
174
+ const cli = yield* (yield* CliInvocation).resolve();
175
+ const home = yield* Config.string('HOME').pipe(Config.withDefault(homedir()));
176
+ const cwd = yield* Config.string('PWD').pipe(Config.withDefault(process.cwd()));
177
+ const moduleFile = yield* path.fromFileUrl(new URL(import.meta.url));
178
+ const bundledSkillFile = path.resolve(path.dirname(moduleFile), '..', '..', 'skills', SKILL_NAME, SKILL_FILE_NAME);
179
+ const readOptional = Effect.fnUntraced(function* (file) {
180
+ return (yield* fileSystem.exists(file)) ? yield* fileSystem.readFileString(file) : undefined;
181
+ });
182
+ const readPlannedFile = Effect.fnUntraced(function* (file) {
183
+ if (!(yield* fileSystem.exists(file))) {
184
+ return { expected: { exists: false } };
185
+ }
186
+ const info = yield* fileSystem.stat(file);
187
+ const bytes = yield* fileSystem.readFile(file);
188
+ return {
189
+ expected: {
190
+ exists: true,
191
+ type: 'File',
192
+ bytes,
193
+ mode: info.mode & MODE_MAX,
194
+ },
195
+ text: textDecoder.decode(bytes),
196
+ };
197
+ });
198
+ const expectedDirectory = Effect.fnUntraced(function* (directory) {
199
+ if (!(yield* fileSystem.exists(directory)))
200
+ return { exists: false };
201
+ const info = yield* fileSystem.stat(directory);
202
+ if (info.type !== 'Directory')
203
+ throw new Error('Planned directory target is not a directory');
204
+ return {
205
+ exists: true,
206
+ type: 'Directory',
207
+ mode: info.mode & MODE_MAX,
208
+ };
209
+ });
210
+ const writableAncestor = Effect.fnUntraced(function* (target) {
211
+ function ancestors(candidate) {
212
+ const parent = path.dirname(candidate);
213
+ return parent === candidate ? [candidate] : [candidate, ...ancestors(parent)];
214
+ }
215
+ const candidates = ancestors(target);
216
+ const states = yield* Effect.forEach(candidates, (candidate) => fileSystem.exists(candidate).pipe(Effect.map((exists) => ({ candidate, exists }))));
217
+ const candidate = states.find((state) => state.exists)?.candidate ?? candidates[candidates.length - 1];
218
+ if (candidate === undefined)
219
+ return false;
220
+ const info = yield* fileSystem.stat(candidate);
221
+ return (info.mode & 0o222) !== 0;
222
+ });
223
+ const mutationRequirementsWritable = Effect.fnUntraced(function* (operation) {
224
+ if (operation.type === 'write' &&
225
+ operation.expected?.exists === true &&
226
+ operation.expected.type === 'File' &&
227
+ !(yield* Effect.either(fileSystem.access(operation.path, { writable: true }))).pipe(Either.isRight)) {
228
+ return false;
229
+ }
230
+ if (operation.type === 'mkdir' && operation.expected?.exists === true)
231
+ return true;
232
+ const parent = path.dirname(operation.path);
233
+ function ancestors(candidate) {
234
+ const next = path.dirname(candidate);
235
+ return next === candidate ? [candidate] : [candidate, ...ancestors(next)];
236
+ }
237
+ const candidates = ancestors(parent);
238
+ const states = yield* Effect.forEach(candidates, (candidate) => fileSystem.exists(candidate).pipe(Effect.map((exists) => ({ candidate, exists }))));
239
+ const nearest = states.find((state) => state.exists)?.candidate;
240
+ if (nearest === undefined)
241
+ return false;
242
+ const existing = states.filter((state) => state.exists);
243
+ const traversable = yield* Effect.forEach(existing, ({ candidate }) => fileSystem.stat(candidate).pipe(Effect.map((info) => info.type === 'Directory' && (process.platform === 'win32' || (info.mode & 0o111) !== 0)), Effect.orElseSucceed(() => false)));
244
+ if (!traversable.every(Boolean))
245
+ return false;
246
+ // FileSystem.access performs the platform's effective writable check.
247
+ // Windows has no separate directory-traverse/ACL primitive here, so the
248
+ // transaction remains the final fail-closed enforcement for that facet.
249
+ return (yield* Effect.either(fileSystem.access(nearest, { writable: true }))).pipe(Either.isRight);
250
+ });
251
+ const load = Effect.fn('ClaudeProfile.load')(function* (scope) {
252
+ const root = scope === 'global' ? home : cwd;
253
+ const skillDirectory = path.join(root, '.claude', 'skills', SKILL_NAME);
254
+ const managed = managedSettingsLocations;
255
+ const dropInFiles = yield* Effect.flatMap(Effect.forEach(managed.directories, (directory) => fileSystem.exists(directory).pipe(Effect.flatMap((exists) => (exists ? fileSystem.readDirectory(directory) : Effect.succeed([]))), Effect.map((entries) => entries
256
+ .filter((entry) => !entry.startsWith('.') && entry.endsWith('.json'))
257
+ .sort()
258
+ .map((entry) => path.join(directory, entry))))), (files) => Effect.succeed(files.flat()));
259
+ const targets = {
260
+ settingsFile: path.join(root, '.claude', 'settings.json'),
261
+ skillDirectory,
262
+ skillFile: path.join(skillDirectory, SKILL_FILE_NAME),
263
+ mcpFile: scope === 'global' ? path.join(home, '.claude.json') : path.join(cwd, '.mcp.json'),
264
+ managedSettingsFiles: [...managed.files, ...dropInFiles],
265
+ managedSettingsDirectories: managed.directories,
266
+ };
267
+ const settingsFile = yield* readPlannedFile(targets.settingsFile);
268
+ const skillFile = yield* readPlannedFile(targets.skillFile);
269
+ const mcpFile = yield* readPlannedFile(targets.mcpFile);
270
+ const settingsText = settingsFile.text;
271
+ const skillText = skillFile.text;
272
+ const mcpText = mcpFile.text;
273
+ const bundledSkillText = yield* fileSystem.readFileString(bundledSkillFile);
274
+ const settings = yield* Schema.decode(SettingsSchema)(settingsText ?? '{}');
275
+ const mcp = yield* Schema.decode(McpServersConfigSchema)(mcpText ?? '{}');
276
+ const managedSettings = yield* Effect.forEach(targets.managedSettingsFiles, (file) => readOptional(file).pipe(Effect.flatMap((text) => text === undefined
277
+ ? Effect.succeed(Option.none())
278
+ : Schema.decode(JsonRecord)(text).pipe(Effect.map(Option.some)))));
279
+ const readOnlyTargets = yield* Effect.filter([targets.settingsFile, targets.skillFile, targets.mcpFile], (target) => writableAncestor(target).pipe(Effect.map((writable) => !writable)));
280
+ return {
281
+ targets,
282
+ settings,
283
+ settingsExpected: settingsFile.expected,
284
+ ...(settingsText === undefined ? {} : { settingsText }),
285
+ skillExpected: skillFile.expected,
286
+ ...(skillText === undefined ? {} : { skillText }),
287
+ bundledSkillText,
288
+ mcp,
289
+ mcpExpected: mcpFile.expected,
290
+ ...(mcpText === undefined ? {} : { mcpText }),
291
+ managedSettings: Array.getSomes(managedSettings),
292
+ readOnlyTargets,
293
+ };
294
+ });
295
+ const inspect = Effect.fn('ClaudeProfile.inspect')(function* (scope) {
296
+ return makeInspection(scope, yield* load(scope), cli);
297
+ });
298
+ const plan = Effect.fn('ClaudeProfile.plan')(function* (scope) {
299
+ const loaded = yield* load(scope);
300
+ const hookPlan = planClaudeHook(loaded.settings, CLAUDE_PROFILE_VERSION, cli);
301
+ // One settings file, one write: the deny rule is layered onto the hook plan's
302
+ // output so both land together or neither does.
303
+ const denyPlan = planClaudeWebFetchDeny(hookPlan.settings);
304
+ const settingsChanged = hookPlan.changed || denyPlan.changed;
305
+ const skillPlan = planClaudeSkill(loaded.skillText, loaded.bundledSkillText, CLAUDE_PROFILE_VERSION);
306
+ const mcpPlan = planClaudeMcp(loaded.mcp, cli);
307
+ const settingsText = `${yield* Schema.encode(SettingsSchema)(denyPlan.settings)}\n`;
308
+ const mcpText = `${yield* Schema.encode(McpServersConfigSchema)(mcpPlan.config)}\n`;
309
+ const settingsDirectory = path.dirname(loaded.targets.settingsFile);
310
+ const skillsDirectory = path.dirname(loaded.targets.skillDirectory);
311
+ const operations = [];
312
+ if (settingsChanged || skillPlan.changed) {
313
+ operations.push({
314
+ type: 'mkdir',
315
+ path: settingsDirectory,
316
+ expected: yield* expectedDirectory(settingsDirectory),
317
+ });
318
+ }
319
+ if (settingsChanged) {
320
+ operations.push({
321
+ type: 'write',
322
+ path: loaded.targets.settingsFile,
323
+ bytes: textEncoder.encode(settingsText),
324
+ expected: loaded.settingsExpected,
325
+ });
326
+ }
327
+ if (skillPlan.changed) {
328
+ operations.push({
329
+ type: 'mkdir',
330
+ path: skillsDirectory,
331
+ expected: yield* expectedDirectory(skillsDirectory),
332
+ });
333
+ operations.push({
334
+ type: 'mkdir',
335
+ path: loaded.targets.skillDirectory,
336
+ expected: yield* expectedDirectory(loaded.targets.skillDirectory),
337
+ });
338
+ operations.push({
339
+ type: 'write',
340
+ path: loaded.targets.skillFile,
341
+ bytes: textEncoder.encode(skillPlan.text),
342
+ expected: loaded.skillExpected,
343
+ });
344
+ }
345
+ if (mcpPlan.changed) {
346
+ operations.push({
347
+ type: 'write',
348
+ path: loaded.targets.mcpFile,
349
+ bytes: textEncoder.encode(mcpText),
350
+ expected: loaded.mcpExpected,
351
+ });
352
+ }
353
+ const requirements = yield* Effect.forEach(operations, mutationRequirementsWritable);
354
+ const inspectedLoaded = requirements.every(Boolean)
355
+ ? loaded
356
+ : { ...loaded, readOnlyTargets: [...loaded.readOnlyTargets, 'mutation-requirement'] };
357
+ const inspection = makeInspection(scope, inspectedLoaded, cli);
358
+ const resultInspection = makeInspection(scope, {
359
+ ...inspectedLoaded,
360
+ settings: denyPlan.settings,
361
+ settingsText,
362
+ skillText: skillPlan.text,
363
+ mcp: mcpPlan.config,
364
+ mcpText,
365
+ }, cli);
366
+ return {
367
+ changed: settingsChanged || skillPlan.changed || mcpPlan.changed,
368
+ inspection,
369
+ resultInspection,
370
+ operations,
371
+ };
372
+ });
373
+ return { inspect, plan };
374
+ });
375
+ export class ClaudeProfile extends Effect.Service()('@expandai/cli/Init/ClaudeProfile', {
376
+ dependencies: [NodeFileSystem.layer, NodePath.layer, ClaudeManagedSettingsLocations.Default, CliInvocation.Default],
377
+ effect: makeClaudeProfile,
378
+ }) {
379
+ }
380
+ //# sourceMappingURL=ClaudeProfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaudeProfile.js","sourceRoot":"","sources":["../../../src/Init/ClaudeProfile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,118 @@
1
+ import { Schema } from 'effect';
2
+ // Relayed verbatim by the agent, and printed as-is in the terminal, so it has to
3
+ // carry the whole browser round-trip on its own — the guide no longer restates it.
4
+ export const AUTHORIZATION_REQUIRED_MESSAGE = 'Open the approval page in your browser, type in the code shown here, and approve. Only enter this code on the Expand approval page your terminal named — never a code someone sent you, and never on a page from a link you did not expect. When you have approved, say so, and the same command will pick the authorization up.';
5
+ export const AUTHORIZATION_CONSUMED_MESSAGE = 'Authorization complete. That setup code has been consumed and cannot be reused.';
6
+ export const ALREADY_AUTHENTICATED_MESSAGE = 'Expand is already authorized. Agent setup is complete.';
7
+ /**
8
+ * Some harnesses were configured and some were not. This has to be its own
9
+ * message: the agent relays `userMessage` verbatim, so reporting a partial run
10
+ * with "Agent setup is complete" tells the user something untrue about a
11
+ * machine they are about to rely on.
12
+ */
13
+ export const PARTIAL_CONFIGURATION_MESSAGE = 'Expand is authorized, but not every harness could be configured. The harnesses that failed are listed under `failures`; the ones under `installations` are ready to use.';
14
+ export const HARNESS_SELECTION_MESSAGE = 'Show these harnesses to the user and ask which to configure. Pass the chosen ones to `expandai init --harnesses`. Harnesses that are not chosen are left untouched.';
15
+ /** There is nothing to choose from, so the agent must not present an empty list. */
16
+ export const NO_HARNESS_DETECTED_MESSAGE = 'No supported agent harness was found on this machine. Do not ask the user to choose from an empty list. Tell them Expand supports claude-code, cursor, opencode, and codex, and that setup cannot continue until one of them is installed.';
17
+ export const InitHarness = Schema.Literal('claude-code', 'cursor', 'opencode', 'codex');
18
+ /**
19
+ * Answer to `init --detect`: what setup *would* touch, before it touches
20
+ * anything. Separate from `InitResult` because detection never authorizes,
21
+ * never writes, and can legitimately find nothing.
22
+ */
23
+ export class InitDetectionResult extends Schema.Class('InitDetectionResult')({
24
+ schemaVersion: Schema.Literal(1),
25
+ status: Schema.Literal('detected'),
26
+ harnesses: Schema.Array(InitHarness),
27
+ current: Schema.optional(InitHarness),
28
+ userMessage: Schema.Literal(HARNESS_SELECTION_MESSAGE, NO_HARNESS_DETECTED_MESSAGE),
29
+ }) {
30
+ }
31
+ export const InitHarnesses = Schema.NonEmptyArray(InitHarness);
32
+ export const InitScope = Schema.Literal('project', 'global');
33
+ export const InitComponent = Schema.Literal('webfetch-hook', 'runtime-skill', 'mcp');
34
+ export const InitRuntimeState = Schema.Literal('unverified', 'observed', 'reload_required', 'blocked');
35
+ export const InitStatus = Schema.Literal('authorization_required', 'completed');
36
+ // A dashboard setup token is a pre-approved RFC 8628 device code minted by
37
+ // better-auth: opaque, bounded, single-use.
38
+ const SetupToken = Schema.String.pipe(Schema.minLength(20), Schema.maxLength(256));
39
+ const SafeSetupToken = Schema.transform(SetupToken, Schema.Redacted(Schema.String), {
40
+ strict: true,
41
+ decode: (setupToken) => setupToken,
42
+ // Long enough to satisfy the base schema on re-encode; still obviously not a token.
43
+ encode: () => '<redacted-redacted-setup-token>',
44
+ });
45
+ export class InitRequest extends Schema.Class('InitRequest')({
46
+ harnesses: InitHarnesses,
47
+ scope: InitScope,
48
+ setupToken: Schema.optional(SafeSetupToken),
49
+ }) {
50
+ }
51
+ const InitAuthorizationRequiredResult = Schema.Struct({
52
+ schemaVersion: Schema.Literal(1),
53
+ status: Schema.Literal('authorization_required'),
54
+ harnesses: InitHarnesses,
55
+ scope: InitScope,
56
+ userMessage: Schema.Literal(AUTHORIZATION_REQUIRED_MESSAGE),
57
+ authorization: Schema.Struct({
58
+ url: Schema.URL,
59
+ // Typed by the human into the approval page. Deliberately not embedded in
60
+ // the URL: entering it is the one moment a phished user can notice the
61
+ // request is not theirs.
62
+ userCode: Schema.String,
63
+ approvalExpiresAt: Schema.DateTimeUtc,
64
+ }),
65
+ });
66
+ /** Whether the harness has actually loaded what we wrote, and what to do if not. */
67
+ const InitVerification = Schema.Struct({
68
+ runtimeState: InitRuntimeState,
69
+ nextAction: Schema.String,
70
+ });
71
+ /** One harness that setup wrote to, and what it now reports about itself. */
72
+ const InitInstallation = Schema.Struct({
73
+ harness: InitHarness,
74
+ configured: Schema.Boolean,
75
+ changed: Schema.Boolean,
76
+ components: Schema.Array(InitComponent),
77
+ version: Schema.String,
78
+ verification: InitVerification,
79
+ });
80
+ /**
81
+ * A harness that was attempted and did not land. Named separately because the
82
+ * agent is asked to tell the user *which* of their agents is not set up, and it
83
+ * has no other way to know: `harnesses` lists what was requested and
84
+ * `installations` what worked, but the difference alone says neither why nor
85
+ * whether retrying helps.
86
+ */
87
+ const InitFailure = Schema.Struct({
88
+ harness: InitHarness,
89
+ code: Schema.String,
90
+ recoverable: Schema.Boolean,
91
+ });
92
+ const InitCompletedResult = Schema.Struct({
93
+ schemaVersion: Schema.Literal(1),
94
+ status: Schema.Literal('completed'),
95
+ harnesses: InitHarnesses,
96
+ scope: InitScope,
97
+ userMessage: Schema.Literal(AUTHORIZATION_CONSUMED_MESSAGE, ALREADY_AUTHENTICATED_MESSAGE, PARTIAL_CONFIGURATION_MESSAGE),
98
+ auth: Schema.Struct({
99
+ healthy: Schema.Boolean,
100
+ }),
101
+ // Which project `scope: 'project'` actually meant. It resolves to the working
102
+ // directory, which for an agent may be anywhere — a repo, a home directory,
103
+ // a temp folder — and nothing else in this result says where config landed.
104
+ projectPath: Schema.optional(Schema.String),
105
+ installations: Schema.NonEmptyArray(InitInstallation),
106
+ // Absent when every selected harness succeeded.
107
+ failures: Schema.optional(Schema.Array(InitFailure)),
108
+ });
109
+ export const InitResult = Schema.Union(InitAuthorizationRequiredResult, InitCompletedResult);
110
+ export class InitErrorEnvelope extends Schema.Class('InitErrorEnvelope')({
111
+ schemaVersion: Schema.Literal(1),
112
+ status: Schema.Literal('error'),
113
+ code: Schema.String,
114
+ message: Schema.String,
115
+ recoverable: Schema.Boolean,
116
+ }) {
117
+ }
118
+ //# sourceMappingURL=Domain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Domain.js","sourceRoot":"","sources":["../../../src/Init/Domain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Inspectable, Schema } from 'effect';
2
+ import { InitHarness, InitScope } from './Domain.js';
3
+ export class HarnessInspectionError extends Schema.TaggedError()('HarnessInspectionError', {
4
+ harness: InitHarness,
5
+ scope: InitScope,
6
+ error: Schema.Defect,
7
+ }) {
8
+ get message() {
9
+ return `Failed to inspect ${this.harness} (${this.scope}): ${Inspectable.format(this.error)}`;
10
+ }
11
+ }
12
+ export class HarnessConfigurationError extends Schema.TaggedError()('HarnessConfigurationError', {
13
+ harness: InitHarness,
14
+ scope: InitScope,
15
+ error: Schema.Defect,
16
+ }) {
17
+ get message() {
18
+ return `Failed to configure ${this.harness} (${this.scope}): ${Inspectable.format(this.error)}`;
19
+ }
20
+ }
21
+ //# sourceMappingURL=HarnessAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HarnessAdapter.js","sourceRoot":"","sources":["../../../src/Init/HarnessAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC5C,OAAO,EAAsB,WAAW,EAAyB,SAAS,EAAE,MAAM,aAAa,CAAA;AAY/F,MAAM,OAAO,sBAAuB,SAAQ,MAAM,CAAC,WAAW,EAA0B,CAAC,wBAAwB,EAAE;IAClH,OAAO,EAAE,WAAW;IACpB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM;CACpB,CAAC;IACD,IAAI,OAAO;QACV,OAAO,qBAAqB,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;IAC9F,CAAC;CACD;AAED,MAAM,OAAO,yBAA0B,SAAQ,MAAM,CAAC,WAAW,EAA6B,CAC7F,2BAA2B,EAC3B;IACC,OAAO,EAAE,WAAW;IACpB,KAAK,EAAE,SAAS;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM;CACpB,CACD;IACA,IAAI,OAAO;QACV,OAAO,uBAAuB,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,KAAK,MAAM,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAA;IAChG,CAAC;CACD"}
@@ -0,0 +1,65 @@
1
+ import { homedir } from 'node:os';
2
+ import { FileSystem, Path } from '@effect/platform';
3
+ import { NodeFileSystem, NodePath } from '@effect/platform-node';
4
+ import { Effect, Option, Schema } from 'effect';
5
+ import { InitHarness } from './Domain.js';
6
+ const HARNESS_ORDER = ['claude-code', 'cursor', 'opencode', 'codex'];
7
+ function enabled(value) {
8
+ return value !== undefined && value !== '' && value !== '0' && value !== 'false';
9
+ }
10
+ function currentHarness(environment) {
11
+ const explicit = Schema.decodeUnknownOption(InitHarness)(environment.EXPANDAI_HARNESS);
12
+ if (Option.isSome(explicit))
13
+ return explicit;
14
+ if (enabled(environment.CLAUDECODE))
15
+ return Option.some('claude-code');
16
+ if (environment.CURSOR_TRACE_ID !== undefined)
17
+ return Option.some('cursor');
18
+ if (environment.CODEX_RUN_ID !== undefined)
19
+ return Option.some('codex');
20
+ return Option.none();
21
+ }
22
+ export class HarnessDetector extends Effect.Service()('@expandai/cli/Init/HarnessDetector', {
23
+ dependencies: [NodeFileSystem.layer, NodePath.layer],
24
+ effect: Effect.gen(function* () {
25
+ const fileSystem = yield* FileSystem.FileSystem;
26
+ const path = yield* Path.Path;
27
+ const detect = Effect.fn('HarnessDetector.detect')(function* (input = {}) {
28
+ const environment = input.environment ?? process.env;
29
+ const cwd = input.cwd ?? environment.PWD ?? process.cwd();
30
+ const home = environment.HOME ?? homedir();
31
+ const candidates = new Map([
32
+ ['claude-code', [path.join(home, '.claude'), path.join(cwd, '.claude')]],
33
+ ['cursor', [path.join(home, '.cursor'), path.join(cwd, '.cursor')]],
34
+ [
35
+ 'opencode',
36
+ [path.join(home, '.config', 'opencode'), path.join(cwd, '.opencode'), path.join(cwd, 'opencode.json')],
37
+ ],
38
+ ['codex', [path.join(home, '.codex'), path.join(cwd, '.codex')]],
39
+ ]);
40
+ const detected = new Set();
41
+ const current = currentHarness(environment);
42
+ if (Option.isSome(current))
43
+ detected.add(current.value);
44
+ if (input.hint !== undefined)
45
+ detected.add(input.hint);
46
+ // Collect, then filter. The previous version mutated `detected` from inside
47
+ // a `tap` under unbounded concurrency — safe on one thread, but it read as
48
+ // a race and expressed "keep the ones that exist" as a side effect.
49
+ const present = yield* Effect.forEach(HARNESS_ORDER, (harness) => Effect.exists(candidates.get(harness) ?? [], (candidate) => fileSystem.exists(candidate).pipe(Effect.orElseSucceed(() => false))).pipe(Effect.map((exists) => ({ harness, exists }))), { concurrency: 'unbounded' });
50
+ for (const { harness, exists } of present)
51
+ if (exists)
52
+ detected.add(harness);
53
+ return HARNESS_ORDER.filter((harness) => detected.has(harness));
54
+ });
55
+ /** The harness this process is running inside, when it announces itself. */
56
+ const detectCurrent = Effect.fnUntraced(function* (input = {}) {
57
+ // Reads ambient `process.env` when no environment is supplied, so it stays
58
+ // an Effect — but it does no work worth a span.
59
+ return currentHarness(input.environment ?? process.env);
60
+ });
61
+ return { detect, detectCurrent };
62
+ }),
63
+ }) {
64
+ }
65
+ //# sourceMappingURL=HarnessDetector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HarnessDetector.js","sourceRoot":"","sources":["../../../src/Init/HarnessDetector.ts"],"names":[],"mappings":"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"}