@aigne/afs-cli 1.11.0-beta.10 → 1.11.0-beta.12

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 (154) hide show
  1. package/dist/cli.cjs +3 -2
  2. package/dist/cli.mjs +3 -2
  3. package/dist/cli.mjs.map +1 -1
  4. package/dist/config/afs-loader.cjs +64 -315
  5. package/dist/config/afs-loader.d.cts.map +1 -1
  6. package/dist/config/afs-loader.d.mts +2 -1
  7. package/dist/config/afs-loader.d.mts.map +1 -1
  8. package/dist/config/afs-loader.mjs +59 -310
  9. package/dist/config/afs-loader.mjs.map +1 -1
  10. package/dist/config/credential-helpers.cjs +291 -0
  11. package/dist/config/credential-helpers.d.mts +2 -0
  12. package/dist/config/credential-helpers.mjs +288 -0
  13. package/dist/config/credential-helpers.mjs.map +1 -0
  14. package/dist/config/loader.cjs +3 -1
  15. package/dist/config/loader.mjs +3 -2
  16. package/dist/config/loader.mjs.map +1 -1
  17. package/dist/config/program-install.cjs +276 -0
  18. package/dist/config/program-install.d.mts +1 -0
  19. package/dist/config/program-install.mjs +273 -0
  20. package/dist/config/program-install.mjs.map +1 -0
  21. package/dist/core/commands/connect.cjs +53 -0
  22. package/dist/core/commands/connect.d.mts +2 -0
  23. package/dist/core/commands/connect.mjs +55 -0
  24. package/dist/core/commands/connect.mjs.map +1 -0
  25. package/dist/core/commands/daemon.cjs +207 -0
  26. package/dist/core/commands/daemon.d.mts +2 -0
  27. package/dist/core/commands/daemon.mjs +208 -0
  28. package/dist/core/commands/daemon.mjs.map +1 -0
  29. package/dist/core/commands/explain.cjs +3 -1
  30. package/dist/core/commands/explain.mjs +3 -1
  31. package/dist/core/commands/explain.mjs.map +1 -1
  32. package/dist/core/commands/explore.cjs +47 -12
  33. package/dist/core/commands/explore.mjs +47 -12
  34. package/dist/core/commands/explore.mjs.map +1 -1
  35. package/dist/core/commands/gen-agent-md.cjs +126 -0
  36. package/dist/core/commands/gen-agent-md.d.mts +2 -0
  37. package/dist/core/commands/gen-agent-md.mjs +125 -0
  38. package/dist/core/commands/gen-agent-md.mjs.map +1 -0
  39. package/dist/core/commands/index.cjs +13 -1
  40. package/dist/core/commands/index.d.cts.map +1 -1
  41. package/dist/core/commands/index.d.mts +6 -0
  42. package/dist/core/commands/index.d.mts.map +1 -1
  43. package/dist/core/commands/index.mjs +13 -1
  44. package/dist/core/commands/index.mjs.map +1 -1
  45. package/dist/core/commands/install.cjs +91 -0
  46. package/dist/core/commands/install.d.mts +2 -0
  47. package/dist/core/commands/install.mjs +92 -0
  48. package/dist/core/commands/install.mjs.map +1 -0
  49. package/dist/core/commands/ls.cjs +14 -2
  50. package/dist/core/commands/ls.d.cts +2 -0
  51. package/dist/core/commands/ls.d.cts.map +1 -1
  52. package/dist/core/commands/ls.d.mts +2 -0
  53. package/dist/core/commands/ls.d.mts.map +1 -1
  54. package/dist/core/commands/ls.mjs +14 -2
  55. package/dist/core/commands/ls.mjs.map +1 -1
  56. package/dist/core/commands/mcp-bridge.cjs +201 -0
  57. package/dist/core/commands/mcp-bridge.d.mts +2 -0
  58. package/dist/core/commands/mcp-bridge.mjs +201 -0
  59. package/dist/core/commands/mcp-bridge.mjs.map +1 -0
  60. package/dist/core/commands/read.cjs +20 -7
  61. package/dist/core/commands/read.d.cts +2 -0
  62. package/dist/core/commands/read.d.cts.map +1 -1
  63. package/dist/core/commands/read.d.mts +2 -0
  64. package/dist/core/commands/read.d.mts.map +1 -1
  65. package/dist/core/commands/read.mjs +20 -7
  66. package/dist/core/commands/read.mjs.map +1 -1
  67. package/dist/core/commands/search.cjs +5 -1
  68. package/dist/core/commands/search.mjs +5 -1
  69. package/dist/core/commands/search.mjs.map +1 -1
  70. package/dist/core/commands/stat.mjs.map +1 -1
  71. package/dist/core/commands/types.d.cts +2 -0
  72. package/dist/core/commands/types.d.cts.map +1 -1
  73. package/dist/core/commands/types.d.mts +2 -0
  74. package/dist/core/commands/types.d.mts.map +1 -1
  75. package/dist/core/commands/types.mjs.map +1 -1
  76. package/dist/core/commands/vault.cjs +289 -0
  77. package/dist/core/commands/vault.d.mts +2 -0
  78. package/dist/core/commands/vault.mjs +289 -0
  79. package/dist/core/commands/vault.mjs.map +1 -0
  80. package/dist/core/commands/write.cjs +19 -6
  81. package/dist/core/commands/write.d.cts +2 -1
  82. package/dist/core/commands/write.d.cts.map +1 -1
  83. package/dist/core/commands/write.d.mts +2 -1
  84. package/dist/core/commands/write.d.mts.map +1 -1
  85. package/dist/core/commands/write.mjs +19 -6
  86. package/dist/core/commands/write.mjs.map +1 -1
  87. package/dist/core/executor/index.cjs +95 -19
  88. package/dist/core/executor/index.d.cts +4 -0
  89. package/dist/core/executor/index.d.cts.map +1 -1
  90. package/dist/core/executor/index.d.mts +4 -0
  91. package/dist/core/executor/index.d.mts.map +1 -1
  92. package/dist/core/executor/index.mjs +95 -19
  93. package/dist/core/executor/index.mjs.map +1 -1
  94. package/dist/core/formatters/index.d.mts +1 -0
  95. package/dist/core/formatters/install.cjs +21 -0
  96. package/dist/core/formatters/install.d.mts +1 -0
  97. package/dist/core/formatters/install.mjs +19 -0
  98. package/dist/core/formatters/install.mjs.map +1 -0
  99. package/dist/core/formatters/vault.cjs +36 -0
  100. package/dist/core/formatters/vault.mjs +32 -0
  101. package/dist/core/formatters/vault.mjs.map +1 -0
  102. package/dist/credential/index.d.mts +2 -1
  103. package/dist/credential/mcp-auth-context.cjs +27 -5
  104. package/dist/credential/mcp-auth-context.mjs +27 -5
  105. package/dist/credential/mcp-auth-context.mjs.map +1 -1
  106. package/dist/credential/resolver.cjs +7 -2
  107. package/dist/credential/resolver.mjs +7 -2
  108. package/dist/credential/resolver.mjs.map +1 -1
  109. package/dist/credential/vault-store.d.mts +1 -0
  110. package/dist/daemon/config-manager.cjs +279 -0
  111. package/dist/daemon/config-manager.mjs +279 -0
  112. package/dist/daemon/config-manager.mjs.map +1 -0
  113. package/dist/daemon/manager.cjs +164 -0
  114. package/dist/daemon/manager.mjs +157 -0
  115. package/dist/daemon/manager.mjs.map +1 -0
  116. package/dist/daemon/server.cjs +220 -0
  117. package/dist/daemon/server.mjs +220 -0
  118. package/dist/daemon/server.mjs.map +1 -0
  119. package/dist/mcp/http-transport.cjs +14 -1
  120. package/dist/mcp/http-transport.mjs +14 -1
  121. package/dist/mcp/http-transport.mjs.map +1 -1
  122. package/dist/mcp/server.cjs +4 -2
  123. package/dist/mcp/server.mjs +4 -2
  124. package/dist/mcp/server.mjs.map +1 -1
  125. package/dist/mcp/tools.cjs +62 -12
  126. package/dist/mcp/tools.mjs +62 -12
  127. package/dist/mcp/tools.mjs.map +1 -1
  128. package/dist/program/daemon-integration.cjs +46 -0
  129. package/dist/program/daemon-integration.mjs +45 -0
  130. package/dist/program/daemon-integration.mjs.map +1 -0
  131. package/dist/program/program-manager.cjs +162 -0
  132. package/dist/program/program-manager.mjs +162 -0
  133. package/dist/program/program-manager.mjs.map +1 -0
  134. package/dist/program/trigger-scanner.cjs +148 -0
  135. package/dist/program/trigger-scanner.mjs +148 -0
  136. package/dist/program/trigger-scanner.mjs.map +1 -0
  137. package/dist/providers/vault/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.cjs +11 -0
  138. package/dist/providers/vault/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.mjs +11 -0
  139. package/dist/providers/vault/dist/_virtual/_@oxc-project_runtime@0.108.0/helpers/decorate.mjs.map +1 -0
  140. package/dist/providers/vault/dist/encrypted-file.cjs +158 -0
  141. package/dist/providers/vault/dist/encrypted-file.mjs +153 -0
  142. package/dist/providers/vault/dist/encrypted-file.mjs.map +1 -0
  143. package/dist/providers/vault/dist/index.cjs +405 -0
  144. package/dist/providers/vault/dist/index.mjs +400 -0
  145. package/dist/providers/vault/dist/index.mjs.map +1 -0
  146. package/dist/providers/vault/dist/key-resolver.cjs +181 -0
  147. package/dist/providers/vault/dist/key-resolver.mjs +180 -0
  148. package/dist/providers/vault/dist/key-resolver.mjs.map +1 -0
  149. package/dist/repl.cjs +105 -14
  150. package/dist/repl.d.cts.map +1 -1
  151. package/dist/repl.d.mts.map +1 -1
  152. package/dist/repl.mjs +105 -14
  153. package/dist/repl.mjs.map +1 -1
  154. package/package.json +29 -22
