@ngocsangairvds/vsaf 5.0.2 → 5.1.1
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/package.json +1 -1
- package/packages/cli/dist/adapters/antigravity.d.ts.map +1 -1
- package/packages/cli/dist/adapters/antigravity.js +69 -27
- package/packages/cli/dist/adapters/antigravity.js.map +1 -1
- package/packages/cli/dist/install/orchestrator.d.ts +8 -0
- package/packages/cli/dist/install/orchestrator.d.ts.map +1 -1
- package/packages/cli/dist/install/orchestrator.js +55 -8
- package/packages/cli/dist/install/orchestrator.js.map +1 -1
- package/packages/core/dist/skills/skill-loader.d.ts.map +1 -1
- package/packages/core/dist/skills/skill-loader.js +5 -3
- package/packages/core/dist/skills/skill-loader.js.map +1 -1
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"antigravity.d.ts","sourceRoot":"","sources":["../../src/adapters/antigravity.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"antigravity.d.ts","sourceRoot":"","sources":["../../src/adapters/antigravity.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,KAAK,eAAe,EAAwD,MAAM,cAAc,CAAC;AAG1G,4DAA4D;AAC5D,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,eAAO,MAAM,kBAAkB,EAAE,eAmHhC,CAAC"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// packages/cli/src/adapters/antigravity.ts
|
|
3
|
-
// Antigravity (Google `agy`) adapter. Antigravity
|
|
4
|
-
//
|
|
5
|
-
// ~/.gemini/antigravity/mcp_config.json
|
|
6
|
-
// absolute paths). Each VSAF skill becomes a /name workflow.
|
|
3
|
+
// Antigravity (Google `agy`) adapter. Antigravity natively discovers skills in
|
|
4
|
+
// .agents/skills/ and slash commands (workflows) in .agents/workflows/. MCP is
|
|
5
|
+
// written to the GLOBAL file ~/.gemini/antigravity/mcp_config.json.
|
|
7
6
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
8
7
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
9
8
|
};
|
|
@@ -13,7 +12,7 @@ exports.antigravityMcpPath = antigravityMcpPath;
|
|
|
13
12
|
const fs_1 = require("fs");
|
|
14
13
|
const path_1 = require("path");
|
|
15
14
|
const os_1 = require("os");
|
|
16
|
-
const
|
|
15
|
+
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
17
16
|
const adapter_js_1 = require("./adapter.js");
|
|
18
17
|
const shared_js_1 = require("./shared.js");
|
|
19
18
|
/** Global Antigravity MCP config path (home-level only). */
|
|
@@ -33,38 +32,81 @@ exports.antigravityAdapter = {
|
|
|
33
32
|
install(ctx) {
|
|
34
33
|
const result = (0, adapter_js_1.emptyResult)('antigravity');
|
|
35
34
|
const agentsDir = (0, path_1.join)(ctx.projectPath, '.agents');
|
|
35
|
+
const skillsDir = (0, path_1.join)(agentsDir, 'skills');
|
|
36
36
|
const workflowsDir = (0, path_1.join)(agentsDir, 'workflows');
|
|
37
37
|
const rulesDir = (0, path_1.join)(agentsDir, 'rules');
|
|
38
38
|
(0, fs_1.mkdirSync)(workflowsDir, { recursive: true });
|
|
39
39
|
(0, fs_1.mkdirSync)(rulesDir, { recursive: true });
|
|
40
|
-
// 1.
|
|
40
|
+
// 1. Deploy Skills → .agents/skills/ (Antigravity natively discovers skills here).
|
|
41
|
+
const deploy = (0, shared_js_1.deploySkills)(ctx.packDir, ctx.packName, ctx.deployedSkillNames, skillsDir, { force: ctx.options.force });
|
|
42
|
+
if (ctx.packInfo.bundledNames.length > 0) {
|
|
43
|
+
const bundled = (0, shared_js_1.deploySkills)(ctx.packDir, ctx.packName, ctx.packInfo.bundledNames, skillsDir, { force: ctx.options.force, noPrefix: true });
|
|
44
|
+
deploy.deployed.push(...bundled.deployed);
|
|
45
|
+
deploy.skipped.push(...bundled.skipped);
|
|
46
|
+
}
|
|
47
|
+
// Deploy _shared/ helper folder if pack has it
|
|
48
|
+
const sharedSrc = (0, path_1.join)(ctx.packDir, '_shared');
|
|
49
|
+
if ((0, fs_1.existsSync)(sharedSrc)) {
|
|
50
|
+
const sharedTarget = (0, path_1.join)(skillsDir, '_shared', ctx.packName);
|
|
51
|
+
if ((0, fs_1.existsSync)(sharedTarget)) {
|
|
52
|
+
(0, fs_1.rmSync)(sharedTarget, { recursive: true, force: true });
|
|
53
|
+
}
|
|
54
|
+
(0, fs_1.mkdirSync)((0, path_1.join)(skillsDir, '_shared'), { recursive: true });
|
|
55
|
+
(0, fs_1.cpSync)(sharedSrc, sharedTarget, { recursive: true });
|
|
56
|
+
deploy.deployed.push(`_shared/${ctx.packName}`);
|
|
57
|
+
}
|
|
58
|
+
result.skills = deploy;
|
|
59
|
+
// 2. Workflows (Slash Commands) → .agents/workflows/<name>.md
|
|
41
60
|
const workflowNames = [];
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
61
|
+
if (ctx.packInfo.workflows && Object.keys(ctx.packInfo.workflows).length > 0) {
|
|
62
|
+
for (const [filename, yamlContent] of Object.entries(ctx.packInfo.workflows)) {
|
|
63
|
+
const wfName = (0, path_1.basename)(filename, '.yaml');
|
|
64
|
+
let desc = `Run the VSAF ${wfName} workflow`;
|
|
65
|
+
try {
|
|
66
|
+
const parsed = js_yaml_1.default.load(yamlContent);
|
|
67
|
+
if (parsed?.description)
|
|
68
|
+
desc = parsed.description;
|
|
69
|
+
}
|
|
70
|
+
catch { /* use fallback description */ }
|
|
71
|
+
const wfTarget = (0, path_1.join)(workflowsDir, `${wfName}.md`);
|
|
72
|
+
if (!(0, fs_1.existsSync)(wfTarget) || ctx.options.force) {
|
|
73
|
+
const wfBody = `---\ndescription: ${desc}\n---\n\n`
|
|
74
|
+
+ `# /${wfName} — VSAF Workflow\n\n`
|
|
75
|
+
+ `You are invoked via the \`/${wfName}\` slash command to execute the VSAF workflow \`${ctx.packName}/${wfName}\`.\n\n`
|
|
76
|
+
+ `## Execution Steps\n\n`
|
|
77
|
+
+ `1. **Start Workflow**:\n`
|
|
78
|
+
+ ` Call \`mcp_vsaf_vsaf_start\`:\n`
|
|
79
|
+
+ ` - \`workflow\`: \`"${ctx.packName}/${wfName}"\`\n`
|
|
80
|
+
+ ` - \`args\`: \`$ARGUMENTS\`\n`
|
|
81
|
+
+ ` - \`projectPath\`: \`"${ctx.projectPath}"\`\n\n`
|
|
82
|
+
+ `2. **Execute AI Nodes**:\n`
|
|
83
|
+
+ ` For each returned node:\n`
|
|
84
|
+
+ ` - Read \`.vsaf/commands/<node.command>.md\` and \`.vsaf/skills/<node.command>/SKILL.md\`\n`
|
|
85
|
+
+ ` - Execute node requirements completely\n\n`
|
|
86
|
+
+ `3. **Advance Workflow**:\n`
|
|
87
|
+
+ ` Call \`mcp_vsaf_vsaf_next\`:\n`
|
|
88
|
+
+ ` - \`runId\`: \`<runId>\`\n`
|
|
89
|
+
+ ` - \`results\`: \`[{ nodeId: "<id>", output: "<output>" }]\`\n\n`
|
|
90
|
+
+ `4. **Finish**:\n`
|
|
91
|
+
+ ` Repeat until \`done: true\`. Verify with \`mcp_vsaf_vsaf_status\`.\n`;
|
|
92
|
+
(0, fs_1.writeFileSync)(wfTarget, wfBody, 'utf-8');
|
|
93
|
+
}
|
|
94
|
+
workflowNames.push(wfName);
|
|
95
|
+
}
|
|
55
96
|
}
|
|
56
97
|
result.commands = workflowNames;
|
|
57
|
-
//
|
|
58
|
-
const ruleBody = `---\nname: vsaf-${ctx.packName}\ndescription: VSAF ${ctx.packName} workflows for Antigravity\n---\n\n`
|
|
59
|
-
+ `# VSAF ${ctx.packName}\n\
|
|
60
|
-
+ workflowNames.map(w => `- \`/${w}\``).join('\n') + '\n'
|
|
98
|
+
// 3. Rules summary listing the workflows and skills.
|
|
99
|
+
const ruleBody = `---\nname: vsaf-${ctx.packName}\ndescription: VSAF ${ctx.packName} workflows and skills for Antigravity\n---\n\n`
|
|
100
|
+
+ `# VSAF ${ctx.packName}\n\n`
|
|
101
|
+
+ (workflowNames.length > 0 ? `Workflows (invoke with \`/name\`):\n` + workflowNames.map(w => `- \`/${w}\``).join('\n') + '\n\n' : '')
|
|
102
|
+
+ `Skills: Loaded from \`.agents/skills/\`.\n`;
|
|
61
103
|
(0, fs_1.writeFileSync)((0, path_1.join)(rulesDir, `vsaf-${ctx.packName}.md`), ruleBody, 'utf-8');
|
|
62
|
-
//
|
|
104
|
+
// 4. MCP → GLOBAL ~/.gemini/antigravity/mcp_config.json (absolute bin via getGitnexusMcpEntry).
|
|
63
105
|
const home = ctx.options._homeDir ?? (0, os_1.homedir)();
|
|
64
106
|
result.mcp = (0, shared_js_1.writeJsonMcp)(antigravityMcpPath(home), { vsaf: (0, shared_js_1.getVsafMcpEntry)(), gitnexus: (0, shared_js_1.getGitnexusMcpEntry)() });
|
|
65
|
-
//
|
|
66
|
-
(0, shared_js_1.writeMarkerFile)((0, path_1.join)(ctx.projectPath, 'AGENTS.md'), `pack=${ctx.packName} ide=antigravity`, `## VSAF \`${ctx.packName}\` (Antigravity)\n\nWorkflows: \`.agents/workflows/\` (\`/name\`) · Rules: \`.agents/rules/\` · MCP: \`~/.gemini/antigravity/mcp_config.json\` (vsaf + gitnexus, global).`);
|
|
67
|
-
//
|
|
107
|
+
// 5. Instruction marker block in AGENTS.md.
|
|
108
|
+
(0, shared_js_1.writeMarkerFile)((0, path_1.join)(ctx.projectPath, 'AGENTS.md'), `pack=${ctx.packName} ide=antigravity`, `## VSAF \`${ctx.packName}\` (Antigravity)\n\nWorkflows: \`.agents/workflows/\` (\`/name\`) · Skills: \`.agents/skills/\` · Rules: \`.agents/rules/\` · MCP: \`~/.gemini/antigravity/mcp_config.json\` (vsaf + gitnexus, global).`);
|
|
109
|
+
// 6. Binaries.
|
|
68
110
|
if (!ctx.options._skipGraphify && !(0, shared_js_1.installGraphifyPlatform)('antigravity')) {
|
|
69
111
|
result.warnings.push('graphify antigravity install failed — run: graphify install --platform antigravity');
|
|
70
112
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"antigravity.js","sourceRoot":"","sources":["../../src/adapters/antigravity.ts"],"names":[],"mappings":";AAAA,2CAA2C;AAC3C
|
|
1
|
+
{"version":3,"file":"antigravity.js","sourceRoot":"","sources":["../../src/adapters/antigravity.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,14 @@ export interface MultiInstallResult {
|
|
|
7
7
|
results: AdapterResult[];
|
|
8
8
|
}
|
|
9
9
|
export declare function runMultiIdeInstall(pack: string, projectPath: string, options: MultiInstallOptions): MultiInstallResult;
|
|
10
|
+
/**
|
|
11
|
+
* Replace an IDE's verbatim skill-dir copies with symlinks into the canonical
|
|
12
|
+
* `.vsaf/skills/<name>` so there is a single source of truth on disk. Posix
|
|
13
|
+
* only — on Windows the copies are left in place (symlinks need privilege and
|
|
14
|
+
* the engine reads `.vsaf/skills` as primary regardless, so correctness holds).
|
|
15
|
+
* Best-effort: any failure leaves the existing copy untouched.
|
|
16
|
+
*/
|
|
17
|
+
export declare function linkIdeSkillsToCanonical(projectPath: string, ideSkillsRelDir: string): void;
|
|
10
18
|
/** True if any IDE hit a hard error — lets the CLI set a non-zero exit code. */
|
|
11
19
|
export declare function hasHardError(result: MultiInstallResult): boolean;
|
|
12
20
|
//# sourceMappingURL=orchestrator.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/install/orchestrator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/install/orchestrator.ts"],"names":[],"mappings":"AAQA,OAAO,EAAyB,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAE5F,OAAO,EAAE,KAAK,KAAK,EAAuB,KAAK,aAAa,EAAe,MAAM,wBAAwB,CAAC;AAI1G,MAAM,WAAW,mBAAoB,SAAQ,sBAAsB;IACjE,IAAI,EAAE,KAAK,EAAE,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,aAAa,EAAE,CAAC;CAC1B;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,mBAAmB,GAC3B,kBAAkB,CAyEpB;AAgBD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI,CAmB3F;AAED,gFAAgF;AAChF,wBAAgB,YAAY,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAEhE"}
|
|
@@ -5,7 +5,10 @@
|
|
|
5
5
|
// summary. The Claude path delegates to execInstall (unchanged) for 0-regression.
|
|
6
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
7
|
exports.runMultiIdeInstall = runMultiIdeInstall;
|
|
8
|
+
exports.linkIdeSkillsToCanonical = linkIdeSkillsToCanonical;
|
|
8
9
|
exports.hasHardError = hasHardError;
|
|
10
|
+
const fs_1 = require("fs");
|
|
11
|
+
const path_1 = require("path");
|
|
9
12
|
const skill_js_1 = require("../commands/skill.js");
|
|
10
13
|
const install_js_1 = require("../commands/install.js");
|
|
11
14
|
const registry_js_1 = require("../adapters/registry.js");
|
|
@@ -52,15 +55,28 @@ function runMultiIdeInstall(pack, projectPath, options) {
|
|
|
52
55
|
const merged = (0, config_js_1.mergeConfig)(base, { ides: okIdes, packs: [pack], vsafVersion: (0, version_js_1.getVersion)() });
|
|
53
56
|
(0, config_js_1.writeConfig)(projectPath, merged);
|
|
54
57
|
}
|
|
55
|
-
//
|
|
56
|
-
//
|
|
57
|
-
//
|
|
58
|
-
|
|
59
|
-
// on antigravity/cursor/codex too.
|
|
60
|
-
if (okIdes.length > 0 && !okIdes.includes('claude')) {
|
|
58
|
+
// Canonical run-harness substrate: .vsaf/skills (the single source the engine
|
|
59
|
+
// reads, primary) + .vsaf/{commands,workflows}. Deployed for EVERY install so
|
|
60
|
+
// the harness (vsaf_start) is IDE-agnostic and never depends on an IDE dir.
|
|
61
|
+
if (okIdes.length > 0) {
|
|
61
62
|
try {
|
|
62
63
|
const sub = (0, install_js_1.deployEngineSubstrate)(pack, projectPath, options);
|
|
63
64
|
console.log(` ✓ vsaf run-harness substrate: ${sub.skillsDeployed.length} skills, ${sub.workflowsCreated.length} workflows -> .vsaf/`);
|
|
65
|
+
// Thin IDE views: replace verbatim skill-dir copies with symlinks into the
|
|
66
|
+
// canonical .vsaf/skills (posix only — Windows keeps copies; the engine
|
|
67
|
+
// reads .vsaf/skills primary either way). Antigravity renders workflows
|
|
68
|
+
// and deploys skills to .agents/skills.
|
|
69
|
+
const VERBATIM_SKILL_DIRS = {
|
|
70
|
+
claude: '.claude/skills',
|
|
71
|
+
cursor: '.cursor/skills',
|
|
72
|
+
codex: '.agents/skills',
|
|
73
|
+
antigravity: '.agents/skills',
|
|
74
|
+
};
|
|
75
|
+
for (const ide of okIdes) {
|
|
76
|
+
const rel = VERBATIM_SKILL_DIRS[ide];
|
|
77
|
+
if (rel)
|
|
78
|
+
linkIdeSkillsToCanonical(projectPath, rel);
|
|
79
|
+
}
|
|
64
80
|
}
|
|
65
81
|
catch (err) {
|
|
66
82
|
console.warn(` ⚠ engine substrate deploy failed: ${err.message}`);
|
|
@@ -73,9 +89,8 @@ function printSummary(results) {
|
|
|
73
89
|
console.log('\n[vsaf] Multi-IDE install summary:');
|
|
74
90
|
for (const r of results) {
|
|
75
91
|
const mark = r.errors.length > 0 ? '✗' : r.warnings.length > 0 ? '⚠' : '✓';
|
|
76
|
-
// Antigravity deploys workflows (no skills); avoid the misleading "0 skills" (F3b).
|
|
77
92
|
const units = r.ide === 'antigravity'
|
|
78
|
-
? `${r.commands.length} workflows`
|
|
93
|
+
? `${r.skills.deployed.length} skills, ${r.commands.length} workflows`
|
|
79
94
|
: `${r.skills.deployed.length} skills, ${r.commands.length} commands`;
|
|
80
95
|
console.log(` ${mark} ${r.ide}: ${units}` +
|
|
81
96
|
(r.mcp ? `, MCP[${r.mcp.servers.join('+')}]` : '') +
|
|
@@ -83,6 +98,38 @@ function printSummary(results) {
|
|
|
83
98
|
(r.errors.length ? ` — error: ${r.errors.join('; ')}` : ''));
|
|
84
99
|
}
|
|
85
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Replace an IDE's verbatim skill-dir copies with symlinks into the canonical
|
|
103
|
+
* `.vsaf/skills/<name>` so there is a single source of truth on disk. Posix
|
|
104
|
+
* only — on Windows the copies are left in place (symlinks need privilege and
|
|
105
|
+
* the engine reads `.vsaf/skills` as primary regardless, so correctness holds).
|
|
106
|
+
* Best-effort: any failure leaves the existing copy untouched.
|
|
107
|
+
*/
|
|
108
|
+
function linkIdeSkillsToCanonical(projectPath, ideSkillsRelDir) {
|
|
109
|
+
if (process.platform === 'win32')
|
|
110
|
+
return;
|
|
111
|
+
const canonicalBase = (0, path_1.join)(projectPath, '.vsaf', 'skills');
|
|
112
|
+
const ideBase = (0, path_1.join)(projectPath, ideSkillsRelDir);
|
|
113
|
+
if (!(0, fs_1.existsSync)(canonicalBase) || !(0, fs_1.existsSync)(ideBase))
|
|
114
|
+
return;
|
|
115
|
+
for (const name of (0, fs_1.readdirSync)(canonicalBase)) {
|
|
116
|
+
const canonical = (0, path_1.join)(canonicalBase, name);
|
|
117
|
+
const ideDir = (0, path_1.join)(ideBase, name);
|
|
118
|
+
if (!(0, fs_1.existsSync)((0, path_1.join)(canonical, 'SKILL.md')))
|
|
119
|
+
continue; // only real skills
|
|
120
|
+
if (!(0, fs_1.existsSync)(ideDir))
|
|
121
|
+
continue; // IDE didn't deploy this one
|
|
122
|
+
try {
|
|
123
|
+
if ((0, fs_1.lstatSync)(ideDir).isSymbolicLink())
|
|
124
|
+
continue; // already linked
|
|
125
|
+
(0, fs_1.rmSync)(ideDir, { recursive: true, force: true });
|
|
126
|
+
(0, fs_1.symlinkSync)(canonical, ideDir, 'dir');
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
/* leave the copy — engine still resolves via .vsaf/skills primary */
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
86
133
|
/** True if any IDE hit a hard error — lets the CLI set a non-zero exit code. */
|
|
87
134
|
function hasHardError(result) {
|
|
88
135
|
return result.results.some(r => r.errors.length > 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/install/orchestrator.ts"],"names":[],"mappings":";AAAA,2CAA2C;AAC3C,6EAA6E;AAC7E,gFAAgF;AAChF,kFAAkF;;
|
|
1
|
+
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/install/orchestrator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-loader.d.ts","sourceRoot":"","sources":["../../src/skills/skill-loader.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK,
|
|
1
|
+
{"version":3,"file":"skill-loader.d.ts","sourceRoot":"","sources":["../../src/skills/skill-loader.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,KAAK,CA+BlE"}
|
|
@@ -12,9 +12,11 @@ function loadSkill(name, projectPath) {
|
|
|
12
12
|
if (name.includes('..')) {
|
|
13
13
|
throw new Error(`Invalid skill name: "${name}" — path traversal blocked`);
|
|
14
14
|
}
|
|
15
|
-
// Primary: .
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
// Primary: .vsaf/skills/ (canonical harness source, IDE-agnostic).
|
|
16
|
+
// Fallback: .claude/skills/ (back-compat with pre-5.1 installs that deployed
|
|
17
|
+
// skills only under the Claude dir).
|
|
18
|
+
const primaryDir = (0, path_1.join)(projectPath, '.vsaf', 'skills', name);
|
|
19
|
+
const fallbackDir = (0, path_1.join)(projectPath, '.claude', 'skills', name);
|
|
18
20
|
const skillDir = (0, fs_1.existsSync)((0, path_1.join)(primaryDir, 'SKILL.md')) ? primaryDir
|
|
19
21
|
: (0, fs_1.existsSync)((0, path_1.join)(fallbackDir, 'SKILL.md')) ? fallbackDir
|
|
20
22
|
: null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../src/skills/skill-loader.ts"],"names":[],"mappings":";;;;;AAaA,
|
|
1
|
+
{"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../src/skills/skill-loader.ts"],"names":[],"mappings":";;;;;AAaA,8BA+BC;AA5CD,2CAA2C;AAC3C,2BAA8C;AAC9C,+BAA0C;AAC1C,8DAAiC;AAUjC,SAAgB,SAAS,CAAC,IAAY,EAAE,WAAmB;IACzD,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,4BAA4B,CAAC,CAAC;IAC5E,CAAC;IACD,mEAAmE;IACnE,6EAA6E;IAC7E,qCAAqC;IACrC,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IACjE,MAAM,QAAQ,GAAG,IAAA,eAAU,EAAC,IAAA,WAAI,EAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU;QACpE,CAAC,CAAC,IAAA,eAAU,EAAC,IAAA,WAAI,EAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW;YACzD,CAAC,CAAC,IAAI,CAAC;IAET,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,kBAAkB,IAAA,WAAI,EAAC,UAAU,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,SAAS,GAAG,IAAA,WAAI,EAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAE7C,MAAM,GAAG,GAAG,IAAA,iBAAY,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAA,qBAAM,EAAC,GAAG,CAAC,CAAC;IAEtC,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;IAE/D,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;QACvB,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,EAAE;QACnC,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,IAAI,EAAE,YAAY;KACnB,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,OAAe,EAAE,QAAgB;IACxD,OAAO,OAAO,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,MAAM,EAAE,YAAoB,EAAE,EAAE;QAC9E,MAAM,QAAQ,GAAG,IAAA,WAAI,EAAC,QAAQ,EAAE,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,IAAA,cAAO,EAAC,QAAQ,CAAC,CAAC;QACnC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAA,cAAO,EAAC,QAAQ,CAAC,GAAG,UAAG,CAAC,EAAE,CAAC;YAClD,MAAM,IAAI,KAAK,CAAC,2BAA2B,YAAY,2BAA2B,CAAC,CAAC;QACtF,CAAC;QACD,IAAI,CAAC,IAAA,eAAU,EAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,4BAA4B,YAAY,iBAAiB,QAAQ,GAAG,CAAC,CAAC;QACxF,CAAC;QACD,OAAO,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IACnD,CAAC,CAAC,CAAC;AACL,CAAC"}
|