cbs-4px-merchant-cli 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,540 @@
1
+ /**
2
+ * Skill installer — the single source of truth for *where* skills live, *how*
3
+ * they are laid down, and *which* stale files get removed.
4
+ *
5
+ * Design rules (do not break these):
6
+ * 1. This module never prints and never calls `process.exit`. All IO belongs
7
+ * to the command layer (`src/commands/skill.ts`).
8
+ * 2. The skill version comes from the bundled `skill/package.json`, never
9
+ * from the root `package.json`. Today the two values are identical; the
10
+ * indirection keeps them separable if the skill is ever published to a
11
+ * skill marketplace on its own release cadence.
12
+ * 3. Deletion is driven exclusively by the `files` list of the *previous*
13
+ * manifest. No manifest ⇒ nothing is deleted. A missing/empty list must
14
+ * never widen into "remove the whole directory".
15
+ * 4. Nothing machine-specific may be written into SKILL.md or reference/*.
16
+ * Host state (which dirs were touched, whether an API Key is configured)
17
+ * belongs in terminal output only.
18
+ */
19
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, readdirSync, copyFileSync, rmSync, statSync, } from 'node:fs';
20
+ import { join, dirname, sep } from 'node:path';
21
+ import { homedir } from 'node:os';
22
+ import { fileURLToPath } from 'node:url';
23
+ import { PACKAGE_NAME } from '../generated/site.js';
24
+ const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
25
+ /**
26
+ * Skill install dir name — the package name with any npm scope stripped
27
+ * (e.g. `cbs-4px-merchant-cli`). Previously duplicated in scripts/build.js,
28
+ * scripts/postinstall.js and src/cli.ts; this is now the only copy.
29
+ */
30
+ export const SKILL_DIR_NAME = PACKAGE_NAME.replace(/^@[^/]+\//, '');
31
+ /** Legacy version marker written by <= 0.0.2 postinstall. Still written. */
32
+ export const VERSION_MARKER = '.skill-version';
33
+ /** npm-style manifest, doubling as the install receipt. */
34
+ export const MANIFEST_FILE = 'package.json';
35
+ /** Stamp identifying this CLI as the installer of a target directory. */
36
+ export const INSTALL_METHOD = 'cli';
37
+ /**
38
+ * Known AI coding tools. Union of what postinstall used to ship (10), the
39
+ * dws (钉钉) reference list (16) and this project's extras.
40
+ *
41
+ * A whitelist alone always lags behind new tools, so `resolveTargets()` also
42
+ * discovers unknown `~/.<tool>/skills` dirs at runtime. Both paths additionally
43
+ * require the directory to look in use — see `looksInUse()`.
44
+ */
45
+ const AGENT_REGISTRY = [
46
+ { id: 'agent-skills', label: 'Agent Skills', segments: ['.agents'] },
47
+ { id: 'amp', label: 'Amp', segments: ['.amp'] },
48
+ { id: 'augment', label: 'Augment', segments: ['.augment'] },
49
+ { id: 'claude-code', label: 'Claude Code', segments: ['.claude'] },
50
+ { id: 'cline', label: 'Cline', segments: ['.cline'] },
51
+ { id: 'codex', label: 'Codex', segments: ['.codex'] },
52
+ { id: 'cursor', label: 'Cursor', segments: ['.cursor'] },
53
+ { id: 'gemini-cli', label: 'Gemini CLI', segments: ['.gemini'] },
54
+ { id: 'github-copilot', label: 'GitHub Copilot', segments: ['.github'] },
55
+ { id: 'hermes', label: 'Hermes', segments: ['.hermes'] },
56
+ { id: 'kilo', label: 'Kilo Code', segments: ['.kilo'] },
57
+ { id: 'kiro', label: 'Kiro', segments: ['.kiro'] },
58
+ { id: 'openclaw', label: 'OpenCLaw', segments: ['.openclaw'] },
59
+ { id: 'opencode', label: 'OpenCode', segments: ['.config', 'opencode'] },
60
+ { id: 'qoder', label: 'Qoder', segments: ['.qoder'] },
61
+ { id: 'qoderwork', label: 'QoderWork', segments: ['.qoderwork'] },
62
+ { id: 'qwen-code', label: 'QwenCode', segments: ['.qwen'] },
63
+ { id: 'trae', label: 'Trae', segments: ['.trae'] },
64
+ { id: 'windsurf', label: 'Windsurf', segments: ['.windsurf'] },
65
+ ];
66
+ /** Whitelisted agent ids, for `--agent` validation and error messages. */
67
+ export function knownAgentIds() {
68
+ return AGENT_REGISTRY.map((a) => a.id).sort();
69
+ }
70
+ /** Thrown for caller mistakes the command layer must render as a clean error. */
71
+ export class SkillInstallerError extends Error {
72
+ code;
73
+ hint;
74
+ constructor(message, code, hint) {
75
+ super(message);
76
+ this.code = code;
77
+ this.hint = hint;
78
+ this.name = 'SkillInstallerError';
79
+ }
80
+ }
81
+ // ────────────────────────── Skill source ──────────────────────────
82
+ /** Bundled skill dir: `<pkg>/skill`, from both `dist/` and `src/` layouts. */
83
+ export function resolveSkillRoot(override) {
84
+ return override ?? join(MODULE_DIR, '..', '..', 'skill');
85
+ }
86
+ /**
87
+ * Read the bundled skill and enumerate what will be written.
88
+ *
89
+ * The file list is walked from disk rather than taken from the manifest's
90
+ * `files` field: disk is what actually gets copied, so deriving the receipt
91
+ * from it keeps the manifest from ever describing files that aren't there.
92
+ */
93
+ export function readSkillSource(override) {
94
+ const root = resolveSkillRoot(override);
95
+ const manifestPath = join(root, MANIFEST_FILE);
96
+ if (!existsSync(join(root, 'SKILL.md'))) {
97
+ throw new SkillInstallerError(`未找到 skill 产物: ${join(root, 'SKILL.md')}`, 'SKILL_SOURCE_MISSING', '源码 checkout 需先构建,例如: SITE=4px ENV=prod npm run build');
98
+ }
99
+ if (!existsSync(manifestPath)) {
100
+ throw new SkillInstallerError(`未找到 skill manifest: ${manifestPath}`, 'SKILL_MANIFEST_MISSING', '请重新构建以生成 skill/package.json(scripts/build.js)');
101
+ }
102
+ let parsed;
103
+ try {
104
+ parsed = JSON.parse(readFileSync(manifestPath, 'utf-8'));
105
+ }
106
+ catch (e) {
107
+ throw new SkillInstallerError(`skill manifest 解析失败: ${e.message}`, 'SKILL_MANIFEST_INVALID', '请重新构建以重新生成 skill/package.json');
108
+ }
109
+ const version = typeof parsed.version === 'string' ? parsed.version.trim() : '';
110
+ if (!version) {
111
+ throw new SkillInstallerError('skill manifest 缺少 version 字段', 'SKILL_MANIFEST_INVALID', '请重新构建以重新生成 skill/package.json');
112
+ }
113
+ const source = {
114
+ name: typeof parsed.name === 'string' && parsed.name ? parsed.name : SKILL_DIR_NAME,
115
+ version,
116
+ root,
117
+ files: walkSkillFiles(root),
118
+ };
119
+ if (typeof parsed.description === 'string')
120
+ source.description = parsed.description;
121
+ return source;
122
+ }
123
+ /** SKILL.md + package.json + reference/*.md, as sorted relative paths. */
124
+ function walkSkillFiles(root) {
125
+ const files = ['SKILL.md', MANIFEST_FILE];
126
+ const refDir = join(root, 'reference');
127
+ if (isDir(refDir)) {
128
+ for (const entry of readdirSync(refDir).sort()) {
129
+ if (entry.endsWith('.md'))
130
+ files.push(`reference/${entry}`);
131
+ }
132
+ }
133
+ return files;
134
+ }
135
+ // ────────────────────────── Target resolution ──────────────────────────
136
+ /**
137
+ * Whitelist ∪ discovery, both gated on the directory looking actually used.
138
+ *
139
+ * An explicit `--agent` bypasses the in-use heuristic: naming a tool is a
140
+ * direct instruction, and the heuristic exists only to guess for the user.
141
+ */
142
+ export function resolveTargets(opts = {}) {
143
+ const home = opts.home ?? homedir();
144
+ const wanted = new Set((opts.agents ?? []).filter(Boolean));
145
+ const explicit = wanted.size > 0;
146
+ const selected = [];
147
+ for (const agent of AGENT_REGISTRY) {
148
+ if (explicit && !wanted.has(agent.id))
149
+ continue;
150
+ const root = join(home, ...agent.segments);
151
+ if (!isDir(root))
152
+ continue;
153
+ if (!explicit && !looksInUse(root))
154
+ continue;
155
+ selected.push(agent);
156
+ }
157
+ for (const agent of discoverAgents(home)) {
158
+ if (explicit && !wanted.has(agent.id))
159
+ continue;
160
+ selected.push(agent);
161
+ }
162
+ return selected;
163
+ }
164
+ /**
165
+ * Evidence that a tool is really installed: the directory holds something
166
+ * besides `skills/`.
167
+ *
168
+ * Existence alone is not evidence. Agent installers such as bailian-cli and a1
169
+ * pre-create `~/.<tool>/skills/` for every agent they know of, whether or not
170
+ * that tool is present — on a machine with one of them there are ~35 such
171
+ * husks whose only content is that empty `skills/` dir. Writing docs into them
172
+ * means shipping files for software the user does not have. A tool the user
173
+ * actually runs always leaves config, cache or state of its own.
174
+ */
175
+ function looksInUse(dir) {
176
+ return safeReaddir(dir).some((entry) => entry !== 'skills');
177
+ }
178
+ /** Find `~/.<tool>/skills` and `~/.config/<tool>/skills` outside the whitelist. */
179
+ function discoverAgents(home) {
180
+ const seen = new Set(AGENT_REGISTRY.map((a) => a.segments.join(sep)));
181
+ const found = [];
182
+ const scan = (parent, prefix) => {
183
+ for (const entry of safeReaddir(parent)) {
184
+ // Top level only looks at dotdirs; `.config` is descended into instead.
185
+ if (prefix.length === 0 && (!entry.startsWith('.') || entry === '.config'))
186
+ continue;
187
+ const segments = [...prefix, entry];
188
+ const key = segments.join(sep);
189
+ if (seen.has(key))
190
+ continue;
191
+ const root = join(parent, entry);
192
+ if (!isDir(join(root, 'skills')))
193
+ continue;
194
+ if (!looksInUse(root))
195
+ continue;
196
+ seen.add(key);
197
+ found.push({ id: entry.replace(/^\./, ''), label: entry, segments });
198
+ }
199
+ };
200
+ scan(home, []);
201
+ scan(join(home, '.config'), ['.config']);
202
+ return found.sort((a, b) => a.id.localeCompare(b.id));
203
+ }
204
+ /** Absolute install dir of the skill for one agent. */
205
+ export function targetDirFor(home, agent) {
206
+ return join(home, ...agent.segments, 'skills', requireSkillDirName());
207
+ }
208
+ /**
209
+ * All candidate install dirs, used by the CLI's drift check. Includes
210
+ * whitelisted tools whose root exists plus discovered ones — so a tool that is
211
+ * only reachable via discovery (e.g. OpenCode) can no longer be invisible to
212
+ * drift detection.
213
+ */
214
+ export function listSkillDirs(home = homedir()) {
215
+ return resolveTargets({ home }).map((agent) => targetDirFor(home, agent));
216
+ }
217
+ /**
218
+ * Guard against the `rm -rf $VAR/` class of accident: an empty dir name would
219
+ * collapse `join(root, 'skills', '')` into `<root>/skills`, putting every skill
220
+ * of every tool inside the deletion blast radius.
221
+ */
222
+ function requireSkillDirName() {
223
+ if (!SKILL_DIR_NAME) {
224
+ throw new SkillInstallerError('PACKAGE_NAME 为空,无法推导 skill 目录名', 'SKILL_DIR_NAME_EMPTY', '构建产物异常,请检查 sites.config.json 的 packageName 后重新构建');
225
+ }
226
+ return SKILL_DIR_NAME;
227
+ }
228
+ /** Validate `--agent` values against the whitelist, a1-style. */
229
+ export function validateAgentIds(ids) {
230
+ const known = new Set(knownAgentIds());
231
+ const bad = ids.filter((id) => !known.has(id));
232
+ if (bad.length === 0)
233
+ return;
234
+ throw new SkillInstallerError(`未识别的 --agent ${bad.map((b) => `"${b}"`).join(', ')}`, 'UNKNOWN_AGENT', `支持的 agent id:${knownAgentIds().join(', ')}`);
235
+ }
236
+ // ────────────────────────── Manifest ──────────────────────────
237
+ /** Read a target's manifest. Returns null when absent or unparsable. */
238
+ export function readTargetManifest(dir) {
239
+ const path = join(dir, MANIFEST_FILE);
240
+ if (!existsSync(path))
241
+ return null;
242
+ try {
243
+ const parsed = JSON.parse(readFileSync(path, 'utf-8'));
244
+ if (typeof parsed.version !== 'string')
245
+ return null;
246
+ return {
247
+ name: typeof parsed.name === 'string' ? parsed.name : '',
248
+ version: parsed.version,
249
+ files: Array.isArray(parsed.files) ? parsed.files.filter((f) => typeof f === 'string') : [],
250
+ ...(typeof parsed.description === 'string' ? { description: parsed.description } : {}),
251
+ ...(typeof parsed.installSource === 'string' ? { installSource: parsed.installSource } : {}),
252
+ ...(typeof parsed.installMethod === 'string' ? { installMethod: parsed.installMethod } : {}),
253
+ ...(typeof parsed.installedAt === 'string' ? { installedAt: parsed.installedAt } : {}),
254
+ };
255
+ }
256
+ catch {
257
+ // Unparsable manifest degrades to "overwrite, never delete".
258
+ return null;
259
+ }
260
+ }
261
+ /** Legacy plain-text version marker written by <= 0.0.2 postinstall. */
262
+ export function readLegacyVersion(dir) {
263
+ const path = join(dir, VERSION_MARKER);
264
+ if (!existsSync(path))
265
+ return null;
266
+ try {
267
+ const raw = readFileSync(path, 'utf-8').trim();
268
+ return raw || null;
269
+ }
270
+ catch {
271
+ return null;
272
+ }
273
+ }
274
+ /** Installed version of a target, manifest first then legacy marker. */
275
+ export function readInstalledVersion(dir) {
276
+ return readTargetManifest(dir)?.version ?? readLegacyVersion(dir);
277
+ }
278
+ /**
279
+ * Reconstruct the footprint of a pre-manifest install (<= 0.0.2).
280
+ *
281
+ * That installer copied exactly SKILL.md plus reference/*.md, so for a dir
282
+ * whose `.skill-version` proves it is ours, the files it owns can be recovered
283
+ * from disk. This keeps the first post-upgrade run able to clear orphans such
284
+ * as the long-deleted reference/claim.md, while still deleting only paths that
285
+ * were explicitly enumerated rather than wiping the directory.
286
+ *
287
+ * Deliberately narrow: SKILL.md and reference/*.md only. Anything else in the
288
+ * directory is left alone because the old installer never wrote it.
289
+ */
290
+ function legacyFootprint(dir) {
291
+ const files = [];
292
+ if (existsSync(join(dir, 'SKILL.md')))
293
+ files.push('SKILL.md');
294
+ for (const entry of safeReaddir(join(dir, 'reference'))) {
295
+ if (entry.endsWith('.md'))
296
+ files.push(`reference/${entry}`);
297
+ }
298
+ return files.sort();
299
+ }
300
+ /**
301
+ * Paths a target currently owns: the manifest receipt when present, otherwise
302
+ * the reconstructed legacy footprint. Empty for dirs we have no claim over.
303
+ */
304
+ function ownedFiles(dir, state) {
305
+ if (state === 'owned')
306
+ return readTargetManifest(dir)?.files ?? [];
307
+ if (state === 'legacy')
308
+ return legacyFootprint(dir);
309
+ return [];
310
+ }
311
+ // ────────────────────────── Planning ──────────────────────────
312
+ /** Classify a target directory before touching it. */
313
+ export function inspectTarget(dir, source) {
314
+ if (!isDir(dir) || safeReaddir(dir).length === 0)
315
+ return 'fresh';
316
+ const manifest = readTargetManifest(dir);
317
+ if (manifest) {
318
+ const owner = manifest.installSource || manifest.name;
319
+ return owner === source.name || owner === SKILL_DIR_NAME ? 'owned' : 'foreign';
320
+ }
321
+ // <= 0.0.2 laid down only `.skill-version`; that marker is our own receipt,
322
+ // so treat it as proof of ownership rather than blocking every early user.
323
+ if (readLegacyVersion(dir))
324
+ return 'legacy';
325
+ return 'unknown';
326
+ }
327
+ export function buildPlan(source, opts = {}) {
328
+ const home = opts.home ?? homedir();
329
+ const newFiles = new Set(source.files);
330
+ const targets = [];
331
+ for (const agent of resolveTargets(opts)) {
332
+ const dir = targetDirFor(home, agent);
333
+ const state = inspectTarget(dir, source);
334
+ // Only paths this CLI is known to own are candidates for deletion, so a
335
+ // dir with no evidence of ownership yields an empty list and loses nothing.
336
+ const remove = ownedFiles(dir, state)
337
+ .filter((f) => !newFiles.has(f))
338
+ .filter(isSafeRelativePath)
339
+ .filter((f) => existsSync(join(dir, f)))
340
+ .sort();
341
+ const plan = {
342
+ agent: agent.id,
343
+ label: agent.label,
344
+ dir,
345
+ state,
346
+ installed_version: readInstalledVersion(dir),
347
+ remove,
348
+ blocked: state === 'foreign' || state === 'unknown',
349
+ };
350
+ if (state === 'foreign') {
351
+ const owner = readTargetManifest(dir);
352
+ const source_ = owner?.installSource || owner?.name;
353
+ if (source_)
354
+ plan.installed_source = source_;
355
+ }
356
+ targets.push(plan);
357
+ }
358
+ return { skill: source, targets };
359
+ }
360
+ /**
361
+ * Reject anything that could escape the target dir. Manifests are read from
362
+ * disk and may have been edited by hand, so their paths are untrusted input.
363
+ */
364
+ export function isSafeRelativePath(p) {
365
+ if (!p || p.startsWith('/') || p.startsWith('\\') || /^[a-zA-Z]:/.test(p))
366
+ return false;
367
+ const parts = p.split(/[/\\]/);
368
+ return !parts.some((seg) => seg === '' || seg === '.' || seg === '..');
369
+ }
370
+ /** Lay the skill down on every planned target. Never throws per target. */
371
+ export function applyPlan(plan, opts = {}) {
372
+ return plan.targets.map((target) => applyTarget(plan.skill, target, opts));
373
+ }
374
+ function applyTarget(source, target, opts) {
375
+ const base = {
376
+ agent: target.agent,
377
+ label: target.label,
378
+ dir: target.dir,
379
+ outcome: 'skipped',
380
+ previous_version: target.installed_version,
381
+ removed: [],
382
+ };
383
+ if (target.blocked && !opts.force) {
384
+ return {
385
+ ...base,
386
+ reason: target.state === 'foreign'
387
+ ? `目录由 ${target.installed_source ?? '其他安装器'} 管理,未覆盖(--force 可强制)`
388
+ : '目录已存在但来历不明,未覆盖(--force 可强制)',
389
+ };
390
+ }
391
+ try {
392
+ mkdirSync(target.dir, { recursive: true });
393
+ for (const rel of source.files) {
394
+ const dest = join(target.dir, rel);
395
+ mkdirSync(dirname(dest), { recursive: true });
396
+ if (rel === MANIFEST_FILE) {
397
+ writeFileSync(dest, renderManifest(source), 'utf-8');
398
+ }
399
+ else {
400
+ copyFileSync(join(source.root, rel), dest);
401
+ }
402
+ }
403
+ // Keep writing the legacy marker: CLIs already published (<= 0.0.2) read
404
+ // it for drift detection and would go blind without it.
405
+ writeFileSync(join(target.dir, VERSION_MARKER), source.version, 'utf-8');
406
+ const removed = [];
407
+ for (const rel of target.remove) {
408
+ if (!isSafeRelativePath(rel))
409
+ continue;
410
+ try {
411
+ rmSync(join(target.dir, rel), { force: true });
412
+ removed.push(rel);
413
+ }
414
+ catch {
415
+ // A file we cannot remove is a leftover doc, not a failed install.
416
+ }
417
+ }
418
+ pruneEmptyDir(join(target.dir, 'reference'));
419
+ return {
420
+ ...base,
421
+ outcome: target.state === 'fresh' ? 'installed' : 'updated',
422
+ removed,
423
+ };
424
+ }
425
+ catch (e) {
426
+ return { ...base, outcome: 'failed', reason: e.message };
427
+ }
428
+ }
429
+ /** Manifest written into the target — source metadata plus the install stamp. */
430
+ function renderManifest(source) {
431
+ const manifest = {
432
+ name: source.name,
433
+ version: source.version,
434
+ ...(source.description ? { description: source.description } : {}),
435
+ files: source.files,
436
+ installSource: source.name,
437
+ installMethod: INSTALL_METHOD,
438
+ installedAt: new Date().toISOString(),
439
+ };
440
+ return JSON.stringify(manifest, null, 2) + '\n';
441
+ }
442
+ function pruneEmptyDir(dir) {
443
+ if (isDir(dir) && safeReaddir(dir).length === 0) {
444
+ try {
445
+ rmSync(dir, { recursive: true, force: true });
446
+ }
447
+ catch {
448
+ /* leaving an empty dir behind is harmless */
449
+ }
450
+ }
451
+ }
452
+ /**
453
+ * Plan removal. Deletion is still manifest-bounded: without a receipt we only
454
+ * remove the files this CLI is known to write, never the directory wholesale.
455
+ */
456
+ export function buildUninstallPlan(source, opts = {}) {
457
+ const home = opts.home ?? homedir();
458
+ const plans = [];
459
+ for (const agent of resolveTargets(opts)) {
460
+ const dir = targetDirFor(home, agent);
461
+ if (!isDir(dir))
462
+ continue;
463
+ const state = inspectTarget(dir, source);
464
+ const manifest = readTargetManifest(dir);
465
+ // A legacy dir has no receipt; its footprint is reconstructed from disk.
466
+ const owned = ownedFiles(dir, state);
467
+ const candidates = owned.length > 0 ? owned : source.files;
468
+ const remove = [...candidates, VERSION_MARKER]
469
+ .filter(isSafeRelativePath)
470
+ .filter((f) => existsSync(join(dir, f)))
471
+ .sort();
472
+ const plan = {
473
+ agent: agent.id,
474
+ label: agent.label,
475
+ dir,
476
+ state,
477
+ installed_version: readInstalledVersion(dir),
478
+ remove,
479
+ blocked: state === 'foreign' || state === 'unknown',
480
+ };
481
+ const owner = manifest?.installSource || manifest?.name;
482
+ if (state === 'foreign' && owner)
483
+ plan.installed_source = owner;
484
+ plans.push(plan);
485
+ }
486
+ return plans;
487
+ }
488
+ export function applyUninstall(plans, opts = {}) {
489
+ return plans.map((plan) => {
490
+ const base = {
491
+ agent: plan.agent,
492
+ label: plan.label,
493
+ dir: plan.dir,
494
+ outcome: 'skipped',
495
+ previous_version: plan.installed_version,
496
+ removed: [],
497
+ };
498
+ if (plan.blocked && !opts.force) {
499
+ return {
500
+ ...base,
501
+ reason: plan.state === 'foreign'
502
+ ? `目录由 ${plan.installed_source ?? '其他安装器'} 管理,未删除(--force 可强制)`
503
+ : '目录来历不明,未删除(--force 可强制)',
504
+ };
505
+ }
506
+ const removed = [];
507
+ try {
508
+ for (const rel of plan.remove) {
509
+ if (!isSafeRelativePath(rel))
510
+ continue;
511
+ rmSync(join(plan.dir, rel), { force: true });
512
+ removed.push(rel);
513
+ }
514
+ pruneEmptyDir(join(plan.dir, 'reference'));
515
+ pruneEmptyDir(plan.dir);
516
+ return { ...base, outcome: 'updated', removed };
517
+ }
518
+ catch (e) {
519
+ return { ...base, outcome: 'failed', removed, reason: e.message };
520
+ }
521
+ });
522
+ }
523
+ // ────────────────────────── fs helpers ──────────────────────────
524
+ function isDir(path) {
525
+ try {
526
+ return statSync(path).isDirectory();
527
+ }
528
+ catch {
529
+ return false;
530
+ }
531
+ }
532
+ function safeReaddir(path) {
533
+ try {
534
+ return readdirSync(path);
535
+ }
536
+ catch {
537
+ return [];
538
+ }
539
+ }
540
+ //# sourceMappingURL=skill-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-installer.js","sourceRoot":"","sources":["../../src/services/skill-installer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cbs-4px-merchant-cli",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "description": "Cbs merchant CLI tool",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -11,6 +11,7 @@
11
11
  "dist",
12
12
  "skill/SKILL.md",
13
13
  "skill/reference",
14
+ "skill/package.json",
14
15
  "site-meta.json",
15
16
  "scripts/postinstall.js"
16
17
  ],
