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.
Files changed (220) hide show
  1. package/README.md +84 -9
  2. package/agents.json +3 -1
  3. package/dist/agents/agents-registry.d.ts +69 -3
  4. package/dist/agents/agents-registry.js +203 -0
  5. package/dist/agents/agents-registry.js.map +1 -1
  6. package/dist/api/client.d.ts +85 -0
  7. package/dist/api/client.js +193 -24
  8. package/dist/api/client.js.map +1 -1
  9. package/dist/commands/add-lockfile.d.ts +6 -0
  10. package/dist/commands/add-lockfile.js +10 -0
  11. package/dist/commands/add-lockfile.js.map +1 -1
  12. package/dist/commands/add.d.ts +7 -0
  13. package/dist/commands/add.js +110 -2
  14. package/dist/commands/add.js.map +1 -1
  15. package/dist/commands/auth.d.ts +23 -0
  16. package/dist/commands/auth.js +105 -11
  17. package/dist/commands/auth.js.map +1 -1
  18. package/dist/commands/eval/serve.d.ts +2 -0
  19. package/dist/commands/eval/serve.js +126 -4
  20. package/dist/commands/eval/serve.js.map +1 -1
  21. package/dist/commands/orgs.d.ts +21 -0
  22. package/dist/commands/orgs.js +164 -0
  23. package/dist/commands/orgs.js.map +1 -0
  24. package/dist/commands/skill.js +14 -1
  25. package/dist/commands/skill.js.map +1 -1
  26. package/dist/commands/whoami.d.ts +29 -0
  27. package/dist/commands/whoami.js +119 -0
  28. package/dist/commands/whoami.js.map +1 -0
  29. package/dist/discovery/github-tree.d.ts +23 -3
  30. package/dist/discovery/github-tree.js +172 -24
  31. package/dist/discovery/github-tree.js.map +1 -1
  32. package/dist/eval/anthropic-catalog.js +32 -2
  33. package/dist/eval/anthropic-catalog.js.map +1 -1
  34. package/dist/eval/batch-judge.js +1 -0
  35. package/dist/eval/batch-judge.js.map +1 -1
  36. package/dist/eval/llm.d.ts +1 -1
  37. package/dist/eval/llm.js +104 -2
  38. package/dist/eval/llm.js.map +1 -1
  39. package/dist/eval-server/__tests__/helpers/studio-token-test-helpers.d.ts +2 -0
  40. package/dist/eval-server/__tests__/helpers/studio-token-test-helpers.js +20 -0
  41. package/dist/eval-server/__tests__/helpers/studio-token-test-helpers.js.map +1 -0
  42. package/dist/eval-server/active-tenant-routes.d.ts +15 -0
  43. package/dist/eval-server/active-tenant-routes.js +101 -0
  44. package/dist/eval-server/active-tenant-routes.js.map +1 -0
  45. package/dist/eval-server/api-routes.js +206 -6
  46. package/dist/eval-server/api-routes.js.map +1 -1
  47. package/dist/eval-server/desktop-open-routes.d.ts +8 -0
  48. package/dist/eval-server/desktop-open-routes.js +64 -0
  49. package/dist/eval-server/desktop-open-routes.js.map +1 -0
  50. package/dist/eval-server/eval-server.js +90 -6
  51. package/dist/eval-server/eval-server.js.map +1 -1
  52. package/dist/eval-server/export-skill-routes.d.ts +9 -0
  53. package/dist/eval-server/export-skill-routes.js +81 -0
  54. package/dist/eval-server/export-skill-routes.js.map +1 -0
  55. package/dist/eval-server/git-routes.d.ts +1 -0
  56. package/dist/eval-server/git-routes.js +101 -4
  57. package/dist/eval-server/git-routes.js.map +1 -1
  58. package/dist/eval-server/install-engine-routes.d.ts +3 -16
  59. package/dist/eval-server/install-engine-routes.js +9 -124
  60. package/dist/eval-server/install-engine-routes.js.map +1 -1
  61. package/dist/eval-server/install-jobs.d.ts +41 -0
  62. package/dist/eval-server/install-jobs.js +161 -0
  63. package/dist/eval-server/install-jobs.js.map +1 -0
  64. package/dist/eval-server/install-skill-routes.d.ts +74 -11
  65. package/dist/eval-server/install-skill-routes.js +506 -79
  66. package/dist/eval-server/install-skill-routes.js.map +1 -1
  67. package/dist/eval-server/install-state-routes.d.ts +25 -0
  68. package/dist/eval-server/install-state-routes.js +125 -0
  69. package/dist/eval-server/install-state-routes.js.map +1 -0
  70. package/dist/eval-server/oauth-github-routes.d.ts +2 -0
  71. package/dist/eval-server/oauth-github-routes.js +505 -0
  72. package/dist/eval-server/oauth-github-routes.js.map +1 -0
  73. package/dist/eval-server/platform-proxy.d.ts +17 -1
  74. package/dist/eval-server/platform-proxy.js +125 -13
  75. package/dist/eval-server/platform-proxy.js.map +1 -1
  76. package/dist/eval-server/plugin-cli-routes.js +9 -9
  77. package/dist/eval-server/plugin-cli-routes.js.map +1 -1
  78. package/dist/eval-server/remove-skill-routes.d.ts +18 -0
  79. package/dist/eval-server/remove-skill-routes.js +145 -0
  80. package/dist/eval-server/remove-skill-routes.js.map +1 -0
  81. package/dist/eval-server/router.d.ts +17 -3
  82. package/dist/eval-server/router.js +166 -9
  83. package/dist/eval-server/router.js.map +1 -1
  84. package/dist/eval-server/settings-store.js +1 -1
  85. package/dist/eval-server/settings-store.js.map +1 -1
  86. package/dist/eval-server/supported-agents-routes.d.ts +6 -0
  87. package/dist/eval-server/supported-agents-routes.js +41 -0
  88. package/dist/eval-server/supported-agents-routes.js.map +1 -0
  89. package/dist/eval-server/utils/spawn-env.d.ts +1 -0
  90. package/dist/eval-server/utils/spawn-env.js +47 -0
  91. package/dist/eval-server/utils/spawn-env.js.map +1 -0
  92. package/dist/eval-ui/assets/AdvancedTab-D8zbE5fH.js +1 -0
  93. package/dist/eval-ui/assets/{CreateSkillPage-BmbvQEzE.js → CreateSkillPage-DOBhKdgr.js} +5 -5
  94. package/dist/eval-ui/assets/FindSkillsPalette-CyMmNPr-.js +2 -0
  95. package/dist/eval-ui/assets/GeneralTab-DYR9NWC4.js +1 -0
  96. package/dist/eval-ui/assets/PrivacyTab-CXIqQokl.js +1 -0
  97. package/dist/eval-ui/assets/SearchPaletteCore-Dn5gQJS_.js +14 -0
  98. package/dist/eval-ui/assets/SkillDetailPanel-DTrRnyyJ.js +1 -0
  99. package/dist/eval-ui/assets/UpdateDropdown-Cvr2fe0z.js +1 -0
  100. package/dist/eval-ui/assets/UpdatesTab-DwJIUDPX.js +1 -0
  101. package/dist/eval-ui/assets/core-DZAvsxlC.js +1 -0
  102. package/dist/eval-ui/assets/event-CDYWU2X3.js +1 -0
  103. package/dist/eval-ui/assets/globals-BRZwPAPF.js +49 -0
  104. package/dist/eval-ui/assets/globals-C3oEdsJh.css +1 -0
  105. package/dist/eval-ui/assets/index-D7M0Jdss.js +1 -0
  106. package/dist/eval-ui/assets/lifecycle-DSleOV-l.js +1 -0
  107. package/dist/eval-ui/assets/lifecycle-d1Sm9Hts.css +1 -0
  108. package/dist/eval-ui/assets/main-D2shn1dH.js +87 -0
  109. package/dist/eval-ui/assets/preferences-BHZXB5dL.css +1 -0
  110. package/dist/eval-ui/assets/preferences-BKv6X7fK.js +2 -0
  111. package/dist/eval-ui/assets/useDesktopBridge-DxVWbYqK.js +2 -0
  112. package/dist/eval-ui/index.html +4 -2
  113. package/dist/eval-ui/lifecycle.html +33 -0
  114. package/dist/eval-ui/preferences.html +34 -0
  115. package/dist/index.js +47 -1
  116. package/dist/index.js.map +1 -1
  117. package/dist/installer/bundle-files.d.ts +4 -0
  118. package/dist/installer/bundle-files.js +97 -0
  119. package/dist/installer/bundle-files.js.map +1 -0
  120. package/dist/installer/canonical.d.ts +31 -6
  121. package/dist/installer/canonical.js +50 -23
  122. package/dist/installer/canonical.js.map +1 -1
  123. package/dist/installer/clipboard-export.d.ts +19 -0
  124. package/dist/installer/clipboard-export.js +88 -0
  125. package/dist/installer/clipboard-export.js.map +1 -0
  126. package/dist/installer/frontmatter.js +1 -1
  127. package/dist/installer/frontmatter.js.map +1 -1
  128. package/dist/installer/multi-install.d.ts +43 -0
  129. package/dist/installer/multi-install.js +237 -0
  130. package/dist/installer/multi-install.js.map +1 -0
  131. package/dist/installer/transformers/aider.d.ts +2 -0
  132. package/dist/installer/transformers/aider.js +32 -0
  133. package/dist/installer/transformers/aider.js.map +1 -0
  134. package/dist/installer/transformers/continue-dev.d.ts +2 -0
  135. package/dist/installer/transformers/continue-dev.js +6 -0
  136. package/dist/installer/transformers/continue-dev.js.map +1 -0
  137. package/dist/installer/transformers/cursor.d.ts +2 -0
  138. package/dist/installer/transformers/cursor.js +24 -0
  139. package/dist/installer/transformers/cursor.js.map +1 -0
  140. package/dist/installer/transformers/github-copilot.d.ts +2 -0
  141. package/dist/installer/transformers/github-copilot.js +17 -0
  142. package/dist/installer/transformers/github-copilot.js.map +1 -0
  143. package/dist/installer/transformers/index.d.ts +78 -0
  144. package/dist/installer/transformers/index.js +13 -0
  145. package/dist/installer/transformers/index.js.map +1 -0
  146. package/dist/installer/transformers/junie.d.ts +2 -0
  147. package/dist/installer/transformers/junie.js +6 -0
  148. package/dist/installer/transformers/junie.js.map +1 -0
  149. package/dist/installer/transformers/kiro.d.ts +2 -0
  150. package/dist/installer/transformers/kiro.js +6 -0
  151. package/dist/installer/transformers/kiro.js.map +1 -0
  152. package/dist/installer/transformers/trae.d.ts +2 -0
  153. package/dist/installer/transformers/trae.js +6 -0
  154. package/dist/installer/transformers/trae.js.map +1 -0
  155. package/dist/installer/transformers/windsurf.d.ts +2 -0
  156. package/dist/installer/transformers/windsurf.js +12 -0
  157. package/dist/installer/transformers/windsurf.js.map +1 -0
  158. package/dist/installer/yaml-safe-mutate.d.ts +19 -0
  159. package/dist/installer/yaml-safe-mutate.js +184 -0
  160. package/dist/installer/yaml-safe-mutate.js.map +1 -0
  161. package/dist/lib/active-tenant.d.ts +36 -0
  162. package/dist/lib/active-tenant.js +120 -0
  163. package/dist/lib/active-tenant.js.map +1 -0
  164. package/dist/lib/github-fetch.d.ts +1 -0
  165. package/dist/lib/github-fetch.js +11 -1
  166. package/dist/lib/github-fetch.js.map +1 -1
  167. package/dist/lib/keychain.d.ts +15 -2
  168. package/dist/lib/keychain.js +156 -8
  169. package/dist/lib/keychain.js.map +1 -1
  170. package/dist/lib/migration/keychain-migration.d.ts +35 -0
  171. package/dist/lib/migration/keychain-migration.js +189 -0
  172. package/dist/lib/migration/keychain-migration.js.map +1 -0
  173. package/dist/lib/tenant-resolver.d.ts +38 -0
  174. package/dist/lib/tenant-resolver.js +79 -0
  175. package/dist/lib/tenant-resolver.js.map +1 -0
  176. package/dist/lockfile/types.d.ts +8 -0
  177. package/dist/sidecar/eval-ui-manifest.json +1 -0
  178. package/dist/sidecar/sea-config.json +57 -0
  179. package/dist/sidecar/sea-prep.blob +0 -0
  180. package/dist/sidecar/server.cjs +141627 -0
  181. package/dist/sidecar/vskill-version.txt +1 -0
  182. package/dist/studio/lib/ops-log.js +140 -57
  183. package/dist/studio/lib/ops-log.js.map +1 -1
  184. package/dist/studio/lib/provenance.js +3 -2
  185. package/dist/studio/lib/provenance.js.map +1 -1
  186. package/dist/studio/lib/query.d.ts +1 -0
  187. package/dist/studio/lib/query.js +7 -0
  188. package/dist/studio/lib/query.js.map +1 -0
  189. package/dist/studio/lib/scope-transfer.d.ts +16 -0
  190. package/dist/studio/lib/scope-transfer.js +52 -25
  191. package/dist/studio/lib/scope-transfer.js.map +1 -1
  192. package/dist/studio/routes/index.js +13 -1
  193. package/dist/studio/routes/index.js.map +1 -1
  194. package/dist/studio/routes/ops.js +31 -9
  195. package/dist/studio/routes/ops.js.map +1 -1
  196. package/dist/studio/routes/promote.js +16 -11
  197. package/dist/studio/routes/promote.js.map +1 -1
  198. package/dist/studio/routes/revert.js +14 -18
  199. package/dist/studio/routes/revert.js.map +1 -1
  200. package/dist/studio/routes/test-install.js +14 -11
  201. package/dist/studio/routes/test-install.js.map +1 -1
  202. package/dist/studio-runtime/lockfile.d.ts +51 -0
  203. package/dist/studio-runtime/lockfile.js +216 -0
  204. package/dist/studio-runtime/lockfile.js.map +1 -0
  205. package/dist/updater/source-fetcher.js +2 -2
  206. package/dist/updater/source-fetcher.js.map +1 -1
  207. package/dist/utils/skill-builder-detection.d.ts +14 -1
  208. package/dist/utils/skill-builder-detection.js +20 -8
  209. package/dist/utils/skill-builder-detection.js.map +1 -1
  210. package/dist/utils/skill-creator-detection.d.ts +10 -2
  211. package/dist/utils/skill-creator-detection.js +12 -43
  212. package/dist/utils/skill-creator-detection.js.map +1 -1
  213. package/package.json +17 -1
  214. package/dist/eval-ui/assets/FindSkillsPalette-D0Zjhm31.js +0 -2
  215. package/dist/eval-ui/assets/SearchPaletteCore-EhcN1xEa.js +0 -14
  216. package/dist/eval-ui/assets/SkillDetailPanel-B5J60ffv.js +0 -1
  217. package/dist/eval-ui/assets/UpdateDropdown-Celf0_Cr.js +0 -1
  218. package/dist/eval-ui/assets/index-BV7k6fdk.js +0 -124
  219. package/dist/eval-ui/assets/index-CKLqBL52.css +0 -1
  220. package/dist/eval-ui/assets/skill-studio-logo-CRyKgIrg.png +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"multi-install.js","sourceRoot":"","sources":["../../src/installer/multi-install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { FormatTransformer } from "./index.js";
2
+ export declare const aiderTransformer: FormatTransformer;
@@ -0,0 +1,32 @@
1
+ // 0845 T-010 — Aider transformer (Tier 2).
2
+ //
3
+ // Aider expects "conventions" files referenced from `~/.aider.conf.yml`'s
4
+ // `read:` list. The transformer is pure — it emits two TransformedFiles:
5
+ //
6
+ // 1. conventions/<name>.md op:"write" body verbatim
7
+ // 2. ../../.aider.conf.yml op:"append-yaml-list" key=read value=~/.aider/conventions/<name>.md
8
+ //
9
+ // The dispatcher in multi-install.ts handles the conf.yml side effect
10
+ // through safeAppendYamlList() per ADR-0845-03 — backup-write, idempotent
11
+ // append, malformed-input rejection.
12
+ //
13
+ // The conf.yml relativePath ascends ONE level: the Aider install root is
14
+ // `~/.aider` (the parent of `~/.aider/skills`), so `../` from there lands
15
+ // at `$HOME` where `.aider.conf.yml` lives.
16
+ export const aiderTransformer = (skill) => {
17
+ return [
18
+ {
19
+ relativePath: `conventions/${skill.name}.md`,
20
+ content: skill.body,
21
+ op: "write",
22
+ },
23
+ {
24
+ relativePath: "../.aider.conf.yml",
25
+ content: "",
26
+ op: "append-yaml-list",
27
+ yamlListKey: "read",
28
+ yamlListValue: `~/.aider/conventions/${skill.name}.md`,
29
+ },
30
+ ];
31
+ };
32
+ //# sourceMappingURL=aider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aider.js","sourceRoot":"","sources":["../../../src/installer/transformers/aider.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,EAAE;AACF,0EAA0E;AAC1E,yEAAyE;AACzE,EAAE;AACF,4DAA4D;AAC5D,sGAAsG;AACtG,EAAE;AACF,sEAAsE;AACtE,0EAA0E;AAC1E,qCAAqC;AACrC,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,4CAA4C;AAI5C,MAAM,CAAC,MAAM,gBAAgB,GAAsB,CAAC,KAAK,EAAqB,EAAE;IAC9E,OAAO;QACL;YACE,YAAY,EAAE,eAAe,KAAK,CAAC,IAAI,KAAK;YAC5C,OAAO,EAAE,KAAK,CAAC,IAAI;YACnB,EAAE,EAAE,OAAO;SACZ;QACD;YACE,YAAY,EAAE,oBAAoB;YAClC,OAAO,EAAE,EAAE;YACX,EAAE,EAAE,kBAAkB;YACtB,WAAW,EAAE,MAAM;YACnB,aAAa,EAAE,wBAAwB,KAAK,CAAC,IAAI,KAAK;SACvD;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { FormatTransformer } from "./index.js";
2
+ export declare const continueDevTransformer: FormatTransformer;
@@ -0,0 +1,6 @@
1
+ // 0845 T-009 — Continue.dev transformer (Tier 2). Plain markdown at rules/<name>.md.
2
+ // AC-US4-06.
3
+ export const continueDevTransformer = (skill) => [
4
+ { relativePath: `rules/${skill.name}.md`, content: skill.body },
5
+ ];
6
+ //# sourceMappingURL=continue-dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continue-dev.js","sourceRoot":"","sources":["../../../src/installer/transformers/continue-dev.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,aAAa;AAIb,MAAM,CAAC,MAAM,sBAAsB,GAAsB,CAAC,KAAK,EAAqB,EAAE,CAAC;IACrF,EAAE,YAAY,EAAE,SAAS,KAAK,CAAC,IAAI,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE;CAChE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { FormatTransformer } from "./index.js";
2
+ export declare const cursorTransformer: FormatTransformer;
@@ -0,0 +1,24 @@
1
+ // 0845 T-006 — Cursor transformer (Tier 2).
2
+ //
3
+ // Cursor consumes "rules" files at `.cursor/rules/<name>.mdc`. The frontmatter
4
+ // shape — `description`, `globs: ""`, `alwaysApply: false` — places the rule
5
+ // in Cursor's "agent-requested" mode: Cursor loads it only when its description
6
+ // matches the conversation. This mirrors Claude Code's auto-trigger semantics
7
+ // best, though Cursor's selection logic is opaque to us (plan.md §8 R2).
8
+ //
9
+ // AC-US4-03: relativePath = "rules/<name>.mdc"; frontmatter starts with
10
+ // `---\ndescription: <desc>\nglobs: ""\nalwaysApply: false\n---`; body follows
11
+ // verbatim. Idempotent (same input → byte-equal output).
12
+ import { quoteYAMLValue } from "../frontmatter.js";
13
+ export const cursorTransformer = (skill) => {
14
+ const description = quoteYAMLValue(skill.description);
15
+ const frontmatter = `---\ndescription: ${description}\nglobs: ""\nalwaysApply: false\n---\n`;
16
+ const content = frontmatter + skill.body;
17
+ return [
18
+ {
19
+ relativePath: `rules/${skill.name}.mdc`,
20
+ content,
21
+ },
22
+ ];
23
+ };
24
+ //# sourceMappingURL=cursor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/installer/transformers/cursor.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,gFAAgF;AAChF,8EAA8E;AAC9E,yEAAyE;AACzE,EAAE;AACF,wEAAwE;AACxE,+EAA+E;AAC/E,yDAAyD;AAGzD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,MAAM,CAAC,MAAM,iBAAiB,GAAsB,CAAC,KAAK,EAAqB,EAAE;IAC/E,MAAM,WAAW,GAAG,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACtD,MAAM,WAAW,GACf,qBAAqB,WAAW,wCAAwC,CAAC;IAC3E,MAAM,OAAO,GAAG,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC;IACzC,OAAO;QACL;YACE,YAAY,EAAE,SAAS,KAAK,CAAC,IAAI,MAAM;YACvC,OAAO;SACR;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { FormatTransformer } from "./index.js";
2
+ export declare const githubCopilotTransformer: FormatTransformer;
@@ -0,0 +1,17 @@
1
+ // 0845 T-008 — GitHub Copilot (VS Code extension) transformer (Tier 2).
2
+ //
3
+ // Copilot's "custom instructions" mechanism reads from
4
+ // `.github/instructions/<name>.instructions.md` (the agent's install root
5
+ // is the workspace root; the transformer paths are relative to it).
6
+ // `applyTo: "**"` makes the instructions apply repo-wide (AC-US4-05).
7
+ // A future enhancement could let the user pin specific glob patterns.
8
+ export const githubCopilotTransformer = (skill) => {
9
+ const frontmatter = `---\napplyTo: "**"\n---\n`;
10
+ return [
11
+ {
12
+ relativePath: `instructions/${skill.name}.instructions.md`,
13
+ content: frontmatter + skill.body,
14
+ },
15
+ ];
16
+ };
17
+ //# sourceMappingURL=github-copilot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-copilot.js","sourceRoot":"","sources":["../../../src/installer/transformers/github-copilot.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,EAAE;AACF,uDAAuD;AACvD,0EAA0E;AAC1E,oEAAoE;AACpE,sEAAsE;AACtE,sEAAsE;AAItE,MAAM,CAAC,MAAM,wBAAwB,GAAsB,CAAC,KAAK,EAAqB,EAAE;IACtF,MAAM,WAAW,GAAG,2BAA2B,CAAC;IAChD,OAAO;QACL;YACE,YAAY,EAAE,gBAAgB,KAAK,CAAC,IAAI,kBAAkB;YAC1D,OAAO,EAAE,WAAW,GAAG,KAAK,CAAC,IAAI;SAClC;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Parsed SKILL.md ready for transformation. Produced by the installer
3
+ * (`parseFrontmatter` + body extraction) and consumed by per-tool
4
+ * transformer functions. The shape intentionally exposes the raw
5
+ * frontmatter block so transformers that preserve fields (e.g.
6
+ * `version`, `author`) can re-emit them without re-parsing.
7
+ */
8
+ export interface ParsedSkill {
9
+ /** Skill name without publisher prefix (e.g. "obsidian-brain"). */
10
+ name: string;
11
+ /**
12
+ * First non-empty body line, truncated to 200 chars. Transformers that
13
+ * emit frontmatter (Cursor, GitHub Copilot, etc.) put this in their
14
+ * `description` field.
15
+ */
16
+ description: string;
17
+ /**
18
+ * Body after the closing `---` of the SKILL.md frontmatter,
19
+ * CRLF-normalized to LF. Verbatim — transformers MUST preserve.
20
+ */
21
+ body: string;
22
+ /**
23
+ * Raw YAML frontmatter block (between the `---` fences), so
24
+ * transformers can preserve fields like `version` or `author` when
25
+ * needed. Empty string when the source had no frontmatter.
26
+ */
27
+ originalFrontmatter: string;
28
+ /** Convenience: parsed-out `version` field if present. */
29
+ version?: string;
30
+ /**
31
+ * Optional bundled skill resources keyed by path relative to the skill root.
32
+ * Standard paths are `agents/`, `scripts/`, `references/`, `assets/`,
33
+ * `tests/`, and `.env.example`; callers validate path safety before write.
34
+ */
35
+ files?: Record<string, string>;
36
+ }
37
+ /**
38
+ * A single file emitted by a transformer. The dispatcher in
39
+ * `multi-install.ts` joins `relativePath` onto the agent's install
40
+ * root and writes `content` via `fs.writeFile`.
41
+ *
42
+ * `op === "append-yaml-list"` is the Aider escape hatch — instead of
43
+ * a plain write, the dispatcher invokes the safe YAML mutation
44
+ * routine (ADR-0845-03) to append `yamlListValue` to `yamlListKey`.
45
+ */
46
+ export interface TransformedFile {
47
+ /**
48
+ * Path relative to the agent's install root (the parent of
49
+ * `localSkillsDir` / `globalSkillsDir`). E.g. `"rules/obsidian-brain.mdc"`
50
+ * for Cursor → resolves to `~/.cursor/rules/obsidian-brain.mdc`.
51
+ *
52
+ * POSIX forward-slash separators required; joined with `path.join()`
53
+ * at write time so Win32 backslashes are handled by Node.
54
+ */
55
+ relativePath: string;
56
+ /** Final file contents, byte-equal across re-runs (idempotent). */
57
+ content: string;
58
+ /** Optional file mode (defaults to 0o644). */
59
+ mode?: number;
60
+ /**
61
+ * Default `"write"`. When `"append-yaml-list"`, the dispatcher
62
+ * invokes `safeAppendYamlList()` instead of `fs.writeFile`. Used
63
+ * by the Aider transformer for the `~/.aider.conf.yml` entry.
64
+ */
65
+ op?: "write" | "append-yaml-list";
66
+ /** When `op === "append-yaml-list"`: the YAML key to mutate. */
67
+ yamlListKey?: string;
68
+ /** When `op === "append-yaml-list"`: the value to append to the list. */
69
+ yamlListValue?: string;
70
+ }
71
+ /**
72
+ * Per-tool format transformer. Pure function — no I/O. Given a
73
+ * `ParsedSkill`, returns the list of files to write under the
74
+ * agent's install root. Re-running with the same input MUST
75
+ * produce byte-equal output (idempotency contract enforced by
76
+ * each transformer's unit tests).
77
+ */
78
+ export type FormatTransformer = (skill: ParsedSkill) => TransformedFile[];
@@ -0,0 +1,13 @@
1
+ // 0845 T-001 — Shared types for per-tool format transformers.
2
+ //
3
+ // These interfaces are imported by Phase-2 transformer modules
4
+ // (cursor.ts, windsurf.ts, github-copilot.ts, etc.) and by the
5
+ // `AgentDefinition.formatTransformer` field in agents-registry.ts.
6
+ //
7
+ // Types live in this barrel so Phase-2 work can land transformer
8
+ // files without touching the registry (no circular dep) and so
9
+ // the registry itself only needs to import a stable type module.
10
+ //
11
+ // ADR cross-ref: 0845-02-per-tool-format-transformer.md.
12
+ export {};
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/installer/transformers/index.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,EAAE;AACF,+DAA+D;AAC/D,+DAA+D;AAC/D,mEAAmE;AACnE,EAAE;AACF,iEAAiE;AACjE,+DAA+D;AAC/D,iEAAiE;AACjE,EAAE;AACF,yDAAyD"}
@@ -0,0 +1,2 @@
1
+ import type { FormatTransformer } from "./index.js";
2
+ export declare const junieTransformer: FormatTransformer;
@@ -0,0 +1,6 @@
1
+ // 0845 T-009 — Junie transformer (Tier 2). Plain markdown at rules/<name>.md.
2
+ // AC-US4-06.
3
+ export const junieTransformer = (skill) => [
4
+ { relativePath: `rules/${skill.name}.md`, content: skill.body },
5
+ ];
6
+ //# sourceMappingURL=junie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"junie.js","sourceRoot":"","sources":["../../../src/installer/transformers/junie.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,aAAa;AAIb,MAAM,CAAC,MAAM,gBAAgB,GAAsB,CAAC,KAAK,EAAqB,EAAE,CAAC;IAC/E,EAAE,YAAY,EAAE,SAAS,KAAK,CAAC,IAAI,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE;CAChE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { FormatTransformer } from "./index.js";
2
+ export declare const kiroTransformer: FormatTransformer;
@@ -0,0 +1,6 @@
1
+ // 0845 T-009 — Kiro transformer (Tier 2). Plain markdown at steering/<name>.md.
2
+ // AC-US4-06.
3
+ export const kiroTransformer = (skill) => [
4
+ { relativePath: `steering/${skill.name}.md`, content: skill.body },
5
+ ];
6
+ //# sourceMappingURL=kiro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kiro.js","sourceRoot":"","sources":["../../../src/installer/transformers/kiro.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,aAAa;AAIb,MAAM,CAAC,MAAM,eAAe,GAAsB,CAAC,KAAK,EAAqB,EAAE,CAAC;IAC9E,EAAE,YAAY,EAAE,YAAY,KAAK,CAAC,IAAI,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE;CACnE,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { FormatTransformer } from "./index.js";
2
+ export declare const traeTransformer: FormatTransformer;
@@ -0,0 +1,6 @@
1
+ // 0845 T-009 — Trae transformer (Tier 2). Plain markdown at top-level <name>.md
2
+ // (Trae's install root holds rules directly — no subdir). AC-US4-06.
3
+ export const traeTransformer = (skill) => [
4
+ { relativePath: `${skill.name}.md`, content: skill.body },
5
+ ];
6
+ //# sourceMappingURL=trae.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trae.js","sourceRoot":"","sources":["../../../src/installer/transformers/trae.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,qEAAqE;AAIrE,MAAM,CAAC,MAAM,eAAe,GAAsB,CAAC,KAAK,EAAqB,EAAE,CAAC;IAC9E,EAAE,YAAY,EAAE,GAAG,KAAK,CAAC,IAAI,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE;CAC1D,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { FormatTransformer } from "./index.js";
2
+ export declare const windsurfTransformer: FormatTransformer;
@@ -0,0 +1,12 @@
1
+ // 0845 T-007 — Windsurf transformer (Tier 2).
2
+ // Windsurf consumes plain markdown rule files under `.windsurf/rules/<name>.md`.
3
+ // AC-US4-04: frontmatter stripped, body verbatim.
4
+ export const windsurfTransformer = (skill) => {
5
+ return [
6
+ {
7
+ relativePath: `rules/${skill.name}.md`,
8
+ content: skill.body,
9
+ },
10
+ ];
11
+ };
12
+ //# sourceMappingURL=windsurf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"windsurf.js","sourceRoot":"","sources":["../../../src/installer/transformers/windsurf.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAC9C,iFAAiF;AACjF,kDAAkD;AAIlD,MAAM,CAAC,MAAM,mBAAmB,GAAsB,CAAC,KAAK,EAAqB,EAAE;IACjF,OAAO;QACL;YACE,YAAY,EAAE,SAAS,KAAK,CAAC,IAAI,KAAK;YACtC,OAAO,EAAE,KAAK,CAAC,IAAI;SACpB;KACF,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ export declare class MalformedConfigError extends Error {
2
+ constructor(msg: string);
3
+ }
4
+ export declare class IncompatibleConfigError extends Error {
5
+ constructor(msg: string);
6
+ }
7
+ export type SafeAppendStatus = "created" | "appended" | "already-present";
8
+ export interface SafeAppendResult {
9
+ status: SafeAppendStatus;
10
+ /** Path of the backup written before mutation. Undefined for status="created"
11
+ * and status="already-present" (no mutation occurred). */
12
+ backupPath?: string;
13
+ }
14
+ /**
15
+ * Append `value` to the YAML block-sequence under top-level `key` in `filePath`.
16
+ * Idempotent; backs up the original before any mutation; throws on malformed
17
+ * input or incompatible shape (file is never touched on error).
18
+ */
19
+ export declare function safeAppendYamlList(filePath: string, key: string, value: string): SafeAppendResult;
@@ -0,0 +1,184 @@
1
+ // 0845 T-010 — safeAppendYamlList: idempotent, backup-protected list mutation.
2
+ //
3
+ // Why hand-rolled instead of js-yaml:
4
+ // - vskill has no js-yaml dependency today; the surface here is tiny
5
+ // (append one string to ONE top-level block-sequence key) so the cost
6
+ // of pulling in a YAML library is not justified.
7
+ // - Line-based mutation preserves user comments, formatting, ordering,
8
+ // and indent style — js-yaml's round-trip drops all of those.
9
+ // - The four "what does the user's YAML look like?" cases below are the
10
+ // only shapes the Aider conf.yml mutation needs to handle.
11
+ //
12
+ // Algorithm (ADR-0845-03):
13
+ // 1. File missing → write `<key>:\n - <value>\n`, status="created"
14
+ // 2. Key missing in file → append `<key>:\n - <value>\n`, status="appended"
15
+ // 3. Key present, empty value → replace with full list, status="appended"
16
+ // 4. Key present, block list:
17
+ // - value already present → no-op, status="already-present"
18
+ // - value absent → insert `<indent>- <value>` at end of block, status="appended"
19
+ // 5. Key present, inline list / scalar → throw IncompatibleConfigError
20
+ // 6. Malformed YAML (tab indent, unclosed quoted string, etc.) → throw MalformedConfigError
21
+ //
22
+ // Mutations always go through a backup-write: write `<file>.bak` (or
23
+ // `.bak.1`, `.bak.2`, … if `.bak` is already taken) BEFORE rewriting the
24
+ // original. Backup is skipped on the "created" path (no prior content
25
+ // to preserve).
26
+ import { readFileSync, writeFileSync, existsSync, copyFileSync, } from "node:fs";
27
+ export class MalformedConfigError extends Error {
28
+ constructor(msg) {
29
+ super(`Malformed YAML config: ${msg}`);
30
+ this.name = "MalformedConfigError";
31
+ }
32
+ }
33
+ export class IncompatibleConfigError extends Error {
34
+ constructor(msg) {
35
+ super(`Incompatible YAML shape: ${msg}`);
36
+ this.name = "IncompatibleConfigError";
37
+ }
38
+ }
39
+ const DEFAULT_INDENT = " "; // 2-space when we have nothing else to copy.
40
+ /**
41
+ * Append `value` to the YAML block-sequence under top-level `key` in `filePath`.
42
+ * Idempotent; backs up the original before any mutation; throws on malformed
43
+ * input or incompatible shape (file is never touched on error).
44
+ */
45
+ export function safeAppendYamlList(filePath, key, value) {
46
+ if (!existsSync(filePath)) {
47
+ writeFileSync(filePath, `${key}:\n${DEFAULT_INDENT}- ${value}\n`);
48
+ return { status: "created" };
49
+ }
50
+ const original = readFileSync(filePath, "utf8");
51
+ validateNoMalformedYaml(original);
52
+ const keyLineIdx = findTopLevelKeyLine(original, key);
53
+ if (keyLineIdx === -1) {
54
+ const updated = appendKeyAtEnd(original, key, value);
55
+ return mutateWithBackup(filePath, original, updated);
56
+ }
57
+ const lines = original.split("\n");
58
+ const block = readListBlock(lines, keyLineIdx);
59
+ if (block.shape === "inline-list" || block.shape === "scalar") {
60
+ throw new IncompatibleConfigError(`key "${key}" is not a block-sequence (found ${block.shape})`);
61
+ }
62
+ if (block.shape === "empty-value") {
63
+ const replacement = `${key}:\n${DEFAULT_INDENT}- ${value}`;
64
+ const next = [...lines.slice(0, keyLineIdx), replacement, ...lines.slice(keyLineIdx + 1)];
65
+ return mutateWithBackup(filePath, original, next.join("\n"));
66
+ }
67
+ // block.shape === "block-list" — explicit guard keeps TS narrowing happy
68
+ // after the prior `===` checks against the discriminant.
69
+ if (block.shape !== "block-list") {
70
+ // Should be unreachable; treated as a defensive cast.
71
+ throw new Error(`internal: unexpected block shape "${block.shape}"`);
72
+ }
73
+ if (block.items.includes(value)) {
74
+ return { status: "already-present" };
75
+ }
76
+ const indent = block.indent;
77
+ const insertAt = block.endLineIdx + 1; // line after the last list item
78
+ const newLine = `${indent}- ${value}`;
79
+ const next = [...lines.slice(0, insertAt), newLine, ...lines.slice(insertAt)];
80
+ return mutateWithBackup(filePath, original, next.join("\n"));
81
+ }
82
+ // ---------------------------------------------------------------------------
83
+ // Internals
84
+ // ---------------------------------------------------------------------------
85
+ function validateNoMalformedYaml(text) {
86
+ // Tab indentation is illegal in YAML; flag any line that begins with a tab
87
+ // before its first non-whitespace char.
88
+ const lines = text.split("\n");
89
+ for (const line of lines) {
90
+ if (/^\t/.test(line)) {
91
+ throw new MalformedConfigError("tab indentation detected (YAML requires spaces)");
92
+ }
93
+ }
94
+ // Unclosed double-quoted string: count unescaped `"` chars in the body.
95
+ // Odd count → unclosed. Backslash-escaped quotes are ignored.
96
+ const stripped = text.replace(/\\"/g, "");
97
+ const dq = (stripped.match(/"/g) ?? []).length;
98
+ if (dq % 2 === 1) {
99
+ throw new MalformedConfigError("unclosed double-quoted string");
100
+ }
101
+ const stripped2 = text.replace(/\\'/g, "");
102
+ const sq = (stripped2.match(/'/g) ?? []).length;
103
+ if (sq % 2 === 1) {
104
+ throw new MalformedConfigError("unclosed single-quoted string");
105
+ }
106
+ }
107
+ function findTopLevelKeyLine(text, key) {
108
+ const lines = text.split("\n");
109
+ // Top-level == zero indent. Tolerate optional trailing whitespace.
110
+ const re = new RegExp(`^${escapeRegex(key)}\\s*:`);
111
+ for (let i = 0; i < lines.length; i++) {
112
+ if (re.test(lines[i]))
113
+ return i;
114
+ }
115
+ return -1;
116
+ }
117
+ function readListBlock(lines, keyLineIdx) {
118
+ const keyLine = lines[keyLineIdx];
119
+ const afterColon = keyLine.split(":").slice(1).join(":").trim();
120
+ if (afterColon === "") {
121
+ // `key:` with nothing after → may be block-list OR empty.
122
+ // Look ahead for `<indent>- ` lines.
123
+ for (let i = keyLineIdx + 1; i < lines.length; i++) {
124
+ const ln = lines[i];
125
+ if (ln.trim() === "")
126
+ continue;
127
+ const m = ln.match(/^(\s+)- (.*)$/);
128
+ if (m) {
129
+ // Found first item — parse the entire block.
130
+ const indent = m[1];
131
+ const items = [];
132
+ let end = i;
133
+ for (let j = i; j < lines.length; j++) {
134
+ const item = lines[j].match(new RegExp(`^${indent}- (.*)$`));
135
+ if (!item) {
136
+ // Stop at first non-list line. Blank lines inside a block are
137
+ // unusual but tolerated — they don't advance `end`.
138
+ if (lines[j].trim() === "")
139
+ continue;
140
+ break;
141
+ }
142
+ items.push(item[1].trim());
143
+ end = j;
144
+ }
145
+ return { shape: "block-list", items, indent, endLineIdx: end };
146
+ }
147
+ // First non-blank line after `key:` is not a list item → empty value.
148
+ return { shape: "empty-value" };
149
+ }
150
+ return { shape: "empty-value" };
151
+ }
152
+ if (afterColon.startsWith("[")) {
153
+ return { shape: "inline-list" };
154
+ }
155
+ return { shape: "scalar" };
156
+ }
157
+ function appendKeyAtEnd(original, key, value) {
158
+ const needsLeadingNewline = original.length > 0 && !original.endsWith("\n");
159
+ const prefix = needsLeadingNewline ? `${original}\n` : original;
160
+ return `${prefix}${key}:\n${DEFAULT_INDENT}- ${value}\n`;
161
+ }
162
+ function mutateWithBackup(filePath, _original, next) {
163
+ const backupPath = pickBackupPath(filePath);
164
+ copyFileSync(filePath, backupPath);
165
+ // Normalize: ensure exactly one trailing newline.
166
+ const normalized = next.endsWith("\n") ? next : `${next}\n`;
167
+ writeFileSync(filePath, normalized);
168
+ return { status: "appended", backupPath };
169
+ }
170
+ function pickBackupPath(filePath) {
171
+ const base = `${filePath}.bak`;
172
+ if (!existsSync(base))
173
+ return base;
174
+ for (let n = 1; n < 1000; n++) {
175
+ const candidate = `${filePath}.bak.${n}`;
176
+ if (!existsSync(candidate))
177
+ return candidate;
178
+ }
179
+ throw new Error(`Could not allocate a free backup path for ${filePath}`);
180
+ }
181
+ function escapeRegex(s) {
182
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
183
+ }
184
+ //# sourceMappingURL=yaml-safe-mutate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yaml-safe-mutate.js","sourceRoot":"","sources":["../../src/installer/yaml-safe-mutate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ export interface ActiveTenantOptions {
2
+ /** Override config dir (tests). Defaults to `~/.vskill`. */
3
+ configDir?: string;
4
+ /** Filesystem adapter for tests. */
5
+ fs?: ActiveTenantFs;
6
+ }
7
+ export interface ActiveTenantFs {
8
+ existsSync(path: string): boolean;
9
+ readFileSync(path: string): string;
10
+ writeFileSync(path: string, content: string, mode: number): void;
11
+ renameSync(oldPath: string, newPath: string): void;
12
+ mkdirSync(path: string): void;
13
+ unlinkSync(path: string): void;
14
+ }
15
+ /**
16
+ * Read the active tenant slug. Returns null when the config file is
17
+ * missing, unreadable, or has no `currentTenant` field.
18
+ */
19
+ export declare function getActiveTenant(opts?: ActiveTenantOptions): string | null;
20
+ /**
21
+ * Write the active tenant slug. Preserves unknown keys (read-modify-write
22
+ * merge, AC-US3-06) and uses an atomic .tmp + rename so a concurrent CLI
23
+ * + Studio write never observes a partial file.
24
+ *
25
+ * Pass `null` to clear `currentTenant` while preserving the rest of the
26
+ * config (e.g. `vskill orgs use --clear` later).
27
+ */
28
+ export declare function setActiveTenant(slug: string | null, opts?: ActiveTenantOptions): void;
29
+ /**
30
+ * Read the entire config object (forward-compat — surfaces all keys, not
31
+ * just `currentTenant`). Returns an empty object when the file is missing
32
+ * or corrupt.
33
+ */
34
+ export declare function readConfig(opts?: ActiveTenantOptions): Record<string, unknown>;
35
+ /** Resolve the path the helpers will read/write. Useful for diagnostics. */
36
+ export declare function getConfigPath(opts?: ActiveTenantOptions): string;