vskill 1.0.15 → 1.0.18
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 +84 -9
- package/agents.json +3 -1
- package/dist/agents/agents-registry.d.ts +69 -3
- package/dist/agents/agents-registry.js +203 -0
- package/dist/agents/agents-registry.js.map +1 -1
- package/dist/api/client.d.ts +85 -0
- package/dist/api/client.js +193 -24
- package/dist/api/client.js.map +1 -1
- package/dist/commands/add-lockfile.d.ts +6 -0
- package/dist/commands/add-lockfile.js +10 -0
- package/dist/commands/add-lockfile.js.map +1 -1
- package/dist/commands/add.d.ts +7 -0
- package/dist/commands/add.js +110 -2
- package/dist/commands/add.js.map +1 -1
- package/dist/commands/auth.d.ts +23 -0
- package/dist/commands/auth.js +105 -11
- package/dist/commands/auth.js.map +1 -1
- package/dist/commands/eval/serve.d.ts +2 -0
- package/dist/commands/eval/serve.js +126 -4
- package/dist/commands/eval/serve.js.map +1 -1
- package/dist/commands/orgs.d.ts +21 -0
- package/dist/commands/orgs.js +164 -0
- package/dist/commands/orgs.js.map +1 -0
- package/dist/commands/skill.js +14 -1
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/whoami.d.ts +29 -0
- package/dist/commands/whoami.js +119 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/discovery/github-tree.d.ts +23 -3
- package/dist/discovery/github-tree.js +172 -24
- package/dist/discovery/github-tree.js.map +1 -1
- package/dist/eval/anthropic-catalog.js +32 -2
- package/dist/eval/anthropic-catalog.js.map +1 -1
- package/dist/eval/batch-judge.js +1 -0
- package/dist/eval/batch-judge.js.map +1 -1
- package/dist/eval/llm.d.ts +1 -1
- package/dist/eval/llm.js +104 -2
- package/dist/eval/llm.js.map +1 -1
- package/dist/eval-server/__tests__/helpers/studio-token-test-helpers.d.ts +2 -0
- package/dist/eval-server/__tests__/helpers/studio-token-test-helpers.js +20 -0
- package/dist/eval-server/__tests__/helpers/studio-token-test-helpers.js.map +1 -0
- package/dist/eval-server/active-tenant-routes.d.ts +15 -0
- package/dist/eval-server/active-tenant-routes.js +101 -0
- package/dist/eval-server/active-tenant-routes.js.map +1 -0
- package/dist/eval-server/api-routes.js +206 -6
- package/dist/eval-server/api-routes.js.map +1 -1
- package/dist/eval-server/desktop-open-routes.d.ts +8 -0
- package/dist/eval-server/desktop-open-routes.js +64 -0
- package/dist/eval-server/desktop-open-routes.js.map +1 -0
- package/dist/eval-server/eval-server.js +90 -6
- package/dist/eval-server/eval-server.js.map +1 -1
- package/dist/eval-server/export-skill-routes.d.ts +9 -0
- package/dist/eval-server/export-skill-routes.js +81 -0
- package/dist/eval-server/export-skill-routes.js.map +1 -0
- package/dist/eval-server/git-routes.d.ts +1 -0
- package/dist/eval-server/git-routes.js +101 -4
- package/dist/eval-server/git-routes.js.map +1 -1
- package/dist/eval-server/install-engine-routes.d.ts +3 -16
- package/dist/eval-server/install-engine-routes.js +9 -124
- package/dist/eval-server/install-engine-routes.js.map +1 -1
- package/dist/eval-server/install-jobs.d.ts +41 -0
- package/dist/eval-server/install-jobs.js +161 -0
- package/dist/eval-server/install-jobs.js.map +1 -0
- package/dist/eval-server/install-skill-routes.d.ts +74 -11
- package/dist/eval-server/install-skill-routes.js +506 -79
- package/dist/eval-server/install-skill-routes.js.map +1 -1
- package/dist/eval-server/install-state-routes.d.ts +25 -0
- package/dist/eval-server/install-state-routes.js +125 -0
- package/dist/eval-server/install-state-routes.js.map +1 -0
- package/dist/eval-server/oauth-github-routes.d.ts +2 -0
- package/dist/eval-server/oauth-github-routes.js +505 -0
- package/dist/eval-server/oauth-github-routes.js.map +1 -0
- package/dist/eval-server/platform-proxy.d.ts +17 -1
- package/dist/eval-server/platform-proxy.js +125 -13
- package/dist/eval-server/platform-proxy.js.map +1 -1
- package/dist/eval-server/plugin-cli-routes.js +9 -9
- package/dist/eval-server/plugin-cli-routes.js.map +1 -1
- package/dist/eval-server/remove-skill-routes.d.ts +18 -0
- package/dist/eval-server/remove-skill-routes.js +145 -0
- package/dist/eval-server/remove-skill-routes.js.map +1 -0
- package/dist/eval-server/router.d.ts +17 -3
- package/dist/eval-server/router.js +166 -9
- package/dist/eval-server/router.js.map +1 -1
- package/dist/eval-server/settings-store.js +1 -1
- package/dist/eval-server/settings-store.js.map +1 -1
- package/dist/eval-server/supported-agents-routes.d.ts +6 -0
- package/dist/eval-server/supported-agents-routes.js +41 -0
- package/dist/eval-server/supported-agents-routes.js.map +1 -0
- package/dist/eval-server/utils/spawn-env.d.ts +1 -0
- package/dist/eval-server/utils/spawn-env.js +47 -0
- package/dist/eval-server/utils/spawn-env.js.map +1 -0
- package/dist/eval-ui/assets/AdvancedTab-D8zbE5fH.js +1 -0
- package/dist/eval-ui/assets/{CreateSkillPage-BmbvQEzE.js → CreateSkillPage-DOBhKdgr.js} +5 -5
- package/dist/eval-ui/assets/FindSkillsPalette-CyMmNPr-.js +2 -0
- package/dist/eval-ui/assets/GeneralTab-DYR9NWC4.js +1 -0
- package/dist/eval-ui/assets/PrivacyTab-CXIqQokl.js +1 -0
- package/dist/eval-ui/assets/SearchPaletteCore-Dn5gQJS_.js +14 -0
- package/dist/eval-ui/assets/SkillDetailPanel-DTrRnyyJ.js +1 -0
- package/dist/eval-ui/assets/UpdateDropdown-Cvr2fe0z.js +1 -0
- package/dist/eval-ui/assets/UpdatesTab-DwJIUDPX.js +1 -0
- package/dist/eval-ui/assets/core-DZAvsxlC.js +1 -0
- package/dist/eval-ui/assets/event-CDYWU2X3.js +1 -0
- package/dist/eval-ui/assets/globals-BRZwPAPF.js +49 -0
- package/dist/eval-ui/assets/globals-C3oEdsJh.css +1 -0
- package/dist/eval-ui/assets/index-D7M0Jdss.js +1 -0
- package/dist/eval-ui/assets/lifecycle-DSleOV-l.js +1 -0
- package/dist/eval-ui/assets/lifecycle-d1Sm9Hts.css +1 -0
- package/dist/eval-ui/assets/main-D2shn1dH.js +87 -0
- package/dist/eval-ui/assets/preferences-BHZXB5dL.css +1 -0
- package/dist/eval-ui/assets/preferences-BKv6X7fK.js +2 -0
- package/dist/eval-ui/assets/useDesktopBridge-DxVWbYqK.js +2 -0
- package/dist/eval-ui/index.html +4 -2
- package/dist/eval-ui/lifecycle.html +33 -0
- package/dist/eval-ui/preferences.html +34 -0
- package/dist/index.js +47 -1
- package/dist/index.js.map +1 -1
- package/dist/installer/bundle-files.d.ts +4 -0
- package/dist/installer/bundle-files.js +97 -0
- package/dist/installer/bundle-files.js.map +1 -0
- package/dist/installer/canonical.d.ts +31 -6
- package/dist/installer/canonical.js +50 -23
- package/dist/installer/canonical.js.map +1 -1
- package/dist/installer/clipboard-export.d.ts +19 -0
- package/dist/installer/clipboard-export.js +88 -0
- package/dist/installer/clipboard-export.js.map +1 -0
- package/dist/installer/frontmatter.js +1 -1
- package/dist/installer/frontmatter.js.map +1 -1
- package/dist/installer/multi-install.d.ts +43 -0
- package/dist/installer/multi-install.js +237 -0
- package/dist/installer/multi-install.js.map +1 -0
- package/dist/installer/transformers/aider.d.ts +2 -0
- package/dist/installer/transformers/aider.js +32 -0
- package/dist/installer/transformers/aider.js.map +1 -0
- package/dist/installer/transformers/continue-dev.d.ts +2 -0
- package/dist/installer/transformers/continue-dev.js +6 -0
- package/dist/installer/transformers/continue-dev.js.map +1 -0
- package/dist/installer/transformers/cursor.d.ts +2 -0
- package/dist/installer/transformers/cursor.js +24 -0
- package/dist/installer/transformers/cursor.js.map +1 -0
- package/dist/installer/transformers/github-copilot.d.ts +2 -0
- package/dist/installer/transformers/github-copilot.js +17 -0
- package/dist/installer/transformers/github-copilot.js.map +1 -0
- package/dist/installer/transformers/index.d.ts +78 -0
- package/dist/installer/transformers/index.js +13 -0
- package/dist/installer/transformers/index.js.map +1 -0
- package/dist/installer/transformers/junie.d.ts +2 -0
- package/dist/installer/transformers/junie.js +6 -0
- package/dist/installer/transformers/junie.js.map +1 -0
- package/dist/installer/transformers/kiro.d.ts +2 -0
- package/dist/installer/transformers/kiro.js +6 -0
- package/dist/installer/transformers/kiro.js.map +1 -0
- package/dist/installer/transformers/trae.d.ts +2 -0
- package/dist/installer/transformers/trae.js +6 -0
- package/dist/installer/transformers/trae.js.map +1 -0
- package/dist/installer/transformers/windsurf.d.ts +2 -0
- package/dist/installer/transformers/windsurf.js +12 -0
- package/dist/installer/transformers/windsurf.js.map +1 -0
- package/dist/installer/yaml-safe-mutate.d.ts +19 -0
- package/dist/installer/yaml-safe-mutate.js +184 -0
- package/dist/installer/yaml-safe-mutate.js.map +1 -0
- package/dist/lib/active-tenant.d.ts +36 -0
- package/dist/lib/active-tenant.js +120 -0
- package/dist/lib/active-tenant.js.map +1 -0
- package/dist/lib/github-fetch.d.ts +1 -0
- package/dist/lib/github-fetch.js +11 -1
- package/dist/lib/github-fetch.js.map +1 -1
- package/dist/lib/keychain.d.ts +15 -2
- package/dist/lib/keychain.js +156 -8
- package/dist/lib/keychain.js.map +1 -1
- package/dist/lib/migration/keychain-migration.d.ts +35 -0
- package/dist/lib/migration/keychain-migration.js +189 -0
- package/dist/lib/migration/keychain-migration.js.map +1 -0
- package/dist/lib/tenant-resolver.d.ts +38 -0
- package/dist/lib/tenant-resolver.js +79 -0
- package/dist/lib/tenant-resolver.js.map +1 -0
- package/dist/lockfile/types.d.ts +8 -0
- package/dist/sidecar/eval-ui-manifest.json +1 -0
- package/dist/sidecar/sea-config.json +57 -0
- package/dist/sidecar/sea-prep.blob +0 -0
- package/dist/sidecar/server.cjs +141627 -0
- package/dist/sidecar/vskill-version.txt +1 -0
- package/dist/studio/lib/ops-log.js +140 -57
- package/dist/studio/lib/ops-log.js.map +1 -1
- package/dist/studio/lib/provenance.js +3 -2
- package/dist/studio/lib/provenance.js.map +1 -1
- package/dist/studio/lib/query.d.ts +1 -0
- package/dist/studio/lib/query.js +7 -0
- package/dist/studio/lib/query.js.map +1 -0
- package/dist/studio/lib/scope-transfer.d.ts +16 -0
- package/dist/studio/lib/scope-transfer.js +52 -25
- package/dist/studio/lib/scope-transfer.js.map +1 -1
- package/dist/studio/routes/index.js +13 -1
- package/dist/studio/routes/index.js.map +1 -1
- package/dist/studio/routes/ops.js +31 -9
- package/dist/studio/routes/ops.js.map +1 -1
- package/dist/studio/routes/promote.js +16 -11
- package/dist/studio/routes/promote.js.map +1 -1
- package/dist/studio/routes/revert.js +14 -18
- package/dist/studio/routes/revert.js.map +1 -1
- package/dist/studio/routes/test-install.js +14 -11
- package/dist/studio/routes/test-install.js.map +1 -1
- package/dist/studio-runtime/lockfile.d.ts +51 -0
- package/dist/studio-runtime/lockfile.js +216 -0
- package/dist/studio-runtime/lockfile.js.map +1 -0
- package/dist/updater/source-fetcher.js +2 -2
- package/dist/updater/source-fetcher.js.map +1 -1
- package/dist/utils/skill-builder-detection.d.ts +14 -1
- package/dist/utils/skill-builder-detection.js +20 -8
- package/dist/utils/skill-builder-detection.js.map +1 -1
- package/dist/utils/skill-creator-detection.d.ts +10 -2
- package/dist/utils/skill-creator-detection.js +12 -43
- package/dist/utils/skill-creator-detection.js.map +1 -1
- package/package.json +17 -1
- package/dist/eval-ui/assets/FindSkillsPalette-D0Zjhm31.js +0 -2
- package/dist/eval-ui/assets/SearchPaletteCore-EhcN1xEa.js +0 -14
- package/dist/eval-ui/assets/SkillDetailPanel-B5J60ffv.js +0 -1
- package/dist/eval-ui/assets/UpdateDropdown-Celf0_Cr.js +0 -1
- package/dist/eval-ui/assets/index-BV7k6fdk.js +0 -124
- package/dist/eval-ui/assets/index-CKLqBL52.css +0 -1
- package/dist/eval-ui/assets/skill-studio-logo-CRyKgIrg.png +0 -0
|
@@ -1,18 +1,24 @@
|
|
|
1
1
|
import type { AgentDefinition } from "../agents/agents-registry.js";
|
|
2
|
-
/**
|
|
3
|
-
* Filter agents by target-agents frontmatter.
|
|
4
|
-
* When targetAgents is undefined or empty, returns all agents (existing behavior).
|
|
5
|
-
* When targetAgents is specified, returns only agents whose IDs are in the list.
|
|
6
|
-
*/
|
|
7
|
-
export declare function filterAgentsByTargetAgents(agents: AgentDefinition[], targetAgents: string[] | undefined): AgentDefinition[];
|
|
8
2
|
export interface InstallOptions {
|
|
9
3
|
global: boolean;
|
|
10
4
|
projectRoot: string;
|
|
11
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* 0845 T-002 (AC-US3-03): per-agent env-var overrides for global skills dirs.
|
|
8
|
+
*
|
|
9
|
+
* Only Antigravity is wired today (`VSKILL_ANTIGRAVITY_SKILLS_DIR`); the table
|
|
10
|
+
* structure is reusable when future agents need an analogous escape hatch.
|
|
11
|
+
* Returns null when no override applies so callers fall back to the
|
|
12
|
+
* registry-declared `globalSkillsDir`.
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveGlobalSkillsDirEnvOverride(agent: AgentDefinition): string | null;
|
|
12
15
|
/**
|
|
13
16
|
* Resolve the skills directory for an agent given the install scope.
|
|
14
17
|
*
|
|
15
18
|
* Global: uses agent.globalSkillsDir (e.g. ~/.claude/skills)
|
|
19
|
+
* Honors per-agent env-var overrides via
|
|
20
|
+
* `resolveGlobalSkillsDirEnvOverride()` — currently
|
|
21
|
+
* `VSKILL_ANTIGRAVITY_SKILLS_DIR` for Antigravity.
|
|
16
22
|
* Local: uses projectRoot + agent.localSkillsDir (e.g. ./project/.claude/skills)
|
|
17
23
|
*/
|
|
18
24
|
export declare function resolveAgentSkillsDir(agent: AgentDefinition, opts: InstallOptions): string;
|
|
@@ -36,3 +42,22 @@ export declare function installSymlink(skillName: string, content: string, agent
|
|
|
36
42
|
* Optional agentFiles: additional files (e.g., agents/*.md) to install alongside SKILL.md.
|
|
37
43
|
*/
|
|
38
44
|
export declare function installCopy(skillName: string, content: string, agents: AgentDefinition[], opts: InstallOptions, agentFiles?: Record<string, string>): string[];
|
|
45
|
+
/**
|
|
46
|
+
* 0845 T-012/T-014: Resolve the Tier-2 INSTALL ROOT for an agent —
|
|
47
|
+
* the parent of `localSkillsDir` / `globalSkillsDir`. Tier-2 transformers
|
|
48
|
+
* emit relative paths that include their own subfolder layout (e.g.
|
|
49
|
+
* `rules/<name>.mdc` for Cursor), so the dispatcher joins those onto
|
|
50
|
+
* this root rather than onto the skills dir itself.
|
|
51
|
+
*
|
|
52
|
+
* Win32 (T-014, AC-US4-12): when `process.platform === "win32"` and the
|
|
53
|
+
* agent declares `win32PathOverride`, that path is the install root
|
|
54
|
+
* directly (no parent traversal). On POSIX hosts the override is ignored
|
|
55
|
+
* — agents continue to honor `globalSkillsDir`'s tilde-expanded form.
|
|
56
|
+
*
|
|
57
|
+
* Project-scope (`global: false`) keeps the existing path-traversal
|
|
58
|
+
* guard via `resolveAgentSkillsDir` so projects can't escape via a
|
|
59
|
+
* crafted `localSkillsDir`. The returned root for project-scope is the
|
|
60
|
+
* parent of the resolved skills dir, with the same traversal protection
|
|
61
|
+
* already in force.
|
|
62
|
+
*/
|
|
63
|
+
export declare function resolveAgentInstallRoot(agent: AgentDefinition, opts: InstallOptions): string;
|
|
@@ -3,37 +3,40 @@ import { mkdirSync, writeFileSync, symlinkSync, lstatSync, rmSync } from "node:f
|
|
|
3
3
|
// path-traversal guard. `path.relative` handles Windows backslash correctly.
|
|
4
4
|
import { join, relative, dirname, sep as pathSep } from "node:path";
|
|
5
5
|
import os from "node:os";
|
|
6
|
+
import { resolveTilde } from "../utils/paths.js";
|
|
6
7
|
import { ensureFrontmatter, stripClaudeFields } from "./frontmatter.js";
|
|
8
|
+
import { resolveBundleTarget } from "./bundle-files.js";
|
|
7
9
|
/**
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
return agents;
|
|
15
|
-
const targetSet = new Set(targetAgents);
|
|
16
|
-
return agents.filter((a) => targetSet.has(a.id));
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Resolve tilde in a path to the user's home directory.
|
|
10
|
+
* 0845 T-002 (AC-US3-03): per-agent env-var overrides for global skills dirs.
|
|
11
|
+
*
|
|
12
|
+
* Only Antigravity is wired today (`VSKILL_ANTIGRAVITY_SKILLS_DIR`); the table
|
|
13
|
+
* structure is reusable when future agents need an analogous escape hatch.
|
|
14
|
+
* Returns null when no override applies so callers fall back to the
|
|
15
|
+
* registry-declared `globalSkillsDir`.
|
|
20
16
|
*/
|
|
21
|
-
function
|
|
22
|
-
if (
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
17
|
+
export function resolveGlobalSkillsDirEnvOverride(agent) {
|
|
18
|
+
if (agent.id === "antigravity") {
|
|
19
|
+
const override = process.env.VSKILL_ANTIGRAVITY_SKILLS_DIR;
|
|
20
|
+
if (override && override.trim().length > 0)
|
|
21
|
+
return override.trim();
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
27
24
|
}
|
|
28
25
|
/**
|
|
29
26
|
* Resolve the skills directory for an agent given the install scope.
|
|
30
27
|
*
|
|
31
28
|
* Global: uses agent.globalSkillsDir (e.g. ~/.claude/skills)
|
|
29
|
+
* Honors per-agent env-var overrides via
|
|
30
|
+
* `resolveGlobalSkillsDirEnvOverride()` — currently
|
|
31
|
+
* `VSKILL_ANTIGRAVITY_SKILLS_DIR` for Antigravity.
|
|
32
32
|
* Local: uses projectRoot + agent.localSkillsDir (e.g. ./project/.claude/skills)
|
|
33
33
|
*/
|
|
34
34
|
export function resolveAgentSkillsDir(agent, opts) {
|
|
35
35
|
if (opts.global) {
|
|
36
|
-
|
|
36
|
+
const override = resolveGlobalSkillsDirEnvOverride(agent);
|
|
37
|
+
if (override)
|
|
38
|
+
return override;
|
|
39
|
+
return resolveTilde(agent.globalSkillsDir);
|
|
37
40
|
}
|
|
38
41
|
const resolved = join(opts.projectRoot, agent.localSkillsDir);
|
|
39
42
|
const normalizedRoot = join(opts.projectRoot, ".");
|
|
@@ -114,11 +117,8 @@ const COPY_FALLBACK_AGENTS = new Set(["claude-code"]);
|
|
|
114
117
|
* Keys are relative paths (e.g., "agents/frontend.md"), values are file contents.
|
|
115
118
|
*/
|
|
116
119
|
function writeAgentFiles(targetDir, agentFiles) {
|
|
117
|
-
const resolvedTarget = join(targetDir, "."); // normalize
|
|
118
120
|
for (const [relPath, fileContent] of Object.entries(agentFiles)) {
|
|
119
|
-
const fullPath =
|
|
120
|
-
if (!fullPath.startsWith(resolvedTarget))
|
|
121
|
-
continue; // path traversal guard
|
|
121
|
+
const fullPath = resolveBundleTarget(targetDir, relPath);
|
|
122
122
|
mkdirSync(dirname(fullPath), { recursive: true });
|
|
123
123
|
writeFileSync(fullPath, fileContent);
|
|
124
124
|
}
|
|
@@ -198,4 +198,31 @@ export function installCopy(skillName, content, agents, opts, agentFiles) {
|
|
|
198
198
|
}
|
|
199
199
|
return installed;
|
|
200
200
|
}
|
|
201
|
+
/**
|
|
202
|
+
* 0845 T-012/T-014: Resolve the Tier-2 INSTALL ROOT for an agent —
|
|
203
|
+
* the parent of `localSkillsDir` / `globalSkillsDir`. Tier-2 transformers
|
|
204
|
+
* emit relative paths that include their own subfolder layout (e.g.
|
|
205
|
+
* `rules/<name>.mdc` for Cursor), so the dispatcher joins those onto
|
|
206
|
+
* this root rather than onto the skills dir itself.
|
|
207
|
+
*
|
|
208
|
+
* Win32 (T-014, AC-US4-12): when `process.platform === "win32"` and the
|
|
209
|
+
* agent declares `win32PathOverride`, that path is the install root
|
|
210
|
+
* directly (no parent traversal). On POSIX hosts the override is ignored
|
|
211
|
+
* — agents continue to honor `globalSkillsDir`'s tilde-expanded form.
|
|
212
|
+
*
|
|
213
|
+
* Project-scope (`global: false`) keeps the existing path-traversal
|
|
214
|
+
* guard via `resolveAgentSkillsDir` so projects can't escape via a
|
|
215
|
+
* crafted `localSkillsDir`. The returned root for project-scope is the
|
|
216
|
+
* parent of the resolved skills dir, with the same traversal protection
|
|
217
|
+
* already in force.
|
|
218
|
+
*/
|
|
219
|
+
export function resolveAgentInstallRoot(agent, opts) {
|
|
220
|
+
if (opts.global && process.platform === "win32" && agent.win32PathOverride) {
|
|
221
|
+
return agent.win32PathOverride;
|
|
222
|
+
}
|
|
223
|
+
// Reuse `resolveAgentSkillsDir` so env overrides + project-traversal
|
|
224
|
+
// guards stay in one place. Then climb one level to the install root.
|
|
225
|
+
const skillsDir = resolveAgentSkillsDir(agent, opts);
|
|
226
|
+
return dirname(skillsDir);
|
|
227
|
+
}
|
|
201
228
|
//# sourceMappingURL=canonical.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/installer/canonical.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACnF,uEAAuE;AACvE,6EAA6E;AAC7E,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEzB,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/installer/canonical.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ParsedSkill } from "./transformers/index.js";
|
|
2
|
+
export interface ClipboardBlob {
|
|
3
|
+
/** The text the user will paste into the cloud tool. */
|
|
4
|
+
blob: string;
|
|
5
|
+
/** URL of the tool's docs page explaining where to paste. */
|
|
6
|
+
pasteInstructionsUrl: string;
|
|
7
|
+
/** Optional landing page for the tool itself. */
|
|
8
|
+
docsUrl?: string;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Build a clipboard-ready blob for a Tier-3 agent.
|
|
12
|
+
*
|
|
13
|
+
* The blob is a self-contained text payload: skill name, description, and
|
|
14
|
+
* full body separated by horizontal rules. ChatGPT-style cloud tools all
|
|
15
|
+
* accept arbitrary markdown into their custom-instruction boxes, so the
|
|
16
|
+
* same shape works for all current Tier-3 destinations. If a future
|
|
17
|
+
* destination needs a different shape, branch on `agentId` here.
|
|
18
|
+
*/
|
|
19
|
+
export declare function buildClipboardBlob(skill: ParsedSkill, agentId: string): ClipboardBlob;
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// 0845 T-015 — Clipboard export for Tier-3 agents (ChatGPT, v0, bolt.new).
|
|
2
|
+
//
|
|
3
|
+
// Returns a paste-ready text blob without writing to disk. The Studio
|
|
4
|
+
// renders the blob in `ClipboardExportDialog` and lets the user trigger
|
|
5
|
+
// `navigator.clipboard.writeText` from a click handler (user gesture
|
|
6
|
+
// required, per AC-US5-05).
|
|
7
|
+
//
|
|
8
|
+
// Tier 1/2 agents and unknown ids throw — the caller should already have
|
|
9
|
+
// dispatched to the canonical or transformer path for those.
|
|
10
|
+
import { getAgent } from "../agents/agents-registry.js";
|
|
11
|
+
import { sanitizeSkillBundleFiles } from "./bundle-files.js";
|
|
12
|
+
/**
|
|
13
|
+
* Build a clipboard-ready blob for a Tier-3 agent.
|
|
14
|
+
*
|
|
15
|
+
* The blob is a self-contained text payload: skill name, description, and
|
|
16
|
+
* full body separated by horizontal rules. ChatGPT-style cloud tools all
|
|
17
|
+
* accept arbitrary markdown into their custom-instruction boxes, so the
|
|
18
|
+
* same shape works for all current Tier-3 destinations. If a future
|
|
19
|
+
* destination needs a different shape, branch on `agentId` here.
|
|
20
|
+
*/
|
|
21
|
+
export function buildClipboardBlob(skill, agentId) {
|
|
22
|
+
const agent = getAgent(agentId);
|
|
23
|
+
if (!agent) {
|
|
24
|
+
throw new Error(`Unknown agentId: ${agentId}`);
|
|
25
|
+
}
|
|
26
|
+
if (agent.installMode !== "clipboard") {
|
|
27
|
+
throw new Error(`Agent "${agentId}" is not a Tier-3 clipboard target (installMode=${agent.installMode ?? "filesystem"})`);
|
|
28
|
+
}
|
|
29
|
+
const blob = renderClipboardSkillBlob(skill);
|
|
30
|
+
const result = {
|
|
31
|
+
blob,
|
|
32
|
+
pasteInstructionsUrl: agent.pasteInstructionsUrl ?? "",
|
|
33
|
+
};
|
|
34
|
+
if (agent.docsUrl)
|
|
35
|
+
result.docsUrl = agent.docsUrl;
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
function renderClipboardSkillBlob(skill) {
|
|
39
|
+
const sections = [
|
|
40
|
+
`# ${skill.name}`,
|
|
41
|
+
skill.description,
|
|
42
|
+
"---",
|
|
43
|
+
skill.body.trimEnd(),
|
|
44
|
+
];
|
|
45
|
+
if (skill.originalFrontmatter.trim().length > 0) {
|
|
46
|
+
sections.push("## Skill frontmatter", fenceBlock("yaml", skill.originalFrontmatter.trimEnd()));
|
|
47
|
+
}
|
|
48
|
+
const bundleFiles = sanitizeSkillBundleFiles(skill.files);
|
|
49
|
+
const openAiMetadata = bundleFiles["agents/openai.yaml"];
|
|
50
|
+
if (openAiMetadata !== undefined) {
|
|
51
|
+
sections.push("## OpenAI agent metadata (`agents/openai.yaml`)", fenceBlock("yaml", openAiMetadata.trimEnd()));
|
|
52
|
+
}
|
|
53
|
+
const resourceEntries = Object.entries(bundleFiles)
|
|
54
|
+
.filter(([path]) => path !== "agents/openai.yaml")
|
|
55
|
+
.sort(([a], [b]) => a.localeCompare(b));
|
|
56
|
+
if (resourceEntries.length > 0) {
|
|
57
|
+
sections.push("## Bundled resources");
|
|
58
|
+
for (const [path, content] of resourceEntries) {
|
|
59
|
+
sections.push(`### ${path}`, fenceBlock(languageForPath(path), content.trimEnd()));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return sections.filter((section) => section.length > 0).join("\n\n") + "\n";
|
|
63
|
+
}
|
|
64
|
+
function fenceBlock(language, content) {
|
|
65
|
+
const tickRuns = content.match(/`{3,}/g) ?? [];
|
|
66
|
+
const fenceLength = Math.max(3, ...tickRuns.map((ticks) => ticks.length + 1));
|
|
67
|
+
const fence = "`".repeat(fenceLength);
|
|
68
|
+
return `${fence}${language}\n${content}\n${fence}`;
|
|
69
|
+
}
|
|
70
|
+
function languageForPath(path) {
|
|
71
|
+
if (path.endsWith(".md"))
|
|
72
|
+
return "markdown";
|
|
73
|
+
if (path.endsWith(".yaml") || path.endsWith(".yml"))
|
|
74
|
+
return "yaml";
|
|
75
|
+
if (path.endsWith(".json"))
|
|
76
|
+
return "json";
|
|
77
|
+
if (path.endsWith(".mjs") || path.endsWith(".js") || path.endsWith(".ts")) {
|
|
78
|
+
return "javascript";
|
|
79
|
+
}
|
|
80
|
+
if (path.endsWith(".py"))
|
|
81
|
+
return "python";
|
|
82
|
+
if (path.endsWith(".svg") || path.endsWith(".xml"))
|
|
83
|
+
return "xml";
|
|
84
|
+
if (path.endsWith(".sh"))
|
|
85
|
+
return "bash";
|
|
86
|
+
return "text";
|
|
87
|
+
}
|
|
88
|
+
//# sourceMappingURL=clipboard-export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clipboard-export.js","sourceRoot":"","sources":["../../src/installer/clipboard-export.ts"],"names":[],"mappings":"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"}
|
|
@@ -244,7 +244,7 @@ export function stripClaudeFields(content, skillName) {
|
|
|
244
244
|
let fmBlock = normalized.substring(3, endIdx);
|
|
245
245
|
const body = normalized.substring(endIdx + 3);
|
|
246
246
|
for (const pattern of CLAUDE_FIELD_PATTERNS) {
|
|
247
|
-
fmBlock = fmBlock.replace(
|
|
247
|
+
fmBlock = fmBlock.replace(pattern, "");
|
|
248
248
|
}
|
|
249
249
|
// Collapse consecutive blank lines left by field removal
|
|
250
250
|
fmBlock = fmBlock.replace(/\n{3,}/g, "\n\n");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/installer/frontmatter.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/installer/frontmatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { AGENTS_REGISTRY } from "../agents/agents-registry.js";
|
|
2
|
+
import type { ParsedSkill } from "./transformers/index.js";
|
|
3
|
+
export type AgentInstallStatus = "installed" | "exported" | "skipped" | "error";
|
|
4
|
+
export interface AgentInstallResult {
|
|
5
|
+
agentId: string;
|
|
6
|
+
status: AgentInstallStatus;
|
|
7
|
+
/** Installed: absolute path of the written file (or comma list when many).
|
|
8
|
+
* Exported: human-readable label including any downgrade warning.
|
|
9
|
+
* Skipped: reason.
|
|
10
|
+
* Error: error message. */
|
|
11
|
+
detail: string;
|
|
12
|
+
/** Tier 3 only: the blob to be copied to clipboard. */
|
|
13
|
+
blob?: string;
|
|
14
|
+
/** Tier 3 only: paste-instructions URL. */
|
|
15
|
+
pasteInstructionsUrl?: string;
|
|
16
|
+
/** Tier 3 only: docs URL. */
|
|
17
|
+
docsUrl?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface MultiInstallResult {
|
|
20
|
+
skill: string;
|
|
21
|
+
scope: "project" | "user";
|
|
22
|
+
agents: AgentInstallResult[];
|
|
23
|
+
installedCount: number;
|
|
24
|
+
exportedCount: number;
|
|
25
|
+
errorCount: number;
|
|
26
|
+
}
|
|
27
|
+
export interface MultiInstallOptions {
|
|
28
|
+
skill: ParsedSkill;
|
|
29
|
+
agentIds: string[];
|
|
30
|
+
scope: "project" | "user";
|
|
31
|
+
/** Project root for project-scoped installs and for Tier-1 canonical writes. */
|
|
32
|
+
projectRoot: string;
|
|
33
|
+
/** Optional pre-rendered SKILL.md content. When omitted, the multi-install
|
|
34
|
+
* reconstructs it from the parsedSkill (frontmatter + body). */
|
|
35
|
+
rawSkillContent?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Install a skill to multiple agents in a single pass. Returns one result
|
|
39
|
+
* row per agent in the same order as `agentIds`. Never throws — each
|
|
40
|
+
* agent's outcome is captured in its own result row.
|
|
41
|
+
*/
|
|
42
|
+
export declare function installSkillToMultipleAgents(opts: MultiInstallOptions): Promise<MultiInstallResult>;
|
|
43
|
+
export { AGENTS_REGISTRY };
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
// 0845 T-011/T-016 — installSkillToMultipleAgents.
|
|
2
|
+
//
|
|
3
|
+
// Sequential per-agent dispatcher. Per-agent try/catch isolation so one
|
|
4
|
+
// agent's failure (transformer throw, path-traversal attempt, unknown id)
|
|
5
|
+
// does NOT abort the others (AC-US4-10).
|
|
6
|
+
//
|
|
7
|
+
// Dispatch matrix:
|
|
8
|
+
// Tier 1 (installMode: "filesystem", no formatTransformer)
|
|
9
|
+
// → installSymlink() / installCopy() via canonical.ts (zero behavior change)
|
|
10
|
+
// Tier 2 (installMode: "filesystem", formatTransformer set)
|
|
11
|
+
// → run transformer, write each TransformedFile under resolveAgentInstallRoot,
|
|
12
|
+
// with path.relative() guard against traversal (AC-US4-11)
|
|
13
|
+
// → op:"append-yaml-list" goes through safeAppendYamlList per ADR-0845-03
|
|
14
|
+
// Tier 3 (installMode: "clipboard")
|
|
15
|
+
// → buildClipboardBlob — no disk write (AC-US5-07)
|
|
16
|
+
// → scope: "project" + Tier 3 → graceful downgrade, status "exported" with
|
|
17
|
+
// warning in detail (T-016, AC-US5-06)
|
|
18
|
+
//
|
|
19
|
+
// FR-002: sequential. The slowest write is ~fs.writeFile (microseconds),
|
|
20
|
+
// so even 12 agents stays well under the 200ms-per-agent latency budget.
|
|
21
|
+
import { mkdirSync, writeFileSync } from "node:fs";
|
|
22
|
+
import { join, dirname, relative, sep as pathSep, isAbsolute } from "node:path";
|
|
23
|
+
import os from "node:os";
|
|
24
|
+
import { AGENTS_REGISTRY, getAgent, } from "../agents/agents-registry.js";
|
|
25
|
+
import { installSymlink, resolveAgentInstallRoot, } from "./canonical.js";
|
|
26
|
+
import { buildClipboardBlob } from "./clipboard-export.js";
|
|
27
|
+
import { safeAppendYamlList } from "./yaml-safe-mutate.js";
|
|
28
|
+
import { sanitizeSkillBundleFiles } from "./bundle-files.js";
|
|
29
|
+
/**
|
|
30
|
+
* Install a skill to multiple agents in a single pass. Returns one result
|
|
31
|
+
* row per agent in the same order as `agentIds`. Never throws — each
|
|
32
|
+
* agent's outcome is captured in its own result row.
|
|
33
|
+
*/
|
|
34
|
+
export async function installSkillToMultipleAgents(opts) {
|
|
35
|
+
const { skill, agentIds, scope, projectRoot } = opts;
|
|
36
|
+
const results = [];
|
|
37
|
+
for (const agentId of agentIds) {
|
|
38
|
+
try {
|
|
39
|
+
const agent = getAgent(agentId);
|
|
40
|
+
if (!agent) {
|
|
41
|
+
results.push({
|
|
42
|
+
agentId,
|
|
43
|
+
status: "error",
|
|
44
|
+
detail: `unknown agent: ${agentId}`,
|
|
45
|
+
});
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (agent.installMode === "clipboard") {
|
|
49
|
+
results.push(dispatchTier3(agent, skill, scope));
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
if (agent.formatTransformer) {
|
|
53
|
+
results.push(dispatchTier2(agent, skill, scope, projectRoot));
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
// Tier 1 — canonical drop-in install.
|
|
57
|
+
results.push(dispatchTier1(agent, skill, scope, projectRoot, opts.rawSkillContent));
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
// Defensive catch-all — every dispatch path already wraps its own
|
|
61
|
+
// errors, but if anything escapes, the multi-install loop must keep
|
|
62
|
+
// going so other agents still get processed.
|
|
63
|
+
results.push({
|
|
64
|
+
agentId,
|
|
65
|
+
status: "error",
|
|
66
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const installedCount = results.filter((r) => r.status === "installed").length;
|
|
71
|
+
const exportedCount = results.filter((r) => r.status === "exported").length;
|
|
72
|
+
const errorCount = results.filter((r) => r.status === "error").length;
|
|
73
|
+
return {
|
|
74
|
+
skill: skill.name,
|
|
75
|
+
scope,
|
|
76
|
+
agents: results,
|
|
77
|
+
installedCount,
|
|
78
|
+
exportedCount,
|
|
79
|
+
errorCount,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
// Tier 1 — canonical drop-in via installSymlink
|
|
84
|
+
// ---------------------------------------------------------------------------
|
|
85
|
+
function dispatchTier1(agent, skill, scope, projectRoot, rawContent) {
|
|
86
|
+
const installOpts = {
|
|
87
|
+
global: scope === "user",
|
|
88
|
+
projectRoot,
|
|
89
|
+
};
|
|
90
|
+
const content = rawContent ?? reconstructSkillMd(skill);
|
|
91
|
+
const bundleFiles = sanitizeSkillBundleFiles(skill.files);
|
|
92
|
+
const writtenPaths = installSymlink(skill.name, content, [agent], installOpts, bundleFiles);
|
|
93
|
+
return {
|
|
94
|
+
agentId: agent.id,
|
|
95
|
+
status: "installed",
|
|
96
|
+
detail: writtenPaths.join(", "),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
// ---------------------------------------------------------------------------
|
|
100
|
+
// Tier 2 — transformer + filesystem write
|
|
101
|
+
// ---------------------------------------------------------------------------
|
|
102
|
+
function dispatchTier2(agent, skill, scope, projectRoot) {
|
|
103
|
+
if (!agent.formatTransformer) {
|
|
104
|
+
return {
|
|
105
|
+
agentId: agent.id,
|
|
106
|
+
status: "error",
|
|
107
|
+
detail: "internal: tier 2 dispatch without formatTransformer",
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
const installOpts = {
|
|
111
|
+
global: scope === "user",
|
|
112
|
+
projectRoot,
|
|
113
|
+
};
|
|
114
|
+
const installRoot = resolveAgentInstallRoot(agent, installOpts);
|
|
115
|
+
let files;
|
|
116
|
+
try {
|
|
117
|
+
files = [
|
|
118
|
+
...agent.formatTransformer(skill),
|
|
119
|
+
...buildTier2BundleFiles(skill),
|
|
120
|
+
];
|
|
121
|
+
}
|
|
122
|
+
catch (err) {
|
|
123
|
+
return {
|
|
124
|
+
agentId: agent.id,
|
|
125
|
+
status: "error",
|
|
126
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
const writtenPaths = [];
|
|
130
|
+
try {
|
|
131
|
+
for (const file of files) {
|
|
132
|
+
// Join with POSIX-style separator awareness — transformers always
|
|
133
|
+
// emit forward slashes, Node's path.join handles win32.
|
|
134
|
+
const joined = join(installRoot, ...file.relativePath.split("/"));
|
|
135
|
+
// op:"append-yaml-list" is the only sanctioned escape from the
|
|
136
|
+
// install root — Aider's ~/.aider.conf.yml lives at $HOME, not
|
|
137
|
+
// inside ~/.aider. Still bound by HOME (or projectRoot for project
|
|
138
|
+
// scope) so the dispatcher cannot be tricked into writing outside
|
|
139
|
+
// the user's filesystem boundary.
|
|
140
|
+
if (file.op === "append-yaml-list") {
|
|
141
|
+
const boundary = scope === "user" ? os.homedir() : projectRoot;
|
|
142
|
+
assertNoTraversal(boundary, joined);
|
|
143
|
+
const key = file.yamlListKey ?? "";
|
|
144
|
+
// Keep the value verbatim — Aider expects the literal `~/path` in
|
|
145
|
+
// its conf.yml so the file is portable across machines. The tilde
|
|
146
|
+
// resolution happens inside Aider itself at load time.
|
|
147
|
+
const value = file.yamlListValue ?? "";
|
|
148
|
+
if (!key || !value) {
|
|
149
|
+
return {
|
|
150
|
+
agentId: agent.id,
|
|
151
|
+
status: "error",
|
|
152
|
+
detail: "internal: append-yaml-list missing key or value",
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
mkdirSync(dirname(joined), { recursive: true });
|
|
156
|
+
const r = safeAppendYamlList(joined, key, value);
|
|
157
|
+
writtenPaths.push(`${joined} (${r.status})`);
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
assertNoTraversal(installRoot, joined);
|
|
161
|
+
mkdirSync(dirname(joined), { recursive: true });
|
|
162
|
+
writeFileSync(joined, file.content, { mode: file.mode });
|
|
163
|
+
writtenPaths.push(joined);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
catch (err) {
|
|
168
|
+
return {
|
|
169
|
+
agentId: agent.id,
|
|
170
|
+
status: "error",
|
|
171
|
+
detail: err instanceof Error ? err.message : String(err),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
agentId: agent.id,
|
|
176
|
+
status: "installed",
|
|
177
|
+
detail: writtenPaths.join(", "),
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
// Tier 3 — clipboard export (no disk write)
|
|
182
|
+
// ---------------------------------------------------------------------------
|
|
183
|
+
function dispatchTier3(agent, skill, scope) {
|
|
184
|
+
const blob = buildClipboardBlob(skill, agent.id);
|
|
185
|
+
const detailParts = ["clipboard blob ready"];
|
|
186
|
+
if (scope === "project") {
|
|
187
|
+
detailParts.push(`${agent.displayName} does not support project-scoped skills; exported as user-scope blob.`);
|
|
188
|
+
}
|
|
189
|
+
const result = {
|
|
190
|
+
agentId: agent.id,
|
|
191
|
+
status: "exported",
|
|
192
|
+
detail: detailParts.join(" — "),
|
|
193
|
+
blob: blob.blob,
|
|
194
|
+
pasteInstructionsUrl: blob.pasteInstructionsUrl,
|
|
195
|
+
};
|
|
196
|
+
if (blob.docsUrl)
|
|
197
|
+
result.docsUrl = blob.docsUrl;
|
|
198
|
+
return result;
|
|
199
|
+
}
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
// Helpers
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
function assertNoTraversal(root, target) {
|
|
204
|
+
// Both paths are absolute (or both relative). path.relative returns
|
|
205
|
+
// a path that starts with ".." iff target escapes root. Matches the
|
|
206
|
+
// pre-existing guard at canonical.ts:54-58.
|
|
207
|
+
if (!isAbsolute(target)) {
|
|
208
|
+
throw new Error(`internal: install target must be absolute (got ${target})`);
|
|
209
|
+
}
|
|
210
|
+
const rel = relative(root, target);
|
|
211
|
+
if (rel === ".." || rel.startsWith(".." + pathSep) || rel.startsWith("../")) {
|
|
212
|
+
throw new Error(`Path traversal detected: ${target} escapes install root ${root}`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
function reconstructSkillMd(skill) {
|
|
216
|
+
// installSymlink expects the raw SKILL.md text — frontmatter + body.
|
|
217
|
+
// The parsedSkill carries `originalFrontmatter`; if absent, fabricate
|
|
218
|
+
// a minimal name+description block so installSymlink's
|
|
219
|
+
// `ensureFrontmatter` has something to work with.
|
|
220
|
+
const fm = skill.originalFrontmatter.trim().length > 0
|
|
221
|
+
? skill.originalFrontmatter
|
|
222
|
+
: `name: ${skill.name}\ndescription: ${skill.description}`;
|
|
223
|
+
return `---\n${fm}\n---\n\n${skill.body}`;
|
|
224
|
+
}
|
|
225
|
+
function buildTier2BundleFiles(skill) {
|
|
226
|
+
const bundleFiles = sanitizeSkillBundleFiles(skill.files);
|
|
227
|
+
return Object.entries(bundleFiles)
|
|
228
|
+
.sort(([a], [b]) => a.localeCompare(b))
|
|
229
|
+
.map(([relativePath, content]) => ({
|
|
230
|
+
relativePath: `skills/${skill.name}/${relativePath}`,
|
|
231
|
+
content,
|
|
232
|
+
}));
|
|
233
|
+
}
|
|
234
|
+
// Re-export for ergonomic test access. Not strictly needed but lets
|
|
235
|
+
// integration tests import the same registry the dispatcher sees.
|
|
236
|
+
export { AGENTS_REGISTRY };
|
|
237
|
+
//# sourceMappingURL=multi-install.js.map
|