@skillsmith/core 0.12.0 → 0.12.2

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 (290) hide show
  1. package/CHANGELOG.md +166 -1
  2. package/README.md +7 -8
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/src/api/client.d.ts +5 -3
  5. package/dist/src/api/client.d.ts.map +1 -1
  6. package/dist/src/api/client.js +23 -33
  7. package/dist/src/api/client.js.map +1 -1
  8. package/dist/src/api/client.registry-sync.d.ts +28 -0
  9. package/dist/src/api/client.registry-sync.d.ts.map +1 -0
  10. package/dist/src/api/client.registry-sync.js +36 -0
  11. package/dist/src/api/client.registry-sync.js.map +1 -0
  12. package/dist/src/api/client.test.js +185 -0
  13. package/dist/src/api/client.test.js.map +1 -1
  14. package/dist/src/api/client.toSkill.d.ts +16 -0
  15. package/dist/src/api/client.toSkill.d.ts.map +1 -0
  16. package/dist/src/api/client.toSkill.js +46 -0
  17. package/dist/src/api/client.toSkill.js.map +1 -0
  18. package/dist/src/api/client.types.d.ts +22 -0
  19. package/dist/src/api/client.types.d.ts.map +1 -1
  20. package/dist/src/api/index.d.ts +1 -1
  21. package/dist/src/api/index.d.ts.map +1 -1
  22. package/dist/src/api/index.js.map +1 -1
  23. package/dist/src/api/schemas.d.ts +28 -0
  24. package/dist/src/api/schemas.d.ts.map +1 -1
  25. package/dist/src/api/schemas.js +13 -0
  26. package/dist/src/api/schemas.js.map +1 -1
  27. package/dist/src/audit/remote-audit.d.ts +85 -0
  28. package/dist/src/audit/remote-audit.d.ts.map +1 -1
  29. package/dist/src/audit/remote-audit.js +126 -3
  30. package/dist/src/audit/remote-audit.js.map +1 -1
  31. package/dist/src/audit/remote-audit.test.js +217 -1
  32. package/dist/src/audit/remote-audit.test.js.map +1 -1
  33. package/dist/src/config/index.d.ts +1 -0
  34. package/dist/src/config/index.d.ts.map +1 -1
  35. package/dist/src/config/index.js.map +1 -1
  36. package/dist/src/config/token-credentials.d.ts +20 -0
  37. package/dist/src/config/token-credentials.d.ts.map +1 -1
  38. package/dist/src/config/token-credentials.js +59 -0
  39. package/dist/src/config/token-credentials.js.map +1 -1
  40. package/dist/src/config/token-credentials.test.d.ts +3 -0
  41. package/dist/src/config/token-credentials.test.d.ts.map +1 -1
  42. package/dist/src/config/token-credentials.test.js +68 -0
  43. package/dist/src/config/token-credentials.test.js.map +1 -1
  44. package/dist/src/db/migration-runner.d.ts.map +1 -1
  45. package/dist/src/db/migration-runner.js +6 -0
  46. package/dist/src/db/migration-runner.js.map +1 -1
  47. package/dist/src/db/migrations/v18-skill-versions-real-content-hash.d.ts +36 -0
  48. package/dist/src/db/migrations/v18-skill-versions-real-content-hash.d.ts.map +1 -0
  49. package/dist/src/db/migrations/v18-skill-versions-real-content-hash.js +38 -0
  50. package/dist/src/db/migrations/v18-skill-versions-real-content-hash.js.map +1 -0
  51. package/dist/src/db/schema.d.ts +1 -1
  52. package/dist/src/db/schema.d.ts.map +1 -1
  53. package/dist/src/db/schema.js +3 -1
  54. package/dist/src/db/schema.js.map +1 -1
  55. package/dist/src/exports/services.d.ts +3 -7
  56. package/dist/src/exports/services.d.ts.map +1 -1
  57. package/dist/src/exports/services.install.d.ts +18 -0
  58. package/dist/src/exports/services.install.d.ts.map +1 -0
  59. package/dist/src/exports/services.install.js +62 -0
  60. package/dist/src/exports/services.install.js.map +1 -0
  61. package/dist/src/exports/services.js +12 -32
  62. package/dist/src/exports/services.js.map +1 -1
  63. package/dist/src/exports/types.d.ts +1 -1
  64. package/dist/src/exports/types.d.ts.map +1 -1
  65. package/dist/src/index.d.ts +6 -6
  66. package/dist/src/index.d.ts.map +1 -1
  67. package/dist/src/index.js +8 -5
  68. package/dist/src/index.js.map +1 -1
  69. package/dist/src/install/agent-config-merge.json.d.ts +5 -4
  70. package/dist/src/install/agent-config-merge.json.d.ts.map +1 -1
  71. package/dist/src/install/agent-config-merge.json.js +10 -9
  72. package/dist/src/install/agent-config-merge.json.js.map +1 -1
  73. package/dist/src/install/agent-config-merge.types.d.ts +11 -1
  74. package/dist/src/install/agent-config-merge.types.d.ts.map +1 -1
  75. package/dist/src/install/agent-config-merge.types.js.map +1 -1
  76. package/dist/src/install/agent-harness-targets.d.ts +30 -2
  77. package/dist/src/install/agent-harness-targets.d.ts.map +1 -1
  78. package/dist/src/install/agent-harness-targets.js +17 -0
  79. package/dist/src/install/agent-harness-targets.js.map +1 -1
  80. package/dist/src/install/agent-manifest-path-guard.d.ts +28 -3
  81. package/dist/src/install/agent-manifest-path-guard.d.ts.map +1 -1
  82. package/dist/src/install/agent-manifest-path-guard.js +59 -3
  83. package/dist/src/install/agent-manifest-path-guard.js.map +1 -1
  84. package/dist/src/install/agent-manifest-path-guard.test.js +27 -1
  85. package/dist/src/install/agent-manifest-path-guard.test.js.map +1 -1
  86. package/dist/src/install/agent-pack-installer.antigravity-mcp.d.ts +74 -0
  87. package/dist/src/install/agent-pack-installer.antigravity-mcp.d.ts.map +1 -0
  88. package/dist/src/install/agent-pack-installer.antigravity-mcp.js +106 -0
  89. package/dist/src/install/agent-pack-installer.antigravity-mcp.js.map +1 -0
  90. package/dist/src/install/agent-pack-installer.antigravity-mcp.test.d.ts +2 -0
  91. package/dist/src/install/agent-pack-installer.antigravity-mcp.test.d.ts.map +1 -0
  92. package/dist/src/install/agent-pack-installer.antigravity-mcp.test.js +157 -0
  93. package/dist/src/install/agent-pack-installer.antigravity-mcp.test.js.map +1 -0
  94. package/dist/src/install/agent-pack-installer.cursor-mcp.d.ts +53 -0
  95. package/dist/src/install/agent-pack-installer.cursor-mcp.d.ts.map +1 -0
  96. package/dist/src/install/agent-pack-installer.cursor-mcp.js +207 -0
  97. package/dist/src/install/agent-pack-installer.cursor-mcp.js.map +1 -0
  98. package/dist/src/install/agent-pack-installer.cursor-mcp.test.d.ts +2 -0
  99. package/dist/src/install/agent-pack-installer.cursor-mcp.test.d.ts.map +1 -0
  100. package/dist/src/install/agent-pack-installer.cursor-mcp.test.js +285 -0
  101. package/dist/src/install/agent-pack-installer.cursor-mcp.test.js.map +1 -0
  102. package/dist/src/install/agent-pack-installer.d.ts +8 -0
  103. package/dist/src/install/agent-pack-installer.d.ts.map +1 -1
  104. package/dist/src/install/agent-pack-installer.entry.d.ts +120 -3
  105. package/dist/src/install/agent-pack-installer.entry.d.ts.map +1 -1
  106. package/dist/src/install/agent-pack-installer.entry.js +166 -3
  107. package/dist/src/install/agent-pack-installer.entry.js.map +1 -1
  108. package/dist/src/install/agent-pack-installer.js +97 -3
  109. package/dist/src/install/agent-pack-installer.js.map +1 -1
  110. package/dist/src/install/agent-pack-installer.types.d.ts +27 -0
  111. package/dist/src/install/agent-pack-installer.types.d.ts.map +1 -1
  112. package/dist/src/install/agent-pack-installer.types.js +6 -0
  113. package/dist/src/install/agent-pack-installer.types.js.map +1 -1
  114. package/dist/src/install/agent-pack-installer.workspace-scope.test.d.ts +2 -0
  115. package/dist/src/install/agent-pack-installer.workspace-scope.test.d.ts.map +1 -0
  116. package/dist/src/install/agent-pack-installer.workspace-scope.test.js +148 -0
  117. package/dist/src/install/agent-pack-installer.workspace-scope.test.js.map +1 -0
  118. package/dist/src/install/agent-pack-uninstaller.d.ts +18 -7
  119. package/dist/src/install/agent-pack-uninstaller.d.ts.map +1 -1
  120. package/dist/src/install/agent-pack-uninstaller.js +59 -9
  121. package/dist/src/install/agent-pack-uninstaller.js.map +1 -1
  122. package/dist/src/install/agent-pack-uninstaller.test.js +74 -1
  123. package/dist/src/install/agent-pack-uninstaller.test.js.map +1 -1
  124. package/dist/src/install/fan-out.d.ts.map +1 -1
  125. package/dist/src/install/fan-out.js +6 -0
  126. package/dist/src/install/fan-out.js.map +1 -1
  127. package/dist/src/install/index.d.ts +2 -0
  128. package/dist/src/install/index.d.ts.map +1 -1
  129. package/dist/src/install/index.js +2 -0
  130. package/dist/src/install/index.js.map +1 -1
  131. package/dist/src/install/workspace-scope.d.ts +207 -0
  132. package/dist/src/install/workspace-scope.d.ts.map +1 -0
  133. package/dist/src/install/workspace-scope.js +275 -0
  134. package/dist/src/install/workspace-scope.js.map +1 -0
  135. package/dist/src/install/workspace-scope.test.d.ts +2 -0
  136. package/dist/src/install/workspace-scope.test.d.ts.map +1 -0
  137. package/dist/src/install/workspace-scope.test.js +378 -0
  138. package/dist/src/install/workspace-scope.test.js.map +1 -0
  139. package/dist/src/security/__tests__/pathValidation.test.js +30 -1
  140. package/dist/src/security/__tests__/pathValidation.test.js.map +1 -1
  141. package/dist/src/services/SubagentGenerator.client-profiles.d.ts +258 -0
  142. package/dist/src/services/SubagentGenerator.client-profiles.d.ts.map +1 -0
  143. package/dist/src/services/SubagentGenerator.client-profiles.js +260 -0
  144. package/dist/src/services/SubagentGenerator.client-profiles.js.map +1 -0
  145. package/dist/src/services/SubagentGenerator.d.ts +19 -41
  146. package/dist/src/services/SubagentGenerator.d.ts.map +1 -1
  147. package/dist/src/services/SubagentGenerator.helpers.d.ts +64 -0
  148. package/dist/src/services/SubagentGenerator.helpers.d.ts.map +1 -0
  149. package/dist/src/services/SubagentGenerator.helpers.js +228 -0
  150. package/dist/src/services/SubagentGenerator.helpers.js.map +1 -0
  151. package/dist/src/services/SubagentGenerator.js +66 -208
  152. package/dist/src/services/SubagentGenerator.js.map +1 -1
  153. package/dist/src/services/SubagentGenerator.types.d.ts +45 -0
  154. package/dist/src/services/SubagentGenerator.types.d.ts.map +1 -0
  155. package/dist/src/services/SubagentGenerator.types.js +14 -0
  156. package/dist/src/services/SubagentGenerator.types.js.map +1 -0
  157. package/dist/src/services/TransformationService.d.ts +18 -61
  158. package/dist/src/services/TransformationService.d.ts.map +1 -1
  159. package/dist/src/services/TransformationService.js +29 -17
  160. package/dist/src/services/TransformationService.js.map +1 -1
  161. package/dist/src/services/TransformationService.types.d.ts +74 -0
  162. package/dist/src/services/TransformationService.types.d.ts.map +1 -0
  163. package/dist/src/services/TransformationService.types.js +8 -0
  164. package/dist/src/services/TransformationService.types.js.map +1 -0
  165. package/dist/src/services/__tests__/SubagentGenerator.client-profiles.test.d.ts +5 -0
  166. package/dist/src/services/__tests__/SubagentGenerator.client-profiles.test.d.ts.map +1 -0
  167. package/dist/src/services/__tests__/SubagentGenerator.client-profiles.test.js +72 -0
  168. package/dist/src/services/__tests__/SubagentGenerator.client-profiles.test.js.map +1 -0
  169. package/dist/src/services/__tests__/SubagentGenerator.helpers.test.d.ts +2 -0
  170. package/dist/src/services/__tests__/SubagentGenerator.helpers.test.d.ts.map +1 -0
  171. package/dist/src/services/__tests__/SubagentGenerator.helpers.test.js +61 -0
  172. package/dist/src/services/__tests__/SubagentGenerator.helpers.test.js.map +1 -0
  173. package/dist/src/services/__tests__/SubagentGenerator.test.js +155 -0
  174. package/dist/src/services/__tests__/SubagentGenerator.test.js.map +1 -1
  175. package/dist/src/services/__tests__/TransformationService.test.js +48 -0
  176. package/dist/src/services/__tests__/TransformationService.test.js.map +1 -1
  177. package/dist/src/services/agent-pack/agent-pack.test.js +1 -0
  178. package/dist/src/services/agent-pack/agent-pack.test.js.map +1 -1
  179. package/dist/src/services/agent-pack/prompt-source.d.ts +1 -1
  180. package/dist/src/services/agent-pack/prompt-source.d.ts.map +1 -1
  181. package/dist/src/services/agent-pack/prompt-source.js +10 -3
  182. package/dist/src/services/agent-pack/prompt-source.js.map +1 -1
  183. package/dist/src/services/agent-pack/types.d.ts +26 -2
  184. package/dist/src/services/agent-pack/types.d.ts.map +1 -1
  185. package/dist/src/services/agent-pack/types.js +13 -0
  186. package/dist/src/services/agent-pack/types.js.map +1 -1
  187. package/dist/src/services/agent-tool-profile.d.ts.map +1 -1
  188. package/dist/src/services/agent-tool-profile.js +7 -0
  189. package/dist/src/services/agent-tool-profile.js.map +1 -1
  190. package/dist/src/services/agent-tool-profile.test.js +2 -2
  191. package/dist/src/services/skill-content-comparison.d.ts +71 -0
  192. package/dist/src/services/skill-content-comparison.d.ts.map +1 -0
  193. package/dist/src/services/skill-content-comparison.js +90 -0
  194. package/dist/src/services/skill-content-comparison.js.map +1 -0
  195. package/dist/src/services/skill-content-comparison.test.d.ts +6 -0
  196. package/dist/src/services/skill-content-comparison.test.d.ts.map +1 -0
  197. package/dist/src/services/skill-content-comparison.test.js +83 -0
  198. package/dist/src/services/skill-content-comparison.test.js.map +1 -0
  199. package/dist/src/services/skill-identity-classification.d.ts +202 -0
  200. package/dist/src/services/skill-identity-classification.d.ts.map +1 -0
  201. package/dist/src/services/skill-identity-classification.js +295 -0
  202. package/dist/src/services/skill-identity-classification.js.map +1 -0
  203. package/dist/src/services/skill-identity-classification.test.d.ts +6 -0
  204. package/dist/src/services/skill-identity-classification.test.d.ts.map +1 -0
  205. package/dist/src/services/skill-identity-classification.test.js +314 -0
  206. package/dist/src/services/skill-identity-classification.test.js.map +1 -0
  207. package/dist/src/services/skill-installation.content.d.ts.map +1 -1
  208. package/dist/src/services/skill-installation.content.js +6 -1
  209. package/dist/src/services/skill-installation.content.js.map +1 -1
  210. package/dist/src/services/skill-installation.helpers.d.ts +8 -15
  211. package/dist/src/services/skill-installation.helpers.d.ts.map +1 -1
  212. package/dist/src/services/skill-installation.helpers.js +11 -105
  213. package/dist/src/services/skill-installation.helpers.js.map +1 -1
  214. package/dist/src/services/skill-installation.helpers.test.js +106 -1
  215. package/dist/src/services/skill-installation.helpers.test.js.map +1 -1
  216. package/dist/src/services/skill-installation.service.js +1 -1
  217. package/dist/src/services/skill-installation.service.js.map +1 -1
  218. package/dist/src/services/skill-installation.types.d.ts +33 -0
  219. package/dist/src/services/skill-installation.types.d.ts.map +1 -1
  220. package/dist/src/services/skill-installation.types.js.map +1 -1
  221. package/dist/src/services/skill-installation.uninstall.d.ts +84 -0
  222. package/dist/src/services/skill-installation.uninstall.d.ts.map +1 -0
  223. package/dist/src/services/skill-installation.uninstall.js +252 -0
  224. package/dist/src/services/skill-installation.uninstall.js.map +1 -0
  225. package/dist/src/services/skill-manifest.d.ts +41 -0
  226. package/dist/src/services/skill-manifest.d.ts.map +1 -1
  227. package/dist/src/services/skill-manifest.js +93 -0
  228. package/dist/src/services/skill-manifest.js.map +1 -1
  229. package/dist/src/services/skill-manifest.test.js +27 -0
  230. package/dist/src/services/skill-manifest.test.js.map +1 -1
  231. package/dist/src/sync/SyncEngine.d.ts.map +1 -1
  232. package/dist/src/sync/SyncEngine.js +69 -77
  233. package/dist/src/sync/SyncEngine.js.map +1 -1
  234. package/dist/src/telemetry/agent-marker.d.ts +8 -0
  235. package/dist/src/telemetry/agent-marker.d.ts.map +1 -1
  236. package/dist/src/telemetry/agent-marker.js +7 -0
  237. package/dist/src/telemetry/agent-marker.js.map +1 -1
  238. package/dist/src/telemetry/agent-marker.test.js +7 -1
  239. package/dist/src/telemetry/agent-marker.test.js.map +1 -1
  240. package/dist/src/telemetry/index.d.ts +1 -1
  241. package/dist/src/telemetry/index.d.ts.map +1 -1
  242. package/dist/src/telemetry/index.js +1 -1
  243. package/dist/src/telemetry/index.js.map +1 -1
  244. package/dist/src/telemetry/wrap.d.ts +6 -0
  245. package/dist/src/telemetry/wrap.d.ts.map +1 -1
  246. package/dist/src/telemetry/wrap.js +65 -10
  247. package/dist/src/telemetry/wrap.js.map +1 -1
  248. package/dist/src/telemetry/wrap.test.js +81 -1
  249. package/dist/src/telemetry/wrap.test.js.map +1 -1
  250. package/dist/src/telemetry/wrap.tool-call-sink.test.d.ts +26 -0
  251. package/dist/src/telemetry/wrap.tool-call-sink.test.d.ts.map +1 -0
  252. package/dist/src/telemetry/wrap.tool-call-sink.test.js +162 -0
  253. package/dist/src/telemetry/wrap.tool-call-sink.test.js.map +1 -0
  254. package/dist/src/types/skill.d.ts +9 -1
  255. package/dist/src/types/skill.d.ts.map +1 -1
  256. package/dist/src/utils/index.d.ts +1 -1
  257. package/dist/src/utils/index.d.ts.map +1 -1
  258. package/dist/src/utils/index.js +1 -1
  259. package/dist/src/utils/index.js.map +1 -1
  260. package/dist/src/utils/version-check.d.ts +61 -0
  261. package/dist/src/utils/version-check.d.ts.map +1 -1
  262. package/dist/src/utils/version-check.js +78 -1
  263. package/dist/src/utils/version-check.js.map +1 -1
  264. package/dist/src/utils/version-check.test.js +130 -1
  265. package/dist/src/utils/version-check.test.js.map +1 -1
  266. package/dist/tests/db/migration-runner-race.test.js +19 -9
  267. package/dist/tests/db/migration-runner-race.test.js.map +1 -1
  268. package/dist/tests/install/fan-out.test.js +27 -0
  269. package/dist/tests/install/fan-out.test.js.map +1 -1
  270. package/dist/tests/skill-scanner/allowlist.test.js +7 -1
  271. package/dist/tests/skill-scanner/allowlist.test.js.map +1 -1
  272. package/dist/tests/sync/SyncEngine.abort.test.js +15 -11
  273. package/dist/tests/sync/SyncEngine.abort.test.js.map +1 -1
  274. package/dist/tests/sync/SyncEngine.status.test.js +1 -1
  275. package/dist/tests/sync/SyncEngine.status.test.js.map +1 -1
  276. package/dist/tests/sync/SyncEngine.test.d.ts +11 -2
  277. package/dist/tests/sync/SyncEngine.test.d.ts.map +1 -1
  278. package/dist/tests/sync/SyncEngine.test.js +164 -13
  279. package/dist/tests/sync/SyncEngine.test.js.map +1 -1
  280. package/dist/tests/unit/migrations/migration-v18.test.d.ts +16 -0
  281. package/dist/tests/unit/migrations/migration-v18.test.d.ts.map +1 -0
  282. package/dist/tests/unit/migrations/migration-v18.test.js +192 -0
  283. package/dist/tests/unit/migrations/migration-v18.test.js.map +1 -0
  284. package/dist/tests/unit/services/skill-installation.content.test.js +65 -1
  285. package/dist/tests/unit/services/skill-installation.content.test.js.map +1 -1
  286. package/dist/tests/unit/services/skill-installation.service.test.js +9 -8
  287. package/dist/tests/unit/services/skill-installation.service.test.js.map +1 -1
  288. package/dist/tests/unit/sync-engine.source-aware.test.js +5 -5
  289. package/dist/tests/unit/sync-engine.source-aware.test.js.map +1 -1
  290. package/package.json +3 -3
