@wirecat/cli-base 0.0.0-stage → 0.22.0

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 (241) hide show
  1. package/LICENSE +204 -0
  2. package/README.md +390 -2
  3. package/config/biome.base.json +56 -0
  4. package/config/cspell.json +57 -0
  5. package/config/lefthook.yml +34 -0
  6. package/config/rumdl.toml +9 -0
  7. package/config/tsconfig.base.json +21 -0
  8. package/config/tsconfig.scripts.json +13 -0
  9. package/config/tsconfig.test.json +11 -0
  10. package/config/vale/CliDocs/Filler.yml +9 -0
  11. package/config/vale/CliDocs/SentenceLength.yml +6 -0
  12. package/config/vale/Tg/Tone.yml +7 -0
  13. package/config/wirecat/LICENSE +204 -0
  14. package/config/wirecat/biome.base.json +56 -0
  15. package/config/wirecat/check.mjs +41 -0
  16. package/config/wirecat/cspell.json +80 -0
  17. package/config/wirecat/lefthook.yml +26 -0
  18. package/config/wirecat/manifest.json +23 -0
  19. package/config/wirecat/markdownlint.json +10 -0
  20. package/config/wirecat/rumdl.toml +9 -0
  21. package/dist/codegen/index.d.ts +12 -0
  22. package/dist/codegen/index.d.ts.map +1 -0
  23. package/dist/codegen/index.js +11 -0
  24. package/dist/codegen/index.js.map +1 -0
  25. package/dist/codegen/manifest.d.ts +47 -0
  26. package/dist/codegen/manifest.d.ts.map +1 -0
  27. package/dist/codegen/manifest.js +73 -0
  28. package/dist/codegen/manifest.js.map +1 -0
  29. package/dist/codegen/model.d.ts +146 -0
  30. package/dist/codegen/model.d.ts.map +1 -0
  31. package/dist/codegen/model.js +7 -0
  32. package/dist/codegen/model.js.map +1 -0
  33. package/dist/codegen/names.d.ts +4 -0
  34. package/dist/codegen/names.d.ts.map +1 -0
  35. package/dist/codegen/names.js +46 -0
  36. package/dist/codegen/names.js.map +1 -0
  37. package/dist/codegen/pipeline.d.ts +24 -0
  38. package/dist/codegen/pipeline.d.ts.map +1 -0
  39. package/dist/codegen/pipeline.js +193 -0
  40. package/dist/codegen/pipeline.js.map +1 -0
  41. package/dist/codegen/runtime.d.ts +24 -0
  42. package/dist/codegen/runtime.d.ts.map +1 -0
  43. package/dist/codegen/runtime.js +38 -0
  44. package/dist/codegen/runtime.js.map +1 -0
  45. package/dist/codegen/tree.d.ts +29 -0
  46. package/dist/codegen/tree.d.ts.map +1 -0
  47. package/dist/codegen/tree.js +87 -0
  48. package/dist/codegen/tree.js.map +1 -0
  49. package/dist/codegen/typescript.d.ts +6 -0
  50. package/dist/codegen/typescript.d.ts.map +1 -0
  51. package/dist/codegen/typescript.js +78 -0
  52. package/dist/codegen/typescript.js.map +1 -0
  53. package/dist/codegen/valibot.d.ts +10 -0
  54. package/dist/codegen/valibot.d.ts.map +1 -0
  55. package/dist/codegen/valibot.js +132 -0
  56. package/dist/codegen/valibot.js.map +1 -0
  57. package/dist/commands/document.d.ts +72 -0
  58. package/dist/commands/document.d.ts.map +1 -0
  59. package/dist/commands/document.js +71 -0
  60. package/dist/commands/document.js.map +1 -0
  61. package/dist/commands/index.d.ts +83 -0
  62. package/dist/commands/index.d.ts.map +1 -0
  63. package/dist/commands/index.js +85 -0
  64. package/dist/commands/index.js.map +1 -0
  65. package/dist/commands/page.d.ts +80 -0
  66. package/dist/commands/page.d.ts.map +1 -0
  67. package/dist/commands/page.js +100 -0
  68. package/dist/commands/page.js.map +1 -0
  69. package/dist/completion/index.d.ts +37 -0
  70. package/dist/completion/index.d.ts.map +1 -0
  71. package/dist/completion/index.js +87 -0
  72. package/dist/completion/index.js.map +1 -0
  73. package/dist/config.d.ts +20 -0
  74. package/dist/config.d.ts.map +1 -0
  75. package/dist/config.js +61 -0
  76. package/dist/config.js.map +1 -0
  77. package/dist/credentials.d.ts +48 -0
  78. package/dist/credentials.d.ts.map +1 -0
  79. package/dist/credentials.js +120 -0
  80. package/dist/credentials.js.map +1 -0
  81. package/dist/deadline.d.ts +14 -0
  82. package/dist/deadline.d.ts.map +1 -0
  83. package/dist/deadline.js +88 -0
  84. package/dist/deadline.js.map +1 -0
  85. package/dist/dev/bin.d.ts +3 -0
  86. package/dist/dev/bin.d.ts.map +1 -0
  87. package/dist/dev/bin.js +8 -0
  88. package/dist/dev/bin.js.map +1 -0
  89. package/dist/dev/lint.d.ts +31 -0
  90. package/dist/dev/lint.d.ts.map +1 -0
  91. package/dist/dev/lint.js +148 -0
  92. package/dist/dev/lint.js.map +1 -0
  93. package/dist/dev/main.d.ts +7 -0
  94. package/dist/dev/main.d.ts.map +1 -0
  95. package/dist/dev/main.js +279 -0
  96. package/dist/dev/main.js.map +1 -0
  97. package/dist/dev/next-version.d.ts +11 -0
  98. package/dist/dev/next-version.d.ts.map +1 -0
  99. package/dist/dev/next-version.js +33 -0
  100. package/dist/dev/next-version.js.map +1 -0
  101. package/dist/dev/slow-tests.d.ts +14 -0
  102. package/dist/dev/slow-tests.d.ts.map +1 -0
  103. package/dist/dev/slow-tests.js +17 -0
  104. package/dist/dev/slow-tests.js.map +1 -0
  105. package/dist/dev/test-matrix.d.ts +35 -0
  106. package/dist/dev/test-matrix.d.ts.map +1 -0
  107. package/dist/dev/test-matrix.js +93 -0
  108. package/dist/dev/test-matrix.js.map +1 -0
  109. package/dist/errors.d.ts +34 -0
  110. package/dist/errors.d.ts.map +1 -0
  111. package/dist/errors.js +40 -0
  112. package/dist/errors.js.map +1 -0
  113. package/dist/executable.d.ts +3 -0
  114. package/dist/executable.d.ts.map +1 -0
  115. package/dist/executable.js +41 -0
  116. package/dist/executable.js.map +1 -0
  117. package/dist/exit-codes.d.ts +11 -0
  118. package/dist/exit-codes.d.ts.map +1 -0
  119. package/dist/exit-codes.js +25 -0
  120. package/dist/exit-codes.js.map +1 -0
  121. package/dist/http/index.d.ts +20 -0
  122. package/dist/http/index.d.ts.map +1 -0
  123. package/dist/http/index.js +46 -0
  124. package/dist/http/index.js.map +1 -0
  125. package/dist/index.d.ts +20 -0
  126. package/dist/index.d.ts.map +1 -0
  127. package/dist/index.js +19 -0
  128. package/dist/index.js.map +1 -0
  129. package/dist/keyring.d.ts +27 -0
  130. package/dist/keyring.d.ts.map +1 -0
  131. package/dist/keyring.js +45 -0
  132. package/dist/keyring.js.map +1 -0
  133. package/dist/legacy-paths.d.ts +33 -0
  134. package/dist/legacy-paths.d.ts.map +1 -0
  135. package/dist/legacy-paths.js +128 -0
  136. package/dist/legacy-paths.js.map +1 -0
  137. package/dist/logger.d.ts +12 -0
  138. package/dist/logger.d.ts.map +1 -0
  139. package/dist/logger.js +7 -0
  140. package/dist/logger.js.map +1 -0
  141. package/dist/logging.d.ts +31 -0
  142. package/dist/logging.d.ts.map +1 -0
  143. package/dist/logging.js +58 -0
  144. package/dist/logging.js.map +1 -0
  145. package/dist/mcp/index.d.ts +32 -0
  146. package/dist/mcp/index.d.ts.map +1 -0
  147. package/dist/mcp/index.js +113 -0
  148. package/dist/mcp/index.js.map +1 -0
  149. package/dist/output-buffer.d.ts +16 -0
  150. package/dist/output-buffer.d.ts.map +1 -0
  151. package/dist/output-buffer.js +69 -0
  152. package/dist/output-buffer.js.map +1 -0
  153. package/dist/paths.d.ts +35 -0
  154. package/dist/paths.d.ts.map +1 -0
  155. package/dist/paths.js +45 -0
  156. package/dist/paths.js.map +1 -0
  157. package/dist/pretty.d.ts +12 -0
  158. package/dist/pretty.d.ts.map +1 -0
  159. package/dist/pretty.js +83 -0
  160. package/dist/pretty.js.map +1 -0
  161. package/dist/release/index.d.ts +38 -0
  162. package/dist/release/index.d.ts.map +1 -0
  163. package/dist/release/index.js +91 -0
  164. package/dist/release/index.js.map +1 -0
  165. package/dist/release/markdown.d.ts +36 -0
  166. package/dist/release/markdown.d.ts.map +1 -0
  167. package/dist/release/markdown.js +153 -0
  168. package/dist/release/markdown.js.map +1 -0
  169. package/dist/release/structure.d.ts +16 -0
  170. package/dist/release/structure.d.ts.map +1 -0
  171. package/dist/release/structure.js +74 -0
  172. package/dist/release/structure.js.map +1 -0
  173. package/dist/renderer.d.ts +34 -0
  174. package/dist/renderer.d.ts.map +1 -0
  175. package/dist/renderer.js +55 -0
  176. package/dist/renderer.js.map +1 -0
  177. package/dist/result-fields.d.ts +4 -0
  178. package/dist/result-fields.d.ts.map +1 -0
  179. package/dist/result-fields.js +56 -0
  180. package/dist/result-fields.js.map +1 -0
  181. package/dist/retry.d.ts +27 -0
  182. package/dist/retry.d.ts.map +1 -0
  183. package/dist/retry.js +26 -0
  184. package/dist/retry.js.map +1 -0
  185. package/dist/sanitize.d.ts +25 -0
  186. package/dist/sanitize.d.ts.map +1 -0
  187. package/dist/sanitize.js +52 -0
  188. package/dist/sanitize.js.map +1 -0
  189. package/dist/skill/index.d.ts +78 -0
  190. package/dist/skill/index.d.ts.map +1 -0
  191. package/dist/skill/index.js +190 -0
  192. package/dist/skill/index.js.map +1 -0
  193. package/dist/standards/errors.d.ts +40 -0
  194. package/dist/standards/errors.d.ts.map +1 -0
  195. package/dist/standards/errors.js +33 -0
  196. package/dist/standards/errors.js.map +1 -0
  197. package/dist/standards/index.d.ts +8 -0
  198. package/dist/standards/index.d.ts.map +1 -0
  199. package/dist/standards/index.js +8 -0
  200. package/dist/standards/index.js.map +1 -0
  201. package/dist/standards/lint.d.ts +29 -0
  202. package/dist/standards/lint.d.ts.map +1 -0
  203. package/dist/standards/lint.js +50 -0
  204. package/dist/standards/lint.js.map +1 -0
  205. package/dist/standards/log.d.ts +21 -0
  206. package/dist/standards/log.d.ts.map +1 -0
  207. package/dist/standards/log.js +18 -0
  208. package/dist/standards/log.js.map +1 -0
  209. package/dist/standards/output.d.ts +126 -0
  210. package/dist/standards/output.d.ts.map +1 -0
  211. package/dist/standards/output.js +54 -0
  212. package/dist/standards/output.js.map +1 -0
  213. package/dist/standards/registry.d.ts +18 -0
  214. package/dist/standards/registry.d.ts.map +1 -0
  215. package/dist/standards/registry.js +41 -0
  216. package/dist/standards/registry.js.map +1 -0
  217. package/dist/standards/steps.d.ts +28 -0
  218. package/dist/standards/steps.d.ts.map +1 -0
  219. package/dist/standards/steps.js +56 -0
  220. package/dist/standards/steps.js.map +1 -0
  221. package/dist/standards/vocabulary.d.ts +40 -0
  222. package/dist/standards/vocabulary.d.ts.map +1 -0
  223. package/dist/standards/vocabulary.js +242 -0
  224. package/dist/standards/vocabulary.js.map +1 -0
  225. package/dist/streams.d.ts +24 -0
  226. package/dist/streams.d.ts.map +1 -0
  227. package/dist/streams.js +26 -0
  228. package/dist/streams.js.map +1 -0
  229. package/dist/testing/index.d.ts +24 -0
  230. package/dist/testing/index.d.ts.map +1 -0
  231. package/dist/testing/index.js +29 -0
  232. package/dist/testing/index.js.map +1 -0
  233. package/dist/time.d.ts +21 -0
  234. package/dist/time.d.ts.map +1 -0
  235. package/dist/time.js +19 -0
  236. package/dist/time.js.map +1 -0
  237. package/dist/update/index.d.ts +76 -0
  238. package/dist/update/index.d.ts.map +1 -0
  239. package/dist/update/index.js +160 -0
  240. package/dist/update/index.js.map +1 -0
  241. package/package.json +135 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sanitize.js","sourceRoot":"","sources":["../src/sanitize.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH;;;;;;;GAOG;AACH,MAAM,OAAO;AACX,4FAA4F;AAC5F,kHAAkH,CAAA;AAEpH,MAAM,gBAAgB,GAAG,2FAA2F,CAAA;AAEpH,MAAM,WAAW,GAAG,qBAAqB,CAAA;AAEzC,MAAM,OAAO,GAAG,CAAC,CAAS,EAAU,EAAE;IACpC,MAAM,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;IAClC,IAAI,IAAI,GAAG,MAAM;QAAE,OAAO,OAAO,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAA;IACrD,OAAO,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAA;AAC9G,CAAC,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAU,EAAE;IACtD,IAAI,EAAE,GAAG,CAAC,CAAA;IACV,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACxE,EAAE,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;IAClC,CAAC;IACD,OAAO,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;AAC1D,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAA"}
