@xopcai/xopc 0.0.29 → 0.0.31

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 (632) hide show
  1. package/dist/extensions/telegram/src/adapters/config-surface.js +3 -1
  2. package/dist/extensions/telegram/src/adapters/config-surface.js.map +1 -1
  3. package/dist/extensions/telegram/src/adapters/onboard-cli.js +23 -21
  4. package/dist/extensions/telegram/src/adapters/onboard-cli.js.map +1 -1
  5. package/dist/extensions/telegram/src/adapters/setup-wizard.js +3 -4
  6. package/dist/extensions/telegram/src/adapters/setup-wizard.js.map +1 -1
  7. package/dist/extensions/telegram/src/config-schema.d.ts +0 -1
  8. package/dist/extensions/telegram/src/config-schema.js +17 -4
  9. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  10. package/dist/extensions/telegram/src/plugin.js +4 -17
  11. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  12. package/dist/extensions/telegram/xopc.extension.json +1 -1
  13. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  14. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  15. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  16. package/dist/gateway/static/root/assets/agents-3u63Fw2Y.js +216 -0
  17. package/dist/gateway/static/root/assets/agents-3u63Fw2Y.js.map +1 -0
  18. package/dist/gateway/static/root/assets/{apps-page-Bmq19MS-.js → apps-page-CWegY6Kp.js} +2 -2
  19. package/dist/gateway/static/root/assets/{apps-page-Bmq19MS-.js.map → apps-page-CWegY6Kp.js.map} +1 -1
  20. package/dist/gateway/static/root/assets/channels-settings-CiyeXcTK.js +9 -0
  21. package/dist/gateway/static/root/assets/channels-settings-CiyeXcTK.js.map +1 -0
  22. package/dist/gateway/static/root/assets/cron-api-_j_79Zf5.js +3 -0
  23. package/dist/gateway/static/root/assets/cron-api-_j_79Zf5.js.map +1 -0
  24. package/dist/gateway/static/root/assets/cron-page-S86YNTtI.js +2 -0
  25. package/dist/gateway/static/root/assets/cron-page-S86YNTtI.js.map +1 -0
  26. package/dist/gateway/static/root/assets/dist-D0jxbvuz.js +2 -0
  27. package/dist/gateway/static/root/assets/{dist--p2HQ2QF.js.map → dist-D0jxbvuz.js.map} +1 -1
  28. package/dist/gateway/static/root/assets/{extension-debug-page-DwHCB_6T.js → extension-debug-page-DB630cW8.js} +2 -2
  29. package/dist/gateway/static/root/assets/{extension-debug-page-DwHCB_6T.js.map → extension-debug-page-DB630cW8.js.map} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-page-BsYwQIex.js → extension-page-CnoPUBul.js} +2 -2
  31. package/dist/gateway/static/root/assets/{extension-page-BsYwQIex.js.map → extension-page-CnoPUBul.js.map} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-settings-page-nsisEgjB.js → extension-settings-page-BsiOkvBe.js} +2 -2
  33. package/dist/gateway/static/root/assets/{extension-settings-page-nsisEgjB.js.map → extension-settings-page-BsiOkvBe.js.map} +1 -1
  34. package/dist/gateway/static/root/assets/{index-CR8zUHGR.js → index-DHLmAIQl.js} +63 -63
  35. package/dist/gateway/static/root/assets/{index-CR8zUHGR.js.map → index-DHLmAIQl.js.map} +1 -1
  36. package/dist/gateway/static/root/assets/index-DoPwy4aU.css +1 -0
  37. package/dist/gateway/static/root/assets/logs-page-Bndhenn2.js +2 -0
  38. package/dist/gateway/static/root/assets/logs-page-Bndhenn2.js.map +1 -0
  39. package/dist/gateway/static/root/assets/sessions-page-Q201-_lP.js +2 -0
  40. package/dist/gateway/static/root/assets/{sessions-page-Be5kIGl_.js.map → sessions-page-Q201-_lP.js.map} +1 -1
  41. package/dist/gateway/static/root/assets/settings-page-Cw75fpc6.js +2 -0
  42. package/dist/gateway/static/root/assets/settings-page-Cw75fpc6.js.map +1 -0
  43. package/dist/gateway/static/root/assets/skills-page-CVwEzD_J.js +3 -0
  44. package/dist/gateway/static/root/assets/skills-page-CVwEzD_J.js.map +1 -0
  45. package/dist/gateway/static/root/index.html +2 -2
  46. package/dist/package.js +1 -1
  47. package/dist/src/agent/agent-manager.d.ts +5 -7
  48. package/dist/src/agent/agent-manager.js +21 -19
  49. package/dist/src/agent/agent-manager.js.map +1 -1
  50. package/dist/src/agent/ipc/inbox.js +4 -2
  51. package/dist/src/agent/ipc/inbox.js.map +1 -1
  52. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  53. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  54. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -1
  55. package/dist/src/agent/prompt/service-prompt-builder.js +0 -2
  56. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  57. package/dist/src/agent/prompt/system-prompt.d.ts +0 -2
  58. package/dist/src/agent/prompt/system-prompt.js +3 -17
  59. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  60. package/dist/src/agent/service/btw-query.d.ts +16 -0
  61. package/dist/src/agent/service/btw-query.js +88 -0
  62. package/dist/src/agent/service/btw-query.js.map +1 -0
  63. package/dist/src/agent/service/build-direct-message-content.d.ts +30 -0
  64. package/dist/src/agent/service/build-direct-message-content.js +75 -0
  65. package/dist/src/agent/service/build-direct-message-content.js.map +1 -0
  66. package/dist/src/agent/service/parse-outbound-session-key.d.ts +8 -0
  67. package/dist/src/agent/service/parse-outbound-session-key.js +41 -0
  68. package/dist/src/agent/service/parse-outbound-session-key.js.map +1 -0
  69. package/dist/src/agent/service/process-direct-one-shot.d.ts +34 -0
  70. package/dist/src/agent/service/process-direct-one-shot.js +67 -0
  71. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -0
  72. package/dist/src/agent/service/process-direct-streaming.js +12 -1
  73. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  74. package/dist/src/agent/service/reconcile-dreaming-cron.d.ts +6 -0
  75. package/dist/src/agent/service/reconcile-dreaming-cron.js +70 -0
  76. package/dist/src/agent/service/reconcile-dreaming-cron.js.map +1 -0
  77. package/dist/src/agent/service/session-context-report.d.ts +19 -0
  78. package/dist/src/agent/service/session-context-report.js +47 -0
  79. package/dist/src/agent/service/session-context-report.js.map +1 -0
  80. package/dist/src/agent/service/webchat-tts.d.ts +28 -0
  81. package/dist/src/agent/service/webchat-tts.js +73 -0
  82. package/dist/src/agent/service/webchat-tts.js.map +1 -0
  83. package/dist/src/agent/service.d.ts +8 -12
  84. package/dist/src/agent/service.js +74 -379
  85. package/dist/src/agent/service.js.map +1 -1
  86. package/dist/src/agent/skills/config.js +4 -3
  87. package/dist/src/agent/skills/config.js.map +1 -1
  88. package/dist/src/agent/skills/format-skills-prompt.d.ts +0 -2
  89. package/dist/src/agent/skills/format-skills-prompt.js +3 -24
  90. package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
  91. package/dist/src/agent/skills/hub-lock.js +4 -5
  92. package/dist/src/agent/skills/hub-lock.js.map +1 -1
  93. package/dist/src/agent/skills/index.js +9 -21
  94. package/dist/src/agent/skills/index.js.map +1 -1
  95. package/dist/src/agent/skills/marketplace/adapter.types.d.ts +17 -0
  96. package/dist/src/agent/skills/marketplace/adapter.types.js +1 -0
  97. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.d.ts +2 -0
  98. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +292 -0
  99. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -0
  100. package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.d.ts +73 -0
  101. package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.js +200 -0
  102. package/dist/src/agent/skills/marketplace/adapters/skillhub/ecosystem-client.js.map +1 -0
  103. package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.d.ts +137 -0
  104. package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.js +217 -0
  105. package/dist/src/agent/skills/marketplace/adapters/skillhub/registry-client.js.map +1 -0
  106. package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.d.ts +12 -0
  107. package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.js +90 -0
  108. package/dist/src/agent/skills/marketplace/adapters/skillhub/skillhub-fetch-cache.js.map +1 -0
  109. package/dist/src/agent/skills/marketplace/adapters/store/adapter.d.ts +2 -0
  110. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +35 -0
  111. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js.map +1 -0
  112. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +124 -0
  113. package/dist/src/agent/skills/{skills-store-client.js → marketplace/adapters/store/store-api-client.js} +4 -3
  114. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js.map +1 -0
  115. package/dist/src/agent/skills/marketplace/resolve-adapter.d.ts +6 -0
  116. package/dist/src/agent/skills/marketplace/resolve-adapter.js +26 -0
  117. package/dist/src/agent/skills/marketplace/resolve-adapter.js.map +1 -0
  118. package/dist/src/agent/skills/parse-skill-metadata.d.ts +5 -0
  119. package/dist/src/agent/skills/parse-skill-metadata.js +27 -0
  120. package/dist/src/agent/skills/parse-skill-metadata.js.map +1 -0
  121. package/dist/src/agent/skills/skill-markdown-preview-from-raw.d.ts +6 -0
  122. package/dist/src/agent/skills/skill-markdown-preview-from-raw.js +64 -0
  123. package/dist/src/agent/skills/skill-markdown-preview-from-raw.js.map +1 -0
  124. package/dist/src/agent/skills/skill-view-path.d.ts +17 -1
  125. package/dist/src/agent/skills/skill-view-path.js +66 -3
  126. package/dist/src/agent/skills/skill-view-path.js.map +1 -1
  127. package/dist/src/agent/skills/skills-marketplace.d.ts +21 -0
  128. package/dist/src/agent/skills/skills-marketplace.js +18 -0
  129. package/dist/src/agent/skills/skills-marketplace.js.map +1 -0
  130. package/dist/src/agent/skills/test-framework.d.ts +0 -1
  131. package/dist/src/agent/skills/test-framework.js +2 -20
  132. package/dist/src/agent/skills/test-framework.js.map +1 -1
  133. package/dist/src/agent/skills/types.d.ts +12 -6
  134. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  135. package/dist/src/agent/tools/image-generate-tool.js +2 -2
  136. package/dist/src/auth/credentials.js +8 -6
  137. package/dist/src/auth/credentials.js.map +1 -1
  138. package/dist/src/auth/profiles/store.js +5 -3
  139. package/dist/src/auth/profiles/store.js.map +1 -1
  140. package/dist/src/channels/manager.js +1 -1
  141. package/dist/src/channels/outbound/persist-store.js +4 -4
  142. package/dist/src/channels/outbound/persist-store.js.map +1 -1
  143. package/dist/src/cli/commands/config.js +8 -6
  144. package/dist/src/cli/commands/config.js.map +1 -1
  145. package/dist/src/cli/commands/doctor/checks/channel-config.js +3 -4
  146. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  147. package/dist/src/cli/commands/init.js +4 -2
  148. package/dist/src/cli/commands/init.js.map +1 -1
  149. package/dist/src/config/loader.js +3 -1
  150. package/dist/src/config/loader.js.map +1 -1
  151. package/dist/src/config/models-json.js +4 -5
  152. package/dist/src/config/models-json.js.map +1 -1
  153. package/dist/src/config/schema.d.ts +12 -4
  154. package/dist/src/config/schema.js +31 -5
  155. package/dist/src/config/schema.js.map +1 -1
  156. package/dist/src/cron/persistence.d.ts +1 -3
  157. package/dist/src/cron/persistence.js +6 -17
  158. package/dist/src/cron/persistence.js.map +1 -1
  159. package/dist/src/cron/validation.js +1 -1
  160. package/dist/src/cron/validation.js.map +1 -1
  161. package/dist/src/extensions/activation-context.js +0 -1
  162. package/dist/src/extensions/activation-context.js.map +1 -1
  163. package/dist/src/extensions/lockfile.js +4 -2
  164. package/dist/src/extensions/lockfile.js.map +1 -1
  165. package/dist/src/gateway/auth.d.ts +0 -9
  166. package/dist/src/gateway/auth.js +1 -12
  167. package/dist/src/gateway/auth.js.map +1 -1
  168. package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -1
  169. package/dist/src/gateway/hono/lib/extension-store.js +4 -4
  170. package/dist/src/gateway/hono/lib/extension-store.js.map +1 -1
  171. package/dist/src/gateway/hono/routes/channels.js +5 -3
  172. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  173. package/dist/src/gateway/hono/routes/commands-skills.js +28 -3
  174. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  175. package/dist/src/gateway/hono/routes/config.js +23 -2
  176. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  177. package/dist/src/gateway/hono/routes/sessions.js +124 -2
  178. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  179. package/dist/src/gateway/hono/sse.js +9 -2
  180. package/dist/src/gateway/hono/sse.js.map +1 -1
  181. package/dist/src/gateway/index.js +2 -2
  182. package/dist/src/gateway/lock.js +1 -1
  183. package/dist/src/gateway/service/run-gateway-agent.d.ts +37 -0
  184. package/dist/src/gateway/service/run-gateway-agent.js +163 -0
  185. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -0
  186. package/dist/src/gateway/service/save-webchat-user-message.d.ts +9 -0
  187. package/dist/src/gateway/service/save-webchat-user-message.js +34 -0
  188. package/dist/src/gateway/service/save-webchat-user-message.js.map +1 -0
  189. package/dist/src/gateway/service/session-chat-ids.d.ts +9 -0
  190. package/dist/src/gateway/service/session-chat-ids.js +33 -0
  191. package/dist/src/gateway/service/session-chat-ids.js.map +1 -0
  192. package/dist/src/gateway/service/sse-hub.d.ts +10 -0
  193. package/dist/src/gateway/service/sse-hub.js +55 -0
  194. package/dist/src/gateway/service/sse-hub.js.map +1 -0
  195. package/dist/src/gateway/service/types.d.ts +9 -0
  196. package/dist/src/gateway/service/types.js +1 -0
  197. package/dist/src/gateway/service.d.ts +42 -33
  198. package/dist/src/gateway/service.js +92 -246
  199. package/dist/src/gateway/service.js.map +1 -1
  200. package/dist/src/infra/update-lock.js +4 -2
  201. package/dist/src/infra/update-lock.js.map +1 -1
  202. package/dist/src/infra/update-startup.js +5 -14
  203. package/dist/src/infra/update-startup.js.map +1 -1
  204. package/dist/src/infra/write-file-atomic.d.ts +18 -0
  205. package/dist/src/infra/write-file-atomic.js +115 -0
  206. package/dist/src/infra/write-file-atomic.js.map +1 -0
  207. package/dist/src/session/abort-cutoff.d.ts +6 -0
  208. package/dist/src/session/abort-cutoff.js +10 -0
  209. package/dist/src/session/abort-cutoff.js.map +1 -0
  210. package/dist/src/session/compaction-checkpoints.d.ts +8 -0
  211. package/dist/src/session/compaction-checkpoints.js +21 -0
  212. package/dist/src/session/compaction-checkpoints.js.map +1 -0
  213. package/dist/src/session/config-store.js +4 -2
  214. package/dist/src/session/config-store.js.map +1 -1
  215. package/dist/src/session/index.d.ts +8 -1
  216. package/dist/src/session/index.js +7 -1
  217. package/dist/src/session/manager.d.ts +26 -1
  218. package/dist/src/session/manager.js +39 -2
  219. package/dist/src/session/manager.js.map +1 -1
  220. package/dist/src/session/patch-metadata.d.ts +12 -0
  221. package/dist/src/session/patch-metadata.js +23 -0
  222. package/dist/src/session/patch-metadata.js.map +1 -0
  223. package/dist/src/session/search-index.d.ts +2 -0
  224. package/dist/src/session/search-index.js +30 -2
  225. package/dist/src/session/search-index.js.map +1 -1
  226. package/dist/src/session/session-context-for-llm.d.ts +32 -0
  227. package/dist/src/session/session-context-for-llm.js +60 -0
  228. package/dist/src/session/session-context-for-llm.js.map +1 -0
  229. package/dist/src/session/store.d.ts +53 -2
  230. package/dist/src/session/store.js +427 -145
  231. package/dist/src/session/store.js.map +1 -1
  232. package/dist/src/session/strip-webchat-early-save.d.ts +5 -0
  233. package/dist/src/session/strip-webchat-early-save.js +17 -0
  234. package/dist/src/session/strip-webchat-early-save.js.map +1 -0
  235. package/dist/src/session/transcript-format.d.ts +46 -0
  236. package/dist/src/session/transcript-format.js +88 -0
  237. package/dist/src/session/transcript-format.js.map +1 -0
  238. package/dist/src/session/types.d.ts +37 -0
  239. package/dist/src/session/types.js.map +1 -1
  240. package/dist/src/utils/logger/log-store.js +4 -3
  241. package/dist/src/utils/logger/log-store.js.map +1 -1
  242. package/dist/src/voice/tts/merge-config.js +0 -1
  243. package/dist/src/voice/tts/merge-config.js.map +1 -1
  244. package/dist/src/voice/tts/service.js +1 -2
  245. package/dist/src/voice/tts/service.js.map +1 -1
  246. package/package.json +1 -1
  247. package/skills/business/company-values/SKILL-zh.md +80 -0
  248. package/skills/business/company-values/SKILL.md +80 -0
  249. package/skills/business/find-community/SKILL-zh.md +50 -0
  250. package/skills/business/find-community/SKILL.md +50 -0
  251. package/skills/business/first-customers/SKILL-zh.md +76 -0
  252. package/skills/business/first-customers/SKILL.md +76 -0
  253. package/skills/business/grow-sustainably/SKILL-zh.md +92 -0
  254. package/skills/business/grow-sustainably/SKILL.md +92 -0
  255. package/skills/business/marketing-plan/SKILL-zh.md +100 -0
  256. package/skills/business/marketing-plan/SKILL.md +100 -0
  257. package/skills/business/minimalist-review/SKILL-zh.md +82 -0
  258. package/skills/business/minimalist-review/SKILL.md +82 -0
  259. package/skills/business/mvp/SKILL-zh.md +81 -0
  260. package/skills/business/mvp/SKILL.md +81 -0
  261. package/skills/business/pricing/SKILL-zh.md +64 -0
  262. package/skills/business/pricing/SKILL.md +64 -0
  263. package/skills/business/processize/SKILL-zh.md +91 -0
  264. package/skills/business/processize/SKILL.md +91 -0
  265. package/skills/business/validate-idea/SKILL-zh.md +68 -0
  266. package/skills/business/validate-idea/SKILL.md +68 -0
  267. package/skills/{skill-creator → creative/algorithmic-art}/LICENSE.txt +1 -1
  268. package/skills/creative/algorithmic-art/SKILL-zh.md +405 -0
  269. package/skills/creative/algorithmic-art/SKILL.md +405 -0
  270. package/skills/creative/algorithmic-art/templates/generator_template.js +223 -0
  271. package/skills/creative/algorithmic-art/templates/viewer.html +599 -0
  272. package/skills/creative/canvas-design/LICENSE.txt +202 -0
  273. package/skills/creative/canvas-design/SKILL-zh.md +130 -0
  274. package/skills/creative/canvas-design/SKILL.md +130 -0
  275. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +93 -0
  276. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  277. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  278. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +93 -0
  279. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  280. package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +93 -0
  281. package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  282. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  283. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +93 -0
  284. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  285. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  286. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  287. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +93 -0
  288. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  289. package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +93 -0
  290. package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  291. package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +94 -0
  292. package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  293. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  294. package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +93 -0
  295. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  296. package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +93 -0
  297. package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  298. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  299. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +93 -0
  300. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  301. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  302. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  303. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  304. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  305. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  306. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  307. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  308. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +93 -0
  309. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  310. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  311. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  312. package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +93 -0
  313. package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  314. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  315. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +93 -0
  316. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  317. package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  318. package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  319. package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +93 -0
  320. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +93 -0
  321. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  322. package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  323. package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  324. package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  325. package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +93 -0
  326. package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  327. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  328. package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +93 -0
  329. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  330. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +93 -0
  331. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  332. package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  333. package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +93 -0
  334. package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  335. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  336. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +93 -0
  337. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +93 -0
  338. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  339. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  340. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +93 -0
  341. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  342. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +93 -0
  343. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  344. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  345. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +93 -0
  346. package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  347. package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +93 -0
  348. package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  349. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  350. package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  351. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  352. package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +93 -0
  353. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  354. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +93 -0
  355. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
  356. package/skills/creative/frontend-design/LICENSE.txt +177 -0
  357. package/skills/creative/frontend-design/SKILL-zh.md +42 -0
  358. package/skills/creative/frontend-design/SKILL.md +42 -0
  359. package/skills/creative/theme-factory/LICENSE.txt +202 -0
  360. package/skills/creative/theme-factory/SKILL-zh.md +59 -0
  361. package/skills/creative/theme-factory/SKILL.md +59 -0
  362. package/skills/creative/theme-factory/theme-showcase.pdf +0 -0
  363. package/skills/creative/theme-factory/themes/arctic-frost.md +19 -0
  364. package/skills/creative/theme-factory/themes/botanical-garden.md +19 -0
  365. package/skills/creative/theme-factory/themes/desert-rose.md +19 -0
  366. package/skills/creative/theme-factory/themes/forest-canopy.md +19 -0
  367. package/skills/creative/theme-factory/themes/golden-hour.md +19 -0
  368. package/skills/creative/theme-factory/themes/midnight-galaxy.md +19 -0
  369. package/skills/creative/theme-factory/themes/modern-minimalist.md +19 -0
  370. package/skills/creative/theme-factory/themes/ocean-depths.md +19 -0
  371. package/skills/creative/theme-factory/themes/sunset-boulevard.md +19 -0
  372. package/skills/creative/theme-factory/themes/tech-innovation.md +19 -0
  373. package/skills/creative/web-artifacts-builder/LICENSE.txt +202 -0
  374. package/skills/creative/web-artifacts-builder/SKILL-zh.md +74 -0
  375. package/skills/creative/web-artifacts-builder/SKILL.md +74 -0
  376. package/skills/creative/web-artifacts-builder/scripts/bundle-artifact.sh +54 -0
  377. package/skills/creative/web-artifacts-builder/scripts/init-artifact.sh +322 -0
  378. package/skills/creative/web-artifacts-builder/scripts/shadcn-components.tar.gz +0 -0
  379. package/skills/documents/doc-coauthoring/SKILL-zh.md +375 -0
  380. package/skills/documents/doc-coauthoring/SKILL.md +375 -0
  381. package/skills/documents/docx/SKILL-zh.md +590 -0
  382. package/skills/{docx → documents/docx}/SKILL.md +11 -11
  383. package/skills/{docx → documents/docx}/scripts/comment.py +2 -2
  384. package/skills/{docx → documents/docx}/scripts/office/helpers/simplify_redlines.py +1 -1
  385. package/skills/{docx → documents/docx}/scripts/office/pack.py +2 -2
  386. package/skills/{xlsx → documents/docx}/scripts/office/validate.py +2 -2
  387. package/skills/{xlsx → documents/docx}/scripts/office/validators/redlining.py +1 -1
  388. package/skills/documents/pdf/SKILL-zh.md +314 -0
  389. package/skills/documents/pptx/SKILL-zh.md +232 -0
  390. package/skills/{pptx → documents/pptx}/editing.md +3 -3
  391. package/skills/{pptx → documents/pptx}/scripts/office/helpers/simplify_redlines.py +1 -1
  392. package/skills/{xlsx → documents/pptx}/scripts/office/pack.py +2 -2
  393. package/skills/{pptx → documents/pptx}/scripts/office/validate.py +2 -2
  394. package/skills/{docx → documents/pptx}/scripts/office/validators/redlining.py +1 -1
  395. package/skills/documents/xlsx/SKILL-zh.md +292 -0
  396. package/skills/{xlsx → documents/xlsx}/scripts/office/helpers/simplify_redlines.py +1 -1
  397. package/skills/{pptx → documents/xlsx}/scripts/office/pack.py +2 -2
  398. package/skills/{docx → documents/xlsx}/scripts/office/validate.py +2 -2
  399. package/skills/{pptx → documents/xlsx}/scripts/office/validators/redlining.py +1 -1
  400. package/skills/meta/skill-creator/LICENSE.txt +202 -0
  401. package/skills/meta/skill-creator/SKILL-zh.md +483 -0
  402. package/skills/{skill-creator → meta/skill-creator}/SKILL.md +0 -1
  403. package/skills/tools/find-skills/SKILL-zh.md +440 -0
  404. package/skills/tools/github/SKILL-zh.md +48 -0
  405. package/skills/tools/internal-comms/LICENSE.txt +202 -0
  406. package/skills/tools/internal-comms/SKILL-zh.md +32 -0
  407. package/skills/tools/internal-comms/SKILL.md +32 -0
  408. package/skills/tools/internal-comms/examples/3p-updates.md +47 -0
  409. package/skills/tools/internal-comms/examples/company-newsletter.md +65 -0
  410. package/skills/tools/internal-comms/examples/faq-answers.md +30 -0
  411. package/skills/tools/internal-comms/examples/general-comms.md +16 -0
  412. package/skills/tools/summarize/SKILL-zh.md +47 -0
  413. package/skills/tools/weather/SKILL-zh.md +46 -0
  414. package/skills/tools/webapp-testing/LICENSE.txt +202 -0
  415. package/skills/tools/webapp-testing/SKILL-zh.md +96 -0
  416. package/skills/tools/webapp-testing/SKILL.md +96 -0
  417. package/skills/tools/webapp-testing/examples/console_logging.py +35 -0
  418. package/skills/tools/webapp-testing/examples/element_discovery.py +40 -0
  419. package/skills/tools/webapp-testing/examples/static_html_automation.py +33 -0
  420. package/skills/tools/webapp-testing/scripts/with_server.py +106 -0
  421. package/dist/gateway/static/root/assets/agents-CkgFSiCY.js +0 -216
  422. package/dist/gateway/static/root/assets/agents-CkgFSiCY.js.map +0 -1
  423. package/dist/gateway/static/root/assets/channels-settings-CE7jrdkO.js +0 -9
  424. package/dist/gateway/static/root/assets/channels-settings-CE7jrdkO.js.map +0 -1
  425. package/dist/gateway/static/root/assets/cron-page-BpPPcykJ.js +0 -2
  426. package/dist/gateway/static/root/assets/cron-page-BpPPcykJ.js.map +0 -1
  427. package/dist/gateway/static/root/assets/cron-utils-N1PqD2DB.js +0 -3
  428. package/dist/gateway/static/root/assets/cron-utils-N1PqD2DB.js.map +0 -1
  429. package/dist/gateway/static/root/assets/dist--p2HQ2QF.js +0 -2
  430. package/dist/gateway/static/root/assets/index-Dnfha4O2.css +0 -1
  431. package/dist/gateway/static/root/assets/logs-page-CQwdV_Xw.js +0 -2
  432. package/dist/gateway/static/root/assets/logs-page-CQwdV_Xw.js.map +0 -1
  433. package/dist/gateway/static/root/assets/sessions-page-Be5kIGl_.js +0 -2
  434. package/dist/gateway/static/root/assets/settings-page-PodSlNwr.js +0 -2
  435. package/dist/gateway/static/root/assets/settings-page-PodSlNwr.js.map +0 -1
  436. package/dist/gateway/static/root/assets/skills-page-Clg8deH0.js +0 -3
  437. package/dist/gateway/static/root/assets/skills-page-Clg8deH0.js.map +0 -1
  438. package/dist/src/agent/skills/skills-store-client.d.ts +0 -66
  439. package/dist/src/agent/skills/skills-store-client.js.map +0 -1
  440. package/dist/src/stt/index.d.ts +0 -1
  441. package/dist/src/stt/index.js +0 -8
  442. /package/skills/{docx → documents/docx}/LICENSE.txt +0 -0
  443. /package/skills/{docx → documents/docx}/scripts/__init__.py +0 -0
  444. /package/skills/{docx → documents/docx}/scripts/accept_changes.py +0 -0
  445. /package/skills/{docx → documents/docx}/scripts/office/helpers/__init__.py +0 -0
  446. /package/skills/{docx → documents/docx}/scripts/office/helpers/merge_runs.py +0 -0
  447. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
  448. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
  449. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
  450. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
  451. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
  452. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
  453. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
  454. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
  455. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
  456. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
  457. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
  458. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
  459. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
  460. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
  461. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
  462. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
  463. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
  464. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
  465. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
  466. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
  467. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
  468. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
  469. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
  470. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
  471. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
  472. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
  473. /package/skills/{docx → documents/docx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
  474. /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
  475. /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
  476. /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
  477. /package/skills/{docx → documents/docx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
  478. /package/skills/{docx → documents/docx}/scripts/office/schemas/mce/mc.xsd +0 -0
  479. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
  480. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
  481. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
  482. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
  483. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
  484. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
  485. /package/skills/{docx → documents/docx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
  486. /package/skills/{docx → documents/docx}/scripts/office/soffice.py +0 -0
  487. /package/skills/{docx → documents/docx}/scripts/office/unpack.py +0 -0
  488. /package/skills/{docx → documents/docx}/scripts/office/validators/__init__.py +0 -0
  489. /package/skills/{docx → documents/docx}/scripts/office/validators/base.py +0 -0
  490. /package/skills/{docx → documents/docx}/scripts/office/validators/docx.py +0 -0
  491. /package/skills/{docx → documents/docx}/scripts/office/validators/pptx.py +0 -0
  492. /package/skills/{docx → documents/docx}/scripts/templates/comments.xml +0 -0
  493. /package/skills/{docx → documents/docx}/scripts/templates/commentsExtended.xml +0 -0
  494. /package/skills/{docx → documents/docx}/scripts/templates/commentsExtensible.xml +0 -0
  495. /package/skills/{docx → documents/docx}/scripts/templates/commentsIds.xml +0 -0
  496. /package/skills/{docx → documents/docx}/scripts/templates/people.xml +0 -0
  497. /package/skills/{pdf → documents/pdf}/LICENSE.txt +0 -0
  498. /package/skills/{pdf → documents/pdf}/SKILL.md +0 -0
  499. /package/skills/{pdf → documents/pdf}/forms.md +0 -0
  500. /package/skills/{pdf → documents/pdf}/reference.md +0 -0
  501. /package/skills/{pdf → documents/pdf}/scripts/check_bounding_boxes.py +0 -0
  502. /package/skills/{pdf → documents/pdf}/scripts/check_fillable_fields.py +0 -0
  503. /package/skills/{pdf → documents/pdf}/scripts/convert_pdf_to_images.py +0 -0
  504. /package/skills/{pdf → documents/pdf}/scripts/create_validation_image.py +0 -0
  505. /package/skills/{pdf → documents/pdf}/scripts/extract_form_field_info.py +0 -0
  506. /package/skills/{pdf → documents/pdf}/scripts/extract_form_structure.py +0 -0
  507. /package/skills/{pdf → documents/pdf}/scripts/fill_fillable_fields.py +0 -0
  508. /package/skills/{pdf → documents/pdf}/scripts/fill_pdf_form_with_annotations.py +0 -0
  509. /package/skills/{pptx → documents/pptx}/LICENSE.txt +0 -0
  510. /package/skills/{pptx → documents/pptx}/SKILL.md +0 -0
  511. /package/skills/{pptx → documents/pptx}/pptxgenjs.md +0 -0
  512. /package/skills/{pptx → documents/pptx}/scripts/__init__.py +0 -0
  513. /package/skills/{pptx → documents/pptx}/scripts/add_slide.py +0 -0
  514. /package/skills/{pptx → documents/pptx}/scripts/clean.py +0 -0
  515. /package/skills/{pptx → documents/pptx}/scripts/office/helpers/__init__.py +0 -0
  516. /package/skills/{pptx → documents/pptx}/scripts/office/helpers/merge_runs.py +0 -0
  517. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
  518. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
  519. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
  520. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
  521. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
  522. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
  523. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
  524. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
  525. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
  526. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
  527. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
  528. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
  529. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
  530. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
  531. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
  532. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
  533. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
  534. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
  535. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
  536. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
  537. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
  538. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
  539. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
  540. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
  541. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
  542. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
  543. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
  544. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
  545. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
  546. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
  547. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
  548. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/mce/mc.xsd +0 -0
  549. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
  550. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
  551. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
  552. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
  553. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
  554. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
  555. /package/skills/{pptx → documents/pptx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
  556. /package/skills/{pptx → documents/pptx}/scripts/office/soffice.py +0 -0
  557. /package/skills/{pptx → documents/pptx}/scripts/office/unpack.py +0 -0
  558. /package/skills/{pptx → documents/pptx}/scripts/office/validators/__init__.py +0 -0
  559. /package/skills/{pptx → documents/pptx}/scripts/office/validators/base.py +0 -0
  560. /package/skills/{pptx → documents/pptx}/scripts/office/validators/docx.py +0 -0
  561. /package/skills/{pptx → documents/pptx}/scripts/office/validators/pptx.py +0 -0
  562. /package/skills/{pptx → documents/pptx}/scripts/thumbnail.py +0 -0
  563. /package/skills/{xlsx → documents/xlsx}/LICENSE.txt +0 -0
  564. /package/skills/{xlsx → documents/xlsx}/SKILL.md +0 -0
  565. /package/skills/{skill-creator/scripts → documents/xlsx/scripts/office/helpers}/__init__.py +0 -0
  566. /package/skills/{xlsx → documents/xlsx}/scripts/office/helpers/merge_runs.py +0 -0
  567. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +0 -0
  568. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +0 -0
  569. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +0 -0
  570. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +0 -0
  571. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-main.xsd +0 -0
  572. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +0 -0
  573. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +0 -0
  574. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +0 -0
  575. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/pml.xsd +0 -0
  576. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +0 -0
  577. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +0 -0
  578. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +0 -0
  579. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +0 -0
  580. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +0 -0
  581. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +0 -0
  582. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +0 -0
  583. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +0 -0
  584. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-math.xsd +0 -0
  585. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +0 -0
  586. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/sml.xsd +0 -0
  587. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-main.xsd +0 -0
  588. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +0 -0
  589. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +0 -0
  590. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +0 -0
  591. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +0 -0
  592. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/wml.xsd +0 -0
  593. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ISO-IEC29500-4_2016/xml.xsd +0 -0
  594. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-contentTypes.xsd +0 -0
  595. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-coreProperties.xsd +0 -0
  596. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-digSig.xsd +0 -0
  597. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/ecma/fouth-edition/opc-relationships.xsd +0 -0
  598. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/mce/mc.xsd +0 -0
  599. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2010.xsd +0 -0
  600. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2012.xsd +0 -0
  601. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-2018.xsd +0 -0
  602. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-cex-2018.xsd +0 -0
  603. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-cid-2016.xsd +0 -0
  604. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-sdtdatahash-2020.xsd +0 -0
  605. /package/skills/{xlsx → documents/xlsx}/scripts/office/schemas/microsoft/wml-symex-2015.xsd +0 -0
  606. /package/skills/{xlsx → documents/xlsx}/scripts/office/soffice.py +0 -0
  607. /package/skills/{xlsx → documents/xlsx}/scripts/office/unpack.py +0 -0
  608. /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/__init__.py +0 -0
  609. /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/base.py +0 -0
  610. /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/docx.py +0 -0
  611. /package/skills/{xlsx → documents/xlsx}/scripts/office/validators/pptx.py +0 -0
  612. /package/skills/{xlsx → documents/xlsx}/scripts/recalc.py +0 -0
  613. /package/skills/{skill-creator → meta/skill-creator}/agents/analyzer.md +0 -0
  614. /package/skills/{skill-creator → meta/skill-creator}/agents/comparator.md +0 -0
  615. /package/skills/{skill-creator → meta/skill-creator}/agents/grader.md +0 -0
  616. /package/skills/{skill-creator → meta/skill-creator}/assets/eval_review.html +0 -0
  617. /package/skills/{skill-creator → meta/skill-creator}/eval-viewer/generate_review.py +0 -0
  618. /package/skills/{skill-creator → meta/skill-creator}/eval-viewer/viewer.html +0 -0
  619. /package/skills/{skill-creator → meta/skill-creator}/references/schemas.md +0 -0
  620. /package/skills/{xlsx/scripts/office/helpers → meta/skill-creator/scripts}/__init__.py +0 -0
  621. /package/skills/{skill-creator → meta/skill-creator}/scripts/aggregate_benchmark.py +0 -0
  622. /package/skills/{skill-creator → meta/skill-creator}/scripts/generate_report.py +0 -0
  623. /package/skills/{skill-creator → meta/skill-creator}/scripts/improve_description.py +0 -0
  624. /package/skills/{skill-creator → meta/skill-creator}/scripts/package_skill.py +0 -0
  625. /package/skills/{skill-creator → meta/skill-creator}/scripts/quick_validate.py +0 -0
  626. /package/skills/{skill-creator → meta/skill-creator}/scripts/run_eval.py +0 -0
  627. /package/skills/{skill-creator → meta/skill-creator}/scripts/run_loop.py +0 -0
  628. /package/skills/{skill-creator → meta/skill-creator}/scripts/utils.py +0 -0
  629. /package/skills/{find-skills → tools/find-skills}/SKILL.md +0 -0
  630. /package/skills/{github → tools/github}/SKILL.md +0 -0
  631. /package/skills/{summarize → tools/summarize}/SKILL.md +0 -0
  632. /package/skills/{weather → tools/weather}/SKILL.md +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"format-skills-prompt.js","names":[],"sources":["../../../../src/agent/skills/format-skills-prompt.ts"],"sourcesContent":["/**\n * Build `<available_skills>` XML block for the system prompt.\n */\n\nimport { isSkillEnabled } from './config.js';\nimport { skillVisibleForRegisteredTools } from './skill-tool-gating.js';\nimport type { Skill } from './types.js';\nimport type { SkillsConfig } from './types.js';\n\nexport interface FormatSkillsForPromptOptions {\n skillAllowlist?: string[];\n /** When set (including empty array), applies tool gating from skill frontmatter. */\n registeredToolNames?: string[];\n}\n\nexport function selectSkillsVisibleInPrompt(\n skills: Skill[],\n skillsConfig?: SkillsConfig,\n options?: FormatSkillsForPromptOptions,\n): Skill[] {\n let list = skills;\n\n if (options?.skillAllowlist?.length) {\n const allow = new Set(options.skillAllowlist.map((s) => s.toLowerCase()));\n list = list.filter((s) => allow.has(s.name.toLowerCase()));\n } else if (options?.skillAllowlist?.length === 0) {\n return [];\n }\n\n list = list.filter((s) => !s.disableModelInvocation && isSkillEnabled(s, skillsConfig));\n\n if (skillsConfig?.toolGating !== false && options?.registeredToolNames !== undefined) {\n const at = new Set(options.registeredToolNames);\n list = list.filter((s) => skillVisibleForRegisteredTools(s, at));\n }\n\n return list;\n}\n\n/** Default matches Hermes-style progressive disclosure (no paths in the system prompt). */\nexport function effectiveSkillsPromptStyle(skillsConfig?: SkillsConfig): 'metadata-only' | 'legacy-with-paths' {\n return skillsConfig?.promptStyle === 'legacy-with-paths' ? 'legacy-with-paths' : 'metadata-only';\n}\n\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n}\n\nfunction formatSkillXmlLegacy(skill: Skill): string {\n const emoji = skill.metadata.emoji || '';\n const emojiStr = emoji ? `${emoji} ` : '';\n\n return [\n ' <skill>',\n ` <name>${escapeXml(skill.name)}</name>`,\n ` <description>${emojiStr}${escapeXml(skill.description)}</description>`,\n ` <location>${escapeXml(skill.filePath)}</location>`,\n ' </skill>',\n ].join('\\n');\n}\n\nfunction formatSkillXmlMetadataOnly(skill: Skill): string {\n const emoji = skill.metadata.emoji || '';\n const emojiStr = emoji ? `${emoji} ` : '';\n\n return [\n ' <skill>',\n ` <name>${escapeXml(skill.name)}</name>`,\n ` <description>${emojiStr}${escapeXml(skill.description)}</description>`,\n ' </skill>',\n ].join('\\n');\n}\n\nexport function formatSkillsForPrompt(\n skills: Skill[],\n skillsConfig?: SkillsConfig,\n options?: FormatSkillsForPromptOptions,\n): string {\n const visibleSkills = selectSkillsVisibleInPrompt(skills, skillsConfig, options);\n if (visibleSkills.length === 0) return '';\n\n const style = effectiveSkillsPromptStyle(skillsConfig);\n const lines =\n style === 'legacy-with-paths'\n ? [\n '\\n\\n<available_skills>',\n 'Skills are folders of instructions, scripts, and resources.',\n 'Use the read tool to load a skill\\'s file when the task matches its description.',\n '',\n ]\n : [\n '\\n\\n<available_skills>',\n 'Skills are folders of instructions, scripts, and resources.',\n 'Use skills_list to browse; use skill_view(name) for SKILL.md or skill_view(name, path) for references/, templates/, scripts/, or assets/.',\n '',\n ];\n\n for (const skill of visibleSkills) {\n lines.push(\n style === 'legacy-with-paths' ? formatSkillXmlLegacy(skill) : formatSkillXmlMetadataOnly(skill),\n );\n }\n\n lines.push('</available_skills>');\n return lines.join('\\n');\n}\n"],"mappings":";;;;;;AAeA,SAAgB,4BACd,QACA,cACA,SACS;CACT,IAAI,OAAO;AAEX,KAAI,SAAS,gBAAgB,QAAQ;EACnC,MAAM,QAAQ,IAAI,IAAI,QAAQ,eAAe,KAAK,MAAM,EAAE,aAAa,CAAC,CAAC;AACzE,SAAO,KAAK,QAAQ,MAAM,MAAM,IAAI,EAAE,KAAK,aAAa,CAAC,CAAC;YACjD,SAAS,gBAAgB,WAAW,EAC7C,QAAO,EAAE;AAGX,QAAO,KAAK,QAAQ,MAAM,CAAC,EAAE,0BAA0B,eAAe,GAAG,aAAa,CAAC;AAEvF,KAAI,cAAc,eAAe,SAAS,SAAS,wBAAwB,KAAA,GAAW;EACpF,MAAM,KAAK,IAAI,IAAI,QAAQ,oBAAoB;AAC/C,SAAO,KAAK,QAAQ,MAAM,+BAA+B,GAAG,GAAG,CAAC;;AAGlE,QAAO;;;AAIT,SAAgB,2BAA2B,cAAoE;AAC7G,QAAO,cAAc,gBAAgB,sBAAsB,sBAAsB;;AAGnF,SAAS,UAAU,KAAqB;AACtC,QAAO,IACJ,QAAQ,MAAM,QAAQ,CACtB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,SAAS,CACvB,QAAQ,MAAM,SAAS;;AAG5B,SAAS,qBAAqB,OAAsB;CAClD,MAAM,QAAQ,MAAM,SAAS,SAAS;CACtC,MAAM,WAAW,QAAQ,GAAG,MAAM,KAAK;AAEvC,QAAO;EACL;EACA,aAAa,UAAU,MAAM,KAAK,CAAC;EACnC,oBAAoB,WAAW,UAAU,MAAM,YAAY,CAAC;EAC5D,iBAAiB,UAAU,MAAM,SAAS,CAAC;EAC3C;EACD,CAAC,KAAK,KAAK;;AAGd,SAAS,2BAA2B,OAAsB;CACxD,MAAM,QAAQ,MAAM,SAAS,SAAS;CACtC,MAAM,WAAW,QAAQ,GAAG,MAAM,KAAK;AAEvC,QAAO;EACL;EACA,aAAa,UAAU,MAAM,KAAK,CAAC;EACnC,oBAAoB,WAAW,UAAU,MAAM,YAAY,CAAC;EAC5D;EACD,CAAC,KAAK,KAAK;;AAGd,SAAgB,sBACd,QACA,cACA,SACQ;CACR,MAAM,gBAAgB,4BAA4B,QAAQ,cAAc,QAAQ;AAChF,KAAI,cAAc,WAAW,EAAG,QAAO;CAEvC,MAAM,QAAQ,2BAA2B,aAAa;CACtD,MAAM,QACJ,UAAU,sBACN;EACE;EACA;EACA;EACA;EACD,GACD;EACE;EACA;EACA;EACA;EACD;AAEP,MAAK,MAAM,SAAS,cAClB,OAAM,KACJ,UAAU,sBAAsB,qBAAqB,MAAM,GAAG,2BAA2B,MAAM,CAChG;AAGH,OAAM,KAAK,sBAAsB;AACjC,QAAO,MAAM,KAAK,KAAK"}
1
+ {"version":3,"file":"format-skills-prompt.js","names":[],"sources":["../../../../src/agent/skills/format-skills-prompt.ts"],"sourcesContent":["/**\n * Build `<available_skills>` XML block for the system prompt.\n */\n\nimport { isSkillEnabled } from './config.js';\nimport { skillVisibleForRegisteredTools } from './skill-tool-gating.js';\nimport type { Skill } from './types.js';\nimport type { SkillsConfig } from './types.js';\n\nexport interface FormatSkillsForPromptOptions {\n skillAllowlist?: string[];\n /** When set (including empty array), applies tool gating from skill frontmatter. */\n registeredToolNames?: string[];\n}\n\nexport function selectSkillsVisibleInPrompt(\n skills: Skill[],\n skillsConfig?: SkillsConfig,\n options?: FormatSkillsForPromptOptions,\n): Skill[] {\n let list = skills;\n\n if (options?.skillAllowlist?.length) {\n const allow = new Set(options.skillAllowlist.map((s) => s.toLowerCase()));\n list = list.filter((s) => allow.has(s.name.toLowerCase()));\n } else if (options?.skillAllowlist?.length === 0) {\n return [];\n }\n\n list = list.filter((s) => !s.disableModelInvocation && isSkillEnabled(s, skillsConfig));\n\n if (skillsConfig?.toolGating !== false && options?.registeredToolNames !== undefined) {\n const at = new Set(options.registeredToolNames);\n list = list.filter((s) => skillVisibleForRegisteredTools(s, at));\n }\n\n return list;\n}\n\nfunction escapeXml(str: string): string {\n return str\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n}\n\nfunction formatSkillXmlMetadataOnly(skill: Skill): string {\n const emoji = skill.metadata.emoji || '';\n const emojiStr = emoji ? `${emoji} ` : '';\n\n return [\n ' <skill>',\n ` <name>${escapeXml(skill.name)}</name>`,\n ` <description>${emojiStr}${escapeXml(skill.description)}</description>`,\n ' </skill>',\n ].join('\\n');\n}\n\nexport function formatSkillsForPrompt(\n skills: Skill[],\n skillsConfig?: SkillsConfig,\n options?: FormatSkillsForPromptOptions,\n): string {\n const visibleSkills = selectSkillsVisibleInPrompt(skills, skillsConfig, options);\n if (visibleSkills.length === 0) return '';\n\n const lines = [\n '\\n\\n<available_skills>',\n 'Skills are folders of instructions, scripts, and resources.',\n 'Use skills_list to browse; use skill_view(name) for SKILL.md or skill_view(name, path) for references/, templates/, scripts/, or assets/.',\n '',\n ];\n\n for (const skill of visibleSkills) {\n lines.push(formatSkillXmlMetadataOnly(skill));\n }\n\n lines.push('</available_skills>');\n return lines.join('\\n');\n}\n"],"mappings":";;;;;;AAeA,SAAgB,4BACd,QACA,cACA,SACS;CACT,IAAI,OAAO;AAEX,KAAI,SAAS,gBAAgB,QAAQ;EACnC,MAAM,QAAQ,IAAI,IAAI,QAAQ,eAAe,KAAK,MAAM,EAAE,aAAa,CAAC,CAAC;AACzE,SAAO,KAAK,QAAQ,MAAM,MAAM,IAAI,EAAE,KAAK,aAAa,CAAC,CAAC;YACjD,SAAS,gBAAgB,WAAW,EAC7C,QAAO,EAAE;AAGX,QAAO,KAAK,QAAQ,MAAM,CAAC,EAAE,0BAA0B,eAAe,GAAG,aAAa,CAAC;AAEvF,KAAI,cAAc,eAAe,SAAS,SAAS,wBAAwB,KAAA,GAAW;EACpF,MAAM,KAAK,IAAI,IAAI,QAAQ,oBAAoB;AAC/C,SAAO,KAAK,QAAQ,MAAM,+BAA+B,GAAG,GAAG,CAAC;;AAGlE,QAAO;;AAGT,SAAS,UAAU,KAAqB;AACtC,QAAO,IACJ,QAAQ,MAAM,QAAQ,CACtB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,SAAS,CACvB,QAAQ,MAAM,SAAS;;AAG5B,SAAS,2BAA2B,OAAsB;CACxD,MAAM,QAAQ,MAAM,SAAS,SAAS;CACtC,MAAM,WAAW,QAAQ,GAAG,MAAM,KAAK;AAEvC,QAAO;EACL;EACA,aAAa,UAAU,MAAM,KAAK,CAAC;EACnC,oBAAoB,WAAW,UAAU,MAAM,YAAY,CAAC;EAC5D;EACD,CAAC,KAAK,KAAK;;AAGd,SAAgB,sBACd,QACA,cACA,SACQ;CACR,MAAM,gBAAgB,4BAA4B,QAAQ,cAAc,QAAQ;AAChF,KAAI,cAAc,WAAW,EAAG,QAAO;CAEvC,MAAM,QAAQ;EACZ;EACA;EACA;EACA;EACD;AAED,MAAK,MAAM,SAAS,cAClB,OAAM,KAAK,2BAA2B,MAAM,CAAC;AAG/C,OAAM,KAAK,sBAAsB;AACjC,QAAO,MAAM,KAAK,KAAK"}
@@ -1,11 +1,12 @@
1
1
  import { init_paths, resolveSkillsLockPath } from "../../config/paths.js";
2
- import { dirname } from "node:path";
3
- import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
3
+ import { existsSync, readFileSync } from "node:fs";
4
4
  //#region src/agent/skills/hub-lock.ts
5
5
  /**
6
6
  * Skills hub lock (~/.xopc/skills-lock.json): records install source + tree hash per managed skill id.
7
7
  */
8
8
  init_paths();
9
+ init_write_file_atomic();
9
10
  function emptyLock() {
10
11
  return {
11
12
  version: 1,
@@ -28,9 +29,7 @@ function loadSkillsLock() {
28
29
  }
29
30
  }
30
31
  function saveSkillsLock(lock) {
31
- const p = resolveSkillsLockPath();
32
- mkdirSync(dirname(p), { recursive: true });
33
- writeFileSync(p, `${JSON.stringify(lock, null, 2)}\n`, "utf-8");
32
+ writeTextAtomicSync(resolveSkillsLockPath(), `${JSON.stringify(lock, null, 2)}\n`);
34
33
  }
35
34
  /** Record or replace hub metadata for a managed skill directory id (folder name under ~/.xopc/skills). */
36
35
  function recordSkillsHubInstall(skillId, meta, contentHash) {
@@ -1 +1 @@
1
- {"version":3,"file":"hub-lock.js","names":[],"sources":["../../../../src/agent/skills/hub-lock.ts"],"sourcesContent":["/**\n * Skills hub lock (~/.xopc/skills-lock.json): records install source + tree hash per managed skill id.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { dirname } from 'node:path';\n\nimport { resolveSkillsLockPath } from '../../config/paths.js';\n\nexport type SkillHubKind = 'git' | 'archive';\n\nexport interface SkillHubLockEntry {\n kind: SkillHubKind;\n /** Clone URL, tarball URL, or file path (as given at install time). */\n source: string;\n /** Git branch / tag / ref (optional). */\n ref?: string;\n /** Path inside the cloned repo (POSIX, no leading slash). */\n subpath?: string;\n /** Deterministic tree hash from {@link computeSkillTreeHash}. */\n contentHash: string;\n installedAt: string;\n updatedAt: string;\n}\n\nexport interface SkillsLockFile {\n version: 1;\n entries: Record<string, SkillHubLockEntry>;\n}\n\nfunction emptyLock(): SkillsLockFile {\n return { version: 1, entries: {} };\n}\n\nexport function loadSkillsLock(): SkillsLockFile {\n const p = resolveSkillsLockPath();\n if (!existsSync(p)) return emptyLock();\n try {\n const raw = readFileSync(p, 'utf-8');\n const j = JSON.parse(raw) as Partial<SkillsLockFile>;\n if (j.version !== 1 || !j.entries || typeof j.entries !== 'object') {\n return emptyLock();\n }\n return { version: 1, entries: { ...j.entries } };\n } catch {\n return emptyLock();\n }\n}\n\nexport function saveSkillsLock(lock: SkillsLockFile): void {\n const p = resolveSkillsLockPath();\n mkdirSync(dirname(p), { recursive: true });\n writeFileSync(p, `${JSON.stringify(lock, null, 2)}\\n`, 'utf-8');\n}\n\n/** Record or replace hub metadata for a managed skill directory id (folder name under ~/.xopc/skills). */\nexport function recordSkillsHubInstall(\n skillId: string,\n meta: Pick<SkillHubLockEntry, 'kind' | 'source' | 'ref' | 'subpath'>,\n contentHash: string,\n): void {\n const lock = loadSkillsLock();\n const now = new Date().toISOString();\n const prev = lock.entries[skillId];\n lock.entries[skillId] = {\n kind: meta.kind,\n source: meta.source,\n ref: meta.ref,\n subpath: meta.subpath,\n contentHash,\n installedAt: prev?.installedAt ?? now,\n updatedAt: now,\n };\n saveSkillsLock(lock);\n}\n\nexport function removeSkillsLockEntry(skillId: string): void {\n const lock = loadSkillsLock();\n if (!lock.entries[skillId]) return;\n delete lock.entries[skillId];\n saveSkillsLock(lock);\n}\n\nexport function getSkillsLockEntry(skillId: string): SkillHubLockEntry | undefined {\n return loadSkillsLock().entries[skillId];\n}\n"],"mappings":";;;;;;;YAO8D;AAuB9D,SAAS,YAA4B;AACnC,QAAO;EAAE,SAAS;EAAG,SAAS,EAAE;EAAE;;AAGpC,SAAgB,iBAAiC;CAC/C,MAAM,IAAI,uBAAuB;AACjC,KAAI,CAAC,WAAW,EAAE,CAAE,QAAO,WAAW;AACtC,KAAI;EACF,MAAM,MAAM,aAAa,GAAG,QAAQ;EACpC,MAAM,IAAI,KAAK,MAAM,IAAI;AACzB,MAAI,EAAE,YAAY,KAAK,CAAC,EAAE,WAAW,OAAO,EAAE,YAAY,SACxD,QAAO,WAAW;AAEpB,SAAO;GAAE,SAAS;GAAG,SAAS,EAAE,GAAG,EAAE,SAAS;GAAE;SAC1C;AACN,SAAO,WAAW;;;AAItB,SAAgB,eAAe,MAA4B;CACzD,MAAM,IAAI,uBAAuB;AACjC,WAAU,QAAQ,EAAE,EAAE,EAAE,WAAW,MAAM,CAAC;AAC1C,eAAc,GAAG,GAAG,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC,KAAK,QAAQ;;;AAIjE,SAAgB,uBACd,SACA,MACA,aACM;CACN,MAAM,OAAO,gBAAgB;CAC7B,MAAM,uBAAM,IAAI,MAAM,EAAC,aAAa;CACpC,MAAM,OAAO,KAAK,QAAQ;AAC1B,MAAK,QAAQ,WAAW;EACtB,MAAM,KAAK;EACX,QAAQ,KAAK;EACb,KAAK,KAAK;EACV,SAAS,KAAK;EACd;EACA,aAAa,MAAM,eAAe;EAClC,WAAW;EACZ;AACD,gBAAe,KAAK;;AAGtB,SAAgB,sBAAsB,SAAuB;CAC3D,MAAM,OAAO,gBAAgB;AAC7B,KAAI,CAAC,KAAK,QAAQ,SAAU;AAC5B,QAAO,KAAK,QAAQ;AACpB,gBAAe,KAAK;;AAGtB,SAAgB,mBAAmB,SAAgD;AACjF,QAAO,gBAAgB,CAAC,QAAQ"}
1
+ {"version":3,"file":"hub-lock.js","names":[],"sources":["../../../../src/agent/skills/hub-lock.ts"],"sourcesContent":["/**\n * Skills hub lock (~/.xopc/skills-lock.json): records install source + tree hash per managed skill id.\n */\n\nimport { existsSync, readFileSync } from 'node:fs';\n\nimport { resolveSkillsLockPath } from '../../config/paths.js';\nimport { writeTextAtomicSync } from '../../infra/write-file-atomic.js';\n\nexport type SkillHubKind = 'git' | 'archive';\n\nexport interface SkillHubLockEntry {\n kind: SkillHubKind;\n /** Clone URL, tarball URL, or file path (as given at install time). */\n source: string;\n /** Git branch / tag / ref (optional). */\n ref?: string;\n /** Path inside the cloned repo (POSIX, no leading slash). */\n subpath?: string;\n /** Deterministic tree hash from {@link computeSkillTreeHash}. */\n contentHash: string;\n installedAt: string;\n updatedAt: string;\n}\n\nexport interface SkillsLockFile {\n version: 1;\n entries: Record<string, SkillHubLockEntry>;\n}\n\nfunction emptyLock(): SkillsLockFile {\n return { version: 1, entries: {} };\n}\n\nexport function loadSkillsLock(): SkillsLockFile {\n const p = resolveSkillsLockPath();\n if (!existsSync(p)) return emptyLock();\n try {\n const raw = readFileSync(p, 'utf-8');\n const j = JSON.parse(raw) as Partial<SkillsLockFile>;\n if (j.version !== 1 || !j.entries || typeof j.entries !== 'object') {\n return emptyLock();\n }\n return { version: 1, entries: { ...j.entries } };\n } catch {\n return emptyLock();\n }\n}\n\nexport function saveSkillsLock(lock: SkillsLockFile): void {\n const p = resolveSkillsLockPath();\n writeTextAtomicSync(p, `${JSON.stringify(lock, null, 2)}\\n`);\n}\n\n/** Record or replace hub metadata for a managed skill directory id (folder name under ~/.xopc/skills). */\nexport function recordSkillsHubInstall(\n skillId: string,\n meta: Pick<SkillHubLockEntry, 'kind' | 'source' | 'ref' | 'subpath'>,\n contentHash: string,\n): void {\n const lock = loadSkillsLock();\n const now = new Date().toISOString();\n const prev = lock.entries[skillId];\n lock.entries[skillId] = {\n kind: meta.kind,\n source: meta.source,\n ref: meta.ref,\n subpath: meta.subpath,\n contentHash,\n installedAt: prev?.installedAt ?? now,\n updatedAt: now,\n };\n saveSkillsLock(lock);\n}\n\nexport function removeSkillsLockEntry(skillId: string): void {\n const lock = loadSkillsLock();\n if (!lock.entries[skillId]) return;\n delete lock.entries[skillId];\n saveSkillsLock(lock);\n}\n\nexport function getSkillsLockEntry(skillId: string): SkillHubLockEntry | undefined {\n return loadSkillsLock().entries[skillId];\n}\n"],"mappings":";;;;;;;YAM8D;wBACS;AAuBvE,SAAS,YAA4B;AACnC,QAAO;EAAE,SAAS;EAAG,SAAS,EAAE;EAAE;;AAGpC,SAAgB,iBAAiC;CAC/C,MAAM,IAAI,uBAAuB;AACjC,KAAI,CAAC,WAAW,EAAE,CAAE,QAAO,WAAW;AACtC,KAAI;EACF,MAAM,MAAM,aAAa,GAAG,QAAQ;EACpC,MAAM,IAAI,KAAK,MAAM,IAAI;AACzB,MAAI,EAAE,YAAY,KAAK,CAAC,EAAE,WAAW,OAAO,EAAE,YAAY,SACxD,QAAO,WAAW;AAEpB,SAAO;GAAE,SAAS;GAAG,SAAS,EAAE,GAAG,EAAE,SAAS;GAAE;SAC1C;AACN,SAAO,WAAW;;;AAItB,SAAgB,eAAe,MAA4B;AAEzD,qBADU,uBACW,EAAE,GAAG,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC,IAAI;;;AAI9D,SAAgB,uBACd,SACA,MACA,aACM;CACN,MAAM,OAAO,gBAAgB;CAC7B,MAAM,uBAAM,IAAI,MAAM,EAAC,aAAa;CACpC,MAAM,OAAO,KAAK,QAAQ;AAC1B,MAAK,QAAQ,WAAW;EACtB,MAAM,KAAK;EACX,QAAQ,KAAK;EACb,KAAK,KAAK;EACV,SAAS,KAAK;EACd;EACA,aAAa,MAAM,eAAe;EAClC,WAAW;EACZ;AACD,gBAAe,KAAK;;AAGtB,SAAgB,sBAAsB,SAAuB;CAC3D,MAAM,OAAO,gBAAgB;AAC7B,KAAI,CAAC,KAAK,QAAQ,SAAU;AAC5B,QAAO,KAAK,QAAQ;AACpB,gBAAe,KAAK;;AAGtB,SAAgB,mBAAmB,SAAgD;AACjF,QAAO,gBAAgB,CAAC,QAAQ"}
@@ -8,6 +8,7 @@ import { applySkillEnvOverrides, createSkillConfigManager, getSkillEnvironment,
8
8
  import { parseSkillToolConditions } from "./skill-tool-gating.js";
9
9
  import { formatSkillsForPrompt } from "./format-skills-prompt.js";
10
10
  import { parseRequiredEnvVarNames } from "./required-env-vars.js";
11
+ import { parseSkillMetadata } from "./parse-skill-metadata.js";
11
12
  import { SkillManager } from "./skill-manager.js";
12
13
  import { collectSkillInstallWarnings, formatScanSummary, scanSkillDirectory } from "./scanner.js";
13
14
  import { createSkillWatcher, createWatcherFromLoader } from "./watcher.js";
@@ -88,7 +89,7 @@ function discoverSkills(dir, source) {
88
89
  for (const rule of subRules) subIgnoredPaths.add(`${skillRelPath}${rule}`);
89
90
  }
90
91
  if (existsSync(skillMdPath) && !shouldIgnore(skillRelPath, currentIgnoredPaths)) {
91
- const skill = loadSkillFromFile(skillMdPath, source);
92
+ const skill = loadSkillFromFile(skillMdPath, source, dir);
92
93
  if (skill) skills.push(skill);
93
94
  }
94
95
  scan(fullPath, subIgnoredPaths);
@@ -99,26 +100,7 @@ function discoverSkills(dir, source) {
99
100
  scan(dir, loadIgnoreRules(dir, dir));
100
101
  return skills;
101
102
  }
102
- function parseSkillMetadata(frontmatter) {
103
- const xopcMeta = frontmatter.metadata?.xopc;
104
- const metadata = {
105
- name: frontmatter.name || "",
106
- description: frontmatter.description || "",
107
- emoji: xopcMeta?.emoji || frontmatter.emoji || void 0,
108
- homepage: frontmatter.homepage || void 0,
109
- os: xopcMeta?.os || frontmatter.os || void 0,
110
- requires: xopcMeta?.requires || frontmatter.requires || void 0,
111
- install: xopcMeta?.install || frontmatter.install || void 0
112
- };
113
- if (xopcMeta) metadata.xopc = {
114
- emoji: xopcMeta.emoji || void 0,
115
- requires: xopcMeta.requires || void 0,
116
- install: xopcMeta.install || void 0,
117
- os: xopcMeta.os || void 0
118
- };
119
- return metadata;
120
- }
121
- function loadSkillFromFile(filePath, source) {
103
+ function loadSkillFromFile(filePath, source, rootDir) {
122
104
  try {
123
105
  const { frontmatter, content } = parseFrontmatter(readFileSync(filePath, "utf-8"));
124
106
  const skillDir = dirname(filePath);
@@ -126,12 +108,18 @@ function loadSkillFromFile(filePath, source) {
126
108
  const name = frontmatter.name || parentDirName;
127
109
  const description = frontmatter.description;
128
110
  if (!description?.trim()) return null;
111
+ let category;
112
+ if (rootDir) {
113
+ const segments = toPosixPath(relative(rootDir, skillDir)).split("/");
114
+ if (segments.length > 1) category = segments[0];
115
+ }
129
116
  const metadata = parseSkillMetadata(frontmatter);
130
117
  const toolConditions = parseSkillToolConditions(frontmatter);
131
118
  const requiredEnvVarNames = parseRequiredEnvVarNames(frontmatter);
132
119
  return {
133
120
  name,
134
121
  description: description.trim(),
122
+ category,
135
123
  filePath,
136
124
  baseDir: skillDir,
137
125
  source,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../src/agent/skills/index.ts"],"sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'fs';\nimport { basename, dirname, join, relative, sep } from 'path';\nimport { parseFrontmatter } from '../../markdown/frontmatter.js';\nimport { resolveStateDir } from '../../config/paths.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { createSkillConfigManager, isSkillEnabled } from './config.js';\nimport { formatSkillsForPrompt } from './format-skills-prompt.js';\nimport { parseRequiredEnvVarNames } from './required-env-vars.js';\nimport { parseSkillToolConditions } from './skill-tool-gating.js';\nimport type {\n Skill,\n SkillMetadata,\n SkillDiagnostic,\n LoadSkillsResult,\n SkillConfig,\n SkillInstallSpec,\n SkillRequires,\n SkillsConfig,\n} from './types.js';\n\nconst log = createLogger('SkillLoader');\n\nconst IGNORE_FILES = ['.gitignore', '.ignore', '.fdignore'];\n\nfunction toPosixPath(p: string): string {\n return p.split(sep).join('/');\n}\n\nfunction prefixIgnorePattern(line: string, prefix: string): string | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith('#') && !trimmed.startsWith('\\\\#')) return null;\n\n let pattern = line;\n let negated = false;\n\n if (pattern.startsWith('!')) {\n negated = true;\n pattern = pattern.slice(1);\n } else if (pattern.startsWith('\\\\!')) {\n pattern = pattern.slice(1);\n }\n\n if (pattern.startsWith('/')) {\n pattern = pattern.slice(1);\n }\n\n const prefixed = prefix ? `${prefix}${pattern}` : pattern;\n return negated ? `!${prefixed}` : prefixed;\n}\n\nfunction loadIgnoreRules(dir: string, rootDir: string): Set<string> {\n const ignoredPaths = new Set<string>();\n const relativeDir = relative(rootDir, dir);\n const prefix = relativeDir ? `${toPosixPath(relativeDir)}/` : '';\n\n for (const filename of IGNORE_FILES) {\n const ignorePath = join(dir, filename);\n if (!existsSync(ignorePath)) continue;\n\n try {\n const content = readFileSync(ignorePath, 'utf-8');\n for (const line of content.split(/\\r?\\n/)) {\n const pattern = prefixIgnorePattern(line, prefix);\n if (pattern) {\n const fullPattern = pattern.startsWith('!')\n ? `!${prefix}${pattern.slice(1)}`\n : `${prefix}${pattern}`;\n ignoredPaths.add(fullPattern);\n }\n }\n } catch {}\n }\n\n return ignoredPaths;\n}\n\nfunction shouldIgnore(path: string, ignoredPaths: Set<string>): boolean {\n for (const pattern of ignoredPaths) {\n if (pattern.startsWith('!')) {\n const positive = pattern.slice(1);\n if (path === positive || path.startsWith(`${positive}/`)) {\n return false;\n }\n } else {\n if (path === pattern || path.startsWith(`${pattern}/`)) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction discoverSkills(dir: string, source: 'builtin' | 'workspace' | 'global'): Skill[] {\n const skills: Skill[] = [];\n if (!existsSync(dir)) return skills;\n\n function scan(currentDir: string, currentIgnoredPaths: Set<string>) {\n try {\n const entries = readdirSync(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name.startsWith('.') || entry.name === 'node_modules') continue;\n\n const fullPath = join(currentDir, entry.name);\n const relPath = toPosixPath(relative(dir, fullPath));\n\n if (shouldIgnore(relPath, currentIgnoredPaths)) continue;\n\n if (entry.isDirectory()) {\n const skillMdPath = join(fullPath, 'SKILL.md');\n const skillRelPath = `${relPath}/`;\n\n const subIgnoredPaths = new Set(currentIgnoredPaths);\n const subIgnoreFile = join(fullPath, '.gitignore');\n if (existsSync(subIgnoreFile)) {\n const subRules = loadIgnoreRules(fullPath, dir);\n for (const rule of subRules) {\n subIgnoredPaths.add(`${skillRelPath}${rule}`);\n }\n }\n\n if (existsSync(skillMdPath) && !shouldIgnore(skillRelPath, currentIgnoredPaths)) {\n const skill = loadSkillFromFile(skillMdPath, source);\n if (skill) skills.push(skill);\n }\n\n scan(fullPath, subIgnoredPaths);\n }\n }\n } catch {}\n }\n\n scan(dir, loadIgnoreRules(dir, dir));\n return skills;\n}\n\nfunction parseSkillMetadata(frontmatter: Record<string, unknown>): SkillMetadata {\n // Only support metadata.xopc nested structure\n const meta = frontmatter.metadata as Record<string, unknown> | undefined;\n const xopcMeta = meta?.xopc as Record<string, unknown> | undefined;\n \n const metadata: SkillMetadata = {\n name: frontmatter.name as string || '',\n description: frontmatter.description as string || '',\n emoji: xopcMeta?.emoji as string || frontmatter.emoji as string || undefined,\n homepage: frontmatter.homepage as string || undefined,\n os: xopcMeta?.os as Array<'darwin' | 'linux' | 'win32'> || frontmatter.os as Array<'darwin' | 'linux' | 'win32'> || undefined,\n requires: xopcMeta?.requires as SkillRequires || frontmatter.requires as SkillRequires || undefined,\n install: xopcMeta?.install as SkillInstallSpec[] || frontmatter.install as SkillInstallSpec[] || undefined,\n };\n\n // Store xopc metadata for reference\n if (xopcMeta) {\n metadata.xopc = {\n emoji: xopcMeta.emoji as string || undefined,\n requires: xopcMeta.requires as SkillRequires || undefined,\n install: xopcMeta.install as SkillInstallSpec[] || undefined,\n os: xopcMeta.os as Array<'darwin' | 'linux' | 'win32'> || undefined,\n };\n }\n\n return metadata;\n}\n\nfunction loadSkillFromFile(filePath: string, source: 'builtin' | 'workspace' | 'global'): Skill | null {\n try {\n const rawContent = readFileSync(filePath, 'utf-8');\n const { frontmatter, content } = parseFrontmatter(rawContent);\n const skillDir = dirname(filePath);\n const parentDirName = basename(skillDir);\n\n const name = (frontmatter.name as string | undefined) || parentDirName;\n const description = frontmatter.description as string | undefined;\n if (!description?.trim()) return null;\n\n const metadata = parseSkillMetadata(frontmatter);\n const toolConditions = parseSkillToolConditions(frontmatter);\n const requiredEnvVarNames = parseRequiredEnvVarNames(frontmatter);\n\n return {\n name,\n description: description.trim(),\n filePath,\n baseDir: skillDir,\n source,\n disableModelInvocation: frontmatter['disable-model-invocation'] === true,\n metadata,\n toolConditions,\n requiredEnvVarNames: requiredEnvVarNames.length > 0 ? requiredEnvVarNames : undefined,\n content,\n };\n } catch {\n return null;\n }\n}\n\nexport function loadSkills(options: {\n workspaceDir?: string;\n globalDir?: string;\n builtinDir?: string;\n extraDirs?: string[];\n}): LoadSkillsResult {\n const { workspaceDir, builtinDir, extraDirs = [] } = options;\n\n const skillMap = new Map<string, Skill>();\n const diagnostics: SkillDiagnostic[] = [];\n\n if (builtinDir) {\n for (const skill of discoverSkills(builtinDir, 'builtin')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${existing.source} overrides ${skill.source}`,\n path: skill.filePath,\n });\n } else {\n skillMap.set(skill.name, skill);\n }\n }\n }\n\n const globalDirs = [\n options.globalDir,\n join(resolveStateDir(), 'skills'),\n ].filter((d): d is string => !!d && existsSync(d));\n\n for (const dir of globalDirs) {\n for (const skill of discoverSkills(dir, 'global')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${skill.source} overrides ${existing.source}`,\n path: skill.filePath,\n });\n }\n // Global must win over bundled when names match (Workspace > Global > Bundled).\n skillMap.set(skill.name, skill);\n }\n }\n\n if (workspaceDir) {\n const workspaceSkills = discoverSkills(join(workspaceDir, 'skills'), 'workspace');\n for (const skill of workspaceSkills) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${skill.source} overrides ${existing.source}`,\n path: skill.filePath,\n });\n }\n skillMap.set(skill.name, skill);\n }\n }\n\n // Scan extra directories\n for (const extraDir of extraDirs) {\n if (existsSync(extraDir)) {\n for (const skill of discoverSkills(extraDir, 'global')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${existing.source} overrides ${skill.source}`,\n path: skill.filePath,\n });\n } else {\n skillMap.set(skill.name, skill);\n }\n }\n }\n }\n\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n const merged = Array.from(skillMap.values());\n\n return {\n skills: merged,\n prompt: formatSkillsForPrompt(merged, skillsConfig),\n diagnostics,\n };\n}\n\nexport interface SkillLoader {\n init: (workspace: string, builtin: string | null) => LoadSkillsResult;\n load: () => LoadSkillsResult;\n reload: () => LoadSkillsResult;\n /** Recompute `<available_skills>` from disk-loaded skills and current ~/.xopc/skills.json (no filesystem rescan). */\n refreshPromptFromConfig: () => void;\n getSkills: () => Skill[];\n getPrompt: () => string;\n getDiagnostics: () => SkillDiagnostic[];\n getLastLoadTime: () => number;\n getSkillByName: (name: string) => Skill | undefined;\n getEnabledSkills: (config?: Record<string, SkillConfig>) => Skill[];\n}\n\nexport function createSkillLoader(): SkillLoader {\n let cachedSkills: Skill[] = [];\n let cachedPrompt: string = '';\n let cachedDiagnostics: SkillDiagnostic[] = [];\n let lastLoadTime = 0;\n let workspaceDir: string | undefined;\n let builtinDir: string | undefined;\n let extraDirs: string[] = [];\n\n function updateCache(result: LoadSkillsResult): LoadSkillsResult {\n cachedSkills = result.skills;\n cachedPrompt = result.prompt;\n cachedDiagnostics = result.diagnostics;\n lastLoadTime = Date.now();\n return result;\n }\n\n return {\n init: (workspace: string, builtin: string | null) => {\n workspaceDir = workspace;\n builtinDir = builtin || undefined;\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n \n load: () => {\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n \n reload: () => {\n log.info('Reloading skills');\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n\n refreshPromptFromConfig: () => {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n cachedPrompt = formatSkillsForPrompt(cachedSkills, skillsConfig);\n lastLoadTime = Date.now();\n },\n\n getSkills: () => cachedSkills,\n getPrompt: () => cachedPrompt,\n getDiagnostics: () => cachedDiagnostics,\n getLastLoadTime: () => lastLoadTime,\n \n getSkillByName: (name: string) => {\n return cachedSkills.find(s => s.name === name);\n },\n \n getEnabledSkills: (entries?: Record<string, SkillConfig>) => {\n const skillsConfig: SkillsConfig =\n entries !== undefined ? { entries } : createSkillConfigManager(resolveStateDir()).load();\n return cachedSkills.filter(\n (skill) => !skill.disableModelInvocation && isSkillEnabled(skill, skillsConfig),\n );\n },\n };\n}\n\n// Export SkillManager\nexport { SkillManager, type SkillDiagnostic, type SkillLoadResult } from './skill-manager.js';\n\n// Re-export types for convenience\nexport type { \n Skill, \n SkillMetadata, \n SkillConfig,\n SkillInstallSpec,\n SkillInstallResult,\n SkillInstallRequest,\n LoadSkillsResult,\n // Note: SkillDiagnostic is re-exported from skill-manager.ts above\n SkillSnapshot,\n} from './types.js';\n\n// Re-export installer\nexport { \n installSkill, \n findInstallSpec,\n hasBinary,\n getDefaultInstallerPreferences,\n type InstallerPreferences,\n type InstallContext,\n} from './installer.js';\n\n// Re-export scanner\nexport {\n scanSkillDirectory,\n formatScanSummary,\n collectSkillInstallWarnings,\n type ScanSummary,\n type SecurityFinding,\n type Severity,\n} from './scanner.js';\n\n// Re-export config manager\nexport {\n resolveSkillConfig,\n applySkillEnvOverrides,\n getSkillEnvironment,\n createSkillConfigManager,\n isSkillEnabled,\n validateSkillConfig,\n type SkillConfigFile,\n} from './config.js';\n\n// Re-export watcher\nexport {\n createSkillWatcher,\n createWatcherFromLoader,\n type SkillWatcher,\n type SkillWatcherOptions,\n} from './watcher.js';\n\n// Re-export test framework\nexport {\n SkillTestFramework,\n SkillTestRunner,\n formatTestResults,\n formatTestResultsJson,\n formatTestResultsTap,\n type TestResult,\n type TestStatus,\n type SkillTestReport,\n type TestOptions,\n type TestRunnerOptions,\n} from './test-framework.js';\n"],"mappings":";;;;;;;;;;;;;;;;;YAGwD;aACH;gBA8X7B;AA9WxB,MAAM,MAAM,aAAa,cAAc;AAEvC,MAAM,eAAe;CAAC;CAAc;CAAW;CAAY;AAE3D,SAAS,YAAY,GAAmB;AACtC,QAAO,EAAE,MAAM,IAAI,CAAC,KAAK,IAAI;;AAG/B,SAAS,oBAAoB,MAAc,QAA+B;CACxE,MAAM,UAAU,KAAK,MAAM;AAC3B,KAAI,CAAC,QAAS,QAAO;AACrB,KAAI,QAAQ,WAAW,IAAI,IAAI,CAAC,QAAQ,WAAW,MAAM,CAAE,QAAO;CAElE,IAAI,UAAU;CACd,IAAI,UAAU;AAEd,KAAI,QAAQ,WAAW,IAAI,EAAE;AAC3B,YAAU;AACV,YAAU,QAAQ,MAAM,EAAE;YACjB,QAAQ,WAAW,MAAM,CAClC,WAAU,QAAQ,MAAM,EAAE;AAG5B,KAAI,QAAQ,WAAW,IAAI,CACzB,WAAU,QAAQ,MAAM,EAAE;CAG5B,MAAM,WAAW,SAAS,GAAG,SAAS,YAAY;AAClD,QAAO,UAAU,IAAI,aAAa;;AAGpC,SAAS,gBAAgB,KAAa,SAA8B;CAClE,MAAM,+BAAe,IAAI,KAAa;CACtC,MAAM,cAAc,SAAS,SAAS,IAAI;CAC1C,MAAM,SAAS,cAAc,GAAG,YAAY,YAAY,CAAC,KAAK;AAE9D,MAAK,MAAM,YAAY,cAAc;EACnC,MAAM,aAAa,KAAK,KAAK,SAAS;AACtC,MAAI,CAAC,WAAW,WAAW,CAAE;AAE7B,MAAI;GACF,MAAM,UAAU,aAAa,YAAY,QAAQ;AACjD,QAAK,MAAM,QAAQ,QAAQ,MAAM,QAAQ,EAAE;IACzC,MAAM,UAAU,oBAAoB,MAAM,OAAO;AACjD,QAAI,SAAS;KACX,MAAM,cAAc,QAAQ,WAAW,IAAI,GACvC,IAAI,SAAS,QAAQ,MAAM,EAAE,KAC7B,GAAG,SAAS;AAChB,kBAAa,IAAI,YAAY;;;UAG3B;;AAGV,QAAO;;AAGT,SAAS,aAAa,MAAc,cAAoC;AACtE,MAAK,MAAM,WAAW,aACpB,KAAI,QAAQ,WAAW,IAAI,EAAE;EAC3B,MAAM,WAAW,QAAQ,MAAM,EAAE;AACjC,MAAI,SAAS,YAAY,KAAK,WAAW,GAAG,SAAS,GAAG,CACtD,QAAO;YAGL,SAAS,WAAW,KAAK,WAAW,GAAG,QAAQ,GAAG,CACpD,QAAO;AAIb,QAAO;;AAGT,SAAS,eAAe,KAAa,QAAqD;CACxF,MAAM,SAAkB,EAAE;AAC1B,KAAI,CAAC,WAAW,IAAI,CAAE,QAAO;CAE7B,SAAS,KAAK,YAAoB,qBAAkC;AAClE,MAAI;GACF,MAAM,UAAU,YAAY,YAAY,EAAE,eAAe,MAAM,CAAC;AAEhE,QAAK,MAAM,SAAS,SAAS;AAC3B,QAAI,MAAM,KAAK,WAAW,IAAI,IAAI,MAAM,SAAS,eAAgB;IAEjE,MAAM,WAAW,KAAK,YAAY,MAAM,KAAK;IAC7C,MAAM,UAAU,YAAY,SAAS,KAAK,SAAS,CAAC;AAEpD,QAAI,aAAa,SAAS,oBAAoB,CAAE;AAEhD,QAAI,MAAM,aAAa,EAAE;KACvB,MAAM,cAAc,KAAK,UAAU,WAAW;KAC9C,MAAM,eAAe,GAAG,QAAQ;KAEhC,MAAM,kBAAkB,IAAI,IAAI,oBAAoB;AAEpD,SAAI,WADkB,KAAK,UAAU,aACT,CAAC,EAAE;MAC7B,MAAM,WAAW,gBAAgB,UAAU,IAAI;AAC/C,WAAK,MAAM,QAAQ,SACjB,iBAAgB,IAAI,GAAG,eAAe,OAAO;;AAIjD,SAAI,WAAW,YAAY,IAAI,CAAC,aAAa,cAAc,oBAAoB,EAAE;MAC/E,MAAM,QAAQ,kBAAkB,aAAa,OAAO;AACpD,UAAI,MAAO,QAAO,KAAK,MAAM;;AAG/B,UAAK,UAAU,gBAAgB;;;UAG7B;;AAGV,MAAK,KAAK,gBAAgB,KAAK,IAAI,CAAC;AACpC,QAAO;;AAGT,SAAS,mBAAmB,aAAqD;CAG/E,MAAM,WADO,YAAY,UACF;CAEvB,MAAM,WAA0B;EAC9B,MAAM,YAAY,QAAkB;EACpC,aAAa,YAAY,eAAyB;EAClD,OAAO,UAAU,SAAmB,YAAY,SAAmB,KAAA;EACnE,UAAU,YAAY,YAAsB,KAAA;EAC5C,IAAI,UAAU,MAA6C,YAAY,MAA6C,KAAA;EACpH,UAAU,UAAU,YAA6B,YAAY,YAA6B,KAAA;EAC1F,SAAS,UAAU,WAAiC,YAAY,WAAiC,KAAA;EAClG;AAGD,KAAI,SACF,UAAS,OAAO;EACd,OAAO,SAAS,SAAmB,KAAA;EACnC,UAAU,SAAS,YAA6B,KAAA;EAChD,SAAS,SAAS,WAAiC,KAAA;EACnD,IAAI,SAAS,MAA6C,KAAA;EAC3D;AAGH,QAAO;;AAGT,SAAS,kBAAkB,UAAkB,QAA0D;AACrG,KAAI;EAEF,MAAM,EAAE,aAAa,YAAY,iBADd,aAAa,UAAU,QACkB,CAAC;EAC7D,MAAM,WAAW,QAAQ,SAAS;EAClC,MAAM,gBAAgB,SAAS,SAAS;EAExC,MAAM,OAAQ,YAAY,QAA+B;EACzD,MAAM,cAAc,YAAY;AAChC,MAAI,CAAC,aAAa,MAAM,CAAE,QAAO;EAEjC,MAAM,WAAW,mBAAmB,YAAY;EAChD,MAAM,iBAAiB,yBAAyB,YAAY;EAC5D,MAAM,sBAAsB,yBAAyB,YAAY;AAEjE,SAAO;GACL;GACA,aAAa,YAAY,MAAM;GAC/B;GACA,SAAS;GACT;GACA,wBAAwB,YAAY,gCAAgC;GACpE;GACA;GACA,qBAAqB,oBAAoB,SAAS,IAAI,sBAAsB,KAAA;GAC5E;GACD;SACK;AACN,SAAO;;;AAIX,SAAgB,WAAW,SAKN;CACnB,MAAM,EAAE,cAAc,YAAY,YAAY,EAAE,KAAK;CAErD,MAAM,2BAAW,IAAI,KAAoB;CACzC,MAAM,cAAiC,EAAE;AAEzC,KAAI,WACF,MAAK,MAAM,SAAS,eAAe,YAAY,UAAU,EAAE;EACzD,MAAM,WAAW,SAAS,IAAI,MAAM,KAAK;AACzC,MAAI,SACF,aAAY,KAAK;GACf,MAAM;GACN,WAAW,MAAM;GACjB,SAAS,UAAU,MAAM,KAAK,eAAe,SAAS,OAAO,aAAa,MAAM;GAChF,MAAM,MAAM;GACb,CAAC;MAEF,UAAS,IAAI,MAAM,MAAM,MAAM;;CAKrC,MAAM,aAAa,CACjB,QAAQ,WACR,KAAK,iBAAiB,EAAE,SAAS,CAClC,CAAC,QAAQ,MAAmB,CAAC,CAAC,KAAK,WAAW,EAAE,CAAC;AAElD,MAAK,MAAM,OAAO,WAChB,MAAK,MAAM,SAAS,eAAe,KAAK,SAAS,EAAE;EACjD,MAAM,WAAW,SAAS,IAAI,MAAM,KAAK;AACzC,MAAI,SACF,aAAY,KAAK;GACf,MAAM;GACN,WAAW,MAAM;GACjB,SAAS,UAAU,MAAM,KAAK,eAAe,MAAM,OAAO,aAAa,SAAS;GAChF,MAAM,MAAM;GACb,CAAC;AAGJ,WAAS,IAAI,MAAM,MAAM,MAAM;;AAInC,KAAI,cAAc;EAChB,MAAM,kBAAkB,eAAe,KAAK,cAAc,SAAS,EAAE,YAAY;AACjF,OAAK,MAAM,SAAS,iBAAiB;GACnC,MAAM,WAAW,SAAS,IAAI,MAAM,KAAK;AACzC,OAAI,SACF,aAAY,KAAK;IACf,MAAM;IACN,WAAW,MAAM;IACjB,SAAS,UAAU,MAAM,KAAK,eAAe,MAAM,OAAO,aAAa,SAAS;IAChF,MAAM,MAAM;IACb,CAAC;AAEJ,YAAS,IAAI,MAAM,MAAM,MAAM;;;AAKnC,MAAK,MAAM,YAAY,UACrB,KAAI,WAAW,SAAS,CACtB,MAAK,MAAM,SAAS,eAAe,UAAU,SAAS,EAAE;EACtD,MAAM,WAAW,SAAS,IAAI,MAAM,KAAK;AACzC,MAAI,SACF,aAAY,KAAK;GACf,MAAM;GACN,WAAW,MAAM;GACjB,SAAS,UAAU,MAAM,KAAK,eAAe,SAAS,OAAO,aAAa,MAAM;GAChF,MAAM,MAAM;GACb,CAAC;MAEF,UAAS,IAAI,MAAM,MAAM,MAAM;;CAMvC,MAAM,eAAe,yBAAyB,iBAAiB,CAAC,CAAC,MAAM;CACvE,MAAM,SAAS,MAAM,KAAK,SAAS,QAAQ,CAAC;AAE5C,QAAO;EACL,QAAQ;EACR,QAAQ,sBAAsB,QAAQ,aAAa;EACnD;EACD;;AAiBH,SAAgB,oBAAiC;CAC/C,IAAI,eAAwB,EAAE;CAC9B,IAAI,eAAuB;CAC3B,IAAI,oBAAuC,EAAE;CAC7C,IAAI,eAAe;CACnB,IAAI;CACJ,IAAI;CACJ,IAAI,YAAsB,EAAE;CAE5B,SAAS,YAAY,QAA4C;AAC/D,iBAAe,OAAO;AACtB,iBAAe,OAAO;AACtB,sBAAoB,OAAO;AAC3B,iBAAe,KAAK,KAAK;AACzB,SAAO;;AAGT,QAAO;EACL,OAAO,WAAmB,YAA2B;AACnD,kBAAe;AACf,gBAAa,WAAW,KAAA;AACxB,UAAO,YAAY,WAAW;IAAE;IAAc;IAAY;IAAW,CAAC,CAAC;;EAGzE,YAAY;AACV,UAAO,YAAY,WAAW;IAAE;IAAc;IAAY;IAAW,CAAC,CAAC;;EAGzE,cAAc;AACZ,OAAI,KAAK,mBAAmB;AAC5B,UAAO,YAAY,WAAW;IAAE;IAAc;IAAY;IAAW,CAAC,CAAC;;EAGzE,+BAA+B;GAC7B,MAAM,eAAe,yBAAyB,iBAAiB,CAAC,CAAC,MAAM;AACvE,kBAAe,sBAAsB,cAAc,aAAa;AAChE,kBAAe,KAAK,KAAK;;EAG3B,iBAAiB;EACjB,iBAAiB;EACjB,sBAAsB;EACtB,uBAAuB;EAEvB,iBAAiB,SAAiB;AAChC,UAAO,aAAa,MAAK,MAAK,EAAE,SAAS,KAAK;;EAGhD,mBAAmB,YAA0C;GAC3D,MAAM,eACJ,YAAY,KAAA,IAAY,EAAE,SAAS,GAAG,yBAAyB,iBAAiB,CAAC,CAAC,MAAM;AAC1F,UAAO,aAAa,QACjB,UAAU,CAAC,MAAM,0BAA0B,eAAe,OAAO,aAAa,CAChF;;EAEJ"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/agent/skills/index.ts"],"sourcesContent":["import { existsSync, readdirSync, readFileSync } from 'fs';\nimport { basename, dirname, join, relative, sep } from 'path';\nimport { parseFrontmatter } from '../../markdown/frontmatter.js';\nimport { resolveStateDir } from '../../config/paths.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { createSkillConfigManager, isSkillEnabled } from './config.js';\nimport { formatSkillsForPrompt } from './format-skills-prompt.js';\nimport { parseRequiredEnvVarNames } from './required-env-vars.js';\nimport { parseSkillMetadata } from './parse-skill-metadata.js';\nimport { parseSkillToolConditions } from './skill-tool-gating.js';\nimport type {\n Skill,\n SkillMetadata,\n SkillDiagnostic,\n LoadSkillsResult,\n SkillConfig,\n SkillInstallSpec,\n SkillsConfig,\n} from './types.js';\n\nconst log = createLogger('SkillLoader');\n\nconst IGNORE_FILES = ['.gitignore', '.ignore', '.fdignore'];\n\nfunction toPosixPath(p: string): string {\n return p.split(sep).join('/');\n}\n\nfunction prefixIgnorePattern(line: string, prefix: string): string | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n if (trimmed.startsWith('#') && !trimmed.startsWith('\\\\#')) return null;\n\n let pattern = line;\n let negated = false;\n\n if (pattern.startsWith('!')) {\n negated = true;\n pattern = pattern.slice(1);\n } else if (pattern.startsWith('\\\\!')) {\n pattern = pattern.slice(1);\n }\n\n if (pattern.startsWith('/')) {\n pattern = pattern.slice(1);\n }\n\n const prefixed = prefix ? `${prefix}${pattern}` : pattern;\n return negated ? `!${prefixed}` : prefixed;\n}\n\nfunction loadIgnoreRules(dir: string, rootDir: string): Set<string> {\n const ignoredPaths = new Set<string>();\n const relativeDir = relative(rootDir, dir);\n const prefix = relativeDir ? `${toPosixPath(relativeDir)}/` : '';\n\n for (const filename of IGNORE_FILES) {\n const ignorePath = join(dir, filename);\n if (!existsSync(ignorePath)) continue;\n\n try {\n const content = readFileSync(ignorePath, 'utf-8');\n for (const line of content.split(/\\r?\\n/)) {\n const pattern = prefixIgnorePattern(line, prefix);\n if (pattern) {\n const fullPattern = pattern.startsWith('!')\n ? `!${prefix}${pattern.slice(1)}`\n : `${prefix}${pattern}`;\n ignoredPaths.add(fullPattern);\n }\n }\n } catch {}\n }\n\n return ignoredPaths;\n}\n\nfunction shouldIgnore(path: string, ignoredPaths: Set<string>): boolean {\n for (const pattern of ignoredPaths) {\n if (pattern.startsWith('!')) {\n const positive = pattern.slice(1);\n if (path === positive || path.startsWith(`${positive}/`)) {\n return false;\n }\n } else {\n if (path === pattern || path.startsWith(`${pattern}/`)) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction discoverSkills(dir: string, source: 'builtin' | 'workspace' | 'global'): Skill[] {\n const skills: Skill[] = [];\n if (!existsSync(dir)) return skills;\n\n function scan(currentDir: string, currentIgnoredPaths: Set<string>) {\n try {\n const entries = readdirSync(currentDir, { withFileTypes: true });\n\n for (const entry of entries) {\n if (entry.name.startsWith('.') || entry.name === 'node_modules') continue;\n\n const fullPath = join(currentDir, entry.name);\n const relPath = toPosixPath(relative(dir, fullPath));\n\n if (shouldIgnore(relPath, currentIgnoredPaths)) continue;\n\n if (entry.isDirectory()) {\n const skillMdPath = join(fullPath, 'SKILL.md');\n const skillRelPath = `${relPath}/`;\n\n const subIgnoredPaths = new Set(currentIgnoredPaths);\n const subIgnoreFile = join(fullPath, '.gitignore');\n if (existsSync(subIgnoreFile)) {\n const subRules = loadIgnoreRules(fullPath, dir);\n for (const rule of subRules) {\n subIgnoredPaths.add(`${skillRelPath}${rule}`);\n }\n }\n\n if (existsSync(skillMdPath) && !shouldIgnore(skillRelPath, currentIgnoredPaths)) {\n const skill = loadSkillFromFile(skillMdPath, source, dir);\n if (skill) skills.push(skill);\n }\n\n scan(fullPath, subIgnoredPaths);\n }\n }\n } catch {}\n }\n\n scan(dir, loadIgnoreRules(dir, dir));\n return skills;\n}\n\nfunction loadSkillFromFile(filePath: string, source: 'builtin' | 'workspace' | 'global', rootDir?: string): Skill | null {\n try {\n const rawContent = readFileSync(filePath, 'utf-8');\n const { frontmatter, content } = parseFrontmatter(rawContent);\n const skillDir = dirname(filePath);\n const parentDirName = basename(skillDir);\n\n const name = (frontmatter.name as string | undefined) || parentDirName;\n const description = frontmatter.description as string | undefined;\n if (!description?.trim()) return null;\n\n // Derive category from directory path: skills/creative/algorithmic-art → 'creative'\n // Only assign a category when the skill is nested at least two levels below rootDir.\n let category: string | undefined;\n if (rootDir) {\n const relDir = toPosixPath(relative(rootDir, skillDir));\n const segments = relDir.split('/');\n if (segments.length > 1) {\n category = segments[0];\n }\n }\n\n const metadata = parseSkillMetadata(frontmatter);\n const toolConditions = parseSkillToolConditions(frontmatter);\n const requiredEnvVarNames = parseRequiredEnvVarNames(frontmatter);\n\n return {\n name,\n description: description.trim(),\n category,\n filePath,\n baseDir: skillDir,\n source,\n disableModelInvocation: frontmatter['disable-model-invocation'] === true,\n metadata,\n toolConditions,\n requiredEnvVarNames: requiredEnvVarNames.length > 0 ? requiredEnvVarNames : undefined,\n content,\n };\n } catch {\n return null;\n }\n}\n\nexport function loadSkills(options: {\n workspaceDir?: string;\n globalDir?: string;\n builtinDir?: string;\n extraDirs?: string[];\n}): LoadSkillsResult {\n const { workspaceDir, builtinDir, extraDirs = [] } = options;\n\n const skillMap = new Map<string, Skill>();\n const diagnostics: SkillDiagnostic[] = [];\n\n if (builtinDir) {\n for (const skill of discoverSkills(builtinDir, 'builtin')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${existing.source} overrides ${skill.source}`,\n path: skill.filePath,\n });\n } else {\n skillMap.set(skill.name, skill);\n }\n }\n }\n\n const globalDirs = [\n options.globalDir,\n join(resolveStateDir(), 'skills'),\n ].filter((d): d is string => !!d && existsSync(d));\n\n for (const dir of globalDirs) {\n for (const skill of discoverSkills(dir, 'global')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${skill.source} overrides ${existing.source}`,\n path: skill.filePath,\n });\n }\n // Global must win over bundled when names match (Workspace > Global > Bundled).\n skillMap.set(skill.name, skill);\n }\n }\n\n if (workspaceDir) {\n const workspaceSkills = discoverSkills(join(workspaceDir, 'skills'), 'workspace');\n for (const skill of workspaceSkills) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${skill.source} overrides ${existing.source}`,\n path: skill.filePath,\n });\n }\n skillMap.set(skill.name, skill);\n }\n }\n\n // Scan extra directories\n for (const extraDir of extraDirs) {\n if (existsSync(extraDir)) {\n for (const skill of discoverSkills(extraDir, 'global')) {\n const existing = skillMap.get(skill.name);\n if (existing) {\n diagnostics.push({\n type: 'collision',\n skillName: skill.name,\n message: `Skill \"${skill.name}\" collision: ${existing.source} overrides ${skill.source}`,\n path: skill.filePath,\n });\n } else {\n skillMap.set(skill.name, skill);\n }\n }\n }\n }\n\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n const merged = Array.from(skillMap.values());\n\n return {\n skills: merged,\n prompt: formatSkillsForPrompt(merged, skillsConfig),\n diagnostics,\n };\n}\n\nexport interface SkillLoader {\n init: (workspace: string, builtin: string | null) => LoadSkillsResult;\n load: () => LoadSkillsResult;\n reload: () => LoadSkillsResult;\n /** Recompute `<available_skills>` from disk-loaded skills and current ~/.xopc/skills.json (no filesystem rescan). */\n refreshPromptFromConfig: () => void;\n getSkills: () => Skill[];\n getPrompt: () => string;\n getDiagnostics: () => SkillDiagnostic[];\n getLastLoadTime: () => number;\n getSkillByName: (name: string) => Skill | undefined;\n getEnabledSkills: (config?: Record<string, SkillConfig>) => Skill[];\n}\n\nexport function createSkillLoader(): SkillLoader {\n let cachedSkills: Skill[] = [];\n let cachedPrompt: string = '';\n let cachedDiagnostics: SkillDiagnostic[] = [];\n let lastLoadTime = 0;\n let workspaceDir: string | undefined;\n let builtinDir: string | undefined;\n let extraDirs: string[] = [];\n\n function updateCache(result: LoadSkillsResult): LoadSkillsResult {\n cachedSkills = result.skills;\n cachedPrompt = result.prompt;\n cachedDiagnostics = result.diagnostics;\n lastLoadTime = Date.now();\n return result;\n }\n\n return {\n init: (workspace: string, builtin: string | null) => {\n workspaceDir = workspace;\n builtinDir = builtin || undefined;\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n \n load: () => {\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n \n reload: () => {\n log.info('Reloading skills');\n return updateCache(loadSkills({ workspaceDir, builtinDir, extraDirs }));\n },\n\n refreshPromptFromConfig: () => {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n cachedPrompt = formatSkillsForPrompt(cachedSkills, skillsConfig);\n lastLoadTime = Date.now();\n },\n\n getSkills: () => cachedSkills,\n getPrompt: () => cachedPrompt,\n getDiagnostics: () => cachedDiagnostics,\n getLastLoadTime: () => lastLoadTime,\n \n getSkillByName: (name: string) => {\n return cachedSkills.find(s => s.name === name);\n },\n \n getEnabledSkills: (entries?: Record<string, SkillConfig>) => {\n const skillsConfig: SkillsConfig =\n entries !== undefined ? { entries } : createSkillConfigManager(resolveStateDir()).load();\n return cachedSkills.filter(\n (skill) => !skill.disableModelInvocation && isSkillEnabled(skill, skillsConfig),\n );\n },\n };\n}\n\n// Export SkillManager\nexport { SkillManager, type SkillDiagnostic, type SkillLoadResult } from './skill-manager.js';\n\n// Re-export types for convenience\nexport type { \n Skill, \n SkillMetadata, \n SkillConfig,\n SkillInstallSpec,\n SkillInstallResult,\n SkillInstallRequest,\n LoadSkillsResult,\n // Note: SkillDiagnostic is re-exported from skill-manager.ts above\n SkillSnapshot,\n} from './types.js';\n\n// Re-export installer\nexport { \n installSkill, \n findInstallSpec,\n hasBinary,\n getDefaultInstallerPreferences,\n type InstallerPreferences,\n type InstallContext,\n} from './installer.js';\n\n// Re-export scanner\nexport {\n scanSkillDirectory,\n formatScanSummary,\n collectSkillInstallWarnings,\n type ScanSummary,\n type SecurityFinding,\n type Severity,\n} from './scanner.js';\n\n// Re-export config manager\nexport {\n resolveSkillConfig,\n applySkillEnvOverrides,\n getSkillEnvironment,\n createSkillConfigManager,\n isSkillEnabled,\n validateSkillConfig,\n type SkillConfigFile,\n} from './config.js';\n\n// Re-export watcher\nexport {\n createSkillWatcher,\n createWatcherFromLoader,\n type SkillWatcher,\n type SkillWatcherOptions,\n} from './watcher.js';\n\n// Re-export test framework\nexport {\n SkillTestFramework,\n SkillTestRunner,\n formatTestResults,\n formatTestResultsJson,\n formatTestResultsTap,\n type TestResult,\n type TestStatus,\n type SkillTestReport,\n type TestOptions,\n type TestRunnerOptions,\n} from './test-framework.js';\n"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Config } from '../../../config/schema.js';
2
+ import type { MarketplaceCategoryOption, SkillsStoreListParams, UnifiedMarketplaceListResponse, UnifiedMarketplacePackageDetail } from './adapters/store/store-api-client.js';
3
+ /**
4
+ * Pluggable skills marketplace (catalog + install). Implementations: xopc Store, SkillHub.
5
+ */
6
+ export interface SkillsMarketplaceAdapter {
7
+ readonly id: 'store' | 'skillhub';
8
+ /** Filter chips for the current provider (may be empty). */
9
+ listCategories(config: Config): Promise<MarketplaceCategoryOption[]>;
10
+ listPackages(config: Config, params: SkillsStoreListParams): Promise<UnifiedMarketplaceListResponse>;
11
+ getPackageDetail(config: Config, packageName: string): Promise<UnifiedMarketplacePackageDetail>;
12
+ downloadPackage(config: Config, packageName: string, version?: string): Promise<{
13
+ buffer: Buffer;
14
+ skillId: string;
15
+ version: string;
16
+ }>;
17
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { SkillsMarketplaceAdapter } from '../../adapter.types.js';
2
+ export declare const skillhubMarketplaceAdapter: SkillsMarketplaceAdapter;
@@ -0,0 +1,292 @@
1
+ import { isValidSkillId } from "../../../managed-store.js";
2
+ import { buildSkillMarkdownPreviewFromRaw } from "../../../skill-markdown-preview-from-raw.js";
3
+ import { curatedSkillsToPackageItems, downloadSkillHubZipFromEcosystem, resolveSkillHubEcosystemUrls, searchSkillHubLightmake } from "./ecosystem-client.js";
4
+ import { downloadSkillHubZipBuffer, getSkillHubSkill, getSkillHubSkillFileText, getSkillHubSkillFiles, pickSkillHubDocFilePath, searchSkillHubSkills } from "./registry-client.js";
5
+ import { cachedBatchGetSkillHubSkills, cachedFetchSkillHubCuratedIndex, cachedGetDefaultSkillSlugs, cachedListSkillHubRegistryCategories } from "./skillhub-fetch-cache.js";
6
+ import { basename } from "node:path";
7
+ //#region src/agent/skills/marketplace/adapters/skillhub/adapter.ts
8
+ /** Batch size for POST /api/v1/skills/batch (slug lists from default discovery). */
9
+ const REGISTRY_SKILL_BATCH_CHUNK = 80;
10
+ function humanizeRegistryCategoryKey(slug) {
11
+ return slug.replace(/_/g, "-").split("-").filter(Boolean).map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join(" ");
12
+ }
13
+ function sourceLabelFromSkillSource(source) {
14
+ const s = source?.trim();
15
+ if (!s) return void 0;
16
+ const lower = s.toLowerCase();
17
+ if (lower === "clawhub") return "ClawHub";
18
+ if (lower === "lightmake") return "Lightmake";
19
+ if (lower === "skillhub") return "SkillHub";
20
+ return s.charAt(0).toUpperCase() + s.slice(1);
21
+ }
22
+ function filterByCategory(rows, category) {
23
+ const want = category?.trim();
24
+ if (!want) return rows;
25
+ return rows.filter((r) => (r.categories ?? []).includes(want));
26
+ }
27
+ async function collectRegistryCategoryKeysFromSlugs(slugs) {
28
+ const used = /* @__PURE__ */ new Set();
29
+ for (let i = 0; i < slugs.length; i += REGISTRY_SKILL_BATCH_CHUNK) {
30
+ const details = await cachedBatchGetSkillHubSkills(slugs.slice(i, i + REGISTRY_SKILL_BATCH_CHUNK));
31
+ for (const d of details) {
32
+ const k = d.skill.category?.trim();
33
+ if (k) used.add(k);
34
+ }
35
+ }
36
+ return used;
37
+ }
38
+ function isPipelineOnlyChangelog(text) {
39
+ if (!text?.trim()) return true;
40
+ return /^synced by skillhub pipeline\.?$/i.test(text.trim());
41
+ }
42
+ function skillHubFallbackReadmeMarkdown(detail) {
43
+ const s = detail.skill;
44
+ const title = s.displayName?.trim() || s.slug;
45
+ const zh = s.summary_zh?.trim();
46
+ const en = s.summary?.trim();
47
+ const body = zh && en && zh !== en ? `${zh}\n\n${en}` : zh || en || "_No description._";
48
+ return `## ${title}\n\n**${s.slug}** · v${detail.latestVersion.version}\n\n${body}`;
49
+ }
50
+ function convertSkillHubToPackageListItem(detail) {
51
+ const cat = detail.category?.trim();
52
+ return {
53
+ id: detail.slug,
54
+ name: detail.displayName?.trim() || detail.slug,
55
+ type: "skill",
56
+ description: detail.summary_zh || detail.summary,
57
+ downloads: detail.stats.downloads,
58
+ author: {
59
+ username: detail.source || "skillhub",
60
+ avatarUrl: null
61
+ },
62
+ latestVersion: detail.tags.latest || "1.0.0",
63
+ updatedAt: String(detail.updatedAt),
64
+ categories: cat ? [cat] : [],
65
+ stars: detail.stats.stars,
66
+ sourceLabel: sourceLabelFromSkillSource(detail.source)
67
+ };
68
+ }
69
+ const skillhubMarketplaceAdapter = {
70
+ id: "skillhub",
71
+ async listCategories(_config) {
72
+ const sortByLabel = (a, b) => a.label.localeCompare(b.label, "zh-Hans-CN", { sensitivity: "base" });
73
+ const ecoUrls = resolveSkillHubEcosystemUrls();
74
+ try {
75
+ const idx = await cachedFetchSkillHubCuratedIndex(ecoUrls);
76
+ if (idx.skills?.length) {
77
+ const map = /* @__PURE__ */ new Map();
78
+ for (const s of idx.skills) for (const raw of s.categories ?? []) {
79
+ const label = String(raw).trim();
80
+ if (label) map.set(label, {
81
+ id: label,
82
+ label
83
+ });
84
+ }
85
+ return Array.from(map.values()).filter((c) => c.id.trim() && c.label.trim()).sort(sortByLabel);
86
+ }
87
+ } catch {}
88
+ try {
89
+ const [taxonomy, slugs] = await Promise.all([cachedListSkillHubRegistryCategories(), cachedGetDefaultSkillSlugs()]);
90
+ const usedKeys = await collectRegistryCategoryKeysFromSlugs(slugs);
91
+ const taxByKey = new Map(taxonomy.map((t) => [t.key, t]));
92
+ const options = [];
93
+ for (const key of usedKeys) {
94
+ const t = taxByKey.get(key);
95
+ const label = t?.name?.trim() || t?.nameEn?.trim() || humanizeRegistryCategoryKey(key).trim();
96
+ if (!label) continue;
97
+ options.push({
98
+ id: key,
99
+ label
100
+ });
101
+ }
102
+ options.sort((a, b) => {
103
+ const oa = taxByKey.get(a.id)?.sortOrder ?? 999;
104
+ const ob = taxByKey.get(b.id)?.sortOrder ?? 999;
105
+ if (oa !== ob) return oa - ob;
106
+ return sortByLabel(a, b);
107
+ });
108
+ return options;
109
+ } catch {
110
+ return [];
111
+ }
112
+ },
113
+ async listPackages(_config, params) {
114
+ const pageSize = params.pageSize ?? 20;
115
+ const page = params.page ?? 1;
116
+ const ecoUrls = resolveSkillHubEcosystemUrls();
117
+ if (params.q?.trim()) {
118
+ const q = params.q.trim();
119
+ let rows = [];
120
+ try {
121
+ rows = await searchSkillHubLightmake(ecoUrls, q, 100);
122
+ } catch {
123
+ rows = [];
124
+ }
125
+ if (rows.length === 0) rows = (await cachedBatchGetSkillHubSkills((await searchSkillHubSkills(q, 200)).slugs)).map((d) => convertSkillHubToPackageListItem(d.skill));
126
+ rows = filterByCategory(rows, params.category);
127
+ if (params.sort === "downloads") rows = [...rows].sort((a, b) => b.downloads - a.downloads);
128
+ else if (params.sort === "newest") rows = [...rows].sort((a, b) => Number(b.updatedAt) - Number(a.updatedAt));
129
+ const total = rows.length;
130
+ const start = (page - 1) * pageSize;
131
+ return {
132
+ items: rows.slice(start, start + pageSize),
133
+ meta: {
134
+ page,
135
+ pageSize,
136
+ total,
137
+ totalPages: Math.max(1, Math.ceil(total / pageSize))
138
+ },
139
+ provider: "skillhub"
140
+ };
141
+ }
142
+ try {
143
+ let skills = [...(await cachedFetchSkillHubCuratedIndex(ecoUrls)).skills].filter((s) => s.slug?.trim());
144
+ if (params.category?.trim()) {
145
+ const want = params.category.trim();
146
+ skills = skills.filter((s) => (s.categories ?? []).some((x) => String(x).trim() === want));
147
+ }
148
+ if (params.sort === "downloads") skills.sort((a, b) => (b.downloads ?? 0) - (a.downloads ?? 0));
149
+ else if (params.sort === "newest") skills.sort((a, b) => (a.rank ?? 999) - (b.rank ?? 999));
150
+ const rows = curatedSkillsToPackageItems(skills);
151
+ const total = rows.length;
152
+ const start = (page - 1) * pageSize;
153
+ return {
154
+ items: rows.slice(start, start + pageSize),
155
+ meta: {
156
+ page,
157
+ pageSize,
158
+ total,
159
+ totalPages: Math.max(1, Math.ceil(total / pageSize))
160
+ },
161
+ provider: "skillhub"
162
+ };
163
+ } catch {}
164
+ const slugs = await cachedGetDefaultSkillSlugs();
165
+ if (params.category?.trim()) {
166
+ let allItems = (await cachedBatchGetSkillHubSkills(slugs)).map((d) => convertSkillHubToPackageListItem(d.skill));
167
+ allItems = filterByCategory(allItems, params.category);
168
+ if (params.sort === "downloads") allItems = [...allItems].sort((a, b) => b.downloads - a.downloads);
169
+ else if (params.sort === "newest") allItems = [...allItems].sort((a, b) => Number(b.updatedAt) - Number(a.updatedAt));
170
+ const total = allItems.length;
171
+ const start = (page - 1) * pageSize;
172
+ return {
173
+ items: allItems.slice(start, start + pageSize),
174
+ meta: {
175
+ page,
176
+ pageSize,
177
+ total,
178
+ totalPages: Math.max(1, Math.ceil(total / pageSize))
179
+ },
180
+ provider: "skillhub"
181
+ };
182
+ }
183
+ const total = slugs.length;
184
+ const start = (page - 1) * pageSize;
185
+ const paginatedSlugs = slugs.slice(start, start + pageSize);
186
+ const totalPages = Math.max(1, Math.ceil(total / pageSize));
187
+ return {
188
+ items: (await cachedBatchGetSkillHubSkills(paginatedSlugs)).map((d) => convertSkillHubToPackageListItem(d.skill)),
189
+ meta: {
190
+ page,
191
+ pageSize,
192
+ total,
193
+ totalPages
194
+ },
195
+ provider: "skillhub"
196
+ };
197
+ },
198
+ async getPackageDetail(_config, packageName) {
199
+ const detail = await getSkillHubSkill(packageName);
200
+ const slug = detail.skill.slug;
201
+ const version = detail.latestVersion.version;
202
+ const changelog = detail.latestVersion.changelog;
203
+ let readme = null;
204
+ let docPath = null;
205
+ try {
206
+ const { files } = await getSkillHubSkillFiles(slug, version);
207
+ docPath = pickSkillHubDocFilePath(files);
208
+ if (docPath) readme = await getSkillHubSkillFileText(slug, docPath, version);
209
+ } catch {
210
+ readme = null;
211
+ }
212
+ const trimmed = readme?.trim() ?? "";
213
+ const isSkillMd = (docPath ? basename(docPath.replace(/\\/g, "/")).toLowerCase() : "") === "skill.md";
214
+ let skillDocPreview;
215
+ if (!trimmed) readme = skillHubFallbackReadmeMarkdown(detail);
216
+ else if (isSkillMd) try {
217
+ skillDocPreview = buildSkillMarkdownPreviewFromRaw(trimmed, {
218
+ name: detail.skill.slug,
219
+ description: detail.skill.summary_zh || detail.skill.summary || ""
220
+ });
221
+ readme = skillDocPreview.bodyMarkdown;
222
+ if (changelog?.trim() && !isPipelineOnlyChangelog(changelog)) readme = `${readme}\n\n---\n\n## Changelog\n\n${changelog.trim()}`;
223
+ } catch {
224
+ readme = trimmed;
225
+ if (changelog?.trim() && !isPipelineOnlyChangelog(changelog)) readme = `${trimmed}\n\n---\n\n## Changelog\n\n${changelog.trim()}`;
226
+ }
227
+ else {
228
+ readme = trimmed;
229
+ if (changelog?.trim() && !isPipelineOnlyChangelog(changelog)) readme = `${trimmed}\n\n---\n\n## Changelog\n\n${changelog.trim()}`;
230
+ }
231
+ return {
232
+ id: detail.skill.slug,
233
+ name: detail.skill.slug,
234
+ type: "skill",
235
+ description: detail.skill.summary_zh || detail.skill.summary,
236
+ readme,
237
+ skillDocPreview,
238
+ downloads: detail.skill.stats.downloads,
239
+ author: {
240
+ username: detail.owner.handle,
241
+ avatarUrl: detail.owner.image
242
+ },
243
+ latestVersion: {
244
+ version: detail.latestVersion.version,
245
+ changelog: detail.latestVersion.changelog,
246
+ publishedAt: String(detail.latestVersion.createdAt)
247
+ },
248
+ provider: "skillhub",
249
+ skillHubInfo: {
250
+ category: detail.skill.category,
251
+ installs: detail.skill.stats.installs,
252
+ stars: detail.skill.stats.stars,
253
+ securityReports: detail.latestVersion.securityReports
254
+ }
255
+ };
256
+ },
257
+ async downloadPackage(_config, packageName, version) {
258
+ const slug = packageName.trim();
259
+ if (version?.trim()) {
260
+ const { buffer, version: resolvedVersion } = await downloadSkillHubZipBuffer(slug, version);
261
+ return {
262
+ buffer,
263
+ skillId: isValidSkillId(slug) ? slug : "unknown",
264
+ version: resolvedVersion
265
+ };
266
+ }
267
+ const ecoUrls = resolveSkillHubEcosystemUrls();
268
+ try {
269
+ const buffer = await downloadSkillHubZipFromEcosystem(ecoUrls, slug);
270
+ let resolvedVersion = "1.0.0";
271
+ try {
272
+ resolvedVersion = (await getSkillHubSkillFiles(slug)).version;
273
+ } catch {}
274
+ return {
275
+ buffer,
276
+ skillId: isValidSkillId(slug) ? slug : "unknown",
277
+ version: resolvedVersion
278
+ };
279
+ } catch {
280
+ const { buffer, version: resolvedVersion } = await downloadSkillHubZipBuffer(slug);
281
+ return {
282
+ buffer,
283
+ skillId: isValidSkillId(slug) ? slug : "unknown",
284
+ version: resolvedVersion
285
+ };
286
+ }
287
+ }
288
+ };
289
+ //#endregion
290
+ export { skillhubMarketplaceAdapter };
291
+
292
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","names":[],"sources":["../../../../../../../src/agent/skills/marketplace/adapters/skillhub/adapter.ts"],"sourcesContent":["import { basename } from 'node:path';\n\nimport { isValidSkillId } from '../../../managed-store.js';\nimport type { SkillMarkdownPreviewPayload } from '../../../types.js';\nimport { buildSkillMarkdownPreviewFromRaw } from '../../../skill-markdown-preview-from-raw.js';\nimport type { MarketplaceCategoryOption, MarketplacePackageListItem } from '../store/store-api-client.js';\nimport {\n curatedSkillsToPackageItems,\n downloadSkillHubZipFromEcosystem,\n resolveSkillHubEcosystemUrls,\n searchSkillHubLightmake,\n} from './ecosystem-client.js';\nimport {\n getSkillHubSkill,\n getSkillHubSkillFileText,\n getSkillHubSkillFiles,\n pickSkillHubDocFilePath,\n downloadSkillHubZipBuffer,\n searchSkillHubSkills,\n type SkillHubSkill,\n} from './registry-client.js';\nimport {\n cachedBatchGetSkillHubSkills,\n cachedFetchSkillHubCuratedIndex,\n cachedGetDefaultSkillSlugs,\n cachedListSkillHubRegistryCategories,\n} from './skillhub-fetch-cache.js';\n\nimport type { SkillsMarketplaceAdapter } from '../../adapter.types.js';\n\n/** Batch size for POST /api/v1/skills/batch (slug lists from default discovery). */\nconst REGISTRY_SKILL_BATCH_CHUNK = 80;\n\nfunction humanizeRegistryCategoryKey(slug: string): string {\n return slug\n .replace(/_/g, '-')\n .split('-')\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())\n .join(' ');\n}\n\nfunction sourceLabelFromSkillSource(source: string | undefined): string | undefined {\n const s = source?.trim();\n if (!s) return undefined;\n const lower = s.toLowerCase();\n if (lower === 'clawhub') return 'ClawHub';\n if (lower === 'lightmake') return 'Lightmake';\n if (lower === 'skillhub') return 'SkillHub';\n return s.charAt(0).toUpperCase() + s.slice(1);\n}\n\nfunction filterByCategory(\n rows: MarketplacePackageListItem[],\n category?: string,\n): MarketplacePackageListItem[] {\n const want = category?.trim();\n if (!want) return rows;\n return rows.filter((r) => (r.categories ?? []).includes(want));\n}\n\nasync function collectRegistryCategoryKeysFromSlugs(slugs: string[]): Promise<Set<string>> {\n const used = new Set<string>();\n for (let i = 0; i < slugs.length; i += REGISTRY_SKILL_BATCH_CHUNK) {\n const chunk = slugs.slice(i, i + REGISTRY_SKILL_BATCH_CHUNK);\n const details = await cachedBatchGetSkillHubSkills(chunk);\n for (const d of details) {\n const k = d.skill.category?.trim();\n if (k) used.add(k);\n }\n }\n return used;\n}\n\nfunction isPipelineOnlyChangelog(text: string | null | undefined): boolean {\n if (!text?.trim()) return true;\n return /^synced by skillhub pipeline\\.?$/i.test(text.trim());\n}\n\nfunction skillHubFallbackReadmeMarkdown(detail: {\n skill: SkillHubSkill;\n latestVersion: { version: string };\n}): string {\n const s = detail.skill;\n const title = s.displayName?.trim() || s.slug;\n const zh = s.summary_zh?.trim();\n const en = s.summary?.trim();\n const body =\n zh && en && zh !== en\n ? `${zh}\\n\\n${en}`\n : zh || en || '_No description._';\n return `## ${title}\\n\\n**${s.slug}** · v${detail.latestVersion.version}\\n\\n${body}`;\n}\n\nfunction convertSkillHubToPackageListItem(detail: SkillHubSkill): MarketplacePackageListItem {\n const cat = detail.category?.trim();\n return {\n id: detail.slug,\n name: detail.displayName?.trim() || detail.slug,\n type: 'skill',\n description: detail.summary_zh || detail.summary,\n downloads: detail.stats.downloads,\n author: {\n username: detail.source || 'skillhub',\n avatarUrl: null,\n },\n latestVersion: detail.tags.latest || '1.0.0',\n updatedAt: String(detail.updatedAt),\n categories: cat ? [cat] : [],\n stars: detail.stats.stars,\n sourceLabel: sourceLabelFromSkillSource(detail.source),\n };\n}\n\nexport const skillhubMarketplaceAdapter: SkillsMarketplaceAdapter = {\n id: 'skillhub',\n\n async listCategories(_config) {\n const sortByLabel = (a: MarketplaceCategoryOption, b: MarketplaceCategoryOption) =>\n a.label.localeCompare(b.label, 'zh-Hans-CN', { sensitivity: 'base' });\n\n const ecoUrls = resolveSkillHubEcosystemUrls();\n try {\n const idx = await cachedFetchSkillHubCuratedIndex(ecoUrls);\n if (idx.skills?.length) {\n const map = new Map<string, MarketplaceCategoryOption>();\n for (const s of idx.skills) {\n for (const raw of s.categories ?? []) {\n const label = String(raw).trim();\n if (label) map.set(label, { id: label, label });\n }\n }\n return Array.from(map.values())\n .filter((c) => c.id.trim() && c.label.trim())\n .sort(sortByLabel);\n }\n } catch {\n /* fall through: registry-backed catalog */\n }\n\n try {\n const [taxonomy, slugs] = await Promise.all([\n cachedListSkillHubRegistryCategories(),\n cachedGetDefaultSkillSlugs(),\n ]);\n const usedKeys = await collectRegistryCategoryKeysFromSlugs(slugs);\n const taxByKey = new Map(taxonomy.map((t) => [t.key, t] as const));\n const options: MarketplaceCategoryOption[] = [];\n for (const key of usedKeys) {\n const t = taxByKey.get(key);\n const label =\n t?.name?.trim() || t?.nameEn?.trim() || humanizeRegistryCategoryKey(key).trim();\n if (!label) continue;\n options.push({ id: key, label });\n }\n options.sort((a, b) => {\n const oa = taxByKey.get(a.id)?.sortOrder ?? 999;\n const ob = taxByKey.get(b.id)?.sortOrder ?? 999;\n if (oa !== ob) return oa - ob;\n return sortByLabel(a, b);\n });\n return options;\n } catch {\n return [];\n }\n },\n\n async listPackages(_config, params) {\n const pageSize = params.pageSize ?? 20;\n const page = params.page ?? 1;\n const ecoUrls = resolveSkillHubEcosystemUrls();\n\n if (params.q?.trim()) {\n const q = params.q.trim();\n let rows: MarketplacePackageListItem[] = [];\n try {\n const fromLightmake = await searchSkillHubLightmake(ecoUrls, q, 100);\n rows = fromLightmake as MarketplacePackageListItem[];\n } catch {\n rows = [];\n }\n if (rows.length === 0) {\n const searchResult = await searchSkillHubSkills(q, 200);\n const details = await cachedBatchGetSkillHubSkills(searchResult.slugs);\n rows = details.map((d) => convertSkillHubToPackageListItem(d.skill));\n }\n rows = filterByCategory(rows, params.category);\n if (params.sort === 'downloads') {\n rows = [...rows].sort((a, b) => b.downloads - a.downloads);\n } else if (params.sort === 'newest') {\n rows = [...rows].sort((a, b) => Number(b.updatedAt) - Number(a.updatedAt));\n }\n const total = rows.length;\n const start = (page - 1) * pageSize;\n const items = rows.slice(start, start + pageSize);\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\n return {\n items,\n meta: { page, pageSize, total, totalPages },\n provider: 'skillhub',\n };\n }\n\n try {\n const idx = await cachedFetchSkillHubCuratedIndex(ecoUrls);\n let skills = [...idx.skills].filter((s) => s.slug?.trim());\n if (params.category?.trim()) {\n const want = params.category.trim();\n skills = skills.filter((s) =>\n (s.categories ?? []).some((x) => String(x).trim() === want),\n );\n }\n if (params.sort === 'downloads') {\n skills.sort((a, b) => (b.downloads ?? 0) - (a.downloads ?? 0));\n } else if (params.sort === 'newest') {\n skills.sort((a, b) => (a.rank ?? 999) - (b.rank ?? 999));\n }\n const rows = curatedSkillsToPackageItems(skills) as MarketplacePackageListItem[];\n const total = rows.length;\n const start = (page - 1) * pageSize;\n const items = rows.slice(start, start + pageSize);\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\n return {\n items,\n meta: { page, pageSize, total, totalPages },\n provider: 'skillhub',\n };\n } catch {\n // fall through\n }\n\n const slugs = await cachedGetDefaultSkillSlugs();\n if (params.category?.trim()) {\n const details = await cachedBatchGetSkillHubSkills(slugs);\n let allItems = details.map((d) => convertSkillHubToPackageListItem(d.skill));\n allItems = filterByCategory(allItems, params.category);\n if (params.sort === 'downloads') {\n allItems = [...allItems].sort((a, b) => b.downloads - a.downloads);\n } else if (params.sort === 'newest') {\n allItems = [...allItems].sort((a, b) => Number(b.updatedAt) - Number(a.updatedAt));\n }\n const total = allItems.length;\n const start = (page - 1) * pageSize;\n const items = allItems.slice(start, start + pageSize);\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\n return {\n items,\n meta: { page, pageSize, total, totalPages },\n provider: 'skillhub',\n };\n }\n\n const total = slugs.length;\n const start = (page - 1) * pageSize;\n const paginatedSlugs = slugs.slice(start, start + pageSize);\n const totalPages = Math.max(1, Math.ceil(total / pageSize));\n const details = await cachedBatchGetSkillHubSkills(paginatedSlugs);\n const items = details.map((d) => convertSkillHubToPackageListItem(d.skill));\n\n return {\n items,\n meta: { page, pageSize, total, totalPages },\n provider: 'skillhub',\n };\n },\n\n async getPackageDetail(_config, packageName) {\n const detail = await getSkillHubSkill(packageName);\n const slug = detail.skill.slug;\n const version = detail.latestVersion.version;\n const changelog = detail.latestVersion.changelog;\n\n let readme: string | null = null;\n let docPath: string | null = null;\n try {\n const { files } = await getSkillHubSkillFiles(slug, version);\n docPath = pickSkillHubDocFilePath(files);\n if (docPath) {\n readme = await getSkillHubSkillFileText(slug, docPath, version);\n }\n } catch {\n readme = null;\n }\n\n const trimmed = readme?.trim() ?? '';\n const docBase = docPath ? basename(docPath.replace(/\\\\/g, '/')).toLowerCase() : '';\n const isSkillMd = docBase === 'skill.md';\n\n let skillDocPreview: SkillMarkdownPreviewPayload | undefined;\n\n if (!trimmed) {\n readme = skillHubFallbackReadmeMarkdown(detail);\n } else if (isSkillMd) {\n try {\n skillDocPreview = buildSkillMarkdownPreviewFromRaw(trimmed, {\n name: detail.skill.slug,\n description: detail.skill.summary_zh || detail.skill.summary || '',\n });\n readme = skillDocPreview.bodyMarkdown;\n if (changelog?.trim() && !isPipelineOnlyChangelog(changelog)) {\n readme = `${readme}\\n\\n---\\n\\n## Changelog\\n\\n${changelog.trim()}`;\n }\n } catch {\n readme = trimmed;\n if (changelog?.trim() && !isPipelineOnlyChangelog(changelog)) {\n readme = `${trimmed}\\n\\n---\\n\\n## Changelog\\n\\n${changelog.trim()}`;\n }\n }\n } else {\n readme = trimmed;\n if (changelog?.trim() && !isPipelineOnlyChangelog(changelog)) {\n readme = `${trimmed}\\n\\n---\\n\\n## Changelog\\n\\n${changelog.trim()}`;\n }\n }\n\n return {\n id: detail.skill.slug,\n name: detail.skill.slug,\n type: 'skill',\n description: detail.skill.summary_zh || detail.skill.summary,\n readme,\n skillDocPreview,\n downloads: detail.skill.stats.downloads,\n author: {\n username: detail.owner.handle,\n avatarUrl: detail.owner.image,\n },\n latestVersion: {\n version: detail.latestVersion.version,\n changelog: detail.latestVersion.changelog,\n publishedAt: String(detail.latestVersion.createdAt),\n },\n provider: 'skillhub',\n skillHubInfo: {\n category: detail.skill.category,\n installs: detail.skill.stats.installs,\n stars: detail.skill.stats.stars,\n securityReports: detail.latestVersion.securityReports,\n },\n };\n },\n\n async downloadPackage(_config, packageName, version) {\n const slug = packageName.trim();\n if (version?.trim()) {\n const { buffer, version: resolvedVersion } = await downloadSkillHubZipBuffer(slug, version);\n return {\n buffer,\n skillId: isValidSkillId(slug) ? slug : 'unknown',\n version: resolvedVersion,\n };\n }\n\n const ecoUrls = resolveSkillHubEcosystemUrls();\n try {\n const buffer = await downloadSkillHubZipFromEcosystem(ecoUrls, slug);\n let resolvedVersion = '1.0.0';\n try {\n resolvedVersion = (await getSkillHubSkillFiles(slug)).version;\n } catch {\n // keep default\n }\n return {\n buffer,\n skillId: isValidSkillId(slug) ? slug : 'unknown',\n version: resolvedVersion,\n };\n } catch {\n const { buffer, version: resolvedVersion } = await downloadSkillHubZipBuffer(slug);\n return {\n buffer,\n skillId: isValidSkillId(slug) ? slug : 'unknown',\n version: resolvedVersion,\n };\n }\n },\n};\n"],"mappings":"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"}