@@ -0,0 +1,258 @@
1
+ /**
2
+ * SMI-6276 (Wave 6 Step 1): per-client generation profile for companion
3
+ * subagent files (`SubagentGenerator.ts`).
4
+ *
5
+ * `SubagentGenerator.generateSubagentContent()` predates multi-client support
6
+ * entirely — it always emitted Claude-native tool names (`Read, Write, Bash,
7
+ * WebFetch, Grep, Glob, WebSearch`) plus a `model: <haiku|sonnet|opus>`
8
+ * frontmatter field, for every client `COMPANION_AGENT_TARGETS`
9
+ * (`../install/paths.ts`) writes a companion-agent file for — including
10
+ * clients whose own agent-definition format doesn't have a `tools:` or
11
+ * `model:` concept, has one with entirely different value semantics, or (a
12
+ * real, spec-documented failure mode for AntiGravity specifically — see
13
+ * below) can HANG the subagent process on an unmapped tool name.
14
+ *
15
+ * This module is the exhaustive per-client answer, keyed on `ClientId`
16
+ * (matching `COMPANION_AGENT_TARGETS`'s own key set, not the narrower
17
+ * `HarnessId` — every `ClientId` gets a companion-agent file written
18
+ * somewhere per `COMPANION_AGENT_TARGETS`, so every one needs a content
19
+ * decision here too). For each client:
20
+ *
21
+ * 1. Which frontmatter fields it accepts (`includeSkillsField`,
22
+ * `toolsPolicy`, `modelPolicy`, `extraFrontmatterLines`).
23
+ * 2. Its tool-identifier vocabulary and value SHAPE — `'claude-native'`
24
+ * (Skillsmith's internal tool names ARE that client's own names, emitted
25
+ * as a comma-separated scalar, no translation needed), `'mapped-array'`
26
+ * (the client has its OWN, confirmed-different tool vocabulary AND
27
+ * expects a YAML array rather than a scalar — translate through
28
+ * `toolNameMap`, silently drop any internal name with no confirmed
29
+ * mapping, and omit the field entirely if nothing maps), or `'omit'`
30
+ * (vocabulary not independently verified at all — never emit the field
31
+ * rather than guess a wrong value).
32
+ * 3. Its model-selection policy — `'claude-enum'` (accepts Claude's
33
+ * `haiku|sonnet|opus` values directly) or `'omit'` (either no `model:`
34
+ * concept at all, or one with value semantics that don't line up with
35
+ * Skillsmith's internal enum — including a DIFFERENT PROVIDER's own
36
+ * model-tier vocabulary, which is a family swap, not just a renaming).
37
+ *
38
+ * Confidence levels (style follows `../install/agent-harness-targets.ts`'s
39
+ * own header — HIGH/MEDIUM/LOW per client, dated citation, never asserted
40
+ * past what the citation actually supports):
41
+ *
42
+ * - **claude-code** — HIGH. Claude Code's own native subagent format
43
+ * (`.claude/agents/*.md`): `name`, `description`, `tools` (comma-separated
44
+ * Claude tool names), `model`. This is this repo's pre-existing behavior
45
+ * (unchanged by this wave) and matches `renderClaudeShim()`
46
+ * (`agent-pack/shims.ts`), which uses the identical `name`/`description`/
47
+ * `tools` frontmatter shape for the fixed named-agent shim.
48
+ * - **cursor** — HIGH, verified live against cursor.com/docs/subagents
49
+ * (fetched 2026-08-30): "Cursor recognizes subagent files across multiple
50
+ * directory formats: `.cursor/agents/` (Cursor format), `.claude/agents/`
51
+ * (Claude compatibility), `.codex/agents/` (Codex compatibility)."
52
+ * `COMPANION_AGENT_TARGETS.cursor` resolves to the SAME path as
53
+ * `claude-code` (`~/.claude/agents/<name>-specialist.md` — see that
54
+ * table's own comment: "Cursor 2.4+ reads `.claude/agents/` natively — no
55
+ * separate shim file"), so the file this generator actually writes for
56
+ * `--client cursor` is read by Cursor through that Claude-compatibility
57
+ * path and must carry genuine Claude-format frontmatter — this profile
58
+ * mirrors `claude-code`'s exactly (same object, not a coincidental
59
+ * duplicate). Cursor's OWN native `.cursor/agents/*.md` format is verified
60
+ * DIFFERENT (fields: `name`, `description`, `model` — values `inherit`,
61
+ * `fast`, or a hardcoded model ID, NOT Claude's `haiku|sonnet|opus` enum —
62
+ * `readonly`, `is_background`; explicitly NO `tools` field: "Subagents
63
+ * inherit all tools from the parent, including MCP tools from configured
64
+ * servers") but Skillsmith never writes to that native directory (no
65
+ * `.cursor/agents/` entry exists in `COMPANION_AGENT_TARGETS`), so that
66
+ * narrower native schema does not govern the file this generator produces.
67
+ * - **antigravity** — HIGH for the schema itself, verified live against
68
+ * `antigravity.google/docs/subagents/` (fetched 2026-08-30, cross-checked
69
+ * by an independent WebSearch and by Wayback snapshots bracketing
70
+ * 2026-08-06 through 2026-08-16 — see
71
+ * `docs/internal/implementation/smi-6276-subagent-true-antigravity-repro.md`
72
+ * for the full investigation, filed for the separate `subagent: true`
73
+ * question but covering this same schema). **Correction of SMI-5982's
74
+ * original sourcing**: that wave cited
75
+ * `antigravity.google/docs/cli/commands/agents` (the CLI `/agents` TUI
76
+ * command reference, whose example happens to show only `name`+
77
+ * `description`) as if it were the full schema. The real, richer schema
78
+ * lives at `/docs/subagents`: `name`, `description` (both required),
79
+ * `tools` (`string[]`, default `[]` — a YAML ARRAY, not a scalar, of
80
+ * AntiGravity's OWN tool names, e.g. `view_file`, `replace_file_content`,
81
+ * `grep_search`, `run_command` — confirmed DIFFERENT from Skillsmith's
82
+ * Claude-style names), `mainAgent`/`subagent` (booleans, both default
83
+ * `true` — the `subagent: true` question is Step 2's separate scope, not
84
+ * touched here), `model` (`inherit|flash|pro`, default `inherit` — NOT
85
+ * Claude's `haiku|sonnet|opus`), `commandExecutionPolicy`, `mcpServers`,
86
+ * `skills`/`plugins` (skill PATHS like `skills/my-helper-skill` — a
87
+ * DIFFERENT concept from Skillsmith's own `skills: <bare-name>` extension
88
+ * field below, not reused here for that reason).
89
+ *
90
+ * MEDIUM for the specific tool-name MAPPING used here: the docs page only
91
+ * gives 4 example tool names (not a complete enumeration), so
92
+ * `toolNameMap` below covers only those 4, mapped by clear name
93
+ * correspondence (`view_file`→Read, `replace_file_content`→Write/Edit,
94
+ * `grep_search`→Grep, `run_command`→Bash); Skillsmith's `Glob`, `WebFetch`,
95
+ * and `WebSearch` have no confirmed AntiGravity equivalent and are
96
+ * silently dropped, never guessed. This is deliberately a `'mapped-array'`
97
+ * policy rather than `'omit'`, unlike every other unverified-vocabulary
98
+ * client in this table: AntiGravity's own schema documents `tools`
99
+ * defaulting to `[]` (empty) when omitted — the OPPOSITE of Cursor's
100
+ * "inherits from parent" or Copilot's "all tools available" defaults — so
101
+ * omitting the field here would ship a companion subagent with literally
102
+ * ZERO tool access, not a harmlessly-permissive default. A confidently-cited
103
+ * partial mapping is more correct than that, and strictly safer than
104
+ * guessing at unconfirmed names: the same docs page's own "Known Issue
105
+ * (Tool Validation)" warns that "specifying an unmapped or misspelled tool
106
+ * name in the `tools` list may cause the subagent process to hang during
107
+ * execution" — every name emitted here is a name AntiGravity's own docs
108
+ * use as a worked example, never an invented one.
109
+ *
110
+ * `model:` is OMITTED for AntiGravity, not mapped — deliberately, not for
111
+ * lack of trying. AntiGravity's `flash`/`pro` are Gemini model tiers;
112
+ * Skillsmith's `haiku`/`sonnet`/`opus` are Claude model tiers. These are
113
+ * two DIFFERENT model families from two different vendors, not two
114
+ * spellings of the same capability scale — `haiku→flash` and `opus→pro`
115
+ * are plausible analogies, but `sonnet` (Skillsmith's own default "for
116
+ * balanced workloads", `determineModel()`) has no principled third rung to
117
+ * land on in a 2-tier scale, and no official source equates any Claude
118
+ * tier to any Gemini tier. Omitting the field uses AntiGravity's own
119
+ * documented default (`inherit` — defer to whatever tier the invoking
120
+ * session already uses), which is a real, working, spec-sanctioned value,
121
+ * not an absence of a decision.
122
+ * - **copilot** — MEDIUM, verified live against GitHub's own docs
123
+ * (docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-cloud-agent/create-custom-agents,
124
+ * fetched 2026-08-30): `.agent.md` frontmatter DOES support a `tools` list
125
+ * (documented examples: `"read"`, `"edit"`, `"search"`) and a `model`
126
+ * field. NOT verified: a full mapping from Skillsmith's own 8-tool
127
+ * vocabulary (`Read`/`Write`/`Edit`/`Bash`/`Grep`/`Glob`/`WebFetch`/
128
+ * `WebSearch`) onto Copilot's identifier set — only 2-3 of the 8 have a
129
+ * plausible lowercase counterpart in the documented examples, with no
130
+ * confirmed equivalents for `Bash`/`Grep`/`Glob`/`WebFetch` specifically.
131
+ * Unlike AntiGravity, Copilot's own docs confirm omission is SAFE here —
132
+ * "Omitting tools grants access to all available tools — the default is
133
+ * permissive" — so, per this wave's fallback rule, omit `tools:` rather
134
+ * than emit a guessed-wrong partial mapping; the omission doesn't cripple
135
+ * the subagent the way it would for AntiGravity. `model:` is likewise
136
+ * omitted — its value format (Copilot's own model catalog IDs) has no
137
+ * confirmed correspondence to Skillsmith's internal `haiku|sonnet|opus`
138
+ * abstraction.
139
+ * - **opencode** — MEDIUM, verified live against opencode.ai/v2/docs/agents/
140
+ * (fetched 2026-08-30): confirmed frontmatter fields `description`, `mode`
141
+ * (`primary|subagent|all`), `model` (`provider/model#variant` format — NOT
142
+ * Claude's `haiku|sonnet|opus` enum), `color`, `steps`, `permissions`. This
143
+ * repo's own `renderOpenCodeShim()` (`agent-pack/shims.ts`) already
144
+ * documents the load-bearing fact this profile reuses: "OpenCode's
145
+ * frontmatter `tools` field is a permission map, not a plain list; setting
146
+ * it wrong would restrict tools rather than reference them" — same
147
+ * precedent applied here, omitting `tools:` rather than writing a
148
+ * Claude-shaped value into a boolean-permission-map field (a different,
149
+ * harder mapping problem than AntiGravity's plain array — not attempted in
150
+ * this wave). `mode: subagent` IS included (HIGH confidence for this one
151
+ * line specifically — mirrors the already-shipped `renderOpenCodeShim()`
152
+ * verbatim). `model:` omitted — no confirmed mapping from Skillsmith's
153
+ * internal enum to OpenCode's `provider/model` format.
154
+ * - **windsurf** — LOW. No independently confirmed per-subagent-file
155
+ * frontmatter schema for tool/model restriction was found; Windsurf's
156
+ * Cascade agent runtime is additionally documented as being retired (EOL
157
+ * 2026-07-01, superseded by Devin Local). Omit `tools:` and `model:`,
158
+ * matching this table's existing conservative default for windsurf
159
+ * (`COMPANION_AGENT_TARGETS.windsurf`'s own comment: "No
160
+ * `AGENT_SHIM_TARGETS` entry exists for windsurf ... defaults to today's
161
+ * actual behavior" — that comment covers the file PATH only; this module
162
+ * makes the equivalent conservative call for the file's CONTENT).
163
+ * - **agents** — LOW. This `ClientId` is the generic cross-agent /
164
+ * `AGENTS.md` convention (also Codex's install target — "Codex: reads
165
+ * ONLY `~/.agents/skills`", `../install/paths.ts`'s own header comment).
166
+ * The `AGENTS.md` standard itself has no required fields and no YAML
167
+ * frontmatter for its single project-instructions file (openai/codex's own
168
+ * `AGENTS.md`; agents.md spec) — there is no confirmed per-agent-definition
169
+ * file schema with tool/model fields for this identifier at all. Omit
170
+ * `tools:` and `model:`.
171
+ * - **hermes** — LOW. Hermes's own documented frontmatter
172
+ * (hermes-agent.nousresearch.com/docs/) is for SKILL files (`name`,
173
+ * `description`, `version`, `author`, `platforms`), not a separate
174
+ * subagent-definition schema with tool/model restriction fields. Omit
175
+ * `tools:` and `model:`.
176
+ * - **grok** — LOW. Grok Build (docs.x.ai/build/overview,
177
+ * github.com/xai-org/grok-build) confirms agent frontmatter EXISTS
178
+ * ("Subagents can declare their own `mcpServers` in agent frontmatter") but
179
+ * no built-in tool-identifier vocabulary or Claude-comparable model enum is
180
+ * documented. Omit `tools:` and `model:`.
181
+ *
182
+ * @see docs/internal/implementation/cursor-antigravity-tier-parity-plan.md (Wave 6 Step 1)
183
+ * @see docs/internal/implementation/smi-6276-subagent-true-antigravity-repro.md (AntiGravity schema source-of-truth)
184
+ */
185
+ import { type ClientId } from '../install/paths.js';
186
+ /**
187
+ * `'claude-native'` — Skillsmith's internal tool names (`Read`, `Write`,
188
+ * `Edit`, `Bash`, `Grep`, `Glob`, `WebFetch`, `WebSearch`) ARE this client's
189
+ * own tool-identifier vocabulary; emit `tools:` as a plain comma-separated
190
+ * scalar list, no translation needed.
191
+ *
192
+ * `'mapped-array'` — this client has its OWN, confirmed-different tool
193
+ * vocabulary AND expects `tools:` as a YAML array (not a scalar). Translate
194
+ * through the profile's `toolNameMap`; any internal name with no confirmed
195
+ * entry is silently dropped (never guessed), and the field is omitted
196
+ * entirely if the mapped result is empty.
197
+ *
198
+ * `'omit'` — this client's tool vocabulary (or its `tools:` field's VALUE
199
+ * shape) has not been independently verified to accept Skillsmith's internal
200
+ * names as-is, and omitting the field is either safe (permissive default,
201
+ * e.g. Copilot) or the only defensible choice given no evidence at all.
202
+ * Never emit a guessed-wrong value.
203
+ */
204
+ export type SubagentToolsPolicy = 'claude-native' | 'mapped-array' | 'omit';
205
+ /**
206
+ * `'claude-enum'` — this client accepts a `model:` field whose values are
207
+ * (or are compatible with) Skillsmith's internal `haiku|sonnet|opus` enum.
208
+ *
209
+ * `'omit'` — either no `model:` concept exists for this client, or its
210
+ * value semantics (a hardcoded model ID, a `provider/model` string, a
211
+ * different vendor's own model-tier vocabulary, an `inherit`/`fast`
212
+ * keyword, etc.) don't correspond to Skillsmith's internal enum. Omit the
213
+ * field rather than emit a value the client would reject, silently ignore,
214
+ * or (worse) apply as a real but wrong model selection.
215
+ */
216
+ export type SubagentModelPolicy = 'claude-enum' | 'omit';
217
+ /** Per-client shape of the generated companion-subagent file's frontmatter. */
218
+ export interface SubagentGenerationProfile {
219
+ /** How well-evidenced this profile's fields are (see module header). */
220
+ confidence: 'HIGH' | 'MEDIUM' | 'LOW';
221
+ /** One-line pointer to the citation backing this profile (see module header for the full text). */
222
+ citation: string;
223
+ /**
224
+ * Whether to emit Skillsmith's own `skills: <skill-name>` extension field
225
+ * (a Skillsmith convention — a bare skill name — not any external
226
+ * harness's own field of the same name, e.g. AntiGravity's `skills:`
227
+ * expects PATHS and is a different concept) — kept true only for clients
228
+ * this generator has always emitted it for.
229
+ */
230
+ includeSkillsField: boolean;
231
+ toolsPolicy: SubagentToolsPolicy;
232
+ /**
233
+ * Skillsmith-internal tool name -> this client's own tool identifier.
234
+ * Only present (and only meaningful) when `toolsPolicy === 'mapped-array'`.
235
+ * An internal name with no entry here is silently dropped, never guessed.
236
+ */
237
+ toolNameMap?: Readonly<Record<string, string>>;
238
+ modelPolicy: SubagentModelPolicy;
239
+ /**
240
+ * Static frontmatter lines specific to this client, appended after
241
+ * `tools:` (when present) and before `model:` (when present). Empty for
242
+ * every client except OpenCode's `mode: subagent`.
243
+ */
244
+ extraFrontmatterLines: readonly string[];
245
+ }
246
+ export declare const SUBAGENT_CLIENT_PROFILES: Readonly<Record<ClientId, SubagentGenerationProfile>>;
247
+ /** Resolve the per-client generation profile for `client` (default: canonical / claude-code). */
248
+ export declare function getSubagentGenerationProfile(client?: ClientId): SubagentGenerationProfile;
249
+ /**
250
+ * Translate Skillsmith-internal tool names through `profile.toolNameMap`,
251
+ * dropping any name with no confirmed entry and de-duplicating the result
252
+ * (two internal names can map to the same client tool, e.g. AntiGravity's
253
+ * `Write`/`Edit` -> `replace_file_content`). Returns `[]` when nothing maps
254
+ * — callers must omit the `tools:` field entirely in that case, not emit an
255
+ * empty array, per this module's own fallback philosophy.
256
+ */
257
+ export declare function mapToolNames(tools: readonly string[], profile: SubagentGenerationProfile): string[];
258
+ //# sourceMappingURL=SubagentGenerator.client-profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubagentGenerator.client-profiles.d.ts","sourceRoot":"","sources":["../../../src/services/SubagentGenerator.client-profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuLG;AAEH,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAErE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,mBAAmB,GAAG,eAAe,GAAG,cAAc,GAAG,MAAM,CAAA;AAE3E;;;;;;;;;;GAUG;AACH,MAAM,MAAM,mBAAmB,GAAG,aAAa,GAAG,MAAM,CAAA;AAExD,+EAA+E;AAC/E,MAAM,WAAW,yBAAyB;IACxC,wEAAwE;IACxE,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAA;IACrC,mGAAmG;IACnG,QAAQ,EAAE,MAAM,CAAA;IAChB;;;;;;OAMG;IACH,kBAAkB,EAAE,OAAO,CAAA;IAC3B,WAAW,EAAE,mBAAmB,CAAA;IAChC;;;;OAIG;IACH,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC9C,WAAW,EAAE,mBAAmB,CAAA;IAChC;;;;OAIG;IACH,qBAAqB,EAAE,SAAS,MAAM,EAAE,CAAA;CACzC;AA4CD,eAAO,MAAM,wBAAwB,EAAE,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CA0C1F,CAAA;AAED,iGAAiG;AACjG,wBAAgB,4BAA4B,CAC1C,MAAM,GAAE,QAA2B,GAClC,yBAAyB,CAE3B;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,EAAE,yBAAyB,GACjC,MAAM,EAAE,CAIV"}
@@ -0,0 +1,260 @@
1
+ /**
2
+ * SMI-6276 (Wave 6 Step 1): per-client generation profile for companion
3
+ * subagent files (`SubagentGenerator.ts`).
4
+ *
5
+ * `SubagentGenerator.generateSubagentContent()` predates multi-client support
6
+ * entirely — it always emitted Claude-native tool names (`Read, Write, Bash,
7
+ * WebFetch, Grep, Glob, WebSearch`) plus a `model: <haiku|sonnet|opus>`
8
+ * frontmatter field, for every client `COMPANION_AGENT_TARGETS`
9
+ * (`../install/paths.ts`) writes a companion-agent file for — including
10
+ * clients whose own agent-definition format doesn't have a `tools:` or
11
+ * `model:` concept, has one with entirely different value semantics, or (a
12
+ * real, spec-documented failure mode for AntiGravity specifically — see
13
+ * below) can HANG the subagent process on an unmapped tool name.
14
+ *
15
+ * This module is the exhaustive per-client answer, keyed on `ClientId`
16
+ * (matching `COMPANION_AGENT_TARGETS`'s own key set, not the narrower
17
+ * `HarnessId` — every `ClientId` gets a companion-agent file written
18
+ * somewhere per `COMPANION_AGENT_TARGETS`, so every one needs a content
19
+ * decision here too). For each client:
20
+ *
21
+ * 1. Which frontmatter fields it accepts (`includeSkillsField`,
22
+ * `toolsPolicy`, `modelPolicy`, `extraFrontmatterLines`).
23
+ * 2. Its tool-identifier vocabulary and value SHAPE — `'claude-native'`
24
+ * (Skillsmith's internal tool names ARE that client's own names, emitted
25
+ * as a comma-separated scalar, no translation needed), `'mapped-array'`
26
+ * (the client has its OWN, confirmed-different tool vocabulary AND
27
+ * expects a YAML array rather than a scalar — translate through
28
+ * `toolNameMap`, silently drop any internal name with no confirmed
29
+ * mapping, and omit the field entirely if nothing maps), or `'omit'`
30
+ * (vocabulary not independently verified at all — never emit the field
31
+ * rather than guess a wrong value).
32
+ * 3. Its model-selection policy — `'claude-enum'` (accepts Claude's
33
+ * `haiku|sonnet|opus` values directly) or `'omit'` (either no `model:`
34
+ * concept at all, or one with value semantics that don't line up with
35
+ * Skillsmith's internal enum — including a DIFFERENT PROVIDER's own
36
+ * model-tier vocabulary, which is a family swap, not just a renaming).
37
+ *
38
+ * Confidence levels (style follows `../install/agent-harness-targets.ts`'s
39
+ * own header — HIGH/MEDIUM/LOW per client, dated citation, never asserted
40
+ * past what the citation actually supports):
41
+ *
42
+ * - **claude-code** — HIGH. Claude Code's own native subagent format
43
+ * (`.claude/agents/*.md`): `name`, `description`, `tools` (comma-separated
44
+ * Claude tool names), `model`. This is this repo's pre-existing behavior
45
+ * (unchanged by this wave) and matches `renderClaudeShim()`
46
+ * (`agent-pack/shims.ts`), which uses the identical `name`/`description`/
47
+ * `tools` frontmatter shape for the fixed named-agent shim.
48
+ * - **cursor** — HIGH, verified live against cursor.com/docs/subagents
49
+ * (fetched 2026-08-30): "Cursor recognizes subagent files across multiple
50
+ * directory formats: `.cursor/agents/` (Cursor format), `.claude/agents/`
51
+ * (Claude compatibility), `.codex/agents/` (Codex compatibility)."
52
+ * `COMPANION_AGENT_TARGETS.cursor` resolves to the SAME path as
53
+ * `claude-code` (`~/.claude/agents/<name>-specialist.md` — see that
54
+ * table's own comment: "Cursor 2.4+ reads `.claude/agents/` natively — no
55
+ * separate shim file"), so the file this generator actually writes for
56
+ * `--client cursor` is read by Cursor through that Claude-compatibility
57
+ * path and must carry genuine Claude-format frontmatter — this profile
58
+ * mirrors `claude-code`'s exactly (same object, not a coincidental
59
+ * duplicate). Cursor's OWN native `.cursor/agents/*.md` format is verified
60
+ * DIFFERENT (fields: `name`, `description`, `model` — values `inherit`,
61
+ * `fast`, or a hardcoded model ID, NOT Claude's `haiku|sonnet|opus` enum —
62
+ * `readonly`, `is_background`; explicitly NO `tools` field: "Subagents
63
+ * inherit all tools from the parent, including MCP tools from configured
64
+ * servers") but Skillsmith never writes to that native directory (no
65
+ * `.cursor/agents/` entry exists in `COMPANION_AGENT_TARGETS`), so that
66
+ * narrower native schema does not govern the file this generator produces.
67
+ * - **antigravity** — HIGH for the schema itself, verified live against
68
+ * `antigravity.google/docs/subagents/` (fetched 2026-08-30, cross-checked
69
+ * by an independent WebSearch and by Wayback snapshots bracketing
70
+ * 2026-08-06 through 2026-08-16 — see
71
+ * `docs/internal/implementation/smi-6276-subagent-true-antigravity-repro.md`
72
+ * for the full investigation, filed for the separate `subagent: true`
73
+ * question but covering this same schema). **Correction of SMI-5982's
74
+ * original sourcing**: that wave cited
75
+ * `antigravity.google/docs/cli/commands/agents` (the CLI `/agents` TUI
76
+ * command reference, whose example happens to show only `name`+
77
+ * `description`) as if it were the full schema. The real, richer schema
78
+ * lives at `/docs/subagents`: `name`, `description` (both required),
79
+ * `tools` (`string[]`, default `[]` — a YAML ARRAY, not a scalar, of
80
+ * AntiGravity's OWN tool names, e.g. `view_file`, `replace_file_content`,
81
+ * `grep_search`, `run_command` — confirmed DIFFERENT from Skillsmith's
82
+ * Claude-style names), `mainAgent`/`subagent` (booleans, both default
83
+ * `true` — the `subagent: true` question is Step 2's separate scope, not
84
+ * touched here), `model` (`inherit|flash|pro`, default `inherit` — NOT
85
+ * Claude's `haiku|sonnet|opus`), `commandExecutionPolicy`, `mcpServers`,
86
+ * `skills`/`plugins` (skill PATHS like `skills/my-helper-skill` — a
87
+ * DIFFERENT concept from Skillsmith's own `skills: <bare-name>` extension
88
+ * field below, not reused here for that reason).
89
+ *
90
+ * MEDIUM for the specific tool-name MAPPING used here: the docs page only
91
+ * gives 4 example tool names (not a complete enumeration), so
92
+ * `toolNameMap` below covers only those 4, mapped by clear name
93
+ * correspondence (`view_file`→Read, `replace_file_content`→Write/Edit,
94
+ * `grep_search`→Grep, `run_command`→Bash); Skillsmith's `Glob`, `WebFetch`,
95
+ * and `WebSearch` have no confirmed AntiGravity equivalent and are
96
+ * silently dropped, never guessed. This is deliberately a `'mapped-array'`
97
+ * policy rather than `'omit'`, unlike every other unverified-vocabulary
98
+ * client in this table: AntiGravity's own schema documents `tools`
99
+ * defaulting to `[]` (empty) when omitted — the OPPOSITE of Cursor's
100
+ * "inherits from parent" or Copilot's "all tools available" defaults — so
101
+ * omitting the field here would ship a companion subagent with literally
102
+ * ZERO tool access, not a harmlessly-permissive default. A confidently-cited
103
+ * partial mapping is more correct than that, and strictly safer than
104
+ * guessing at unconfirmed names: the same docs page's own "Known Issue
105
+ * (Tool Validation)" warns that "specifying an unmapped or misspelled tool
106
+ * name in the `tools` list may cause the subagent process to hang during
107
+ * execution" — every name emitted here is a name AntiGravity's own docs
108
+ * use as a worked example, never an invented one.
109
+ *
110
+ * `model:` is OMITTED for AntiGravity, not mapped — deliberately, not for
111
+ * lack of trying. AntiGravity's `flash`/`pro` are Gemini model tiers;
112
+ * Skillsmith's `haiku`/`sonnet`/`opus` are Claude model tiers. These are
113
+ * two DIFFERENT model families from two different vendors, not two
114
+ * spellings of the same capability scale — `haiku→flash` and `opus→pro`
115
+ * are plausible analogies, but `sonnet` (Skillsmith's own default "for
116
+ * balanced workloads", `determineModel()`) has no principled third rung to
117
+ * land on in a 2-tier scale, and no official source equates any Claude
118
+ * tier to any Gemini tier. Omitting the field uses AntiGravity's own
119
+ * documented default (`inherit` — defer to whatever tier the invoking
120
+ * session already uses), which is a real, working, spec-sanctioned value,
121
+ * not an absence of a decision.
122
+ * - **copilot** — MEDIUM, verified live against GitHub's own docs
123
+ * (docs.github.com/en/copilot/how-tos/copilot-on-github/customize-copilot/customize-cloud-agent/create-custom-agents,
124
+ * fetched 2026-08-30): `.agent.md` frontmatter DOES support a `tools` list
125
+ * (documented examples: `"read"`, `"edit"`, `"search"`) and a `model`
126
+ * field. NOT verified: a full mapping from Skillsmith's own 8-tool
127
+ * vocabulary (`Read`/`Write`/`Edit`/`Bash`/`Grep`/`Glob`/`WebFetch`/
128
+ * `WebSearch`) onto Copilot's identifier set — only 2-3 of the 8 have a
129
+ * plausible lowercase counterpart in the documented examples, with no
130
+ * confirmed equivalents for `Bash`/`Grep`/`Glob`/`WebFetch` specifically.
131
+ * Unlike AntiGravity, Copilot's own docs confirm omission is SAFE here —
132
+ * "Omitting tools grants access to all available tools — the default is
133
+ * permissive" — so, per this wave's fallback rule, omit `tools:` rather
134
+ * than emit a guessed-wrong partial mapping; the omission doesn't cripple
135
+ * the subagent the way it would for AntiGravity. `model:` is likewise
136
+ * omitted — its value format (Copilot's own model catalog IDs) has no
137
+ * confirmed correspondence to Skillsmith's internal `haiku|sonnet|opus`
138
+ * abstraction.
139
+ * - **opencode** — MEDIUM, verified live against opencode.ai/v2/docs/agents/
140
+ * (fetched 2026-08-30): confirmed frontmatter fields `description`, `mode`
141
+ * (`primary|subagent|all`), `model` (`provider/model#variant` format — NOT
142
+ * Claude's `haiku|sonnet|opus` enum), `color`, `steps`, `permissions`. This
143
+ * repo's own `renderOpenCodeShim()` (`agent-pack/shims.ts`) already
144
+ * documents the load-bearing fact this profile reuses: "OpenCode's
145
+ * frontmatter `tools` field is a permission map, not a plain list; setting
146
+ * it wrong would restrict tools rather than reference them" — same
147
+ * precedent applied here, omitting `tools:` rather than writing a
148
+ * Claude-shaped value into a boolean-permission-map field (a different,
149
+ * harder mapping problem than AntiGravity's plain array — not attempted in
150
+ * this wave). `mode: subagent` IS included (HIGH confidence for this one
151
+ * line specifically — mirrors the already-shipped `renderOpenCodeShim()`
152
+ * verbatim). `model:` omitted — no confirmed mapping from Skillsmith's
153
+ * internal enum to OpenCode's `provider/model` format.
154
+ * - **windsurf** — LOW. No independently confirmed per-subagent-file
155
+ * frontmatter schema for tool/model restriction was found; Windsurf's
156
+ * Cascade agent runtime is additionally documented as being retired (EOL
157
+ * 2026-07-01, superseded by Devin Local). Omit `tools:` and `model:`,
158
+ * matching this table's existing conservative default for windsurf
159
+ * (`COMPANION_AGENT_TARGETS.windsurf`'s own comment: "No
160
+ * `AGENT_SHIM_TARGETS` entry exists for windsurf ... defaults to today's
161
+ * actual behavior" — that comment covers the file PATH only; this module
162
+ * makes the equivalent conservative call for the file's CONTENT).
163
+ * - **agents** — LOW. This `ClientId` is the generic cross-agent /
164
+ * `AGENTS.md` convention (also Codex's install target — "Codex: reads
165
+ * ONLY `~/.agents/skills`", `../install/paths.ts`'s own header comment).
166
+ * The `AGENTS.md` standard itself has no required fields and no YAML
167
+ * frontmatter for its single project-instructions file (openai/codex's own
168
+ * `AGENTS.md`; agents.md spec) — there is no confirmed per-agent-definition
169
+ * file schema with tool/model fields for this identifier at all. Omit
170
+ * `tools:` and `model:`.
171
+ * - **hermes** — LOW. Hermes's own documented frontmatter
172
+ * (hermes-agent.nousresearch.com/docs/) is for SKILL files (`name`,
173
+ * `description`, `version`, `author`, `platforms`), not a separate
174
+ * subagent-definition schema with tool/model restriction fields. Omit
175
+ * `tools:` and `model:`.
176
+ * - **grok** — LOW. Grok Build (docs.x.ai/build/overview,
177
+ * github.com/xai-org/grok-build) confirms agent frontmatter EXISTS
178
+ * ("Subagents can declare their own `mcpServers` in agent frontmatter") but
179
+ * no built-in tool-identifier vocabulary or Claude-comparable model enum is
180
+ * documented. Omit `tools:` and `model:`.
181
+ *
182
+ * @see docs/internal/implementation/cursor-antigravity-tier-parity-plan.md (Wave 6 Step 1)
183
+ * @see docs/internal/implementation/smi-6276-subagent-true-antigravity-repro.md (AntiGravity schema source-of-truth)
184
+ */
185
+ import { CANONICAL_CLIENT } from '../install/paths.js';
186
+ /** claude-code's own native format — this generator's pre-existing (unchanged) behavior. */
187
+ const CLAUDE_FORMAT_PROFILE = {
188
+ confidence: 'HIGH',
189
+ citation: "Claude Code's native `.claude/agents/*.md` subagent format (name/description/tools/model) — this repo's pre-existing behavior; matches renderClaudeShim() (agent-pack/shims.ts).",
190
+ includeSkillsField: true,
191
+ toolsPolicy: 'claude-native',
192
+ modelPolicy: 'claude-enum',
193
+ extraFrontmatterLines: [],
194
+ };
195
+ /** Minimal name+description-only shape shared by every unverified-vocabulary client. */
196
+ function minimalProfile(confidence, citation, extraFrontmatterLines = []) {
197
+ return {
198
+ confidence,
199
+ citation,
200
+ includeSkillsField: false,
201
+ toolsPolicy: 'omit',
202
+ modelPolicy: 'omit',
203
+ extraFrontmatterLines,
204
+ };
205
+ }
206
+ /**
207
+ * AntiGravity's own tool vocabulary (antigravity.google/docs/subagents/,
208
+ * fetched 2026-08-30) — only the 4 names the docs page itself uses as
209
+ * worked examples. See module header for why this is `'mapped-array'`
210
+ * rather than `'omit'` (AntiGravity's own `tools` default is `[]`, not
211
+ * permissive) and why `Glob`/`WebFetch`/`WebSearch` have no entry.
212
+ */
213
+ const ANTIGRAVITY_TOOL_NAME_MAP = {
214
+ Read: 'view_file',
215
+ Write: 'replace_file_content',
216
+ Edit: 'replace_file_content',
217
+ Bash: 'run_command',
218
+ Grep: 'grep_search',
219
+ };
220
+ export const SUBAGENT_CLIENT_PROFILES = {
221
+ 'claude-code': CLAUDE_FORMAT_PROFILE,
222
+ // Mirrors claude-code exactly: COMPANION_AGENT_TARGETS.cursor writes into
223
+ // the SAME `~/.claude/agents/<name>-specialist.md` path, and Cursor reads
224
+ // that directory as a documented Claude-compatibility surface (see module
225
+ // header). This is a deliberate object reuse, not accidental sharing.
226
+ cursor: CLAUDE_FORMAT_PROFILE,
227
+ antigravity: {
228
+ confidence: 'HIGH',
229
+ citation: 'antigravity.google/docs/subagents/ (fetched 2026-08-30, cross-checked via independent WebSearch + Wayback bracketing 2026-08-06..2026-08-16; see smi-6276-subagent-true-antigravity-repro.md): tools is a YAML array of AntiGravity-own names defaulting to [] when omitted; model is inherit|flash|pro (a different vendor/model family from Claude — omitted rather than force-mapped).',
230
+ includeSkillsField: false,
231
+ toolsPolicy: 'mapped-array',
232
+ toolNameMap: ANTIGRAVITY_TOOL_NAME_MAP,
233
+ modelPolicy: 'omit',
234
+ extraFrontmatterLines: [],
235
+ },
236
+ copilot: minimalProfile('MEDIUM', "docs.github.com custom-agents docs (fetched 2026-08-30): tools/model fields exist and omitting tools is documented as permissive ('all tools available') — safe to omit rather than guess the full Skillsmith-tool-name mapping."),
237
+ opencode: minimalProfile('MEDIUM', "opencode.ai/v2/docs/agents/ (fetched 2026-08-30) + this repo's own renderOpenCodeShim(): tools is a boolean permission map, not a list — omit rather than mis-shape it. mode: subagent is HIGH-confidence and included.", ['mode: subagent']),
238
+ windsurf: minimalProfile('LOW', 'No confirmed per-subagent-file tools/model schema found; Cascade is documented as being retired (EOL 2026-07-01).'),
239
+ agents: minimalProfile('LOW', 'The generic AGENTS.md convention has no required fields and no confirmed per-agent-definition-file schema at all.'),
240
+ hermes: minimalProfile('LOW', 'hermes-agent.nousresearch.com/docs/: documented frontmatter is for SKILL files (name/description/version/author/platforms), not a subagent tools/model schema.'),
241
+ grok: minimalProfile('LOW', 'docs.x.ai/build/overview + xai-org/grok-build: agent frontmatter exists but no built-in tool-identifier vocabulary or Claude-comparable model enum is documented.'),
242
+ };
243
+ /** Resolve the per-client generation profile for `client` (default: canonical / claude-code). */
244
+ export function getSubagentGenerationProfile(client = CANONICAL_CLIENT) {
245
+ return SUBAGENT_CLIENT_PROFILES[client];
246
+ }
247
+ /**
248
+ * Translate Skillsmith-internal tool names through `profile.toolNameMap`,
249
+ * dropping any name with no confirmed entry and de-duplicating the result
250
+ * (two internal names can map to the same client tool, e.g. AntiGravity's
251
+ * `Write`/`Edit` -> `replace_file_content`). Returns `[]` when nothing maps
252
+ * — callers must omit the `tools:` field entirely in that case, not emit an
253
+ * empty array, per this module's own fallback philosophy.
254
+ */
255
+ export function mapToolNames(tools, profile) {
256
+ const map = profile.toolNameMap ?? {};
257
+ const mapped = tools.map((tool) => map[tool]).filter((tool) => tool !== undefined);
258
+ return Array.from(new Set(mapped));
259
+ }
260
+ //# sourceMappingURL=SubagentGenerator.client-profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SubagentGenerator.client-profiles.js","sourceRoot":"","sources":["../../../src/services/SubagentGenerator.client-profiles.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuLG;AAEH,OAAO,EAAE,gBAAgB,EAAiB,MAAM,qBAAqB,CAAA;AAiErE,4FAA4F;AAC5F,MAAM,qBAAqB,GAA8B;IACvD,UAAU,EAAE,MAAM;IAClB,QAAQ,EACN,kLAAkL;IACpL,kBAAkB,EAAE,IAAI;IACxB,WAAW,EAAE,eAAe;IAC5B,WAAW,EAAE,aAAa;IAC1B,qBAAqB,EAAE,EAAE;CAC1B,CAAA;AAED,wFAAwF;AACxF,SAAS,cAAc,CACrB,UAAmD,EACnD,QAAgB,EAChB,wBAA2C,EAAE;IAE7C,OAAO;QACL,UAAU;QACV,QAAQ;QACR,kBAAkB,EAAE,KAAK;QACzB,WAAW,EAAE,MAAM;QACnB,WAAW,EAAE,MAAM;QACnB,qBAAqB;KACtB,CAAA;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,yBAAyB,GAAqC;IAClE,IAAI,EAAE,WAAW;IACjB,KAAK,EAAE,sBAAsB;IAC7B,IAAI,EAAE,sBAAsB;IAC5B,IAAI,EAAE,aAAa;IACnB,IAAI,EAAE,aAAa;CACpB,CAAA;AAED,MAAM,CAAC,MAAM,wBAAwB,GAA0D;IAC7F,aAAa,EAAE,qBAAqB;IACpC,0EAA0E;IAC1E,0EAA0E;IAC1E,0EAA0E;IAC1E,sEAAsE;IACtE,MAAM,EAAE,qBAAqB;IAC7B,WAAW,EAAE;QACX,UAAU,EAAE,MAAM;QAClB,QAAQ,EACN,2XAA2X;QAC7X,kBAAkB,EAAE,KAAK;QACzB,WAAW,EAAE,cAAc;QAC3B,WAAW,EAAE,yBAAyB;QACtC,WAAW,EAAE,MAAM;QACnB,qBAAqB,EAAE,EAAE;KAC1B;IACD,OAAO,EAAE,cAAc,CACrB,QAAQ,EACR,kOAAkO,CACnO;IACD,QAAQ,EAAE,cAAc,CACtB,QAAQ,EACR,yNAAyN,EACzN,CAAC,gBAAgB,CAAC,CACnB;IACD,QAAQ,EAAE,cAAc,CACtB,KAAK,EACL,mHAAmH,CACpH;IACD,MAAM,EAAE,cAAc,CACpB,KAAK,EACL,mHAAmH,CACpH;IACD,MAAM,EAAE,cAAc,CACpB,KAAK,EACL,gKAAgK,CACjK;IACD,IAAI,EAAE,cAAc,CAClB,KAAK,EACL,mKAAmK,CACpK;CACF,CAAA;AAED,iGAAiG;AACjG,MAAM,UAAU,4BAA4B,CAC1C,SAAmB,gBAAgB;IAEnC,OAAO,wBAAwB,CAAC,MAAM,CAAC,CAAA;AACzC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,KAAwB,EACxB,OAAkC;IAElC,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAA;IACrC,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAA;IAClG,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;AACpC,CAAC"}
@@ -9,47 +9,19 @@
9
9
  *
