vskill 1.2.3 → 1.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +49 -1
  2. package/agents.json +6 -1
  3. package/dist/agents/agents-registry.d.ts +43 -16
  4. package/dist/agents/agents-registry.js +119 -33
  5. package/dist/agents/agents-registry.js.map +1 -1
  6. package/dist/agents/global-dirs.d.ts +19 -0
  7. package/dist/agents/global-dirs.js +53 -0
  8. package/dist/agents/global-dirs.js.map +1 -0
  9. package/dist/commands/add-github-bundle.d.ts +29 -0
  10. package/dist/commands/add-github-bundle.js +135 -0
  11. package/dist/commands/add-github-bundle.js.map +1 -0
  12. package/dist/commands/add-lockfile.d.ts +2 -0
  13. package/dist/commands/add-lockfile.js +1 -1
  14. package/dist/commands/add-lockfile.js.map +1 -1
  15. package/dist/commands/add.d.ts +0 -7
  16. package/dist/commands/add.js +197 -107
  17. package/dist/commands/add.js.map +1 -1
  18. package/dist/commands/audit-webmcp.d.ts +25 -0
  19. package/dist/commands/audit-webmcp.js +167 -0
  20. package/dist/commands/audit-webmcp.js.map +1 -0
  21. package/dist/commands/doctor.d.ts +69 -0
  22. package/dist/commands/doctor.js +760 -0
  23. package/dist/commands/doctor.js.map +1 -0
  24. package/dist/commands/remove.js +43 -8
  25. package/dist/commands/remove.js.map +1 -1
  26. package/dist/commands/update.js +12 -4
  27. package/dist/commands/update.js.map +1 -1
  28. package/dist/discovery/github-skill-bundle.d.ts +74 -0
  29. package/dist/discovery/github-skill-bundle.js +323 -0
  30. package/dist/discovery/github-skill-bundle.js.map +1 -0
  31. package/dist/eval/skill-scanner.js +7 -1
  32. package/dist/eval/skill-scanner.js.map +1 -1
  33. package/dist/eval-server/install-skill-routes.js +10 -3
  34. package/dist/eval-server/install-skill-routes.js.map +1 -1
  35. package/dist/eval-server/remove-skill-routes.js +262 -29
  36. package/dist/eval-server/remove-skill-routes.js.map +1 -1
  37. package/dist/eval-server/studio-privacy.js +2 -3
  38. package/dist/eval-server/studio-privacy.js.map +1 -1
  39. package/dist/eval-server/utils/scan-install-locations.js +22 -3
  40. package/dist/eval-server/utils/scan-install-locations.js.map +1 -1
  41. package/dist/eval-ui/assets/{AdvancedTab-CSWhj_MZ.js → AdvancedTab-6VlfqCuD.js} +1 -1
  42. package/dist/eval-ui/assets/{CreateSkillPage-lecFvrLO.js → CreateSkillPage-CXDd6gDN.js} +1 -1
  43. package/dist/eval-ui/assets/{FindSkillsPalette-Dtyd7VrA.js → FindSkillsPalette-DQ6uGhFP.js} +2 -2
  44. package/dist/eval-ui/assets/{GeneralTab-Gbc-K6UI.js → GeneralTab-BpFlJ2ue.js} +1 -1
  45. package/dist/eval-ui/assets/{PrivacyTab-BXCIX8cQ.js → PrivacyTab-UfO7QLy_.js} +1 -1
  46. package/dist/eval-ui/assets/{SearchPaletteCore-CneELTjb.js → SearchPaletteCore-DpHCf0mf.js} +1 -1
  47. package/dist/eval-ui/assets/{SkillDetailPanel-BMfMN6Wy.js → SkillDetailPanel-BjHFjGxg.js} +1 -1
  48. package/dist/eval-ui/assets/{UpdateDropdown-BlAAI6ah.js → UpdateDropdown-Cn4Vsq5d.js} +1 -1
  49. package/dist/eval-ui/assets/{UpdatesTab-BFGUaUtu.js → UpdatesTab-C38-n7V3.js} +1 -1
  50. package/dist/eval-ui/assets/globals-BWCNQsMa.css +1 -0
  51. package/dist/eval-ui/assets/globals-DmzftdEG.js +49 -0
  52. package/dist/eval-ui/assets/{index-DhhmQddr.js → index-DlQYQHDO.js} +1 -1
  53. package/dist/eval-ui/assets/{lifecycle-o_IRibOa.js → lifecycle-n00yue6r.js} +1 -1
  54. package/dist/eval-ui/assets/main-BmB7Zj9I.js +86 -0
  55. package/dist/eval-ui/assets/{preferences-D2BPT0OT.js → preferences-BN-jNWS0.js} +2 -2
  56. package/dist/eval-ui/assets/{useDesktopBridge-BKz-gcRg.js → useDesktopBridge-Cm4zPght.js} +1 -1
  57. package/dist/eval-ui/index.html +4 -4
  58. package/dist/eval-ui/lifecycle.html +3 -3
  59. package/dist/eval-ui/preferences.html +4 -4
  60. package/dist/index.js +34 -0
  61. package/dist/index.js.map +1 -1
  62. package/dist/installer/bundle-files.d.ts +39 -2
  63. package/dist/installer/bundle-files.js +80 -10
  64. package/dist/installer/bundle-files.js.map +1 -1
  65. package/dist/installer/canonical.d.ts +39 -4
  66. package/dist/installer/canonical.js +178 -24
  67. package/dist/installer/canonical.js.map +1 -1
  68. package/dist/installer/multi-install.d.ts +11 -2
  69. package/dist/installer/multi-install.js +41 -9
  70. package/dist/installer/multi-install.js.map +1 -1
  71. package/dist/installer/transformers/index.d.ts +8 -0
  72. package/dist/installer/yaml-safe-mutate.js +48 -2
  73. package/dist/installer/yaml-safe-mutate.js.map +1 -1
  74. package/dist/lib/github-fetch.js +2 -0
  75. package/dist/lib/github-fetch.js.map +1 -1
  76. package/dist/lib/private-source.d.ts +8 -0
  77. package/dist/lib/private-source.js +16 -2
  78. package/dist/lib/private-source.js.map +1 -1
  79. package/dist/webmcp/args.d.ts +34 -0
  80. package/dist/webmcp/args.js +87 -0
  81. package/dist/webmcp/args.js.map +1 -0
  82. package/dist/webmcp/attribution.d.ts +38 -0
  83. package/dist/webmcp/attribution.js +141 -0
  84. package/dist/webmcp/attribution.js.map +1 -0
  85. package/dist/webmcp/enumerate.d.ts +81 -0
  86. package/dist/webmcp/enumerate.js +436 -0
  87. package/dist/webmcp/enumerate.js.map +1 -0
  88. package/dist/webmcp/format.d.ts +9 -0
  89. package/dist/webmcp/format.js +105 -0
  90. package/dist/webmcp/format.js.map +1 -0
  91. package/dist/webmcp/merge.d.ts +49 -0
  92. package/dist/webmcp/merge.js +167 -0
  93. package/dist/webmcp/merge.js.map +1 -0
  94. package/dist/webmcp/score.d.ts +70 -0
  95. package/dist/webmcp/score.js +586 -0
  96. package/dist/webmcp/score.js.map +1 -0
  97. package/dist/webmcp/types.d.ts +92 -0
  98. package/dist/webmcp/types.js +8 -0
  99. package/dist/webmcp/types.js.map +1 -0
  100. package/package.json +6 -6
  101. package/dist/eval-ui/assets/globals-Dpf9KmYH.css +0 -1
  102. package/dist/eval-ui/assets/globals-hm1COkXX.js +0 -49
  103. package/dist/eval-ui/assets/main-DRhfwCeX.js +0 -86
