@zenalexa/unicli 0.207.1 → 0.209.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 (155) hide show
  1. package/AGENTS.md +4 -4
  2. package/README.md +30 -17
  3. package/dist/browser/observe.d.ts +80 -0
  4. package/dist/browser/observe.d.ts.map +1 -0
  5. package/dist/browser/observe.js +144 -0
  6. package/dist/browser/observe.js.map +1 -0
  7. package/dist/browser/snapshot.d.ts.map +1 -1
  8. package/dist/browser/snapshot.js +29 -9
  9. package/dist/browser/snapshot.js.map +1 -1
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +59 -2
  12. package/dist/cli.js.map +1 -1
  13. package/dist/commands/agents.d.ts.map +1 -1
  14. package/dist/commands/agents.js +82 -2
  15. package/dist/commands/agents.js.map +1 -1
  16. package/dist/commands/eval.d.ts +112 -0
  17. package/dist/commands/eval.d.ts.map +1 -0
  18. package/dist/commands/eval.js +485 -0
  19. package/dist/commands/eval.js.map +1 -0
  20. package/dist/commands/generate.d.ts.map +1 -1
  21. package/dist/commands/generate.js +20 -1
  22. package/dist/commands/generate.js.map +1 -1
  23. package/dist/commands/hub.d.ts +13 -0
  24. package/dist/commands/hub.d.ts.map +1 -0
  25. package/dist/commands/hub.js +232 -0
  26. package/dist/commands/hub.js.map +1 -0
  27. package/dist/commands/mcp.d.ts +16 -0
  28. package/dist/commands/mcp.d.ts.map +1 -0
  29. package/dist/commands/mcp.js +135 -0
  30. package/dist/commands/mcp.js.map +1 -0
  31. package/dist/commands/operate.d.ts.map +1 -1
  32. package/dist/commands/operate.js +66 -1
  33. package/dist/commands/operate.js.map +1 -1
  34. package/dist/commands/research.d.ts +17 -0
  35. package/dist/commands/research.d.ts.map +1 -0
  36. package/dist/commands/research.js +257 -0
  37. package/dist/commands/research.js.map +1 -0
  38. package/dist/commands/skills.d.ts +91 -0
  39. package/dist/commands/skills.d.ts.map +1 -0
  40. package/dist/commands/skills.js +266 -0
  41. package/dist/commands/skills.js.map +1 -0
  42. package/dist/commands/test-gen.d.ts +10 -0
  43. package/dist/commands/test-gen.d.ts.map +1 -0
  44. package/dist/commands/test-gen.js +124 -0
  45. package/dist/commands/test-gen.js.map +1 -0
  46. package/dist/commands/usage.d.ts +17 -0
  47. package/dist/commands/usage.d.ts.map +1 -0
  48. package/dist/commands/usage.js +87 -0
  49. package/dist/commands/usage.js.map +1 -0
  50. package/dist/discovery/loader.d.ts +8 -1
  51. package/dist/discovery/loader.d.ts.map +1 -1
  52. package/dist/discovery/loader.js +103 -6
  53. package/dist/discovery/loader.js.map +1 -1
  54. package/dist/engine/capability.d.ts +40 -0
  55. package/dist/engine/capability.d.ts.map +1 -0
  56. package/dist/engine/capability.js +191 -0
  57. package/dist/engine/capability.js.map +1 -0
  58. package/dist/engine/endpoint.d.ts +47 -0
  59. package/dist/engine/endpoint.d.ts.map +1 -0
  60. package/dist/engine/endpoint.js +295 -0
  61. package/dist/engine/endpoint.js.map +1 -0
  62. package/dist/engine/framework.d.ts +28 -0
  63. package/dist/engine/framework.d.ts.map +1 -0
  64. package/dist/engine/framework.js +66 -0
  65. package/dist/engine/framework.js.map +1 -0
  66. package/dist/engine/probe.d.ts +19 -0
  67. package/dist/engine/probe.d.ts.map +1 -0
  68. package/dist/engine/probe.js +85 -0
  69. package/dist/engine/probe.js.map +1 -0
  70. package/dist/engine/research.d.ts +38 -0
  71. package/dist/engine/research.d.ts.map +1 -0
  72. package/dist/engine/research.js +414 -0
  73. package/dist/engine/research.js.map +1 -0
  74. package/dist/engine/update-check.js +1 -1
  75. package/dist/engine/update-check.js.map +1 -1
  76. package/dist/engine/yaml-runner.d.ts.map +1 -1
  77. package/dist/engine/yaml-runner.js +115 -6
  78. package/dist/engine/yaml-runner.js.map +1 -1
  79. package/dist/main.d.ts +1 -4
  80. package/dist/main.d.ts.map +1 -1
  81. package/dist/main.js +1 -4
  82. package/dist/main.js.map +1 -1
  83. package/dist/manifest.json +519 -1
  84. package/dist/mcp/server.d.ts +19 -6
  85. package/dist/mcp/server.d.ts.map +1 -1
  86. package/dist/mcp/server.js +459 -115
  87. package/dist/mcp/server.js.map +1 -1
  88. package/dist/permissions/sensitive-paths.d.ts +92 -0
  89. package/dist/permissions/sensitive-paths.d.ts.map +1 -0
  90. package/dist/permissions/sensitive-paths.js +174 -0
  91. package/dist/permissions/sensitive-paths.js.map +1 -0
  92. package/dist/runtime/usage-ledger.d.ts +86 -0
  93. package/dist/runtime/usage-ledger.d.ts.map +1 -0
  94. package/dist/runtime/usage-ledger.js +173 -0
  95. package/dist/runtime/usage-ledger.js.map +1 -0
  96. package/package.json +8 -7
  97. package/src/adapters/autoagent/eval-run.yaml +36 -0
  98. package/src/adapters/cnn/top.yaml +21 -0
  99. package/src/adapters/cocoapods/search.yaml +16 -0
  100. package/src/adapters/crates-io/search.yaml +27 -0
  101. package/src/adapters/cua/bench-list.yaml +20 -0
  102. package/src/adapters/cua/bench-run.yaml +32 -0
  103. package/src/adapters/docker-hub/search.yaml +26 -0
  104. package/src/adapters/eastmoney/hot.yaml +23 -0
  105. package/src/adapters/eastmoney/search.yaml +25 -0
  106. package/src/adapters/exchangerate/convert.yaml +19 -0
  107. package/src/adapters/feishu/calendar.yaml +24 -0
  108. package/src/adapters/feishu/docs.yaml +17 -0
  109. package/src/adapters/feishu/send.yaml +29 -0
  110. package/src/adapters/feishu/tasks.yaml +24 -0
  111. package/src/adapters/gitee/search.yaml +25 -0
  112. package/src/adapters/gitee/trending.yaml +22 -0
  113. package/src/adapters/gitlab/search.yaml +24 -0
  114. package/src/adapters/gitlab/trending.yaml +22 -0
  115. package/src/adapters/godot/project-run.yaml +31 -0
  116. package/src/adapters/godot/scene-export.yaml +39 -0
  117. package/src/adapters/hermes/sessions-search.yaml +61 -0
  118. package/src/adapters/hermes/skills-list.yaml +30 -0
  119. package/src/adapters/hermes/skills-read.yaml +46 -0
  120. package/src/adapters/homebrew/info.yaml +15 -0
  121. package/src/adapters/huggingface-papers/daily.yaml +21 -0
  122. package/src/adapters/infoq/articles.yaml +29 -0
  123. package/src/adapters/ip-info/lookup.yaml +15 -0
  124. package/src/adapters/itch-io/popular.yaml +22 -0
  125. package/src/adapters/ithome/news.yaml +21 -0
  126. package/src/adapters/mastodon/search.yaml +29 -0
  127. package/src/adapters/mastodon/trending.yaml +27 -0
  128. package/src/adapters/meituan/search.yaml +30 -0
  129. package/src/adapters/minimax/chat.yaml +33 -0
  130. package/src/adapters/minimax/models.yaml +18 -0
  131. package/src/adapters/minimax/tts.yaml +33 -0
  132. package/src/adapters/motion-studio/component-get.yaml +35 -0
  133. package/src/adapters/netease-music/hot.yaml +24 -0
  134. package/src/adapters/netease-music/search.yaml +29 -0
  135. package/src/adapters/npm-trends/compare.yaml +19 -0
  136. package/src/adapters/nytimes/top.yaml +26 -0
  137. package/src/adapters/openharness/memory-read.yaml +51 -0
  138. package/src/adapters/openharness/skills-list.yaml +28 -0
  139. package/src/adapters/openrouter/models.yaml +22 -0
  140. package/src/adapters/pexels/search.yaml +28 -0
  141. package/src/adapters/pinduoduo/hot.yaml +20 -0
  142. package/src/adapters/pypi/info.yaml +16 -0
  143. package/src/adapters/qweather/now.yaml +16 -0
  144. package/src/adapters/renderdoc/capture-list.yaml +42 -0
  145. package/src/adapters/renderdoc/frame-export.yaml +32 -0
  146. package/src/adapters/replicate/search.yaml +25 -0
  147. package/src/adapters/replicate/trending.yaml +22 -0
  148. package/src/adapters/sspai/hot.yaml +21 -0
  149. package/src/adapters/sspai/latest.yaml +22 -0
  150. package/src/adapters/stagehand/wrap-observe.yaml +42 -0
  151. package/src/adapters/techcrunch/latest.yaml +22 -0
  152. package/src/adapters/theverge/latest.yaml +21 -0
  153. package/src/adapters/twitch/top.yaml +26 -0
  154. package/src/adapters/unsplash/search.yaml +28 -0
  155. package/src/adapters/ycombinator/launches.yaml +20 -0
