argsbarg 6.1.1 → 6.1.3

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 (229) hide show
  1. package/CHANGELOG.md +72 -1
  2. package/README.md +17 -19
  3. package/bin/argsbarg +10 -0
  4. package/docs/README.md +4 -3
  5. package/docs/ai-skills.md +4 -2
  6. package/docs/bundled-docs.md +50 -25
  7. package/docs/cli-program.md +76 -10
  8. package/docs/config-schema.md +10 -11
  9. package/docs/configure.md +2 -0
  10. package/docs/decisions.md +40 -0
  11. package/docs/developing.md +43 -5
  12. package/docs/http-server.md +171 -0
  13. package/docs/json-schema-subset.md +51 -0
  14. package/docs/mcp.md +4 -2
  15. package/docs/output-schema.md +55 -62
  16. package/examples/formats.ts +6 -6
  17. package/examples/full-example/Formula/full-example.rb +35 -0
  18. package/examples/full-example/README.md +20 -21
  19. package/examples/full-example/docs/README.md +1 -1
  20. package/examples/full-example/docs/cli-schema.json +1790 -98
  21. package/examples/full-example/docs/cli.md +1990 -0
  22. package/examples/full-example/docs/http.md +28 -29
  23. package/examples/full-example/docs/mcp.md +8 -22
  24. package/examples/full-example/docs/openapi.json +783 -50
  25. package/examples/full-example/docs/skill.md +10 -10
  26. package/examples/full-example/justfile +11 -1
  27. package/examples/full-example/src/commands/render-json/__generated__/RenderJsonInputSchema.json +15 -0
  28. package/examples/full-example/src/commands/render-json/__generated__/index.ts +5 -0
  29. package/examples/full-example/src/commands/render-json/command.test.ts +46 -0
  30. package/examples/full-example/src/commands/render-json/command.ts +30 -0
  31. package/examples/full-example/src/commands/render-json/types.ts +9 -0
  32. package/examples/full-example/src/commands/status/__generated__/StatusJsonOutputSchema.json +15 -0
  33. package/examples/full-example/src/commands/status/__generated__/index.ts +2 -2
  34. package/examples/full-example/src/commands/status/command.ts +5 -13
  35. package/examples/full-example/src/commands/status/types.ts +1 -14
  36. package/examples/full-example/src/commands/workspaces/__generated__/WorkspaceNameInputSchema.json +15 -0
  37. package/examples/full-example/src/commands/workspaces/__generated__/index.ts +5 -0
  38. package/examples/full-example/src/commands/workspaces/command.test.ts +58 -0
  39. package/examples/full-example/src/commands/workspaces/command.ts +94 -0
  40. package/examples/full-example/src/commands/workspaces/types.ts +6 -0
  41. package/examples/full-example/src/db/index.test.ts +86 -0
  42. package/examples/full-example/src/db/index.ts +101 -0
  43. package/examples/full-example/src/db/migrate.test.ts +35 -0
  44. package/examples/full-example/src/db/migrate.ts +69 -0
  45. package/examples/full-example/src/db/migrations/001_workspaces.sql +6 -0
  46. package/examples/full-example/src/db/tables/workspaces.ts +66 -0
  47. package/examples/full-example/src/program.ts +11 -36
  48. package/examples/full-example/src/types/argsbarg.d.ts +11 -0
  49. package/examples/full-example/src/types/md.d.ts +4 -0
  50. package/examples/full-example/tsconfig.json +5 -2
  51. package/examples/mcp-test.ts +1 -2
  52. package/examples/minimal.ts +1 -7
  53. package/examples/nested.ts +1 -2
  54. package/examples/option-required.ts +1 -1
  55. package/examples/servers.ts +4 -5
  56. package/index.d.ts +440 -136
  57. package/package.json +19 -2
  58. package/src/builtins/builtins.test.ts +7 -7
  59. package/src/builtins/completion-bash.ts +1 -1
  60. package/src/builtins/completion-fish.ts +1 -1
  61. package/src/builtins/completion-group.ts +4 -4
  62. package/src/builtins/completion-simulate-shared.ts +9 -0
  63. package/src/builtins/completion-zsh.ts +1 -1
  64. package/src/builtins/config.test.ts +3 -3
  65. package/src/builtins/config.ts +9 -9
  66. package/src/builtins/configure-copy.ts +2 -2
  67. package/src/builtins/configure.ts +4 -4
  68. package/src/builtins/dispatch.ts +19 -18
  69. package/src/builtins/export.ts +7 -5
  70. package/src/builtins/http.ts +68 -0
  71. package/src/builtins/mcp.ts +28 -4
  72. package/src/builtins/presentation.ts +6 -6
  73. package/src/builtins/registry.ts +6 -6
  74. package/src/builtins/scopes.ts +2 -2
  75. package/src/builtins/version.ts +1 -1
  76. package/src/cli-tool/full-example-capabilities.test.ts +10 -15
  77. package/src/cli-tool/main.ts +1 -1
  78. package/src/cli-tool/program.ts +3 -2
  79. package/src/cli-tool/prompt.ts +1 -1
  80. package/src/cli-tool/run-schemagen.ts +1 -3
  81. package/src/cli-tool/schemagen/cleanup.ts +6 -7
  82. package/src/cli-tool/schemagen/discover-schema-roots.ts +66 -120
  83. package/src/cli-tool/schemagen/index.ts +2 -2
  84. package/src/cli-tool/schemagen/names.ts +8 -13
  85. package/src/cli-tool/schemagen/run.ts +21 -28
  86. package/src/cli-tool/schemagen/schemagen.test.ts +136 -46
  87. package/src/config/bindings.test.ts +1 -1
  88. package/src/config/bindings.ts +1 -1
  89. package/src/config/bootstrap.test.ts +1 -1
  90. package/src/config/bootstrap.ts +36 -4
  91. package/src/config/context.test.ts +1 -1
  92. package/src/config/context.ts +1 -1
  93. package/src/config/entry.ts +1 -1
  94. package/src/config/file.test.ts +1 -1
  95. package/src/config/file.ts +3 -3
  96. package/src/config/manifest.ts +1 -1
  97. package/src/config/resolve.test.ts +1 -1
  98. package/src/config/resolve.ts +1 -1
  99. package/src/config/schema.ts +1 -1
  100. package/src/config/validate.ts +1 -1
  101. package/src/{install → configure/artifacts}/binary-placement.test.ts +1 -1
  102. package/src/{install → configure/artifacts}/binary-placement.ts +1 -1
  103. package/src/{install → configure/artifacts}/gh-release-update.ts +1 -1
  104. package/src/{install → configure/artifacts}/install-validate.test.ts +3 -3
  105. package/src/{install → configure/artifacts}/mcp-config.ts +1 -1
  106. package/src/{install → configure/artifacts}/mcp-opencode.test.ts +1 -1
  107. package/src/{install → configure/artifacts}/mcp-opencode.ts +1 -1
  108. package/src/{install → configure/artifacts}/paths.ts +5 -5
  109. package/src/configure/artifacts/plan.ts +24 -0
  110. package/src/{install → configure/artifacts}/status.test.ts +1 -1
  111. package/src/{install → configure/artifacts}/status.ts +2 -2
  112. package/src/{install → configure/artifacts}/target-base.ts +1 -1
  113. package/src/{install → configure/artifacts}/target-detect.ts +1 -1
  114. package/src/{install → configure/artifacts}/target-effective.ts +3 -9
  115. package/src/{install → configure/artifacts}/target-mcp-cli.ts +1 -1
  116. package/src/{install → configure/artifacts}/target-mcp-json.ts +1 -1
  117. package/src/{install → configure/artifacts}/target-plan-build.ts +2 -2
  118. package/src/{install → configure/artifacts}/target-registry.ts +2 -2
  119. package/src/{install → configure/artifacts}/target-scope.ts +3 -3
  120. package/src/{install → configure/artifacts}/target-skill.ts +1 -1
  121. package/src/{install → configure/artifacts}/target-types.ts +2 -2
  122. package/src/{install → configure/artifacts}/targets/app.ts +5 -5
  123. package/src/{install → configure/artifacts}/targets/chatgpt-mcp.ts +2 -2
  124. package/src/{install → configure/artifacts}/targets/claude-code-mcp.ts +2 -2
  125. package/src/{install → configure/artifacts}/targets/claude-desktop-mcp.ts +2 -2
  126. package/src/{install → configure/artifacts}/targets/claude-skill.ts +2 -2
  127. package/src/{install → configure/artifacts}/targets/codex-mcp.ts +2 -2
  128. package/src/{install → configure/artifacts}/targets/codex-skill.ts +2 -2
  129. package/src/{install → configure/artifacts}/targets/configure.ts +5 -5
  130. package/src/{install → configure/artifacts}/targets/cursor-mcp.ts +2 -2
  131. package/src/{install → configure/artifacts}/targets/cursor-skill.ts +2 -2
  132. package/src/{install → configure/artifacts}/targets/index.ts +1 -1
  133. package/src/{install → configure/artifacts}/targets/openclaw-mcp.ts +2 -2
  134. package/src/{install → configure/artifacts}/targets/openclaw-skill.ts +3 -3
  135. package/src/{install → configure/artifacts}/targets/opencode-mcp.ts +5 -5
  136. package/src/{install → configure/artifacts}/targets/opencode-skill.ts +3 -3
  137. package/src/{install → configure/artifacts}/targets.test.ts +1 -1
  138. package/src/{install → configure/artifacts}/uninstall.ts +1 -1
  139. package/src/configure/configure.test.ts +11 -11
  140. package/src/configure/index.ts +14 -14
  141. package/src/configure/prompt.ts +2 -2
  142. package/src/{context.ts → core/context.ts} +26 -20
  143. package/src/core/json-leaf.test.ts +156 -0
  144. package/src/{leaf-inputs.test.ts → core/leaf-inputs.test.ts} +7 -7
  145. package/src/{leaf-inputs.ts → core/leaf-inputs.ts} +76 -16
  146. package/src/{parse.test.ts → core/parse.test.ts} +97 -109
  147. package/src/{parse.ts → core/parse.ts} +173 -25
  148. package/src/{schema.ts → core/schema.ts} +25 -13
  149. package/src/{types.ts → core/types.ts} +238 -35
  150. package/src/{validate.ts → core/validate.ts} +51 -29
  151. package/src/docs/builtin.ts +8 -19
  152. package/src/docs/{api-guide.test.ts → cli-guide.test.ts} +21 -21
  153. package/src/docs/{api-guide.ts → cli-guide.ts} +45 -16
  154. package/src/docs/docs.test.ts +76 -41
  155. package/src/docs/http-guide.ts +37 -34
  156. package/src/docs/mcp-guide.ts +12 -14
  157. package/src/docs/mcp-resources.test.ts +2 -3
  158. package/src/docs/mcp-resources.ts +6 -11
  159. package/src/docs/resolve.ts +22 -30
  160. package/src/docs/save.ts +3 -3
  161. package/src/exports/cli.ts +47 -0
  162. package/src/exports/headless.ts +13 -0
  163. package/src/exports/http.ts +6 -0
  164. package/src/exports/mcp.ts +6 -0
  165. package/src/{headless.test.ts → headless/routing.test.ts} +3 -3
  166. package/src/{headless.ts → headless/routing.ts} +3 -3
  167. package/src/headless/tool-call.ts +114 -46
  168. package/src/help.test.ts +152 -0
  169. package/src/help.ts +54 -18
  170. package/src/hooks/builtin.ts +20 -0
  171. package/src/hooks/run.ts +142 -0
  172. package/src/http/openapi.ts +182 -0
  173. package/src/http/readiness.ts +78 -0
  174. package/src/{api → http}/result.ts +16 -5
  175. package/src/http/routes.ts +329 -0
  176. package/src/http/server.ts +225 -0
  177. package/src/index.ts +38 -25
  178. package/src/log/ecs.test.ts +43 -0
  179. package/src/log/ecs.ts +59 -0
  180. package/src/log/emitter.ts +166 -0
  181. package/src/mcp/bundle.ts +2 -2
  182. package/src/mcp/claude.test.ts +1 -1
  183. package/src/mcp/claude.ts +4 -4
  184. package/src/{hidden-mcpb.test.ts → mcp/hidden-mcpb.test.ts} +10 -9
  185. package/src/mcp/result.ts +2 -2
  186. package/src/mcp/server.ts +54 -6
  187. package/src/mcp/tools.ts +18 -20
  188. package/src/{capabilities.ts → runtime/capabilities.ts} +11 -11
  189. package/src/{cli-errors.ts → runtime/cli-errors.ts} +4 -4
  190. package/src/{cli.ts → runtime/cli.ts} +160 -50
  191. package/src/runtime/exposure.ts +102 -0
  192. package/src/{invoke.test.ts → runtime/invoke.test.ts} +31 -7
  193. package/src/server/context.ts +25 -0
  194. package/src/server/overrides.ts +112 -0
  195. package/src/skill/generate.ts +8 -8
  196. package/src/skill/hint.ts +1 -1
  197. package/src/skill/install.ts +2 -2
  198. package/src/skill/naming.ts +1 -1
  199. package/src/{test-fixtures.ts → test/fixtures.ts} +3 -2
  200. package/src/{config.integration.test.ts → test/integration/config.test.ts} +8 -8
  201. package/src/{api.integration.test.ts → test/integration/http.test.ts} +170 -67
  202. package/src/{mcp.integration.test.ts → test/integration/mcp.test.ts} +11 -57
  203. package/docs/api-server.md +0 -141
  204. package/examples/full-example/docs/api.md +0 -511
  205. package/examples/full-example/src/commands/status/__generated__/outputSchema.json +0 -28
  206. package/examples/full-example/src/config/__generated__/configSchema.json +0 -40
  207. package/examples/full-example/src/config/__generated__/index.ts +0 -5
  208. package/examples/full-example/src/config/types.ts +0 -24
  209. package/src/api/openapi.ts +0 -117
  210. package/src/api/server.ts +0 -120
  211. package/src/builtins/api.ts +0 -38
  212. package/src/hidden.ts +0 -30
  213. package/src/install/plan.ts +0 -53
  214. /package/src/{install → configure/artifacts}/detect-installed.ts +0 -0
  215. /package/src/{install → configure/artifacts}/gh-release-update.test.ts +0 -0
  216. /package/src/{install → configure/artifacts}/mcp-codex.test.ts +0 -0
  217. /package/src/{install → configure/artifacts}/mcp-codex.ts +0 -0
  218. /package/src/{install → configure/artifacts}/mcp-openclaw.test.ts +0 -0
  219. /package/src/{install → configure/artifacts}/mcp-openclaw.ts +0 -0
  220. /package/src/{install → configure/artifacts}/normalize-uninstall.ts +0 -0
  221. /package/src/{install → configure/artifacts}/normalize.ts +0 -0
  222. /package/src/{install → configure/artifacts}/opts.ts +0 -0
  223. /package/src/{install → configure/artifacts}/shell.ts +0 -0
  224. /package/src/{formats.test.ts → core/formats.test.ts} +0 -0
  225. /package/src/{formats.ts → core/formats.ts} +0 -0
  226. /package/src/{respond.ts → core/respond.ts} +0 -0
  227. /package/src/{types.test.ts → core/types.test.ts} +0 -0
  228. /package/src/{api → http}/schema-deref.test.ts +0 -0
  229. /package/src/{api → http}/schema-deref.ts +0 -0