@@ -0,0 +1,53 @@
1
+ // ---------------------------------------------------------------------------
2
+ // 0894: one resolver for an agent's global skills dir(s).
3
+ //
4
+ // Kept apart from agents-registry.ts on purpose: many command tests mock the
5
+ // registry module wholesale, and callers (remove, add, Studio scans) need
6
+ // these helpers to keep working under those mocks. Pure: depends only on the
7
+ // agent definition, $HOME and the filesystem.
8
+ // ---------------------------------------------------------------------------
9
+ import { existsSync } from "node:fs";
10
+ /** Antigravity's legacy IDE global skills folder. */
11
+ export const ANTIGRAVITY_LEGACY_GLOBAL_DIR = "~/.gemini/antigravity/skills";
12
+ function expandHome(p) {
13
+ if (p.startsWith("~/")) {
14
+ const home = process.env.HOME || process.env.USERPROFILE || "";
15
+ return home + p.slice(1);
16
+ }
17
+ return p;
18
+ }
19
+ /**
20
+ * The global skills dir vskill installs an agent's skills into. Antigravity:
21
+ * `VSKILL_ANTIGRAVITY_SKILLS_DIR`, then the legacy IDE dir when it already
22
+ * exists, else the registry default. Every other agent: its `globalSkillsDir`.
23
+ */
24
+ export function resolveAgentGlobalSkillsDir(agent, expand = expandHome) {
25
+ if (agent.id === "antigravity") {
26
+ const override = process.env.VSKILL_ANTIGRAVITY_SKILLS_DIR;
27
+ if (override && override.trim().length > 0)
28
+ return override.trim();
29
+ const legacy = expand(ANTIGRAVITY_LEGACY_GLOBAL_DIR);
30
+ try {
31
+ if (existsSync(legacy))
32
+ return legacy;
33
+ }
34
+ catch {
35
+ // fall through to the default
36
+ }
37
+ }
38
+ return expand(agent.globalSkillsDir);
39
+ }
40
+ /**
41
+ * Every global dir vskill may have put this agent's skills in: the resolved
42
+ * dir first, then the registry default and, for Antigravity, the legacy IDE
43
+ * dir (installs went there while it existed). Used by remove, uninstall,
44
+ * Studio scans and detection so none of them miss an install. `expand`
45
+ * resolves a `~/` path (callers pass their own tilde resolver).
46
+ */
47
+ export function agentGlobalInstallDirs(agent, expand = expandHome) {
48
+ const dirs = [resolveAgentGlobalSkillsDir(agent, expand), expand(agent.globalSkillsDir)];
49
+ if (agent.id === "antigravity")
50
+ dirs.push(expand(ANTIGRAVITY_LEGACY_GLOBAL_DIR));
51
+ return [...new Set(dirs)];
52
+ }
53
+ //# sourceMappingURL=global-dirs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"global-dirs.js","sourceRoot":"","sources":["../../src/agents/global-dirs.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,0DAA0D;AAC1D,EAAE;AACF,6EAA6E;AAC7E,0EAA0E;AAC1E,6EAA6E;AAC7E,8CAA8C;AAC9C,8EAA8E;AAE9E,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrC,qDAAqD;AACrD,MAAM,CAAC,MAAM,6BAA6B,GAAG,8BAA8B,CAAC;AAI5E,SAAS,UAAU,CAAC,CAAS;IAC3B,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;QAC/D,OAAO,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,2BAA2B,CACzC,KAAgB,EAChB,SAAgC,UAAU;IAE1C,IAAI,KAAK,CAAC,EAAE,KAAK,aAAa,EAAE,CAAC;QAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;QAC3D,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,CAAC,6BAA6B,CAAC,CAAC;QACrD,IAAI,CAAC;YACH,IAAI,UAAU,CAAC,MAAM,CAAC;gBAAE,OAAO,MAAM,CAAC;QACxC,CAAC;QAAC,MAAM,CAAC;YACP,8BAA8B;QAChC,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AACvC,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAgB,EAChB,SAAgC,UAAU;IAE1C,MAAM,IAAI,GAAG,CAAC,2BAA2B,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;IACzF,IAAI,KAAK,CAAC,EAAE,KAAK,aAAa;QAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,6BAA6B,CAAC,CAAC,CAAC;IACjF,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { type FetchSkillBundleArgs, type GitHubSkillBundle } from "../discovery/github-skill-bundle.js";
2
+ export interface BundleScanReport {
3
+ /** Files that block the install without --force, with the reasons. */
4
+ critical: Array<{
5
+ path: string;
6
+ findings: string[];
7
+ }>;
8
+ /** Files with non-blocking findings. */
9
+ flagged: string[];
10
+ }
11
+ /** ELF, Mach-O (thin + fat) or PE/COFF header. */
12
+ export declare function isNativeExecutable(path: string, bytes: Uint8Array): boolean;
13
+ export declare function scanSkillBundle(files: GitHubSkillBundle["files"], executables?: readonly string[]): BundleScanReport;
14
+ export type PreparedBundle = {
15
+ ok: true;
16
+ bundle: GitHubSkillBundle;
17
+ } | {
18
+ ok: false;
19
+ verdict: "BUNDLE_ERROR" | "FAIL";
20
+ message: string;
21
+ };
22
+ /**
23
+ * Download the skill folder and scan it. A failed download, a case
24
+ * collision or a blocking finding comes back as `ok: false`; an unlistable
25
+ * or over-limit folder comes back degraded with a warning printed.
26
+ */
27
+ export declare function prepareGitHubSkillBundle(args: FetchSkillBundleArgs & {
28
+ force?: boolean;
29
+ }): Promise<PreparedBundle>;
@@ -0,0 +1,135 @@
1
+ // ---------------------------------------------------------------------------
2
+ // 0894: fetch + scan the complete folder of a GitHub skill for `vskill install`.
3
+ //
4
+ // Every bundled file goes through the same Tier-1 scanner as SKILL.md. Text
5
+ // is scanned as-is; files that are not valid UTF-8 are scanned lossily, so a
6
+ // stray NUL or 0xFF byte cannot hide `curl … | bash` from the scan.
7
+ //
8
+ // Blocking (unless --force):
9
+ // - a CRITICAL finding in any file, text or lossily decoded bytes — one
10
+ // stray 0xFF must not turn agents/x.md or a Makefile into a "binary";
11
+ // - an undecodable script-like file (mode 100755, `#!`, script extension)
12
+ // that cannot be decoded for scanning at all;
13
+ // - a native executable (ELF, Mach-O, PE, .node/.so/.dylib/.dll/.exe),
14
+ // which no static scan can vouch for.
15
+ // Lower severities are reported, not blocking: skill tooling scripts
16
+ // legitimately spawn processes and clean temp folders. Other binaries
17
+ // (fonts, audio, images) pass through.
18
+ // ---------------------------------------------------------------------------
19
+ import { fetchGitHubSkillBundle, SkillBundleError, } from "../discovery/github-skill-bundle.js";
20
+ import { runTier1Scan } from "../scanner/index.js";
21
+ import { dim, red, yellow } from "../utils/output.js";
22
+ const SCRIPT_EXTENSIONS = /\.(sh|bash|zsh|fish|ksh|py|pyw|rb|pl|php|js|mjs|cjs|ts|mts|cts|ps1|psm1|bat|cmd|vbs|lua|tcl|applescript|command)$/i;
23
+ const NATIVE_EXTENSIONS = /\.(node|so|dylib|dll|exe)$/i;
24
+ /** ELF, Mach-O (thin + fat) or PE/COFF header. */
25
+ export function isNativeExecutable(path, bytes) {
26
+ if (NATIVE_EXTENSIONS.test(path))
27
+ return true;
28
+ if (bytes.byteLength < 4)
29
+ return false;
30
+ const [a, b, c, d] = bytes;
31
+ if (a === 0x7f && b === 0x45 && c === 0x4c && d === 0x46)
32
+ return true; // \x7fELF
33
+ const be = ((a << 24) | (b << 16) | (c << 8) | d) >>> 0;
34
+ if ([0xfeedface, 0xfeedfacf, 0xcefaedfe, 0xcffaedfe, 0xcafebabe, 0xbebafeca].includes(be))
35
+ return true;
36
+ if (a === 0x4d && b === 0x5a && bytes.byteLength >= 64)
37
+ return true; // MZ
38
+ return false;
39
+ }
40
+ function looksLikeScript(path, bytes, executable) {
41
+ return executable || (bytes[0] === 0x23 && bytes[1] === 0x21) || SCRIPT_EXTENSIONS.test(path);
42
+ }
43
+ function criticalOf(text) {
44
+ return runTier1Scan(text).findings
45
+ .filter((f) => f.severity === "critical")
46
+ .map((f) => `${f.patternId} ${f.patternName} (line ${f.lineNumber})`);
47
+ }
48
+ function hasFindings(text) {
49
+ return runTier1Scan(text).findings.some((f) => f.severity !== "info");
50
+ }
51
+ export function scanSkillBundle(files, executables = []) {
52
+ const report = { critical: [], flagged: [] };
53
+ const exec = new Set(executables);
54
+ for (const [path, content] of Object.entries(files).sort(([a], [b]) => a.localeCompare(b))) {
55
+ if (typeof content === "string") {
56
+ const crit = criticalOf(content);
57
+ if (crit.length > 0)
58
+ report.critical.push({ path, findings: crit });
59
+ else if (hasFindings(content))
60
+ report.flagged.push(path);
61
+ continue;
62
+ }
63
+ if (isNativeExecutable(path, content)) {
64
+ report.critical.push({ path, findings: ["native executable: cannot be scanned"] });
65
+ continue;
66
+ }
67
+ const scriptLike = looksLikeScript(path, content, exec.has(path));
68
+ let text;
69
+ try {
70
+ // Lossy: invalid sequences become U+FFFD, NULs are dropped so they
71
+ // cannot split a pattern such as `cu\0rl | bash`.
72
+ text = new TextDecoder("utf-8").decode(content).replace(/\0/g, "");
73
+ }
74
+ catch {
75
+ if (scriptLike)
76
+ report.critical.push({ path, findings: ["script that cannot be scanned"] });
77
+ continue;
78
+ }
79
+ const crit = criticalOf(text);
80
+ if (crit.length > 0)
81
+ report.critical.push({ path, findings: crit });
82
+ else if (scriptLike && hasFindings(text))
83
+ report.flagged.push(path);
84
+ }
85
+ return report;
86
+ }
87
+ /**
88
+ * Download the skill folder and scan it. A failed download, a case
89
+ * collision or a blocking finding comes back as `ok: false`; an unlistable
90
+ * or over-limit folder comes back degraded with a warning printed.
91
+ */
92
+ export async function prepareGitHubSkillBundle(args) {
93
+ let bundle;
94
+ try {
95
+ bundle = await fetchGitHubSkillBundle(args);
96
+ }
97
+ catch (err) {
98
+ const message = err instanceof SkillBundleError
99
+ ? err.message
100
+ : `Could not fetch the skill folder: ${err instanceof Error ? err.message : String(err)}`;
101
+ return { ok: false, verdict: "BUNDLE_ERROR", message };
102
+ }
103
+ if (bundle.degraded) {
104
+ console.log(yellow(` WARNING: could not install the complete skill folder (${bundle.degraded}).\n` +
105
+ ` Installed SKILL.md and up to 100 files from its standard folders; the skill may be incomplete.`));
106
+ }
107
+ const binaries = Object.values(bundle.files).filter((v) => typeof v !== "string").length;
108
+ console.log(dim(` Skill folder: ${bundle.fileList.length} file${bundle.fileList.length === 1 ? "" : "s"}` +
109
+ (binaries > 0 ? ` (${binaries} binary)` : "") +
110
+ (bundle.executables.length > 0 ? `, ${bundle.executables.length} executable` : "")));
111
+ for (const s of bundle.skipped) {
112
+ console.log(yellow(` Not installed: ${s.path} (${s.reason})`));
113
+ }
114
+ const scan = scanSkillBundle(bundle.files, bundle.executables);
115
+ if (scan.flagged.length > 0) {
116
+ const list = scan.flagged.slice(0, 5).join(", ") + (scan.flagged.length > 5 ? ", ..." : "");
117
+ console.log(dim(` Non-blocking scan findings in ${scan.flagged.length} bundled file(s): ${list}`));
118
+ }
119
+ if (scan.critical.length > 0) {
120
+ const lines = scan.critical
121
+ .slice(0, 10)
122
+ .map((c) => ` ${c.path}: ${c.findings.slice(0, 3).join("; ")}`)
123
+ .join("\n");
124
+ if (!args.force) {
125
+ return {
126
+ ok: false,
127
+ verdict: "FAIL",
128
+ message: `Blocking findings in ${scan.critical.length} bundled file(s):\n${lines}\n Use --force to install anyway (not recommended).`,
129
+ };
130
+ }
131
+ console.log(red(` --force: installing despite blocking findings in bundled files:\n${lines}`));
132
+ }
133
+ return { ok: true, bundle };
134
+ }
135
+ //# sourceMappingURL=add-github-bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"add-github-bundle.js","sourceRoot":"","sources":["../../src/commands/add-github-bundle.ts"],"names":[],"mappings":"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"}
@@ -27,5 +27,7 @@ export interface BuildGitHubInstallLockEntryArgs {
27
27
  global: boolean;
28
28
  /** ISO timestamp; injected for deterministic tests, defaults to `now`. */
29
29
  installedAt?: string;
30
+ /** 0894: every installed file relative to the skill folder (defaults to SKILL.md). */
31
+ files?: string[];
30
32
  }