@@ -1 +1 @@
1
- {"version":3,"file":"explain.mjs","names":[],"sources":["../../../src/core/commands/explain.ts"],"sourcesContent":["/**\n * explain Command - Core Implementation\n *\n * Explains AFS paths or concepts.\n * Matches old version output format with topic/explanation/examples structure.\n */\n\nimport type { AFS } from \"@aigne/afs\";\nimport type { CommandModule } from \"yargs\";\nimport { configMountListCommand } from \"../../config/mount-commands.js\";\nimport { formatExplainOutput, formatPathExplainOutput } from \"../formatters/index.js\";\nimport { cliPathToCanonical } from \"../path-utils.js\";\nimport { type CommandFactoryOptions, resolveAFS } from \"./types.js\";\n\n/**\n * Result for concept explanations (mount, paths, uri, overview)\n */\nexport interface ExplainResult {\n topic: string;\n explanation: string;\n examples?: string[];\n}\n\n/**\n * Result for path explanations\n */\nexport interface PathExplainResult {\n path: string;\n type: string;\n description?: string;\n inputs?: string[];\n outputs?: string[];\n errors?: string[];\n sideEffects?: string[];\n meta?: Record<string, string>;\n /** When set, the formatter renders this markdown directly instead of structured fields */\n markdown?: string;\n}\n\n/**\n * Explain command arguments\n */\nexport interface ExplainArgs {\n topic?: string;\n}\n\n/**\n * Create explain command factory\n */\nexport function createExplainCommand(\n options: CommandFactoryOptions,\n): CommandModule<unknown, ExplainArgs> {\n return {\n command: \"explain [topic]\",\n describe: \"Explain AFS concepts or paths\",\n builder: {\n topic: {\n type: \"string\",\n description: \"Topic (mount, path, uri) or AFS path (e.g., /src)\",\n },\n },\n handler: async (argv) => {\n const target = argv.topic;\n\n // No target - explain overview\n if (!target) {\n options.onResult({\n command: \"explain\",\n result: explainOverview(),\n format: formatExplainOutput,\n });\n return;\n }\n\n // Priority: try as path first, then as concept\n const isPath = target.startsWith(\"/\") || target.startsWith(\"@\") || target.startsWith(\"$\");\n\n if (isPath) {\n const afs = await resolveAFS(options);\n const canonicalPath = cliPathToCanonical(target);\n const result = await getPathExplanation(afs, target, canonicalPath);\n options.onResult({ command: \"explain\", result, format: formatPathExplainOutput });\n } else {\n // Not obviously a path — try as path first, fall back to concept\n let afs: AFS | undefined;\n try {\n afs = await resolveAFS(options);\n } catch {}\n\n if (afs) {\n try {\n const canonicalPath = cliPathToCanonical(`/${target}`);\n const explainResult = await afs.explain(canonicalPath);\n if (explainResult.format === \"markdown\" && explainResult.content) {\n options.onResult({\n command: \"explain\",\n result: { path: `/${target}`, type: \"explained\", markdown: explainResult.content },\n format: formatPathExplainOutput,\n });\n return;\n }\n } catch {\n // Not a valid path, fall through to concept\n }\n }\n\n const cwd = options.cwd ?? process.cwd();\n const result = await getConceptExplanation(target.toLowerCase(), cwd, afs);\n options.onResult({\n command: \"explain\",\n result,\n format: formatExplainOutput,\n });\n }\n },\n };\n}\n\n/**\n * Get explanation for a path\n */\nasync function getPathExplanation(\n afs: AFS,\n path: string,\n canonicalPath: string,\n): Promise<PathExplainResult> {\n try {\n // Always try afs.explain() first — transparent passthrough to provider explain\n try {\n const explainResult = await afs.explain(canonicalPath);\n if (explainResult.format === \"markdown\" && explainResult.content) {\n return {\n path,\n type: \"explained\",\n markdown: explainResult.content,\n };\n }\n } catch {\n // explain not available, fall through to stat-based logic\n }\n\n // Fallback: stat-based explanation\n let entry:\n | { path: string; meta?: Record<string, unknown> | null; content?: unknown }\n | undefined;\n\n try {\n const statResult = await afs.stat(canonicalPath);\n entry = statResult.data;\n } catch {}\n\n if (!entry) {\n try {\n const readResult = await afs.read(canonicalPath);\n entry = readResult.data;\n } catch {}\n }\n\n if (!entry) {\n return {\n path,\n type: \"unknown\",\n };\n }\n\n const metadata = entry.meta || {};\n // Determine type from childrenCount: if defined, it has children (directory-like); otherwise file-like\n const entryType =\n metadata.kind === \"afs:executable\"\n ? \"exec\"\n : typeof metadata.childrenCount === \"number\"\n ? \"directory\"\n : \"file\";\n\n const result: PathExplainResult = {\n path: entry.path,\n type: entryType,\n description: metadata.description as string | undefined,\n meta: {},\n };\n\n // Add metadata\n if (metadata.provider) {\n result.meta!.provider = String(metadata.provider);\n }\n if (metadata.permissions) {\n const perms = metadata.permissions;\n result.meta!.permissions = Array.isArray(perms) ? perms.join(\", \") : String(perms);\n }\n\n // For exec type, try to get schema info\n if (entryType === \"exec\") {\n if (metadata.inputs) {\n result.inputs = Array.isArray(metadata.inputs)\n ? (metadata.inputs as string[])\n : [String(metadata.inputs)];\n }\n if (metadata.outputs) {\n result.outputs = Array.isArray(metadata.outputs)\n ? (metadata.outputs as string[])\n : [String(metadata.outputs)];\n }\n if (metadata.errors) {\n result.errors = Array.isArray(metadata.errors)\n ? (metadata.errors as string[])\n : [String(metadata.errors)];\n }\n if (metadata.sideEffects) {\n result.sideEffects = Array.isArray(metadata.sideEffects)\n ? (metadata.sideEffects as string[])\n : [String(metadata.sideEffects)];\n }\n }\n\n // Clean up empty metadata\n if (Object.keys(result.meta!).length === 0) {\n delete result.meta;\n }\n\n return result;\n } catch (err) {\n return {\n path,\n type: \"error\",\n description: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\n/**\n * Get explanation for a concept\n */\nasync function getConceptExplanation(\n topic: string,\n cwd: string,\n afs?: AFS,\n): Promise<ExplainResult> {\n switch (topic) {\n case \"mount\":\n case \"mounts\":\n return explainMounts(cwd, afs);\n case \"path\":\n case \"paths\":\n return explainPaths();\n case \"uri\":\n case \"provider\":\n case \"providers\":\n return explainUri();\n default:\n return {\n topic: \"Unknown Topic\",\n explanation: `Unknown topic: ${topic}\\n\\nAvailable topics: overview, mount, path, uri`,\n };\n }\n}\n\nfunction explainOverview(): ExplainResult {\n return {\n topic: \"AFS Overview\",\n explanation: `AFS (Abstract File System) is a virtual filesystem that unifies different data sources into a single namespace.\n\nCore Concepts:\n- mount: Mount a data source to a virtual path\n- path: Virtual path, e.g., /src, /data\n- uri: Data source address, e.g., fs://, git://, sqlite://\n\nData Flow:\n User Path -> AFS -> /{mount} -> Provider -> Actual Data`,\n examples: [\"afs mount add /src fs:///path/to/source\", \"afs ls /src\", \"afs read /src/file.txt\"],\n };\n}\n\nasync function explainMounts(cwd: string, afs?: AFS): Promise<ExplainResult> {\n const result = await configMountListCommand(cwd);\n\n if (result.mounts.length === 0) {\n // Try runtime mounts if no config mounts\n if (afs) {\n try {\n const listResult = await afs.list(\"$afs:/\");\n if (listResult.data?.length) {\n const runtimeMounts = listResult.data\n .map((entry) => ` ${entry.path} (runtime mount)`)\n .join(\"\\n\");\n\n return {\n topic: \"Mounts\",\n explanation: `Runtime mounts (mounted via API):\\n\\n${runtimeMounts}`,\n examples: listResult.data.slice(0, 3).map((entry) => `afs ls ${entry.path}`),\n };\n }\n } catch {}\n }\n\n return {\n topic: \"Mounts\",\n explanation: `No mounts configured.\n\nUse mount add to add a mount:\n afs mount add <path> <uri>\n\npath: Virtual path for accessing data in AFS\nuri: Data source URI specifying the data origin`,\n examples: [\n \"afs mount add /src fs:///Users/me/project\",\n \"afs mount add /data sqlite:///data.db\",\n ],\n };\n }\n\n const mountList = result.mounts\n .map((m) => ` ${m.path}${m.description ? ` - ${m.description}` : \"\"}`)\n .join(\"\\n\");\n\n return {\n topic: \"Mounts\",\n explanation: `Current mount configuration:\n\n${mountList}\n\nAfter mounting, data is accessed via the mount path:\n path=\"/src\" -> /src`,\n examples: result.mounts.map((m) => `afs ls ${m.path}`),\n };\n}\n\nfunction explainPaths(): ExplainResult {\n return {\n topic: \"Paths\",\n explanation: `AFS Path Structure:\n\n/ Root directory\n/{mount} Mounted data source\n/{mount}/{path} Files/nodes within a mount\n\nPath Mapping:\n config: path=\"/src\" -> access: /src\n config: path=\"/data\" -> access: /data\n\nMounts are accessed directly at their configured path.`,\n };\n}\n\nfunction explainUri(): ExplainResult {\n return {\n topic: \"URI\",\n explanation: `AFS URI Schemes and Objects:\n\nfs:// Local Filesystem Provider\n Format: fs:///absolute/path or fs://./relative/path\n Operations: list, read, write, delete\n\ngit:// Git Repository Provider\n Format: git:///local/repo or git://github.com/user/repo?branch=main\n Operations: list, read, exec (diff, create-branch, commit, merge)\n\nsqlite:// SQLite Database Provider\n Format: sqlite:///path/to/db.sqlite\n Operations: list, read, exec (SQL queries)\n\njson:// JSON Data Provider\n Format: json:///path/to/data.json\n Operations: list, read, write\n\ntoml:// TOML Data Provider\n Format: toml:///path/to/config.toml\n Operations: list, read, write\n\nsandbox:// Sandboxed Script Execution Provider\n Format: sandbox:///path/to/scripts\n Operations: list, read, exec\n\ngithub:// GitHub Issues/PRs Provider\n Format: github://owner/repo\n Operations: list, read, exec (create-issue, close-issue, etc.)\n\nhttp:// HTTP Proxy Provider\n Format: http://host:port/path\n Operations: list, read\n\nmcp:// MCP Server Provider\n Format: mcp:///path/to/server\n Operations: list, read, exec\n\ns3:// AWS S3 Storage Provider\n Format: s3://bucket-name\n Operations: list, read, write, delete\n\ngcs:// Google Cloud Storage Provider\n Format: gcs://bucket-name\n Operations: list, read, write, delete\n\nec2:// AWS EC2 Instances Provider\n Format: ec2://region\n Operations: list, read, exec (run-instances)\n\ngce:// Google Compute Engine Provider\n Format: gce://project/zone\n Operations: list, read, exec\n\ndns:// Cloud DNS Provider\n Format: dns://provider (route53, clouddns)\n Operations: list, read`,\n examples: [\n \"afs mount add /src fs:///Users/me/project\",\n \"afs mount add /repo git://github.com/user/repo\",\n \"afs mount add /db sqlite:///data.sqlite\",\n \"afs mount add /s3 s3://my-bucket\",\n ],\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"explain.mjs","names":[],"sources":["../../../src/core/commands/explain.ts"],"sourcesContent":["/**\n * explain Command - Core Implementation\n *\n * Explains AFS paths or concepts.\n * Matches old version output format with topic/explanation/examples structure.\n */\n\nimport type { AFS } from \"@aigne/afs\";\nimport type { CommandModule } from \"yargs\";\nimport { configMountListCommand } from \"../../config/mount-commands.js\";\nimport { formatExplainOutput, formatPathExplainOutput } from \"../formatters/index.js\";\nimport { cliPathToCanonical } from \"../path-utils.js\";\nimport { type CommandFactoryOptions, resolveAFS } from \"./types.js\";\n\n/**\n * Result for concept explanations (mount, paths, uri, overview)\n */\nexport interface ExplainResult {\n topic: string;\n explanation: string;\n examples?: string[];\n}\n\n/**\n * Result for path explanations\n */\nexport interface PathExplainResult {\n path: string;\n type: string;\n description?: string;\n inputs?: string[];\n outputs?: string[];\n errors?: string[];\n sideEffects?: string[];\n meta?: Record<string, string>;\n /** When set, the formatter renders this markdown directly instead of structured fields */\n markdown?: string;\n}\n\n/**\n * Explain command arguments\n */\nexport interface ExplainArgs {\n topic?: string;\n}\n\n/**\n * Create explain command factory\n */\nexport function createExplainCommand(\n options: CommandFactoryOptions,\n): CommandModule<unknown, ExplainArgs> {\n return {\n command: \"explain [topic]\",\n describe: \"Explain AFS concepts or paths\",\n builder: {\n topic: {\n type: \"string\",\n description: \"Topic (mount, path, uri) or AFS path (e.g., /src)\",\n },\n },\n handler: async (argv) => {\n const target = argv.topic;\n\n // No target - explain overview\n if (!target) {\n options.onResult({\n command: \"explain\",\n result: explainOverview(),\n format: formatExplainOutput,\n });\n return;\n }\n\n // Priority: try as path first, then as concept\n const isPath = target.startsWith(\"/\") || target.startsWith(\"@\") || target.startsWith(\"$\");\n\n if (isPath) {\n const afs = await resolveAFS(options);\n const canonicalPath = cliPathToCanonical(target);\n const result = await getPathExplanation(afs, target, canonicalPath);\n options.onResult({ command: \"explain\", result, format: formatPathExplainOutput });\n } else {\n // Not obviously a path — try as path first, fall back to concept\n let afs: AFS | undefined;\n try {\n afs = await resolveAFS(options);\n } catch {\n // AFS may not be configured — fall through to concept explanation\n }\n\n if (afs) {\n try {\n const canonicalPath = cliPathToCanonical(`/${target}`);\n const explainResult = await afs.explain(canonicalPath);\n if (explainResult.format === \"markdown\" && explainResult.content) {\n options.onResult({\n command: \"explain\",\n result: { path: `/${target}`, type: \"explained\", markdown: explainResult.content },\n format: formatPathExplainOutput,\n });\n return;\n }\n } catch {\n // Not a valid path, fall through to concept\n }\n }\n\n const cwd = options.cwd ?? process.cwd();\n const result = await getConceptExplanation(target.toLowerCase(), cwd, afs);\n options.onResult({\n command: \"explain\",\n result,\n format: formatExplainOutput,\n });\n }\n },\n };\n}\n\n/**\n * Get explanation for a path\n */\nasync function getPathExplanation(\n afs: AFS,\n path: string,\n canonicalPath: string,\n): Promise<PathExplainResult> {\n try {\n // Always try afs.explain() first — transparent passthrough to provider explain\n try {\n const explainResult = await afs.explain(canonicalPath);\n if (explainResult.format === \"markdown\" && explainResult.content) {\n return {\n path,\n type: \"explained\",\n markdown: explainResult.content,\n };\n }\n } catch {\n // explain not available, fall through to stat-based logic\n }\n\n // Fallback: stat-based explanation\n let entry:\n | { path: string; meta?: Record<string, unknown> | null; content?: unknown }\n | undefined;\n\n try {\n const statResult = await afs.stat(canonicalPath);\n entry = statResult.data;\n } catch {\n // stat() optional — fall through to read()\n }\n\n if (!entry) {\n try {\n const readResult = await afs.read(canonicalPath);\n entry = readResult.data;\n } catch {\n // read() also failed — entry stays undefined, returns \"unknown\" type below\n }\n }\n\n if (!entry) {\n return {\n path,\n type: \"unknown\",\n };\n }\n\n const metadata = entry.meta || {};\n // Determine type from childrenCount: if defined, it has children (directory-like); otherwise file-like\n const entryType =\n metadata.kind === \"afs:executable\"\n ? \"exec\"\n : typeof metadata.childrenCount === \"number\"\n ? \"directory\"\n : \"file\";\n\n const result: PathExplainResult = {\n path: entry.path,\n type: entryType,\n description: metadata.description as string | undefined,\n meta: {},\n };\n\n // Add metadata\n if (metadata.provider) {\n result.meta!.provider = String(metadata.provider);\n }\n if (metadata.permissions) {\n const perms = metadata.permissions;\n result.meta!.permissions = Array.isArray(perms) ? perms.join(\", \") : String(perms);\n }\n\n // For exec type, try to get schema info\n if (entryType === \"exec\") {\n if (metadata.inputs) {\n result.inputs = Array.isArray(metadata.inputs)\n ? (metadata.inputs as string[])\n : [String(metadata.inputs)];\n }\n if (metadata.outputs) {\n result.outputs = Array.isArray(metadata.outputs)\n ? (metadata.outputs as string[])\n : [String(metadata.outputs)];\n }\n if (metadata.errors) {\n result.errors = Array.isArray(metadata.errors)\n ? (metadata.errors as string[])\n : [String(metadata.errors)];\n }\n if (metadata.sideEffects) {\n result.sideEffects = Array.isArray(metadata.sideEffects)\n ? (metadata.sideEffects as string[])\n : [String(metadata.sideEffects)];\n }\n }\n\n // Clean up empty metadata\n if (Object.keys(result.meta!).length === 0) {\n delete result.meta;\n }\n\n return result;\n } catch (err) {\n return {\n path,\n type: \"error\",\n description: err instanceof Error ? err.message : String(err),\n };\n }\n}\n\n/**\n * Get explanation for a concept\n */\nasync function getConceptExplanation(\n topic: string,\n cwd: string,\n afs?: AFS,\n): Promise<ExplainResult> {\n switch (topic) {\n case \"mount\":\n case \"mounts\":\n return explainMounts(cwd, afs);\n case \"path\":\n case \"paths\":\n return explainPaths();\n case \"uri\":\n case \"provider\":\n case \"providers\":\n return explainUri();\n default:\n return {\n topic: \"Unknown Topic\",\n explanation: `Unknown topic: ${topic}\\n\\nAvailable topics: overview, mount, path, uri`,\n };\n }\n}\n\nfunction explainOverview(): ExplainResult {\n return {\n topic: \"AFS Overview\",\n explanation: `AFS (Abstract File System) is a virtual filesystem that unifies different data sources into a single namespace.\n\nCore Concepts:\n- mount: Mount a data source to a virtual path\n- path: Virtual path, e.g., /src, /data\n- uri: Data source address, e.g., fs://, git://, sqlite://\n\nData Flow:\n User Path -> AFS -> /{mount} -> Provider -> Actual Data`,\n examples: [\"afs mount add /src fs:///path/to/source\", \"afs ls /src\", \"afs read /src/file.txt\"],\n };\n}\n\nasync function explainMounts(cwd: string, afs?: AFS): Promise<ExplainResult> {\n const result = await configMountListCommand(cwd);\n\n if (result.mounts.length === 0) {\n // Try runtime mounts if no config mounts\n if (afs) {\n try {\n const listResult = await afs.list(\"$afs:/\");\n if (listResult.data?.length) {\n const runtimeMounts = listResult.data\n .map((entry) => ` ${entry.path} (runtime mount)`)\n .join(\"\\n\");\n\n return {\n topic: \"Mounts\",\n explanation: `Runtime mounts (mounted via API):\\n\\n${runtimeMounts}`,\n examples: listResult.data.slice(0, 3).map((entry) => `afs ls ${entry.path}`),\n };\n }\n } catch (err) {\n // Mount enumeration failed — debug log and show \"no mounts\" fallback\n console.debug(\"[explain] mount enumeration failed:\", err);\n }\n }\n\n return {\n topic: \"Mounts\",\n explanation: `No mounts configured.\n\nUse mount add to add a mount:\n afs mount add <path> <uri>\n\npath: Virtual path for accessing data in AFS\nuri: Data source URI specifying the data origin`,\n examples: [\n \"afs mount add /src fs:///Users/me/project\",\n \"afs mount add /data sqlite:///data.db\",\n ],\n };\n }\n\n const mountList = result.mounts\n .map((m) => ` ${m.path}${m.description ? ` - ${m.description}` : \"\"}`)\n .join(\"\\n\");\n\n return {\n topic: \"Mounts\",\n explanation: `Current mount configuration:\n\n${mountList}\n\nAfter mounting, data is accessed via the mount path:\n path=\"/src\" -> /src`,\n examples: result.mounts.map((m) => `afs ls ${m.path}`),\n };\n}\n\nfunction explainPaths(): ExplainResult {\n return {\n topic: \"Paths\",\n explanation: `AFS Path Structure:\n\n/ Root directory\n/{mount} Mounted data source\n/{mount}/{path} Files/nodes within a mount\n\nPath Mapping:\n config: path=\"/src\" -> access: /src\n config: path=\"/data\" -> access: /data\n\nMounts are accessed directly at their configured path.`,\n };\n}\n\nfunction explainUri(): ExplainResult {\n return {\n topic: \"URI\",\n explanation: `AFS URI Schemes and Objects:\n\nfs:// Local Filesystem Provider\n Format: fs:///absolute/path or fs://./relative/path\n Operations: list, read, write, delete\n\ngit:// Git Repository Provider\n Format: git:///local/repo or git://github.com/user/repo?branch=main\n Operations: list, read, exec (diff, create-branch, commit, merge)\n\nsqlite:// SQLite Database Provider\n Format: sqlite:///path/to/db.sqlite\n Operations: list, read, exec (SQL queries)\n\njson:// JSON Data Provider\n Format: json:///path/to/data.json\n Operations: list, read, write\n\ntoml:// TOML Data Provider\n Format: toml:///path/to/config.toml\n Operations: list, read, write\n\nsandbox:// Sandboxed Script Execution Provider\n Format: sandbox:///path/to/scripts\n Operations: list, read, exec\n\ngithub:// GitHub Issues/PRs Provider\n Format: github://owner/repo\n Operations: list, read, exec (create-issue, close-issue, etc.)\n\nhttp:// HTTP Proxy Provider\n Format: http://host:port/path\n Operations: list, read\n\nmcp:// MCP Server Provider\n Format: mcp:///path/to/server\n Operations: list, read, exec\n\ns3:// AWS S3 Storage Provider\n Format: s3://bucket-name\n Operations: list, read, write, delete\n\ngcs:// Google Cloud Storage Provider\n Format: gcs://bucket-name\n Operations: list, read, write, delete\n\nec2:// AWS EC2 Instances Provider\n Format: ec2://region\n Operations: list, read, exec (run-instances)\n\ngce:// Google Compute Engine Provider\n Format: gce://project/zone\n Operations: list, read, exec\n\ndns:// Cloud DNS Provider\n Format: dns://provider (route53, clouddns)\n Operations: list, read`,\n examples: [\n \"afs mount add /src fs:///Users/me/project\",\n \"afs mount add /repo git://github.com/user/repo\",\n \"afs mount add /db sqlite:///data.sqlite\",\n \"afs mount add /s3 s3://my-bucket\",\n ],\n };\n}\n"],"mappings":"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"}
@@ -8,20 +8,55 @@ const require_version = require('../../version.cjs');
8
8
  function createExploreCommand(options) {
9
9
  return {
10
10
  command: "explore [path]",
11
- describe: "Interactive TUI explorer",
12
- builder: { path: {
13
- type: "string",
14
- default: "/",
15
- description: "Starting path"
16
- } },
11
+ describe: "Interactive explorer (TUI or web)",
12
+ builder: {
13
+ path: {
14
+ type: "string",
15
+ default: "/",
16
+ description: "Starting path"
17
+ },
18
+ web: {
19
+ type: "boolean",
20
+ default: false,
21
+ description: "Launch web-based explorer"
22
+ },
23
+ port: {
24
+ type: "number",
25
+ default: 0,
26
+ description: "Port for web explorer (0 = auto)"
27
+ }
28
+ },
17
29
  handler: async (argv) => {
18
30
  const afs = await require_types.resolveAFS(options);
19
- const { createExplorerScreen } = await Promise.resolve().then(() => require("../../explorer/screen.cjs"));
20
- await createExplorerScreen({
21
- afs,
22
- startPath: argv.path,
23
- version: require_version.VERSION
24
- });
31
+ if (argv.web) {
32
+ const { startExplorer } = await import("@aigne/afs-explorer");
33
+ const { resolve } = await import("node:path");
34
+ let webRoot;
35
+ try {
36
+ const { createRequire } = await import("node:module");
37
+ webRoot = resolve(createRequire(require("url").pathToFileURL(__filename).href).resolve("@aigne/afs-explorer/package.json"), "..", "web");
38
+ } catch {}
39
+ const info = await startExplorer(afs, {
40
+ port: argv.port,
41
+ host: "localhost",
42
+ webRoot,
43
+ open: true
44
+ });
45
+ console.log(`AFS Explorer running at ${info.url}`);
46
+ console.log("Press Ctrl+C to stop");
47
+ process.on("SIGINT", () => {
48
+ info.stop();
49
+ process.exit(0);
50
+ });
51
+ await new Promise(() => {});
52
+ } else {
53
+ const { createExplorerScreen } = await Promise.resolve().then(() => require("../../explorer/screen.cjs"));
54
+ await createExplorerScreen({
55
+ afs,
56
+ startPath: argv.path,
57
+ version: require_version.VERSION
58
+ });
59
+ }
25
60
  }
26
61
  };
27
62
  }
