expandai 0.0.4 → 0.0.5

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 (319) hide show
  1. package/build/{esm/Install/Opencode → assets/opencode}/expandai-webfetch.js +22 -4
  2. package/build/dts/Mcp/RequestHeaders.d.ts +0 -1
  3. package/build/dts/Mcp/Server.d.ts +1 -2
  4. package/build/dts/index.d.ts +0 -1
  5. package/build/esm/index.js +180 -2
  6. package/build/esm/main.js +677 -200
  7. package/package.json +19 -11
  8. package/build/dts/ApiClient.d.ts +0 -165
  9. package/build/dts/ApiClient.d.ts.map +0 -1
  10. package/build/dts/Auth/Domain.d.ts +0 -95
  11. package/build/dts/Auth/Domain.d.ts.map +0 -1
  12. package/build/dts/Auth/ManualAuthorization.d.ts +0 -107
  13. package/build/dts/Auth/ManualAuthorization.d.ts.map +0 -1
  14. package/build/dts/Auth/PendingInit.d.ts +0 -35
  15. package/build/dts/Auth/PendingInit.d.ts.map +0 -1
  16. package/build/dts/Auth/Pkce.d.ts +0 -10
  17. package/build/dts/Auth/Pkce.d.ts.map +0 -1
  18. package/build/dts/Auth/SetupGrantAuthorization.d.ts +0 -34
  19. package/build/dts/Auth/SetupGrantAuthorization.d.ts.map +0 -1
  20. package/build/dts/Authentication.d.ts +0 -24
  21. package/build/dts/Authentication.d.ts.map +0 -1
  22. package/build/dts/BrowserOAuth.d.ts +0 -99
  23. package/build/dts/BrowserOAuth.d.ts.map +0 -1
  24. package/build/dts/CommandPath.d.ts +0 -2
  25. package/build/dts/CommandPath.d.ts.map +0 -1
  26. package/build/dts/Commands/Fetch.d.ts +0 -30
  27. package/build/dts/Commands/Fetch.d.ts.map +0 -1
  28. package/build/dts/Commands/Hook.d.ts +0 -17
  29. package/build/dts/Commands/Hook.d.ts.map +0 -1
  30. package/build/dts/Commands/Init.d.ts +0 -55
  31. package/build/dts/Commands/Init.d.ts.map +0 -1
  32. package/build/dts/Commands/Mcp.d.ts +0 -11
  33. package/build/dts/Commands/Mcp.d.ts.map +0 -1
  34. package/build/dts/Commands/McpRun.d.ts +0 -5
  35. package/build/dts/Commands/McpRun.d.ts.map +0 -1
  36. package/build/dts/Commands/Search.d.ts +0 -21
  37. package/build/dts/Commands/Search.d.ts.map +0 -1
  38. package/build/dts/Commands/Skill.d.ts +0 -12
  39. package/build/dts/Commands/Skill.d.ts.map +0 -1
  40. package/build/dts/Commands/Status.d.ts +0 -27
  41. package/build/dts/Commands/Status.d.ts.map +0 -1
  42. package/build/dts/Commands/Telemetry.d.ts +0 -7
  43. package/build/dts/Commands/Telemetry.d.ts.map +0 -1
  44. package/build/dts/Commands/Uninstall.d.ts +0 -9
  45. package/build/dts/Commands/Uninstall.d.ts.map +0 -1
  46. package/build/dts/Config.d.ts +0 -196
  47. package/build/dts/Config.d.ts.map +0 -1
  48. package/build/dts/Hook/Claude.d.ts +0 -13
  49. package/build/dts/Hook/Claude.d.ts.map +0 -1
  50. package/build/dts/Hook/Errors.d.ts +0 -20
  51. package/build/dts/Hook/Errors.d.ts.map +0 -1
  52. package/build/dts/Hook/Opencode.d.ts +0 -13
  53. package/build/dts/Hook/Opencode.d.ts.map +0 -1
  54. package/build/dts/Hook/SnapshotNote.d.ts +0 -12
  55. package/build/dts/Hook/SnapshotNote.d.ts.map +0 -1
  56. package/build/dts/Init/ClaudeAdapter.d.ts +0 -61
  57. package/build/dts/Init/ClaudeAdapter.d.ts.map +0 -1
  58. package/build/dts/Init/ClaudeProfile.d.ts +0 -77
  59. package/build/dts/Init/ClaudeProfile.d.ts.map +0 -1
  60. package/build/dts/Init/Domain.d.ts +0 -139
  61. package/build/dts/Init/Domain.d.ts.map +0 -1
  62. package/build/dts/Init/HarnessAdapter.d.ts +0 -33
  63. package/build/dts/Init/HarnessAdapter.d.ts.map +0 -1
  64. package/build/dts/Init/HarnessDetector.d.ts +0 -19
  65. package/build/dts/Init/HarnessDetector.d.ts.map +0 -1
  66. package/build/dts/Init/HarnessRegistry.d.ts +0 -50
  67. package/build/dts/Init/HarnessRegistry.d.ts.map +0 -1
  68. package/build/dts/Init/MutationTransaction.d.ts +0 -96
  69. package/build/dts/Init/MutationTransaction.d.ts.map +0 -1
  70. package/build/dts/Init/Service.d.ts +0 -72
  71. package/build/dts/Init/Service.d.ts.map +0 -1
  72. package/build/dts/Init/StandardAdapters.d.ts +0 -42
  73. package/build/dts/Init/StandardAdapters.d.ts.map +0 -1
  74. package/build/dts/Init/Status.d.ts +0 -149
  75. package/build/dts/Init/Status.d.ts.map +0 -1
  76. package/build/dts/Install/Claude/Hook.d.ts +0 -88
  77. package/build/dts/Install/Claude/Hook.d.ts.map +0 -1
  78. package/build/dts/Install/Claude/Mcp.d.ts +0 -48
  79. package/build/dts/Install/Claude/Mcp.d.ts.map +0 -1
  80. package/build/dts/Install/Claude/Skill.d.ts +0 -23
  81. package/build/dts/Install/Claude/Skill.d.ts.map +0 -1
  82. package/build/dts/Install/Codex/Mcp.d.ts +0 -45
  83. package/build/dts/Install/Codex/Mcp.d.ts.map +0 -1
  84. package/build/dts/Install/Codex/Skill.d.ts +0 -22
  85. package/build/dts/Install/Codex/Skill.d.ts.map +0 -1
  86. package/build/dts/Install/Cursor/Mcp.d.ts +0 -45
  87. package/build/dts/Install/Cursor/Mcp.d.ts.map +0 -1
  88. package/build/dts/Install/Cursor/Skill.d.ts +0 -29
  89. package/build/dts/Install/Cursor/Skill.d.ts.map +0 -1
  90. package/build/dts/Install/Domain.d.ts +0 -103
  91. package/build/dts/Install/Domain.d.ts.map +0 -1
  92. package/build/dts/Install/Hook.d.ts +0 -30
  93. package/build/dts/Install/Hook.d.ts.map +0 -1
  94. package/build/dts/Install/Mcp.d.ts +0 -28
  95. package/build/dts/Install/Mcp.d.ts.map +0 -1
  96. package/build/dts/Install/Opencode/Hook.d.ts +0 -24
  97. package/build/dts/Install/Opencode/Hook.d.ts.map +0 -1
  98. package/build/dts/Install/Opencode/Mcp.d.ts +0 -47
  99. package/build/dts/Install/Opencode/Mcp.d.ts.map +0 -1
  100. package/build/dts/Install/Opencode/Skill.d.ts +0 -26
  101. package/build/dts/Install/Opencode/Skill.d.ts.map +0 -1
  102. package/build/dts/Install/Skill.d.ts +0 -32
  103. package/build/dts/Install/Skill.d.ts.map +0 -1
  104. package/build/dts/Install/Uninstall.d.ts +0 -32
  105. package/build/dts/Install/Uninstall.d.ts.map +0 -1
  106. package/build/dts/MarkdownAnsi.d.ts +0 -29
  107. package/build/dts/MarkdownAnsi.d.ts.map +0 -1
  108. package/build/dts/Mcp/ExpandDocs.d.ts +0 -19
  109. package/build/dts/Mcp/ExpandDocs.d.ts.map +0 -1
  110. package/build/dts/Mcp/RequestHeaders.d.ts.map +0 -1
  111. package/build/dts/Mcp/Server.d.ts.map +0 -1
  112. package/build/dts/Mcp/Toolkit.d.ts +0 -3
  113. package/build/dts/Mcp/Toolkit.d.ts.map +0 -1
  114. package/build/dts/Mcp/tools/Citations.d.ts +0 -266
  115. package/build/dts/Mcp/tools/Citations.d.ts.map +0 -1
  116. package/build/dts/Mcp/tools/Fetch.d.ts +0 -168
  117. package/build/dts/Mcp/tools/Fetch.d.ts.map +0 -1
  118. package/build/dts/SecureFile.d.ts +0 -23
  119. package/build/dts/SecureFile.d.ts.map +0 -1
  120. package/build/dts/Snippets.d.ts +0 -18
  121. package/build/dts/Snippets.d.ts.map +0 -1
  122. package/build/dts/Telemetry.d.ts +0 -30
  123. package/build/dts/Telemetry.d.ts.map +0 -1
  124. package/build/dts/Version.d.ts +0 -2
  125. package/build/dts/Version.d.ts.map +0 -1
  126. package/build/dts/Xdg.d.ts +0 -11
  127. package/build/dts/Xdg.d.ts.map +0 -1
  128. package/build/dts/index.d.ts.map +0 -1
  129. package/build/dts/main.d.ts +0 -3
  130. package/build/dts/main.d.ts.map +0 -1
  131. package/build/esm/ApiClient.js +0 -305
  132. package/build/esm/ApiClient.js.map +0 -1
  133. package/build/esm/Auth/Domain.js +0 -56
  134. package/build/esm/Auth/Domain.js.map +0 -1
  135. package/build/esm/Auth/ManualAuthorization.js +0 -253
  136. package/build/esm/Auth/ManualAuthorization.js.map +0 -1
  137. package/build/esm/Auth/PendingInit.js +0 -267
  138. package/build/esm/Auth/PendingInit.js.map +0 -1
  139. package/build/esm/Auth/Pkce.js +0 -23
  140. package/build/esm/Auth/Pkce.js.map +0 -1
  141. package/build/esm/Auth/SetupGrantAuthorization.js +0 -91
  142. package/build/esm/Auth/SetupGrantAuthorization.js.map +0 -1
  143. package/build/esm/Authentication.js +0 -143
  144. package/build/esm/Authentication.js.map +0 -1
  145. package/build/esm/BrowserOAuth.js +0 -251
  146. package/build/esm/BrowserOAuth.js.map +0 -1
  147. package/build/esm/CommandPath.js +0 -31
  148. package/build/esm/CommandPath.js.map +0 -1
  149. package/build/esm/Commands/Fetch.js +0 -119
  150. package/build/esm/Commands/Fetch.js.map +0 -1
  151. package/build/esm/Commands/Hook.js +0 -20
  152. package/build/esm/Commands/Hook.js.map +0 -1
  153. package/build/esm/Commands/Init.js +0 -371
  154. package/build/esm/Commands/Init.js.map +0 -1
  155. package/build/esm/Commands/Mcp.js +0 -19
  156. package/build/esm/Commands/Mcp.js.map +0 -1
  157. package/build/esm/Commands/McpRun.js +0 -15
  158. package/build/esm/Commands/McpRun.js.map +0 -1
  159. package/build/esm/Commands/Search.js +0 -46
  160. package/build/esm/Commands/Search.js.map +0 -1
  161. package/build/esm/Commands/Skill.js +0 -17
  162. package/build/esm/Commands/Skill.js.map +0 -1
  163. package/build/esm/Commands/Status.js +0 -186
  164. package/build/esm/Commands/Status.js.map +0 -1
  165. package/build/esm/Commands/Telemetry.js +0 -23
  166. package/build/esm/Commands/Telemetry.js.map +0 -1
  167. package/build/esm/Commands/Uninstall.js +0 -28
  168. package/build/esm/Commands/Uninstall.js.map +0 -1
  169. package/build/esm/Config.js +0 -619
  170. package/build/esm/Config.js.map +0 -1
  171. package/build/esm/Hook/Claude.js +0 -74
  172. package/build/esm/Hook/Claude.js.map +0 -1
  173. package/build/esm/Hook/Errors.js +0 -18
  174. package/build/esm/Hook/Errors.js.map +0 -1
  175. package/build/esm/Hook/Opencode.js +0 -50
  176. package/build/esm/Hook/Opencode.js.map +0 -1
  177. package/build/esm/Hook/SnapshotNote.js +0 -65
  178. package/build/esm/Hook/SnapshotNote.js.map +0 -1
  179. package/build/esm/Init/ClaudeAdapter.js +0 -137
  180. package/build/esm/Init/ClaudeAdapter.js.map +0 -1
  181. package/build/esm/Init/ClaudeProfile.js +0 -344
  182. package/build/esm/Init/ClaudeProfile.js.map +0 -1
  183. package/build/esm/Init/Domain.js +0 -118
  184. package/build/esm/Init/Domain.js.map +0 -1
  185. package/build/esm/Init/HarnessAdapter.js +0 -21
  186. package/build/esm/Init/HarnessAdapter.js.map +0 -1
  187. package/build/esm/Init/HarnessDetector.js +0 -65
  188. package/build/esm/Init/HarnessDetector.js.map +0 -1
  189. package/build/esm/Init/HarnessRegistry.js +0 -58
  190. package/build/esm/Init/HarnessRegistry.js.map +0 -1
  191. package/build/esm/Init/MutationTransaction.js +0 -494
  192. package/build/esm/Init/MutationTransaction.js.map +0 -1
  193. package/build/esm/Init/Service.js +0 -319
  194. package/build/esm/Init/Service.js.map +0 -1
  195. package/build/esm/Init/StandardAdapters.js +0 -116
  196. package/build/esm/Init/StandardAdapters.js.map +0 -1
  197. package/build/esm/Init/Status.js +0 -215
  198. package/build/esm/Init/Status.js.map +0 -1
  199. package/build/esm/Install/Claude/Hook.js +0 -77
  200. package/build/esm/Install/Claude/Hook.js.map +0 -1
  201. package/build/esm/Install/Claude/Mcp.js +0 -101
  202. package/build/esm/Install/Claude/Mcp.js.map +0 -1
  203. package/build/esm/Install/Claude/Skill.js +0 -56
  204. package/build/esm/Install/Claude/Skill.js.map +0 -1
  205. package/build/esm/Install/Codex/Mcp.js +0 -97
  206. package/build/esm/Install/Codex/Mcp.js.map +0 -1
  207. package/build/esm/Install/Codex/Skill.js +0 -33
  208. package/build/esm/Install/Codex/Skill.js.map +0 -1
  209. package/build/esm/Install/Cursor/Mcp.js +0 -74
  210. package/build/esm/Install/Cursor/Mcp.js.map +0 -1
  211. package/build/esm/Install/Cursor/Skill.js +0 -40
  212. package/build/esm/Install/Cursor/Skill.js.map +0 -1
  213. package/build/esm/Install/Domain.js +0 -162
  214. package/build/esm/Install/Domain.js.map +0 -1
  215. package/build/esm/Install/Hook.js +0 -38
  216. package/build/esm/Install/Hook.js.map +0 -1
  217. package/build/esm/Install/Mcp.js +0 -40
  218. package/build/esm/Install/Mcp.js.map +0 -1
  219. package/build/esm/Install/Opencode/Hook.js +0 -44
  220. package/build/esm/Install/Opencode/Hook.js.map +0 -1
  221. package/build/esm/Install/Opencode/Mcp.js +0 -76
  222. package/build/esm/Install/Opencode/Mcp.js.map +0 -1
  223. package/build/esm/Install/Opencode/Skill.js +0 -37
  224. package/build/esm/Install/Opencode/Skill.js.map +0 -1
  225. package/build/esm/Install/Skill.js +0 -41
  226. package/build/esm/Install/Skill.js.map +0 -1
  227. package/build/esm/Install/Uninstall.js +0 -49
  228. package/build/esm/Install/Uninstall.js.map +0 -1
  229. package/build/esm/MarkdownAnsi.js +0 -142
  230. package/build/esm/MarkdownAnsi.js.map +0 -1
  231. package/build/esm/Mcp/ExpandDocs.js +0 -56
  232. package/build/esm/Mcp/ExpandDocs.js.map +0 -1
  233. package/build/esm/Mcp/RequestHeaders.js +0 -13
  234. package/build/esm/Mcp/RequestHeaders.js.map +0 -1
  235. package/build/esm/Mcp/Server.js +0 -12
  236. package/build/esm/Mcp/Server.js.map +0 -1
  237. package/build/esm/Mcp/Toolkit.js +0 -16
  238. package/build/esm/Mcp/Toolkit.js.map +0 -1
  239. package/build/esm/Mcp/tools/Citations.js +0 -193
  240. package/build/esm/Mcp/tools/Citations.js.map +0 -1
  241. package/build/esm/Mcp/tools/Fetch.js +0 -165
  242. package/build/esm/Mcp/tools/Fetch.js.map +0 -1
  243. package/build/esm/SecureFile.js +0 -36
  244. package/build/esm/SecureFile.js.map +0 -1
  245. package/build/esm/Snippets.js +0 -29
  246. package/build/esm/Snippets.js.map +0 -1
  247. package/build/esm/Telemetry.js +0 -157
  248. package/build/esm/Telemetry.js.map +0 -1
  249. package/build/esm/Version.js +0 -4
  250. package/build/esm/Version.js.map +0 -1
  251. package/build/esm/Xdg.js +0 -15
  252. package/build/esm/Xdg.js.map +0 -1
  253. package/build/esm/index.js.map +0 -1
  254. package/build/esm/main.js.map +0 -1
  255. package/src/ApiClient.ts +0 -450
  256. package/src/Auth/Domain.ts +0 -63
  257. package/src/Auth/ManualAuthorization.ts +0 -296
  258. package/src/Auth/PendingInit.ts +0 -338
  259. package/src/Auth/Pkce.ts +0 -26
  260. package/src/Auth/SetupGrantAuthorization.ts +0 -116
  261. package/src/Authentication.ts +0 -202
  262. package/src/BrowserOAuth.ts +0 -359
  263. package/src/CommandPath.ts +0 -30
  264. package/src/Commands/Fetch.ts +0 -188
  265. package/src/Commands/Hook.ts +0 -48
  266. package/src/Commands/Init.ts +0 -489
  267. package/src/Commands/Mcp.ts +0 -30
  268. package/src/Commands/McpRun.ts +0 -25
  269. package/src/Commands/Search.ts +0 -97
  270. package/src/Commands/Skill.ts +0 -30
  271. package/src/Commands/Status.ts +0 -228
  272. package/src/Commands/Telemetry.ts +0 -42
  273. package/src/Commands/Uninstall.ts +0 -38
  274. package/src/Config.ts +0 -840
  275. package/src/Hook/Claude.ts +0 -81
  276. package/src/Hook/Errors.ts +0 -19
  277. package/src/Hook/Opencode.ts +0 -58
  278. package/src/Hook/SnapshotNote.ts +0 -66
  279. package/src/Init/ClaudeAdapter.ts +0 -191
  280. package/src/Init/ClaudeProfile.ts +0 -453
  281. package/src/Init/Domain.ts +0 -153
  282. package/src/Init/HarnessAdapter.ts +0 -35
  283. package/src/Init/HarnessDetector.ts +0 -77
  284. package/src/Init/HarnessRegistry.ts +0 -87
  285. package/src/Init/MutationTransaction.ts +0 -747
  286. package/src/Init/Service.ts +0 -385
  287. package/src/Init/StandardAdapters.ts +0 -141
  288. package/src/Init/Status.ts +0 -253
  289. package/src/Install/Claude/Hook.ts +0 -123
  290. package/src/Install/Claude/Mcp.ts +0 -129
  291. package/src/Install/Claude/Skill.ts +0 -77
  292. package/src/Install/Codex/Mcp.ts +0 -114
  293. package/src/Install/Codex/Skill.ts +0 -44
  294. package/src/Install/Cursor/Mcp.ts +0 -85
  295. package/src/Install/Cursor/Skill.ts +0 -51
  296. package/src/Install/Domain.ts +0 -221
  297. package/src/Install/Hook.ts +0 -50
  298. package/src/Install/Mcp.ts +0 -71
  299. package/src/Install/Opencode/Hook.ts +0 -55
  300. package/src/Install/Opencode/Mcp.ts +0 -87
  301. package/src/Install/Opencode/Skill.ts +0 -48
  302. package/src/Install/Opencode/expandai-webfetch.d.ts +0 -23
  303. package/src/Install/Opencode/expandai-webfetch.js +0 -56
  304. package/src/Install/Skill.ts +0 -57
  305. package/src/Install/Uninstall.ts +0 -82
  306. package/src/MarkdownAnsi.ts +0 -162
  307. package/src/Mcp/ExpandDocs.ts +0 -62
  308. package/src/Mcp/RequestHeaders.ts +0 -16
  309. package/src/Mcp/Server.ts +0 -15
  310. package/src/Mcp/Toolkit.ts +0 -21
  311. package/src/Mcp/tools/Citations.ts +0 -219
  312. package/src/Mcp/tools/Fetch.ts +0 -203
  313. package/src/SecureFile.ts +0 -70
  314. package/src/Snippets.ts +0 -39
  315. package/src/Telemetry.ts +0 -186
  316. package/src/Version.ts +0 -3
  317. package/src/Xdg.ts +0 -18
  318. package/src/index.ts +0 -1
  319. package/src/main.ts +0 -305
