expandai 0.0.3 → 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 (320) 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/build/skills/expandai/SKILL.md +12 -6
  8. package/package.json +19 -11
  9. package/build/dts/ApiClient.d.ts +0 -165
  10. package/build/dts/ApiClient.d.ts.map +0 -1
  11. package/build/dts/Auth/Domain.d.ts +0 -95
  12. package/build/dts/Auth/Domain.d.ts.map +0 -1
  13. package/build/dts/Auth/ManualAuthorization.d.ts +0 -107
  14. package/build/dts/Auth/ManualAuthorization.d.ts.map +0 -1
  15. package/build/dts/Auth/PendingInit.d.ts +0 -35
  16. package/build/dts/Auth/PendingInit.d.ts.map +0 -1
  17. package/build/dts/Auth/Pkce.d.ts +0 -10
  18. package/build/dts/Auth/Pkce.d.ts.map +0 -1
  19. package/build/dts/Auth/SetupGrantAuthorization.d.ts +0 -34
  20. package/build/dts/Auth/SetupGrantAuthorization.d.ts.map +0 -1
  21. package/build/dts/Authentication.d.ts +0 -24
  22. package/build/dts/Authentication.d.ts.map +0 -1
  23. package/build/dts/BrowserOAuth.d.ts +0 -99
  24. package/build/dts/BrowserOAuth.d.ts.map +0 -1
  25. package/build/dts/CommandPath.d.ts +0 -2
  26. package/build/dts/CommandPath.d.ts.map +0 -1
  27. package/build/dts/Commands/Fetch.d.ts +0 -30
  28. package/build/dts/Commands/Fetch.d.ts.map +0 -1
  29. package/build/dts/Commands/Hook.d.ts +0 -17
  30. package/build/dts/Commands/Hook.d.ts.map +0 -1
  31. package/build/dts/Commands/Init.d.ts +0 -55
  32. package/build/dts/Commands/Init.d.ts.map +0 -1
  33. package/build/dts/Commands/Mcp.d.ts +0 -11
  34. package/build/dts/Commands/Mcp.d.ts.map +0 -1
  35. package/build/dts/Commands/McpRun.d.ts +0 -5
  36. package/build/dts/Commands/McpRun.d.ts.map +0 -1
  37. package/build/dts/Commands/Search.d.ts +0 -21
  38. package/build/dts/Commands/Search.d.ts.map +0 -1
  39. package/build/dts/Commands/Skill.d.ts +0 -12
  40. package/build/dts/Commands/Skill.d.ts.map +0 -1
  41. package/build/dts/Commands/Status.d.ts +0 -27
  42. package/build/dts/Commands/Status.d.ts.map +0 -1
  43. package/build/dts/Commands/Telemetry.d.ts +0 -7
  44. package/build/dts/Commands/Telemetry.d.ts.map +0 -1
  45. package/build/dts/Commands/Uninstall.d.ts +0 -9
  46. package/build/dts/Commands/Uninstall.d.ts.map +0 -1
  47. package/build/dts/Config.d.ts +0 -196
  48. package/build/dts/Config.d.ts.map +0 -1
  49. package/build/dts/Hook/Claude.d.ts +0 -13
  50. package/build/dts/Hook/Claude.d.ts.map +0 -1
  51. package/build/dts/Hook/Errors.d.ts +0 -20
  52. package/build/dts/Hook/Errors.d.ts.map +0 -1
  53. package/build/dts/Hook/Opencode.d.ts +0 -13
  54. package/build/dts/Hook/Opencode.d.ts.map +0 -1
  55. package/build/dts/Hook/SnapshotNote.d.ts +0 -12
  56. package/build/dts/Hook/SnapshotNote.d.ts.map +0 -1
  57. package/build/dts/Init/ClaudeAdapter.d.ts +0 -61
  58. package/build/dts/Init/ClaudeAdapter.d.ts.map +0 -1
  59. package/build/dts/Init/ClaudeProfile.d.ts +0 -78
  60. package/build/dts/Init/ClaudeProfile.d.ts.map +0 -1
  61. package/build/dts/Init/Domain.d.ts +0 -139
  62. package/build/dts/Init/Domain.d.ts.map +0 -1
  63. package/build/dts/Init/HarnessAdapter.d.ts +0 -33
  64. package/build/dts/Init/HarnessAdapter.d.ts.map +0 -1
  65. package/build/dts/Init/HarnessDetector.d.ts +0 -19
  66. package/build/dts/Init/HarnessDetector.d.ts.map +0 -1
  67. package/build/dts/Init/HarnessRegistry.d.ts +0 -50
  68. package/build/dts/Init/HarnessRegistry.d.ts.map +0 -1
  69. package/build/dts/Init/MutationTransaction.d.ts +0 -96
  70. package/build/dts/Init/MutationTransaction.d.ts.map +0 -1
  71. package/build/dts/Init/Service.d.ts +0 -72
  72. package/build/dts/Init/Service.d.ts.map +0 -1
  73. package/build/dts/Init/StandardAdapters.d.ts +0 -42
  74. package/build/dts/Init/StandardAdapters.d.ts.map +0 -1
  75. package/build/dts/Init/Status.d.ts +0 -149
  76. package/build/dts/Init/Status.d.ts.map +0 -1
  77. package/build/dts/Install/Claude/Hook.d.ts +0 -120
  78. package/build/dts/Install/Claude/Hook.d.ts.map +0 -1
  79. package/build/dts/Install/Claude/Mcp.d.ts +0 -48
  80. package/build/dts/Install/Claude/Mcp.d.ts.map +0 -1
  81. package/build/dts/Install/Claude/Skill.d.ts +0 -23
  82. package/build/dts/Install/Claude/Skill.d.ts.map +0 -1
  83. package/build/dts/Install/Codex/Mcp.d.ts +0 -45
  84. package/build/dts/Install/Codex/Mcp.d.ts.map +0 -1
  85. package/build/dts/Install/Codex/Skill.d.ts +0 -22
  86. package/build/dts/Install/Codex/Skill.d.ts.map +0 -1
  87. package/build/dts/Install/Cursor/Mcp.d.ts +0 -45
  88. package/build/dts/Install/Cursor/Mcp.d.ts.map +0 -1
  89. package/build/dts/Install/Cursor/Skill.d.ts +0 -29
  90. package/build/dts/Install/Cursor/Skill.d.ts.map +0 -1
  91. package/build/dts/Install/Domain.d.ts +0 -103
  92. package/build/dts/Install/Domain.d.ts.map +0 -1
  93. package/build/dts/Install/Hook.d.ts +0 -30
  94. package/build/dts/Install/Hook.d.ts.map +0 -1
  95. package/build/dts/Install/Mcp.d.ts +0 -28
  96. package/build/dts/Install/Mcp.d.ts.map +0 -1
  97. package/build/dts/Install/Opencode/Hook.d.ts +0 -24
  98. package/build/dts/Install/Opencode/Hook.d.ts.map +0 -1
  99. package/build/dts/Install/Opencode/Mcp.d.ts +0 -47
  100. package/build/dts/Install/Opencode/Mcp.d.ts.map +0 -1
  101. package/build/dts/Install/Opencode/Skill.d.ts +0 -26
  102. package/build/dts/Install/Opencode/Skill.d.ts.map +0 -1
  103. package/build/dts/Install/Skill.d.ts +0 -32
  104. package/build/dts/Install/Skill.d.ts.map +0 -1
  105. package/build/dts/Install/Uninstall.d.ts +0 -32
  106. package/build/dts/Install/Uninstall.d.ts.map +0 -1
  107. package/build/dts/MarkdownAnsi.d.ts +0 -29
  108. package/build/dts/MarkdownAnsi.d.ts.map +0 -1
  109. package/build/dts/Mcp/ExpandDocs.d.ts +0 -19
  110. package/build/dts/Mcp/ExpandDocs.d.ts.map +0 -1
  111. package/build/dts/Mcp/RequestHeaders.d.ts.map +0 -1
  112. package/build/dts/Mcp/Server.d.ts.map +0 -1
  113. package/build/dts/Mcp/Toolkit.d.ts +0 -3
  114. package/build/dts/Mcp/Toolkit.d.ts.map +0 -1
  115. package/build/dts/Mcp/tools/Citations.d.ts +0 -266
  116. package/build/dts/Mcp/tools/Citations.d.ts.map +0 -1
  117. package/build/dts/Mcp/tools/Fetch.d.ts +0 -168
  118. package/build/dts/Mcp/tools/Fetch.d.ts.map +0 -1
  119. package/build/dts/SecureFile.d.ts +0 -23
  120. package/build/dts/SecureFile.d.ts.map +0 -1
  121. package/build/dts/Snippets.d.ts +0 -18
  122. package/build/dts/Snippets.d.ts.map +0 -1
  123. package/build/dts/Telemetry.d.ts +0 -30
  124. package/build/dts/Telemetry.d.ts.map +0 -1
  125. package/build/dts/Version.d.ts +0 -2
  126. package/build/dts/Version.d.ts.map +0 -1
  127. package/build/dts/Xdg.d.ts +0 -11
  128. package/build/dts/Xdg.d.ts.map +0 -1
  129. package/build/dts/index.d.ts.map +0 -1
  130. package/build/dts/main.d.ts +0 -3
  131. package/build/dts/main.d.ts.map +0 -1
  132. package/build/esm/ApiClient.js +0 -305
  133. package/build/esm/ApiClient.js.map +0 -1
  134. package/build/esm/Auth/Domain.js +0 -56
  135. package/build/esm/Auth/Domain.js.map +0 -1
  136. package/build/esm/Auth/ManualAuthorization.js +0 -253
  137. package/build/esm/Auth/ManualAuthorization.js.map +0 -1
  138. package/build/esm/Auth/PendingInit.js +0 -267
  139. package/build/esm/Auth/PendingInit.js.map +0 -1
  140. package/build/esm/Auth/Pkce.js +0 -23
  141. package/build/esm/Auth/Pkce.js.map +0 -1
  142. package/build/esm/Auth/SetupGrantAuthorization.js +0 -91
  143. package/build/esm/Auth/SetupGrantAuthorization.js.map +0 -1
  144. package/build/esm/Authentication.js +0 -143
  145. package/build/esm/Authentication.js.map +0 -1
  146. package/build/esm/BrowserOAuth.js +0 -251
  147. package/build/esm/BrowserOAuth.js.map +0 -1
  148. package/build/esm/CommandPath.js +0 -31
  149. package/build/esm/CommandPath.js.map +0 -1
  150. package/build/esm/Commands/Fetch.js +0 -119
  151. package/build/esm/Commands/Fetch.js.map +0 -1
  152. package/build/esm/Commands/Hook.js +0 -20
  153. package/build/esm/Commands/Hook.js.map +0 -1
  154. package/build/esm/Commands/Init.js +0 -371
  155. package/build/esm/Commands/Init.js.map +0 -1
  156. package/build/esm/Commands/Mcp.js +0 -19
  157. package/build/esm/Commands/Mcp.js.map +0 -1
  158. package/build/esm/Commands/McpRun.js +0 -15
  159. package/build/esm/Commands/McpRun.js.map +0 -1
  160. package/build/esm/Commands/Search.js +0 -46
  161. package/build/esm/Commands/Search.js.map +0 -1
  162. package/build/esm/Commands/Skill.js +0 -17
  163. package/build/esm/Commands/Skill.js.map +0 -1
  164. package/build/esm/Commands/Status.js +0 -186
  165. package/build/esm/Commands/Status.js.map +0 -1
  166. package/build/esm/Commands/Telemetry.js +0 -23
  167. package/build/esm/Commands/Telemetry.js.map +0 -1
  168. package/build/esm/Commands/Uninstall.js +0 -28
  169. package/build/esm/Commands/Uninstall.js.map +0 -1
  170. package/build/esm/Config.js +0 -619
  171. package/build/esm/Config.js.map +0 -1
  172. package/build/esm/Hook/Claude.js +0 -74
  173. package/build/esm/Hook/Claude.js.map +0 -1
  174. package/build/esm/Hook/Errors.js +0 -18
  175. package/build/esm/Hook/Errors.js.map +0 -1
  176. package/build/esm/Hook/Opencode.js +0 -50
  177. package/build/esm/Hook/Opencode.js.map +0 -1
  178. package/build/esm/Hook/SnapshotNote.js +0 -65
  179. package/build/esm/Hook/SnapshotNote.js.map +0 -1
  180. package/build/esm/Init/ClaudeAdapter.js +0 -137
  181. package/build/esm/Init/ClaudeAdapter.js.map +0 -1
  182. package/build/esm/Init/ClaudeProfile.js +0 -380
  183. package/build/esm/Init/ClaudeProfile.js.map +0 -1
  184. package/build/esm/Init/Domain.js +0 -118
  185. package/build/esm/Init/Domain.js.map +0 -1
  186. package/build/esm/Init/HarnessAdapter.js +0 -21
  187. package/build/esm/Init/HarnessAdapter.js.map +0 -1
  188. package/build/esm/Init/HarnessDetector.js +0 -65
  189. package/build/esm/Init/HarnessDetector.js.map +0 -1
  190. package/build/esm/Init/HarnessRegistry.js +0 -58
  191. package/build/esm/Init/HarnessRegistry.js.map +0 -1
  192. package/build/esm/Init/MutationTransaction.js +0 -494
  193. package/build/esm/Init/MutationTransaction.js.map +0 -1
  194. package/build/esm/Init/Service.js +0 -319
  195. package/build/esm/Init/Service.js.map +0 -1
  196. package/build/esm/Init/StandardAdapters.js +0 -116
  197. package/build/esm/Init/StandardAdapters.js.map +0 -1
  198. package/build/esm/Init/Status.js +0 -215
  199. package/build/esm/Init/Status.js.map +0 -1
  200. package/build/esm/Install/Claude/Hook.js +0 -221
  201. package/build/esm/Install/Claude/Hook.js.map +0 -1
  202. package/build/esm/Install/Claude/Mcp.js +0 -101
  203. package/build/esm/Install/Claude/Mcp.js.map +0 -1
  204. package/build/esm/Install/Claude/Skill.js +0 -56
  205. package/build/esm/Install/Claude/Skill.js.map +0 -1
  206. package/build/esm/Install/Codex/Mcp.js +0 -97
  207. package/build/esm/Install/Codex/Mcp.js.map +0 -1
  208. package/build/esm/Install/Codex/Skill.js +0 -33
  209. package/build/esm/Install/Codex/Skill.js.map +0 -1
  210. package/build/esm/Install/Cursor/Mcp.js +0 -74
  211. package/build/esm/Install/Cursor/Mcp.js.map +0 -1
  212. package/build/esm/Install/Cursor/Skill.js +0 -40
  213. package/build/esm/Install/Cursor/Skill.js.map +0 -1
  214. package/build/esm/Install/Domain.js +0 -162
  215. package/build/esm/Install/Domain.js.map +0 -1
  216. package/build/esm/Install/Hook.js +0 -38
  217. package/build/esm/Install/Hook.js.map +0 -1
  218. package/build/esm/Install/Mcp.js +0 -40
  219. package/build/esm/Install/Mcp.js.map +0 -1
  220. package/build/esm/Install/Opencode/Hook.js +0 -44
  221. package/build/esm/Install/Opencode/Hook.js.map +0 -1
  222. package/build/esm/Install/Opencode/Mcp.js +0 -76
  223. package/build/esm/Install/Opencode/Mcp.js.map +0 -1
  224. package/build/esm/Install/Opencode/Skill.js +0 -37
  225. package/build/esm/Install/Opencode/Skill.js.map +0 -1
  226. package/build/esm/Install/Skill.js +0 -41
  227. package/build/esm/Install/Skill.js.map +0 -1
  228. package/build/esm/Install/Uninstall.js +0 -49
  229. package/build/esm/Install/Uninstall.js.map +0 -1
  230. package/build/esm/MarkdownAnsi.js +0 -142
  231. package/build/esm/MarkdownAnsi.js.map +0 -1
  232. package/build/esm/Mcp/ExpandDocs.js +0 -56
  233. package/build/esm/Mcp/ExpandDocs.js.map +0 -1
  234. package/build/esm/Mcp/RequestHeaders.js +0 -13
  235. package/build/esm/Mcp/RequestHeaders.js.map +0 -1
  236. package/build/esm/Mcp/Server.js +0 -12
  237. package/build/esm/Mcp/Server.js.map +0 -1
  238. package/build/esm/Mcp/Toolkit.js +0 -16
  239. package/build/esm/Mcp/Toolkit.js.map +0 -1
  240. package/build/esm/Mcp/tools/Citations.js +0 -193
  241. package/build/esm/Mcp/tools/Citations.js.map +0 -1
  242. package/build/esm/Mcp/tools/Fetch.js +0 -165
  243. package/build/esm/Mcp/tools/Fetch.js.map +0 -1
  244. package/build/esm/SecureFile.js +0 -36
  245. package/build/esm/SecureFile.js.map +0 -1
  246. package/build/esm/Snippets.js +0 -29
  247. package/build/esm/Snippets.js.map +0 -1
  248. package/build/esm/Telemetry.js +0 -157
  249. package/build/esm/Telemetry.js.map +0 -1
  250. package/build/esm/Version.js +0 -4
  251. package/build/esm/Version.js.map +0 -1
  252. package/build/esm/Xdg.js +0 -15
  253. package/build/esm/Xdg.js.map +0 -1
  254. package/build/esm/index.js.map +0 -1
  255. package/build/esm/main.js.map +0 -1
  256. package/src/ApiClient.ts +0 -450
  257. package/src/Auth/Domain.ts +0 -63
  258. package/src/Auth/ManualAuthorization.ts +0 -296
  259. package/src/Auth/PendingInit.ts +0 -338
  260. package/src/Auth/Pkce.ts +0 -26
  261. package/src/Auth/SetupGrantAuthorization.ts +0 -116
  262. package/src/Authentication.ts +0 -202
  263. package/src/BrowserOAuth.ts +0 -359
  264. package/src/CommandPath.ts +0 -30
  265. package/src/Commands/Fetch.ts +0 -188
  266. package/src/Commands/Hook.ts +0 -48
  267. package/src/Commands/Init.ts +0 -489
  268. package/src/Commands/Mcp.ts +0 -30
  269. package/src/Commands/McpRun.ts +0 -25
  270. package/src/Commands/Search.ts +0 -97
  271. package/src/Commands/Skill.ts +0 -30
  272. package/src/Commands/Status.ts +0 -228
  273. package/src/Commands/Telemetry.ts +0 -42
  274. package/src/Commands/Uninstall.ts +0 -38
  275. package/src/Config.ts +0 -840
  276. package/src/Hook/Claude.ts +0 -81
  277. package/src/Hook/Errors.ts +0 -19
  278. package/src/Hook/Opencode.ts +0 -58
  279. package/src/Hook/SnapshotNote.ts +0 -66
  280. package/src/Init/ClaudeAdapter.ts +0 -191
  281. package/src/Init/ClaudeProfile.ts +0 -496
  282. package/src/Init/Domain.ts +0 -153
  283. package/src/Init/HarnessAdapter.ts +0 -35
  284. package/src/Init/HarnessDetector.ts +0 -77
  285. package/src/Init/HarnessRegistry.ts +0 -87
  286. package/src/Init/MutationTransaction.ts +0 -747
  287. package/src/Init/Service.ts +0 -385
  288. package/src/Init/StandardAdapters.ts +0 -141
  289. package/src/Init/Status.ts +0 -253
  290. package/src/Install/Claude/Hook.ts +0 -286
  291. package/src/Install/Claude/Mcp.ts +0 -129
  292. package/src/Install/Claude/Skill.ts +0 -77
  293. package/src/Install/Codex/Mcp.ts +0 -114
  294. package/src/Install/Codex/Skill.ts +0 -44
  295. package/src/Install/Cursor/Mcp.ts +0 -85
  296. package/src/Install/Cursor/Skill.ts +0 -51
  297. package/src/Install/Domain.ts +0 -221
  298. package/src/Install/Hook.ts +0 -50
  299. package/src/Install/Mcp.ts +0 -71
  300. package/src/Install/Opencode/Hook.ts +0 -55
  301. package/src/Install/Opencode/Mcp.ts +0 -87
  302. package/src/Install/Opencode/Skill.ts +0 -48
  303. package/src/Install/Opencode/expandai-webfetch.d.ts +0 -23
  304. package/src/Install/Opencode/expandai-webfetch.js +0 -56
  305. package/src/Install/Skill.ts +0 -57
  306. package/src/Install/Uninstall.ts +0 -82
  307. package/src/MarkdownAnsi.ts +0 -162
  308. package/src/Mcp/ExpandDocs.ts +0 -62
  309. package/src/Mcp/RequestHeaders.ts +0 -16
  310. package/src/Mcp/Server.ts +0 -15
  311. package/src/Mcp/Toolkit.ts +0 -21
  312. package/src/Mcp/tools/Citations.ts +0 -219
  313. package/src/Mcp/tools/Fetch.ts +0 -203
  314. package/src/SecureFile.ts +0 -70
  315. package/src/Snippets.ts +0 -39
  316. package/src/Telemetry.ts +0 -186
  317. package/src/Version.ts +0 -3
  318. package/src/Xdg.ts +0 -18
  319. package/src/index.ts +0 -1
  320. 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
- )