@@ -8,20 +8,55 @@ import { VERSION } from "../../version.mjs";
8
8
  function createExploreCommand(options) {
9
9
  return {
10
10
  command: "explore [path]",
11
- describe: "Interactive TUI explorer",
12
- builder: { path: {
13
- type: "string",
14
- default: "/",
15
- description: "Starting path"
16
- } },
11
+ describe: "Interactive explorer (TUI or web)",
12
+ builder: {
13
+ path: {
14
+ type: "string",
15
+ default: "/",
16
+ description: "Starting path"
17
+ },
18
+ web: {
19
+ type: "boolean",
20
+ default: false,
21
+ description: "Launch web-based explorer"
22
+ },
23
+ port: {
24
+ type: "number",
25
+ default: 0,
26
+ description: "Port for web explorer (0 = auto)"
27
+ }
28
+ },
17
29
  handler: async (argv) => {
18
30
  const afs = await resolveAFS(options);
19
- const { createExplorerScreen } = await import("../../explorer/screen.mjs");
20
- await createExplorerScreen({
21
- afs,
22
- startPath: argv.path,
23
- version: VERSION
24
- });
31
+ if (argv.web) {
32
+ const { startExplorer } = await import("@aigne/afs-explorer");
33
+ const { resolve } = await import("node:path");
34
+ let webRoot;
35
+ try {
36
+ const { createRequire } = await import("node:module");
37
+ webRoot = resolve(createRequire(import.meta.url).resolve("@aigne/afs-explorer/package.json"), "..", "web");
38
+ } catch {}
39
+ const info = await startExplorer(afs, {
40
+ port: argv.port,
41
+ host: "localhost",
42
+ webRoot,
43
+ open: true
44
+ });
45
+ console.log(`AFS Explorer running at ${info.url}`);
46
+ console.log("Press Ctrl+C to stop");
47
+ process.on("SIGINT", () => {
48
+ info.stop();
49
+ process.exit(0);
50
+ });
51
+ await new Promise(() => {});
52
+ } else {
53
+ const { createExplorerScreen } = await import("../../explorer/screen.mjs");
54
+ await createExplorerScreen({
55
+ afs,
56
+ startPath: argv.path,
57
+ version: VERSION
58
+ });
59
+ }
25
60
  }
26
61
  };
27
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"explore.mjs","names":[],"sources":["../../../src/core/commands/explore.ts"],"sourcesContent":["/**\n * AFS Explore Command\n *\n * Interactive TUI explorer for AFS\n */\n\nimport type { CommandModule } from \"yargs\";\nimport { VERSION } from \"../../version.js\";\nimport { type CommandFactoryOptions, resolveAFS } from \"./types.js\";\n\nexport interface ExploreArgs {\n path: string;\n}\n\n/**\n * Create explore command\n */\nexport function createExploreCommand(\n options: CommandFactoryOptions,\n): CommandModule<unknown, ExploreArgs> {\n return {\n command: \"explore [path]\",\n describe: \"Interactive TUI explorer\",\n builder: {\n path: { type: \"string\", default: \"/\", description: \"Starting path\" },\n },\n handler: async (argv) => {\n const afs = await resolveAFS(options);\n const { createExplorerScreen } = await import(\"../../explorer/screen.js\");\n await createExplorerScreen({ afs, startPath: argv.path, version: VERSION });\n },\n };\n}\n"],"mappings":";;;;;;;AAiBA,SAAgB,qBACd,SACqC;AACrC,QAAO;EACL,SAAS;EACT,UAAU;EACV,SAAS,EACP,MAAM;GAAE,MAAM;GAAU,SAAS;GAAK,aAAa;GAAiB,EACrE;EACD,SAAS,OAAO,SAAS;GACvB,MAAM,MAAM,MAAM,WAAW,QAAQ;GACrC,MAAM,EAAE,yBAAyB,MAAM,OAAO;AAC9C,SAAM,qBAAqB;IAAE;IAAK,WAAW,KAAK;IAAM,SAAS;IAAS,CAAC;;EAE9E"}
1
+ {"version":3,"file":"explore.mjs","names":[],"sources":["../../../src/core/commands/explore.ts"],"sourcesContent":["/**\n * AFS Explore Command\n *\n * Interactive TUI explorer or web-based explorer for AFS\n */\n\nimport type { CommandModule } from \"yargs\";\nimport { VERSION } from \"../../version.js\";\nimport { type CommandFactoryOptions, resolveAFS } from \"./types.js\";\n\nexport interface ExploreArgs {\n path: string;\n web: boolean;\n port: number;\n}\n\n/**\n * Create explore command\n */\nexport function createExploreCommand(\n options: CommandFactoryOptions,\n): CommandModule<unknown, ExploreArgs> {\n return {\n command: \"explore [path]\",\n describe: \"Interactive explorer (TUI or web)\",\n builder: {\n path: { type: \"string\", default: \"/\", description: \"Starting path\" },\n web: { type: \"boolean\", default: false, description: \"Launch web-based explorer\" },\n port: { type: \"number\", default: 0, description: \"Port for web explorer (0 = auto)\" },\n },\n handler: async (argv) => {\n const afs = await resolveAFS(options);\n\n if (argv.web) {\n const { startExplorer } = await import(\"@aigne/afs-explorer\");\n const { resolve } = await import(\"node:path\");\n\n // Locate web assets: try node_modules first, then relative path\n let webRoot: string | undefined;\n try {\n const { createRequire } = await import(\"node:module\");\n const req = createRequire(import.meta.url);\n const explorerPkg = req.resolve(\"@aigne/afs-explorer/package.json\");\n webRoot = resolve(explorerPkg, \"..\", \"web\");\n } catch {\n // Fallback — not critical if embedded assets are used\n }\n\n const info = await startExplorer(afs, {\n port: argv.port,\n host: \"localhost\",\n webRoot,\n open: true,\n });\n\n console.log(`AFS Explorer running at ${info.url}`);\n console.log(\"Press Ctrl+C to stop\");\n\n // Keep process alive\n process.on(\"SIGINT\", () => {\n info.stop();\n process.exit(0);\n });\n await new Promise(() => {});\n } else {\n const { createExplorerScreen } = await import(\"../../explorer/screen.js\");\n await createExplorerScreen({ afs, startPath: argv.path, version: VERSION });\n }\n },\n };\n}\n"],"mappings":";;;;;;;AAmBA,SAAgB,qBACd,SACqC;AACrC,QAAO;EACL,SAAS;EACT,UAAU;EACV,SAAS;GACP,MAAM;IAAE,MAAM;IAAU,SAAS;IAAK,aAAa;IAAiB;GACpE,KAAK;IAAE,MAAM;IAAW,SAAS;IAAO,aAAa;IAA6B;GAClF,MAAM;IAAE,MAAM;IAAU,SAAS;IAAG,aAAa;IAAoC;GACtF;EACD,SAAS,OAAO,SAAS;GACvB,MAAM,MAAM,MAAM,WAAW,QAAQ;AAErC,OAAI,KAAK,KAAK;IACZ,MAAM,EAAE,kBAAkB,MAAM,OAAO;IACvC,MAAM,EAAE,YAAY,MAAM,OAAO;IAGjC,IAAI;AACJ,QAAI;KACF,MAAM,EAAE,kBAAkB,MAAM,OAAO;AAGvC,eAAU,QAFE,cAAc,OAAO,KAAK,IAAI,CAClB,QAAQ,mCAAmC,EACpC,MAAM,MAAM;YACrC;IAIR,MAAM,OAAO,MAAM,cAAc,KAAK;KACpC,MAAM,KAAK;KACX,MAAM;KACN;KACA,MAAM;KACP,CAAC;AAEF,YAAQ,IAAI,2BAA2B,KAAK,MAAM;AAClD,YAAQ,IAAI,uBAAuB;AAGnC,YAAQ,GAAG,gBAAgB;AACzB,UAAK,MAAM;AACX,aAAQ,KAAK,EAAE;MACf;AACF,UAAM,IAAI,cAAc,GAAG;UACtB;IACL,MAAM,EAAE,yBAAyB,MAAM,OAAO;AAC9C,UAAM,qBAAqB;KAAE;KAAK,WAAW,KAAK;KAAM,SAAS;KAAS,CAAC;;;EAGhF"}
@@ -0,0 +1,126 @@
1
+
2
+ //#region src/core/commands/gen-agent-md.ts
3
+ /**
4
+ * Generate AGENT.md content from manifest and optional treeSchema.
5
+ *
6
+ * Exported for direct use in tests and other tools.
7
+ */
8
+ function generateAgentMd(manifest, treeSchema) {
9
+ const lines = [];
10
+ lines.push("---");
11
+ lines.push(`name: ${manifest.name}`);
12
+ lines.push(`category: ${manifest.category}`);
13
+ lines.push(`uri: ${manifest.uriTemplate}`);
14
+ if (treeSchema) {
15
+ lines.push("operations:");
16
+ for (const op of treeSchema.operations) lines.push(` - ${op}`);
17
+ }
18
+ if (manifest.tags?.length) {
19
+ lines.push("tags:");
20
+ for (const tag of manifest.tags) lines.push(` - ${tag}`);
21
+ }
22
+ if (treeSchema?.auth) {
23
+ lines.push(`auth: ${treeSchema.auth.type}`);
24
+ if (treeSchema.auth.env?.length) {
25
+ lines.push("auth_env:");
26
+ for (const env of treeSchema.auth.env) lines.push(` - ${env}`);
27
+ }
28
+ }
29
+ lines.push("---");
30
+ lines.push("");
31
+ lines.push(`# ${manifest.name}`);
32
+ lines.push("");
33
+ lines.push(manifest.description);
34
+ lines.push("");
35
+ if (treeSchema) {
36
+ lines.push("## Path Structure");
37
+ lines.push("");
38
+ for (const [path, node] of Object.entries(treeSchema.tree)) {
39
+ let line = `- \`${path}\` — ${node.kind}`;
40
+ if (node.actions?.length) line += ` (actions: ${node.actions.join(", ")})`;
41
+ if (node.destructive?.length) line += ` **[destructive: ${node.destructive.join(", ")}]**`;
42
+ lines.push(line);
43
+ }
44
+ lines.push("");
45
+ }
46
+ if (manifest.useCases?.length) {
47
+ lines.push("## Use Cases");
48
+ lines.push("");
49
+ for (const uc of manifest.useCases) lines.push(`- ${uc}`);
50
+ lines.push("");
51
+ }
52
+ if (treeSchema?.bestFor?.length) {
53
+ lines.push("## Best For");
54
+ lines.push("");
55
+ for (const item of treeSchema.bestFor) lines.push(`- ${item}`);
56
+ lines.push("");
57
+ }
58
+ if (treeSchema?.notFor?.length) {
59
+ lines.push("## Not Recommended For");
60
+ lines.push("");
61
+ for (const item of treeSchema.notFor) lines.push(`- ${item}`);
62
+ lines.push("");
63
+ }
64
+ return lines.join("\n");
65
+ }
66
+ const formatGenAgentMd = (result) => {
67
+ if (typeof result === "string") return result;
68
+ return JSON.stringify(result, null, 2);
69
+ };
70
+ function createGenAgentMdCommand(options) {
71
+ return {
72
+ command: "gen-agent-md <provider>",
73
+ describe: "Generate .afs/AGENT.md for a provider package",
74
+ builder: { provider: {
75
+ type: "string",
76
+ description: "Provider package name (e.g., @aigne/afs-sqlite) or directory path",
77
+ demandOption: true
78
+ } },
79
+ handler: async (argv) => {
80
+ try {
81
+ const providerPath = argv.provider;
82
+ const mod = await import(providerPath);
83
+ let manifest;
84
+ let treeSchema;
85
+ for (const key of Object.keys(mod)) {
86
+ const val = mod[key];
87
+ if (typeof val !== "function") continue;
88
+ if (typeof val.manifest !== "function") continue;
89
+ const result = val.manifest();
90
+ const m = Array.isArray(result) ? result[0] : result;
91
+ if (m?.name) {
92
+ manifest = m;
93
+ if (typeof val.treeSchema === "function") treeSchema = val.treeSchema();
94
+ break;
95
+ }
96
+ }
97
+ if (!manifest) {
98
+ options.onResult({
99
+ command: "gen-agent-md",
100
+ result: null,
101
+ format: formatGenAgentMd,
102
+ error: { message: `No provider class with static manifest() found in ${providerPath}` }
103
+ });
104
+ return;
105
+ }
106
+ const content = generateAgentMd(manifest, treeSchema);
107
+ options.onResult({
108
+ command: "gen-agent-md",
109
+ result: content,
110
+ format: formatGenAgentMd
111
+ });
112
+ } catch (err) {
113
+ options.onResult({
114
+ command: "gen-agent-md",
115
+ result: null,
116
+ format: formatGenAgentMd,
117
+ error: { message: `Failed to generate AGENT.md: ${err}` }
118
+ });
119
+ }
120
+ }
121
+ };
122
+ }
123
+
124
+ //#endregion
125
+ exports.createGenAgentMdCommand = createGenAgentMdCommand;
126
+ exports.generateAgentMd = generateAgentMd;
@@ -0,0 +1,2 @@
1
+ import "./types.mjs";
2
+ import { CommandModule } from "yargs";
@@ -0,0 +1,125 @@
1
+ //#region src/core/commands/gen-agent-md.ts
2
+ /**
3
+ * Generate AGENT.md content from manifest and optional treeSchema.
4
+ *
5
+ * Exported for direct use in tests and other tools.
6
+ */
7
+ function generateAgentMd(manifest, treeSchema) {
8
+ const lines = [];
9
+ lines.push("---");
10
+ lines.push(`name: ${manifest.name}`);
11
+ lines.push(`category: ${manifest.category}`);
12
+ lines.push(`uri: ${manifest.uriTemplate}`);
13
+ if (treeSchema) {
14
+ lines.push("operations:");
15
+ for (const op of treeSchema.operations) lines.push(` - ${op}`);
16
+ }
17
+ if (manifest.tags?.length) {
18
+ lines.push("tags:");
19
+ for (const tag of manifest.tags) lines.push(` - ${tag}`);
20
+ }
21
+ if (treeSchema?.auth) {
22
+ lines.push(`auth: ${treeSchema.auth.type}`);
23
+ if (treeSchema.auth.env?.length) {
24
+ lines.push("auth_env:");
25
+ for (const env of treeSchema.auth.env) lines.push(` - ${env}`);
26
+ }
27
+ }
28
+ lines.push("---");
29
+ lines.push("");
30
+ lines.push(`# ${manifest.name}`);
31
+ lines.push("");
32
+ lines.push(manifest.description);
33
+ lines.push("");
34
+ if (treeSchema) {
35
+ lines.push("## Path Structure");
36
+ lines.push("");
37
+ for (const [path, node] of Object.entries(treeSchema.tree)) {
38
+ let line = `- \`${path}\` — ${node.kind}`;
39
+ if (node.actions?.length) line += ` (actions: ${node.actions.join(", ")})`;
40
+ if (node.destructive?.length) line += ` **[destructive: ${node.destructive.join(", ")}]**`;
41
+ lines.push(line);
42
+ }
43
+ lines.push("");
44
+ }
45
+ if (manifest.useCases?.length) {
46
+ lines.push("## Use Cases");
47
+ lines.push("");
48
+ for (const uc of manifest.useCases) lines.push(`- ${uc}`);
49
+ lines.push("");
50
+ }
51
+ if (treeSchema?.bestFor?.length) {
52
+ lines.push("## Best For");
53
+ lines.push("");
54
+ for (const item of treeSchema.bestFor) lines.push(`- ${item}`);
55
+ lines.push("");
56
+ }
57
+ if (treeSchema?.notFor?.length) {
58
+ lines.push("## Not Recommended For");
59
+ lines.push("");
60
+ for (const item of treeSchema.notFor) lines.push(`- ${item}`);
61
+ lines.push("");
62
+ }
63
+ return lines.join("\n");
64
+ }
65
+ const formatGenAgentMd = (result) => {
66
+ if (typeof result === "string") return result;
67
+ return JSON.stringify(result, null, 2);
68
+ };
69
+ function createGenAgentMdCommand(options) {
70
+ return {
71
+ command: "gen-agent-md <provider>",
72
+ describe: "Generate .afs/AGENT.md for a provider package",
73
+ builder: { provider: {
74
+ type: "string",
75
+ description: "Provider package name (e.g., @aigne/afs-sqlite) or directory path",
76
+ demandOption: true
77
+ } },
78
+ handler: async (argv) => {
79
+ try {
80
+ const providerPath = argv.provider;
81
+ const mod = await import(providerPath);
82
+ let manifest;
83
+ let treeSchema;
84
+ for (const key of Object.keys(mod)) {
85
+ const val = mod[key];
86
+ if (typeof val !== "function") continue;
87
+ if (typeof val.manifest !== "function") continue;
88
+ const result = val.manifest();
89
+ const m = Array.isArray(result) ? result[0] : result;
90
+ if (m?.name) {
91
+ manifest = m;
92
+ if (typeof val.treeSchema === "function") treeSchema = val.treeSchema();
93
+ break;
94
+ }
95
+ }
96
+ if (!manifest) {
97
+ options.onResult({
98
+ command: "gen-agent-md",
99
+ result: null,
100
+ format: formatGenAgentMd,
101
+ error: { message: `No provider class with static manifest() found in ${providerPath}` }
102
+ });
103
+ return;
104
+ }
105
+ const content = generateAgentMd(manifest, treeSchema);
106
+ options.onResult({
107
+ command: "gen-agent-md",
108
+ result: content,
109
+ format: formatGenAgentMd
110
+ });
111
+ } catch (err) {
112
+ options.onResult({
113
+ command: "gen-agent-md",
114
+ result: null,
115
+ format: formatGenAgentMd,
116
+ error: { message: `Failed to generate AGENT.md: ${err}` }
117
+ });
118
+ }
119
+ }
120
+ };
121
+ }
122
+
123
+ //#endregion
124
+ export { createGenAgentMdCommand, generateAgentMd };
125
+ //# sourceMappingURL=gen-agent-md.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gen-agent-md.mjs","names":[],"sources":["../../../src/core/commands/gen-agent-md.ts"],"sourcesContent":["/**\n * gen-agent-md Command\n *\n * Generates a .afs/AGENT.md file from a provider's manifest and treeSchema.\n * This is a developer tool for provider authors.\n */\n\nimport type { CommandModule } from \"yargs\";\nimport type { CommandFactoryOptions, FormatFunction } from \"./types.js\";\n\nexport interface GenAgentMdArgs {\n provider: string;\n}\n\ninterface ManifestInput {\n name: string;\n description: string;\n category: string;\n uriTemplate: string;\n tags?: string[];\n useCases?: string[];\n}\n\ninterface TreeSchemaInput {\n operations: string[];\n tree: Record<\n string,\n { kind: string; operations?: string[]; actions?: string[]; destructive?: string[] }\n >;\n auth?: { type: string; env?: string[] };\n bestFor?: string[];\n notFor?: string[];\n}\n\n/**\n * Generate AGENT.md content from manifest and optional treeSchema.\n *\n * Exported for direct use in tests and other tools.\n */\nexport function generateAgentMd(manifest: ManifestInput, treeSchema?: TreeSchemaInput): string {\n const lines: string[] = [];\n\n // YAML frontmatter\n lines.push(\"---\");\n lines.push(`name: ${manifest.name}`);\n lines.push(`category: ${manifest.category}`);\n lines.push(`uri: ${manifest.uriTemplate}`);\n\n if (treeSchema) {\n lines.push(\"operations:\");\n for (const op of treeSchema.operations) {\n lines.push(` - ${op}`);\n }\n }\n\n if (manifest.tags?.length) {\n lines.push(\"tags:\");\n for (const tag of manifest.tags) {\n lines.push(` - ${tag}`);\n }\n }\n\n if (treeSchema?.auth) {\n lines.push(`auth: ${treeSchema.auth.type}`);\n if (treeSchema.auth.env?.length) {\n lines.push(\"auth_env:\");\n for (const env of treeSchema.auth.env) {\n lines.push(` - ${env}`);\n }\n }\n }\n\n lines.push(\"---\");\n lines.push(\"\");\n\n // Markdown body\n lines.push(`# ${manifest.name}`);\n lines.push(\"\");\n lines.push(manifest.description);\n lines.push(\"\");\n\n // Path structure from treeSchema\n if (treeSchema) {\n lines.push(\"## Path Structure\");\n lines.push(\"\");\n for (const [path, node] of Object.entries(treeSchema.tree)) {\n let line = `- \\`${path}\\` — ${node.kind}`;\n if (node.actions?.length) {\n line += ` (actions: ${node.actions.join(\", \")})`;\n }\n if (node.destructive?.length) {\n line += ` **[destructive: ${node.destructive.join(\", \")}]**`;\n }\n lines.push(line);\n }\n lines.push(\"\");\n }\n\n // Use cases\n if (manifest.useCases?.length) {\n lines.push(\"## Use Cases\");\n lines.push(\"\");\n for (const uc of manifest.useCases) {\n lines.push(`- ${uc}`);\n }\n lines.push(\"\");\n }\n\n // Best for / Not for\n if (treeSchema?.bestFor?.length) {\n lines.push(\"## Best For\");\n lines.push(\"\");\n for (const item of treeSchema.bestFor) {\n lines.push(`- ${item}`);\n }\n lines.push(\"\");\n }\n\n if (treeSchema?.notFor?.length) {\n lines.push(\"## Not Recommended For\");\n lines.push(\"\");\n for (const item of treeSchema.notFor) {\n lines.push(`- ${item}`);\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n}\n\nconst formatGenAgentMd: FormatFunction = (result) => {\n if (typeof result === \"string\") return result;\n return JSON.stringify(result, null, 2);\n};\n\nexport function createGenAgentMdCommand(\n options: CommandFactoryOptions,\n): CommandModule<unknown, GenAgentMdArgs> {\n return {\n command: \"gen-agent-md <provider>\",\n describe: \"Generate .afs/AGENT.md for a provider package\",\n builder: {\n provider: {\n type: \"string\",\n description: \"Provider package name (e.g., @aigne/afs-sqlite) or directory path\",\n demandOption: true,\n },\n },\n handler: async (argv) => {\n try {\n const providerPath = argv.provider;\n\n // Dynamic import the provider package\n const mod = (await import(providerPath)) as Record<string, unknown>;\n\n // Find the provider class with static manifest()\n let manifest: ManifestInput | undefined;\n let treeSchema: TreeSchemaInput | undefined;\n\n for (const key of Object.keys(mod)) {\n const val = mod[key];\n if (typeof val !== \"function\") continue;\n if (typeof (val as any).manifest !== \"function\") continue;\n\n const result = (val as any).manifest();\n const m = Array.isArray(result) ? result[0] : result;\n if (m?.name) {\n manifest = m;\n if (typeof (val as any).treeSchema === \"function\") {\n treeSchema = (val as any).treeSchema();\n }\n break;\n }\n }\n\n if (!manifest) {\n options.onResult({\n command: \"gen-agent-md\",\n result: null,\n format: formatGenAgentMd,\n error: { message: `No provider class with static manifest() found in ${providerPath}` },\n });\n return;\n }\n\n const content = generateAgentMd(manifest, treeSchema);\n\n options.onResult({\n command: \"gen-agent-md\",\n result: content,\n format: formatGenAgentMd,\n });\n } catch (err) {\n options.onResult({\n command: \"gen-agent-md\",\n result: null,\n format: formatGenAgentMd,\n error: { message: `Failed to generate AGENT.md: ${err}` },\n });\n }\n },\n };\n}\n"],"mappings":"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"}
@@ -1,15 +1,21 @@
1
+ const require_connect = require('./connect.cjs');
2
+ const require_daemon = require('./daemon.cjs');
1
3
  const require_types = require('./types.cjs');
