@aigne/afs-cli 1.11.0-beta.6 → 1.11.0-beta.7

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 (317) hide show
  1. package/dist/cli.cjs +27 -353
  2. package/dist/cli.d.cts +2 -1
  3. package/dist/cli.d.mts +2 -1
  4. package/dist/cli.mjs +28 -353
  5. package/dist/cli.mjs.map +1 -1
  6. package/dist/config/afs-loader.cjs +123 -0
  7. package/dist/config/afs-loader.d.cts +14 -0
  8. package/dist/config/afs-loader.d.cts.map +1 -0
  9. package/dist/config/afs-loader.d.mts +14 -0
  10. package/dist/config/afs-loader.d.mts.map +1 -0
  11. package/dist/config/afs-loader.mjs +122 -0
  12. package/dist/config/afs-loader.mjs.map +1 -0
  13. package/dist/config/loader.cjs +2 -2
  14. package/dist/config/loader.mjs +2 -2
  15. package/dist/{commands/mount.cjs → config/mount-commands.cjs} +13 -49
  16. package/dist/config/mount-commands.d.cts +20 -0
  17. package/dist/config/mount-commands.d.cts.map +1 -0
  18. package/dist/config/mount-commands.d.mts +20 -0
  19. package/dist/config/mount-commands.d.mts.map +1 -0
  20. package/dist/{commands/mount.mjs → config/mount-commands.mjs} +14 -49
  21. package/dist/config/mount-commands.mjs.map +1 -0
  22. package/dist/config/schema.cjs +9 -1
  23. package/dist/config/schema.mjs +9 -1
  24. package/dist/config/schema.mjs.map +1 -1
  25. package/dist/core/commands/delete.cjs +41 -0
  26. package/dist/core/commands/delete.d.cts +18 -0
  27. package/dist/core/commands/delete.d.cts.map +1 -0
  28. package/dist/core/commands/delete.d.mts +18 -0
  29. package/dist/core/commands/delete.d.mts.map +1 -0
  30. package/dist/core/commands/delete.mjs +42 -0
  31. package/dist/core/commands/delete.mjs.map +1 -0
  32. package/dist/core/commands/exec.cjs +95 -0
  33. package/dist/core/commands/exec.d.cts +26 -0
  34. package/dist/core/commands/exec.d.cts.map +1 -0
  35. package/dist/core/commands/exec.d.mts +26 -0
  36. package/dist/core/commands/exec.d.mts.map +1 -0
  37. package/dist/core/commands/exec.mjs +96 -0
  38. package/dist/core/commands/exec.mjs.map +1 -0
  39. package/dist/core/commands/explain.cjs +254 -0
  40. package/dist/core/commands/explain.d.cts +25 -0
  41. package/dist/core/commands/explain.d.cts.map +1 -0
  42. package/dist/core/commands/explain.d.mts +25 -0
  43. package/dist/core/commands/explain.d.mts.map +1 -0
  44. package/dist/core/commands/explain.mjs +255 -0
  45. package/dist/core/commands/explain.mjs.map +1 -0
  46. package/dist/core/commands/explore.cjs +30 -0
  47. package/dist/core/commands/explore.d.mts +2 -0
  48. package/dist/core/commands/explore.mjs +31 -0
  49. package/dist/core/commands/explore.mjs.map +1 -0
  50. package/dist/core/commands/index.cjs +36 -0
  51. package/dist/core/commands/index.d.cts +21 -0
  52. package/dist/core/commands/index.d.cts.map +1 -0
  53. package/dist/core/commands/index.d.mts +24 -0
  54. package/dist/core/commands/index.d.mts.map +1 -0
  55. package/dist/core/commands/index.mjs +37 -0
  56. package/dist/core/commands/index.mjs.map +1 -0
  57. package/dist/core/commands/ls.cjs +57 -0
  58. package/dist/core/commands/ls.d.cts +21 -0
  59. package/dist/core/commands/ls.d.cts.map +1 -0
  60. package/dist/core/commands/ls.d.mts +21 -0
  61. package/dist/core/commands/ls.d.mts.map +1 -0
  62. package/dist/core/commands/ls.mjs +58 -0
  63. package/dist/core/commands/ls.mjs.map +1 -0
  64. package/dist/core/commands/mount.cjs +139 -0
  65. package/dist/core/commands/mount.d.cts +33 -0
  66. package/dist/core/commands/mount.d.cts.map +1 -0
  67. package/dist/core/commands/mount.d.mts +33 -0
  68. package/dist/core/commands/mount.d.mts.map +1 -0
  69. package/dist/core/commands/mount.mjs +140 -0
  70. package/dist/core/commands/mount.mjs.map +1 -0
  71. package/dist/core/commands/read.cjs +48 -0
  72. package/dist/core/commands/read.d.cts +17 -0
  73. package/dist/core/commands/read.d.cts.map +1 -0
  74. package/dist/core/commands/read.d.mts +17 -0
  75. package/dist/core/commands/read.d.mts.map +1 -0
  76. package/dist/core/commands/read.mjs +49 -0
  77. package/dist/core/commands/read.mjs.map +1 -0
  78. package/dist/core/commands/search.cjs +40 -0
  79. package/dist/core/commands/search.d.mts +2 -0
  80. package/dist/core/commands/search.mjs +41 -0
  81. package/dist/core/commands/search.mjs.map +1 -0
  82. package/dist/core/commands/serve.cjs +242 -0
  83. package/dist/core/commands/serve.d.mts +2 -0
  84. package/dist/core/commands/serve.mjs +242 -0
  85. package/dist/core/commands/serve.mjs.map +1 -0
  86. package/dist/core/commands/stat.cjs +53 -0
  87. package/dist/core/commands/stat.d.cts +17 -0
  88. package/dist/core/commands/stat.d.cts.map +1 -0
  89. package/dist/core/commands/stat.d.mts +17 -0
  90. package/dist/core/commands/stat.d.mts.map +1 -0
  91. package/dist/core/commands/stat.mjs +54 -0
  92. package/dist/core/commands/stat.mjs.map +1 -0
  93. package/dist/core/commands/types.cjs +13 -0
  94. package/dist/core/commands/types.d.cts +54 -0
  95. package/dist/core/commands/types.d.cts.map +1 -0
  96. package/dist/core/commands/types.d.mts +54 -0
  97. package/dist/core/commands/types.d.mts.map +1 -0
  98. package/dist/core/commands/types.mjs +14 -0
  99. package/dist/core/commands/types.mjs.map +1 -0
  100. package/dist/core/commands/write.cjs +70 -0
  101. package/dist/core/commands/write.d.cts +20 -0
  102. package/dist/core/commands/write.d.cts.map +1 -0
  103. package/dist/core/commands/write.d.mts +20 -0
  104. package/dist/core/commands/write.d.mts.map +1 -0
  105. package/dist/core/commands/write.mjs +71 -0
  106. package/dist/core/commands/write.mjs.map +1 -0
  107. package/dist/core/executor/index.cjs +196 -0
  108. package/dist/core/executor/index.d.cts +77 -0
  109. package/dist/core/executor/index.d.cts.map +1 -0
  110. package/dist/core/executor/index.d.mts +77 -0
  111. package/dist/core/executor/index.d.mts.map +1 -0
  112. package/dist/core/executor/index.mjs +195 -0
  113. package/dist/core/executor/index.mjs.map +1 -0
  114. package/dist/core/formatters/delete.cjs +37 -0
  115. package/dist/core/formatters/delete.d.cts +18 -0
  116. package/dist/core/formatters/delete.d.cts.map +1 -0
  117. package/dist/core/formatters/delete.d.mts +18 -0
  118. package/dist/core/formatters/delete.d.mts.map +1 -0
  119. package/dist/core/formatters/delete.mjs +37 -0
  120. package/dist/core/formatters/delete.mjs.map +1 -0
  121. package/dist/core/formatters/exec.cjs +60 -0
  122. package/dist/core/formatters/exec.d.cts +18 -0
  123. package/dist/core/formatters/exec.d.cts.map +1 -0
  124. package/dist/core/formatters/exec.d.mts +18 -0
  125. package/dist/core/formatters/exec.d.mts.map +1 -0
  126. package/dist/core/formatters/exec.mjs +60 -0
  127. package/dist/core/formatters/exec.mjs.map +1 -0
  128. package/dist/core/formatters/explain.cjs +97 -0
  129. package/dist/core/formatters/explain.d.cts +11 -0
  130. package/dist/core/formatters/explain.d.cts.map +1 -0
  131. package/dist/core/formatters/explain.d.mts +11 -0
  132. package/dist/core/formatters/explain.d.mts.map +1 -0
  133. package/dist/core/formatters/explain.mjs +96 -0
  134. package/dist/core/formatters/explain.mjs.map +1 -0
  135. package/dist/core/formatters/index.d.mts +9 -0
  136. package/dist/core/formatters/ls.cjs +179 -0
  137. package/dist/core/formatters/ls.d.cts +20 -0
  138. package/dist/core/formatters/ls.d.cts.map +1 -0
  139. package/dist/core/formatters/ls.d.mts +20 -0
  140. package/dist/core/formatters/ls.d.mts.map +1 -0
  141. package/dist/core/formatters/ls.mjs +179 -0
  142. package/dist/core/formatters/ls.mjs.map +1 -0
  143. package/dist/core/formatters/mount.cjs +55 -0
  144. package/dist/core/formatters/mount.d.cts +15 -0
  145. package/dist/core/formatters/mount.d.cts.map +1 -0
  146. package/dist/core/formatters/mount.d.mts +15 -0
  147. package/dist/core/formatters/mount.d.mts.map +1 -0
  148. package/dist/core/formatters/mount.mjs +55 -0
  149. package/dist/core/formatters/mount.mjs.map +1 -0
  150. package/dist/core/formatters/read.cjs +100 -0
  151. package/dist/core/formatters/read.d.cts +22 -0
  152. package/dist/core/formatters/read.d.cts.map +1 -0
  153. package/dist/core/formatters/read.d.mts +22 -0
  154. package/dist/core/formatters/read.d.mts.map +1 -0
  155. package/dist/core/formatters/read.mjs +100 -0
  156. package/dist/core/formatters/read.mjs.map +1 -0
  157. package/dist/core/formatters/search.cjs +44 -0
  158. package/dist/core/formatters/search.d.mts +1 -0
  159. package/dist/core/formatters/search.mjs +44 -0
  160. package/dist/core/formatters/search.mjs.map +1 -0
  161. package/dist/core/formatters/stat.cjs +155 -0
  162. package/dist/core/formatters/stat.d.cts +15 -0
  163. package/dist/core/formatters/stat.d.cts.map +1 -0
  164. package/dist/core/formatters/stat.d.mts +15 -0
  165. package/dist/core/formatters/stat.d.mts.map +1 -0
  166. package/dist/core/formatters/stat.mjs +155 -0
  167. package/dist/core/formatters/stat.mjs.map +1 -0
  168. package/dist/core/formatters/write.cjs +51 -0
  169. package/dist/core/formatters/write.d.cts +22 -0
  170. package/dist/core/formatters/write.d.cts.map +1 -0
  171. package/dist/core/formatters/write.d.mts +22 -0
  172. package/dist/core/formatters/write.d.mts.map +1 -0
  173. package/dist/core/formatters/write.mjs +51 -0
  174. package/dist/core/formatters/write.mjs.map +1 -0
  175. package/dist/core/helpers/exec-args.cjs +142 -0
  176. package/dist/core/helpers/exec-args.d.cts +46 -0
  177. package/dist/core/helpers/exec-args.d.cts.map +1 -0
  178. package/dist/core/helpers/exec-args.d.mts +46 -0
  179. package/dist/core/helpers/exec-args.d.mts.map +1 -0
  180. package/dist/core/helpers/exec-args.mjs +139 -0
  181. package/dist/core/helpers/exec-args.mjs.map +1 -0
  182. package/dist/core/helpers/stdin.cjs +41 -0
  183. package/dist/core/helpers/stdin.d.cts +15 -0
  184. package/dist/core/helpers/stdin.d.cts.map +1 -0
  185. package/dist/core/helpers/stdin.d.mts +15 -0
  186. package/dist/core/helpers/stdin.d.mts.map +1 -0
  187. package/dist/core/helpers/stdin.mjs +41 -0
  188. package/dist/core/helpers/stdin.mjs.map +1 -0
  189. package/dist/core/index.cjs +49 -0
  190. package/dist/core/index.d.cts +24 -0
  191. package/dist/core/index.d.mts +25 -0
  192. package/dist/core/index.mjs +24 -0
  193. package/dist/core/path-utils.cjs +1 -0
  194. package/dist/core/path-utils.mjs +3 -0
  195. package/dist/core/types.d.cts +24 -0
  196. package/dist/core/types.d.cts.map +1 -0
  197. package/dist/core/types.d.mts +24 -0
  198. package/dist/core/types.d.mts.map +1 -0
  199. package/dist/errors.cjs +0 -11
  200. package/dist/errors.mjs +1 -11
  201. package/dist/errors.mjs.map +1 -1
  202. package/dist/explorer/actions.cjs +67 -32
  203. package/dist/explorer/actions.mjs +66 -32
  204. package/dist/explorer/actions.mjs.map +1 -1
  205. package/dist/explorer/components/dialog.cjs +170 -46
  206. package/dist/explorer/components/dialog.mjs +170 -46
  207. package/dist/explorer/components/dialog.mjs.map +1 -1
  208. package/dist/explorer/components/metadata-panel.cjs +86 -3
  209. package/dist/explorer/components/metadata-panel.mjs +86 -3
  210. package/dist/explorer/components/metadata-panel.mjs.map +1 -1
  211. package/dist/explorer/screen.cjs +63 -27
  212. package/dist/explorer/screen.d.cts +23 -0
  213. package/dist/explorer/screen.d.cts.map +1 -0
  214. package/dist/explorer/screen.d.mts +23 -0
  215. package/dist/explorer/screen.d.mts.map +1 -0
  216. package/dist/explorer/screen.mjs +63 -27
  217. package/dist/explorer/screen.mjs.map +1 -1
  218. package/dist/explorer/theme.cjs +1 -1
  219. package/dist/explorer/theme.mjs +1 -1
  220. package/dist/explorer/theme.mjs.map +1 -1
  221. package/dist/index.cjs +7 -1
  222. package/dist/index.d.cts +4 -1
  223. package/dist/index.d.mts +4 -1
  224. package/dist/index.mjs +4 -1
  225. package/dist/mcp/http-transport.cjs +68 -0
  226. package/dist/mcp/http-transport.mjs +68 -0
  227. package/dist/mcp/http-transport.mjs.map +1 -0
  228. package/dist/mcp/prompts.cjs +48 -0
  229. package/dist/mcp/prompts.mjs +48 -0
  230. package/dist/mcp/prompts.mjs.map +1 -0
  231. package/dist/mcp/resources.cjs +25 -0
  232. package/dist/mcp/resources.mjs +25 -0
  233. package/dist/mcp/resources.mjs.map +1 -0
  234. package/dist/mcp/server.cjs +30 -0
  235. package/dist/mcp/server.mjs +30 -0
  236. package/dist/mcp/server.mjs.map +1 -0
  237. package/dist/mcp/tools.cjs +196 -0
  238. package/dist/mcp/tools.mjs +196 -0
  239. package/dist/mcp/tools.mjs.map +1 -0
  240. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.cts +10 -0
  241. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.cts.map +1 -0
  242. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.mts +10 -0
  243. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.mts.map +1 -0
  244. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.cts +46 -0
  245. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.cts.map +1 -0
  246. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.mts +46 -0
  247. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.mts.map +1 -0
  248. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/urlpattern.cjs +902 -0
  249. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/urlpattern.mjs +902 -0
  250. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/urlpattern.mjs.map +1 -0
  251. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/index.cjs +6 -0
  252. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/index.mjs +8 -0
  253. package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/index.mjs.map +1 -0
  254. package/dist/path-utils.d.cts +50 -0
  255. package/dist/path-utils.d.cts.map +1 -0
  256. package/dist/path-utils.d.mts +50 -0
  257. package/dist/path-utils.d.mts.map +1 -0
  258. package/dist/repl.cjs +485 -0
  259. package/dist/repl.d.cts +15 -0
  260. package/dist/repl.d.cts.map +1 -0
  261. package/dist/repl.d.mts +16 -0
  262. package/dist/repl.d.mts.map +1 -0
  263. package/dist/repl.mjs +485 -0
  264. package/dist/repl.mjs.map +1 -0
  265. package/dist/serve.cjs +146 -0
  266. package/dist/serve.d.cts +41 -0
  267. package/dist/serve.d.cts.map +1 -0
  268. package/dist/serve.d.mts +41 -0
  269. package/dist/serve.d.mts.map +1 -0
  270. package/dist/serve.mjs +146 -0
  271. package/dist/serve.mjs.map +1 -0
  272. package/dist/ui/header.cjs +1 -40
  273. package/dist/ui/header.mjs +1 -39
  274. package/dist/ui/header.mjs.map +1 -1
  275. package/dist/ui/index.cjs +2 -9
  276. package/dist/ui/index.mjs +2 -7
  277. package/dist/ui/index.mjs.map +1 -1
  278. package/dist/ui/terminal.cjs +1 -10
  279. package/dist/ui/terminal.mjs +1 -8
  280. package/dist/ui/terminal.mjs.map +1 -1
  281. package/package.json +29 -16
  282. package/dist/commands/exec.cjs +0 -164
  283. package/dist/commands/exec.mjs +0 -160
  284. package/dist/commands/exec.mjs.map +0 -1
  285. package/dist/commands/explain.cjs +0 -244
  286. package/dist/commands/explain.mjs +0 -242
  287. package/dist/commands/explain.mjs.map +0 -1
  288. package/dist/commands/index.cjs +0 -8
  289. package/dist/commands/index.mjs +0 -10
  290. package/dist/commands/ls.cjs +0 -242
  291. package/dist/commands/ls.mjs +0 -242
  292. package/dist/commands/ls.mjs.map +0 -1
  293. package/dist/commands/mount.mjs.map +0 -1
  294. package/dist/commands/read.cjs +0 -264
  295. package/dist/commands/read.mjs +0 -263
  296. package/dist/commands/read.mjs.map +0 -1
  297. package/dist/commands/serve.cjs +0 -144
  298. package/dist/commands/serve.mjs +0 -143
  299. package/dist/commands/serve.mjs.map +0 -1
  300. package/dist/commands/stat.cjs +0 -195
  301. package/dist/commands/stat.mjs +0 -195
  302. package/dist/commands/stat.mjs.map +0 -1
  303. package/dist/commands/write.cjs +0 -85
  304. package/dist/commands/write.mjs +0 -85
  305. package/dist/commands/write.mjs.map +0 -1
  306. package/dist/config/provider-factory.cjs +0 -400
  307. package/dist/config/provider-factory.mjs +0 -401
  308. package/dist/config/provider-factory.mjs.map +0 -1
  309. package/dist/config/uri-parser.cjs +0 -285
  310. package/dist/config/uri-parser.mjs +0 -285
  311. package/dist/config/uri-parser.mjs.map +0 -1
  312. package/dist/runtime.cjs +0 -120
  313. package/dist/runtime.mjs +0 -120
  314. package/dist/runtime.mjs.map +0 -1
  315. package/dist/utils/meta.cjs +0 -51
  316. package/dist/utils/meta.mjs +0 -49
  317. package/dist/utils/meta.mjs.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aigne/afs-cli",
