vskill 1.0.13 → 1.0.14

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 (31) hide show
  1. package/README.md +2 -2
  2. package/agents.json +1 -1
  3. package/dist/commands/check.d.ts +55 -0
  4. package/dist/commands/check.js +279 -0
  5. package/dist/commands/check.js.map +1 -0
  6. package/dist/core/agent-prompts.d.ts +35 -0
  7. package/dist/core/agent-prompts.js +201 -0
  8. package/dist/core/agent-prompts.js.map +1 -0
  9. package/dist/core/skill-generator.d.ts +25 -3
  10. package/dist/core/skill-generator.js +131 -0
  11. package/dist/core/skill-generator.js.map +1 -1
  12. package/dist/eval-server/api-routes.d.ts +14 -0
  13. package/dist/eval-server/api-routes.js +38 -0
  14. package/dist/eval-server/api-routes.js.map +1 -1
  15. package/dist/eval-server/skill-create-routes.d.ts +8 -0
  16. package/dist/eval-server/skill-create-routes.js +96 -0
  17. package/dist/eval-server/skill-create-routes.js.map +1 -1
  18. package/dist/eval-server/utils/resolve-editor.d.ts +13 -0
  19. package/dist/eval-server/utils/resolve-editor.js +92 -0
  20. package/dist/eval-server/utils/resolve-editor.js.map +1 -0
  21. package/dist/eval-ui/assets/{CreateSkillPage-T0YWZWw-.js → CreateSkillPage-CKvqAya0.js} +1 -1
  22. package/dist/eval-ui/assets/{FindSkillsPalette-KcFM32hZ.js → FindSkillsPalette-B8pTa5NP.js} +2 -2
  23. package/dist/eval-ui/assets/{SearchPaletteCore-EhBtr4Xx.js → SearchPaletteCore-CkVRvaZk.js} +1 -1
  24. package/dist/eval-ui/assets/SkillDetailPanel-d4_LquVH.js +1 -0
  25. package/dist/eval-ui/assets/{UpdateDropdown-pjFhHTi6.js → UpdateDropdown-DA7OktXO.js} +1 -1
  26. package/dist/eval-ui/assets/{index-C3S9iHnq.js → index-DCbohW6l.js} +37 -37
  27. package/dist/eval-ui/index.html +1 -1
  28. package/dist/index.js +8 -0
  29. package/dist/index.js.map +1 -1
  30. package/package.json +1 -1
  31. package/dist/eval-ui/assets/SkillDetailPanel-cyzLsLcK.js +0 -1
@@ -1,7 +1,29 @@
1
- import { type GenerateSkillRequest, type GenerateSkillResult } from "../eval-server/skill-create-routes.js";
2
- export type { GenerateSkillRequest, GenerateSkillResult };
1
+ import { type GenerateSkillRequest as BaseGenerateSkillRequest, type GenerateSkillResult as BaseGenerateSkillResult } from "../eval-server/skill-create-routes.js";
2
+ export interface GenerateSkillRequest extends BaseGenerateSkillRequest {
3
+ multiFile?: boolean;
4
+ }
5
+ export interface GenerateSkillResult extends BaseGenerateSkillResult {
6
+ /** Auxiliary files produced by the multi-file pipeline (relative path → contents). */
7
+ files?: Record<string, string>;
8
+ /** Env-var names declared by the test-agent. */
9
+ secrets?: string[];
10
+ /** Runtime requirements declared by the script-agent. */
11
+ runtime?: {
12
+ python?: string;
13
+ pip?: string[];
14
+ node?: string;
15
+ };
16
+ /** Integration-test contract declared by the test-agent. */
17
+ integrationTests?: {
18
+ runner: "vitest" | "pytest" | "none";
19
+ file?: string;
20
+ requires?: string[];
21
+ };
22
+ /** Per-agent error messages from the parallel fan-out (informational). */
23
+ multiFileWarnings?: string[];
24
+ }
3
25
  export interface GenerateSkillProgressEvent {
4
- phase: "preparing" | "generating-body" | "generating-evals" | "parsing" | "done";
26
+ phase: "preparing" | "generating-body" | "generating-evals" | "generating-scripts" | "generating-graders" | "generating-tests" | "generating-references" | "parsing" | "done";
5
27
  message: string;
6
28
  }