2
4
  const require_delete = require('./delete.cjs');
3
5
  const require_exec_args = require('../helpers/exec-args.cjs');
4
6
  const require_exec = require('./exec.cjs');
5
7
  const require_explain = require('./explain.cjs');
6
8
  const require_explore = require('./explore.cjs');
9
+ const require_gen_agent_md = require('./gen-agent-md.cjs');
10
+ const require_install = require('./install.cjs');
7
11
  const require_ls = require('./ls.cjs');
12
+ const require_mcp_bridge = require('./mcp-bridge.cjs');
8
13
  const require_mount = require('./mount.cjs');
9
14
  const require_read = require('./read.cjs');
10
15
  const require_search = require('./search.cjs');
11
16
  const require_serve = require('./serve.cjs');
12
17
  const require_stat = require('./stat.cjs');
18
+ const require_vault = require('./vault.cjs');
13
19
  const require_write = require('./write.cjs');
14
20
 
15
21
  //#region src/core/commands/index.ts
@@ -29,7 +35,13 @@ const commandFactories = [
29
35
  require_search.createSearchCommand,
30
36
  require_mount.createMountCommand,
31
37
  require_serve.createServeCommand,
32
- require_explore.createExploreCommand
38
+ require_explore.createExploreCommand,
39
+ require_vault.createVaultCommand,
40
+ require_daemon.createServiceCommand,
41
+ require_connect.createConnectCommand,
42
+ require_mcp_bridge.createMcpBridgeCommand,
43
+ require_gen_agent_md.createGenAgentMdCommand,
44
+ require_install.createInstallCommand
33
45
  ];