3
- "version": "1.11.0-beta.6",
3
+ "version": "1.11.0-beta.7",
4
4
  "description": "AFS Command Line Interface",
5
5
  "license": "UNLICENSED",
6
6
  "publishConfig": {
@@ -31,6 +31,10 @@
31
31
  "require": "./dist/cli.cjs",
32
32
  "import": "./dist/cli.mjs"
33
33
  },
34
+ "./core": {
35
+ "require": "./dist/core/index.cjs",
36
+ "import": "./dist/core/index.mjs"
37
+ },
34
38
  "./*": "./*"
35
39
  },
36
40
  "files": [
@@ -40,31 +44,40 @@
40
44
  "CHANGELOG.md"
41
45
  ],
42
46
  "dependencies": {
47
+ "@modelcontextprotocol/sdk": "^1.25.3",
43
48
  "blessed": "^0.1.81",
44
49
  "smol-toml": "^1.3.1",
50
+ "ufo": "^1.6.3",
51
+ "urlpattern-polyfill": "^10.1.0",
45
52
  "yaml": "^2.8.2",
46
53
  "yargs": "^17.7.2",
54
+ "yargs-parser": "^22.0.0",
47
55
  "zod": "^3.24.1",
48
- "@aigne/afs": "1.11.0-beta.6",
49
- "@aigne/afs-fs": "1.11.0-beta.6",
50
- "@aigne/afs-git": "1.11.0-beta.6",
51
- "@aigne/afs-github": "1.11.0-beta.6",
52
- "@aigne/afs-http": "1.11.0-beta.6",
53
- "@aigne/afs-json": "1.11.0-beta.6",
54
- "@aigne/afs-toml": "1.11.0-beta.6",
55
- "@aigne/afs-s3": "1.11.0-beta.6",
56
- "@aigne/afs-gcs": "1.11.0-beta.6",
57
- "@aigne/afs-ec2": "1.11.0-beta.6",
58
- "@aigne/afs-gce": "1.11.0-beta.6",
59
- "@aigne/afs-dns": "1.11.0-beta.6",
60
- "@aigne/afs-mcp": "1.11.0-beta.6",
61
- "@aigne/afs-sqlite": "1.11.0-beta.6",
62
- "@aigne/afs-sandbox": "1.11.0-beta.6"
56
+ "@aigne/afs-dns": "1.11.0-beta.7",
57
+ "@aigne/afs-ec2": "1.11.0-beta.7",
58
+ "@aigne/afs": "1.11.0-beta.7",
59
+ "@aigne/afs-fs": "1.11.0-beta.7",
60
+ "@aigne/afs-gce": "1.11.0-beta.7",
61
+ "@aigne/afs-gcs": "1.11.0-beta.7",
62
+ "@aigne/afs-git": "1.11.0-beta.7",
63
+ "@aigne/afs-github": "1.11.0-beta.7",
64
+ "@aigne/afs-http": "1.11.0-beta.7",
65
+ "@aigne/afs-json": "1.11.0-beta.7",
66
+ "@aigne/afs-mcp": "1.11.0-beta.7",
67
+ "@aigne/afs-provider-registry": "1.11.0-beta.7",
68
+ "@aigne/afs-registry": "1.11.0-beta.7",
69
+ "@aigne/afs-s3": "1.11.0-beta.7",
70
+ "@aigne/afs-sandbox": "1.11.0-beta.7",
71
+ "@aigne/afs-sqlite": "1.11.0-beta.7",
72
+ "@aigne/afs-toml": "1.11.0-beta.7",
73
+ "@aigne/afs-workspace": "1.11.0-beta.7"
63
74
  },
