vskill 1.0.16 → 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 (206) hide show
  1. package/README.md +84 -9
  2. package/agents.json +3 -1
  3. package/dist/agents/agents-registry.d.ts +61 -0
  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 +17 -2
  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 +82 -5
  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 +4 -0
  68. package/dist/eval-server/install-state-routes.js +15 -1
  69. package/dist/eval-server/install-state-routes.js.map +1 -1
  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-CvdYq8Rr.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-Bf3PBC64.js → SearchPaletteCore-Dn5gQJS_.js} +2 -2
  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 +48 -12
  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/multi-install.d.ts +43 -0
  127. package/dist/installer/multi-install.js +237 -0
  128. package/dist/installer/multi-install.js.map +1 -0
  129. package/dist/installer/transformers/aider.d.ts +2 -0
  130. package/dist/installer/transformers/aider.js +32 -0
  131. package/dist/installer/transformers/aider.js.map +1 -0
  132. package/dist/installer/transformers/continue-dev.d.ts +2 -0
  133. package/dist/installer/transformers/continue-dev.js +6 -0
  134. package/dist/installer/transformers/continue-dev.js.map +1 -0
  135. package/dist/installer/transformers/cursor.d.ts +2 -0
  136. package/dist/installer/transformers/cursor.js +24 -0
  137. package/dist/installer/transformers/cursor.js.map +1 -0
  138. package/dist/installer/transformers/github-copilot.d.ts +2 -0
  139. package/dist/installer/transformers/github-copilot.js +17 -0
  140. package/dist/installer/transformers/github-copilot.js.map +1 -0
  141. package/dist/installer/transformers/index.d.ts +78 -0
  142. package/dist/installer/transformers/index.js +13 -0
  143. package/dist/installer/transformers/index.js.map +1 -0
  144. package/dist/installer/transformers/junie.d.ts +2 -0
  145. package/dist/installer/transformers/junie.js +6 -0
  146. package/dist/installer/transformers/junie.js.map +1 -0
  147. package/dist/installer/transformers/kiro.d.ts +2 -0
  148. package/dist/installer/transformers/kiro.js +6 -0
  149. package/dist/installer/transformers/kiro.js.map +1 -0
  150. package/dist/installer/transformers/trae.d.ts +2 -0
  151. package/dist/installer/transformers/trae.js +6 -0
  152. package/dist/installer/transformers/trae.js.map +1 -0
  153. package/dist/installer/transformers/windsurf.d.ts +2 -0
  154. package/dist/installer/transformers/windsurf.js +12 -0
  155. package/dist/installer/transformers/windsurf.js.map +1 -0
  156. package/dist/installer/yaml-safe-mutate.d.ts +19 -0
  157. package/dist/installer/yaml-safe-mutate.js +184 -0
  158. package/dist/installer/yaml-safe-mutate.js.map +1 -0
  159. package/dist/lib/active-tenant.d.ts +36 -0
  160. package/dist/lib/active-tenant.js +120 -0
  161. package/dist/lib/active-tenant.js.map +1 -0
  162. package/dist/lib/github-fetch.d.ts +1 -0
  163. package/dist/lib/github-fetch.js +11 -1
  164. package/dist/lib/github-fetch.js.map +1 -1
  165. package/dist/lib/keychain.d.ts +15 -2
  166. package/dist/lib/keychain.js +156 -8
  167. package/dist/lib/keychain.js.map +1 -1
  168. package/dist/lib/migration/keychain-migration.d.ts +35 -0
  169. package/dist/lib/migration/keychain-migration.js +189 -0
  170. package/dist/lib/migration/keychain-migration.js.map +1 -0
  171. package/dist/lib/tenant-resolver.d.ts +38 -0
  172. package/dist/lib/tenant-resolver.js +79 -0
  173. package/dist/lib/tenant-resolver.js.map +1 -0
  174. package/dist/lockfile/types.d.ts +8 -0
  175. package/dist/sidecar/eval-ui-manifest.json +1 -0
  176. package/dist/sidecar/sea-config.json +57 -0
  177. package/dist/sidecar/sea-prep.blob +0 -0
  178. package/dist/sidecar/server.cjs +141627 -0
  179. package/dist/sidecar/vskill-version.txt +1 -0
  180. package/dist/studio/lib/ops-log.js +140 -57
  181. package/dist/studio/lib/ops-log.js.map +1 -1
  182. package/dist/studio/lib/scope-transfer.d.ts +11 -1
  183. package/dist/studio/lib/scope-transfer.js +48 -24
  184. package/dist/studio/lib/scope-transfer.js.map +1 -1
  185. package/dist/studio/routes/index.js +10 -1
  186. package/dist/studio/routes/index.js.map +1 -1
  187. package/dist/studio/routes/ops.js +31 -7
  188. package/dist/studio/routes/ops.js.map +1 -1
  189. package/dist/studio/routes/promote.js +15 -8
  190. package/dist/studio/routes/promote.js.map +1 -1
  191. package/dist/studio/routes/revert.js +12 -1
  192. package/dist/studio/routes/revert.js.map +1 -1
  193. package/dist/studio/routes/test-install.js +13 -8
  194. package/dist/studio/routes/test-install.js.map +1 -1
  195. package/dist/studio-runtime/lockfile.d.ts +51 -0
  196. package/dist/studio-runtime/lockfile.js +216 -0
  197. package/dist/studio-runtime/lockfile.js.map +1 -0
  198. package/dist/updater/source-fetcher.js +2 -2
  199. package/dist/updater/source-fetcher.js.map +1 -1
  200. package/package.json +17 -1
  201. package/dist/eval-ui/assets/FindSkillsPalette-DsSgotS9.js +0 -2
  202. package/dist/eval-ui/assets/SkillDetailPanel-DAD2yJO-.js +0 -1
  203. package/dist/eval-ui/assets/UpdateDropdown-h5Hg3h7Z.js +0 -1
  204. package/dist/eval-ui/assets/index-CKLqBL52.css +0 -1
  205. package/dist/eval-ui/assets/index-JaDg6FlU.js +0 -124
  206. 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;