@@ -1,77 +0,0 @@
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, type InitHarnesses } from './Domain.js'
6
-
7
- interface HarnessDetectionInput {
8
- readonly cwd?: string
9
- readonly environment?: Readonly<Record<string, string | undefined>>
10
- readonly hint?: typeof InitHarness.Type
11
- }
12
-
13
- const HARNESS_ORDER: InitHarnesses = ['claude-code', 'cursor', 'opencode', 'codex']
14
-
15
- function enabled(value: string | undefined): boolean {
16
- return value !== undefined && value !== '' && value !== '0' && value !== 'false'
17
- }
18
-
19
- function currentHarness(
20
- environment: Readonly<Record<string, string | undefined>>,
21
- ): Option.Option<typeof InitHarness.Type> {
22
- const explicit = Schema.decodeUnknownOption(InitHarness)(environment.EXPANDAI_HARNESS)
23
- if (Option.isSome(explicit)) return explicit
24
- if (enabled(environment.CLAUDECODE)) return Option.some('claude-code')
25
- if (environment.CURSOR_TRACE_ID !== undefined) return Option.some('cursor')
26
- if (environment.CODEX_RUN_ID !== undefined) return Option.some('codex')
27
- return Option.none()
28
- }
29
-
30
- export class HarnessDetector extends Effect.Service<HarnessDetector>()('@expandai/cli/Init/HarnessDetector', {
31
- dependencies: [NodeFileSystem.layer, NodePath.layer],
32
- effect: Effect.gen(function* () {
33
- const fileSystem = yield* FileSystem.FileSystem
34
- const path = yield* Path.Path
35
-
36
- const detect = Effect.fn('HarnessDetector.detect')(function* (input: HarnessDetectionInput = {}) {
37
- const environment = input.environment ?? process.env
38
- const cwd = input.cwd ?? environment.PWD ?? process.cwd()
39
- const home = environment.HOME ?? homedir()
40
- const candidates = new Map<typeof InitHarness.Type, string[]>([
41
- ['claude-code', [path.join(home, '.claude'), path.join(cwd, '.claude')]],
42
- ['cursor', [path.join(home, '.cursor'), path.join(cwd, '.cursor')]],
43
- [
44
- 'opencode',
45
- [path.join(home, '.config', 'opencode'), path.join(cwd, '.opencode'), path.join(cwd, 'opencode.json')],
46
- ],
47
- ['codex', [path.join(home, '.codex'), path.join(cwd, '.codex')]],
48
- ])
49
- const detected = new Set<typeof InitHarness.Type>()
50
- const current = currentHarness(environment)
51
- if (Option.isSome(current)) detected.add(current.value)
52
- if (input.hint !== undefined) detected.add(input.hint)
53
- // Collect, then filter. The previous version mutated `detected` from inside
54
- // a `tap` under unbounded concurrency — safe on one thread, but it read as
55
- // a race and expressed "keep the ones that exist" as a side effect.
56
- const present = yield* Effect.forEach(
57
- HARNESS_ORDER,
58
- (harness) =>
59
- Effect.exists(candidates.get(harness) ?? [], (candidate) =>
60
- fileSystem.exists(candidate).pipe(Effect.orElseSucceed(() => false)),
61
- ).pipe(Effect.map((exists) => ({ harness, exists }))),
62
- { concurrency: 'unbounded' },
63
- )
64
- for (const { harness, exists } of present) if (exists) detected.add(harness)
65
- return HARNESS_ORDER.filter((harness) => detected.has(harness))
66
- })
67
-
68
- /** The harness this process is running inside, when it announces itself. */
69
- const detectCurrent = Effect.fnUntraced(function* (input: Pick<HarnessDetectionInput, 'environment'> = {}) {
70
- // Reads ambient `process.env` when no environment is supplied, so it stays
71
- // an Effect — but it does no work worth a span.
72
- return currentHarness(input.environment ?? process.env)
73
- })
74
-
75
- return { detect, detectCurrent } as const
76
- }),
77
- }) {}
@@ -1,87 +0,0 @@
1
- import { Effect, Schema } from 'effect'
2
- import { ClaudeAdapter } from './ClaudeAdapter.js'
3
- import type { InitHarness, InitScope } from './Domain.js'
4
- import type { HarnessConfigurationError, HarnessInspection, HarnessInspectionError } from './HarnessAdapter.js'
5
- import { CodexAdapter, CursorAdapter, OpencodeAdapter } from './StandardAdapters.js'
6
-
7
- export interface HarnessAdapterContract {
8
- readonly harness: InitHarness
9
- readonly inspect: (scope: InitScope) => Effect.Effect<HarnessInspection, HarnessInspectionError>
10
- readonly configure: (scope: InitScope) => Effect.Effect<HarnessInspection, HarnessConfigurationError>
11
- }
12
-
13
- interface HarnessRegistryContract {
14
- readonly inspect: (
15
- harness: InitHarness,
16
- scope: InitScope,
17
- ) => Effect.Effect<HarnessInspection, UnsupportedInitHarnessError | HarnessInspectionError>
18
- readonly configure: (
19
- harness: InitHarness,
20
- scope: InitScope,
21
- ) => Effect.Effect<HarnessInspection, UnsupportedInitHarnessError | HarnessConfigurationError>
22
- }
23
-
24
- export class UnsupportedInitHarnessError extends Schema.TaggedError<UnsupportedInitHarnessError>()(
25
- 'UnsupportedInitHarnessError',
26
- {
27
- harness: Schema.String,
28
- },
29
- ) {
30
- get message() {
31
- return `No init adapter is registered for ${this.harness}`
32
- }
33
- }
34
-
35
- function makeRegistry(adapters: ReadonlyArray<HarnessAdapterContract>): HarnessRegistryContract {
36
- const adaptersByHarness = new Map(adapters.map((adapter) => [adapter.harness, adapter]))
37
-
38
- const find = Effect.fn('HarnessRegistry.find')(function* (harness: InitHarness) {
39
- const adapter = adaptersByHarness.get(harness)
40
- if (adapter === undefined) {
41
- return yield* new UnsupportedInitHarnessError({ harness })
42
- }
43
- return adapter
44
- })
45
-
46
- const inspect = Effect.fn('HarnessRegistry.inspect')(function* (harness: InitHarness, scope: InitScope) {
47
- const adapter = yield* find(harness)
48
- return yield* adapter.inspect(scope)
49
- })
50
-
51
- const configure = Effect.fn('HarnessRegistry.configure')(function* (harness: InitHarness, scope: InitScope) {
52
- const adapter = yield* find(harness)
53
- return yield* adapter.configure(scope)
54
- })
55
-
56
- return { inspect, configure }
57
- }
58
-
59
- /**
60
- * `Default` is the **real** registry, wired to the four adapters.
61
- *
62
- * It used to be `sync: () => makeRegistry([])` — an empty registry that reported
63
- * every harness as unsupported. Nothing consumed it, because `main.ts` and the
64
- * tests both built `DefaultWithoutDependencies` with a registry supplied by
65
- * hand; but `InitService` and `StatusService` still *declared* it in their
66
- * `dependencies`, so the declaration was decorative and would have silently
67
- * produced an empty registry for anyone who reached for the obvious layer.
68
- * `Effect.Service` always generates `Default`, so the fix is to make it correct
69
- * rather than to remove it.
70
- */
71
- export class HarnessRegistry extends Effect.Service<HarnessRegistry>()('@expandai/cli/Init/HarnessRegistry', {
72
- dependencies: [ClaudeAdapter.Default, CursorAdapter.Default, OpencodeAdapter.Default, CodexAdapter.Default],
73
- effect: Effect.gen(function* () {
74
- const adapters = yield* Effect.all([ClaudeAdapter, CursorAdapter, OpencodeAdapter, CodexAdapter])
75
- return makeRegistry(adapters)
76
- }),
77
- }) {
78
- /**
79
- * The adapters are statically known at the composition root, so the contract
80
- * is enforced by the type. The previous version took `ReadonlyArray<object>`
81
- * and proved membership at runtime by walking prototypes and calling
82
- * `Context.isTag` on the constructor — reflection standing in for a type, plus
83
- * an error channel for a condition the compiler already rules out.
84
- */
85
- static readonly fromAdapters = (adapters: ReadonlyArray<HarnessAdapterContract>) =>
86
- HarnessRegistry.make(makeRegistry(adapters))
87
- }