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,228 +0,0 @@
1
- import { Command, Options, Prompt } from '@effect/cli'
2
- import { Terminal } from '@effect/platform'
3
- import { Console, Effect, Either, Logger, LogLevel, Option, Schema } from 'effect'
4
- import { InitErrorEnvelope, InitHarness, InitScope } from '../Init/Domain.js'
5
- import { StatusRequest, StatusResult, StatusService, StatusServiceError } from '../Init/Status.js'
6
- import { type OnboardingExecutionModeInput, resolveOnboardingExecutionMode } from './Init.js'
7
-
8
- const harness = Options.text('harness').pipe(Options.optional, Options.withDescription('Agent harness to inspect'))
9
- const scope = Options.text('scope').pipe(Options.optional, Options.withDescription('Configuration scope'))
10
- const json = Options.boolean('json').pipe(Options.withDescription('Emit one machine-readable JSON result'))
11
- const config = { harness, scope, json }
12
-
13
- const ErrorJson = Schema.parseJson(InitErrorEnvelope)
14
- const StatusResultJson = Schema.parseJson(StatusResult)
15
- const INVALID_ARGUMENTS_MESSAGE =
16
- 'Agent status requires --harness claude-code|cursor|opencode|codex, --scope project|global, and --json.'
17
-
18
- function errorJson(code: string, message: string, recoverable: boolean): string {
19
- return Schema.encodeSync(ErrorJson)(
20
- new InitErrorEnvelope({ schemaVersion: 1, status: 'error', code, message, recoverable }),
21
- )
22
- }
23
-
24
- function invalidArgumentsJson(): string {
25
- return errorJson('invalid_arguments', INVALID_ARGUMENTS_MESSAGE, true)
26
- }
27
-
28
- function emitError(code: string, message: string, recoverable: boolean, exitCode: number) {
29
- return Console.error(errorJson(code, message, recoverable)).pipe(
30
- Effect.zipRight(Effect.sync(() => void (process.exitCode = exitCode))),
31
- )
32
- }
33
-
34
- export interface StatusCommandOptions {
35
- readonly harness: Option.Option<string>
36
- readonly json: boolean
37
- readonly scope: Option.Option<string>
38
- }
39
-
40
- /** Selects the status surface using the same machine-safety precedence as init. */
41
- export function resolveStatusExecutionMode(input: OnboardingExecutionModeInput): 'human' | 'machine' | undefined {
42
- return resolveOnboardingExecutionMode(input, 'status')
43
- }
44
-
45
- function parseMachineArguments(args: readonly string[]): StatusCommandOptions | undefined {
46
- function parse(index: number, parsed: StatusCommandOptions): StatusCommandOptions | undefined {
47
- if (index >= args.length) return parsed
48
- const token = args[index]
49
- if (token === '--json' && !parsed.json) return parse(index + 1, { ...parsed, json: true })
50
- if (token !== '--harness' && token !== '--scope') return undefined
51
- const value = args[index + 1]
52
- if (value === undefined || value.startsWith('-')) return undefined
53
- if (token === '--harness' && Option.isNone(parsed.harness)) {
54
- return parse(index + 2, { ...parsed, harness: Option.some(value) })
55
- }
56
- if (token === '--scope' && Option.isNone(parsed.scope)) {
57
- return parse(index + 2, { ...parsed, scope: Option.some(value) })
58
- }
59
- return undefined
60
- }
61
-
62
- return parse(0, { harness: Option.none(), json: false, scope: Option.none() })
63
- }
64
-
65
- /** Returns safe JSON before Effect CLI can render parser help or acquire services. */
66
- export function preflightAgentStatusArgv(argv: readonly string[]): string | undefined {
67
- if (argv[2] !== 'status') return undefined
68
- const args = argv.slice(3)
69
- if (args.length === 1 && (args[0] === '--help' || args[0] === '-h')) return undefined
70
- const parsed = parseMachineArguments(args)
71
- if (parsed === undefined || !parsed.json) return invalidArgumentsJson()
72
- if (Option.isNone(Option.flatMap(parsed.harness, (value) => Schema.decodeUnknownOption(InitHarness)(value)))) {
73
- return invalidArgumentsJson()
74
- }
75
- if (!Option.contains(parsed.scope, 'project') && !Option.contains(parsed.scope, 'global')) {
76
- return invalidArgumentsJson()
77
- }
78
- return undefined
79
- }
80
-
81
- const HARNESS_LABELS: Record<typeof InitHarness.Type, string> = {
82
- 'claude-code': 'Claude Code',
83
- cursor: 'Cursor',
84
- codex: 'Codex',
85
- opencode: 'OpenCode',
86
- }
87
-
88
- /** Only these install a web-fetch hook; the line is meaningless for the rest. */
89
- const HOOK_HARNESSES: ReadonlyArray<typeof InitHarness.Type> = ['claude-code', 'opencode']
90
-
91
- function renderHumanStatus(result: StatusResult): string {
92
- const pending = result.pendingAuthorization.count === 1 ? 'approval pending' : 'none'
93
- const installation = result.installation.configured ? 'configured' : 'partial or not configured'
94
- const configured = (present: boolean) => (present ? 'configured' : 'not configured')
95
- // `result.harness` was never read: every harness printed as "Claude Code", and
96
- // a correctly configured Cursor machine also reported a missing WebFetch hook
97
- // it never installs. The guide sends users here to confirm setup, so this was
98
- // the last thing they saw.
99
- return [
100
- 'Expand status',
101
- `Auth: ${result.auth.state}`,
102
- `Pending authorization: ${pending}`,
103
- `${HARNESS_LABELS[result.harness]}: ${installation}`,
104
- ...(HOOK_HARNESSES.includes(result.harness)
105
- ? [`WebFetch hook: ${configured(result.installation.components.webfetchHook)}`]
106
- : []),
107
- `Runtime skill: ${configured(result.installation.components.runtimeSkill)}`,
108
- `MCP: ${configured(result.installation.components.mcp)}`,
109
- `Runtime: ${result.installation.runtimeState}`,
110
- ].join('\n')
111
- }
112
-
113
- const runStatusService = Effect.fnUntraced(function* (request: StatusRequest, jsonOutput: boolean) {
114
- const service = yield* StatusService
115
- // Log suppression belongs here, not in the service, and only for machine
116
- // output: `--json` writes its result *and* its structured error envelope to
117
- // stderr, so a warning interleaved there breaks the one-object contract an
118
- // agent parses. Human status keeps its diagnostics — it is the command
119
- // someone runs when something is already wrong.
120
- const result = yield* Effect.either(
121
- jsonOutput ? service.run(request).pipe(Logger.withMinimumLogLevel(LogLevel.None)) : service.run(request),
122
- )
123
- if (Either.isLeft(result)) {
124
- const error = result.left
125
- if (error instanceof StatusServiceError) {
126
- yield* emitError(error.code, error.message, error.recoverable, 1)
127
- return
128
- }
129
- yield* emitError('status_failed', 'Expand status could not be inspected safely.', true, 1)
130
- return
131
- }
132
- if (!jsonOutput) {
133
- yield* Console.log(renderHumanStatus(result.right))
134
- return
135
- }
136
- const encoded = yield* Schema.encode(StatusResultJson)(result.right).pipe(
137
- Effect.catchAll(() =>
138
- emitError('invalid_status_result', 'Expand status returned an invalid result.', false, 1).pipe(
139
- Effect.as(undefined),
140
- ),
141
- ),
142
- )
143
- if (typeof encoded === 'string') yield* Console.log(encoded)
144
- })
145
-
146
- const runMachineStatus = Effect.fnUntraced(function* ({ harness, json, scope }: StatusCommandOptions) {
147
- if (
148
- !json ||
149
- Option.isNone(Option.flatMap(harness, (value) => Schema.decodeUnknownOption(InitHarness)(value))) ||
150
- (!Option.contains(scope, 'project') && !Option.contains(scope, 'global'))
151
- ) {
152
- yield* emitError('invalid_arguments', INVALID_ARGUMENTS_MESSAGE, true, 2)
153
- return
154
- }
155
- const request = yield* Schema.decodeUnknown(StatusRequest)({
156
- harness: Option.getOrUndefined(harness),
157
- scope: Option.getOrUndefined(scope),
158
- }).pipe(
159
- Effect.catchAll(() =>
160
- emitError('invalid_arguments', INVALID_ARGUMENTS_MESSAGE, true, 2).pipe(Effect.as(undefined)),
161
- ),
162
- )
163
- if (request !== undefined) yield* runStatusService(request, true)
164
- })
165
-
166
- export class StatusTerminalInteraction extends Effect.Service<StatusTerminalInteraction>()(
167
- '@expandai/cli/Commands/StatusTerminalInteraction',
168
- {
169
- effect: Effect.gen(function* () {
170
- const terminal = yield* Terminal.Terminal
171
- const chooseHarness = Effect.fnUntraced(function* () {
172
- return yield* Prompt.select({
173
- message: 'Which agent harness should Expand inspect?',
174
- // init configures all four, so inspection must cover all four.
175
- choices: [
176
- { title: 'Claude Code', value: 'claude-code' as const },
177
- { title: 'Cursor', value: 'cursor' as const },
178
- { title: 'opencode', value: 'opencode' as const },
179
- { title: 'Codex', value: 'codex' as const },
180
- ],
181
- }).pipe(Effect.provideService(Terminal.Terminal, terminal))
182
- })
183
- const chooseScope = Effect.fnUntraced(function* () {
184
- return yield* Prompt.select({
185
- message: 'Which configuration scope should Expand inspect?',
186
- choices: [
187
- { title: 'This project', value: 'project' as const },
188
- { title: 'All projects for this user', value: 'global' as const },
189
- ],
190
- }).pipe(Effect.provideService(Terminal.Terminal, terminal))
191
- })
192
- return { chooseHarness, chooseScope } as const
193
- }),
194
- },
195
- ) {}
196
-
197
- export const runHumanStatus = Effect.fnUntraced(function* (options: StatusCommandOptions) {
198
- if (options.json) {
199
- yield* runMachineStatus(options)
200
- return
201
- }
202
- const interaction = yield* StatusTerminalInteraction
203
- const harnessInput = Option.isSome(options.harness) ? options.harness.value : yield* interaction.chooseHarness()
204
- const scopeInput = Option.isSome(options.scope) ? options.scope.value : yield* interaction.chooseScope()
205
- const decodedHarness = Schema.decodeUnknownOption(InitHarness)(harnessInput)
206
- const decodedScope = Schema.decodeUnknownOption(InitScope)(scopeInput)
207
- if (Option.isNone(decodedHarness) || Option.isNone(decodedScope)) {
208
- yield* emitError('invalid_arguments', INVALID_ARGUMENTS_MESSAGE, true, 2)
209
- return
210
- }
211
- const request = new StatusRequest({
212
- harness: decodedHarness.value,
213
- scope: decodedScope.value,
214
- })
215
- yield* runStatusService(request, false)
216
- })
217
-
218
- const description = 'Inspect redacted local Expand onboarding status'
219
-
220
- export const HumanStatusCommand = Command.make('status', config).pipe(
221
- Command.withDescription(description),
222
- Command.withHandler(runHumanStatus),
223
- )
224
-
225
- export const AgentStatusCommand = Command.make('status', config).pipe(
226
- Command.withDescription(description),
227
- Command.withHandler(runMachineStatus),
228
- )
@@ -1,42 +0,0 @@
1
- import { Command } from '@effect/cli'
2
- import { Console, Effect } from 'effect'
3
- import { ConfigManager } from '../Config.js'
4
- import { Telemetry } from '../Telemetry.js'
5
-
6
- const setEnabled = Effect.fnUntraced(function* (enabled: boolean) {
7
- const configManager = yield* ConfigManager
8
- const { config } = yield* configManager.readConfigFile()
9
- // updateConfig fails with ConfigParseError on an undecodable file — surfaced
10
- // to the user rather than overwriting whatever the file held.
11
- yield* configManager.updateConfig({ telemetry: { ...config.telemetry, enabled } })
12
- yield* Console.log(`Telemetry ${enabled ? 'enabled' : 'disabled'}.`)
13
- })
14
-
15
- const showStatus = Effect.fnUntraced(function* () {
16
- const telemetry = yield* Telemetry
17
- yield* Console.log(
18
- telemetry.enabled
19
- ? 'Telemetry is enabled. Disable with `expandai telemetry disable` or EXPANDAI_NO_TELEMETRY=1.'
20
- : 'Telemetry is disabled.',
21
- )
22
- })
23
-
24
- const StatusCommand = Command.make('status').pipe(
25
- Command.withDescription('Show whether anonymous usage telemetry is enabled'),
26
- Command.withHandler(() => showStatus()),
27
- )
28
-
29
- const EnableCommand = Command.make('enable').pipe(
30
- Command.withDescription('Enable anonymous usage telemetry'),
31
- Command.withHandler(() => setEnabled(true)),
32
- )
33
-
34
- const DisableCommand = Command.make('disable').pipe(
35
- Command.withDescription('Disable anonymous usage telemetry'),
36
- Command.withHandler(() => setEnabled(false)),
37
- )
38
-
39
- export const TelemetryCommand = Command.make('telemetry').pipe(
40
- Command.withDescription('Manage anonymous usage telemetry'),
41
- Command.withSubcommands([StatusCommand, EnableCommand, DisableCommand]),
42
- )
@@ -1,38 +0,0 @@
1
- import { Args, Command } from '@effect/cli'
2
- import { Effect, Option } from 'effect'
3
- import { Uninstall } from '../Install/Uninstall.js'
4
-
5
- const targetArg = Args.choice([
6
- ['all', 'all' as const],
7
- ['hook', 'hook' as const],
8
- ['skill', 'skill' as const],
9
- ['mcp', 'mcp' as const],
10
- ]).pipe(Args.optional)
11
-
12
- const hostArg = Args.choice([
13
- ['claude-code', 'claude-code' as const],
14
- ['cursor', 'cursor' as const],
15
- ['opencode', 'opencode' as const],
16
- ['codex', 'codex' as const],
17
- ]).pipe(Args.optional)
18
-
19
- const scopeArg = Args.choice([
20
- ['global', 'global' as const],
21
- ['project', 'project' as const],
22
- ]).pipe(Args.optional)
23
-
24
- export const UninstallCommand = Command.make('uninstall', { target: targetArg, host: hostArg, scope: scopeArg }).pipe(
25
- Command.withDescription(
26
- 'Remove expandai hooks, skills, and MCP server entries. Defaults to `all` across every host and scope when target/host/scope are omitted.',
27
- ),
28
- Command.withHandler(
29
- Effect.fnUntraced(function* ({ target, host, scope }) {
30
- const uninstall = yield* Uninstall
31
- yield* uninstall.uninstall({
32
- target: Option.getOrUndefined(target),
33
- host: Option.getOrUndefined(host),
34
- scope: Option.getOrUndefined(scope),
35
- })
36
- }),
37
- ),
38
- )