@@ -19,14 +20,15 @@
19
20
  "tsc": "tsc",
20
21
  "dev": "tsx src/index.ts",
21
22
  "typecheck": "tsc --noEmit",
23
+ "test": "node --import tsx --test test/*.test.ts",
22
24
  "build:4px:test": "SITE=4px ENV=test npm run build",
23
25
  "build:4px:pre": "SITE=4px ENV=pre npm run build",
24
26
  "build:cainiao:test": "SITE=cainiao ENV=test npm run build",
25
27
  "build:cainiao:pre": "SITE=cainiao ENV=pre npm run build",
26
- "dev:4px:test": "SITE=4px ENV=test npm run build && node scripts/postinstall.js",
27
- "dev:4px:pre": "SITE=4px ENV=pre npm run build && node scripts/postinstall.js",
28
- "dev:cainiao:test": "SITE=cainiao ENV=test npm run build && node scripts/postinstall.js",
29
- "dev:cainiao:pre": "SITE=cainiao ENV=pre npm run build && node scripts/postinstall.js",
28
+ "dev:4px:test": "SITE=4px ENV=test npm run build && node dist/index.js skill install",
29
+ "dev:4px:pre": "SITE=4px ENV=pre npm run build && node dist/index.js skill install",
30
+ "dev:cainiao:test": "SITE=cainiao ENV=test npm run build && node dist/index.js skill install",
31
+ "dev:cainiao:pre": "SITE=cainiao ENV=pre npm run build && node dist/index.js skill install",
30
32
  "release": "npm run build && node scripts/publish.js",
31
33
  "release:4px": "SITE=4px ENV=prod npm run release",
32
34
  "release:cainiao": "SITE=cainiao ENV=prod npm run release",