@@ -5,25 +5,37 @@ import { join, relative, dirname, sep as pathSep } from "node:path";
5
5
  import os from "node:os";
6
6
  import { resolveTilde } from "../utils/paths.js";
7
7
  import { ensureFrontmatter, stripClaudeFields } from "./frontmatter.js";
8
+ import { resolveBundleTarget } from "./bundle-files.js";
8
9
  /**
9
- * Filter agents by target-agents frontmatter.
10
- * When targetAgents is undefined or empty, returns all agents (existing behavior).
11
- * When targetAgents is specified, returns only agents whose IDs are in the list.
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`.
12
16
  */
13
- export function filterAgentsByTargetAgents(agents, targetAgents) {
14
- if (!targetAgents || targetAgents.length === 0)
15
- return agents;
16
- const targetSet = new Set(targetAgents);
17
- return agents.filter((a) => targetSet.has(a.id));
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;
18
24
  }
19
25
  /**
20
26
  * Resolve the skills directory for an agent given the install scope.
21
27
  *
22
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.
23
32
  * Local: uses projectRoot + agent.localSkillsDir (e.g. ./project/.claude/skills)
24
33
  */
25
34
  export function resolveAgentSkillsDir(agent, opts) {
26
35
  if (opts.global) {
36
+ const override = resolveGlobalSkillsDirEnvOverride(agent);
37
+ if (override)
38
+ return override;
27
39
  return resolveTilde(agent.globalSkillsDir);
28
40
  }
29
41
  const resolved = join(opts.projectRoot, agent.localSkillsDir);
@@ -105,11 +117,8 @@ const COPY_FALLBACK_AGENTS = new Set(["claude-code"]);
105
117
  * Keys are relative paths (e.g., "agents/frontend.md"), values are file contents.
106
118
  */
107
119
  function writeAgentFiles(targetDir, agentFiles) {
108
- const resolvedTarget = join(targetDir, "."); // normalize
109
120
  for (const [relPath, fileContent] of Object.entries(agentFiles)) {
110
- const fullPath = join(resolvedTarget, relPath);
111
- if (!fullPath.startsWith(resolvedTarget))
112
- continue; // path traversal guard
121
+ const fullPath = resolveBundleTarget(targetDir, relPath);
113
122
  mkdirSync(dirname(fullPath), { recursive: true });
114
123
  writeFileSync(fullPath, fileContent);
115
124
  }
@@ -189,4 +198,31 @@ export function installCopy(skillName, content, agents, opts, agentFiles) {
189
198
  }
190
199
  return installed;
191
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
+ }
192
228
  //# sourceMappingURL=canonical.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../src/installer/canonical.ts"],"names":[],"mappings":"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"}
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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"}
@@ -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
@@ -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;