@@ -0,0 +1,78 @@
1
+ import { Command } from "commander";
2
+ import type { Renderer } from "../renderer.js";
3
+ import type { Streams } from "../streams.js";
4
+ type Env = Readonly<Record<string, string | undefined>>;
5
+ export interface SkillApp {
6
+ /** `tg` — what an agent types. */
7
+ command: string;
8
+ /** `tg-cli` — the skill's directory name, and the `name` in its frontmatter. */
9
+ appName: string;
10
+ version: string;
11
+ }
12
+ export declare const SKILL_TARGETS: readonly ["claude", "agents"];
13
+ export type SkillTarget = (typeof SKILL_TARGETS)[number];
14
+ /** `~/.claude/skills` is Claude Code's; `~/.agents/skills` is read by Codex and Gemini CLI. */
15
+ export declare const skillPath: (target: SkillTarget, appName: string, env: Env) => string;
16
+ /**
17
+ * `metadata.version` from the frontmatter — where the Agent Skills specification keeps fields of its
18
+ * own — or a top-level `version:`, which pre-release builds of this package wrote.
19
+ */
20
+ export declare const skillVersion: (content: string) => string | undefined;
21
+ /** Adds or replaces `metadata.version` as a string; every other byte stays as it was. */
22
+ export declare const withVersion: (content: string, version: string) => string;
23
+ /** Writes the stamped SKILL.md to each target, creating directories; the same run twice gives the same files. */
24
+ export declare const installSkill: (app: SkillApp, skill: URL, { targets, env }?: {
25
+ targets?: readonly SkillTarget[];
26
+ env?: Env;
27
+ }) => string[];
28
+ /** What the command writes to and where home is, for this invocation — the host's own output resolution. */
29
+ export type SkillEnvironment = (command: Command) => {
30
+ renderer: Renderer;
31
+ streams: Streams;
32
+ env?: Env;
33
+ };
34
+ /**
35
+ * `more`: skills a library ships for every CLI built on it, by name — `skill show <name>` prints one with
36
+ * `{{command}}` turned into this CLI's command. They are printed, not installed: two CLIs would install
37
+ * the same name.
38
+ */
39
+ export declare const skillCommand: (app: SkillApp, skill: URL, environment: SkillEnvironment, more?: Readonly<Record<string, URL>>) => Command;
40
+ export interface SkillHintRequest {
41
+ app: SkillApp;
42
+ /** The words the CLI was run with: no hint while it runs `skill` or `complete`. */
43
+ argv: readonly string[];
44
+ env: Env;
45
+ /** The update notice's state file — one file for both daily notices. */
46
+ statePath: string;
47
+ /** The setting `skillHint`; `false` turns the hint off. */
48
+ enabled?: boolean;
49
+ now?: () => number;
50
+ }
51
+ /**
52
+ * One line for an agent whose copy of SKILL.md is missing or older than this CLI, at most once a
53
+ * day, or `undefined`. The host prints it on stderr. Any failure is silence.
54
+ */
55
+ export declare const skillHint: ({ app, argv, env, statePath, enabled, now }: SkillHintRequest) => string | undefined;
56
+ export interface SkillResource {
57
+ uri: string;
58
+ name: string;
59
+ title: string;
60
+ description: string;
61
+ mimeType: "text/markdown";
62
+ read: () => {
63
+ contents: {
64
+ uri: string;
65
+ mimeType: "text/markdown";
66
+ text: string;
67
+ }[];
68
+ };
69
+ /** A line for the server's `instructions`. */
70
+ instruction: string;
71
+ }
72
+ /**
73
+ * What an MCP server registers to serve SKILL.md as `<command>://skill`, for a client with no shell —
74
+ * `server.registerResource(r.name, r.uri, { title, description, mimeType }, r.read)`. The SDK stays the host's.
75
+ */
76
+ export declare const skillResource: (app: SkillApp, skill: URL) => SkillResource;
77
+ export {};
78
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skill/index.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,OAAO,EAAU,MAAM,WAAW,CAAA;AAE3C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAG5C,KAAK,GAAG,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAA;AAEvD,MAAM,WAAW,QAAQ;IACvB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,gFAAgF;IAChF,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,eAAO,MAAM,aAAa,YAAI,QAAQ,EAAE,QAAQ,CAAU,CAAA;AAC1D,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAIxD,+FAA+F;AAC/F,eAAO,MAAM,SAAS,WAAY,WAAW,WAAW,MAAM,OAAO,GAAG,KAAG,MACoB,CAAA;AAoB/F;;;GAGG;AACH,eAAO,MAAM,YAAY,YAAa,MAAM,KAAG,MAAM,GAAG,SAMvD,CAAA;AAOD,yFAAyF;AACzF,eAAO,MAAM,WAAW,YAAa,MAAM,WAAW,MAAM,KAAG,MAoB9D,CAAA;AAED,iHAAiH;AACjH,eAAO,MAAM,YAAY,QAClB,QAAQ,SACN,GAAG,qBACsC;IAAE,OAAO,CAAC,EAAE,SAAS,WAAW,EAAE,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,CAAA;CAAE,KAC9F,MAAM,EAiBR,CAAA;AAED,4GAA4G;AAC5G,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,GAAG,CAAC,EAAE,GAAG,CAAA;CAAE,CAAA;AAExG;;;;GAIG;AACH,eAAO,MAAM,YAAY,QAClB,QAAQ,SACN,GAAG,eACG,gBAAgB,SACvB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAClC,OAiDF,CAAA;AAED,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,QAAQ,CAAA;IACb,mFAAmF;IACnF,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;IACvB,GAAG,EAAE,GAAG,CAAA;IACR,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAA;IACjB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAgBD;;;GAGG;AACH,eAAO,MAAM,SAAS,gDAAmE,gBAAgB,uBAaxG,CAAA;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,eAAe,CAAA;IACzB,IAAI,EAAE,MAAM;QAAE,QAAQ,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,eAAe,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAA;IACpF,8CAA8C;IAC9C,WAAW,EAAE,MAAM,CAAA;CACpB;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,QAAS,QAAQ,SAAS,GAAG,KAAG,aAWzD,CAAA"}
@@ -0,0 +1,190 @@
1
+ /**
2
+ * The CLI's own SKILL.md for coding agents: printing it, installing it where agents look for skills,
3
+ * telling an agent once a day that its copy is missing or old, and serving it to an MCP client.
4
+ *
5
+ * Nothing here prints by itself. The command writes through the renderer and streams the host hands
6
+ * it, and the hint is a string the host puts on stderr — never stdout, which an agent parses.
7
+ */
8
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
9
+ import { homedir } from "node:os";
10
+ import { dirname, join } from "node:path";
11
+ import { Command, Option } from "commander";
12
+ import { CliError } from "../errors.js";
13
+ import { CHECK_EVERY_MS, isNewer, readNoticeState, writeUpdateState } from "../update/index.js";
14
+ export const SKILL_TARGETS = ["claude", "agents"];
15
+ const homeOf = (env) => env.HOME || env.USERPROFILE || homedir();
16
+ /** `~/.claude/skills` is Claude Code's; `~/.agents/skills` is read by Codex and Gemini CLI. */
17
+ export const skillPath = (target, appName, env) => join(homeOf(env), target === "claude" ? ".claude" : ".agents", "skills", appName, "SKILL.md");
18
+ const FRONTMATTER = /^---(\r?\n)([\s\S]*?\r?\n)?---(\r?\n|$)/;
19
+ const scalar = (key, indent) => new RegExp(`^${indent}${key}:[ \\t]*["']?([^"'\\r\\n]*?)["']?[ \\t]*\\r?\\n?$`);
20
+ const frontmatterLines = (content) => (FRONTMATTER.exec(content)?.[2] ?? "").split(/(?<=\n)/);
21
+ /** Where `metadata:` and its indented lines are, as `[start, end)`; a flow map (`metadata: {…}`) is refused. */
22
+ const metadataBlock = (lines) => {
23
+ const start = lines.findIndex((line) => /^metadata:/.test(line));
24
+ if (start === -1)
25
+ return undefined;
26
+ if (!/^metadata:[ \t]*\r?\n?$/.test(lines[start])) {
27
+ throw new CliError("configuration_error", "SKILL.md: write `metadata` as an indented block, not on one line");
28
+ }
29
+ let end = start + 1;
30
+ while (end < lines.length && /^[ \t]/.test(lines[end]))
31
+ end++;
32
+ return [start, end];
33
+ };
34
+ /**
35
+ * `metadata.version` from the frontmatter — where the Agent Skills specification keeps fields of its
36
+ * own — or a top-level `version:`, which pre-release builds of this package wrote.
37
+ */
38
+ export const skillVersion = (content) => {
39
+ const lines = frontmatterLines(content);
40
+ const block = metadataBlock(lines);
41
+ const nested = block && lines.slice(block[0] + 1, block[1]).find((line) => scalar("version", "[ \\t]+").test(line));
42
+ const line = nested ?? lines.find((line) => scalar("version", "").test(line));
43
+ return line === undefined ? undefined : scalar("version", "[ \\t]*").exec(line)?.[1];
44
+ };
45
+ const skillName = (content) => {
46
+ const line = frontmatterLines(content).find((line) => scalar("name", "").test(line));
47
+ return line === undefined ? undefined : scalar("name", "").exec(line)?.[1];
48
+ };
49
+ /** Adds or replaces `metadata.version` as a string; every other byte stays as it was. */
50
+ export const withVersion = (content, version) => {
51
+ const match = FRONTMATTER.exec(content);
52
+ if (!match)
53
+ return `---\nmetadata:\n version: "${version}"\n---\n${content}`;
54
+ const [whole, eol = "\n", body = "", close = ""] = match;
55
+ const lines = body.split(/(?<=\n)/).filter((line) => line !== "");
56
+ const block = metadataBlock(lines);
57
+ if (!block) {
58
+ lines.push(`metadata:${eol}`, ` version: "${version}"${eol}`);
59
+ }
60
+ else {
61
+ const [start, end] = block;
62
+ const indent = /^[ \t]+/.exec(lines[start + 1] ?? "")?.[0] ?? " ";
63
+ const at = lines.slice(start + 1, end).findIndex((line) => scalar("version", "[ \\t]+").test(line));
64
+ if (at === -1)
65
+ lines.splice(start + 1, 0, `${indent}version: "${version}"${eol}`);
66
+ else {
67
+ const old = lines[start + 1 + at];
68
+ const lineEol = /\r?\n$/.exec(old)?.[0] ?? "";
69
+ lines[start + 1 + at] = `${/^[ \t]+/.exec(old)?.[0]}version: "${version}"${lineEol}`;
70
+ }
71
+ }
72
+ return `---${eol}${lines.join("")}---${close}${content.slice(whole.length)}`;
73
+ };
74
+ /** Writes the stamped SKILL.md to each target, creating directories; the same run twice gives the same files. */
75
+ export const installSkill = (app, skill, { targets = SKILL_TARGETS, env = process.env } = {}) => {
76
+ const source = readFileSync(skill, "utf8");
77
+ // The specification requires it, and an agent that checks skips a skill whose name and directory differ.
78
+ const name = skillName(source);
79
+ if (name !== app.appName) {
80
+ throw new CliError("configuration_error", `SKILL.md is named ${name === undefined ? "nothing" : `"${name}"`}, but installs into a directory "${app.appName}"; the two must match`);
81
+ }
82
+ const content = withVersion(source, app.version);
83
+ return targets.map((target) => {
84
+ const path = skillPath(target, app.appName, env);
85
+ mkdirSync(dirname(path), { recursive: true });
86
+ writeFileSync(path, content);
87
+ return path;
88
+ });
89
+ };
90
+ /**
91
+ * `more`: skills a library ships for every CLI built on it, by name — `skill show <name>` prints one with
92
+ * `{{command}}` turned into this CLI's command. They are printed, not installed: two CLIs would install
93
+ * the same name.
94
+ */
95
+ export const skillCommand = (app, skill, environment, more = {}) => {
96
+ const command = new Command("skill").description("the instructions an agent is given for this tool");
97
+ const machine = (self) => {
98
+ const { json, jsonl } = self.optsWithGlobals();
99
+ return json === true || jsonl === true;
100
+ };
101
+ const named = Object.keys(more);
102
+ const show = command
103
+ .command("show")
104
+ .description(`print SKILL.md — \`${app.command} skill install\` puts it where Claude Code, Codex and Gemini CLI look for it`);
105
+ if (named.length > 0)
106
+ show.argument("[name]", `one of the skills shipped for a task: ${named.join(", ")}`);
107
+ show.action(function (given) {
108
+ // Without a declared argument Commander passes the options here, not a name.
109
+ const name = typeof given === "string" ? given : undefined;
110
+ const { renderer, streams } = environment(this);
111
+ const source = name === undefined ? skill : more[name];
112
+ if (!source) {
113
+ throw new CliError("validation_error", `no skill "${name}" — there are: ${named.join(", ")}`);
114
+ }
115
+ const content = name === undefined
116
+ ? readFileSync(source, "utf8").trimEnd()
117
+ : readFileSync(source, "utf8").trimEnd().replaceAll("{{command}}", app.command);
118
+ // The file itself even into a pipe: saving it is a redirect, and a redirect is where every
119
+ // other command switches to JSON. Asked for by name, it is JSON like the rest.
120
+ if (machine(this))
121
+ renderer.result({ name: name ?? app.appName, content });
122
+ else
123
+ streams.data(content);
124
+ });
125
+ command
126
+ .command("install")
127
+ .description(`write SKILL.md to ~/.claude/skills/${app.appName}/ (Claude Code) and ~/.agents/skills/${app.appName}/ (Codex, Gemini CLI)`)
128
+ .addOption(new Option("--for <agents>", "which agents to install for").choices(["claude", "agents", "all"]).default("all"))
129
+ .action(function ({ for: chosen }) {
130
+ const { renderer, env } = environment(this);
131
+ const targets = chosen === "all" ? SKILL_TARGETS : [chosen];
132
+ const written = installSkill(app, skill, { targets, ...(env ? { env } : {}) });
133
+ renderer.result({ name: app.appName, version: app.version, written });
134
+ renderer.success(`${app.appName} ${app.version} skill installed: ${written.join(", ")}`);
135
+ });
136
+ return command;
137
+ };
138
+ const isAgent = (env) => Boolean(env.AI_AGENT || env.CLAUDECODE);
139
+ const needsInstall = (app, env) => {
140
+ const installed = SKILL_TARGETS.flatMap((target) => {
141
+ try {
142
+ return [skillVersion(readFileSync(skillPath(target, app.appName, env), "utf8"))];
143
+ }
144
+ catch {
145
+ return [];
146
+ }
147
+ });
148
+ // A location never installed to is a choice (`--for claude`); only no copy at all, or an old one, is worth a line.
149
+ return installed.length === 0 || installed.some((version) => version === undefined || isNewer(app.version, version));
150
+ };
151
+ /**
152
+ * One line for an agent whose copy of SKILL.md is missing or older than this CLI, at most once a
153
+ * day, or `undefined`. The host prints it on stderr. Any failure is silence.
154
+ */
155
+ export const skillHint = ({ app, argv, env, statePath, enabled = true, now = Date.now }) => {
156
+ try {
157
+ if (!enabled || !isAgent(env))
158
+ return undefined;
159
+ if (argv.includes("skill") || argv.includes("complete"))
160
+ return undefined;
161
+ const at = now();
162
+ const shown = readNoticeState(statePath).skillHintAt;
163
+ if (shown !== undefined && at - shown < CHECK_EVERY_MS)
164
+ return undefined;
165
+ if (!needsInstall(app, env))
166
+ return undefined;
167
+ writeUpdateState(statePath, { skillHintAt: at });
168
+ return `agents: \`${app.command} skill install\` installs this tool's guide`;
169
+ }
170
+ catch {
171
+ return undefined;
172
+ }
173
+ };
174
+ /**
175
+ * What an MCP server registers to serve SKILL.md as `<command>://skill`, for a client with no shell —
176
+ * `server.registerResource(r.name, r.uri, { title, description, mimeType }, r.read)`. The SDK stays the host's.
177
+ */
178
+ export const skillResource = (app, skill) => {
179
+ const uri = `${app.command}://skill`;
180
+ return {
181
+ uri,
182
+ name: "skill",
183
+ title: `${app.appName} SKILL.md`,
184
+ description: `How to use ${app.command}: the guide an agent is given for this tool.`,
185
+ mimeType: "text/markdown",
186
+ read: () => ({ contents: [{ uri, mimeType: "text/markdown", text: readFileSync(skill, "utf8") }] }),
187
+ instruction: `- The full guide is the resource ${uri}; \`${app.command} skill install\` installs it as an agent skill.`,
188
+ };
189
+ };
190
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skill/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import * as v from "valibot";
2
+ /** The one error object, on stderr in machine mode and as MCP's `isError` content alike. */
3
+ export declare const errorObjectSchema: v.StrictObjectSchema<{
4
+ readonly error: v.StrictObjectSchema<{
5
+ readonly code: v.PicklistSchema<readonly ["validation_error", "configuration_error", "authentication_error", "permission_error", "not_found", "confirmation_required", "rate_limited", "timeout", "network_error", "provider_error", "provider_unavailable", "invalid_response", "outcome_unknown", "cancelled"], undefined>;
6
+ readonly reason: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "dotted lower-case words, such as `page.next`">]>;
7
+ readonly message: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
8
+ /** The option or argument at fault. */
9
+ readonly param: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>, undefined>;
10
+ readonly details: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, undefined>;
11
+ readonly next: v.OptionalSchema<v.SchemaWithPipe<readonly [v.ArraySchema<v.StrictObjectSchema<{
12
+ readonly step: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "dotted lower-case words, such as `page.next`">]>;
13
+ readonly command: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
14
+ readonly args: v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>;
15
+ readonly why: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
16
+ }, undefined>, undefined>, v.MaxLengthAction<{
17
+ step: string;
18
+ command: string;
19
+ args: {
20
+ [x: string]: unknown;
21
+ };
22
+ why: string;
23
+ }[], 3, undefined>]>, undefined>;
24
+ readonly runId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
25
+ }, undefined>;
26
+ }, undefined>;
27
+ export type ErrorObject = v.InferOutput<typeof errorObjectSchema>;
28
+ declare const reasonSchema: v.StrictObjectSchema<{
29
+ readonly reason: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "dotted lower-case words, such as `page.next`">]>;
30
+ readonly code: v.PicklistSchema<readonly ["validation_error", "configuration_error", "authentication_error", "permission_error", "not_found", "confirmation_required", "rate_limited", "timeout", "network_error", "provider_error", "provider_unavailable", "invalid_response", "outcome_unknown", "cancelled"], undefined>;
31
+ /** `{name}` placeholders, each one of `details`. */
32
+ readonly message: v.SchemaWithPipe<readonly [v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>, v.MaxLengthAction<string, 120, undefined>]>;
33
+ readonly details: v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a camelCase key">]>, undefined>;
34
+ readonly step: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "dotted lower-case words, such as `page.next`">]>, undefined>;
35
+ }, undefined>;
36
+ export type ErrorReason = v.InferOutput<typeof reasonSchema>;
37
+ /** Reasons live where they are raised; each package defines its own list with this. */
38
+ export declare const defineReasons: (input: unknown) => ErrorReason[];
39
+ export {};
40
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/standards/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAK5B,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB;;;;;QAK1B,uCAAuC;;;;;;;;;;;;;;;;;;aAMzC,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,iBAAiB,CAAC,CAAA;AAEjE,QAAA,MAAM,YAAY;;;IAGhB,oDAAoD;;;;aAIpD,CAAA;AAEF,MAAM,MAAM,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,YAAY,CAAC,CAAA;AAE5D,uFAAuF;AACvF,eAAO,MAAM,aAAa,UAAW,OAAO,KAAG,WAAW,EAQtD,CAAA"}
@@ -0,0 +1,33 @@
1
+ import * as v from "valibot";
2
+ import { errorCodes } from "../errors.js";
3
+ import { MAX_NEXT_STEPS, nextStepSchema } from "./output.js";
4
+ import { dottedId, duplicates, parseRegistry, placeholders, text } from "./registry.js";
5
+ /** The one error object, on stderr in machine mode and as MCP's `isError` content alike. */
6
+ export const errorObjectSchema = v.strictObject({
7
+ error: v.strictObject({
8
+ code: v.picklist(errorCodes),
9
+ reason: dottedId,
10
+ message: text,
11
+ /** The option or argument at fault. */
12
+ param: v.optional(text),
13
+ details: v.optional(v.record(v.string(), v.unknown())),
14
+ next: v.optional(v.pipe(v.array(nextStepSchema), v.maxLength(MAX_NEXT_STEPS))),
15
+ runId: text,
16
+ }),
17
+ });
18
+ const reasonSchema = v.strictObject({
19
+ reason: dottedId,
20
+ code: v.picklist(errorCodes),
21
+ /** `{name}` placeholders, each one of `details`. */
22
+ message: v.pipe(text, v.maxLength(120)),
23
+ details: v.array(v.pipe(v.string(), v.regex(/^[a-z][a-zA-Z0-9]*$/, "a camelCase key"))),
24
+ step: v.optional(dottedId),
25
+ });
26
+ /** Reasons live where they are raised; each package defines its own list with this. */
27
+ export const defineReasons = (input) => parseRegistry("error reasons", v.array(reasonSchema), input, (reasons) => [
28
+ ...duplicates(reasons.map((entry) => entry.reason)).map((reason) => `"${reason}" is listed twice`),
29
+ ...reasons.flatMap((entry) => placeholders(entry.message)
30
+ .filter((name) => !entry.details.includes(name))
31
+ .map((name) => `${entry.reason}: the message names {${name}}, which is not one of its details`)),
32
+ ]);
33
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/standards/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAEvF,4FAA4F;AAC5F,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,YAAY,CAAC;IAC9C,KAAK,EAAE,CAAC,CAAC,YAAY,CAAC;QACpB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC5B,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,IAAI;QACb,uCAAuC;QACvC,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QACvB,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACtD,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC,CAAC;QAC9E,KAAK,EAAE,IAAI;KACZ,CAAC;CACH,CAAC,CAAA;AAIF,MAAM,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;IAClC,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC5B,oDAAoD;IACpD,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACvC,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,qBAAqB,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACvF,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;CAC3B,CAAC,CAAA;AAIF,uFAAuF;AACvF,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAc,EAAiB,EAAE,CAC7D,aAAa,CAAC,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC;IACxE,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,mBAAmB,CAAC;IAClG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAC3B,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC;SACxB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SAC/C,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,wBAAwB,IAAI,oCAAoC,CAAC,CAClG;CACF,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ export { defineReasons, type ErrorObject, type ErrorReason, errorObjectSchema } from "./errors.js";
2
+ export { baselineProblems, baselineSchema, defineLintRules, LINT_RULES, LINT_SEVERITIES, type LintRule, type LintSeverity, OVERRIDE_BUDGET, type Override, overridesProblems, overridesSchema, } from "./lint.js";
3
+ export { LOG_SEVERITIES, type LogRecord, type LogSeverity, logRecordSchema } from "./log.js";
4
+ export { defineFieldRules, FIELD_RULES, type FieldRule, type ItemEnvelope, isoTime, itemEnvelopeSchema, type ListEnvelope, listEnvelopeSchema, MAX_NEXT_STEPS, type Meta, type Missing, metaSchema, missingSchema, type NextStep, nextStepSchema, type Page, pageSchema, } from "./output.js";
5
+ export { fill, jsonSchemaOf, RegistryError } from "./registry.js";
6
+ export { defineSteps, SAME_COMMAND, STEPS, type StepDefinition, type StepInput, stepOf } from "./steps.js";
7
+ export { defineVocabulary, FLAG_TYPES, type FlagType, VOCABULARY, type Vocabulary, type VocabularyFlag, type VocabularyNoun, type VocabularyVerb, vocabularySchema, } from "./vocabulary.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/standards/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,KAAK,WAAW,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAClG,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,UAAU,EACV,eAAe,EACf,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,eAAe,EACf,KAAK,QAAQ,EACb,iBAAiB,EACjB,eAAe,GAChB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,cAAc,EAAE,KAAK,SAAS,EAAE,KAAK,WAAW,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAC5F,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,OAAO,EACP,kBAAkB,EAClB,KAAK,YAAY,EACjB,kBAAkB,EAClB,cAAc,EACd,KAAK,IAAI,EACT,KAAK,OAAO,EACZ,UAAU,EACV,aAAa,EACb,KAAK,QAAQ,EACb,cAAc,EACd,KAAK,IAAI,EACT,UAAU,GACX,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAC1G,OAAO,EACL,gBAAgB,EAChB,UAAU,EACV,KAAK,QAAQ,EACb,UAAU,EACV,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,gBAAgB,GACjB,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,8 @@
1
+ export { defineReasons, errorObjectSchema } from "./errors.js";
2
+ export { baselineProblems, baselineSchema, defineLintRules, LINT_RULES, LINT_SEVERITIES, OVERRIDE_BUDGET, overridesProblems, overridesSchema, } from "./lint.js";
3
+ export { LOG_SEVERITIES, logRecordSchema } from "./log.js";
4
+ export { defineFieldRules, FIELD_RULES, isoTime, itemEnvelopeSchema, listEnvelopeSchema, MAX_NEXT_STEPS, metaSchema, missingSchema, nextStepSchema, pageSchema, } from "./output.js";
5
+ export { fill, jsonSchemaOf, RegistryError } from "./registry.js";
6
+ export { defineSteps, SAME_COMMAND, STEPS, stepOf } from "./steps.js";
7
+ export { defineVocabulary, FLAG_TYPES, VOCABULARY, vocabularySchema, } from "./vocabulary.js";
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/standards/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAsC,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAClG,OAAO,EACL,gBAAgB,EAChB,cAAc,EACd,eAAe,EACf,UAAU,EACV,eAAe,EAGf,eAAe,EAEf,iBAAiB,EACjB,eAAe,GAChB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,cAAc,EAAoC,eAAe,EAAE,MAAM,UAAU,CAAA;AAC5F,OAAO,EACL,gBAAgB,EAChB,WAAW,EAGX,OAAO,EACP,kBAAkB,EAElB,kBAAkB,EAClB,cAAc,EAGd,UAAU,EACV,aAAa,EAEb,cAAc,EAEd,UAAU,GACX,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAA;AACjE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAuC,MAAM,EAAE,MAAM,YAAY,CAAA;AAC1G,OAAO,EACL,gBAAgB,EAChB,UAAU,EAEV,UAAU,EAKV,gBAAgB,GACjB,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,29 @@
1
+ import * as v from "valibot";
2
+ export declare const LINT_SEVERITIES: readonly ["high", "medium", "low"];
3
+ declare const lintRuleSchema: v.StrictObjectSchema<{
4
+ readonly id: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a lower-case word, words joined by -">]>;
5
+ readonly severity: v.PicklistSchema<readonly ["high", "medium", "low"], undefined>;
6
+ /** What the rule looks at; a violation's target names one of these. */
7
+ readonly scope: v.PicklistSchema<["command", "group", "argument", "option", "flag"], undefined>;
8
+ readonly summary: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
9
+ }, undefined>;
10
+ export type LintRule = v.InferOutput<typeof lintRuleSchema>;
11
+ export type LintSeverity = (typeof LINT_SEVERITIES)[number];
12
+ export declare const defineLintRules: (input: unknown) => LintRule[];
13
+ /** Ids and severities follow the Azure CLI linter (`azdev linter`): a rule is named after what it finds. */
14
+ export declare const LINT_RULES: LintRule[];
15
+ /** `lint/baseline/<rule-id>.json`: today's violations of one rule, by target. It may only shrink. */
16
+ export declare const baselineSchema: v.ArraySchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>, undefined>;
17
+ /** `lint/overrides.json`: permanent exceptions, each with its reason, counted against a budget. */
18
+ export declare const overridesSchema: v.ArraySchema<v.StrictObjectSchema<{
19
+ readonly rule: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "a lower-case word, words joined by -">]>;
20
+ readonly target: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
21
+ readonly reason: v.SchemaWithPipe<readonly [v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>, v.MinLengthAction<string, 10, "say why, in a sentence">]>;
22
+ }, undefined>, undefined>;
23
+ export type Override = v.InferOutput<typeof overridesSchema>[number];
24
+ /** What the schemas cannot say, so they stay convertible to JSON Schema: no entry twice. */
25
+ export declare const baselineProblems: (targets: readonly string[]) => string[];
26
+ export declare const overridesProblems: (entries: readonly Override[]) => string[];
27
+ export declare const OVERRIDE_BUDGET = 10;
28
+ export {};
29
+ //# sourceMappingURL=lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/standards/lint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAG5B,eAAO,MAAM,eAAe,YAAI,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAU,CAAA;AAEjE,QAAA,MAAM,cAAc;;;IAGlB,uEAAuE;;;aAGvE,CAAA;AAEF,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,cAAc,CAAC,CAAA;AAC3D,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAE3D,eAAO,MAAM,eAAe,UAAW,OAAO,KAAG,QAAQ,EAGtD,CAAA;AAEH,4GAA4G;AAC5G,eAAO,MAAM,UAAU,EAAE,QAAQ,EA4B/B,CAAA;AAEF,qGAAqG;AACrG,eAAO,MAAM,cAAc,8HAAgB,CAAA;AAE3C,mGAAmG;AACnG,eAAO,MAAM,eAAe;;;;yBAE3B,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAEpE,4FAA4F;AAC5F,eAAO,MAAM,gBAAgB,YAAa,SAAS,MAAM,EAAE,KAAG,MAAM,EACA,CAAA;AAEpE,eAAO,MAAM,iBAAiB,YAAa,SAAS,QAAQ,EAAE,KAAG,MAAM,EACyC,CAAA;AAEhH,eAAO,MAAM,eAAe,KAAK,CAAA"}
@@ -0,0 +1,50 @@
1
+ import * as v from "valibot";
2
+ import { duplicates, parseRegistry, text, word } from "./registry.js";
3
+ export const LINT_SEVERITIES = ["high", "medium", "low"];
4
+ const lintRuleSchema = v.strictObject({
5
+ id: word,
6
+ severity: v.picklist(LINT_SEVERITIES),
7
+ /** What the rule looks at; a violation's target names one of these. */
8
+ scope: v.picklist(["command", "group", "argument", "option", "flag"]),
9
+ summary: text,
10
+ });
11
+ export const defineLintRules = (input) => parseRegistry("lint rules", v.array(lintRuleSchema), input, (rules) => duplicates(rules.map((rule) => rule.id)).map((id) => `"${id}" is listed twice`));
12
+ /** Ids and severities follow the Azure CLI linter (`azdev linter`): a rule is named after what it finds. */
13
+ export const LINT_RULES = defineLintRules([
14
+ {
15
+ id: "unknown-verb",
16
+ severity: "high",
17
+ scope: "command",
18
+ summary: "a command's last word is a verb or view noun from the vocabulary; a top-level one may be a root word",
19
+ },
20
+ {
21
+ id: "unknown-resource",
22
+ severity: "medium",
23
+ scope: "group",
24
+ summary: "a group is a resource from the vocabulary (plural, or a registered singular) or a root word",
25
+ },
26
+ {
27
+ id: "flag-two-meanings",
28
+ severity: "high",
29
+ scope: "flag",
30
+ summary: "a flag takes the same kind of value in every command, and the one the vocabulary gives it",
31
+ },
32
+ { id: "missing-command-help", severity: "high", scope: "command", summary: "every command has a summary" },
33
+ {
34
+ id: "command-help-too-long",
35
+ severity: "low",
36
+ scope: "command",
37
+ summary: "a summary is at most 80 characters",
38
+ },
39
+ { id: "missing-argument-help", severity: "high", scope: "argument", summary: "every argument is described" },
40
+ { id: "missing-option-help", severity: "high", scope: "option", summary: "every option is described" },
41
+ ]);
42
+ /** `lint/baseline/<rule-id>.json`: today's violations of one rule, by target. It may only shrink. */
43
+ export const baselineSchema = v.array(text);
44
+ /** `lint/overrides.json`: permanent exceptions, each with its reason, counted against a budget. */
45
+ export const overridesSchema = v.array(v.strictObject({ rule: word, target: text, reason: v.pipe(text, v.minLength(10, "say why, in a sentence")) }));
46
+ /** What the schemas cannot say, so they stay convertible to JSON Schema: no entry twice. */
47
+ export const baselineProblems = (targets) => duplicates(targets).map((target) => `"${target}" is listed twice`);
48
+ export const overridesProblems = (entries) => duplicates(entries.map((entry) => `${entry.rule} ${entry.target}`)).map((both) => `"${both}" is listed twice`);
49
+ export const OVERRIDE_BUDGET = 10;
50
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/standards/lint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import * as v from "valibot";
2
+ /** pino's level names, so a record maps to OpenTelemetry's SeverityText by upper-casing it. */
3
+ export declare const LOG_SEVERITIES: readonly ["trace", "debug", "info", "warn", "error", "fatal"];
4
+ /** One log record, OpenTelemetry's field names, one flat JSON line. */
5
+ export declare const logRecordSchema: v.StrictObjectSchema<{
6
+ readonly time: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.IsoTimestampAction<string, "an ISO 8601 time with a zone">]>;
7
+ readonly severity: v.PicklistSchema<readonly ["trace", "debug", "info", "warn", "error", "fatal"], undefined>;
8
+ readonly body: v.StringSchema<undefined>;
9
+ readonly runId: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
10
+ /** From an MCP caller's `_meta.traceparent`, when it sent one. */
11
+ readonly traceId: v.OptionalSchema<v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "32 lower-case hex digits">]>, undefined>;
12
+ readonly command: v.StringSchema<undefined>;
13
+ readonly attributes: v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>;
14
+ readonly resource: v.StrictObjectSchema<{
15
+ readonly service: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
16
+ readonly version: v.SchemaWithPipe<readonly [v.StringSchema<undefined>, v.RegexAction<string, "must not be empty">]>;
17
+ }, undefined>;
18
+ }, undefined>;
19
+ export type LogRecord = v.InferOutput<typeof logRecordSchema>;
20
+ export type LogSeverity = (typeof LOG_SEVERITIES)[number];
21
+ //# sourceMappingURL=log.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.d.ts","sourceRoot":"","sources":["../../src/standards/log.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAI5B,+FAA+F;AAC/F,eAAO,MAAM,cAAc,YAAI,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAU,CAAA;AAE3F,uEAAuE;AACvE,eAAO,MAAM,eAAe;;;;;IAK1B,kEAAkE;;;;;;;;aAKlE,CAAA;AAEF,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC,OAAO,eAAe,CAAC,CAAA;AAC7D,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAA"}
@@ -0,0 +1,18 @@
1
+ import * as v from "valibot";
2
+ import { isoTime } from "./output.js";
3
+ import { text } from "./registry.js";
4
+ /** pino's level names, so a record maps to OpenTelemetry's SeverityText by upper-casing it. */
5
+ export const LOG_SEVERITIES = ["trace", "debug", "info", "warn", "error", "fatal"];
6
+ /** One log record, OpenTelemetry's field names, one flat JSON line. */
7
+ export const logRecordSchema = v.strictObject({
8
+ time: isoTime,
9
+ severity: v.picklist(LOG_SEVERITIES),
10
+ body: v.string(),
11
+ runId: text,
12
+ /** From an MCP caller's `_meta.traceparent`, when it sent one. */
13
+ traceId: v.optional(v.pipe(v.string(), v.regex(/^[0-9a-f]{32}$/, "32 lower-case hex digits"))),
14
+ command: v.string(),
15
+ attributes: v.record(v.string(), v.unknown()),
16
+ resource: v.strictObject({ service: text, version: text }),
17
+ });
18
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/standards/log.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAA;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAA;AAEpC,+FAA+F;AAC/F,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAU,CAAA;AAE3F,uEAAuE;AACvE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,YAAY,CAAC;IAC5C,IAAI,EAAE,OAAO;IACb,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,IAAI;IACX,kEAAkE;IAClE,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,gBAAgB,EAAE,0BAA0B,CAAC,CAAC,CAAC;IAC9F,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE;IACnB,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAC7C,QAAQ,EAAE,CAAC,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;CAC3D,CAAC,CAAA"}