64
75
  "devDependencies": {
76
+ "@modelcontextprotocol/server-everything": "^2026.1.26",
65
77
  "@types/blessed": "^0.1.25",
66
78
  "@types/bun": "^1.3.6",
67
79
  "@types/yargs": "^17.0.33",
80
+ "@types/yargs-parser": "^21.0.3",
68
81
  "npm-run-all": "^4.1.5",
69
82
  "rimraf": "^6.1.2",
70
83
  "tsdown": "0.20.0-beta.3",
@@ -1,164 +0,0 @@
1
- const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
2
- let yaml = require("yaml");
3
- yaml = require_rolldown_runtime.__toESM(yaml);
4
-
5
- //#region src/commands/exec.ts
6
- /**
7
- * Reserved CLI option names that should not be passed as exec arguments
8
- */
9
- const RESERVED_OPTIONS = new Set([
10
- "json",
11
- "yaml",
12
- "view",
13
- "help",
14
- "h",
15
- "version",
16
- "V",
17
- "_",
18
- "$0",
19
- "args"
20
- ]);
21
- /**
22
- * Read JSON from stdin (non-blocking if TTY)
23
- */
24
- async function readStdin() {
25
- if (process.stdin.isTTY) return null;
26
- const chunks = [];
27
- for await (const chunk of process.stdin) chunks.push(chunk);
28
- return Buffer.concat(chunks).toString("utf-8").trim() || null;
29
- }
30
- /**
31
- * Parse exec arguments with stdin support (async version)
32
- *
33
- * Priority: CLI flags > stdin > --args
34
- */
35
- async function parseExecArgsWithStdin(options) {
36
- let result = {};
37
- if (options.args && typeof options.args === "string") try {
38
- const parsed = JSON.parse(options.args);
39
- if (typeof parsed === "object" && parsed !== null) result = { ...parsed };
40
- } catch (e) {
41
- throw new Error(`Invalid JSON in --args: ${e.message}`);
42
- }
43
- const stdinContent = await readStdin();
44
- if (stdinContent) try {
45
- const parsed = JSON.parse(stdinContent);
46
- if (typeof parsed === "object" && parsed !== null) result = {
47
- ...result,
48
- ...parsed
49
- };
50
- } catch (e) {
51
- throw new Error(`Invalid JSON in stdin: ${e.message}`);
52
- }
53
- for (const [key, value] of Object.entries(options)) {
54
- if (RESERVED_OPTIONS.has(key) || value === void 0 || value === null) continue;
55
- result[key] = value;
56
- }
57
- return result;
58
- }
59
- /**
60
- * Check if an entry is executable based on its metadata
61
- *
62
- * An entry is executable if:
63
- * 1. Its `kinds` array includes "afs:executable", OR
64
- * 2. Its `kind` field equals "afs:executable" (legacy support)
65
- */
66
- function isExecutable(metadata) {
67
- if (!metadata) return false;
68
- if (Array.isArray(metadata.kinds)) return metadata.kinds.includes("afs:executable");
69
- return metadata.kind === "afs:executable";
70
- }
71
- /**
72
- * Execute an action on an AFS path
73
- *
74
- * This function directly executes the path without pre-checking if it's executable.
75
- * The provider will return an appropriate error if the path is not executable.
76
- *
77
- * @param runtime - AFS runtime
78
- * @param path - Path to execute
79
- * @param args - Arguments to pass to the executable
80
- * @returns Exec result
81
- */
82
- async function execCommand(runtime, path, args = {}) {
83
- try {
84
- const execResult = await runtime.exec(path, args);
85
- return {
86
- path,
87
- success: execResult.success,
88
- data: execResult.data,
89
- message: execResult.error?.message,
90
- error: execResult.error
91
- };
92
- } catch (error) {
93
- const errorCode = extractErrorCode(error);
94
- return {
95
- path,
96
- success: false,
97
- message: error instanceof Error ? error.message : String(error),
98
- error: errorCode ? { code: errorCode } : void 0
99
- };
100
- }
101
- }
102
- /**
103
- * Extract error code from an error object
104
- */
105
- function extractErrorCode(error) {
106
- if (!error || typeof error !== "object") return void 0;
107
- if ("code" in error && typeof error.code === "string") return error.code;
108
- }
109
- /**
110
- * Format exec output for different views
111
- */
112
- function formatExecOutput(result, view) {
113
- switch (view) {
114
- case "json": return JSON.stringify(result, null, 2);
115
- case "yaml": return yaml.default.stringify(result);
116
- case "llm": return formatLlm(result);
117
- case "human": return formatHuman(result);
118
- default: return formatDefault(result);
119
- }
120
- }
121
- function formatDefault(result) {
122
- if (result.success) {
123
- if (result.data) return JSON.stringify(result.data);
124
- return `OK ${result.path}`;
125
- }
126
- return `${result.error?.code || "ERROR"} ${result.path} ${result.message || ""}`.trim();
127
- }
128
- function formatLlm(result) {
129
- const lines = [];
130
- lines.push(`EXEC ${result.path}`);
131
- lines.push(`STATUS ${result.success ? "SUCCESS" : "FAILED"}`);
132
- if (result.data) lines.push(`DATA ${JSON.stringify(result.data)}`);
133
- if (!result.success && result.error) {
134
- if (result.error.code) lines.push(`ERROR ${result.error.code}`);
135
- if (result.message) lines.push(`MESSAGE ${result.message}`);
136
- if (result.error.details) lines.push(`DETAILS ${JSON.stringify(result.error.details)}`);
137
- } else if (result.message) lines.push(`MESSAGE ${result.message}`);
138
- return lines.join("\n");
139
- }
140
- function formatHuman(result) {
141
- if (result.success) {
142
- const lines$1 = [`✓ Executed: ${result.path}`];
143
- if (result.data) {
144
- lines$1.push("");
145
- lines$1.push(JSON.stringify(result.data, null, 2));
146
- }
147
- return lines$1.join("\n");
148
- }
149
- const lines = [`✗ Failed: ${result.path}`];
150
- lines.push("");
151
- if (result.error?.code) lines.push(`Error: ${result.error.code}`);
152
- if (result.message) lines.push(`Message: ${result.message}`);
153
- if (result.error?.details) {
154
- lines.push("Details:");
155
- for (const [key, value] of Object.entries(result.error.details)) lines.push(` ${key}: ${JSON.stringify(value)}`);
156
- }
157
- return lines.join("\n");
158
- }
159
-
160
- //#endregion
161
- exports.execCommand = execCommand;
162
- exports.formatExecOutput = formatExecOutput;
163
- exports.isExecutable = isExecutable;
164
- exports.parseExecArgsWithStdin = parseExecArgsWithStdin;
@@ -1,160 +0,0 @@
1
- import YAML from "yaml";
2
-
3
- //#region src/commands/exec.ts
4
- /**
5
- * Reserved CLI option names that should not be passed as exec arguments
6
- */
7
- const RESERVED_OPTIONS = new Set([
8
- "json",
9
- "yaml",
10
- "view",
11
- "help",
12
- "h",
13
- "version",
14
- "V",
15
- "_",
16
- "$0",
17
- "args"
18
- ]);
19
- /**
20
- * Read JSON from stdin (non-blocking if TTY)
21
- */
22
- async function readStdin() {
23
- if (process.stdin.isTTY) return null;
24
- const chunks = [];
25
- for await (const chunk of process.stdin) chunks.push(chunk);
26
- return Buffer.concat(chunks).toString("utf-8").trim() || null;
27
- }
28
- /**
29
- * Parse exec arguments with stdin support (async version)
30
- *
31
- * Priority: CLI flags > stdin > --args
32
- */
33
- async function parseExecArgsWithStdin(options) {
34
- let result = {};
35
- if (options.args && typeof options.args === "string") try {
36
- const parsed = JSON.parse(options.args);
37
- if (typeof parsed === "object" && parsed !== null) result = { ...parsed };
38
- } catch (e) {
39
- throw new Error(`Invalid JSON in --args: ${e.message}`);
40
- }
41
- const stdinContent = await readStdin();
42
- if (stdinContent) try {
43
- const parsed = JSON.parse(stdinContent);
44
- if (typeof parsed === "object" && parsed !== null) result = {
45
- ...result,
46
- ...parsed
47
- };
48
- } catch (e) {
49
- throw new Error(`Invalid JSON in stdin: ${e.message}`);
50
- }
51
- for (const [key, value] of Object.entries(options)) {
52
- if (RESERVED_OPTIONS.has(key) || value === void 0 || value === null) continue;
53
- result[key] = value;
54
- }
55
- return result;
56
- }
57
- /**
58
- * Check if an entry is executable based on its metadata
59
- *
60
- * An entry is executable if:
61
- * 1. Its `kinds` array includes "afs:executable", OR
62
- * 2. Its `kind` field equals "afs:executable" (legacy support)
63
- */
64
- function isExecutable(metadata) {
65
- if (!metadata) return false;
66
- if (Array.isArray(metadata.kinds)) return metadata.kinds.includes("afs:executable");
67
- return metadata.kind === "afs:executable";
68
- }
69
- /**
70
- * Execute an action on an AFS path
71
- *
72
- * This function directly executes the path without pre-checking if it's executable.
73
- * The provider will return an appropriate error if the path is not executable.
74
- *
75
- * @param runtime - AFS runtime
76
- * @param path - Path to execute
77
- * @param args - Arguments to pass to the executable
78
- * @returns Exec result
79
- */
80
- async function execCommand(runtime, path, args = {}) {
81
- try {
82
- const execResult = await runtime.exec(path, args);
83
- return {
84
- path,
85
- success: execResult.success,
86
- data: execResult.data,
87
- message: execResult.error?.message,
88
- error: execResult.error
89
- };
90
- } catch (error) {
91
- const errorCode = extractErrorCode(error);
92
- return {
93
- path,
94
- success: false,
95
- message: error instanceof Error ? error.message : String(error),
96
- error: errorCode ? { code: errorCode } : void 0
97
- };
98
- }
99
- }
100
- /**
101
- * Extract error code from an error object
102
- */
103
- function extractErrorCode(error) {
104
- if (!error || typeof error !== "object") return void 0;
105
- if ("code" in error && typeof error.code === "string") return error.code;
106
- }
107
- /**
108
- * Format exec output for different views
109
- */
110
- function formatExecOutput(result, view) {
111
- switch (view) {
112
- case "json": return JSON.stringify(result, null, 2);
113
- case "yaml": return YAML.stringify(result);
114
- case "llm": return formatLlm(result);
115
- case "human": return formatHuman(result);
116
- default: return formatDefault(result);
117
- }
118
- }
119
- function formatDefault(result) {
120
- if (result.success) {
121
- if (result.data) return JSON.stringify(result.data);
122
- return `OK ${result.path}`;
123
- }
124
- return `${result.error?.code || "ERROR"} ${result.path} ${result.message || ""}`.trim();
125
- }
126
- function formatLlm(result) {
127
- const lines = [];
128
- lines.push(`EXEC ${result.path}`);
129
- lines.push(`STATUS ${result.success ? "SUCCESS" : "FAILED"}`);
130
- if (result.data) lines.push(`DATA ${JSON.stringify(result.data)}`);
131
- if (!result.success && result.error) {
132
- if (result.error.code) lines.push(`ERROR ${result.error.code}`);
133
- if (result.message) lines.push(`MESSAGE ${result.message}`);
134
- if (result.error.details) lines.push(`DETAILS ${JSON.stringify(result.error.details)}`);
135
- } else if (result.message) lines.push(`MESSAGE ${result.message}`);
136
- return lines.join("\n");
137
- }
138
- function formatHuman(result) {
139
- if (result.success) {
140
- const lines$1 = [`✓ Executed: ${result.path}`];
141
- if (result.data) {
142
- lines$1.push("");
143
- lines$1.push(JSON.stringify(result.data, null, 2));
144
- }
145
- return lines$1.join("\n");
146
- }
147
- const lines = [`✗ Failed: ${result.path}`];
148
- lines.push("");
149
- if (result.error?.code) lines.push(`Error: ${result.error.code}`);
150
- if (result.message) lines.push(`Message: ${result.message}`);
151
- if (result.error?.details) {
152
- lines.push("Details:");
153
- for (const [key, value] of Object.entries(result.error.details)) lines.push(` ${key}: ${JSON.stringify(value)}`);
154
- }
155
- return lines.join("\n");
156
- }
157
-
158
- //#endregion
159
- export { execCommand, formatExecOutput, isExecutable, parseExecArgsWithStdin };
160
- //# sourceMappingURL=exec.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"exec.mjs","names":["lines"],"sources":["../../src/commands/exec.ts"],"sourcesContent":["import type { AFSEntryMetadata } from \"@aigne/afs\";\nimport YAML from \"yaml\";\nimport type { AFSRuntime } from \"../runtime.js\";\nimport type { ViewType } from \"./ls.js\";\n\n/**\n * Extended view type that includes yaml\n */\nexport type ExecViewType = ViewType | \"yaml\";\n\nexport interface ExecResult {\n path: string;\n success: boolean;\n data?: Record<string, unknown>;\n message?: string;\n error?: {\n code?: string;\n message?: string;\n details?: Record<string, unknown>;\n };\n}\n\n/**\n * Reserved CLI option names that should not be passed as exec arguments\n */\nconst RESERVED_OPTIONS = new Set([\n \"json\",\n \"yaml\",\n \"view\",\n \"help\",\n \"h\",\n \"version\",\n \"V\",\n \"_\", // yargs positional args array\n \"$0\", // yargs script name\n \"args\", // our --args option (processed separately)\n]);\n\n/**\n * Read JSON from stdin (non-blocking if TTY)\n */\nasync function readStdin(): Promise<string | null> {\n // Only read from stdin if it's not a TTY (i.e., there's pipe input)\n if (process.stdin.isTTY) {\n return null;\n }\n\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(chunk as Buffer);\n }\n const content = Buffer.concat(chunks).toString(\"utf-8\").trim();\n return content || null;\n}\n\n/**\n * Parse exec arguments from CLI options with stdin support\n *\n * Priority: CLI flags > stdin > --args\n *\n * Supports three input sources:\n * 1. JSON via --args: `afs exec /path --args '{\"key\": \"value\"}'`\n * 2. JSON via stdin: `echo '{\"key\": \"value\"}' | afs exec /path`\n * 3. Named parameters: `afs exec /path --sql \"SELECT * FROM users\" --limit 10`\n */\nexport function parseExecArgs(options: Record<string, unknown>): Record<string, unknown> {\n let result: Record<string, unknown> = {};\n\n // Parse --args JSON if provided (lowest priority)\n if (options.args && typeof options.args === \"string\") {\n try {\n const parsed = JSON.parse(options.args);\n if (typeof parsed === \"object\" && parsed !== null) {\n result = { ...parsed };\n }\n } catch (e) {\n throw new Error(`Invalid JSON in --args: ${(e as Error).message}`);\n }\n }\n\n // Add named parameters (overwrite JSON args if same key) - highest priority\n for (const [key, value] of Object.entries(options)) {\n // Skip reserved options and undefined/null values\n if (RESERVED_OPTIONS.has(key) || value === undefined || value === null) {\n continue;\n }\n result[key] = value;\n }\n\n return result;\n}\n\n/**\n * Parse exec arguments with stdin support (async version)\n *\n * Priority: CLI flags > stdin > --args\n */\nexport async function parseExecArgsWithStdin(\n options: Record<string, unknown>,\n): Promise<Record<string, unknown>> {\n let result: Record<string, unknown> = {};\n\n // 1. Parse --args JSON if provided (lowest priority)\n if (options.args && typeof options.args === \"string\") {\n try {\n const parsed = JSON.parse(options.args);\n if (typeof parsed === \"object\" && parsed !== null) {\n result = { ...parsed };\n }\n } catch (e) {\n throw new Error(`Invalid JSON in --args: ${(e as Error).message}`);\n }\n }\n\n // 2. Read from stdin if available (medium priority)\n const stdinContent = await readStdin();\n if (stdinContent) {\n try {\n const parsed = JSON.parse(stdinContent);\n if (typeof parsed === \"object\" && parsed !== null) {\n result = { ...result, ...parsed };\n }\n } catch (e) {\n throw new Error(`Invalid JSON in stdin: ${(e as Error).message}`);\n }\n }\n\n // 3. Add named CLI parameters (highest priority)\n for (const [key, value] of Object.entries(options)) {\n if (RESERVED_OPTIONS.has(key) || value === undefined || value === null) {\n continue;\n }\n result[key] = value;\n }\n\n return result;\n}\n\n/**\n * Check if an entry is executable based on its metadata\n *\n * An entry is executable if:\n * 1. Its `kinds` array includes \"afs:executable\", OR\n * 2. Its `kind` field equals \"afs:executable\" (legacy support)\n */\nexport function isExecutable(metadata: AFSEntryMetadata | null | undefined): boolean {\n if (!metadata) return false;\n\n // Check kinds array first (new way)\n if (Array.isArray(metadata.kinds)) {\n return metadata.kinds.includes(\"afs:executable\");\n }\n\n // Fall back to kind field (legacy)\n return metadata.kind === \"afs:executable\";\n}\n\n/**\n * Execute an action on an AFS path\n *\n * This function directly executes the path without pre-checking if it's executable.\n * The provider will return an appropriate error if the path is not executable.\n *\n * @param runtime - AFS runtime\n * @param path - Path to execute\n * @param args - Arguments to pass to the executable\n * @returns Exec result\n */\nexport async function execCommand(\n runtime: AFSRuntime,\n path: string,\n args: Record<string, unknown> = {},\n): Promise<ExecResult> {\n try {\n // Execute directly - let provider handle validation\n const execResult = await runtime.exec(path, args);\n\n return {\n path,\n success: execResult.success,\n data: execResult.data,\n message: execResult.error?.message,\n error: execResult.error,\n };\n } catch (error) {\n // Extract error code if available\n const errorCode = extractErrorCode(error);\n\n return {\n path,\n success: false,\n message: error instanceof Error ? error.message : String(error),\n error: errorCode ? { code: errorCode } : undefined,\n };\n }\n}\n\n/**\n * Extract error code from an error object\n */\nfunction extractErrorCode(error: unknown): string | undefined {\n if (!error || typeof error !== \"object\") return undefined;\n if (\"code\" in error && typeof (error as { code: unknown }).code === \"string\") {\n return (error as { code: string }).code;\n }\n return undefined;\n}\n\n/**\n * Format exec output for different views\n */\nexport function formatExecOutput(result: ExecResult, view: ExecViewType): string {\n switch (view) {\n case \"json\":\n return JSON.stringify(result, null, 2);\n case \"yaml\":\n return YAML.stringify(result);\n case \"llm\":\n return formatLlm(result);\n case \"human\":\n return formatHuman(result);\n default:\n return formatDefault(result);\n }\n}\n\nfunction formatDefault(result: ExecResult): string {\n if (result.success) {\n if (result.data) {\n return JSON.stringify(result.data);\n }\n return `OK ${result.path}`;\n }\n const errorCode = result.error?.code || \"ERROR\";\n return `${errorCode} ${result.path} ${result.message || \"\"}`.trim();\n}\n\nfunction formatLlm(result: ExecResult): string {\n const lines: string[] = [];\n\n lines.push(`EXEC ${result.path}`);\n lines.push(`STATUS ${result.success ? \"SUCCESS\" : \"FAILED\"}`);\n\n if (result.data) {\n lines.push(`DATA ${JSON.stringify(result.data)}`);\n }\n\n if (!result.success && result.error) {\n if (result.error.code) {\n lines.push(`ERROR ${result.error.code}`);\n }\n if (result.message) {\n lines.push(`MESSAGE ${result.message}`);\n }\n if (result.error.details) {\n lines.push(`DETAILS ${JSON.stringify(result.error.details)}`);\n }\n } else if (result.message) {\n lines.push(`MESSAGE ${result.message}`);\n }\n\n return lines.join(\"\\n\");\n}\n\nfunction formatHuman(result: ExecResult): string {\n if (result.success) {\n const lines = [`✓ Executed: ${result.path}`];\n if (result.data) {\n lines.push(\"\");\n lines.push(JSON.stringify(result.data, null, 2));\n }\n return lines.join(\"\\n\");\n }\n\n const lines = [`✗ Failed: ${result.path}`];\n lines.push(\"\");\n if (result.error?.code) {\n lines.push(`Error: ${result.error.code}`);\n }\n if (result.message) {\n lines.push(`Message: ${result.message}`);\n }\n if (result.error?.details) {\n lines.push(\"Details:\");\n for (const [key, value] of Object.entries(result.error.details)) {\n lines.push(` ${key}: ${JSON.stringify(value)}`);\n }\n }\n return lines.join(\"\\n\");\n}\n"],"mappings":"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"}
@@ -1,244 +0,0 @@
1
- const require_mount = require('./mount.cjs');
2
-
3
- //#region src/commands/explain.ts
4
- /**
5
- * Explain AFS concepts or current configuration
6
- */
7
- async function explainCommand(cwd, topic) {
8
- switch (topic) {
9
- case "mount":
10
- case "mounts": return explainMounts(cwd);
11
- case "path":
12
- case "paths": return explainPaths();
13
- case "uri": return explainUri();
14
- default: return explainOverview();
15
- }
16
- }
17
- /**
18
- * Explain an AFS object at a given path
19
- */
20
- async function explainPathCommand(runtime, path) {
21
- const entry = (await runtime.read(path)).data;
22
- if (!entry) return {
23
- path,
24
- type: "unknown"
25
- };
26
- const metadata = entry.metadata || {};
27
- const entryType = metadata.kind === "afs:executable" ? "exec" : typeof metadata.childrenCount === "number" ? "directory" : "file";
28
- const result = {
29
- path: entry.path,
30
- type: entryType,
31
- description: metadata.description,
32
- metadata: {}
33
- };
34
- if (metadata.provider) result.metadata.provider = String(metadata.provider);
35
- if (metadata.permissions) {
36
- const perms = metadata.permissions;
37
- result.metadata.permissions = Array.isArray(perms) ? perms.join(", ") : String(perms);
38
- }
39
- if (entryType === "exec") {
40
- if (metadata.inputs) result.inputs = Array.isArray(metadata.inputs) ? metadata.inputs : [String(metadata.inputs)];
41
- if (metadata.outputs) result.outputs = Array.isArray(metadata.outputs) ? metadata.outputs : [String(metadata.outputs)];
42
- if (metadata.errors) result.errors = Array.isArray(metadata.errors) ? metadata.errors : [String(metadata.errors)];
43
- if (metadata.sideEffects) result.sideEffects = Array.isArray(metadata.sideEffects) ? metadata.sideEffects : [String(metadata.sideEffects)];
44
- }
45
- if (Object.keys(result.metadata).length === 0) delete result.metadata;
46
- return result;
47
- }
48
- function explainOverview() {
49
- return {
50
- topic: "AFS Overview",
51
- explanation: `AFS (Abstract File System) is a virtual filesystem that unifies different data sources into a single namespace.
52
-
53
- Core Concepts:
54
- - mount: Mount a data source to a virtual path
55
- - path: Virtual path, e.g., /src, /data
56
- - uri: Data source address, e.g., fs://, git://, sqlite://
57
-
58
- Data Flow:
59
- User Path -> AFS -> /modules/{name} -> Provider -> Actual Data`,
60
- examples: [
61
- "afs mount add /src fs:///path/to/source",
62
- "afs ls /modules/src",
63
- "afs read /modules/src/file.txt"
64
- ]
65
- };
66
- }
67
- async function explainMounts(cwd) {
68
- const result = await require_mount.mountListCommand(cwd);
69
- if (result.mounts.length === 0) return {
70
- topic: "Mounts",
71
- explanation: `No mounts configured.
72
-
73
- Use mount add to add a mount:
74
- afs mount add <path> <uri>
75
-
76
- path: Virtual path for accessing data in AFS
77
- uri: Data source URI specifying the data origin`,
78
- examples: ["afs mount add /src fs:///Users/me/project", "afs mount add /data sqlite:///data.db"]
79
- };
80
- return {
81
- topic: "Mounts",
82
- explanation: `Current mount configuration:
83
-
84
- ${result.mounts.map((m) => ` ${m.path} → ${m.uri}${m.description ? ` (${m.description})` : ""}`).join("\n")}
85
-
86
- After mounting, data is accessed via /modules/{name}:
87
- path="/src" -> /modules/src`,
88
- examples: result.mounts.map((m) => {
89
- return `afs ls /modules/${m.path.slice(1).replace(/\//g, "-") || "root"}`;
90
- })
91
- };
92
- }
93
- function explainPaths() {
94
- return {
95
- topic: "Paths",
96
- explanation: `AFS Path Structure:
97
-
98
- / Root directory
99
- /modules All mounted modules
100
- /modules/{name} Specific module, name derived from mount path
101
-
102
- Path Mapping:
103
- config: path="/src" -> access: /modules/src
104
- config: path="/data" -> access: /modules/data
105
-
106
- Note: The path configured by user is transformed to /modules/{name}`
107
- };
108
- }
109
- function explainUri() {
110
- return {
111
- topic: "URI",
112
- explanation: `AFS URI Schemes and Objects:
113
-
114
- fs:// Local Filesystem Provider
115
- Format: fs:///absolute/path or fs://./relative/path
116
- Objects:
117
- - directory: folder entries, supports list
118
- - file: file entries, supports read/write
119
- Operations: list, read, write, delete
120
-
121
- git:// Git Repository Provider
122
- Format: git:///local/repo or git://github.com/user/repo?branch=main
123
- Objects:
124
- - directory: tree entries
125
- - file: blob entries, read-only
126
- Operations: list, read
127
-
128
- sqlite:// SQLite Database Provider
129
- Format: sqlite:///path/to/db.sqlite
130
- Objects:
131
- - directory: database root, tables list
132
- - exec: table entries, supports query operations
133
- Operations: list, read, exec (SQL queries)
134
-
135
- json:// JSON Data Provider
136
- Format: json:///path/to/data.json
137
- Objects:
138
- - directory: object/array entries
139
- - file: primitive values
140
- Operations: list, read, write`,
141
- examples: [
142
- "afs mount add /src fs:///Users/me/project",
143
- "afs mount add /repo git://github.com/user/repo",
144
- "afs mount add /db sqlite:///data.sqlite"
145
- ]
146
- };
147
- }
148
- /**
149
- * Format explain output for different views
150
- */
151
- function formatExplainOutput(result, view) {
152
- switch (view) {
153
- case "json": return JSON.stringify(result, null, 2);
154
- case "llm": return formatLlm(result);
155
- default: return formatDefault(result);
156
- }
157
- }
158
- function formatDefault(result) {
159
- let output = `${result.topic}\n${"=".repeat(result.topic.length)}\n\n${result.explanation}`;
160
- if (result.examples && result.examples.length > 0) output += `\n\nExamples:\n${result.examples.map((e) => ` $ ${e}`).join("\n")}`;
161
- return output;
162
- }
163
- function formatLlm(result) {
164
- const lines = [
165
- `TOPIC ${result.topic}`,
166
- "",
167
- result.explanation
168
- ];
169
- if (result.examples && result.examples.length > 0) {
170
- lines.push("", "EXAMPLES");
171
- for (const example of result.examples) lines.push(`CMD ${example}`);
172
- }
173
- return lines.join("\n");
174
- }
175
- /**
176
- * Format object explain output for different views
177
- */
178
- function formatPathExplainOutput(result, view) {
179
- switch (view) {
180
- case "json": return JSON.stringify(result, null, 2);
181
- case "llm": return formatPathLlm(result);
182
- default: return formatPathDefault(result);
183
- }
184
- }
185
- function formatPathDefault(result) {
186
- const lines = [];
187
- lines.push(`PATH ${result.path}`);
188
- lines.push("");
189
- lines.push("TYPE");
190
- lines.push(result.type);
191
- if (result.description) {
192
- lines.push("");
193
- lines.push("DESCRIPTION");
194
- lines.push(result.description);
195
- }
196
- if (result.inputs && result.inputs.length > 0) {
197
- lines.push("");
198
- lines.push("INPUTS");
199
- for (const input of result.inputs) lines.push(`- ${input}`);
200
- }
201
- if (result.outputs && result.outputs.length > 0) {
202
- lines.push("");
203
- lines.push("OUTPUTS");
204
- for (const output of result.outputs) lines.push(`- ${output}`);
205
- }
206
- if (result.errors && result.errors.length > 0) {
207
- lines.push("");
208
- lines.push("ERRORS");
209
- for (const error of result.errors) lines.push(`- ${error}`);
210
- }
211
- if (result.sideEffects && result.sideEffects.length > 0) {
212
- lines.push("");
213
- lines.push("SIDE EFFECTS");
214
- for (const effect of result.sideEffects) lines.push(`- ${effect}`);
215
- } else {
216
- lines.push("");
217
- lines.push("SIDE EFFECTS");
218
- lines.push("- none");
219
- }
220
- if (result.metadata && Object.keys(result.metadata).length > 0) {
221
- lines.push("");
222
- lines.push("METADATA");
223
- for (const [key, value] of Object.entries(result.metadata)) lines.push(`- ${key}: ${value}`);
224
- }
225
- return lines.join("\n");
226
- }
227
- function formatPathLlm(result) {
228
- const lines = [];
229
- lines.push(`PATH ${result.path}`);
230
- lines.push(`TYPE ${result.type.toUpperCase()}`);
231
- if (result.description) lines.push(`DESC ${result.description}`);
232
- if (result.inputs && result.inputs.length > 0) lines.push(`INPUTS ${result.inputs.join(", ")}`);
233
- if (result.outputs && result.outputs.length > 0) lines.push(`OUTPUTS ${result.outputs.join(", ")}`);
234
- if (result.errors && result.errors.length > 0) lines.push(`ERRORS ${result.errors.join(", ")}`);
235
- lines.push(`SIDE_EFFECTS ${result.sideEffects?.join(", ") || "none"}`);
236
- if (result.metadata) for (const [key, value] of Object.entries(result.metadata)) lines.push(`${key.toUpperCase()} ${value}`);
237
- return lines.join("\n");
238
- }
239
-
240
- //#endregion
241
- exports.explainCommand = explainCommand;
242
- exports.explainPathCommand = explainPathCommand;
243
- exports.formatExplainOutput = formatExplainOutput;
244
- exports.formatPathExplainOutput = formatPathExplainOutput;