expandai 0.0.4 → 0.0.6

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 (321) hide show
  1. package/README.md +2 -2
  2. package/build/{esm/Install/Opencode → assets/opencode}/expandai-webfetch.js +22 -4
  3. package/build/dts/Mcp/RequestHeaders.d.ts +0 -1
  4. package/build/dts/Mcp/Server.d.ts +1 -2
  5. package/build/dts/index.d.ts +0 -1
  6. package/build/esm/index.js +193 -2
  7. package/build/esm/main.js +691 -200
  8. package/build/skills/expandai/SKILL.md +100 -8
  9. package/package.json +20 -12
  10. package/build/dts/ApiClient.d.ts +0 -165
  11. package/build/dts/ApiClient.d.ts.map +0 -1
  12. package/build/dts/Auth/Domain.d.ts +0 -95
  13. package/build/dts/Auth/Domain.d.ts.map +0 -1
  14. package/build/dts/Auth/ManualAuthorization.d.ts +0 -107
  15. package/build/dts/Auth/ManualAuthorization.d.ts.map +0 -1
  16. package/build/dts/Auth/PendingInit.d.ts +0 -35
  17. package/build/dts/Auth/PendingInit.d.ts.map +0 -1
  18. package/build/dts/Auth/Pkce.d.ts +0 -10
  19. package/build/dts/Auth/Pkce.d.ts.map +0 -1
  20. package/build/dts/Auth/SetupGrantAuthorization.d.ts +0 -34
  21. package/build/dts/Auth/SetupGrantAuthorization.d.ts.map +0 -1
  22. package/build/dts/Authentication.d.ts +0 -24
  23. package/build/dts/Authentication.d.ts.map +0 -1
  24. package/build/dts/BrowserOAuth.d.ts +0 -99
  25. package/build/dts/BrowserOAuth.d.ts.map +0 -1
  26. package/build/dts/CommandPath.d.ts +0 -2
  27. package/build/dts/CommandPath.d.ts.map +0 -1
  28. package/build/dts/Commands/Fetch.d.ts +0 -30
  29. package/build/dts/Commands/Fetch.d.ts.map +0 -1
  30. package/build/dts/Commands/Hook.d.ts +0 -17
  31. package/build/dts/Commands/Hook.d.ts.map +0 -1
  32. package/build/dts/Commands/Init.d.ts +0 -55
  33. package/build/dts/Commands/Init.d.ts.map +0 -1
  34. package/build/dts/Commands/Mcp.d.ts +0 -11
  35. package/build/dts/Commands/Mcp.d.ts.map +0 -1
  36. package/build/dts/Commands/McpRun.d.ts +0 -5
  37. package/build/dts/Commands/McpRun.d.ts.map +0 -1
  38. package/build/dts/Commands/Search.d.ts +0 -21
  39. package/build/dts/Commands/Search.d.ts.map +0 -1
  40. package/build/dts/Commands/Skill.d.ts +0 -12
  41. package/build/dts/Commands/Skill.d.ts.map +0 -1
  42. package/build/dts/Commands/Status.d.ts +0 -27
  43. package/build/dts/Commands/Status.d.ts.map +0 -1
  44. package/build/dts/Commands/Telemetry.d.ts +0 -7
  45. package/build/dts/Commands/Telemetry.d.ts.map +0 -1
  46. package/build/dts/Commands/Uninstall.d.ts +0 -9
  47. package/build/dts/Commands/Uninstall.d.ts.map +0 -1
  48. package/build/dts/Config.d.ts +0 -196
  49. package/build/dts/Config.d.ts.map +0 -1
  50. package/build/dts/Hook/Claude.d.ts +0 -13
  51. package/build/dts/Hook/Claude.d.ts.map +0 -1
  52. package/build/dts/Hook/Errors.d.ts +0 -20
  53. package/build/dts/Hook/Errors.d.ts.map +0 -1
  54. package/build/dts/Hook/Opencode.d.ts +0 -13
  55. package/build/dts/Hook/Opencode.d.ts.map +0 -1
  56. package/build/dts/Hook/SnapshotNote.d.ts +0 -12
  57. package/build/dts/Hook/SnapshotNote.d.ts.map +0 -1
  58. package/build/dts/Init/ClaudeAdapter.d.ts +0 -61
  59. package/build/dts/Init/ClaudeAdapter.d.ts.map +0 -1
  60. package/build/dts/Init/ClaudeProfile.d.ts +0 -77
  61. package/build/dts/Init/ClaudeProfile.d.ts.map +0 -1
  62. package/build/dts/Init/Domain.d.ts +0 -139
  63. package/build/dts/Init/Domain.d.ts.map +0 -1
  64. package/build/dts/Init/HarnessAdapter.d.ts +0 -33
  65. package/build/dts/Init/HarnessAdapter.d.ts.map +0 -1
  66. package/build/dts/Init/HarnessDetector.d.ts +0 -19
  67. package/build/dts/Init/HarnessDetector.d.ts.map +0 -1
  68. package/build/dts/Init/HarnessRegistry.d.ts +0 -50
  69. package/build/dts/Init/HarnessRegistry.d.ts.map +0 -1
  70. package/build/dts/Init/MutationTransaction.d.ts +0 -96
  71. package/build/dts/Init/MutationTransaction.d.ts.map +0 -1
  72. package/build/dts/Init/Service.d.ts +0 -72
  73. package/build/dts/Init/Service.d.ts.map +0 -1
  74. package/build/dts/Init/StandardAdapters.d.ts +0 -42
  75. package/build/dts/Init/StandardAdapters.d.ts.map +0 -1
  76. package/build/dts/Init/Status.d.ts +0 -149
  77. package/build/dts/Init/Status.d.ts.map +0 -1
  78. package/build/dts/Install/Claude/Hook.d.ts +0 -88
  79. package/build/dts/Install/Claude/Hook.d.ts.map +0 -1
  80. package/build/dts/Install/Claude/Mcp.d.ts +0 -48
  81. package/build/dts/Install/Claude/Mcp.d.ts.map +0 -1
  82. package/build/dts/Install/Claude/Skill.d.ts +0 -23
  83. package/build/dts/Install/Claude/Skill.d.ts.map +0 -1
  84. package/build/dts/Install/Codex/Mcp.d.ts +0 -45
  85. package/build/dts/Install/Codex/Mcp.d.ts.map +0 -1
  86. package/build/dts/Install/Codex/Skill.d.ts +0 -22
  87. package/build/dts/Install/Codex/Skill.d.ts.map +0 -1
  88. package/build/dts/Install/Cursor/Mcp.d.ts +0 -45
  89. package/build/dts/Install/Cursor/Mcp.d.ts.map +0 -1
  90. package/build/dts/Install/Cursor/Skill.d.ts +0 -29
  91. package/build/dts/Install/Cursor/Skill.d.ts.map +0 -1
  92. package/build/dts/Install/Domain.d.ts +0 -103
  93. package/build/dts/Install/Domain.d.ts.map +0 -1
  94. package/build/dts/Install/Hook.d.ts +0 -30
  95. package/build/dts/Install/Hook.d.ts.map +0 -1
  96. package/build/dts/Install/Mcp.d.ts +0 -28
  97. package/build/dts/Install/Mcp.d.ts.map +0 -1
  98. package/build/dts/Install/Opencode/Hook.d.ts +0 -24
  99. package/build/dts/Install/Opencode/Hook.d.ts.map +0 -1
  100. package/build/dts/Install/Opencode/Mcp.d.ts +0 -47
  101. package/build/dts/Install/Opencode/Mcp.d.ts.map +0 -1
  102. package/build/dts/Install/Opencode/Skill.d.ts +0 -26
  103. package/build/dts/Install/Opencode/Skill.d.ts.map +0 -1
  104. package/build/dts/Install/Skill.d.ts +0 -32
  105. package/build/dts/Install/Skill.d.ts.map +0 -1
  106. package/build/dts/Install/Uninstall.d.ts +0 -32
  107. package/build/dts/Install/Uninstall.d.ts.map +0 -1
  108. package/build/dts/MarkdownAnsi.d.ts +0 -29
  109. package/build/dts/MarkdownAnsi.d.ts.map +0 -1
  110. package/build/dts/Mcp/ExpandDocs.d.ts +0 -19
  111. package/build/dts/Mcp/ExpandDocs.d.ts.map +0 -1
  112. package/build/dts/Mcp/RequestHeaders.d.ts.map +0 -1
  113. package/build/dts/Mcp/Server.d.ts.map +0 -1
  114. package/build/dts/Mcp/Toolkit.d.ts +0 -3
  115. package/build/dts/Mcp/Toolkit.d.ts.map +0 -1
  116. package/build/dts/Mcp/tools/Citations.d.ts +0 -266
  117. package/build/dts/Mcp/tools/Citations.d.ts.map +0 -1
  118. package/build/dts/Mcp/tools/Fetch.d.ts +0 -168
  119. package/build/dts/Mcp/tools/Fetch.d.ts.map +0 -1
  120. package/build/dts/SecureFile.d.ts +0 -23
  121. package/build/dts/SecureFile.d.ts.map +0 -1
  122. package/build/dts/Snippets.d.ts +0 -18
  123. package/build/dts/Snippets.d.ts.map +0 -1
  124. package/build/dts/Telemetry.d.ts +0 -30
  125. package/build/dts/Telemetry.d.ts.map +0 -1
  126. package/build/dts/Version.d.ts +0 -2
  127. package/build/dts/Version.d.ts.map +0 -1
  128. package/build/dts/Xdg.d.ts +0 -11
  129. package/build/dts/Xdg.d.ts.map +0 -1
  130. package/build/dts/index.d.ts.map +0 -1
  131. package/build/dts/main.d.ts +0 -3
  132. package/build/dts/main.d.ts.map +0 -1
  133. package/build/esm/ApiClient.js +0 -305
  134. package/build/esm/ApiClient.js.map +0 -1
  135. package/build/esm/Auth/Domain.js +0 -56
  136. package/build/esm/Auth/Domain.js.map +0 -1
  137. package/build/esm/Auth/ManualAuthorization.js +0 -253
  138. package/build/esm/Auth/ManualAuthorization.js.map +0 -1
  139. package/build/esm/Auth/PendingInit.js +0 -267
  140. package/build/esm/Auth/PendingInit.js.map +0 -1
  141. package/build/esm/Auth/Pkce.js +0 -23
  142. package/build/esm/Auth/Pkce.js.map +0 -1
  143. package/build/esm/Auth/SetupGrantAuthorization.js +0 -91
  144. package/build/esm/Auth/SetupGrantAuthorization.js.map +0 -1
  145. package/build/esm/Authentication.js +0 -143
  146. package/build/esm/Authentication.js.map +0 -1
  147. package/build/esm/BrowserOAuth.js +0 -251
  148. package/build/esm/BrowserOAuth.js.map +0 -1
  149. package/build/esm/CommandPath.js +0 -31
  150. package/build/esm/CommandPath.js.map +0 -1
  151. package/build/esm/Commands/Fetch.js +0 -119
  152. package/build/esm/Commands/Fetch.js.map +0 -1
  153. package/build/esm/Commands/Hook.js +0 -20
  154. package/build/esm/Commands/Hook.js.map +0 -1
  155. package/build/esm/Commands/Init.js +0 -371
  156. package/build/esm/Commands/Init.js.map +0 -1
  157. package/build/esm/Commands/Mcp.js +0 -19
  158. package/build/esm/Commands/Mcp.js.map +0 -1
  159. package/build/esm/Commands/McpRun.js +0 -15
  160. package/build/esm/Commands/McpRun.js.map +0 -1
  161. package/build/esm/Commands/Search.js +0 -46
  162. package/build/esm/Commands/Search.js.map +0 -1
  163. package/build/esm/Commands/Skill.js +0 -17
  164. package/build/esm/Commands/Skill.js.map +0 -1
  165. package/build/esm/Commands/Status.js +0 -186
  166. package/build/esm/Commands/Status.js.map +0 -1
  167. package/build/esm/Commands/Telemetry.js +0 -23
  168. package/build/esm/Commands/Telemetry.js.map +0 -1
  169. package/build/esm/Commands/Uninstall.js +0 -28
  170. package/build/esm/Commands/Uninstall.js.map +0 -1
  171. package/build/esm/Config.js +0 -619
  172. package/build/esm/Config.js.map +0 -1
  173. package/build/esm/Hook/Claude.js +0 -74
  174. package/build/esm/Hook/Claude.js.map +0 -1
  175. package/build/esm/Hook/Errors.js +0 -18
  176. package/build/esm/Hook/Errors.js.map +0 -1
  177. package/build/esm/Hook/Opencode.js +0 -50
  178. package/build/esm/Hook/Opencode.js.map +0 -1
  179. package/build/esm/Hook/SnapshotNote.js +0 -65
  180. package/build/esm/Hook/SnapshotNote.js.map +0 -1
  181. package/build/esm/Init/ClaudeAdapter.js +0 -137
  182. package/build/esm/Init/ClaudeAdapter.js.map +0 -1
  183. package/build/esm/Init/ClaudeProfile.js +0 -344
  184. package/build/esm/Init/ClaudeProfile.js.map +0 -1
  185. package/build/esm/Init/Domain.js +0 -118
  186. package/build/esm/Init/Domain.js.map +0 -1
  187. package/build/esm/Init/HarnessAdapter.js +0 -21
  188. package/build/esm/Init/HarnessAdapter.js.map +0 -1
  189. package/build/esm/Init/HarnessDetector.js +0 -65
  190. package/build/esm/Init/HarnessDetector.js.map +0 -1
  191. package/build/esm/Init/HarnessRegistry.js +0 -58
  192. package/build/esm/Init/HarnessRegistry.js.map +0 -1
  193. package/build/esm/Init/MutationTransaction.js +0 -494
  194. package/build/esm/Init/MutationTransaction.js.map +0 -1
  195. package/build/esm/Init/Service.js +0 -319
  196. package/build/esm/Init/Service.js.map +0 -1
  197. package/build/esm/Init/StandardAdapters.js +0 -116
  198. package/build/esm/Init/StandardAdapters.js.map +0 -1
  199. package/build/esm/Init/Status.js +0 -215
  200. package/build/esm/Init/Status.js.map +0 -1
  201. package/build/esm/Install/Claude/Hook.js +0 -77
  202. package/build/esm/Install/Claude/Hook.js.map +0 -1
  203. package/build/esm/Install/Claude/Mcp.js +0 -101
  204. package/build/esm/Install/Claude/Mcp.js.map +0 -1
  205. package/build/esm/Install/Claude/Skill.js +0 -56
  206. package/build/esm/Install/Claude/Skill.js.map +0 -1
  207. package/build/esm/Install/Codex/Mcp.js +0 -97
  208. package/build/esm/Install/Codex/Mcp.js.map +0 -1
  209. package/build/esm/Install/Codex/Skill.js +0 -33
  210. package/build/esm/Install/Codex/Skill.js.map +0 -1
  211. package/build/esm/Install/Cursor/Mcp.js +0 -74
  212. package/build/esm/Install/Cursor/Mcp.js.map +0 -1
  213. package/build/esm/Install/Cursor/Skill.js +0 -40
  214. package/build/esm/Install/Cursor/Skill.js.map +0 -1
  215. package/build/esm/Install/Domain.js +0 -162
  216. package/build/esm/Install/Domain.js.map +0 -1
  217. package/build/esm/Install/Hook.js +0 -38
  218. package/build/esm/Install/Hook.js.map +0 -1
  219. package/build/esm/Install/Mcp.js +0 -40
  220. package/build/esm/Install/Mcp.js.map +0 -1
  221. package/build/esm/Install/Opencode/Hook.js +0 -44
  222. package/build/esm/Install/Opencode/Hook.js.map +0 -1
  223. package/build/esm/Install/Opencode/Mcp.js +0 -76
  224. package/build/esm/Install/Opencode/Mcp.js.map +0 -1
  225. package/build/esm/Install/Opencode/Skill.js +0 -37
  226. package/build/esm/Install/Opencode/Skill.js.map +0 -1
  227. package/build/esm/Install/Skill.js +0 -41
  228. package/build/esm/Install/Skill.js.map +0 -1
  229. package/build/esm/Install/Uninstall.js +0 -49
  230. package/build/esm/Install/Uninstall.js.map +0 -1
  231. package/build/esm/MarkdownAnsi.js +0 -142
  232. package/build/esm/MarkdownAnsi.js.map +0 -1
  233. package/build/esm/Mcp/ExpandDocs.js +0 -56
  234. package/build/esm/Mcp/ExpandDocs.js.map +0 -1
  235. package/build/esm/Mcp/RequestHeaders.js +0 -13
  236. package/build/esm/Mcp/RequestHeaders.js.map +0 -1
  237. package/build/esm/Mcp/Server.js +0 -12
  238. package/build/esm/Mcp/Server.js.map +0 -1
  239. package/build/esm/Mcp/Toolkit.js +0 -16
  240. package/build/esm/Mcp/Toolkit.js.map +0 -1
  241. package/build/esm/Mcp/tools/Citations.js +0 -193
  242. package/build/esm/Mcp/tools/Citations.js.map +0 -1
  243. package/build/esm/Mcp/tools/Fetch.js +0 -165
  244. package/build/esm/Mcp/tools/Fetch.js.map +0 -1
  245. package/build/esm/SecureFile.js +0 -36
  246. package/build/esm/SecureFile.js.map +0 -1
  247. package/build/esm/Snippets.js +0 -29
  248. package/build/esm/Snippets.js.map +0 -1
  249. package/build/esm/Telemetry.js +0 -157
  250. package/build/esm/Telemetry.js.map +0 -1
  251. package/build/esm/Version.js +0 -4
  252. package/build/esm/Version.js.map +0 -1
  253. package/build/esm/Xdg.js +0 -15
  254. package/build/esm/Xdg.js.map +0 -1
  255. package/build/esm/index.js.map +0 -1
  256. package/build/esm/main.js.map +0 -1
  257. package/src/ApiClient.ts +0 -450
  258. package/src/Auth/Domain.ts +0 -63
  259. package/src/Auth/ManualAuthorization.ts +0 -296
  260. package/src/Auth/PendingInit.ts +0 -338
  261. package/src/Auth/Pkce.ts +0 -26
  262. package/src/Auth/SetupGrantAuthorization.ts +0 -116
  263. package/src/Authentication.ts +0 -202
  264. package/src/BrowserOAuth.ts +0 -359
  265. package/src/CommandPath.ts +0 -30
  266. package/src/Commands/Fetch.ts +0 -188
  267. package/src/Commands/Hook.ts +0 -48
  268. package/src/Commands/Init.ts +0 -489
  269. package/src/Commands/Mcp.ts +0 -30
  270. package/src/Commands/McpRun.ts +0 -25
  271. package/src/Commands/Search.ts +0 -97
  272. package/src/Commands/Skill.ts +0 -30
  273. package/src/Commands/Status.ts +0 -228
  274. package/src/Commands/Telemetry.ts +0 -42
  275. package/src/Commands/Uninstall.ts +0 -38
  276. package/src/Config.ts +0 -840
  277. package/src/Hook/Claude.ts +0 -81
  278. package/src/Hook/Errors.ts +0 -19
  279. package/src/Hook/Opencode.ts +0 -58
  280. package/src/Hook/SnapshotNote.ts +0 -66
  281. package/src/Init/ClaudeAdapter.ts +0 -191
  282. package/src/Init/ClaudeProfile.ts +0 -453
  283. package/src/Init/Domain.ts +0 -153
  284. package/src/Init/HarnessAdapter.ts +0 -35
  285. package/src/Init/HarnessDetector.ts +0 -77
  286. package/src/Init/HarnessRegistry.ts +0 -87
  287. package/src/Init/MutationTransaction.ts +0 -747
  288. package/src/Init/Service.ts +0 -385
  289. package/src/Init/StandardAdapters.ts +0 -141
  290. package/src/Init/Status.ts +0 -253
  291. package/src/Install/Claude/Hook.ts +0 -123
  292. package/src/Install/Claude/Mcp.ts +0 -129
  293. package/src/Install/Claude/Skill.ts +0 -77
  294. package/src/Install/Codex/Mcp.ts +0 -114
  295. package/src/Install/Codex/Skill.ts +0 -44
  296. package/src/Install/Cursor/Mcp.ts +0 -85
  297. package/src/Install/Cursor/Skill.ts +0 -51
  298. package/src/Install/Domain.ts +0 -221
  299. package/src/Install/Hook.ts +0 -50
  300. package/src/Install/Mcp.ts +0 -71
  301. package/src/Install/Opencode/Hook.ts +0 -55
  302. package/src/Install/Opencode/Mcp.ts +0 -87
  303. package/src/Install/Opencode/Skill.ts +0 -48
  304. package/src/Install/Opencode/expandai-webfetch.d.ts +0 -23
  305. package/src/Install/Opencode/expandai-webfetch.js +0 -56
  306. package/src/Install/Skill.ts +0 -57
  307. package/src/Install/Uninstall.ts +0 -82
  308. package/src/MarkdownAnsi.ts +0 -162
  309. package/src/Mcp/ExpandDocs.ts +0 -62
  310. package/src/Mcp/RequestHeaders.ts +0 -16
  311. package/src/Mcp/Server.ts +0 -15
  312. package/src/Mcp/Toolkit.ts +0 -21
  313. package/src/Mcp/tools/Citations.ts +0 -219
  314. package/src/Mcp/tools/Fetch.ts +0 -203
  315. package/src/SecureFile.ts +0 -70
  316. package/src/Snippets.ts +0 -39
  317. package/src/Telemetry.ts +0 -186
  318. package/src/Version.ts +0 -3
  319. package/src/Xdg.ts +0 -18
  320. package/src/index.ts +0 -1
  321. package/src/main.ts +0 -305
