@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.
- package/dist/cli.cjs +27 -353
- package/dist/cli.d.cts +2 -1
- package/dist/cli.d.mts +2 -1
- package/dist/cli.mjs +28 -353
- package/dist/cli.mjs.map +1 -1
- package/dist/config/afs-loader.cjs +123 -0
- package/dist/config/afs-loader.d.cts +14 -0
- package/dist/config/afs-loader.d.cts.map +1 -0
- package/dist/config/afs-loader.d.mts +14 -0
- package/dist/config/afs-loader.d.mts.map +1 -0
- package/dist/config/afs-loader.mjs +122 -0
- package/dist/config/afs-loader.mjs.map +1 -0
- package/dist/config/loader.cjs +2 -2
- package/dist/config/loader.mjs +2 -2
- package/dist/{commands/mount.cjs → config/mount-commands.cjs} +13 -49
- package/dist/config/mount-commands.d.cts +20 -0
- package/dist/config/mount-commands.d.cts.map +1 -0
- package/dist/config/mount-commands.d.mts +20 -0
- package/dist/config/mount-commands.d.mts.map +1 -0
- package/dist/{commands/mount.mjs → config/mount-commands.mjs} +14 -49
- package/dist/config/mount-commands.mjs.map +1 -0
- package/dist/config/schema.cjs +9 -1
- package/dist/config/schema.mjs +9 -1
- package/dist/config/schema.mjs.map +1 -1
- package/dist/core/commands/delete.cjs +41 -0
- package/dist/core/commands/delete.d.cts +18 -0
- package/dist/core/commands/delete.d.cts.map +1 -0
- package/dist/core/commands/delete.d.mts +18 -0
- package/dist/core/commands/delete.d.mts.map +1 -0
- package/dist/core/commands/delete.mjs +42 -0
- package/dist/core/commands/delete.mjs.map +1 -0
- package/dist/core/commands/exec.cjs +95 -0
- package/dist/core/commands/exec.d.cts +26 -0
- package/dist/core/commands/exec.d.cts.map +1 -0
- package/dist/core/commands/exec.d.mts +26 -0
- package/dist/core/commands/exec.d.mts.map +1 -0
- package/dist/core/commands/exec.mjs +96 -0
- package/dist/core/commands/exec.mjs.map +1 -0
- package/dist/core/commands/explain.cjs +254 -0
- package/dist/core/commands/explain.d.cts +25 -0
- package/dist/core/commands/explain.d.cts.map +1 -0
- package/dist/core/commands/explain.d.mts +25 -0
- package/dist/core/commands/explain.d.mts.map +1 -0
- package/dist/core/commands/explain.mjs +255 -0
- package/dist/core/commands/explain.mjs.map +1 -0
- package/dist/core/commands/explore.cjs +30 -0
- package/dist/core/commands/explore.d.mts +2 -0
- package/dist/core/commands/explore.mjs +31 -0
- package/dist/core/commands/explore.mjs.map +1 -0
- package/dist/core/commands/index.cjs +36 -0
- package/dist/core/commands/index.d.cts +21 -0
- package/dist/core/commands/index.d.cts.map +1 -0
- package/dist/core/commands/index.d.mts +24 -0
- package/dist/core/commands/index.d.mts.map +1 -0
- package/dist/core/commands/index.mjs +37 -0
- package/dist/core/commands/index.mjs.map +1 -0
- package/dist/core/commands/ls.cjs +57 -0
- package/dist/core/commands/ls.d.cts +21 -0
- package/dist/core/commands/ls.d.cts.map +1 -0
- package/dist/core/commands/ls.d.mts +21 -0
- package/dist/core/commands/ls.d.mts.map +1 -0
- package/dist/core/commands/ls.mjs +58 -0
- package/dist/core/commands/ls.mjs.map +1 -0
- package/dist/core/commands/mount.cjs +139 -0
- package/dist/core/commands/mount.d.cts +33 -0
- package/dist/core/commands/mount.d.cts.map +1 -0
- package/dist/core/commands/mount.d.mts +33 -0
- package/dist/core/commands/mount.d.mts.map +1 -0
- package/dist/core/commands/mount.mjs +140 -0
- package/dist/core/commands/mount.mjs.map +1 -0
- package/dist/core/commands/read.cjs +48 -0
- package/dist/core/commands/read.d.cts +17 -0
- package/dist/core/commands/read.d.cts.map +1 -0
- package/dist/core/commands/read.d.mts +17 -0
- package/dist/core/commands/read.d.mts.map +1 -0
- package/dist/core/commands/read.mjs +49 -0
- package/dist/core/commands/read.mjs.map +1 -0
- package/dist/core/commands/search.cjs +40 -0
- package/dist/core/commands/search.d.mts +2 -0
- package/dist/core/commands/search.mjs +41 -0
- package/dist/core/commands/search.mjs.map +1 -0
- package/dist/core/commands/serve.cjs +242 -0
- package/dist/core/commands/serve.d.mts +2 -0
- package/dist/core/commands/serve.mjs +242 -0
- package/dist/core/commands/serve.mjs.map +1 -0
- package/dist/core/commands/stat.cjs +53 -0
- package/dist/core/commands/stat.d.cts +17 -0
- package/dist/core/commands/stat.d.cts.map +1 -0
- package/dist/core/commands/stat.d.mts +17 -0
- package/dist/core/commands/stat.d.mts.map +1 -0
- package/dist/core/commands/stat.mjs +54 -0
- package/dist/core/commands/stat.mjs.map +1 -0
- package/dist/core/commands/types.cjs +13 -0
- package/dist/core/commands/types.d.cts +54 -0
- package/dist/core/commands/types.d.cts.map +1 -0
- package/dist/core/commands/types.d.mts +54 -0
- package/dist/core/commands/types.d.mts.map +1 -0
- package/dist/core/commands/types.mjs +14 -0
- package/dist/core/commands/types.mjs.map +1 -0
- package/dist/core/commands/write.cjs +70 -0
- package/dist/core/commands/write.d.cts +20 -0
- package/dist/core/commands/write.d.cts.map +1 -0
- package/dist/core/commands/write.d.mts +20 -0
- package/dist/core/commands/write.d.mts.map +1 -0
- package/dist/core/commands/write.mjs +71 -0
- package/dist/core/commands/write.mjs.map +1 -0
- package/dist/core/executor/index.cjs +196 -0
- package/dist/core/executor/index.d.cts +77 -0
- package/dist/core/executor/index.d.cts.map +1 -0
- package/dist/core/executor/index.d.mts +77 -0
- package/dist/core/executor/index.d.mts.map +1 -0
- package/dist/core/executor/index.mjs +195 -0
- package/dist/core/executor/index.mjs.map +1 -0
- package/dist/core/formatters/delete.cjs +37 -0
- package/dist/core/formatters/delete.d.cts +18 -0
- package/dist/core/formatters/delete.d.cts.map +1 -0
- package/dist/core/formatters/delete.d.mts +18 -0
- package/dist/core/formatters/delete.d.mts.map +1 -0
- package/dist/core/formatters/delete.mjs +37 -0
- package/dist/core/formatters/delete.mjs.map +1 -0
- package/dist/core/formatters/exec.cjs +60 -0
- package/dist/core/formatters/exec.d.cts +18 -0
- package/dist/core/formatters/exec.d.cts.map +1 -0
- package/dist/core/formatters/exec.d.mts +18 -0
- package/dist/core/formatters/exec.d.mts.map +1 -0
- package/dist/core/formatters/exec.mjs +60 -0
- package/dist/core/formatters/exec.mjs.map +1 -0
- package/dist/core/formatters/explain.cjs +97 -0
- package/dist/core/formatters/explain.d.cts +11 -0
- package/dist/core/formatters/explain.d.cts.map +1 -0
- package/dist/core/formatters/explain.d.mts +11 -0
- package/dist/core/formatters/explain.d.mts.map +1 -0
- package/dist/core/formatters/explain.mjs +96 -0
- package/dist/core/formatters/explain.mjs.map +1 -0
- package/dist/core/formatters/index.d.mts +9 -0
- package/dist/core/formatters/ls.cjs +179 -0
- package/dist/core/formatters/ls.d.cts +20 -0
- package/dist/core/formatters/ls.d.cts.map +1 -0
- package/dist/core/formatters/ls.d.mts +20 -0
- package/dist/core/formatters/ls.d.mts.map +1 -0
- package/dist/core/formatters/ls.mjs +179 -0
- package/dist/core/formatters/ls.mjs.map +1 -0
- package/dist/core/formatters/mount.cjs +55 -0
- package/dist/core/formatters/mount.d.cts +15 -0
- package/dist/core/formatters/mount.d.cts.map +1 -0
- package/dist/core/formatters/mount.d.mts +15 -0
- package/dist/core/formatters/mount.d.mts.map +1 -0
- package/dist/core/formatters/mount.mjs +55 -0
- package/dist/core/formatters/mount.mjs.map +1 -0
- package/dist/core/formatters/read.cjs +100 -0
- package/dist/core/formatters/read.d.cts +22 -0
- package/dist/core/formatters/read.d.cts.map +1 -0
- package/dist/core/formatters/read.d.mts +22 -0
- package/dist/core/formatters/read.d.mts.map +1 -0
- package/dist/core/formatters/read.mjs +100 -0
- package/dist/core/formatters/read.mjs.map +1 -0
- package/dist/core/formatters/search.cjs +44 -0
- package/dist/core/formatters/search.d.mts +1 -0
- package/dist/core/formatters/search.mjs +44 -0
- package/dist/core/formatters/search.mjs.map +1 -0
- package/dist/core/formatters/stat.cjs +155 -0
- package/dist/core/formatters/stat.d.cts +15 -0
- package/dist/core/formatters/stat.d.cts.map +1 -0
- package/dist/core/formatters/stat.d.mts +15 -0
- package/dist/core/formatters/stat.d.mts.map +1 -0
- package/dist/core/formatters/stat.mjs +155 -0
- package/dist/core/formatters/stat.mjs.map +1 -0
- package/dist/core/formatters/write.cjs +51 -0
- package/dist/core/formatters/write.d.cts +22 -0
- package/dist/core/formatters/write.d.cts.map +1 -0
- package/dist/core/formatters/write.d.mts +22 -0
- package/dist/core/formatters/write.d.mts.map +1 -0
- package/dist/core/formatters/write.mjs +51 -0
- package/dist/core/formatters/write.mjs.map +1 -0
- package/dist/core/helpers/exec-args.cjs +142 -0
- package/dist/core/helpers/exec-args.d.cts +46 -0
- package/dist/core/helpers/exec-args.d.cts.map +1 -0
- package/dist/core/helpers/exec-args.d.mts +46 -0
- package/dist/core/helpers/exec-args.d.mts.map +1 -0
- package/dist/core/helpers/exec-args.mjs +139 -0
- package/dist/core/helpers/exec-args.mjs.map +1 -0
- package/dist/core/helpers/stdin.cjs +41 -0
- package/dist/core/helpers/stdin.d.cts +15 -0
- package/dist/core/helpers/stdin.d.cts.map +1 -0
- package/dist/core/helpers/stdin.d.mts +15 -0
- package/dist/core/helpers/stdin.d.mts.map +1 -0
- package/dist/core/helpers/stdin.mjs +41 -0
- package/dist/core/helpers/stdin.mjs.map +1 -0
- package/dist/core/index.cjs +49 -0
- package/dist/core/index.d.cts +24 -0
- package/dist/core/index.d.mts +25 -0
- package/dist/core/index.mjs +24 -0
- package/dist/core/path-utils.cjs +1 -0
- package/dist/core/path-utils.mjs +3 -0
- package/dist/core/types.d.cts +24 -0
- package/dist/core/types.d.cts.map +1 -0
- package/dist/core/types.d.mts +24 -0
- package/dist/core/types.d.mts.map +1 -0
- package/dist/errors.cjs +0 -11
- package/dist/errors.mjs +1 -11
- package/dist/errors.mjs.map +1 -1
- package/dist/explorer/actions.cjs +67 -32
- package/dist/explorer/actions.mjs +66 -32
- package/dist/explorer/actions.mjs.map +1 -1
- package/dist/explorer/components/dialog.cjs +170 -46
- package/dist/explorer/components/dialog.mjs +170 -46
- package/dist/explorer/components/dialog.mjs.map +1 -1
- package/dist/explorer/components/metadata-panel.cjs +86 -3
- package/dist/explorer/components/metadata-panel.mjs +86 -3
- package/dist/explorer/components/metadata-panel.mjs.map +1 -1
- package/dist/explorer/screen.cjs +63 -27
- package/dist/explorer/screen.d.cts +23 -0
- package/dist/explorer/screen.d.cts.map +1 -0
- package/dist/explorer/screen.d.mts +23 -0
- package/dist/explorer/screen.d.mts.map +1 -0
- package/dist/explorer/screen.mjs +63 -27
- package/dist/explorer/screen.mjs.map +1 -1
- package/dist/explorer/theme.cjs +1 -1
- package/dist/explorer/theme.mjs +1 -1
- package/dist/explorer/theme.mjs.map +1 -1
- package/dist/index.cjs +7 -1
- package/dist/index.d.cts +4 -1
- package/dist/index.d.mts +4 -1
- package/dist/index.mjs +4 -1
- package/dist/mcp/http-transport.cjs +68 -0
- package/dist/mcp/http-transport.mjs +68 -0
- package/dist/mcp/http-transport.mjs.map +1 -0
- package/dist/mcp/prompts.cjs +48 -0
- package/dist/mcp/prompts.mjs +48 -0
- package/dist/mcp/prompts.mjs.map +1 -0
- package/dist/mcp/resources.cjs +25 -0
- package/dist/mcp/resources.mjs +25 -0
- package/dist/mcp/resources.mjs.map +1 -0
- package/dist/mcp/server.cjs +30 -0
- package/dist/mcp/server.mjs +30 -0
- package/dist/mcp/server.mjs.map +1 -0
- package/dist/mcp/tools.cjs +196 -0
- package/dist/mcp/tools.mjs +196 -0
- package/dist/mcp/tools.mjs.map +1 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.cts +10 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.cts.map +1 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.mts +10 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/index.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.cts +46 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.cts.map +1 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.mts +46 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/types.d.mts.map +1 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/urlpattern.cjs +902 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/urlpattern.mjs +902 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/dist/urlpattern.mjs.map +1 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/index.cjs +6 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/index.mjs +8 -0
- package/dist/node_modules/.pnpm/urlpattern-polyfill@10.1.0/node_modules/urlpattern-polyfill/index.mjs.map +1 -0
- package/dist/path-utils.d.cts +50 -0
- package/dist/path-utils.d.cts.map +1 -0
- package/dist/path-utils.d.mts +50 -0
- package/dist/path-utils.d.mts.map +1 -0
- package/dist/repl.cjs +485 -0
- package/dist/repl.d.cts +15 -0
- package/dist/repl.d.cts.map +1 -0
- package/dist/repl.d.mts +16 -0
- package/dist/repl.d.mts.map +1 -0
- package/dist/repl.mjs +485 -0
- package/dist/repl.mjs.map +1 -0
- package/dist/serve.cjs +146 -0
- package/dist/serve.d.cts +41 -0
- package/dist/serve.d.cts.map +1 -0
- package/dist/serve.d.mts +41 -0
- package/dist/serve.d.mts.map +1 -0
- package/dist/serve.mjs +146 -0
- package/dist/serve.mjs.map +1 -0
- package/dist/ui/header.cjs +1 -40
- package/dist/ui/header.mjs +1 -39
- package/dist/ui/header.mjs.map +1 -1
- package/dist/ui/index.cjs +2 -9
- package/dist/ui/index.mjs +2 -7
- package/dist/ui/index.mjs.map +1 -1
- package/dist/ui/terminal.cjs +1 -10
- package/dist/ui/terminal.mjs +1 -8
- package/dist/ui/terminal.mjs.map +1 -1
- package/package.json +29 -16
- package/dist/commands/exec.cjs +0 -164
- package/dist/commands/exec.mjs +0 -160
- package/dist/commands/exec.mjs.map +0 -1
- package/dist/commands/explain.cjs +0 -244
- package/dist/commands/explain.mjs +0 -242
- package/dist/commands/explain.mjs.map +0 -1
- package/dist/commands/index.cjs +0 -8
- package/dist/commands/index.mjs +0 -10
- package/dist/commands/ls.cjs +0 -242
- package/dist/commands/ls.mjs +0 -242
- package/dist/commands/ls.mjs.map +0 -1
- package/dist/commands/mount.mjs.map +0 -1
- package/dist/commands/read.cjs +0 -264
- package/dist/commands/read.mjs +0 -263
- package/dist/commands/read.mjs.map +0 -1
- package/dist/commands/serve.cjs +0 -144
- package/dist/commands/serve.mjs +0 -143
- package/dist/commands/serve.mjs.map +0 -1
- package/dist/commands/stat.cjs +0 -195
- package/dist/commands/stat.mjs +0 -195
- package/dist/commands/stat.mjs.map +0 -1
- package/dist/commands/write.cjs +0 -85
- package/dist/commands/write.mjs +0 -85
- package/dist/commands/write.mjs.map +0 -1
- package/dist/config/provider-factory.cjs +0 -400
- package/dist/config/provider-factory.mjs +0 -401
- package/dist/config/provider-factory.mjs.map +0 -1
- package/dist/config/uri-parser.cjs +0 -285
- package/dist/config/uri-parser.mjs +0 -285
- package/dist/config/uri-parser.mjs.map +0 -1
- package/dist/runtime.cjs +0 -120
- package/dist/runtime.mjs +0 -120
- package/dist/runtime.mjs.map +0 -1
- package/dist/utils/meta.cjs +0 -51
- package/dist/utils/meta.mjs +0 -49
- 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.
|
|
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.
|
|
49
|
-
"@aigne/afs-
|
|
50
|
-
"@aigne/afs
|
|
51
|
-
"@aigne/afs-
|
|
52
|
-
"@aigne/afs-
|
|
53
|
-
"@aigne/afs-
|
|
54
|
-
"@aigne/afs-
|
|
55
|
-
"@aigne/afs-
|
|
56
|
-
"@aigne/afs-
|
|
57
|
-
"@aigne/afs-
|
|
58
|
-
"@aigne/afs-
|
|
59
|
-
"@aigne/afs-
|
|
60
|
-
"@aigne/afs-
|
|
61
|
-
"@aigne/afs-
|
|
62
|
-
"@aigne/afs-sandbox": "1.11.0-beta.
|
|
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",
|
package/dist/commands/exec.cjs
DELETED
|
@@ -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;
|
package/dist/commands/exec.mjs
DELETED
|
@@ -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;
|