34
46
 
35
47
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/core/commands/index.ts"],"mappings":";;;;;;;;;;;;;;;;;cAmDa,gBAAA,EAAkB,cAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/core/commands/index.ts"],"mappings":";;;;;;;;;;;;;;;;;cAmEa,gBAAA,EAAkB,cAAA"}
@@ -1,15 +1,21 @@
1
1
  import { CommandFactory, CommandFactoryOptions, CommandOutput, FormatFunction } from "./types.mjs";
2
+ import "./connect.mjs";
3
+ import "./daemon.mjs";
2
4
  import { DeleteArgs, createDeleteCommand } from "./delete.mjs";
3
5
  import { parseExecArgs, parseValueBySchema } from "../helpers/exec-args.mjs";
4
6
  import { ExecArgs, createExecCommand } from "./exec.mjs";
5
7
  import { ExplainArgs, createExplainCommand } from "./explain.mjs";
6
8
  import "./explore.mjs";
9
+ import "./gen-agent-md.mjs";
10
+ import "./install.mjs";
7
11
  import { LsArgs, createLsCommand } from "./ls.mjs";
12
+ import "./mcp-bridge.mjs";
8
13
  import { MountAddArgs, MountListArgs, MountRemoveArgs, createMountCommand } from "./mount.mjs";