@@ -0,0 +1,257 @@
1
+ /**
2
+ * Research CLI command — Karpathy-style self-improvement loop.
3
+ *
4
+ * Commands:
5
+ * unicli research <site> [command] — improve a specific adapter
6
+ * unicli research log [--since 7d] — show improvement history
7
+ * unicli research report — aggregate stats
8
+ *
9
+ * Options:
10
+ * --goal <goal> — what to improve (default: "increase eval score")
11
+ * --iterations <n> — max iterations (default: 10)
12
+ * --preset <name> — use preset config (reliability, coverage, freshness, security)
13
+ * --guard <cmd> — regression guard command
14
+ */
15
+ import chalk from "chalk";
16
+ import { existsSync } from "node:fs";
17
+ import { join } from "node:path";
18
+ import { runResearchLoop, readResearchLog, } from "../engine/research.js";
19
+ function buildPresetConfig(preset, site) {
20
+ switch (preset) {
21
+ case "reliability":
22
+ return {
23
+ goal: "Improve eval pass rate — fix failing assertions, update selectors, handle empty responses",
24
+ verify: `unicli eval run ${site} --json 2>&1`,
25
+ scope: [`src/adapters/${site}/*.yaml`, `src/adapters/${site}/*.ts`],
26
+ };
27
+ case "coverage":
28
+ return {
29
+ goal: "Add more capabilities — discover new endpoints and generate adapters for them",
30
+ verify: `unicli eval run ${site} --json 2>&1`,
31
+ scope: [`src/adapters/${site}/*.yaml`],
32
+ };
33
+ case "freshness":
34
+ return {
35
+ goal: "Update stale selectors and API endpoints — fix any 404, 403, or empty results",
36
+ verify: `unicli eval run ${site} --json 2>&1`,
37
+ scope: [`src/adapters/${site}/*.yaml`],
38
+ };
39
+ case "security":
40
+ return {
41
+ goal: "Audit for shell injection vectors — ensure no raw arg interpolation in exec steps",
42
+ verify: `unicli eval run ${site} --json 2>&1`,
43
+ scope: [`src/adapters/${site}/*.yaml`],
44
+ };
45
+ }
46
+ }
47
+ // ── Duration Formatting ─────────────────────────────────────────────────
48
+ function parseSinceDuration(since) {
49
+ const match = /^(\d+)([dhm])$/.exec(since);
50
+ if (!match)
51
+ return Date.now() - 7 * 24 * 60 * 60 * 1000; // default 7d
52
+ const val = parseInt(match[1], 10);
53
+ const unit = match[2];
54
+ const ms = unit === "d"
55
+ ? val * 86_400_000
56
+ : unit === "h"
57
+ ? val * 3_600_000
58
+ : val * 60_000;
59
+ return Date.now() - ms;
60
+ }
61
+ // ── Command Registration ────────────────────────────────────────────────
62
+ export function registerResearchCommand(program) {
63
+ const research = program
64
+ .command("research")
65
+ .description("Self-improvement loop for adapter quality");
66
+ // Main research command
67
+ research
68
+ .command("run <site> [command]")
69
+ .description("Run research loop to improve an adapter")
70
+ .option("--goal <goal>", "improvement goal")
71
+ .option("--iterations <n>", "max iterations", "10")
72
+ .option("--preset <name>", "preset config (reliability|coverage|freshness|security)")
73
+ .option("--guard <cmd>", "regression guard command")
74
+ .option("--json", "JSON output")
75
+ .action(async (site, command, opts) => {
76
+ // Validate site name to prevent shell injection
77
+ if (!/^[a-zA-Z0-9_-]+$/.test(site)) {
78
+ console.error(chalk.red("Invalid site name. Only alphanumeric, hyphens, and underscores allowed."));
79
+ process.exitCode = 1;
80
+ return;
81
+ }
82
+ const maxIterations = parseInt(opts.iterations, 10) || 10;
83
+ const jsonOnly = opts.json ?? false;
84
+ // Build config from preset or explicit options
85
+ let config;
86
+ if (opts.preset) {
87
+ const presetName = opts.preset;
88
+ if (!["reliability", "coverage", "freshness", "security"].includes(presetName)) {
89
+ console.error(chalk.red(`Unknown preset: ${presetName}. Available: reliability, coverage, freshness, security`));
90
+ process.exitCode = 1;
91
+ return;
92
+ }
93
+ const preset = buildPresetConfig(presetName, site);
94
+ config = {
95
+ site,
96
+ command,
97
+ goal: opts.goal ?? preset.goal ?? "improve adapter",
98
+ verify: preset.verify ?? `unicli eval run ${site} --json 2>&1`,
99
+ guard: opts.guard,
100
+ scope: preset.scope ?? [`src/adapters/${site}/*.yaml`],
101
+ metric: "SCORE=(\\d+)",
102
+ direction: "higher",
103
+ maxIterations,
104
+ minDelta: 0,
105
+ };
106
+ }
107
+ else {
108
+ config = {
109
+ site,
110
+ command,
111
+ goal: opts.goal ??
112
+ "Increase eval score — fix failing adapters, improve data quality",
113
+ verify: `unicli eval run ${site} --json 2>&1`,
114
+ guard: opts.guard,
115
+ scope: [`src/adapters/${site}/*.yaml`, `src/adapters/${site}/*.ts`],
116
+ metric: "SCORE=(\\d+)",
117
+ direction: "higher",
118
+ maxIterations,
119
+ minDelta: 0,
120
+ };
121
+ }
122
+ // Validate adapter exists
123
+ const adapterDir = join("src", "adapters", site);
124
+ if (!existsSync(adapterDir)) {
125
+ console.error(chalk.red(`Adapter directory not found: ${adapterDir}`));
126
+ process.exitCode = 1;
127
+ return;
128
+ }
129
+ if (!jsonOnly) {
130
+ console.error(chalk.cyan(`Research: ${site}`));
131
+ console.error(chalk.dim(`Goal: ${config.goal}`));
132
+ console.error(chalk.dim(`Iterations: ${maxIterations}`));
133
+ console.error("");
134
+ }
135
+ try {
136
+ const results = await runResearchLoop(config, {
137
+ onStatus: (msg) => {
138
+ if (!jsonOnly)
139
+ console.error(chalk.dim(` ${msg}`));
140
+ },
141
+ onIteration: (result) => {
142
+ if (jsonOnly)
143
+ return;
144
+ const icon = result.status === "keep"
145
+ ? chalk.green("✓")
146
+ : result.status === "discard"
147
+ ? chalk.red("✗")
148
+ : chalk.yellow("·");
149
+ console.error(` ${icon} #${result.iteration} ${result.status} metric=${result.metric} ${chalk.dim(result.description)}`);
150
+ },
151
+ });
152
+ // Summary
153
+ const kept = results.filter((r) => r.status === "keep").length;
154
+ const discarded = results.filter((r) => r.status === "discard").length;
155
+ const finalMetric = results[results.length - 1]?.metric ?? 0;
156
+ const baselineMetric = results[0]?.metric ?? 0;
157
+ if (jsonOnly) {
158
+ console.log(JSON.stringify({
159
+ site,
160
+ iterations: results.length - 1,
161
+ kept,
162
+ discarded,
163
+ baselineMetric,
164
+ finalMetric,
165
+ improvement: finalMetric - baselineMetric,
166
+ results,
167
+ }, null, 2));
168
+ }
169
+ else {
170
+ console.error("");
171
+ console.error(chalk.cyan(`Done: ${kept} kept, ${discarded} discarded, metric ${baselineMetric} → ${finalMetric}`));
172
+ }
173
+ }
174
+ catch (err) {
175
+ const msg = err instanceof Error ? err.message : String(err);
176
+ if (jsonOnly) {
177
+ console.error(JSON.stringify({ error: msg }));
178
+ }
179
+ else {
180
+ console.error(chalk.red(`Research failed: ${msg}`));
181
+ }
182
+ process.exitCode = 1;
183
+ }
184
+ });
185
+ // Log subcommand
186
+ research
187
+ .command("log")
188
+ .description("Show research improvement history")
189
+ .option("--since <duration>", "time range (e.g. 7d, 24h)", "7d")
190
+ .option("--site <site>", "filter by site")
191
+ .option("--json", "JSON output")
192
+ .action((opts) => {
193
+ const sinceMs = parseSinceDuration(opts.since);
194
+ const log = readResearchLog({ site: opts.site, since: sinceMs });
195
+ if (opts.json) {
196
+ console.log(JSON.stringify(log, null, 2));
197
+ return;
198
+ }
199
+ if (log.length === 0) {
200
+ console.log(chalk.dim("No research history found."));
201
+ return;
202
+ }
203
+ console.log(chalk.cyan(`Research log (since ${opts.since}):`));
204
+ console.log("");
205
+ for (const entry of log) {
206
+ const icon = entry.status === "keep"
207
+ ? chalk.green("✓")
208
+ : entry.status === "baseline"
209
+ ? chalk.blue("◎")
210
+ : chalk.red("✗");
211
+ console.log(` ${icon} #${entry.iteration} ${entry.status.padEnd(12)} metric=${entry.metric} ${chalk.dim(entry.description)}`);
212
+ }
213
+ });
214
+ // Report subcommand
215
+ research
216
+ .command("report")
217
+ .description("Aggregate research statistics")
218
+ .option("--json", "JSON output")
219
+ .action((opts) => {
220
+ const log = readResearchLog();
221
+ if (log.length === 0) {
222
+ if (opts.json) {
223
+ console.log(JSON.stringify({ totalIterations: 0 }));
224
+ }
225
+ else {
226
+ console.log(chalk.dim("No research history found."));
227
+ }
228
+ return;
229
+ }
230
+ const kept = log.filter((r) => r.status === "keep").length;
231
+ const discarded = log.filter((r) => r.status === "discard").length;
232
+ const crashed = log.filter((r) => r.status === "crash").length;
233
+ const totalMs = log.reduce((sum, r) => sum + r.durationMs, 0);
234
+ const report = {
235
+ totalIterations: log.length,
236
+ kept,
237
+ discarded,
238
+ crashed,
239
+ successRate: log.length > 0 ? ((kept / log.length) * 100).toFixed(1) + "%" : "0%",
240
+ totalTimeMs: totalMs,
241
+ avgIterationMs: Math.round(totalMs / log.length),
242
+ };
243
+ if (opts.json) {
244
+ console.log(JSON.stringify(report, null, 2));
245
+ }
246
+ else {
247
+ console.log(chalk.cyan("Research Report:"));
248
+ console.log(` Total iterations: ${report.totalIterations}`);
249
+ console.log(` Kept: ${chalk.green(String(kept))}`);
250
+ console.log(` Discarded: ${chalk.red(String(discarded))}`);
251
+ console.log(` Crashed: ${chalk.yellow(String(crashed))}`);
252
+ console.log(` Success rate: ${report.successRate}`);
253
+ console.log(` Total time: ${Math.round(totalMs / 1000)}s`);
254
+ }
255
+ });
256
+ }
257
+ //# sourceMappingURL=research.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"research.js","sourceRoot":"","sources":["../../src/commands/research.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Skills export command — generate Anthropic SKILL.md frontmatter for every adapter.
3
+ *
4
+ * unicli skills export [--out skills/]
5
+ * unicli skills publish [--to ~/.claude/skills/uni-cli/]
6
+ * unicli skills catalog [--out docs/adapters-catalog.json]
7
+ *
8
+ * Why this exists:
9
+ * The Anthropic SKILL.md spec is becoming the de-facto standard for agent
10
+ * capability discovery (Claude Code, Codex, Cursor, Cline, Windsurf all read
11
+ * it). CLI-Anything ships an automatic skill generator per harness — that's
12
+ * their #1 distribution moat. This command closes the gap by emitting one
13
+ * SKILL.md per adapter command from the existing YAML/TS metadata.
14
+ *
15
+ * Output shape (per adapter command):
16
+ * skills/<site>/<command>.md
17
+ * ---
18
+ * name: <site>-<command>
19
+ * description: <one-line, from adapter description>
20
+ * when_to_use: <heuristic from command name + columns>
21
+ * source: unicli@<version>
22
+ * command: unicli <site> <command>
23
+ * ---
24
+ * <2-paragraph body>
25
+ */
26
+ import type { Command } from "commander";
27
+ import type { AdapterManifest, AdapterCommand } from "../types.js";
28
+ interface SkillFile {
29
+ /** Frontmatter name field — always `<site>-<command>` */
30
+ name: string;
31
+ description: string;
32
+ whenToUse: string;
33
+ command: string;
34
+ source: string;
35
+ body: string;
36
+ /** Relative path under the export root, e.g. "hackernews/top.md" */
37
+ relativePath: string;
38
+ }
39
+ /**
40
+ * Build a SKILL.md file for one adapter command.
41
+ *
42
+ * The frontmatter is intentionally narrow — Anthropic's spec asks for just
43
+ * `name` and `description` plus optional fields that consumers may use for
44
+ * filtering. The body keeps the file useful for humans browsing the directory.
45
+ */
46
+ export declare function buildSkillForCommand(adapter: AdapterManifest, cmdName: string, cmd: AdapterCommand): SkillFile;
47
+ /**
48
+ * Render a SkillFile to its on-disk markdown form (frontmatter + body).
49
+ */
50
+ export declare function renderSkillMarkdown(skill: SkillFile): string;
51
+ /**
52
+ * Walk every loaded adapter and emit a SKILL.md per command into `outDir`.
53
+ * Returns the count of files written.
54
+ */
55
+ export declare function exportSkills(outDir: string): number;
56
+ /**
57
+ * Build the catalog object — the single-source-of-truth machine-readable view
58
+ * of every adapter command. Embeds the same fields agents need to decide which
59
+ * command to call: name, description, when_to_use, columns, args, auth state.
60
+ */
61
+ export declare function buildCatalog(): {
62
+ source: string;
63
+ generated: string;
64
+ total_sites: number;
65
+ total_commands: number;
66
+ adapters: Array<{
67
+ site: string;
68
+ type: string;
69
+ description?: string;
70
+ domain?: string;
71
+ auth: boolean;
72
+ strategy?: string;
73
+ commands: Array<{
74
+ name: string;
75
+ description: string;
76
+ when_to_use: string;
77
+ command: string;
78
+ columns?: string[];
79
+ args?: Array<{
80
+ name: string;
81
+ type?: string;
82
+ required: boolean;
83
+ positional: boolean;
84
+ description?: string;
85
+ }>;
86
+ }>;
87
+ }>;
88
+ };
89
+ export declare function registerSkillsCommand(program: Command): void;
90
+ export {};
91
+ //# sourceMappingURL=skills.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.d.ts","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOzC,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAgBnE,UAAU,SAAS;IACjB,yDAAyD;IACzD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,oEAAoE;IACpE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,cAAc,GAClB,SAAS,CA0DX;AAiDD;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAY5D;AAgBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAanD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,IAAI;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,OAAO,CAAC;QACd,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,KAAK,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,EAAE,MAAM,CAAC;YACpB,WAAW,EAAE,MAAM,CAAC;YACpB,OAAO,EAAE,MAAM,CAAC;YAChB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,EAAE,KAAK,CAAC;gBACX,IAAI,EAAE,MAAM,CAAC;gBACb,IAAI,CAAC,EAAE,MAAM,CAAC;gBACd,QAAQ,EAAE,OAAO,CAAC;gBAClB,UAAU,EAAE,OAAO,CAAC;gBACpB,WAAW,CAAC,EAAE,MAAM,CAAC;aACtB,CAAC,CAAC;SACJ,CAAC,CAAC;KACJ,CAAC,CAAC;CACJ,CAwCA;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiE5D"}
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Skills export command — generate Anthropic SKILL.md frontmatter for every adapter.
3
+ *
4
+ * unicli skills export [--out skills/]
5
+ * unicli skills publish [--to ~/.claude/skills/uni-cli/]
6
+ * unicli skills catalog [--out docs/adapters-catalog.json]
7
+ *
8
+ * Why this exists:
9
+ * The Anthropic SKILL.md spec is becoming the de-facto standard for agent
10
+ * capability discovery (Claude Code, Codex, Cursor, Cline, Windsurf all read
11
+ * it). CLI-Anything ships an automatic skill generator per harness — that's
12
+ * their #1 distribution moat. This command closes the gap by emitting one
13
+ * SKILL.md per adapter command from the existing YAML/TS metadata.
14
+ *
15
+ * Output shape (per adapter command):
16
+ * skills/<site>/<command>.md
17
+ * ---
18
+ * name: <site>-<command>
19
+ * description: <one-line, from adapter description>
20
+ * when_to_use: <heuristic from command name + columns>
21
+ * source: unicli@<version>
22
+ * command: unicli <site> <command>
23
+ * ---
24
+ * <2-paragraph body>
25
+ */
26
+ import { mkdirSync, writeFileSync } from "node:fs";
27
+ import { join, resolve } from "node:path";
28
+ import { homedir } from "node:os";
29
+ import chalk from "chalk";
30
+ import { getAllAdapters } from "../registry.js";
31
+ import { VERSION } from "../constants.js";
32
+ /**
33
+ * Build a SKILL.md file for one adapter command.
34
+ *
35
+ * The frontmatter is intentionally narrow — Anthropic's spec asks for just
36
+ * `name` and `description` plus optional fields that consumers may use for
37
+ * filtering. The body keeps the file useful for humans browsing the directory.
38
+ */
39
+ export function buildSkillForCommand(adapter, cmdName, cmd) {
40
+ const name = `${adapter.name}-${cmdName}`;
41
+ const description = cmd.description?.trim() ||
42
+ adapter.description?.trim() ||
43
+ `${cmdName} command for ${adapter.name}`;
44
+ const whenToUse = inferWhenToUse(adapter, cmdName, cmd);
45
+ const command = `unicli ${adapter.name} ${cmdName}`;
46
+ // Build a usage hint that includes positional + most useful option args.
47
+ const args = cmd.adapterArgs ?? [];
48
+ const usageBits = [`unicli ${adapter.name} ${cmdName}`];
49
+ for (const a of args) {
50
+ if (a.positional) {
51
+ usageBits.push(a.required ? `<${a.name}>` : `[${a.name}]`);
52
+ }
53
+ }
54
+ const optionFlags = args
55
+ .filter((a) => !a.positional)
56
+ .slice(0, 4)
57
+ .map((a) => `[--${a.name}${a.default !== undefined ? ` ${a.default}` : ""}]`);
58
+ const usageLine = [...usageBits, ...optionFlags].join(" ");
59
+ const columnsLine = cmd.columns && cmd.columns.length > 0
60
+ ? `Returns columns: \`${cmd.columns.join("`, `")}\`.`
61
+ : "Returns JSON results.";
62
+ const authNote = adapter.strategy && adapter.strategy !== "public"
63
+ ? `\n\n**Auth required.** Run \`unicli auth setup ${adapter.name}\` once before invoking — the strategy is \`${adapter.strategy}\`.`
64
+ : "";
65
+ const body = `## What it does
66
+
67
+ ${description}. ${columnsLine}${authNote}
68
+
69
+ ## How to call it
70
+
71
+ \`\`\`bash
72
+ ${usageLine}
73
+ \`\`\`
74
+
75
+ Add \`--format json\` for piped output (auto-detected when stdout is not a TTY) and \`--limit N\` to cap result count. All Uni-CLI commands return structured JSON errors on stderr with the failing pipeline step and a repair suggestion.
76
+ `;
77
+ return {
78
+ name,
79
+ description,
80
+ whenToUse,
81
+ command,
82
+ source: `unicli@${VERSION}`,
83
+ body,
84
+ relativePath: `${adapter.name}/${cmdName}.md`,
85
+ };
86
+ }
87
+ /**
88
+ * Infer a "when to use" hint from the command name + adapter category.
89
+ *
90
+ * Pure heuristic — designed to be helpful without making things up. The
91
+ * patterns reflect the most common command-name verbs across the adapter
92
+ * catalog (search, top, list, get, download, post, ...).
93
+ */
94
+ function inferWhenToUse(adapter, cmdName, cmd) {
95
+ const verb = cmdName.toLowerCase();
96
+ const site = adapter.displayName ?? adapter.name;
97
+ if (verb === "top" ||
98
+ verb === "trending" ||
99
+ verb === "hot" ||
100
+ verb === "rank")
101
+ return `When you need the current ${verb} items from ${site}.`;
102
+ if (verb === "search" || verb.startsWith("search"))
103
+ return `When you need to search ${site} for a specific query.`;
104
+ if (verb === "list" || verb.startsWith("list"))
105
+ return `When you need to list items from ${site}.`;
106
+ if (verb === "get" ||
107
+ verb.startsWith("get") ||
108
+ verb === "info" ||
109
+ verb === "detail")
110
+ return `When you need details about a specific item on ${site}.`;
111
+ if (verb === "download" || verb.startsWith("download"))
112
+ return `When you need to download media or files from ${site}.`;
113
+ if (verb === "post" || verb === "send" || verb === "create")
114
+ return `When you need to post content to ${site}.`;
115
+ if (verb === "comments" || verb === "replies")
116
+ return `When you need to read comments/replies from ${site}.`;
117
+ if (verb === "user" || verb === "profile")
118
+ return `When you need user/profile info from ${site}.`;
119
+ // Fall back to the description if it exists, otherwise generic.
120
+ if (cmd.description)
121
+ return cmd.description.trim();
122
+ return `When you need the ${cmdName} capability from ${site}.`;
123
+ }
124
+ /**
125
+ * Render a SkillFile to its on-disk markdown form (frontmatter + body).
126
+ */
127
+ export function renderSkillMarkdown(skill) {
128
+ const fm = [
129
+ "---",
130
+ `name: ${skill.name}`,
131
+ `description: ${escapeYamlValue(skill.description)}`,
132
+ `when_to_use: ${escapeYamlValue(skill.whenToUse)}`,
133
+ `command: ${skill.command}`,
134
+ `source: ${skill.source}`,
135
+ "---",
136
+ "",
137
+ ].join("\n");
138
+ return fm + skill.body;
139
+ }
140
+ /**
141
+ * Quote any YAML scalar that contains characters needing escaping. Keeps the
142
+ * frontmatter parser-friendly without depending on a yaml library at write
143
+ * time (read time uses js-yaml; write time keeps the surface area small).
144
+ */
145
+ function escapeYamlValue(v) {
146
+ // Single line — strip newlines defensively
147
+ const oneLine = v.replace(/\r?\n/g, " ").trim();
148
+ if (/[:#&*!|>'"%@`,\[\]{}]/.test(oneLine) || /^\s|\s$/.test(oneLine)) {
149
+ return `"${oneLine.replace(/"/g, '\\"')}"`;
150
+ }
151
+ return oneLine;
152
+ }
153
+ /**
154
+ * Walk every loaded adapter and emit a SKILL.md per command into `outDir`.
155
+ * Returns the count of files written.
156
+ */
157
+ export function exportSkills(outDir) {
158
+ const adapters = getAllAdapters();
159
+ let written = 0;
160
+ for (const adapter of adapters) {
161
+ for (const [cmdName, cmd] of Object.entries(adapter.commands)) {
162
+ const skill = buildSkillForCommand(adapter, cmdName, cmd);
163
+ const dest = join(outDir, skill.relativePath);
164
+ mkdirSync(join(outDir, adapter.name), { recursive: true });
165
+ writeFileSync(dest, renderSkillMarkdown(skill), "utf-8");
166
+ written++;
167
+ }
168
+ }
169
+ return written;
170
+ }
171
+ /**
172
+ * Build the catalog object — the single-source-of-truth machine-readable view
173
+ * of every adapter command. Embeds the same fields agents need to decide which
174
+ * command to call: name, description, when_to_use, columns, args, auth state.
175
+ */
176
+ export function buildCatalog() {
177
+ const adapters = getAllAdapters();
178
+ let totalCommands = 0;
179
+ const adapterRows = adapters.map((adapter) => {
180
+ const commands = Object.entries(adapter.commands).map(([cmdName, cmd]) => {
181
+ totalCommands++;
182
+ const skill = buildSkillForCommand(adapter, cmdName, cmd);
183
+ return {
184
+ name: cmdName,
185
+ description: skill.description,
186
+ when_to_use: skill.whenToUse,
187
+ command: skill.command,
188
+ columns: cmd.columns,
189
+ args: cmd.adapterArgs?.map((a) => ({
190
+ name: a.name,
191
+ type: a.type,
192
+ required: a.required ?? false,
193
+ positional: a.positional ?? false,
194
+ description: a.description,
195
+ })),
196
+ };
197
+ });
198
+ return {
199
+ site: adapter.name,
200
+ type: adapter.type,
201
+ description: adapter.description,
202
+ domain: adapter.domain,
203
+ auth: adapter.strategy !== undefined && adapter.strategy !== "public",
204
+ strategy: adapter.strategy,
205
+ commands,
206
+ };
207
+ });
208
+ return {
209
+ source: `unicli@${VERSION}`,
210
+ generated: new Date().toISOString(),
211
+ total_sites: adapterRows.length,
212
+ total_commands: totalCommands,
213
+ adapters: adapterRows,
214
+ };
215
+ }
216
+ export function registerSkillsCommand(program) {
217
+ const skills = program
218
+ .command("skills")
219
+ .description("Export adapter capabilities as Anthropic SKILL.md files");
220
+ skills
221
+ .command("export")
222
+ .description("Generate one SKILL.md per adapter command into an output directory")
223
+ .option("--out <dir>", "Output directory", "skills")
224
+ .option("--json", "Print summary as JSON")
225
+ .action((opts) => {
226
+ const outDir = resolve(opts.out ?? "skills");
227
+ mkdirSync(outDir, { recursive: true });
228
+ const written = exportSkills(outDir);
229
+ if (opts.json) {
230
+ console.log(JSON.stringify({ written, out: outDir }, null, 2));
231
+ }
232
+ else {
233
+ console.log(chalk.green(`✓ wrote ${written} SKILL.md files to ${outDir}`));
234
+ }
235
+ });
236
+ skills
237
+ .command("publish")
238
+ .description("Publish generated SKILL.md files into a Claude skills directory")
239
+ .option("--to <dir>", "Target directory (default: ~/.claude/skills/uni-cli/)")
240
+ .option("--json", "Print summary as JSON")
241
+ .action((opts) => {
242
+ const target = opts.to ?? join(homedir(), ".claude", "skills", "uni-cli");
243
+ const resolved = resolve(target.replace(/^~(?=$|\/)/, homedir()));
244
+ mkdirSync(resolved, { recursive: true });
245
+ const written = exportSkills(resolved);
246
+ if (opts.json) {
247
+ console.log(JSON.stringify({ written, to: resolved }, null, 2));
248
+ }
249
+ else {
250
+ console.log(chalk.green(`✓ published ${written} SKILL.md files to ${resolved}`));
251
+ }
252
+ });
253
+ skills
254
+ .command("catalog")
255
+ .description("Build a JSON catalog of every adapter command")
256
+ .option("--out <file>", "Output file", "docs/adapters-catalog.json")
257
+ .action((opts) => {
258
+ const out = resolve(opts.out ?? "docs/adapters-catalog.json");
259
+ const dirOf = out.replace(/\/[^/]+$/, "");
260
+ mkdirSync(dirOf, { recursive: true });
261
+ const catalog = buildCatalog();
262
+ writeFileSync(out, JSON.stringify(catalog, null, 2), "utf-8");
263
+ console.log(chalk.green(`✓ wrote catalog (${catalog.total_sites} sites, ${catalog.total_commands} commands) to ${out}`));
264
+ });
265
+ }
266
+ //# sourceMappingURL=skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills.js","sourceRoot":"","sources":["../../src/commands/skills.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAGH,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AA6B1C;;;;;;GAMG;AACH,MAAM,UAAU,oBAAoB,CAClC,OAAwB,EACxB,OAAe,EACf,GAAmB;IAEnB,MAAM,IAAI,GAAG,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;IAC1C,MAAM,WAAW,GACf,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE;QACvB,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE;QAC3B,GAAG,OAAO,gBAAgB,OAAO,CAAC,IAAI,EAAE,CAAC;IAE3C,MAAM,SAAS,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,UAAU,OAAO,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;IAEpD,yEAAyE;IACzE,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;IACnC,MAAM,SAAS,GAAa,CAAC,UAAU,OAAO,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC,CAAC;IAClE,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;YACjB,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IACD,MAAM,WAAW,GAAG,IAAI;SACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;SAC5B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;SACX,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CACxE,CAAC;IACJ,MAAM,SAAS,GAAG,CAAC,GAAG,SAAS,EAAE,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE3D,MAAM,WAAW,GACf,GAAG,CAAC,OAAO,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;QACnC,CAAC,CAAC,sBAAsB,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;QACrD,CAAC,CAAC,uBAAuB,CAAC;IAE9B,MAAM,QAAQ,GACZ,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAC/C,CAAC,CAAC,kDAAkD,OAAO,CAAC,IAAI,+CAA+C,OAAO,CAAC,QAAQ,KAAK;QACpI,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,IAAI,GAAG;;EAEb,WAAW,KAAK,WAAW,GAAG,QAAQ;;;;;EAKtC,SAAS;;;;CAIV,CAAC;IAEA,OAAO;QACL,IAAI;QACJ,WAAW;QACX,SAAS;QACT,OAAO;QACP,MAAM,EAAE,UAAU,OAAO,EAAE;QAC3B,IAAI;QACJ,YAAY,EAAE,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,KAAK;KAC9C,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,SAAS,cAAc,CACrB,OAAwB,EACxB,OAAe,EACf,GAAmB;IAEnB,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC;IAEjD,IACE,IAAI,KAAK,KAAK;QACd,IAAI,KAAK,UAAU;QACnB,IAAI,KAAK,KAAK;QACd,IAAI,KAAK,MAAM;QAEf,OAAO,6BAA6B,IAAI,eAAe,IAAI,GAAG,CAAC;IACjE,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAChD,OAAO,2BAA2B,IAAI,wBAAwB,CAAC;IACjE,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;QAC5C,OAAO,oCAAoC,IAAI,GAAG,CAAC;IACrD,IACE,IAAI,KAAK,KAAK;QACd,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACtB,IAAI,KAAK,MAAM;QACf,IAAI,KAAK,QAAQ;QAEjB,OAAO,kDAAkD,IAAI,GAAG,CAAC;IACnE,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC;QACpD,OAAO,iDAAiD,IAAI,GAAG,CAAC;IAClE,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ;QACzD,OAAO,oCAAoC,IAAI,GAAG,CAAC;IACrD,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,SAAS;QAC3C,OAAO,+CAA+C,IAAI,GAAG,CAAC;IAChE,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,SAAS;QACvC,OAAO,wCAAwC,IAAI,GAAG,CAAC;IAEzD,gEAAgE;IAChE,IAAI,GAAG,CAAC,WAAW;QAAE,OAAO,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IACnD,OAAO,qBAAqB,OAAO,oBAAoB,IAAI,GAAG,CAAC;AACjE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAgB;IAClD,MAAM,EAAE,GAAG;QACT,KAAK;QACL,SAAS,KAAK,CAAC,IAAI,EAAE;QACrB,gBAAgB,eAAe,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE;QACpD,gBAAgB,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE;QAClD,YAAY,KAAK,CAAC,OAAO,EAAE;QAC3B,WAAW,KAAK,CAAC,MAAM,EAAE;QACzB,KAAK;QACL,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,OAAO,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,SAAS,eAAe,CAAC,CAAS;IAChC,2CAA2C;IAC3C,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,IAAI,uBAAuB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;QACrE,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;IAC7C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,KAAK,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9D,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YAC1D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;YAC9C,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC3D,aAAa,CAAC,IAAI,EAAE,mBAAmB,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;YACzD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY;IA4B1B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,IAAI,aAAa,GAAG,CAAC,CAAC;IACtB,MAAM,WAAW,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3C,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,EAAE;YACvE,aAAa,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC;YAC1D,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,WAAW,EAAE,KAAK,CAAC,SAAS;gBAC5B,OAAO,EAAE,KAAK,CAAC,OAAO;gBACtB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,IAAI,EAAE,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACjC,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ,IAAI,KAAK;oBAC7B,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,KAAK;oBACjC,WAAW,EAAE,CAAC,CAAC,WAAW;iBAC3B,CAAC,CAAC;aACJ,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ;YACrE,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,QAAQ;SACT,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,MAAM,EAAE,UAAU,OAAO,EAAE;QAC3B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,WAAW,EAAE,WAAW,CAAC,MAAM;QAC/B,cAAc,EAAE,aAAa;QAC7B,QAAQ,EAAE,WAAW;KACtB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,MAAM,GAAG,OAAO;SACnB,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,yDAAyD,CAAC,CAAC;IAE1E,MAAM;SACH,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CACV,oEAAoE,CACrE;SACA,MAAM,CAAC,aAAa,EAAE,kBAAkB,EAAE,QAAQ,CAAC;SACnD,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SACzC,MAAM,CAAC,CAAC,IAAmB,EAAE,EAAE;QAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,QAAQ,CAAC,CAAC;QAC7C,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACrC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,WAAW,OAAO,sBAAsB,MAAM,EAAE,CAAC,CAC9D,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CACV,iEAAiE,CAClE;SACA,MAAM,CACL,YAAY,EACZ,uDAAuD,CACxD;SACA,MAAM,CAAC,QAAQ,EAAE,uBAAuB,CAAC;SACzC,MAAM,CAAC,CAAC,IAAoB,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC1E,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAClE,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CAAC,eAAe,OAAO,sBAAsB,QAAQ,EAAE,CAAC,CACpE,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,MAAM;SACH,OAAO,CAAC,SAAS,CAAC;SAClB,WAAW,CAAC,+CAA+C,CAAC;SAC5D,MAAM,CAAC,cAAc,EAAE,aAAa,EAAE,4BAA4B,CAAC;SACnE,MAAM,CAAC,CAAC,IAAoB,EAAE,EAAE;QAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,4BAA4B,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;QAC1C,SAAS,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,YAAY,EAAE,CAAC;QAC/B,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CACT,oBAAoB,OAAO,CAAC,WAAW,WAAW,OAAO,CAAC,cAAc,iBAAiB,GAAG,EAAE,CAC/F,CACF,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Test generation command — auto-generate Vitest tests from evals.
3
+ *
4
+ * Commands:
5
+ * unicli test generate <site> — auto-generate test from eval + current output
6
+ * unicli test ci --changed — test only adapters changed in current commit
7
+ */
8
+ import { Command } from "commander";
9
+ export declare function registerTestGenCommand(program: Command): void;
10
+ //# sourceMappingURL=test-gen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-gen.d.ts","sourceRoot":"","sources":["../../src/commands/test-gen.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA8I7D"}