vskill 1.0.14 → 1.0.15
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/README.md +61 -0
- package/agents.json +1 -1
- package/dist/bin.js +0 -0
- package/dist/clone/github-scaffold.d.ts +38 -0
- package/dist/clone/github-scaffold.js +108 -0
- package/dist/clone/github-scaffold.js.map +1 -0
- package/dist/clone/provenance-fork.d.ts +34 -0
- package/dist/clone/provenance-fork.js +97 -0
- package/dist/clone/provenance-fork.js.map +1 -0
- package/dist/clone/reference-scanner.d.ts +19 -0
- package/dist/clone/reference-scanner.js +144 -0
- package/dist/clone/reference-scanner.js.map +1 -0
- package/dist/clone/skill-locator.d.ts +26 -0
- package/dist/clone/skill-locator.js +248 -0
- package/dist/clone/skill-locator.js.map +1 -0
- package/dist/clone/target-router.d.ts +73 -0
- package/dist/clone/target-router.js +200 -0
- package/dist/clone/target-router.js.map +1 -0
- package/dist/clone/types.d.ts +82 -0
- package/dist/clone/types.js +11 -0
- package/dist/clone/types.js.map +1 -0
- package/dist/commands/add.js +96 -32
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/auth.d.ts +23 -0
- package/dist/commands/auth.js +273 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/clone-prompts.d.ts +13 -0
- package/dist/commands/clone-prompts.js +67 -0
- package/dist/commands/clone-prompts.js.map +1 -0
- package/dist/commands/clone.d.ts +70 -0
- package/dist/commands/clone.js +649 -0
- package/dist/commands/clone.js.map +1 -0
- package/dist/commands/eval/serve.js +8 -1
- package/dist/commands/eval/serve.js.map +1 -1
- package/dist/commands/keys.js +54 -2
- package/dist/commands/keys.js.map +1 -1
- package/dist/eval/skill-scanner.d.ts +2 -12
- package/dist/eval/skill-scanner.js +27 -5
- package/dist/eval/skill-scanner.js.map +1 -1
- package/dist/eval-server/api-routes.js +338 -31
- package/dist/eval-server/api-routes.js.map +1 -1
- package/dist/eval-server/data-events.d.ts +1 -1
- package/dist/eval-server/data-events.js.map +1 -1
- package/dist/eval-server/install-engine-routes-helpers.d.ts +1 -3
- package/dist/eval-server/install-engine-routes-helpers.js +6 -14
- package/dist/eval-server/install-engine-routes-helpers.js.map +1 -1
- package/dist/eval-server/origin-resolver.d.ts +42 -0
- package/dist/eval-server/origin-resolver.js +168 -0
- package/dist/eval-server/origin-resolver.js.map +1 -0
- package/dist/eval-server/platform-proxy.d.ts +10 -0
- package/dist/eval-server/platform-proxy.js +58 -2
- package/dist/eval-server/platform-proxy.js.map +1 -1
- package/dist/eval-server/skill-resolver.js +40 -0
- package/dist/eval-server/skill-resolver.js.map +1 -1
- package/dist/eval-server/utils/resolve-editor.d.ts +6 -1
- package/dist/eval-server/utils/resolve-editor.js +11 -26
- package/dist/eval-server/utils/resolve-editor.js.map +1 -1
- package/dist/eval-server/utils/scan-install-locations.d.ts +7 -0
- package/dist/eval-server/utils/scan-install-locations.js +20 -0
- package/dist/eval-server/utils/scan-install-locations.js.map +1 -1
- package/dist/eval-server/utils/which.d.ts +15 -0
- package/dist/eval-server/utils/which.js +76 -0
- package/dist/eval-server/utils/which.js.map +1 -0
- package/dist/eval-ui/assets/{CreateSkillPage-CKvqAya0.js → CreateSkillPage-BmbvQEzE.js} +1 -1
- package/dist/eval-ui/assets/{FindSkillsPalette-B8pTa5NP.js → FindSkillsPalette-D0Zjhm31.js} +2 -2
- package/dist/eval-ui/assets/{SearchPaletteCore-CkVRvaZk.js → SearchPaletteCore-EhcN1xEa.js} +1 -1
- package/dist/eval-ui/assets/SkillDetailPanel-B5J60ffv.js +1 -0
- package/dist/eval-ui/assets/{UpdateDropdown-DA7OktXO.js → UpdateDropdown-Celf0_Cr.js} +1 -1
- package/dist/eval-ui/assets/{index-DCbohW6l.js → index-BV7k6fdk.js} +43 -41
- package/dist/eval-ui/assets/{index-BKAvJDDF.css → index-CKLqBL52.css} +1 -1
- package/dist/eval-ui/index.html +2 -2
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -1
- package/dist/installer/frontmatter.d.ts +26 -0
- package/dist/installer/frontmatter.js +90 -0
- package/dist/installer/frontmatter.js.map +1 -1
- package/dist/lib/github-fetch.d.ts +22 -0
- package/dist/lib/github-fetch.js +152 -0
- package/dist/lib/github-fetch.js.map +1 -0
- package/dist/lib/keychain.d.ts +41 -0
- package/dist/lib/keychain.js +232 -0
- package/dist/lib/keychain.js.map +1 -0
- package/dist/studio/types.d.ts +13 -0
- package/dist/utils/claude-plugin.d.ts +26 -0
- package/dist/utils/claude-plugin.js +60 -0
- package/dist/utils/claude-plugin.js.map +1 -1
- package/package.json +2 -1
- package/dist/eval-ui/assets/SkillDetailPanel-d4_LquVH.js +0 -1
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// auth.ts — `vskill auth {login,status,logout}`.
|
|
3
|
+
//
|
|
4
|
+
// Device Flow (RFC 8628) against github.com directly:
|
|
5
|
+
// 1. POST https://github.com/login/device/code
|
|
6
|
+
// body: client_id=<VSKILL_GITHUB_CLIENT_ID>&scope=read:user
|
|
7
|
+
// resp: { device_code, user_code, verification_uri, interval, expires_in }
|
|
8
|
+
// 2. Display formatted user_code (XXXX-XXXX) + verification_uri.
|
|
9
|
+
// Optionally open the URL in the user's default browser.
|
|
10
|
+
// 3. Poll https://github.com/login/oauth/access_token every `interval` seconds
|
|
11
|
+
// body: client_id=...&device_code=...&grant_type=urn:ietf:params:oauth:grant-type:device_code
|
|
12
|
+
// resp: { access_token, ... } | { error: "authorization_pending" | "slow_down" | "expired_token" | "access_denied" }
|
|
13
|
+
// slow_down → bump interval +5s.
|
|
14
|
+
// authorization_pending → keep polling.
|
|
15
|
+
// expired_token / access_denied → abort.
|
|
16
|
+
// 4. GET https://api.github.com/user with Bearer token to confirm + print login.
|
|
17
|
+
// 5. Persist token via keychain.
|
|
18
|
+
//
|
|
19
|
+
// All network operations go through dependency-injected `fetchImpl` so tests
|
|
20
|
+
// never hit the real github.com.
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
import { getDefaultKeychain } from "../lib/keychain.js";
|
|
23
|
+
const DEVICE_CODE_URL = "https://github.com/login/device/code";
|
|
24
|
+
const TOKEN_URL = "https://github.com/login/oauth/access_token";
|
|
25
|
+
const USER_URL = "https://api.github.com/user";
|
|
26
|
+
const DEFAULT_SCOPE = "read:user";
|
|
27
|
+
function isPollError(r) {
|
|
28
|
+
return typeof r.error === "string";
|
|
29
|
+
}
|
|
30
|
+
function formatUserCode(code) {
|
|
31
|
+
// GitHub returns 8 alphanumerics like "ABCD1234" — render as ABCD-1234.
|
|
32
|
+
if (code.length === 8)
|
|
33
|
+
return `${code.slice(0, 4)}-${code.slice(4)}`;
|
|
34
|
+
return code;
|
|
35
|
+
}
|
|
36
|
+
function defaultSleep(ms) {
|
|
37
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
38
|
+
}
|
|
39
|
+
async function postForm(fetchImpl, url, body, version) {
|
|
40
|
+
const params = new URLSearchParams(body);
|
|
41
|
+
return fetchImpl(url, {
|
|
42
|
+
method: "POST",
|
|
43
|
+
headers: {
|
|
44
|
+
Accept: "application/json",
|
|
45
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
46
|
+
"User-Agent": `vskill/${version}`,
|
|
47
|
+
},
|
|
48
|
+
body: params.toString(),
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
async function getJson(fetchImpl, url, token, version) {
|
|
52
|
+
const res = await fetchImpl(url, {
|
|
53
|
+
method: "GET",
|
|
54
|
+
headers: {
|
|
55
|
+
Accept: "application/vnd.github+json",
|
|
56
|
+
Authorization: `Bearer ${token}`,
|
|
57
|
+
"User-Agent": `vskill/${version}`,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
let body = null;
|
|
61
|
+
try {
|
|
62
|
+
body = await res.json();
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
body = null;
|
|
66
|
+
}
|
|
67
|
+
return { status: res.status, body };
|
|
68
|
+
}
|
|
69
|
+
async function loginCmd(deps) {
|
|
70
|
+
const { io, fetchImpl, sleep, version } = deps;
|
|
71
|
+
const keychain = deps.keychain ?? getDefaultKeychain();
|
|
72
|
+
const clientId = deps.clientId ?? process.env.VSKILL_GITHUB_CLIENT_ID ?? "";
|
|
73
|
+
if (!clientId) {
|
|
74
|
+
io.stderr.write("vskill auth login: VSKILL_GITHUB_CLIENT_ID is not set. " +
|
|
75
|
+
"Set it to the Skill Studio GitHub App's client_id, then retry.\n");
|
|
76
|
+
return 2;
|
|
77
|
+
}
|
|
78
|
+
// --- Step 1: device code -------------------------------------------------
|
|
79
|
+
let dcRes;
|
|
80
|
+
try {
|
|
81
|
+
dcRes = await postForm(fetchImpl, DEVICE_CODE_URL, {
|
|
82
|
+
client_id: clientId,
|
|
83
|
+
scope: DEFAULT_SCOPE,
|
|
84
|
+
}, version);
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
io.stderr.write(`vskill auth login: network error contacting github.com (${err.message})\n`);
|
|
88
|
+
return 1;
|
|
89
|
+
}
|
|
90
|
+
if (!dcRes.ok) {
|
|
91
|
+
io.stderr.write(`vskill auth login: device-code request failed (HTTP ${dcRes.status})\n`);
|
|
92
|
+
return 1;
|
|
93
|
+
}
|
|
94
|
+
const dc = (await dcRes.json());
|
|
95
|
+
io.stdout.write(`\nTo authenticate, visit:\n ${dc.verification_uri}\n\n`);
|
|
96
|
+
io.stdout.write(`And enter the code:\n ${formatUserCode(dc.user_code)}\n\n`);
|
|
97
|
+
io.stdout.write(`(Waiting for authorization. This window will poll every ${dc.interval}s.)\n`);
|
|
98
|
+
if (io.openBrowser) {
|
|
99
|
+
try {
|
|
100
|
+
await io.openBrowser(dc.verification_uri);
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Non-fatal — the user can copy/paste the URL.
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// --- Step 2: poll --------------------------------------------------------
|
|
107
|
+
let interval = Math.max(1, dc.interval);
|
|
108
|
+
const deadline = Date.now() + (dc.expires_in * 1000);
|
|
109
|
+
let accessToken = null;
|
|
110
|
+
while (Date.now() < deadline) {
|
|
111
|
+
await sleep(interval * 1000);
|
|
112
|
+
let pollRes;
|
|
113
|
+
try {
|
|
114
|
+
pollRes = await postForm(fetchImpl, TOKEN_URL, {
|
|
115
|
+
client_id: clientId,
|
|
116
|
+
device_code: dc.device_code,
|
|
117
|
+
grant_type: "urn:ietf:params:oauth:grant-type:device_code",
|
|
118
|
+
}, version);
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
io.stderr.write(`vskill auth login: network error during polling (${err.message})\n`);
|
|
122
|
+
return 1;
|
|
123
|
+
}
|
|
124
|
+
let body;
|
|
125
|
+
try {
|
|
126
|
+
body = (await pollRes.json());
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
io.stderr.write("vskill auth login: malformed token response from github.com\n");
|
|
130
|
+
return 1;
|
|
131
|
+
}
|
|
132
|
+
if (!isPollError(body) && body.access_token) {
|
|
133
|
+
accessToken = body.access_token;
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
if (isPollError(body)) {
|
|
137
|
+
switch (body.error) {
|
|
138
|
+
case "authorization_pending":
|
|
139
|
+
continue;
|
|
140
|
+
case "slow_down":
|
|
141
|
+
interval += 5;
|
|
142
|
+
continue;
|
|
143
|
+
case "expired_token":
|
|
144
|
+
io.stderr.write("vskill auth login: device code expired before authorization. Please try again.\n");
|
|
145
|
+
return 1;
|
|
146
|
+
case "access_denied":
|
|
147
|
+
io.stderr.write("vskill auth login: authorization denied by user.\n");
|
|
148
|
+
return 1;
|
|
149
|
+
default:
|
|
150
|
+
io.stderr.write(`vskill auth login: unexpected error from github.com: ${body.error}\n`);
|
|
151
|
+
return 1;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (!accessToken) {
|
|
156
|
+
io.stderr.write("vskill auth login: timed out waiting for authorization.\n");
|
|
157
|
+
return 1;
|
|
158
|
+
}
|
|
159
|
+
// --- Step 3: confirm via /user + persist ---------------------------------
|
|
160
|
+
const user = await getJson(fetchImpl, USER_URL, accessToken, version);
|
|
161
|
+
if (user.status !== 200 || !user.body || typeof user.body.login !== "string") {
|
|
162
|
+
io.stderr.write(`vskill auth login: token saved but /user verification failed (HTTP ${user.status})\n`);
|
|
163
|
+
keychain.setGitHubToken(accessToken);
|
|
164
|
+
return 1;
|
|
165
|
+
}
|
|
166
|
+
const login = user.body.login;
|
|
167
|
+
keychain.setGitHubToken(accessToken);
|
|
168
|
+
io.stdout.write(`\nLogged in as @${login}.\n`);
|
|
169
|
+
return 0;
|
|
170
|
+
}
|
|
171
|
+
async function statusCmd(args, deps) {
|
|
172
|
+
const { io, fetchImpl, version } = deps;
|
|
173
|
+
const keychain = deps.keychain ?? getDefaultKeychain();
|
|
174
|
+
const json = args.includes("--json");
|
|
175
|
+
const refresh = args.includes("--refresh") || args.includes("--validate");
|
|
176
|
+
const token = keychain.getGitHubToken();
|
|
177
|
+
if (!token) {
|
|
178
|
+
if (json) {
|
|
179
|
+
io.stdout.write(JSON.stringify({ loggedIn: false }) + "\n");
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
io.stdout.write("Not logged in. Run `vskill auth login`.\n");
|
|
183
|
+
}
|
|
184
|
+
return 1;
|
|
185
|
+
}
|
|
186
|
+
// Default behavior: validate via /user (cheap, ~50ms) so the user knows the
|
|
187
|
+
// token still works. --json controls output shape; --refresh is accepted for
|
|
188
|
+
// clarity but in this MVP it has the same effect as the default path.
|
|
189
|
+
void refresh;
|
|
190
|
+
const user = await getJson(fetchImpl, USER_URL, token, version);
|
|
191
|
+
if (user.status === 401) {
|
|
192
|
+
if (json) {
|
|
193
|
+
io.stdout.write(JSON.stringify({ loggedIn: false, reason: "token_invalid" }) + "\n");
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
io.stderr.write("Token is invalid or expired. Run `vskill auth login`.\n");
|
|
197
|
+
}
|
|
198
|
+
return 1;
|
|
199
|
+
}
|
|
200
|
+
if (user.status !== 200 || !user.body) {
|
|
201
|
+
if (json) {
|
|
202
|
+
io.stdout.write(JSON.stringify({ loggedIn: true, validated: false, status: user.status }) + "\n");
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
io.stdout.write(`Token present but /user returned HTTP ${user.status}. Network or scope issue.\n`);
|
|
206
|
+
}
|
|
207
|
+
return 1;
|
|
208
|
+
}
|
|
209
|
+
const u = user.body;
|
|
210
|
+
if (json) {
|
|
211
|
+
io.stdout.write(JSON.stringify({ loggedIn: true, login: u.login, id: u.id }) + "\n");
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
io.stdout.write(`Logged in as @${u.login} (id=${u.id}).\n`);
|
|
215
|
+
}
|
|
216
|
+
return 0;
|
|
217
|
+
}
|
|
218
|
+
async function logoutCmd(deps) {
|
|
219
|
+
const { io } = deps;
|
|
220
|
+
const keychain = deps.keychain ?? getDefaultKeychain();
|
|
221
|
+
const had = keychain.clearGitHubToken();
|
|
222
|
+
if (had) {
|
|
223
|
+
io.stdout.write("Logged out. GitHub token cleared from keychain.\n");
|
|
224
|
+
return 0;
|
|
225
|
+
}
|
|
226
|
+
io.stdout.write("Logged out. (No GitHub token was stored.)\n");
|
|
227
|
+
return 0;
|
|
228
|
+
}
|
|
229
|
+
function usage(io) {
|
|
230
|
+
io.stdout.write([
|
|
231
|
+
"Usage: vskill auth <subcommand>",
|
|
232
|
+
"",
|
|
233
|
+
"Subcommands:",
|
|
234
|
+
" login Sign in via GitHub Device Flow",
|
|
235
|
+
" status [--json] [--refresh] Show current GitHub identity",
|
|
236
|
+
" logout Clear stored GitHub credentials",
|
|
237
|
+
"",
|
|
238
|
+
].join("\n"));
|
|
239
|
+
}
|
|
240
|
+
export async function authCommand(argv, deps) {
|
|
241
|
+
const fetchImpl = deps.fetchImpl ?? fetch;
|
|
242
|
+
const sleep = deps.sleep ?? defaultSleep;
|
|
243
|
+
const version = deps.version ?? "vskill";
|
|
244
|
+
const io = deps.io;
|
|
245
|
+
const sub = argv[0];
|
|
246
|
+
let exit = 0;
|
|
247
|
+
switch (sub) {
|
|
248
|
+
case "login":
|
|
249
|
+
exit = await loginCmd({ ...deps, fetchImpl, sleep, version });
|
|
250
|
+
break;
|
|
251
|
+
case "status":
|
|
252
|
+
exit = await statusCmd(argv.slice(1), { ...deps, fetchImpl, sleep: deps.sleep ?? defaultSleep, version });
|
|
253
|
+
break;
|
|
254
|
+
case "logout":
|
|
255
|
+
exit = await logoutCmd(deps);
|
|
256
|
+
break;
|
|
257
|
+
case undefined:
|
|
258
|
+
case "--help":
|
|
259
|
+
case "-h":
|
|
260
|
+
usage(io);
|
|
261
|
+
exit = sub ? 0 : 1;
|
|
262
|
+
break;
|
|
263
|
+
default:
|
|
264
|
+
io.stderr.write(`unknown subcommand: ${sub}\n`);
|
|
265
|
+
usage(io);
|
|
266
|
+
exit = 1;
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
if (deps.io.exit)
|
|
270
|
+
deps.io.exit(exit);
|
|
271
|
+
return exit;
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface ConfirmPromptOptions {
|
|
2
|
+
/** When true, bypass all prompts and return true. */
|
|
3
|
+
yes?: boolean;
|
|
4
|
+
/** Override TTY detection (defaults to process.stdin.isTTY). */
|
|
5
|
+
stdinIsTTY?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function confirmPrompt(message: string, opts?: ConfirmPromptOptions): Promise<boolean>;
|
|
8
|
+
export declare function promptInput(message: string): Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* Prompt the user to choose one of N labelled options. Returns the chosen
|
|
11
|
+
* index. Re-prompts on bad input.
|
|
12
|
+
*/
|
|
13
|
+
export declare function promptChoice(message: string, labels: string[]): Promise<number>;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// vskill clone — interactive prompts (TTY-only, readline-based)
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
// Mirrors the pattern used in src/commands/remove.ts (createInterface + a
|
|
5
|
+
// promise-wrapped question). Falls back to non-interactive defaults when
|
|
6
|
+
// stdin is not a TTY so the CLI is scriptable in CI.
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
import { createInterface } from "node:readline";
|
|
9
|
+
export async function confirmPrompt(message, opts = {}) {
|
|
10
|
+
if (opts.yes)
|
|
11
|
+
return true;
|
|
12
|
+
const isTTY = opts.stdinIsTTY ?? process.stdin.isTTY;
|
|
13
|
+
if (!isTTY) {
|
|
14
|
+
process.stderr.write("refusing to prompt in non-TTY context — re-run with --yes to confirm\n");
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
18
|
+
return new Promise((resolveAns) => {
|
|
19
|
+
rl.question(`${message} (y/N): `, (answer) => {
|
|
20
|
+
rl.close();
|
|
21
|
+
resolveAns(answer.trim().toLowerCase() === "y");
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export async function promptInput(message) {
|
|
26
|
+
if (!process.stdin.isTTY)
|
|
27
|
+
return "";
|
|
28
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
29
|
+
return new Promise((resolveAns) => {
|
|
30
|
+
rl.question(`${message} `, (answer) => {
|
|
31
|
+
rl.close();
|
|
32
|
+
resolveAns(answer.trim());
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Prompt the user to choose one of N labelled options. Returns the chosen
|
|
38
|
+
* index. Re-prompts on bad input.
|
|
39
|
+
*/
|
|
40
|
+
export async function promptChoice(message, labels) {
|
|
41
|
+
if (!process.stdin.isTTY)
|
|
42
|
+
return 0;
|
|
43
|
+
console.log(message);
|
|
44
|
+
for (let i = 0; i < labels.length; i++) {
|
|
45
|
+
console.log(` [${i + 1}] ${labels[i]}`);
|
|
46
|
+
}
|
|
47
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
48
|
+
const askOnce = () => new Promise((resolveAns) => {
|
|
49
|
+
rl.question(`Pick 1-${labels.length}: `, (answer) => {
|
|
50
|
+
resolveAns(answer.trim());
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
try {
|
|
54
|
+
while (true) {
|
|
55
|
+
const raw = await askOnce();
|
|
56
|
+
const n = Number.parseInt(raw, 10);
|
|
57
|
+
if (Number.isInteger(n) && n >= 1 && n <= labels.length) {
|
|
58
|
+
return n - 1;
|
|
59
|
+
}
|
|
60
|
+
console.log(` invalid — enter a number between 1 and ${labels.length}.`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
finally {
|
|
64
|
+
rl.close();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=clone-prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clone-prompts.js","sourceRoot":"","sources":["../../src/commands/clone-prompts.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { type RunGh } from "../clone/github-scaffold.js";
|
|
2
|
+
import type { CloneResult, CloneTargetKind, ReferenceMatch, SkillSource, SkillSourceLocation } from "../clone/types.js";
|
|
3
|
+
export interface CloneCommandOptions {
|
|
4
|
+
target?: CloneTargetKind;
|
|
5
|
+
path?: string;
|
|
6
|
+
plugin?: string;
|
|
7
|
+
pluginName?: string;
|
|
8
|
+
author?: string;
|
|
9
|
+
namespace?: string;
|
|
10
|
+
github?: boolean;
|
|
11
|
+
force?: boolean;
|
|
12
|
+
source?: SkillSourceLocation;
|
|
13
|
+
dryRun?: boolean;
|
|
14
|
+
/** Auto-confirm all prompts (--yes / -y). */
|
|
15
|
+
yes?: boolean;
|
|
16
|
+
/** Override home — used for tests. */
|
|
17
|
+
home?: string;
|
|
18
|
+
/** Override cwd — used for tests. */
|
|
19
|
+
cwd?: string;
|
|
20
|
+
/** Injectable `gh` adapter for tests. */
|
|
21
|
+
runGh?: RunGh;
|
|
22
|
+
/** When true, error messages are thrown instead of printed (used for tests / whole-plugin path). */
|
|
23
|
+
throwOnError?: boolean;
|
|
24
|
+
}
|
|
25
|
+
declare function slugify(name: string): string;
|
|
26
|
+
/**
|
|
27
|
+
* Recursively scan a skill directory for cross-skill references and
|
|
28
|
+
* self-name occurrences across SKILL.md and any .md files in subdirectories
|
|
29
|
+
* (e.g., agents/*.md). Operates on the staged `.tmp` content so the report
|
|
30
|
+
* reflects what actually got copied.
|
|
31
|
+
*/
|
|
32
|
+
declare function scanCopiedSkill(stagingDir: string, oldSkillName: string): Promise<{
|
|
33
|
+
refs: ReferenceMatch[];
|
|
34
|
+
selfNames: ReferenceMatch[];
|
|
35
|
+
}>;
|
|
36
|
+
/**
|
|
37
|
+
* Validate the staged clone: SKILL.md must parse and any `agents/*.md`
|
|
38
|
+
* referenced by frontmatter must exist. Throws on any inconsistency.
|
|
39
|
+
*/
|
|
40
|
+
declare function validateStagedClone(stagingDir: string): Promise<void>;
|
|
41
|
+
interface ResolvedCloneArgs {
|
|
42
|
+
source: SkillSource;
|
|
43
|
+
targetKind: CloneTargetKind;
|
|
44
|
+
newSkillBase: string;
|
|
45
|
+
newSkillFullName: string;
|
|
46
|
+
author: string;
|
|
47
|
+
namespace: string;
|
|
48
|
+
finalDir: string;
|
|
49
|
+
pluginRoot?: string;
|
|
50
|
+
pluginName?: string;
|
|
51
|
+
}
|
|
52
|
+
declare function resolveArgs(positionalSource: string, opts: CloneCommandOptions, homePath: string, cwdPath: string): Promise<ResolvedCloneArgs>;
|
|
53
|
+
/**
|
|
54
|
+
* Run the clone pipeline. Returns the CloneResult on success. On failure,
|
|
55
|
+
* cleans up every staged `.tmp` path before propagating the error.
|
|
56
|
+
*
|
|
57
|
+
* The function is exported for use by the whole-plugin path (T-010) and unit
|
|
58
|
+
* tests; the CLI entry point is `cloneCommand` below.
|
|
59
|
+
*/
|
|
60
|
+
export declare function runCloneOnce(resolved: ResolvedCloneArgs, opts: CloneCommandOptions): Promise<CloneResult>;
|
|
61
|
+
/** CLI entry point (Commander action). */
|
|
62
|
+
export declare function cloneCommand(source: string | undefined, opts: CloneCommandOptions): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Whole-plugin clone path (T-010). Delegated to its own module is overkill —
|
|
65
|
+
* the orchestration is small and shares all the same primitives.
|
|
66
|
+
*/
|
|
67
|
+
declare function runWholePluginClone(pluginName: string, opts: CloneCommandOptions, homePath: string, cwdPath: string): Promise<void>;
|
|
68
|
+
/** Re-exports for tests. */
|
|
69
|
+
export { resolveArgs, validateStagedClone, scanCopiedSkill, slugify, runWholePluginClone };
|
|
70
|
+
export type { ResolvedCloneArgs };
|