9
14
  import { ReadArgs, createReadCommand } from "./read.mjs";
10
15
  import "./search.mjs";
11
16
  import "./serve.mjs";
12
17
  import { StatArgs, createStatCommand } from "./stat.mjs";
18
+ import "./vault.mjs";
13
19
  import { WriteArgs, createWriteCommand } from "./write.mjs";
14
20
 
15
21
  //#region src/core/commands/index.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/core/commands/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;cAmDa,gBAAA,EAAkB,cAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/core/commands/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;cAmEa,gBAAA,EAAkB,cAAA"}
@@ -1,15 +1,21 @@
1
+ import { createConnectCommand } from "./connect.mjs";
2
+ import { createServiceCommand } from "./daemon.mjs";
1
3
  import { resolveAFS } from "./types.mjs";
2
4
  import { createDeleteCommand } from "./delete.mjs";
3
5
  import { parseExecArgs, parseValueBySchema } from "../helpers/exec-args.mjs";
4
6
  import { createExecCommand } from "./exec.mjs";
5
7
  import { createExplainCommand } from "./explain.mjs";
6
8
  import { createExploreCommand } from "./explore.mjs";
9
+ import { createGenAgentMdCommand, generateAgentMd } from "./gen-agent-md.mjs";
10
+ import { createInstallCommand } from "./install.mjs";
7
11
  import { createLsCommand } from "./ls.mjs";