@@ -5,16 +5,16 @@ Domain-specific regression tests (split from index.test.ts).
5
5
  import { expect, test } from "bun:test";
6
6
  import { join } from "node:path";
7
7
  import { $ } from "bun";
8
- import { Cli, type CliContext, CliOptionKind } from "./index.ts";
9
- import { ParseKind, parse, postParseValidate } from "./parse.ts";
10
- import { testProgram, varargsReadFixture } from "./test-fixtures.ts";
11
- import type { CliLeaf } from "./types.ts";
12
- import { isCliRouter } from "./types.ts";
13
- import { cliValidateProgram } from "./validate.ts";
8
+ import { ParseKind, parse, postParseValidate } from "~/core/parse.ts";
9
+ import type { CliLeaf } from "~/core/types.ts";
10
+ import { isCliRouter } from "~/core/types.ts";
11
+ import { cliValidateProgram } from "~/core/validate.ts";
12
+ import { Cli, type CliContext, CliOptionKind } from "~/index";
13
+ import { testProgram, varargsReadFixture } from "~/test/fixtures.ts";
14
14
 
15
15
  /** Tests that ctx.invocation is cli via Cli.run. */
16
16
  test("ctx.invocation is cli via Cli.run", async () => {
17
- const indexPath = join(import.meta.dir, "index.ts");
17
+ const indexPath = join(import.meta.dir, "../index.ts");
18
18
  const { stdout } = await $`bun -e ${`
19
19
  import { Cli, CliProgram } from ${JSON.stringify(indexPath)};
20
20
  const program = {
@@ -45,6 +45,30 @@ test("ctx.invocation is mcp via Cli.invoke", async () => {
45
45
  expect(seen).toBe("mcp");
46
46
  });
47
47
 
48
+ /** Tests that ctx.locals.requestId is seeded before handler on invoke. */
49
+ test("Cli.invoke seeds ctx.locals.requestId", async () => {
50
+ let requestId = "";
51
+ const root = testProgram({
52
+ key: "app",
53
+ description: "",
54
+ hooks: {
55
+ beforeInvoke: (ctx: CliContext) => {
56
+ requestId = String(ctx.locals.requestId ?? "");
57
+ },
58
+ },
59
+ handler: () => {},
60
+ });
61
+ cliValidateProgram(root);
62
+ const wireId = "00000000-0000-4000-8000-000000000001";
63
+ const result = await new Cli(root).invoke([], {
64
+ invocation: "http",
65
+ requestId: wireId,
66
+ http: { request: new Request("http://localhost/"), clientIp: "127.0.0.1", requestId: wireId },
67
+ });
68
+ expect(result.kind).toBe("ok");
69
+ expect(requestId).toBe(wireId);
70
+ });
71
+
48
72
  /** Cli.invoke rejects invalid Enum value. */
49
73
  test("Cli.invoke rejects invalid Enum value", async () => {
50
74
  const root = testProgram({
@@ -0,0 +1,25 @@
1
+ /*
2
+ Per-server mutable handle context passed through HTTP/MCP dispatch.
3
+ */
4
+
5
+ import type { CliHttpWireHooks, CliMcpWireHooks, ServerRuntime, ServerState } from "~/core/types.ts";
6
+ import type { LogEmitter } from "~/log/emitter.ts";
7
+ import type { ResolvedHttpServeConfig, ResolvedMcpServeConfig } from "./overrides.ts";
8
+
9
+ /** Shared server state for one HTTP or MCP serve session. */
10
+ export interface ServerHandleContext {
11
+ runtime: ServerRuntime;
12
+ emitter: LogEmitter;
13
+ http?: ResolvedHttpServeConfig;
14
+ mcp?: ResolvedMcpServeConfig;
15
+ httpHooks?: CliHttpWireHooks;
16
+ mcpHooks?: CliMcpWireHooks;
17
+ }
18
+
19
+ /** Creates a fresh {@link ServerRuntime} for HTTP or MCP. */
20
+ export function createServerRuntime(
21
+ program: import("~/core/types.ts").CliProgram,
22
+ surface: "http" | "mcp",
23
+ ): ServerRuntime {
24
+ return { state: {} as ServerState, program, surface };
25
+ }
@@ -0,0 +1,112 @@
1
+ /*
2
+ CLI flag and programmatic overrides merged into HTTP/MCP server runtime config.
3
+ */
4
+
5
+ import { join } from "node:path";
6
+ import { resolveAppConfigDir } from "~/config/file.ts";
7
+ import type { CliProgram } from "~/core/types.ts";
8
+ import type { ResolvedLogConfig } from "~/log/emitter.ts";
9
+
10
+ /** Overrides from `myapp http` / `serveHttp()` flags and embedders. */
11
+ export interface ServeOverrides {
12
+ host?: string;
13
+ port?: number;
14
+ trustProxy?: boolean;
15
+ obscureErrors?: boolean;
16
+ logFormat?: "json" | "text";
17
+ logFile?: string;
18
+ noAccessLog?: boolean;
19
+ dev?: boolean;
20
+ }
21
+
22
+ /** Resolved HTTP listen and error options after merging schema + overrides. */
23
+ export interface ResolvedHttpServeConfig {
24
+ hostname: string;
25
+ port: number;
26
+ trustProxy: boolean;
27
+ obscureUnexpected: boolean;
28
+ log: ResolvedLogConfig;
29
+ }
30
+
31
+ /** Resolved MCP serve options after merging schema + overrides. */
32
+ export interface ResolvedMcpServeConfig {
33
+ obscureUnexpected: boolean;
34
+ log: ResolvedLogConfig;
35
+ }
36
+
37
+ function resolveLogFile(program: CliProgram, logFile: string | undefined): string | undefined {
38
+ if (!logFile) {
39
+ return undefined;
40
+ }
41
+ if (logFile.startsWith("/") || logFile.startsWith("~")) {
42
+ return logFile;
43
+ }
44
+ return join(resolveAppConfigDir(program), logFile);
45
+ }
46
+
47
+ /** Builds resolved HTTP server config (CLI flags > program schema). */
48
+ export function resolveHttpServeConfig(program: CliProgram, overrides: ServeOverrides = {}): ResolvedHttpServeConfig {
49
+ const http = program.httpServer;
50
+ const obscureUnexpected = overrides.obscureErrors ?? http?.errors?.obscureUnexpected ?? false;
51
+ return {
52
+ hostname: overrides.host ?? http?.host ?? "127.0.0.1",
53
+ port: overrides.port ?? http?.port ?? 3000,
54
+ trustProxy: overrides.trustProxy ?? http?.trustProxy ?? false,
55
+ obscureUnexpected,
56
+ log: {
57
+ format: overrides.logFormat ?? program.log?.format ?? "json",
58
+ file: resolveLogFile(program, overrides.logFile ?? program.log?.file),
59
+ access: overrides.noAccessLog ? false : (program.log?.access ?? true),
60
+ errors: program.log?.errors ?? true,
61
+ dev: overrides.dev ?? false,
62
+ },
63
+ };
64
+ }
65
+
66
+ /** Builds resolved MCP server config (CLI flags > program schema). */
67
+ export function resolveMcpServeConfig(program: CliProgram, overrides: ServeOverrides = {}): ResolvedMcpServeConfig {
68
+ const mcp = program.mcpServer;
69
+ return {
70
+ obscureUnexpected: overrides.obscureErrors ?? mcp?.errors?.obscureUnexpected ?? false,
71
+ log: {
72
+ format: overrides.logFormat ?? program.log?.format ?? "json",
73
+ file: resolveLogFile(program, overrides.logFile ?? program.log?.file),
74
+ access: program.log?.access ?? true,
75
+ errors: program.log?.errors ?? true,
76
+ dev: overrides.dev ?? false,
77
+ },
78
+ };
79
+ }
80
+
81
+ /** Parses `http` / `mcp serve` CLI opts into {@link ServeOverrides}. */
82
+ export function serveOverridesFromOpts(opts: Record<string, string>, surface: "http" | "mcp"): ServeOverrides {
83
+ const out: ServeOverrides = {};
84
+ if (opts.host) {
85
+ out.host = opts.host;
86
+ }
87
+ if (opts.port) {
88
+ const port = Number(opts.port);
89
+ if (!Number.isNaN(port)) {
90
+ out.port = port;
91
+ }
92
+ }
93
+ if (opts["trust-proxy"]) {
94
+ out.trustProxy = true;
95
+ }
96
+ if (opts["obscure-errors"]) {
97
+ out.obscureErrors = true;
98
+ }
99
+ if (opts["log-format"] === "json" || opts["log-format"] === "text") {
100
+ out.logFormat = opts["log-format"];
101
+ }
102
+ if (opts["log-file"]) {
103
+ out.logFile = opts["log-file"];
104
+ }
105
+ if (opts["no-access-log"] && surface === "http") {
106
+ out.noAccessLog = true;
107
+ }
108
+ if (opts.dev) {
109
+ out.dev = true;
110
+ }
111
+ return out;
112
+ }
@@ -2,17 +2,17 @@
2
2
  This module generates Agent Skills content (SKILL.md + reference.md) from a CLI schema.
3
3
  */
4
4
 
5
- import { defaultConfigEntryTitle } from "../config/entry.ts";
6
- import { generateApiGuide } from "../docs/api-guide.ts";
5
+ import { defaultConfigEntryTitle } from "~/config/entry.ts";
6
+ import { collectOptionDefs } from "~/core/parse.ts";
7
+ import { CliOptionKind, type CliProgram } from "~/core/types.ts";
8
+ import { generateCliGuide } from "~/docs/cli-guide.ts";
7
9
  import {
8
10
  collectMcpTools,
9
11
  type McpToolDef,
10
12
  mcpServerId,
11
13
  resolveMcpSchemaUri,
12
14
  sanitizeToolSegment,
13
- } from "../mcp/tools.ts";
14
- import { collectOptionDefs } from "../parse.ts";
15
- import { CliOptionKind, type CliProgram } from "../types.ts";
15
+ } from "~/mcp/tools.ts";
16
16
  import type { SkillTarget } from "./naming.ts";
17
17
  import { skillDirNameForTarget, skillFrontmatterName } from "./naming.ts";
18
18
 
@@ -149,7 +149,7 @@ function buildSkillMd(root: CliProgram, target: SkillTarget, dirName: string): s
149
149
  "",
150
150
  "## Reference",
151
151
  "",
152
- `For full detail, open \`reference.md\` in this skill directory (same as \`${root.key} docs api\`).`,
152
+ `For full detail, open \`reference.md\` in this skill directory (same as \`${root.key} docs cli\`).`,
153
153
  "",
154
154
  );
155
155
 
@@ -190,9 +190,9 @@ function buildSkillMd(root: CliProgram, target: SkillTarget, dirName: string): s
190
190
  return lines.join("\n");
191
191
  }
192
192
 
193
- /** Builds reference.md with the full `docs api` markdown guide. */
193
+ /** Builds reference.md with the compact `docs cli` markdown guide. */
194
194
  function buildReferenceMd(root: CliProgram): string {
195
- return generateApiGuide(root);
195
+ return generateCliGuide(root, { compact: true });
196
196
  }
197
197
 
198
198
  /** Builds MCP routing SKILL.md for Claude Code plugin zips. */
package/src/skill/hint.ts CHANGED
@@ -1,4 +1,4 @@
1
- import type { CliProgram } from "../types.ts";
1
+ import type { CliProgram } from "~/core/types.ts";
2
2
 
3
3
  /** YAML frontmatter block at the start of SKILL.md. */
4
4
  export const MARKDOWN_FRONTMATTER_RE = /^---\r?\n[\s\S]*?\r?\n---\r?\n/;
@@ -1,7 +1,7 @@
1
1
  import { existsSync, mkdirSync, rmSync, writeFileSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import { userHome } from "../paths/host.ts";
4
- import type { CliProgram } from "../types.ts";
3
+ import type { CliProgram } from "~/core/types.ts";
4
+ import { userHome } from "~/paths/host.ts";
5
5
  import { generateSkillBundle, type SkillTarget } from "./generate.ts";
6
6
  import { applySkillInstallHints } from "./hint.ts";
7
7
 
@@ -1,7 +1,7 @@
1
1
  /** Agent skill install targets. */
2
2
  export type SkillTarget = "cursor" | "claude" | "codex" | "opencode" | "openclaw";
3
3
 
4
- import { sanitizeToolSegment } from "../mcp/tools.ts";
4
+ import { sanitizeToolSegment } from "~/mcp/tools.ts";
5
5
 
6
6
  /** Kebab-case skill folder + frontmatter name for agents that require hyphen slugs. */
7
7
  export function skillSlug(programKey: string): string {
@@ -1,5 +1,5 @@
1
- import type { CliProgram } from "./types.ts";
2
- import { CliFallbackMode, CliOptionKind } from "./types.ts";
1
+ import type { CliProgram } from "~/core/types.ts";
2
+ import { CliFallbackMode, CliOptionKind } from "~/core/types.ts";
3
3
 
4
4
  export function testProgram(prog: Record<string, unknown> & { key: string; description: string }): CliProgram {
5
5
  return { version: "0.0.0", ...prog } as CliProgram;
@@ -166,6 +166,7 @@ export function nestedDocsFallbackFixture(): CliProgram {
166
166
  return testProgram({
167
167
  key: "app",
168
168
  description: "",
169
+ docs: { enabled: false },
169
170
  commands: [
170
171
  {
171
172
  key: "docs",
@@ -6,9 +6,9 @@ import { expect, test } from "bun:test";
6
6
  import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
7
7
  import { tmpdir } from "node:os";
8
8
  import { dirname, join } from "node:path";
9
- import { bootstrapAppConfig } from "./config/bootstrap.ts";
10
- import { resolveAppConfigPath } from "./config/file.ts";
11
- import { mcpRequest, testProgram } from "./test-fixtures.ts";
9
+ import { bootstrapAppConfig } from "~/config/bootstrap.ts";
10
+ import { resolveAppConfigPath } from "~/config/file.ts";
11
+ import { mcpRequest, testProgram } from "~/test/fixtures.ts";
12
12
 
13
13
  /** Tests that bootstrapAppConfig prefers host env over config file. */
14
14
  test("bootstrapAppConfig prefers host env over config file", () => {
@@ -124,13 +124,13 @@ test("MCP config file loads and exports vars for tool handlers", async () => {
124
124
  rmSync(dir, { recursive: true, force: true });
125
125
  });
126
126
 
127
- /** Cli.run docs api skips required appConfig exit. */
128
- test("Cli.run docs api skips required appConfig exit", async () => {
127
+ /** Cli.run docs cli skips required appConfig exit. */
128
+ test("Cli.run docs cli skips required appConfig exit", async () => {
129
129
  const dir = mkdtempSync(join(tmpdir(), "argsbarg-docs-skip-"));
130
130
  const configFile = join(dir, ".local", "lib", "docs_skip_test", "config");
131
131
  mkdirSync(dirname(configFile), { recursive: true });
132
132
  writeFileSync(configFile, "{}\n");
133
- const entry = join(import.meta.dir, "index.ts");
133
+ const entry = join(import.meta.dir, "..", "..", "index.ts");
134
134
  const mainPath = join(dir, "run-docs.ts");
135
135
  writeFileSync(
136
136
  mainPath,
@@ -139,7 +139,7 @@ const program = {
139
139
  key: "docs-skip-test",
140
140
  version: "1.0.0",
141
141
  description: "test",
142
- docs: { enabled: true, topics: { readme: { text: "# readme\\n" } } },
142
+ docs: { topics: { readme: { text: "# readme\\n" } } },
143
143
  appConfig: {
144
144
  entries: { token: { description: "Token.", env: "DOCS_SKIP_RUN_TOKEN" } },
145
145
  },
@@ -151,7 +151,7 @@ await new Cli(program).run(process.argv.slice(2));
151
151
  const env = { ...process.env, HOME: dir } as Record<string, string | undefined>;
152
152
  delete env.DOCS_SKIP_RUN_TOKEN;
153
153
  try {
154
- const proc = Bun.spawn(["bun", "run", mainPath, "docs", "api"], {
154
+ const proc = Bun.spawn(["bun", "run", mainPath, "docs", "cli"], {
155
155
  stdout: "pipe",
156
156
  stderr: "pipe",
157
157
  env,