7
29
  export interface GenerateSkillOptions {
@@ -25,6 +25,7 @@
25
25
  // eslint-disable-next-line no-restricted-imports -- see module header TODO
26
26
  import { BODY_SYSTEM_PROMPT, EVAL_SYSTEM_PROMPT, buildAgentAwareSystemPrompt, detectProjectLayout, mergeGenerateResults, parseBodyResponse, parseEvalsResponse, } from "../eval-server/skill-create-routes.js";
27
27
  import { createLlmClient } from "../eval/llm.js";
28
+ import { SCRIPT_SYSTEM_PROMPT, GRADER_SYSTEM_PROMPT, TEST_SYSTEM_PROMPT, REFERENCE_SYSTEM_PROMPT, parseScriptResponse, parseGraderResponse, parseTestResponse, parseReferenceResponse, } from "./agent-prompts.js";
28
29
  /**
29
30
  * Resolve provider + model defaults consistent with the pre-extraction
30
31
  * handler behavior: when both are absent we use { claude-cli, sonnet }.
@@ -76,6 +77,18 @@ export async function generateSkill(request, options) {
76
77
  const evalPrompt = `Generate eval test cases for this skill:\n\n${trimmedPrompt}\n\nReturn only the JSON object with an "evals" array.`;
77
78
  // Agent-aware prompt augmentation: append constraints for non-Claude agents
78
79
  const effectiveSystemPrompt = buildAgentAwareSystemPrompt(BODY_SYSTEM_PROMPT, request.targetAgents);
80
+ if (request.multiFile === true) {
81
+ return await generateMultiFileSkill({
82
+ trimmedPrompt,
83
+ effectiveSystemPrompt,
84
+ provider,
85
+ model,
86
+ evalModel,
87
+ pluginContext,
88
+ abortSignal,
89
+ emit,
90
+ });
91
+ }
79
92
  emit({ phase: "generating-body", message: "Generating skill body..." });
80
93
  emit({ phase: "generating-evals", message: "Generating evals..." });
81
94
  const bodyCall = bodyClient
@@ -97,4 +110,122 @@ export async function generateSkill(request, options) {
97
110
  emit({ phase: "done", message: "Generation complete" });
98
111
  return merged;
99
112
  }
113
+ async function generateMultiFileSkill(ctx) {
114
+ const { trimmedPrompt, effectiveSystemPrompt, provider, model, evalModel, pluginContext, abortSignal, emit, } = ctx;
115
+ // Capable model for code-producing agents; cheap model for reference + eval.
116
+ const capableClient = createLlmClient({ provider, model });
117
+ const cheapClient = createLlmClient({ provider, model: evalModel });
118
+ // Each agent gets the same skill description; the system prompt does the
119
+ // role-shaping. buildAgentAwareSystemPrompt() is intentionally NOT applied
120
+ // here — the per-role prompts are concrete enough that target-agent
121
+ // constraints are encoded by the body-agent's SKILL.md output, not the
122
+ // auxiliary code files.
123
+ const userPrompt = `Generate the role-specific output for this skill:\n\n${trimmedPrompt}`;
124
+ emit({ phase: "generating-scripts", message: "Generating helper scripts..." });
125
+ emit({ phase: "generating-graders", message: "Generating grader..." });
126
+ emit({ phase: "generating-tests", message: "Generating integration test..." });
127
+ emit({ phase: "generating-references", message: "Generating references..." });
128
+ emit({ phase: "generating-evals", message: "Generating evals..." });
129
+ const scriptCall = capableClient
130
+ .generate(SCRIPT_SYSTEM_PROMPT, userPrompt)
131
+ .then((r) => parseScriptResponse(r.text));
132
+ const graderCall = capableClient
133
+ .generate(GRADER_SYSTEM_PROMPT, userPrompt)
134
+ .then((r) => parseGraderResponse(r.text));
135
+ const testCall = capableClient
136
+ .generate(TEST_SYSTEM_PROMPT, userPrompt)
137
+ .then((r) => parseTestResponse(r.text));
138
+ const referenceCall = cheapClient
139
+ .generate(REFERENCE_SYSTEM_PROMPT, userPrompt)
140
+ .then((r) => parseReferenceResponse(r.text));
141
+ const evalCall = cheapClient
142
+ .generate(EVAL_SYSTEM_PROMPT, `Generate eval test cases for this skill:\n\n${trimmedPrompt}\n\nReturn only the JSON object with an "evals" array.`)
143
+ .then((r) => parseEvalsResponse(r.text));
144
+ const settled = await Promise.allSettled([
145
+ scriptCall,
146
+ graderCall,
147
+ testCall,
148
+ referenceCall,
149
+ evalCall,
150
+ ]);
151
+ if (abortSignal?.aborted) {
152
+ const reason = abortSignal.reason ??
153
+ new Error("Skill generation aborted");
154
+ throw reason instanceof Error ? reason : new Error(String(reason));
155
+ }
156
+ // Collect produced files + warnings.
157
+ const files = {};
158
+ const warnings = [];
159
+ let secrets;
160
+ let runtime;
161
+ let integrationTests;
162
+ const [scriptR, graderR, testR, referenceR, evalsR] = settled;
163
+ if (scriptR.status === "fulfilled") {
164
+ for (const f of scriptR.value.files)
165
+ files[f.path] = f.content;
166
+ if (scriptR.value.runtime)
167
+ runtime = scriptR.value.runtime;
168
+ }
169
+ else {
170
+ warnings.push(`script-agent failed: ${stringifyReason(scriptR.reason)}`);
171
+ }
172
+ if (graderR.status === "fulfilled") {
173
+ for (const f of graderR.value.files)
174
+ files[f.path] = f.content;
175
+ }
176
+ else {
177
+ warnings.push(`grader-agent failed: ${stringifyReason(graderR.reason)}`);
178
+ }
179
+ if (testR.status === "fulfilled") {
180
+ for (const f of testR.value.files)
181
+ files[f.path] = f.content;
182
+ if (testR.value.secrets)
183
+ secrets = testR.value.secrets;
184
+ if (testR.value.integrationTests)
185
+ integrationTests = testR.value.integrationTests;
186
+ }
187
+ else {
188
+ warnings.push(`test-agent failed: ${stringifyReason(testR.reason)}`);
189
+ }
190
+ if (referenceR.status === "fulfilled") {
191
+ for (const f of referenceR.value.files)
192
+ files[f.path] = f.content;
193
+ }
194
+ else {
195
+ warnings.push(`reference-agent failed: ${stringifyReason(referenceR.reason)}`);
196
+ }
197
+ emit({ phase: "generating-body", message: "Generating SKILL.md..." });
198
+ // Body-agent runs LAST with the produced filename list so SKILL.md can
199
+ // reference the actual files. Missing files become generic prose in the
200
+ // SKILL.md body — never broken links.
201
+ const filenameList = Object.keys(files).sort().join("\n - ");
202
+ const bodyPrompt = `Generate a skill definition (body and metadata only, NO evals) for:\n\n${trimmedPrompt}\n\nThe skill is multi-file. The following auxiliary files have been produced and live in the skill directory:\n - ${filenameList || "(no auxiliary files produced)"}\n\nReference them in the SKILL.md body using relative paths (e.g. \`scripts/audit.py\`). If a referenced category is missing from the list above, omit references rather than inventing filenames.\n\nApply Skill Studio best practices. Return the JSON object followed by ---REASONING--- and your explanation.${pluginContext}`;
203
+ const bodyClient = createLlmClient({ provider, model });
204
+ const bodySettled = await Promise.allSettled([
205
+ bodyClient.generate(effectiveSystemPrompt, bodyPrompt).then((r) => parseBodyResponse(r.text)),
206
+ ]);
207
+ emit({ phase: "parsing", message: "Merging multi-file results..." });
208
+ const merged = mergeGenerateResults(bodySettled[0], evalsR);
209
+ emit({ phase: "done", message: "Multi-file generation complete" });
210
+ return {
211
+ ...merged,
212
+ files,
213
+ ...(secrets ? { secrets } : {}),
214
+ ...(runtime ? { runtime } : {}),
215
+ ...(integrationTests ? { integrationTests } : {}),
216
+ ...(warnings.length > 0 ? { multiFileWarnings: warnings } : {}),
217
+ };
218
+ }
219
+ function stringifyReason(reason) {
220
+ if (reason instanceof Error)
221
+ return reason.message;
222
+ if (typeof reason === "string")
223
+ return reason;
224
+ try {
225
+ return JSON.stringify(reason);
226
+ }
227
+ catch {
228
+ return String(reason);
229
+ }
230
+ }
100
231
  //# sourceMappingURL=skill-generator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"skill-generator.js","sourceRoot":"","sources":["../../src/core/skill-generator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill-generator.js","sourceRoot":"","sources":["../../src/core/skill-generator.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,yEAAyE;AACzE,8EAA8E;AAC9E,mCAAmC;AACnC,EAAE;AACF,iCAAiC;AACjC,sEAAsE;AACtE,0BAA0B;AAC1B,2EAA2E;AAC3E,oCAAoC;AACpC,wEAAwE;AACxE,uEAAuE;AACvE,uCAAuC;AACvC,EAAE;AACF,6EAA6E;AAC7E,wEAAwE;AACxE,yEAAyE;AACzE,yEAAyE;AACzE,uEAAuE;AACvE,wEAAwE;AACxE,iEAAiE;AACjE,uEAAuE;AACvE,kCAAkC;AAClC,8EAA8E;AAE9E,2EAA2E;AAC3E,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,2BAA2B,EAC3B,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,GAGnB,MAAM,uCAAuC,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,oBAAoB,CAAC;AAgD5B;;;;;;;;GAQG;AACH,SAAS,oBAAoB,CAAC,OAA6B;IAIzD,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,QAAQ,IAAI,YAAY,CAAiB,CAAC;IACpE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC;IACxC,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;AAC7B,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAA6B,EAC7B,OAA6B;IAE7B,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC;IAElD,MAAM,IAAI,GAAG,CAAC,KAAiC,EAAQ,EAAE;QACvD,IAAI,UAAU,IAAI,CAAC,WAAW,EAAE,OAAO;YAAE,UAAU,CAAC,KAAK,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAE5D,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAE1D,6DAA6D;IAC7D,MAAM,UAAU,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAExD,6EAA6E;IAC7E,yEAAyE;IACzE,+CAA+C;IAC/C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,CAAC;IAC/D,MAAM,UAAU,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAEnE,2EAA2E;IAC3E,2DAA2D;IAC3D,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IACzC,MAAM,eAAe,GAAG;QACtB,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;KACrE,CAAC;IACF,MAAM,aAAa,GACjB,eAAe,CAAC,MAAM,GAAG,CAAC;QACxB,CAAC,CAAC,yCAAyC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,oJAAoJ;QAC9N,CAAC,CAAC,8HAA8H,CAAC;IAErI,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC5C,MAAM,UAAU,GAAG,0EAA0E,aAAa,kHAAkH,aAAa,EAAE,CAAC;IAC5O,MAAM,UAAU,GAAG,+CAA+C,aAAa,wDAAwD,CAAC;IAExI,4EAA4E;IAC5E,MAAM,qBAAqB,GAAG,2BAA2B,CACvD,kBAAkB,EAClB,OAAO,CAAC,YAAY,CACrB,CAAC;IAEF,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QAC/B,OAAO,MAAM,sBAAsB,CAAC;YAClC,aAAa;YACb,qBAAqB;YACrB,QAAQ;YACR,KAAK;YACL,SAAS;YACT,aAAa;YACb,WAAW;YACX,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IACxE,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAEpE,MAAM,QAAQ,GAAG,UAAU;SACxB,QAAQ,CAAC,qBAAqB,EAAE,UAAU,CAAC;SAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,UAAU;SACxB,QAAQ,CAAC,kBAAkB,EAAE,UAAU,CAAC;SACxC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAE3C,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEnF,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;QACzB,mEAAmE;QACnE,gDAAgD;QAChD,MAAM,MAAM,GACT,WAAkD,CAAC,MAAM;YAC1D,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACxC,MAAM,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAE1D,MAAM,MAAM,GAAG,oBAAoB,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAE/D,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAExD,OAAO,MAAM,CAAC;AAChB,CAAC;AAyBD,KAAK,UAAU,sBAAsB,CACnC,GAAqB;IAErB,MAAM,EACJ,aAAa,EACb,qBAAqB,EACrB,QAAQ,EACR,KAAK,EACL,SAAS,EACT,aAAa,EACb,WAAW,EACX,IAAI,GACL,GAAG,GAAG,CAAC;IAER,6EAA6E;IAC7E,MAAM,aAAa,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAEpE,yEAAyE;IACzE,2EAA2E;IAC3E,oEAAoE;IACpE,uEAAuE;IACvE,wBAAwB;IACxB,MAAM,UAAU,GAAG,wDAAwD,aAAa,EAAE,CAAC;IAE3F,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC,CAAC;IAC/E,IAAI,CAAC,EAAE,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAC;IACvE,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC,CAAC;IAC/E,IAAI,CAAC,EAAE,KAAK,EAAE,uBAAuB,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC9E,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAEpE,MAAM,UAAU,GAAG,aAAa;SAC7B,QAAQ,CAAC,oBAAoB,EAAE,UAAU,CAAC;SAC1C,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,aAAa;SAC7B,QAAQ,CAAC,oBAAoB,EAAE,UAAU,CAAC;SAC1C,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,aAAa;SAC3B,QAAQ,CAAC,kBAAkB,EAAE,UAAU,CAAC;SACxC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC1C,MAAM,aAAa,GAAG,WAAW;SAC9B,QAAQ,CAAC,uBAAuB,EAAE,UAAU,CAAC;SAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,WAAW;SACzB,QAAQ,CACP,kBAAkB,EAClB,+CAA+C,aAAa,wDAAwD,CACrH;SACA,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QACvC,UAAU;QACV,UAAU;QACV,QAAQ;QACR,aAAa;QACb,QAAQ;KACT,CAAC,CAAC;IAEH,IAAI,WAAW,EAAE,OAAO,EAAE,CAAC;QACzB,MAAM,MAAM,GACT,WAAkD,CAAC,MAAM;YAC1D,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QACxC,MAAM,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,qCAAqC;IACrC,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,IAAI,OAA6B,CAAC;IAClC,IAAI,OAAuC,CAAC;IAC5C,IAAI,gBAAyD,CAAC;IAE9D,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;IAC9D,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;YAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;QAC/D,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,wBAAwB,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK;YAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,wBAAwB,eAAe,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,KAAK;YAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;QAC7D,IAAI,KAAK,CAAC,KAAK,CAAC,OAAO;YAAE,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;QACvD,IAAI,KAAK,CAAC,KAAK,CAAC,gBAAgB;YAAE,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC;IACpF,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,sBAAsB,eAAe,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,UAAU,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACtC,KAAK,MAAM,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,KAAK;YAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;IACpE,CAAC;SAAM,CAAC;QACN,QAAQ,CAAC,IAAI,CAAC,2BAA2B,eAAe,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAEtE,uEAAuE;IACvE,wEAAwE;IACxE,sCAAsC;IACtC,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9D,MAAM,UAAU,GAAG,0EAA0E,aAAa,uHAAuH,YAAY,IAAI,+BAA+B,qTAAqT,aAAa,EAAE,CAAC;IAErlB,MAAM,UAAU,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;QAC3C,UAAU,CAAC,QAAQ,CAAC,qBAAqB,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;KAC9F,CAAC,CAAC;IAEH,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,+BAA+B,EAAE,CAAC,CAAC;IAErE,MAAM,MAAM,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAE5D,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,gCAAgC,EAAE,CAAC,CAAC;IAEnE,OAAO;QACL,GAAG,MAAM;QACT,KAAK;QACL,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/B,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChE,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,MAAe;IACtC,IAAI,MAAM,YAAY,KAAK;QAAE,OAAO,MAAM,CAAC,OAAO,CAAC;IACnD,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC;AACH,CAAC"}
@@ -107,6 +107,20 @@ export interface SkillMetadataFields {
107
107
  * "skills/foo/SKILL.md"). Defaults to "SKILL.md" for flat-layout
108
108
  * installs derived from a legacy `github:` source string. */
109
109
  skillPath: string | null;
110
+ /** Env-var names this skill expects (purposes/hints live in `.env.example` comments). */
111
+ secrets: string[] | null;
112
+ /** Language runtime declaration (Python and/or Node.js). */
113
+ runtime: {
114
+ python: string | null;
115
+ pip: string[] | null;
116
+ node: string | null;
117
+ } | null;
118
+ /** Integration-test contract verified by `vskill check`. */
119
+ integrationTests: {
120
+ runner: "vitest" | "pytest" | "none";
121
+ file: string | null;
122
+ requires: string[] | null;
123
+ } | null;
110
124
  }
