@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.
- package/AGENTS.md +4 -4
- package/README.md +30 -17
- package/dist/browser/observe.d.ts +80 -0
- package/dist/browser/observe.d.ts.map +1 -0
- package/dist/browser/observe.js +144 -0
- package/dist/browser/observe.js.map +1 -0
- package/dist/browser/snapshot.d.ts.map +1 -1
- package/dist/browser/snapshot.js +29 -9
- package/dist/browser/snapshot.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +59 -2
- package/dist/cli.js.map +1 -1
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +82 -2
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/eval.d.ts +112 -0
- package/dist/commands/eval.d.ts.map +1 -0
- package/dist/commands/eval.js +485 -0
- package/dist/commands/eval.js.map +1 -0
- package/dist/commands/generate.d.ts.map +1 -1
- package/dist/commands/generate.js +20 -1
- package/dist/commands/generate.js.map +1 -1
- package/dist/commands/hub.d.ts +13 -0
- package/dist/commands/hub.d.ts.map +1 -0
- package/dist/commands/hub.js +232 -0
- package/dist/commands/hub.js.map +1 -0
- package/dist/commands/mcp.d.ts +16 -0
- package/dist/commands/mcp.d.ts.map +1 -0
- package/dist/commands/mcp.js +135 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/operate.d.ts.map +1 -1
- package/dist/commands/operate.js +66 -1
- package/dist/commands/operate.js.map +1 -1
- package/dist/commands/research.d.ts +17 -0
- package/dist/commands/research.d.ts.map +1 -0
- package/dist/commands/research.js +257 -0
- package/dist/commands/research.js.map +1 -0
- package/dist/commands/skills.d.ts +91 -0
- package/dist/commands/skills.d.ts.map +1 -0
- package/dist/commands/skills.js +266 -0
- package/dist/commands/skills.js.map +1 -0
- package/dist/commands/test-gen.d.ts +10 -0
- package/dist/commands/test-gen.d.ts.map +1 -0
- package/dist/commands/test-gen.js +124 -0
- package/dist/commands/test-gen.js.map +1 -0
- package/dist/commands/usage.d.ts +17 -0
- package/dist/commands/usage.d.ts.map +1 -0
- package/dist/commands/usage.js +87 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/discovery/loader.d.ts +8 -1
- package/dist/discovery/loader.d.ts.map +1 -1
- package/dist/discovery/loader.js +103 -6
- package/dist/discovery/loader.js.map +1 -1
- package/dist/engine/capability.d.ts +40 -0
- package/dist/engine/capability.d.ts.map +1 -0
- package/dist/engine/capability.js +191 -0
- package/dist/engine/capability.js.map +1 -0
- package/dist/engine/endpoint.d.ts +47 -0
- package/dist/engine/endpoint.d.ts.map +1 -0
- package/dist/engine/endpoint.js +295 -0
- package/dist/engine/endpoint.js.map +1 -0
- package/dist/engine/framework.d.ts +28 -0
- package/dist/engine/framework.d.ts.map +1 -0
- package/dist/engine/framework.js +66 -0
- package/dist/engine/framework.js.map +1 -0
- package/dist/engine/probe.d.ts +19 -0
- package/dist/engine/probe.d.ts.map +1 -0
- package/dist/engine/probe.js +85 -0
- package/dist/engine/probe.js.map +1 -0
- package/dist/engine/research.d.ts +38 -0
- package/dist/engine/research.d.ts.map +1 -0
- package/dist/engine/research.js +414 -0
- package/dist/engine/research.js.map +1 -0
- package/dist/engine/update-check.js +1 -1
- package/dist/engine/update-check.js.map +1 -1
- package/dist/engine/yaml-runner.d.ts.map +1 -1
- package/dist/engine/yaml-runner.js +115 -6
- package/dist/engine/yaml-runner.js.map +1 -1
- package/dist/main.d.ts +1 -4
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +1 -4
- package/dist/main.js.map +1 -1
- package/dist/manifest.json +519 -1
- package/dist/mcp/server.d.ts +19 -6
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +459 -115
- package/dist/mcp/server.js.map +1 -1
- package/dist/permissions/sensitive-paths.d.ts +92 -0
- package/dist/permissions/sensitive-paths.d.ts.map +1 -0
- package/dist/permissions/sensitive-paths.js +174 -0
- package/dist/permissions/sensitive-paths.js.map +1 -0
- package/dist/runtime/usage-ledger.d.ts +86 -0
- package/dist/runtime/usage-ledger.d.ts.map +1 -0
- package/dist/runtime/usage-ledger.js +173 -0
- package/dist/runtime/usage-ledger.js.map +1 -0
- package/package.json +8 -7
- package/src/adapters/autoagent/eval-run.yaml +36 -0
- package/src/adapters/cnn/top.yaml +21 -0
- package/src/adapters/cocoapods/search.yaml +16 -0
- package/src/adapters/crates-io/search.yaml +27 -0
- package/src/adapters/cua/bench-list.yaml +20 -0
- package/src/adapters/cua/bench-run.yaml +32 -0
- package/src/adapters/docker-hub/search.yaml +26 -0
- package/src/adapters/eastmoney/hot.yaml +23 -0
- package/src/adapters/eastmoney/search.yaml +25 -0
- package/src/adapters/exchangerate/convert.yaml +19 -0
- package/src/adapters/feishu/calendar.yaml +24 -0
- package/src/adapters/feishu/docs.yaml +17 -0
- package/src/adapters/feishu/send.yaml +29 -0
- package/src/adapters/feishu/tasks.yaml +24 -0
- package/src/adapters/gitee/search.yaml +25 -0
- package/src/adapters/gitee/trending.yaml +22 -0
- package/src/adapters/gitlab/search.yaml +24 -0
- package/src/adapters/gitlab/trending.yaml +22 -0
- package/src/adapters/godot/project-run.yaml +31 -0
- package/src/adapters/godot/scene-export.yaml +39 -0
- package/src/adapters/hermes/sessions-search.yaml +61 -0
- package/src/adapters/hermes/skills-list.yaml +30 -0
- package/src/adapters/hermes/skills-read.yaml +46 -0
- package/src/adapters/homebrew/info.yaml +15 -0
- package/src/adapters/huggingface-papers/daily.yaml +21 -0
- package/src/adapters/infoq/articles.yaml +29 -0
- package/src/adapters/ip-info/lookup.yaml +15 -0
- package/src/adapters/itch-io/popular.yaml +22 -0
- package/src/adapters/ithome/news.yaml +21 -0
- package/src/adapters/mastodon/search.yaml +29 -0
- package/src/adapters/mastodon/trending.yaml +27 -0
- package/src/adapters/meituan/search.yaml +30 -0
- package/src/adapters/minimax/chat.yaml +33 -0
- package/src/adapters/minimax/models.yaml +18 -0
- package/src/adapters/minimax/tts.yaml +33 -0
- package/src/adapters/motion-studio/component-get.yaml +35 -0
- package/src/adapters/netease-music/hot.yaml +24 -0
- package/src/adapters/netease-music/search.yaml +29 -0
- package/src/adapters/npm-trends/compare.yaml +19 -0
- package/src/adapters/nytimes/top.yaml +26 -0
- package/src/adapters/openharness/memory-read.yaml +51 -0
- package/src/adapters/openharness/skills-list.yaml +28 -0
- package/src/adapters/openrouter/models.yaml +22 -0
- package/src/adapters/pexels/search.yaml +28 -0
- package/src/adapters/pinduoduo/hot.yaml +20 -0
- package/src/adapters/pypi/info.yaml +16 -0
- package/src/adapters/qweather/now.yaml +16 -0
- package/src/adapters/renderdoc/capture-list.yaml +42 -0
- package/src/adapters/renderdoc/frame-export.yaml +32 -0
- package/src/adapters/replicate/search.yaml +25 -0
- package/src/adapters/replicate/trending.yaml +22 -0
- package/src/adapters/sspai/hot.yaml +21 -0
- package/src/adapters/sspai/latest.yaml +22 -0
- package/src/adapters/stagehand/wrap-observe.yaml +42 -0
- package/src/adapters/techcrunch/latest.yaml +22 -0
- package/src/adapters/theverge/latest.yaml +21 -0
- package/src/adapters/twitch/top.yaml +26 -0
- package/src/adapters/unsplash/search.yaml +28 -0
- 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":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EACL,eAAe,EACf,eAAe,GAEhB,MAAM,uBAAuB,CAAC;AAM/B,SAAS,iBAAiB,CACxB,MAAkB,EAClB,IAAY;IAEZ,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,aAAa;YAChB,OAAO;gBACL,IAAI,EAAE,2FAA2F;gBACjG,MAAM,EAAE,mBAAmB,IAAI,cAAc;gBAC7C,KAAK,EAAE,CAAC,gBAAgB,IAAI,SAAS,EAAE,gBAAgB,IAAI,OAAO,CAAC;aACpE,CAAC;QACJ,KAAK,UAAU;YACb,OAAO;gBACL,IAAI,EAAE,+EAA+E;gBACrF,MAAM,EAAE,mBAAmB,IAAI,cAAc;gBAC7C,KAAK,EAAE,CAAC,gBAAgB,IAAI,SAAS,CAAC;aACvC,CAAC;QACJ,KAAK,WAAW;YACd,OAAO;gBACL,IAAI,EAAE,+EAA+E;gBACrF,MAAM,EAAE,mBAAmB,IAAI,cAAc;gBAC7C,KAAK,EAAE,CAAC,gBAAgB,IAAI,SAAS,CAAC;aACvC,CAAC;QACJ,KAAK,UAAU;YACb,OAAO;gBACL,IAAI,EAAE,mFAAmF;gBACzF,MAAM,EAAE,mBAAmB,IAAI,cAAc;gBAC7C,KAAK,EAAE,CAAC,gBAAgB,IAAI,SAAS,CAAC;aACvC,CAAC;IACN,CAAC;AACH,CAAC;AAED,2EAA2E;AAE3E,SAAS,kBAAkB,CAAC,KAAa;IACvC,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,aAAa;IACtE,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACtB,MAAM,EAAE,GACN,IAAI,KAAK,GAAG;QACV,CAAC,CAAC,GAAG,GAAG,UAAU;QAClB,CAAC,CAAC,IAAI,KAAK,GAAG;YACZ,CAAC,CAAC,GAAG,GAAG,SAAS;YACjB,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC;IACrB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;AACzB,CAAC;AAED,2EAA2E;AAE3E,MAAM,UAAU,uBAAuB,CAAC,OAAgB;IACtD,MAAM,QAAQ,GAAG,OAAO;SACrB,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,2CAA2C,CAAC,CAAC;IAE5D,wBAAwB;IACxB,QAAQ;SACL,OAAO,CAAC,sBAAsB,CAAC;SAC/B,WAAW,CAAC,yCAAyC,CAAC;SACtD,MAAM,CAAC,eAAe,EAAE,kBAAkB,CAAC;SAC3C,MAAM,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,IAAI,CAAC;SAClD,MAAM,CACL,iBAAiB,EACjB,yDAAyD,CAC1D;SACA,MAAM,CAAC,eAAe,EAAE,0BAA0B,CAAC;SACnD,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;SAC/B,MAAM,CACL,KAAK,EACH,IAAY,EACZ,OAA2B,EAC3B,IAMC,EACD,EAAE;QACF,gDAAgD;QAChD,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,yEAAyE,CAC1E,CACF,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QACD,MAAM,aAAa,GAAG,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;QAEpC,+CAA+C;QAC/C,IAAI,MAAsB,CAAC;QAE3B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,UAAU,GAAG,IAAI,CAAC,MAAoB,CAAC;YAC7C,IACE,CAAC,CAAC,aAAa,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,QAAQ,CAC5D,UAAU,CACX,EACD,CAAC;gBACD,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,mBAAmB,UAAU,yDAAyD,CACvF,CACF,CAAC;gBACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,iBAAiB,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YACnD,MAAM,GAAG;gBACP,IAAI;gBACJ,OAAO;gBACP,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,IAAI,iBAAiB;gBACnD,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,mBAAmB,IAAI,cAAc;gBAC9D,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC,gBAAgB,IAAI,SAAS,CAAC;gBACtD,MAAM,EAAE,cAAc;gBACtB,SAAS,EAAE,QAAQ;gBACnB,aAAa;gBACb,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,GAAG;gBACP,IAAI;gBACJ,OAAO;gBACP,IAAI,EACF,IAAI,CAAC,IAAI;oBACT,kEAAkE;gBACpE,MAAM,EAAE,mBAAmB,IAAI,cAAc;gBAC7C,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,CAAC,gBAAgB,IAAI,SAAS,EAAE,gBAAgB,IAAI,OAAO,CAAC;gBACnE,MAAM,EAAE,cAAc;gBACtB,SAAS,EAAE,QAAQ;gBACnB,aAAa;gBACb,QAAQ,EAAE,CAAC;aACZ,CAAC;QACJ,CAAC;QAED,0BAA0B;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QACjD,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,gCAAgC,UAAU,EAAE,CAAC,CACxD,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;QAED,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,EAAE,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,aAAa,EAAE,CAAC,CAAC,CAAC;YACzD,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpB,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,MAAM,EAAE;gBAC5C,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;oBAChB,IAAI,CAAC,QAAQ;wBAAE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;gBACtD,CAAC;gBACD,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE;oBACtB,IAAI,QAAQ;wBAAE,OAAO;oBACrB,MAAM,IAAI,GACR,MAAM,CAAC,MAAM,KAAK,MAAM;wBACtB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;wBAClB,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,SAAS;4BAC3B,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;4BAChB,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBAC1B,OAAO,CAAC,KAAK,CACX,KAAK,IAAI,KAAK,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,WAAW,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAC3G,CAAC;gBACJ,CAAC;aACF,CAAC,CAAC;YAEH,UAAU;YACV,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;YAC/D,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAC9B,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAC9B,CAAC,MAAM,CAAC;YACT,MAAM,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;YAC7D,MAAM,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC;YAE/C,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ;oBACE,IAAI;oBACJ,UAAU,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC;oBAC9B,IAAI;oBACJ,SAAS;oBACT,cAAc;oBACd,WAAW;oBACX,WAAW,EAAE,WAAW,GAAG,cAAc;oBACzC,OAAO;iBACR,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBAClB,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,IAAI,CACR,SAAS,IAAI,UAAU,SAAS,sBAAsB,cAAc,MAAM,WAAW,EAAE,CACxF,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;YACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CACF,CAAC;IAEJ,iBAAiB;IACjB,QAAQ;SACL,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,mCAAmC,CAAC;SAChD,MAAM,CAAC,oBAAoB,EAAE,2BAA2B,EAAE,IAAI,CAAC;SAC/D,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;SACzC,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;SAC/B,MAAM,CAAC,CAAC,IAAsD,EAAE,EAAE;QACjE,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,eAAe,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QAEjE,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;YACxB,MAAM,IAAI,GACR,KAAK,CAAC,MAAM,KAAK,MAAM;gBACrB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;gBAClB,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,UAAU;oBAC3B,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;oBACjB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACvB,OAAO,CAAC,GAAG,CACT,KAAK,IAAI,KAAK,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAClH,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,oBAAoB;IACpB,QAAQ;SACL,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,+BAA+B,CAAC;SAC5C,MAAM,CAAC,QAAQ,EAAE,aAAa,CAAC;SAC/B,MAAM,CAAC,CAAC,IAAwB,EAAE,EAAE;QACnC,MAAM,GAAG,GAAG,eAAe,EAAE,CAAC;QAE9B,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACtD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACvD,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;QAC3D,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QACnE,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;QAC/D,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAE9D,MAAM,MAAM,GAAG;YACb,eAAe,EAAE,GAAG,CAAC,MAAM;YAC3B,IAAI;YACJ,SAAS;YACT,OAAO;YACP,WAAW,EACT,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI;YACtE,WAAW,EAAE,OAAO;YACpB,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC;SACjD,CAAC;QAEF,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,uBAAuB,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,WAAW,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC;YACpD,OAAO,CAAC,GAAG,CAAC,gBAAgB,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,mBAAmB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -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":"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"}
|
|
@@ -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"}
|