@@ -1,215 +0,0 @@
1
- import { DateTime, Effect, Option, Schema } from 'effect';
2
- import { CLI_AUTHORIZATION_CLIENT_ID, PendingInitCorrupt, } from '../Auth/Domain.js';
3
- import { PendingInitStore } from '../Auth/PendingInit.js';
4
- import { authMethodState } from '../Authentication.js';
5
- import { ConfigManager, ConfigParseError, CredentialStoreInsecure, NotAuthenticated } from '../Config.js';
6
- import { CLI_VERSION } from '../Version.js';
7
- import { CLAUDE_POLICY_READ_ONLY } from './ClaudeProfile.js';
8
- import { InitHarness, InitScope } from './Domain.js';
9
- import { HarnessRegistry } from './HarnessRegistry.js';
10
- const VERSION_PATTERN = /^[0-9]+\.[0-9]+\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/u;
11
- const BoundedVersion = Schema.String.pipe(Schema.minLength(1), Schema.maxLength(64), Schema.pattern(VERSION_PATTERN));
12
- export class StatusRequest extends Schema.Class('StatusRequest')({
13
- harness: InitHarness,
14
- scope: InitScope,
15
- }) {
16
- }
17
- const StatusAuth = Schema.Struct({
18
- // `healthy` means a call would authenticate right now. An expired access
19
- // token with a refresh token on disk reports `refresh_required`, because the
20
- // renewal has not happened and can fail.
21
- state: Schema.Literal('absent', 'unusable', 'refresh_required', 'healthy'),
22
- healthy: Schema.Boolean,
23
- });
24
- const PendingAuthorization = Schema.Union(Schema.Struct({ state: Schema.Literal('none'), count: Schema.Literal(0) }), Schema.Struct({
25
- state: Schema.Literal('approval_pending'),
26
- count: Schema.Literal(1),
27
- approvalExpiresAt: Schema.DateTimeUtc,
28
- }));
29
- const StatusInstallation = Schema.Struct({
30
- configured: Schema.Boolean,
31
- integrationVersion: Schema.optional(BoundedVersion),
32
- components: Schema.Struct({
33
- webfetchHook: Schema.Boolean,
34
- runtimeSkill: Schema.Boolean,
35
- mcp: Schema.Boolean,
36
- }),
37
- runtimeState: Schema.Literal('unverified', 'reload_required', 'blocked'),
38
- reloadState: Schema.Literal('not_required', 'required'),
39
- consentState: Schema.Literal('not_required', 'may_be_required'),
40
- policyState: Schema.Literal('unverified', 'blocked'),
41
- policyCodes: Schema.Array(Schema.Literal('managed_policy_blocked', 'target_read_only')).pipe(Schema.maxItems(1)),
42
- });
43
- export class StatusResult extends Schema.Class('StatusResult')({
44
- schemaVersion: Schema.Literal(1),
45
- status: Schema.Literal('ok'),
46
- harness: InitHarness,
47
- scope: InitScope,
48
- cli: Schema.Struct({ version: BoundedVersion }),
49
- auth: StatusAuth,
50
- pendingAuthorization: PendingAuthorization,
51
- installation: StatusInstallation,
52
- }) {
53
- }
54
- export const StatusServiceErrorCode = Schema.Literal('credential_config_malformed', 'credential_storage_insecure', 'credential_health_failed', 'pending_state_malformed', 'pending_state_unavailable', 'harness_inspection_failed', 'invalid_status_result');
55
- export class StatusServiceError extends Schema.TaggedError()('StatusServiceError', {
56
- code: StatusServiceErrorCode,
57
- recoverable: Schema.Boolean,
58
- }) {
59
- get message() {
60
- switch (this.code) {
61
- case 'credential_config_malformed':
62
- return 'Stored credential configuration is malformed.';
63
- case 'credential_storage_insecure':
64
- return 'Credential storage is not secure enough to inspect.';
65
- case 'credential_health_failed':
66
- return 'Stored credentials could not be inspected safely.';
67
- case 'pending_state_malformed':
68
- return 'Pending authorization state is malformed.';
69
- case 'pending_state_unavailable':
70
- return 'Pending authorization state could not be inspected safely.';
71
- case 'harness_inspection_failed':
72
- return 'The harness configuration could not be inspected safely.';
73
- case 'invalid_status_result':
74
- return 'Local diagnostics returned an invalid result.';
75
- }
76
- }
77
- }
78
- function statusError(code, recoverable) {
79
- return new StatusServiceError({ code, recoverable });
80
- }
81
- function mapCredentialError(error) {
82
- if (error instanceof ConfigParseError)
83
- return statusError('credential_config_malformed', false);
84
- if (error instanceof CredentialStoreInsecure)
85
- return statusError('credential_storage_insecure', false);
86
- return statusError('credential_health_failed', false);
87
- }
88
- function mapPendingError(error) {
89
- if (error instanceof CredentialStoreInsecure)
90
- return statusError('credential_storage_insecure', false);
91
- return error instanceof PendingInitCorrupt
92
- ? statusError('pending_state_malformed', true)
93
- : statusError('pending_state_unavailable', true);
94
- }
95
- function authStatus(configManager) {
96
- return Effect.gen(function* () {
97
- const loaded = yield* Effect.either(configManager.loadConfig());
98
- if (loaded._tag === 'Left') {
99
- if (loaded.left instanceof NotAuthenticated)
100
- return { state: 'absent', healthy: false };
101
- return yield* mapCredentialError(loaded.left);
102
- }
103
- const now = yield* DateTime.now;
104
- const state = authMethodState(loaded.right.authMethod, now);
105
- return { state, healthy: state === 'healthy' };
106
- });
107
- }
108
- function pendingStatus(record) {
109
- return Effect.gen(function* () {
110
- if (Option.isNone(record))
111
- return { state: 'none', count: 0 };
112
- const now = DateTime.toEpochMillis(yield* DateTime.now);
113
- if (DateTime.toEpochMillis(record.value.approvalExpiresAt) <= now) {
114
- return { state: 'none', count: 0 };
115
- }
116
- return {
117
- state: 'approval_pending',
118
- count: 1,
119
- approvalExpiresAt: DateTime.formatIso(record.value.approvalExpiresAt),
120
- };
121
- });
122
- }
123
- function validateInspection(harness, inspection) {
124
- const componentSet = new Set(inspection.components);
125
- // Only the harnesses with a web-fetch hook install three components; cursor
126
- // and codex are complete with two. Demanding three of them reported a
127
- // correctly configured machine as an invalid result.
128
- const expectsHook = harness === 'opencode';
129
- const allComponents = componentSet.has('runtime-skill') &&
130
- componentSet.has('mcp') &&
131
- (expectsHook ? componentSet.has('webfetch-hook') && componentSet.size === 3 : componentSet.size === 2);
132
- const versionValid = inspection.integrationVersion === undefined ||
133
- (inspection.integrationVersion.length <= 64 && VERSION_PATTERN.test(inspection.integrationVersion));
134
- const configuredValid = inspection.configured === allComponents;
135
- const runtimeValid = inspection.runtimeState !== 'observed';
136
- return componentSet.size === inspection.components.length && versionValid && configuredValid && runtimeValid
137
- ? Effect.succeed(inspection)
138
- : statusError('invalid_status_result', false);
139
- }
140
- function installationStatus(inspection, scope) {
141
- const components = new Set(inspection.components);
142
- const policyBlocked = inspection.policyBlock !== undefined || inspection.runtimeState === 'blocked';
143
- const policyCodes = inspection.policyBlock === CLAUDE_POLICY_READ_ONLY
144
- ? ['target_read_only']
145
- : policyBlocked
146
- ? ['managed_policy_blocked']
147
- : [];
148
- const reloadRequired = !policyBlocked && inspection.runtimeState === 'reload_required';
149
- return {
150
- configured: inspection.configured,
151
- ...(inspection.integrationVersion === undefined ? {} : { integrationVersion: inspection.integrationVersion }),
152
- components: {
153
- webfetchHook: components.has('webfetch-hook'),
154
- runtimeSkill: components.has('runtime-skill'),
155
- mcp: components.has('mcp'),
156
- },
157
- runtimeState: policyBlocked
158
- ? 'blocked'
159
- : reloadRequired
160
- ? 'reload_required'
161
- : 'unverified',
162
- reloadState: reloadRequired ? 'required' : 'not_required',
163
- consentState: scope === 'project' ? 'may_be_required' : 'not_required',
164
- policyState: policyBlocked ? 'blocked' : 'unverified',
165
- policyCodes,
166
- };
167
- }
168
- export class StatusService extends Effect.Service()('@expandai/cli/Init/StatusService', {
169
- dependencies: [ConfigManager.Default, PendingInitStore.Default, HarnessRegistry.Default],
170
- effect: Effect.gen(function* () {
171
- const configManager = yield* ConfigManager;
172
- const pendingStore = yield* PendingInitStore;
173
- const registry = yield* HarnessRegistry;
174
- const run = Effect.fn('StatusService.run')(function* (request) {
175
- yield* Effect.annotateCurrentSpan({ harness: request.harness, scope: request.scope });
176
- return yield* Effect.gen(function* () {
177
- yield* configManager
178
- .inspectSecureStorage()
179
- .pipe(Effect.withTracerEnabled(false), Effect.mapError(mapCredentialError));
180
- const auth = yield* authStatus(configManager).pipe(Effect.withTracerEnabled(false));
181
- const apiUrl = yield* configManager
182
- .getApiUrl()
183
- .pipe(Effect.withTracerEnabled(false), Effect.mapError(mapCredentialError));
184
- const canonicalScopeRoot = yield* pendingStore
185
- .canonicalScopeRoot(request.scope)
186
- .pipe(Effect.withTracerEnabled(false), Effect.mapError(mapPendingError));
187
- const key = {
188
- apiOrigin: apiUrl.origin,
189
- clientId: CLI_AUTHORIZATION_CLIENT_ID,
190
- harness: 'agent-harnesses',
191
- scope: request.scope,
192
- canonicalScopeRoot,
193
- };
194
- const pending = yield* pendingStore
195
- .peek(key)
196
- .pipe(Effect.withTracerEnabled(false), Effect.mapError(mapPendingError));
197
- const inspection = yield* registry.inspect(request.harness, request.scope).pipe(Effect.withTracerEnabled(false), Effect.mapError(() => statusError('harness_inspection_failed', true)), Effect.flatMap((inspection) => validateInspection(request.harness, inspection)));
198
- const candidate = {
199
- schemaVersion: 1,
200
- status: 'ok',
201
- harness: request.harness,
202
- scope: request.scope,
203
- cli: { version: CLI_VERSION },
204
- auth,
205
- pendingAuthorization: yield* pendingStatus(pending),
206
- installation: installationStatus(inspection, request.scope),
207
- };
208
- return yield* Schema.decodeUnknown(StatusResult)(candidate).pipe(Effect.mapError(() => statusError('invalid_status_result', false)));
209
- });
210
- });
211
- return { run };
212
- }),
213
- }) {
214
- }
215
- //# sourceMappingURL=Status.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Status.js","sourceRoot":"","sources":["../../../src/Init/Status.ts"],"names":[],"mappings":"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"}
@@ -1,77 +0,0 @@
1
- import { homedir } from 'node:os';
2
- import { Config, Console, Effect, Match, Schema } from 'effect';
3
- import { ConfigIo, cliShellCommand, DIRECT_CLI } from '../Domain.js';
4
- /** Claude Code WebFetch hook invocation persisted in harness settings. */
5
- export const HOOK_INVOCATION = 'expandai hook claude-code';
6
- export const HOOK_COMMAND = HOOK_INVOCATION;
7
- const HOOK_ARGS = ['hook', 'claude-code'];
8
- /**
9
- * The hook line for a resolved CLI. Defaults to the bare `expandai` command;
10
- * when the CLI is not on PATH — an `npx expandai init` with no global install —
11
- * `CliInvocation` resolves to the npx form and the written hook stays runnable.
12
- */
13
- export function hookCommandFor(cli = DIRECT_CLI) {
14
- return cliShellCommand(cli, HOOK_ARGS);
15
- }
16
- export const WEBFETCH_MATCHER = 'WebFetch';
17
- export const HookCommandEntry = Schema.Struct({
18
- type: Schema.Literal('command'),
19
- command: Schema.String,
20
- expandaiProfileVersion: Schema.optional(Schema.String),
21
- /** Whether this install added the `WebFetch` deny rule — see `makeExpandaiMatcher`. */
22
- expandaiManagedDeny: Schema.optional(Schema.Boolean),
23
- }, Schema.Record({ key: Schema.String, value: Schema.Unknown }));
24
- export const HookMatcher = Schema.Struct({
25
- matcher: Schema.optional(Schema.String),
26
- hooks: Schema.Array(HookCommandEntry),
27
- }, Schema.Record({ key: Schema.String, value: Schema.Unknown }));
28
- const HooksSection = Schema.Struct({ PreToolUse: Schema.optional(Schema.Array(HookMatcher)) }, Schema.Record({ key: Schema.String, value: Schema.Unknown }));
29
- const PermissionsSection = Schema.Struct({ deny: Schema.optional(Schema.Array(Schema.String)) }, Schema.Record({ key: Schema.String, value: Schema.Unknown }));
30
- export const SettingsSchema = Schema.parseJson(Schema.Struct({
31
- hooks: Schema.optionalWith(HooksSection, { default: () => ({}) }),
32
- permissions: Schema.optional(PermissionsSection),
33
- }, Schema.Record({ key: Schema.String, value: Schema.Unknown })), { space: 2 });
34
- export function isExpandaiHookCommand(command) {
35
- const value = command.trim();
36
- const invocation = String.raw `expandai(?:\.exe)?\s+hook\s+(?:claude-code|claude)`;
37
- const direct = new RegExp(String.raw `^(?:npx\s+-y\s+)?${invocation}$`, 'u');
38
- const absolute = new RegExp(String.raw `^(?:"(?:[A-Za-z]:\\|/)[^"]*[\\/]expandai(?:\.exe)?"|'(?:[A-Za-z]:\\|/)[^']*[\\/]expandai(?:\.exe)?'|(?:[A-Za-z]:\\|/)[^\s]*[\\/]expandai(?:\.exe)?)\s+hook\s+(?:claude-code|claude)$`, 'u');
39
- const shellFallback = /^if\s+command\s+-v\s+expandai\s+>\/dev\/null\s+2>&1;\s*then\s+expandai\s+hook\s+(?:claude-code|claude);\s*else\s+npx\s+-y\s+expandai\s+hook\s+(?:claude-code|claude);\s*fi$/u;
40
- return direct.test(value) || absolute.test(value) || shellFallback.test(value);
41
- }
42
- /**
43
- * Nothing here writes to `settings.json`, and nothing here removes from it.
44
- *
45
- * A `WebFetch` deny entry is a bare string with nowhere to record who wrote it,
46
- * and our hook is not proof either: `hook install` used to write the hook on its
47
- * own, so a settings file carrying our hook and a `WebFetch` deny may well hold a
48
- * rule the user added afterwards. Removing it would revoke a restriction its
49
- * owner chose. Since Claude Code no longer gets a hook or a deny rule from us,
50
- * there is nothing of ours left to clean up, and guessing is the only thing a
51
- * cleanup pass could do.
52
- */
53
- export class ClaudeHook extends Effect.Service()('@expandai/cli/Install/Claude/Hook', {
54
- dependencies: [ConfigIo.Default],
55
- effect: Effect.gen(function* () {
56
- const home = yield* Config.string('HOME').pipe(Config.withDefault(homedir()));
57
- const cwd = yield* Config.string('PWD').pipe(Config.withDefault(process.cwd()));
58
- const pathFor = Effect.fn(function* (scope) {
59
- return yield* Match.value(scope).pipe(Match.when('global', () => Effect.succeed(`${home}/.claude/settings.json`)), Match.when('project', () => Effect.succeed(`${cwd}/.claude/settings.json`)), Match.exhaustive);
60
- });
61
- const NOTICE = 'expandai does not install a WebFetch hook for Claude Code — the MCP server and runtime skill replace it, and neither can disable a built-in tool.';
62
- /**
63
- * Kept as a no-op rather than deleted so `hook install|uninstall claude-code`
64
- * still resolves. Both say what the profile is instead of touching
65
- * `settings.json`, which expandai no longer writes for Claude Code.
66
- */
67
- const install = Effect.fn('ClaudeHook.install')(function* (_scope) {
68
- yield* Console.log(NOTICE);
69
- });
70
- const uninstall = Effect.fn('ClaudeHook.uninstall')(function* (_scope) {
71
- yield* Console.log(NOTICE);
72
- });
73
- return { install, uninstall, pathFor };
74
- }),
75
- }) {
76
- }
77
- //# sourceMappingURL=Hook.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Hook.js","sourceRoot":"","sources":["../../../../src/Install/Claude/Hook.ts"],"names":[],"mappings":"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"}
@@ -1,101 +0,0 @@
1
- import { homedir } from 'node:os';
2
- import { Config, Console, Effect, Match, Record, Schema } from 'effect';
3
- import { ConfigIo, DIRECT_CLI, McpParseError, McpServersConfigSchema, McpWriteError, SERVER_KEY, } from '../Domain.js';
4
- /** Claude Code MCP descriptor stored under the Expand-owned server key. */
5
- export class Entry extends Schema.Class('ClaudeMcpEntry')({
6
- type: Schema.Literal('stdio'),
7
- command: Schema.NonEmptyTrimmedString,
8
- args: Schema.Array(Schema.String),
9
- env: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.String })),
10
- }) {
11
- }
12
- const MCP_ARGS = ['mcp', 'run'];
13
- /** Claude execs the descriptor directly, so `command`/`args` stay separate. */
14
- export function claudeMcpEntry(cli = DIRECT_CLI) {
15
- return new Entry({
16
- type: 'stdio',
17
- command: cli.command,
18
- args: [...cli.args, ...MCP_ARGS],
19
- env: { EXPANDAI_HARNESS: 'claude-code' },
20
- });
21
- }
22
- export const CLAUDE_MCP_ENTRY = claudeMcpEntry();
23
- function isUnknownRecord(value) {
24
- return typeof value === 'object' && value !== null && !Array.isArray(value);
25
- }
26
- function isCurrentEntry(value, expected) {
27
- if (!isUnknownRecord(value))
28
- return false;
29
- const args = value.args;
30
- const env = value.env;
31
- return (value.type === expected.type &&
32
- value.command === expected.command &&
33
- Array.isArray(args) &&
34
- args.length === expected.args.length &&
35
- args.every((arg, index) => arg === expected.args[index]) &&
36
- isUnknownRecord(env) &&
37
- env.EXPANDAI_HARNESS === 'claude-code');
38
- }
39
- export function planClaudeMcp(config, cli = DIRECT_CLI) {
40
- const entry = claudeMcpEntry(cli);
41
- if (isCurrentEntry(config.mcpServers[SERVER_KEY], entry))
42
- return { changed: false, config };
43
- return {
44
- changed: true,
45
- config: {
46
- ...config,
47
- mcpServers: { ...config.mcpServers, [SERVER_KEY]: entry },
48
- },
49
- };
50
- }
51
- export function planClaudeMcpRemoval(config) {
52
- if (!(SERVER_KEY in config.mcpServers))
53
- return { changed: false, config };
54
- return {
55
- changed: true,
56
- config: { ...config, mcpServers: Record.remove(config.mcpServers, SERVER_KEY) },
57
- };
58
- }
59
- export class ClaudeMcp extends Effect.Service()('@expandai/cli/Install/Claude/Mcp', {
60
- dependencies: [ConfigIo.Default],
61
- effect: Effect.gen(function* () {
62
- const io = yield* ConfigIo;
63
- const home = yield* Config.string('HOME').pipe(Config.withDefault(homedir()));
64
- const cwd = yield* Config.string('PWD').pipe(Config.withDefault(process.cwd()));
65
- const pathFor = Effect.fn(function* (scope) {
66
- return yield* Match.value(scope).pipe(Match.when('global', () => Effect.succeed(`${home}/.claude.json`)), Match.when('project', () => Effect.succeed(`${cwd}/.mcp.json`)), Match.exhaustive);
67
- });
68
- const readConfig = Effect.fn(function* (file) {
69
- return yield* io
70
- .read(file, McpServersConfigSchema)
71
- .pipe(Effect.mapError((error) => new McpParseError({ path: file, error })));
72
- });
73
- const writeConfig = Effect.fn(function* (file, value) {
74
- yield* io
75
- .write(file, value, McpServersConfigSchema)
76
- .pipe(Effect.mapError((error) => new McpWriteError({ path: file, error })));
77
- });
78
- const install = Effect.fn(function* (scope) {
79
- const file = yield* pathFor(scope);
80
- const plan = planClaudeMcp(yield* readConfig(file));
81
- if (plan.changed)
82
- yield* writeConfig(file, plan.config);
83
- yield* Console.log(`Installed expandai MCP server into ${file}`);
84
- });
85
- const uninstall = Effect.fn(function* (scope) {
86
- const file = yield* pathFor(scope);
87
- const plan = planClaudeMcpRemoval(yield* readConfig(file));
88
- if (!plan.changed)
89
- return;
90
- yield* writeConfig(file, plan.config);
91
- yield* Console.log(`Removed expandai MCP server from ${file}`);
92
- });
93
- const isInstalled = Effect.fn(function* (scope) {
94
- const file = yield* pathFor(scope);
95
- return SERVER_KEY in (yield* readConfig(file)).mcpServers;
96
- });
97
- return { install, uninstall, isInstalled, pathFor };
98
- }),
99
- }) {
100
- }
101
- //# sourceMappingURL=Mcp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Mcp.js","sourceRoot":"","sources":["../../../../src/Install/Claude/Mcp.ts"],"names":[],"mappings":"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"}
@@ -1,56 +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 { Config, Effect, Match } from 'effect';
5
- import { CLI_VERSION } from '../../Version.js';
6
- export const SKILL_NAME = 'expandai';
7
- export const SKILL_FILE_NAME = 'SKILL.md';
8
- const PROFILE_VERSION_LINE = /^(\s*expandai-profile-version:\s*).+$/mu;
9
- export function renderClaudeSkill(source, profileVersion = CLI_VERSION) {
10
- if (!PROFILE_VERSION_LINE.test(source)) {
11
- throw new Error('Bundled Expand skill is missing expandai-profile-version metadata');
12
- }
13
- return source.replace(PROFILE_VERSION_LINE, `$1${profileVersion}`);
14
- }
15
- export function planClaudeSkill(current, source, profileVersion = CLI_VERSION) {
16
- const text = renderClaudeSkill(source, profileVersion);
17
- return { changed: current !== text, text };
18
- }
19
- const makeClaudeSkill = Effect.gen(function* () {
20
- const fileSystem = yield* FileSystem.FileSystem;
21
- const path = yield* Path.Path;
22
- const home = yield* Config.string('HOME').pipe(Config.withDefault(homedir()));
23
- const cwd = yield* Config.string('PWD').pipe(Config.withDefault(process.cwd()));
24
- const moduleFile = yield* path.fromFileUrl(new URL(import.meta.url));
25
- const sourceFile = path.resolve(path.dirname(moduleFile), '..', '..', '..', 'skills', SKILL_NAME, SKILL_FILE_NAME);
26
- const pathFor = Effect.fn(function* (scope) {
27
- return yield* Match.value(scope).pipe(Match.when('global', () => Effect.succeed(path.join(home, '.claude', 'skills', SKILL_NAME))), Match.when('project', () => Effect.succeed(path.join(cwd, '.claude', 'skills', SKILL_NAME))), Match.exhaustive);
28
- });
29
- const source = Effect.fn('ClaudeSkill.source')(function* () {
30
- return yield* fileSystem.readFileString(sourceFile);
31
- });
32
- const install = Effect.fn('ClaudeSkill.install')(function* (scope) {
33
- const target = yield* pathFor(scope);
34
- const targetFile = path.join(target, SKILL_FILE_NAME);
35
- const current = (yield* fileSystem.exists(targetFile)) ? yield* fileSystem.readFileString(targetFile) : undefined;
36
- const plan = planClaudeSkill(current, yield* source());
37
- if (plan.changed) {
38
- yield* fileSystem.makeDirectory(target, { recursive: true });
39
- yield* fileSystem.writeFileString(targetFile, plan.text);
40
- }
41
- return target;
42
- });
43
- const uninstall = Effect.fn('ClaudeSkill.uninstall')(function* (scope) {
44
- const target = yield* pathFor(scope);
45
- if (yield* fileSystem.exists(target))
46
- yield* fileSystem.remove(target, { recursive: true });
47
- return target;
48
- });
49
- return { install, uninstall, pathFor, source };
50
- });
51
- export class ClaudeSkill extends Effect.Service()('@expandai/cli/Install/Claude/Skill', {
52
- dependencies: [NodeFileSystem.layer, NodePath.layer],
53
- effect: makeClaudeSkill,
54
- }) {
55
- }
56
- //# sourceMappingURL=Skill.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Skill.js","sourceRoot":"","sources":["../../../../src/Install/Claude/Skill.ts"],"names":[],"mappings":"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"}
@@ -1,97 +0,0 @@
1
- import { homedir } from 'node:os';
2
- import { Config, Console, Effect, Match, Record, Schema } from 'effect';
3
- import { parse, stringify } from 'smol-toml';
4
- import { CliInvocation, ConfigIo, McpParseError, McpWriteError, SERVER_KEY } from '../Domain.js';
5
- export class Entry extends Schema.Class('CodexMcpEntry')({
6
- command: Schema.NonEmptyTrimmedString,
7
- args: Schema.Array(Schema.String),
8
- env: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.String })),
9
- enabled: Schema.Boolean,
10
- }) {
11
- }
12
- function isRecord(value) {
13
- return typeof value === 'object' && value !== null && !Array.isArray(value);
14
- }
15
- const getMcpServers = Effect.fn(function* (config) {
16
- const servers = config.mcp_servers;
17
- return isRecord(servers) ? servers : {};
18
- });
19
- function toStringifyValue(value) {
20
- // smol-toml's stringify type accepts any; keep the unsafe boundary local.
21
- return value;
22
- }
23
- /**
24
- * Codex MCP descriptor — Codex stores MCP servers in TOML config under
25
- * `[mcp_servers.<name>]`.
26
- *
27
- * - global → `~/.codex/config.toml`
28
- * - project → `<cwd>/.codex/config.toml`
29
- */
30
- export class CodexMcp extends Effect.Service()('@expandai/cli/Install/Codex/Mcp', {
31
- dependencies: [ConfigIo.Default, CliInvocation.Default],
32
- effect: Effect.gen(function* () {
33
- const io = yield* ConfigIo;
34
- const cli = yield* CliInvocation;
35
- const home = yield* Config.string('HOME').pipe(Config.withDefault(homedir()));
36
- const cwd = yield* Config.string('PWD').pipe(Config.withDefault(process.cwd()));
37
- const pathFor = Effect.fn(function* (scope) {
38
- return yield* Match.value(scope).pipe(Match.when('global', () => Effect.succeed(`${home}/.codex/config.toml`)), Match.when('project', () => Effect.succeed(`${cwd}/.codex/config.toml`)), Match.exhaustive);
39
- });
40
- const readConfig = Effect.fn(function* (file) {
41
- const text = yield* io.readText(file);
42
- return yield* Effect.try({
43
- try: () => parse(text, { integersAsBigInt: false }),
44
- catch: (error) => new McpParseError({ path: file, error }),
45
- });
46
- });
47
- const writeConfig = Effect.fn(function* (file, value) {
48
- const encoded = yield* Effect.try({
49
- try: () => stringify(toStringifyValue(value)),
50
- catch: (error) => new McpWriteError({ path: file, error }),
51
- });
52
- yield* io.writeText(file, encoded).pipe(Effect.mapError((error) => new McpWriteError({ path: file, error })));
53
- });
54
- const install = Effect.fn(function* (scope) {
55
- const file = yield* pathFor(scope);
56
- const config = yield* readConfig(file);
57
- const servers = yield* getMcpServers(config);
58
- const invocation = yield* cli.resolve();
59
- const entryModel = new Entry({
60
- command: invocation.command,
61
- args: [...invocation.args, 'mcp', 'run'],
62
- env: { EXPANDAI_HARNESS: 'codex' },
63
- enabled: true,
64
- });
65
- const entry = {
66
- command: entryModel.command,
67
- args: [...entryModel.args],
68
- env: { ...entryModel.env },
69
- enabled: entryModel.enabled,
70
- };
71
- yield* writeConfig(file, {
72
- ...config,
73
- mcp_servers: Record.set(servers, SERVER_KEY, entry),
74
- });
75
- yield* Console.log(`Installed expandai MCP server into ${file}`);
76
- });
77
- const uninstall = Effect.fn(function* (scope) {
78
- const file = yield* pathFor(scope);
79
- const config = yield* readConfig(file);
80
- const servers = yield* getMcpServers(config);
81
- if (!(SERVER_KEY in servers)) {
82
- return;
83
- }
84
- yield* writeConfig(file, { ...config, mcp_servers: Record.remove(servers, SERVER_KEY) });
85
- yield* Console.log(`Removed expandai MCP server from ${file}`);
86
- });
87
- const isInstalled = Effect.fn(function* (scope) {
88
- const file = yield* pathFor(scope);
89
- const config = yield* readConfig(file);
90
- const servers = yield* getMcpServers(config);
91
- return SERVER_KEY in servers;
92
- });
93
- return { install, uninstall, isInstalled, pathFor };
94
- }),
95
- }) {
96
- }
97
- //# sourceMappingURL=Mcp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Mcp.js","sourceRoot":"","sources":["../../../../src/Install/Codex/Mcp.ts"],"names":[],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- import { homedir } from 'node:os';
2
- import { Config, Effect, Match } from 'effect';
3
- import { SkillIo } from '../Domain.js';
4
- /**
5
- * Codex skills use the open agent skills locations:
6
- *
7
- * - global → `~/.agents/skills/<name>/`
8
- * - project → `<cwd>/.agents/skills/<name>/`
9
- */
10
- export const SKILL_NAME = 'expandai';
11
- export class CodexSkill extends Effect.Service()('@expandai/cli/Install/Codex/Skill', {
12
- dependencies: [SkillIo.Default],
13
- effect: Effect.gen(function* () {
14
- const io = yield* SkillIo;
15
- const home = yield* Config.string('HOME').pipe(Config.withDefault(homedir()));
16
- const cwd = yield* Config.string('PWD').pipe(Config.withDefault(process.cwd()));
17
- const pathFor = Effect.fn(function* (scope) {
18
- return yield* Match.value(scope).pipe(Match.when('global', () => Effect.succeed(`${home}/.agents/skills/${SKILL_NAME}`)), Match.when('project', () => Effect.succeed(`${cwd}/.agents/skills/${SKILL_NAME}`)), Match.exhaustive);
19
- });
20
- const install = Effect.fn(function* (scope) {
21
- return yield* io.install(yield* pathFor(scope));
22
- });
23
- const uninstall = Effect.fn(function* (scope) {
24
- return yield* io.uninstall(yield* pathFor(scope));
25
- });
26
- const isCurrent = Effect.fn(function* (scope) {
27
- return yield* io.isCurrent(yield* pathFor(scope));
28
- });
29
- return { install, uninstall, isCurrent, pathFor };
30
- }),
31
- }) {
32
- }
33
- //# sourceMappingURL=Skill.js.map