111
125
  /**
112
126
  * Minimal YAML frontmatter parser — handles scalars and arrays (inline [a, b]
@@ -375,6 +375,9 @@ const EMPTY_METADATA = {
375
375
  sourceAgent: null,
376
376
  repoUrl: null,
377
377
  skillPath: null,
378
+ secrets: null,
379
+ runtime: null,
380
+ integrationTests: null,
378
381
  };
379
382
  /**
380
383
  * Allow-list of metadata children that may be surfaced at the top level
@@ -407,6 +410,20 @@ const SURFACED_METADATA_KEYS = new Set([
407
410
  // Path / file metadata
408
411
  "entryPoint",
409
412
  "entry-point",
413
+ // 0815: multi-file manifest fields (kebab-case canonical, camelCase tolerated).
414
+ "secrets",
415
+ "runtime-python",
416
+ "runtimePython",
417
+ "runtime-pip",
418
+ "runtimePip",
419
+ "runtime-node",
420
+ "runtimeNode",
421
+ "integration-runner",
422
+ "integrationRunner",
423
+ "integration-file",
424
+ "integrationFile",
425
+ "integration-requires",
426
+ "integrationRequires",
410
427
  ]);
411
428
  /**
412
429
  * Minimal YAML frontmatter parser — handles scalars and arrays (inline [a, b]
@@ -716,6 +733,24 @@ export function buildSkillMetadata(skillDir, origin, root) {
716
733
  const deps = toStringArrayOrNull(fm["skill-deps"] ?? fm.skillDeps ?? fm.deps);
717
734
  const mcpDeps = toStringArrayOrNull(fm["mcp-deps"] ?? fm.mcpDeps ?? fm.mcpDependencies);
718
735
  const tags = toStringArrayOrNull(fm.tags);
736
+ // 0815: assemble runtime + integrationTests from flat fields. Secrets stays
737
+ // a string[] (env-var names); purposes live in the skill's `.env.example`.
738
+ const secrets = toStringArrayOrNull(fm.secrets);
739
+ const runtimePython = toStringOrNull(fm["runtime-python"] ?? fm.runtimePython);
740
+ const runtimePip = toStringArrayOrNull(fm["runtime-pip"] ?? fm.runtimePip);
741
+ const runtimeNode = toStringOrNull(fm["runtime-node"] ?? fm.runtimeNode);
742
+ const runtime = runtimePython || runtimePip || runtimeNode
743
+ ? { python: runtimePython, pip: runtimePip, node: runtimeNode }
744
+ : null;
745
+ const rawRunner = toStringOrNull(fm["integration-runner"] ?? fm.integrationRunner);
746
+ const integrationRunner = rawRunner === "vitest" || rawRunner === "pytest" || rawRunner === "none"
747
+ ? rawRunner
748
+ : null;
749
+ const integrationFile = toStringOrNull(fm["integration-file"] ?? fm.integrationFile);
750
+ const integrationRequires = toStringArrayOrNull(fm["integration-requires"] ?? fm.integrationRequires);
751
+ const integrationTests = integrationRunner
752
+ ? { runner: integrationRunner, file: integrationFile, requires: integrationRequires }
753
+ : null;
719
754
  return {
720
755
  description: toStringOrNull(fm.description),
721
756
  version: toStringOrNull(fm.version),
@@ -732,6 +767,9 @@ export function buildSkillMetadata(skillDir, origin, root) {
732
767
  sourceAgent: deriveSourceAgent(skillDir, root, origin),
733
768
  repoUrl: sourceLink.repoUrl,
734
769
  skillPath: sourceLink.skillPath,
770
+ secrets,
771
+ runtime,
772
+ integrationTests,
735
773
  };
736
774
  }
737
775
  // ---------------------------------------------------------------------------