12
+ import { createMcpBridgeCommand } from "./mcp-bridge.mjs";
8
13
  import { createMountCommand } from "./mount.mjs";
9
14
  import { createReadCommand } from "./read.mjs";
10
15
  import { createSearchCommand } from "./search.mjs";
11
16
  import { createServeCommand } from "./serve.mjs";
12
17
  import { createStatCommand } from "./stat.mjs";
18
+ import { createVaultCommand } from "./vault.mjs";
13
19
  import { createWriteCommand } from "./write.mjs";
14
20
 
15
21
  //#region src/core/commands/index.ts
@@ -29,7 +35,13 @@ const commandFactories = [
29
35
  createSearchCommand,
30
36
  createMountCommand,
31
37
  createServeCommand,
32
- createExploreCommand
38
+ createExploreCommand,
39
+ createVaultCommand,
40
+ createServiceCommand,
41
+ createConnectCommand,
42
+ createMcpBridgeCommand,
43
+ createGenAgentMdCommand,
44
+ createInstallCommand
33
45
  ];
34
46
 
35
47
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/core/commands/index.ts"],"sourcesContent":["/**\n * CLI Core Commands\n *\n * Re-exports all command implementations and factories.\n */\n\n// Command factories and types\nexport { createDeleteCommand, type DeleteArgs } from \"./delete.js\";\nexport { createExecCommand, type ExecArgs, parseExecArgs, parseValueBySchema } from \"./exec.js\";\nexport { createExplainCommand, type ExplainArgs } from \"./explain.js\";\nexport { createExploreCommand, type ExploreArgs } from \"./explore.js\";\nexport { createLsCommand, type LsArgs } from \"./ls.js\";\nexport {\n createMountCommand,\n type MountAddArgs,\n type MountListArgs,\n type MountRemoveArgs,\n} from \"./mount.js\";\nexport { createReadCommand, type ReadArgs } from \"./read.js\";\nexport { createSearchCommand, type SearchArgs } from \"./search.js\";\nexport { createServeCommand, type ServeArgs, type ServeResult } from \"./serve.js\";\nexport { createStatCommand, type StatArgs } from \"./stat.js\";\n// Types and helpers\nexport type {\n CommandFactory,\n CommandFactoryOptions,\n CommandOutput,\n FormatFunction,\n} from \"./types.js\";\nexport { resolveAFS } from \"./types.js\";\nexport { createWriteCommand, type WriteArgs } from \"./write.js\";\n\n// Import factories for array export\nimport { createDeleteCommand } from \"./delete.js\";\nimport { createExecCommand } from \"./exec.js\";\nimport { createExplainCommand } from \"./explain.js\";\nimport { createExploreCommand } from \"./explore.js\";\nimport { createLsCommand } from \"./ls.js\";\nimport { createMountCommand } from \"./mount.js\";\nimport { createReadCommand } from \"./read.js\";\nimport { createSearchCommand } from \"./search.js\";\nimport { createServeCommand } from \"./serve.js\";\nimport { createStatCommand } from \"./stat.js\";\nimport type { CommandFactory } from \"./types.js\";\nimport { createWriteCommand } from \"./write.js\";\n\n/**\n * Array of all command factories\n *\n * Used by AFSCommandExecutor to register all commands.\n */\nexport const commandFactories: CommandFactory[] = [\n createLsCommand,\n createReadCommand,\n createWriteCommand,\n createDeleteCommand,\n createStatCommand,\n createExecCommand,\n createExplainCommand,\n createSearchCommand,\n createMountCommand,\n createServeCommand,\n createExploreCommand,\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAmDA,MAAa,mBAAqC;CAChD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/core/commands/index.ts"],"sourcesContent":["/**\n * CLI Core Commands\n *\n * Re-exports all command implementations and factories.\n */\n\nexport { type ConnectArgs, createConnectCommand } from \"./connect.js\";\nexport { createServiceCommand, type ServiceArgs } from \"./daemon.js\";\n// Command factories and types\nexport { createDeleteCommand, type DeleteArgs } from \"./delete.js\";\nexport { createExecCommand, type ExecArgs, parseExecArgs, parseValueBySchema } from \"./exec.js\";\nexport { createExplainCommand, type ExplainArgs } from \"./explain.js\";\nexport { createExploreCommand, type ExploreArgs } from \"./explore.js\";\nexport { createGenAgentMdCommand, type GenAgentMdArgs, generateAgentMd } from \"./gen-agent-md.js\";\nexport {\n createInstallCommand,\n type InstallAddArgs,\n type InstallRemoveArgs,\n} from \"./install.js\";\nexport { createLsCommand, type LsArgs } from \"./ls.js\";\nexport { createMcpBridgeCommand, type McpBridgeArgs } from \"./mcp-bridge.js\";\nexport {\n createMountCommand,\n type MountAddArgs,\n type MountListArgs,\n type MountRemoveArgs,\n} from \"./mount.js\";\nexport { createReadCommand, type ReadArgs } from \"./read.js\";\nexport { createSearchCommand, type SearchArgs } from \"./search.js\";\nexport { createServeCommand, type ServeArgs, type ServeResult } from \"./serve.js\";\nexport { createStatCommand, type StatArgs } from \"./stat.js\";\n// Types and helpers\nexport type {\n CommandFactory,\n CommandFactoryOptions,\n CommandOutput,\n FormatFunction,\n} from \"./types.js\";\nexport { resolveAFS } from \"./types.js\";\nexport { createVaultCommand } from \"./vault.js\";\nexport { createWriteCommand, type WriteArgs } from \"./write.js\";\n\n// Import factories for array export\nimport { createConnectCommand } from \"./connect.js\";\nimport { createServiceCommand } from \"./daemon.js\";\nimport { createDeleteCommand } from \"./delete.js\";\nimport { createExecCommand } from \"./exec.js\";\nimport { createExplainCommand } from \"./explain.js\";\nimport { createExploreCommand } from \"./explore.js\";\nimport { createGenAgentMdCommand } from \"./gen-agent-md.js\";\nimport { createInstallCommand } from \"./install.js\";\nimport { createLsCommand } from \"./ls.js\";\nimport { createMcpBridgeCommand } from \"./mcp-bridge.js\";\nimport { createMountCommand } from \"./mount.js\";\nimport { createReadCommand } from \"./read.js\";\nimport { createSearchCommand } from \"./search.js\";\nimport { createServeCommand } from \"./serve.js\";\nimport { createStatCommand } from \"./stat.js\";\nimport type { CommandFactory } from \"./types.js\";\nimport { createVaultCommand } from \"./vault.js\";\nimport { createWriteCommand } from \"./write.js\";\n\n/**\n * Array of all command factories\n *\n * Used by AFSCommandExecutor to register all commands.\n */\nexport const commandFactories: CommandFactory[] = [\n createLsCommand,\n createReadCommand,\n createWriteCommand,\n createDeleteCommand,\n createStatCommand,\n createExecCommand,\n createExplainCommand,\n createSearchCommand,\n createMountCommand,\n createServeCommand,\n createExploreCommand,\n createVaultCommand,\n createServiceCommand,\n createConnectCommand,\n createMcpBridgeCommand,\n createGenAgentMdCommand,\n createInstallCommand,\n];\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAmEA,MAAa,mBAAqC;CAChD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD"}