31
33
  export declare function buildGitHubInstallLockEntry(args: BuildGitHubInstallLockEntryArgs): SkillLockEntry;
@@ -6,7 +6,7 @@ export function buildGitHubInstallLockEntry(args) {
6
6
  installedAt: args.installedAt ?? new Date().toISOString(),
7
7
  source: `github:${args.owner}/${args.repo}`,
8
8
  scope: args.global ? "user" : "project",
9
- files: ["SKILL.md"],
9
+ files: args.files && args.files.length > 0 ? [...args.files] : ["SKILL.md"],
10
10
  sourceType: "github",
11
11
  sourceRepoUrl: `https://github.com/${args.owner}/${args.repo}`,
12
12
  };
@@ -1 +1 @@
1
- {"version":3,"file":"add-lockfile.js","sourceRoot":"","sources":["../../src/commands/add-lockfile.ts"],"names":[],"mappings":"AAyCA,MAAM,UAAU,2BAA2B,CACzC,IAAqC;IAErC,MAAM,KAAK,GAAmB;QAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACzD,MAAM,EAAE,UAAU,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;QAC3C,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QACvC,KAAK,EAAE,CAAC,UAAU,CAAC;QACnB,UAAU,EAAE,QAAQ;QACpB,aAAa,EAAE,sBAAsB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;KAC/D,CAAC;IACF,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;IAC/C,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;IACnC,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC;IACzC,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC;IAC3C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"add-lockfile.js","sourceRoot":"","sources":["../../src/commands/add-lockfile.ts"],"names":[],"mappings":"AA2CA,MAAM,UAAU,2BAA2B,CACzC,IAAqC;IAErC,MAAM,KAAK,GAAmB;QAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACzD,MAAM,EAAE,UAAU,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;QAC3C,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;QACvC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;QAC3E,UAAU,EAAE,QAAQ;QACpB,aAAa,EAAE,sBAAsB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE;KAC/D,CAAC;IACF,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC;IAC/C,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,KAAK,CAAC,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;IACnC,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,KAAK,CAAC,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC;IACzC,CAAC;IACD,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC;IAC3C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,11 +1,4 @@
1
1
  import type { AgentDefinition } from "../agents/agents-registry.js";
2
- /**
3
- * Subdirectories fetched alongside SKILL.md when installing a skill that lives
4
- * in a repo subdirectory. Must stay a subset of the prefixes the installer
5
- * accepts in installer/bundle-files.ts, or the write is rejected.
6
- */
7
- export declare const BUNDLE_SUBDIRS: readonly ["agents", "references", "scripts", "assets", "tests"];
8
- export declare function isBundleTextFile(name: string): boolean;
9
2
  interface MarketplaceDetectionResult {
10
3
  isMarketplace: boolean;
11
4
  manifestContent?: string;