10
10
  * Part of the Skillsmith Optimization Layer for transforming
11
11
  * community skills into more performant versions.
12
+ *
13
+ * SMI-6276 (Wave 6 Step 1): companion-agent frontmatter is now generated
14
+ * per TARGET CLIENT via `SubagentGenerator.client-profiles.ts` — this file
15
+ * no longer emits Claude-native tool names / a Claude `model:` value
16
+ * unconditionally for every client `COMPANION_AGENT_TARGETS` writes a
17
+ * companion file for. Types split to `.types.ts`, pure helpers split to
18
+ * `.helpers.ts` (500-line standard).
12
19
  */
20
+ export type { ClaudeModel, SubagentDefinition, SubagentGenerationResult, } from './SubagentGenerator.types.js';
21
+ export { CLAUDE_MODELS } from './SubagentGenerator.types.js';
13
22
  import type { SkillAnalysis } from './SkillAnalyzer.js';
14
- /**
15
- * SMI-1795: Claude model constants for type safety and consistency
16
- */
17
- export declare const CLAUDE_MODELS: {
18
- readonly HAIKU: "haiku";
19
- readonly SONNET: "sonnet";
20
- readonly OPUS: "opus";
21
- };
22
- export type ClaudeModel = (typeof CLAUDE_MODELS)[keyof typeof CLAUDE_MODELS];
23
- /**
24
- * Generated subagent definition
25
- */
26
- export interface SubagentDefinition {
27
- /** Subagent name (e.g., "jest-helper-specialist") */
28
- name: string;
29
- /** Description for the Task tool */
30
- description: string;
31
- /** Trigger phrases that should invoke this subagent */
32
- triggerPhrases: string[];
33
- /** Tools the subagent needs access to */
34
- tools: string[];
35
- /** Recommended model */
36
- model: ClaudeModel;
37
- /** The full markdown content for ~/.claude/agents/ */
38
- content: string;
39
- }
40
- /**
41
- * Result of subagent generation
42
- */
43
- export interface SubagentGenerationResult {
44
- /** Whether a subagent was generated */
45
- generated: boolean;
46
- /** The subagent definition (if generated) */
47
- subagent?: SubagentDefinition;
48
- /** Reason if not generated */
49
- reason?: string;
50
- /** CLAUDE.md integration snippet */
51
- claudeMdSnippet?: string;
52
- }
23
+ import { type ClientId } from '../install/paths.js';
24
+ import { type SubagentGenerationResult } from './SubagentGenerator.types.js';
53
25
  /**
54
26
  * Generate a companion subagent for a skill
55
27
  *
@@ -57,18 +29,24 @@ export interface SubagentGenerationResult {
57
29
  * @param description - The skill's description
58
30
  * @param content - The full SKILL.md content
59
31
  * @param analysis - Analysis from SkillAnalyzer
32
+ * @param client - SMI-6276: target client for the generated companion-agent
33
+ * frontmatter shape (default: canonical / `claude-code`, preserving prior
34
+ * behavior for every existing caller). See `SubagentGenerator.client-profiles.ts`.
60
35
  * @returns Subagent generation result
61
36
  */
62
- export declare function generateSubagent(skillName: string, description: string, content: string, analysis: SkillAnalysis): SubagentGenerationResult;
37
+ export declare function generateSubagent(skillName: string, description: string, content: string, analysis: SkillAnalysis, client?: ClientId): SubagentGenerationResult;
63
38
  /**
64
39
  * Generate a minimal subagent for skills that don't need full analysis
65
40
  *
66
41
  * @param skillName - The name of the skill
67
42
  * @param description - The skill's description
68
43
  * @param content - The full SKILL.md content
44
+ * @param client - SMI-6276: target client for the generated companion-agent
45
+ * frontmatter shape (default: canonical / `claude-code`, preserving prior
46
+ * behavior for every existing caller). See `SubagentGenerator.client-profiles.ts`.
69
47
  * @returns Subagent generation result
70
48
  */
71
- export declare function generateMinimalSubagent(skillName: string, description: string, content: string): SubagentGenerationResult;
49
+ export declare function generateMinimalSubagent(skillName: string, description: string, content: string, client?: ClientId): SubagentGenerationResult;
72
50
  declare const _default: {
73
51
  generateSubagent: typeof generateSubagent;
74
52
  generateMinimalSubagent: typeof generateMinimalSubagent;
@@ -1 +1 @@
1
- {"version":3,"file":"SubagentGenerator.d.ts","sourceRoot":"","sources":["../../../src/services/SubagentGenerator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAqB,MAAM,oBAAoB,CAAA;AAE1E;;GAEG;AACH,eAAO,MAAM,aAAa;;;;CAIhB,CAAA;AAEV,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,OAAO,aAAa,CAAC,CAAA;AAE5E;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAA;IAEZ,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAA;IAEnB,uDAAuD;IACvD,cAAc,EAAE,MAAM,EAAE,CAAA;IAExB,yCAAyC;IACzC,KAAK,EAAE,MAAM,EAAE,CAAA;IAEf,wBAAwB;IACxB,KAAK,EAAE,WAAW,CAAA;IAElB,sDAAsD;IACtD,OAAO,EAAE,MAAM,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,uCAAuC;IACvC,SAAS,EAAE,OAAO,CAAA;IAElB,6CAA6C;IAC7C,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAE7B,8BAA8B;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAA;IAEf,oCAAoC;IACpC,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAoRD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,aAAa,GACtB,wBAAwB,CAmE1B;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,wBAAwB,CAkD1B;;;;;AAED,wBAA4D"}
1
+ {"version":3,"file":"SubagentGenerator.d.ts","sourceRoot":"","sources":["../../../src/services/SubagentGenerator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,wBAAwB,GACzB,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAA;AAE5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAErE,OAAO,EAGL,KAAK,wBAAwB,EAC9B,MAAM,8BAA8B,CAAA;AA0GrC;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,aAAa,EACvB,MAAM,GAAE,QAA2B,GAClC,wBAAwB,CAoE1B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,QAA2B,GAClC,wBAAwB,CAmD1B;;;;;AAED,wBAA4D"}