@bradygaster/squad-sdk 0.7.0 → 0.8.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/README.md +296 -296
  2. package/dist/adapter/client.d.ts +243 -0
  3. package/dist/adapter/client.d.ts.map +1 -0
  4. package/dist/adapter/client.js +567 -0
  5. package/dist/adapter/client.js.map +1 -0
  6. package/dist/adapter/errors.d.ts +260 -0
  7. package/dist/adapter/errors.d.ts.map +1 -0
  8. package/dist/adapter/errors.js +362 -0
  9. package/dist/adapter/errors.js.map +1 -0
  10. package/dist/adapter/types.d.ts +779 -0
  11. package/dist/adapter/types.d.ts.map +1 -0
  12. package/dist/adapter/types.js +11 -0
  13. package/dist/adapter/types.js.map +1 -0
  14. package/dist/agents/charter-compiler.d.ts +102 -0
  15. package/dist/agents/charter-compiler.d.ts.map +1 -0
  16. package/dist/agents/charter-compiler.js +157 -0
  17. package/dist/agents/charter-compiler.js.map +1 -0
  18. package/dist/agents/history-shadow.d.ts +80 -0
  19. package/dist/agents/history-shadow.d.ts.map +1 -0
  20. package/dist/agents/history-shadow.js +239 -0
  21. package/dist/agents/history-shadow.js.map +1 -0
  22. package/dist/agents/index.d.ts +71 -0
  23. package/dist/agents/index.d.ts.map +1 -0
  24. package/dist/agents/index.js +183 -0
  25. package/dist/agents/index.js.map +1 -0
  26. package/dist/agents/lifecycle.d.ts +138 -0
  27. package/dist/agents/lifecycle.d.ts.map +1 -0
  28. package/dist/agents/lifecycle.js +284 -0
  29. package/dist/agents/lifecycle.js.map +1 -0
  30. package/dist/agents/model-selector.d.ts +80 -0
  31. package/dist/agents/model-selector.d.ts.map +1 -0
  32. package/dist/agents/model-selector.js +171 -0
  33. package/dist/agents/model-selector.js.map +1 -0
  34. package/dist/agents/onboarding.d.ts +65 -0
  35. package/dist/agents/onboarding.d.ts.map +1 -0
  36. package/dist/agents/onboarding.js +373 -0
  37. package/dist/agents/onboarding.js.map +1 -0
  38. package/dist/build/bundle.d.ts +32 -0
  39. package/dist/build/bundle.d.ts.map +1 -0
  40. package/dist/build/bundle.js +97 -0
  41. package/dist/build/bundle.js.map +1 -0
  42. package/dist/build/ci-pipeline.d.ts +51 -0
  43. package/dist/build/ci-pipeline.d.ts.map +1 -0
  44. package/dist/build/ci-pipeline.js +180 -0
  45. package/dist/build/ci-pipeline.js.map +1 -0
  46. package/dist/build/github-dist.d.ts +37 -0
  47. package/dist/build/github-dist.d.ts.map +1 -0
  48. package/dist/build/github-dist.js +117 -0
  49. package/dist/build/github-dist.js.map +1 -0
  50. package/dist/build/index.d.ts +11 -0
  51. package/dist/build/index.d.ts.map +1 -0
  52. package/dist/build/index.js +11 -0
  53. package/dist/build/index.js.map +1 -0
  54. package/dist/build/install-migration.d.ts +28 -0
  55. package/dist/build/install-migration.d.ts.map +1 -0
  56. package/dist/build/install-migration.js +103 -0
  57. package/dist/build/install-migration.js.map +1 -0
  58. package/dist/build/npm-package.d.ts +54 -0
  59. package/dist/build/npm-package.d.ts.map +1 -0
  60. package/dist/build/npm-package.js +128 -0
  61. package/dist/build/npm-package.js.map +1 -0
  62. package/dist/build/release.d.ts +108 -0
  63. package/dist/build/release.d.ts.map +1 -0
  64. package/dist/build/release.js +295 -0
  65. package/dist/build/release.js.map +1 -0
  66. package/dist/build/versioning.d.ts +38 -0
  67. package/dist/build/versioning.d.ts.map +1 -0
  68. package/dist/build/versioning.js +113 -0
  69. package/dist/build/versioning.js.map +1 -0
  70. package/dist/casting/casting-engine.d.ts +60 -0
  71. package/dist/casting/casting-engine.d.ts.map +1 -0
  72. package/dist/casting/casting-engine.js +223 -0
  73. package/dist/casting/casting-engine.js.map +1 -0
  74. package/dist/casting/casting-history.d.ts +54 -0
  75. package/dist/casting/casting-history.d.ts.map +1 -0
  76. package/dist/casting/casting-history.js +63 -0
  77. package/dist/casting/casting-history.js.map +1 -0
  78. package/dist/casting/index.d.ts +46 -0
  79. package/dist/casting/index.d.ts.map +1 -0
  80. package/dist/casting/index.js +45 -0
  81. package/dist/casting/index.js.map +1 -0
  82. package/dist/client/event-bus.d.ts +29 -0
  83. package/dist/client/event-bus.d.ts.map +1 -0
  84. package/dist/client/event-bus.js +52 -0
  85. package/dist/client/event-bus.js.map +1 -0
  86. package/dist/client/index.d.ts +100 -0
  87. package/dist/client/index.d.ts.map +1 -0
  88. package/dist/client/index.js +170 -0
  89. package/dist/client/index.js.map +1 -0
  90. package/dist/client/session-pool.d.ts +66 -0
  91. package/dist/client/session-pool.d.ts.map +1 -0
  92. package/dist/client/session-pool.js +145 -0
  93. package/dist/client/session-pool.js.map +1 -0
  94. package/dist/config/agent-doc.d.ts +43 -0
  95. package/dist/config/agent-doc.d.ts.map +1 -0
  96. package/dist/config/agent-doc.js +158 -0
  97. package/dist/config/agent-doc.js.map +1 -0
  98. package/dist/config/agent-source.d.ts +95 -0
  99. package/dist/config/agent-source.d.ts.map +1 -0
  100. package/dist/config/agent-source.js +274 -0
  101. package/dist/config/agent-source.js.map +1 -0
  102. package/dist/config/doc-sync.d.ts +66 -0
  103. package/dist/config/doc-sync.d.ts.map +1 -0
  104. package/dist/config/doc-sync.js +270 -0
  105. package/dist/config/doc-sync.js.map +1 -0
  106. package/dist/config/feature-audit.d.ts +49 -0
  107. package/dist/config/feature-audit.d.ts.map +1 -0
  108. package/dist/config/feature-audit.js +148 -0
  109. package/dist/config/feature-audit.js.map +1 -0
  110. package/dist/config/index.d.ts +15 -0
  111. package/dist/config/index.d.ts.map +1 -0
  112. package/dist/config/index.js +15 -0
  113. package/dist/config/index.js.map +1 -0
  114. package/dist/config/init.d.ts +61 -0
  115. package/dist/config/init.d.ts.map +1 -0
  116. package/dist/config/init.js +376 -0
  117. package/dist/config/init.js.map +1 -0
  118. package/dist/config/legacy-fallback.d.ts +83 -0
  119. package/dist/config/legacy-fallback.d.ts.map +1 -0
  120. package/dist/config/legacy-fallback.js +212 -0
  121. package/dist/config/legacy-fallback.js.map +1 -0
  122. package/dist/config/markdown-migration.d.ts +157 -0
  123. package/dist/config/markdown-migration.d.ts.map +1 -0
  124. package/dist/config/markdown-migration.js +434 -0
  125. package/dist/config/markdown-migration.js.map +1 -0
  126. package/dist/config/migration.d.ts +123 -0
  127. package/dist/config/migration.d.ts.map +1 -0
  128. package/dist/config/migration.js +273 -0
  129. package/dist/config/migration.js.map +1 -0
  130. package/dist/config/migrations/index.d.ts +36 -0
  131. package/dist/config/migrations/index.d.ts.map +1 -0
  132. package/dist/config/migrations/index.js +216 -0
  133. package/dist/config/migrations/index.js.map +1 -0
  134. package/dist/config/models.d.ts +134 -0
  135. package/dist/config/models.d.ts.map +1 -0
  136. package/dist/config/models.js +354 -0
  137. package/dist/config/models.js.map +1 -0
  138. package/dist/config/routing.d.ts +118 -0
  139. package/dist/config/routing.d.ts.map +1 -0
  140. package/dist/config/routing.js +247 -0
  141. package/dist/config/routing.js.map +1 -0
  142. package/dist/config/schema.d.ts +72 -0
  143. package/dist/config/schema.d.ts.map +1 -0
  144. package/dist/config/schema.js +63 -0
  145. package/dist/config/schema.js.map +1 -0
  146. package/dist/coordinator/coordinator.d.ts +82 -0
  147. package/dist/coordinator/coordinator.d.ts.map +1 -0
  148. package/dist/coordinator/coordinator.js +192 -0
  149. package/dist/coordinator/coordinator.js.map +1 -0
  150. package/dist/coordinator/direct-response.d.ts +83 -0
  151. package/dist/coordinator/direct-response.d.ts.map +1 -0
  152. package/dist/coordinator/direct-response.js +187 -0
  153. package/dist/coordinator/direct-response.js.map +1 -0
  154. package/dist/coordinator/fan-out.d.ts +83 -0
  155. package/dist/coordinator/fan-out.d.ts.map +1 -0
  156. package/dist/coordinator/fan-out.js +161 -0
  157. package/dist/coordinator/fan-out.js.map +1 -0
  158. package/dist/coordinator/index.d.ts +62 -0
  159. package/dist/coordinator/index.d.ts.map +1 -0
  160. package/dist/coordinator/index.js +171 -0
  161. package/dist/coordinator/index.js.map +1 -0
  162. package/dist/coordinator/response-tiers.d.ts +49 -0
  163. package/dist/coordinator/response-tiers.d.ts.map +1 -0
  164. package/dist/coordinator/response-tiers.js +149 -0
  165. package/dist/coordinator/response-tiers.js.map +1 -0
  166. package/dist/hooks/index.d.ts +103 -0
  167. package/dist/hooks/index.d.ts.map +1 -0
  168. package/dist/hooks/index.js +279 -0
  169. package/dist/hooks/index.js.map +1 -0
  170. package/dist/index.d.ts +33 -1
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +33 -3
  173. package/dist/index.js.map +1 -1
  174. package/dist/marketplace/backend.d.ts +35 -0
  175. package/dist/marketplace/backend.d.ts.map +1 -0
  176. package/dist/marketplace/backend.js +99 -0
  177. package/dist/marketplace/backend.js.map +1 -0
  178. package/dist/marketplace/browser.d.ts +33 -0
  179. package/dist/marketplace/browser.d.ts.map +1 -0
  180. package/dist/marketplace/browser.js +97 -0
  181. package/dist/marketplace/browser.js.map +1 -0
  182. package/dist/marketplace/extension-adapter.d.ts +51 -0
  183. package/dist/marketplace/extension-adapter.d.ts.map +1 -0
  184. package/dist/marketplace/extension-adapter.js +81 -0
  185. package/dist/marketplace/extension-adapter.js.map +1 -0
  186. package/dist/marketplace/index.d.ts +51 -0
  187. package/dist/marketplace/index.d.ts.map +1 -0
  188. package/dist/marketplace/index.js +108 -0
  189. package/dist/marketplace/index.js.map +1 -0
  190. package/dist/marketplace/packaging.d.ts +25 -0
  191. package/dist/marketplace/packaging.d.ts.map +1 -0
  192. package/dist/marketplace/packaging.js +117 -0
  193. package/dist/marketplace/packaging.js.map +1 -0
  194. package/dist/marketplace/schema.d.ts +50 -0
  195. package/dist/marketplace/schema.d.ts.map +1 -0
  196. package/dist/marketplace/schema.js +120 -0
  197. package/dist/marketplace/schema.js.map +1 -0
  198. package/dist/marketplace/security.d.ts +26 -0
  199. package/dist/marketplace/security.d.ts.map +1 -0
  200. package/dist/marketplace/security.js +199 -0
  201. package/dist/marketplace/security.js.map +1 -0
  202. package/dist/parsers.d.ts +15 -0
  203. package/dist/parsers.d.ts.map +1 -0
  204. package/dist/parsers.js +15 -0
  205. package/dist/parsers.js.map +1 -0
  206. package/dist/ralph/index.d.ts +58 -0
  207. package/dist/ralph/index.d.ts.map +1 -0
  208. package/dist/ralph/index.js +128 -0
  209. package/dist/ralph/index.js.map +1 -0
  210. package/dist/resolution.d.ts +47 -0
  211. package/dist/resolution.d.ts.map +1 -0
  212. package/dist/resolution.js +106 -0
  213. package/dist/resolution.js.map +1 -0
  214. package/dist/runtime/benchmarks.d.ts +121 -0
  215. package/dist/runtime/benchmarks.d.ts.map +1 -0
  216. package/dist/runtime/benchmarks.js +251 -0
  217. package/dist/runtime/benchmarks.js.map +1 -0
  218. package/dist/runtime/config.d.ts +314 -0
  219. package/dist/runtime/config.d.ts.map +1 -0
  220. package/dist/runtime/config.js +467 -0
  221. package/dist/runtime/config.js.map +1 -0
  222. package/dist/runtime/constants.d.ts +35 -0
  223. package/dist/runtime/constants.d.ts.map +1 -0
  224. package/dist/runtime/constants.js +58 -0
  225. package/dist/runtime/constants.js.map +1 -0
  226. package/dist/runtime/cost-tracker.d.ts +73 -0
  227. package/dist/runtime/cost-tracker.d.ts.map +1 -0
  228. package/dist/runtime/cost-tracker.js +157 -0
  229. package/dist/runtime/cost-tracker.js.map +1 -0
  230. package/dist/runtime/event-bus-otel-bridge.d.ts +19 -0
  231. package/dist/runtime/event-bus-otel-bridge.d.ts.map +1 -0
  232. package/dist/runtime/event-bus-otel-bridge.js +61 -0
  233. package/dist/runtime/event-bus-otel-bridge.js.map +1 -0
  234. package/dist/runtime/event-bus-ws-bridge.d.ts +35 -0
  235. package/dist/runtime/event-bus-ws-bridge.d.ts.map +1 -0
  236. package/dist/runtime/event-bus-ws-bridge.js +55 -0
  237. package/dist/runtime/event-bus-ws-bridge.js.map +1 -0
  238. package/dist/runtime/event-bus.d.ts +190 -0
  239. package/dist/runtime/event-bus.d.ts.map +1 -0
  240. package/dist/runtime/event-bus.js +218 -0
  241. package/dist/runtime/event-bus.js.map +1 -0
  242. package/dist/runtime/event-payloads.d.ts +108 -0
  243. package/dist/runtime/event-payloads.d.ts.map +1 -0
  244. package/dist/runtime/event-payloads.js +28 -0
  245. package/dist/runtime/event-payloads.js.map +1 -0
  246. package/dist/runtime/health.d.ts +66 -0
  247. package/dist/runtime/health.d.ts.map +1 -0
  248. package/dist/runtime/health.js +112 -0
  249. package/dist/runtime/health.js.map +1 -0
  250. package/dist/runtime/i18n.d.ts +54 -0
  251. package/dist/runtime/i18n.d.ts.map +1 -0
  252. package/dist/runtime/i18n.js +126 -0
  253. package/dist/runtime/i18n.js.map +1 -0
  254. package/dist/runtime/offline.d.ts +64 -0
  255. package/dist/runtime/offline.d.ts.map +1 -0
  256. package/dist/runtime/offline.js +108 -0
  257. package/dist/runtime/offline.js.map +1 -0
  258. package/dist/runtime/otel-bridge.d.ts +52 -0
  259. package/dist/runtime/otel-bridge.d.ts.map +1 -0
  260. package/dist/runtime/otel-bridge.js +132 -0
  261. package/dist/runtime/otel-bridge.js.map +1 -0
  262. package/dist/runtime/otel-init.d.ts +72 -0
  263. package/dist/runtime/otel-init.d.ts.map +1 -0
  264. package/dist/runtime/otel-init.js +68 -0
  265. package/dist/runtime/otel-init.js.map +1 -0
  266. package/dist/runtime/otel-metrics.d.ts +42 -0
  267. package/dist/runtime/otel-metrics.d.ts.map +1 -0
  268. package/dist/runtime/otel-metrics.js +196 -0
  269. package/dist/runtime/otel-metrics.js.map +1 -0
  270. package/dist/runtime/otel.d.ts +53 -0
  271. package/dist/runtime/otel.d.ts.map +1 -0
  272. package/dist/runtime/otel.js +127 -0
  273. package/dist/runtime/otel.js.map +1 -0
  274. package/dist/runtime/squad-observer.d.ts +75 -0
  275. package/dist/runtime/squad-observer.d.ts.map +1 -0
  276. package/dist/runtime/squad-observer.js +190 -0
  277. package/dist/runtime/squad-observer.js.map +1 -0
  278. package/dist/runtime/streaming.d.ts +106 -0
  279. package/dist/runtime/streaming.d.ts.map +1 -0
  280. package/dist/runtime/streaming.js +192 -0
  281. package/dist/runtime/streaming.js.map +1 -0
  282. package/dist/runtime/telemetry.d.ts +82 -0
  283. package/dist/runtime/telemetry.d.ts.map +1 -0
  284. package/dist/runtime/telemetry.js +120 -0
  285. package/dist/runtime/telemetry.js.map +1 -0
  286. package/dist/sharing/agent-repo.d.ts +33 -0
  287. package/dist/sharing/agent-repo.d.ts.map +1 -0
  288. package/dist/sharing/agent-repo.js +79 -0
  289. package/dist/sharing/agent-repo.js.map +1 -0
  290. package/dist/sharing/cache.d.ts +36 -0
  291. package/dist/sharing/cache.d.ts.map +1 -0
  292. package/dist/sharing/cache.js +85 -0
  293. package/dist/sharing/cache.js.map +1 -0
  294. package/dist/sharing/conflicts.d.ts +32 -0
  295. package/dist/sharing/conflicts.d.ts.map +1 -0
  296. package/dist/sharing/conflicts.js +121 -0
  297. package/dist/sharing/conflicts.js.map +1 -0
  298. package/dist/sharing/export.d.ts +50 -0
  299. package/dist/sharing/export.d.ts.map +1 -0
  300. package/dist/sharing/export.js +156 -0
  301. package/dist/sharing/export.js.map +1 -0
  302. package/dist/sharing/history-split.d.ts +34 -0
  303. package/dist/sharing/history-split.d.ts.map +1 -0
  304. package/dist/sharing/history-split.js +101 -0
  305. package/dist/sharing/history-split.js.map +1 -0
  306. package/dist/sharing/import.d.ts +37 -0
  307. package/dist/sharing/import.d.ts.map +1 -0
  308. package/dist/sharing/import.js +138 -0
  309. package/dist/sharing/import.js.map +1 -0
  310. package/dist/sharing/index.d.ts +11 -0
  311. package/dist/sharing/index.d.ts.map +1 -0
  312. package/dist/sharing/index.js +11 -0
  313. package/dist/sharing/index.js.map +1 -0
  314. package/dist/sharing/versioning.d.ts +32 -0
  315. package/dist/sharing/versioning.d.ts.map +1 -0
  316. package/dist/sharing/versioning.js +64 -0
  317. package/dist/sharing/versioning.js.map +1 -0
  318. package/dist/skills/index.d.ts +49 -0
  319. package/dist/skills/index.d.ts.map +1 -0
  320. package/dist/skills/index.js +85 -0
  321. package/dist/skills/index.js.map +1 -0
  322. package/dist/skills/skill-loader.d.ts +56 -0
  323. package/dist/skills/skill-loader.d.ts.map +1 -0
  324. package/dist/skills/skill-loader.js +106 -0
  325. package/dist/skills/skill-loader.js.map +1 -0
  326. package/dist/skills/skill-source.d.ts +63 -0
  327. package/dist/skills/skill-source.d.ts.map +1 -0
  328. package/dist/skills/skill-source.js +199 -0
  329. package/dist/skills/skill-source.js.map +1 -0
  330. package/dist/tools/index.d.ts +95 -0
  331. package/dist/tools/index.d.ts.map +1 -0
  332. package/dist/tools/index.js +475 -0
  333. package/dist/tools/index.js.map +1 -0
  334. package/dist/types.d.ts +43 -0
  335. package/dist/types.d.ts.map +1 -0
  336. package/dist/types.js +8 -0
  337. package/dist/types.js.map +1 -0
  338. package/dist/upstream/index.d.ts +8 -0
  339. package/dist/upstream/index.d.ts.map +1 -0
  340. package/dist/upstream/index.js +7 -0
  341. package/dist/upstream/index.js.map +1 -0
  342. package/dist/upstream/resolver.d.ts +37 -0
  343. package/dist/upstream/resolver.d.ts.map +1 -0
  344. package/dist/upstream/resolver.js +234 -0
  345. package/dist/upstream/resolver.js.map +1 -0
  346. package/dist/upstream/types.d.ts +55 -0
  347. package/dist/upstream/types.d.ts.map +1 -0
  348. package/dist/upstream/types.js +11 -0
  349. package/dist/upstream/types.js.map +1 -0
  350. package/dist/utils/normalize-eol.d.ts +6 -0
  351. package/dist/utils/normalize-eol.d.ts.map +1 -0
  352. package/dist/utils/normalize-eol.js +8 -0
  353. package/dist/utils/normalize-eol.js.map +1 -0
  354. package/package.json +197 -63
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Skills System (M3-3, Issue #141)
3
+ *
4
+ * Domain-specific knowledge packages that agents load on-demand.
5
+ * Skills are matched by keyword triggers and agent role affinity,
6
+ * then injected into agent context as markdown.
7
+ */
8
+ import type { SkillDefinition } from './skill-loader.js';
9
+ export { loadSkillsFromDirectory, parseFrontmatter, parseSkillFile } from './skill-loader.js';
10
+ export type { SkillDefinition } from './skill-loader.js';
11
+ export * from './skill-source.js';
12
+ export interface SkillMatch {
13
+ /** The matched skill */
14
+ skill: SkillDefinition;
15
+ /** Relevance score (0–1) */
16
+ score: number;
17
+ /** Reason the skill matched */
18
+ reason: string;
19
+ }
20
+ export declare class SkillRegistry {
21
+ private skills;
22
+ /** Register a skill definition. */
23
+ registerSkill(skill: SkillDefinition): void;
24
+ /** Unregister a skill by ID. */
25
+ unregisterSkill(skillId: string): boolean;
26
+ /** Get a skill by ID. */
27
+ getSkill(skillId: string): SkillDefinition | undefined;
28
+ /** Get all registered skills. */
29
+ getAllSkills(): SkillDefinition[];
30
+ /** Number of registered skills. */
31
+ get size(): number;
32
+ /**
33
+ * Match skills relevant to a task for a given agent role.
34
+ *
35
+ * Scoring:
36
+ * - +0.5 for each trigger keyword found in the task text
37
+ * - +0.3 if the agent role matches the skill's agentRoles
38
+ * - Scores are clamped to [0, 1]
39
+ *
40
+ * Returns matches sorted by score descending, filtered to score > 0.
41
+ */
42
+ matchSkills(task: string, agentRole: string): SkillMatch[];
43
+ /**
44
+ * Load a skill's content for injection into an agent's context.
45
+ * Returns the markdown content, or undefined if skill not found.
46
+ */
47
+ loadSkill(skillId: string): string | undefined;
48
+ }
49
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAC9F,YAAY,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACzD,cAAc,mBAAmB,CAAC;AAIlC,MAAM,WAAW,UAAU;IACzB,wBAAwB;IACxB,KAAK,EAAE,eAAe,CAAC;IACvB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA2C;IAEzD,mCAAmC;IACnC,aAAa,CAAC,KAAK,EAAE,eAAe,GAAG,IAAI;IAI3C,gCAAgC;IAChC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIzC,yBAAyB;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS;IAItD,iCAAiC;IACjC,YAAY,IAAI,eAAe,EAAE;IAIjC,mCAAmC;IACnC,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;;;;;OASG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,UAAU,EAAE;IA0C1D;;;OAGG;IACH,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;CAG/C"}
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Skills System (M3-3, Issue #141)
3
+ *
4
+ * Domain-specific knowledge packages that agents load on-demand.
5
+ * Skills are matched by keyword triggers and agent role affinity,
6
+ * then injected into agent context as markdown.
7
+ */
8
+ export { loadSkillsFromDirectory, parseFrontmatter, parseSkillFile } from './skill-loader.js';
9
+ export * from './skill-source.js';
10
+ // --- Skill Registry ---
11
+ export class SkillRegistry {
12
+ skills = new Map();
13
+ /** Register a skill definition. */
14
+ registerSkill(skill) {
15
+ this.skills.set(skill.id, skill);
16
+ }
17
+ /** Unregister a skill by ID. */
18
+ unregisterSkill(skillId) {
19
+ return this.skills.delete(skillId);
20
+ }
21
+ /** Get a skill by ID. */
22
+ getSkill(skillId) {
23
+ return this.skills.get(skillId);
24
+ }
25
+ /** Get all registered skills. */
26
+ getAllSkills() {
27
+ return Array.from(this.skills.values());
28
+ }
29
+ /** Number of registered skills. */
30
+ get size() {
31
+ return this.skills.size;
32
+ }
33
+ /**
34
+ * Match skills relevant to a task for a given agent role.
35
+ *
36
+ * Scoring:
37
+ * - +0.5 for each trigger keyword found in the task text
38
+ * - +0.3 if the agent role matches the skill's agentRoles
39
+ * - Scores are clamped to [0, 1]
40
+ *
41
+ * Returns matches sorted by score descending, filtered to score > 0.
42
+ */
43
+ matchSkills(task, agentRole) {
44
+ const lowerTask = task.toLowerCase();
45
+ const matches = [];
46
+ for (const skill of this.skills.values()) {
47
+ let score = 0;
48
+ const reasons = [];
49
+ // Trigger keyword matching
50
+ const hitTriggers = [];
51
+ for (const trigger of skill.triggers) {
52
+ if (lowerTask.includes(trigger.toLowerCase())) {
53
+ hitTriggers.push(trigger);
54
+ }
55
+ }
56
+ if (hitTriggers.length > 0) {
57
+ score += Math.min(hitTriggers.length * 0.5, 0.7);
58
+ reasons.push(`triggers: ${hitTriggers.join(', ')}`);
59
+ }
60
+ // Agent role affinity
61
+ if (skill.agentRoles.length > 0 &&
62
+ skill.agentRoles.some((r) => r.toLowerCase() === agentRole.toLowerCase())) {
63
+ score += 0.3;
64
+ reasons.push(`role affinity: ${agentRole}`);
65
+ }
66
+ if (score > 0) {
67
+ matches.push({
68
+ skill,
69
+ score: Math.min(score, 1),
70
+ reason: reasons.join('; '),
71
+ });
72
+ }
73
+ }
74
+ matches.sort((a, b) => b.score - a.score);
75
+ return matches;
76
+ }
77
+ /**
78
+ * Load a skill's content for injection into an agent's context.
79
+ * Returns the markdown content, or undefined if skill not found.
80
+ */
81
+ loadSkill(skillId) {
82
+ return this.skills.get(skillId)?.content;
83
+ }
84
+ }
85
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/skills/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Skill Loader (M3-3, Issue #141)
3
+ *
4
+ * Reads SKILL.md files from a directory and parses them into
5
+ * SkillDefinition objects. Handles missing / malformed files gracefully.
6
+ *
7
+ * SKILL.md format:
8
+ * ```
9
+ * ---
10
+ * name: TypeScript Testing
11
+ * domain: testing
12
+ * triggers: [vitest, jest, test, spec]
13
+ * roles: [tester, developer]
14
+ * ---
15
+ * Markdown body content…
16
+ * ```
17
+ */
18
+ export interface SkillDefinition {
19
+ /** Unique identifier (derived from directory name) */
20
+ id: string;
21
+ /** Human-readable name */
22
+ name: string;
23
+ /** Knowledge domain */
24
+ domain: string;
25
+ /** Markdown content body */
26
+ content: string;
27
+ /** Keyword patterns that trigger this skill */
28
+ triggers: string[];
29
+ /** Agent roles that have affinity for this skill */
30
+ agentRoles: string[];
31
+ }
32
+ /**
33
+ * Parse simple YAML-like frontmatter from a SKILL.md string.
34
+ * Returns the parsed fields and the remaining body content.
35
+ */
36
+ export declare function parseFrontmatter(raw: string): {
37
+ meta: Record<string, string | string[]>;
38
+ body: string;
39
+ };
40
+ /**
41
+ * Load all skill definitions from a directory.
42
+ *
43
+ * Expected structure:
44
+ * dir/
45
+ * skill-a/SKILL.md
46
+ * skill-b/SKILL.md
47
+ *
48
+ * Malformed or missing files are silently skipped.
49
+ */
50
+ export declare function loadSkillsFromDirectory(dir: string): SkillDefinition[];
51
+ /**
52
+ * Parse a single SKILL.md raw string into a SkillDefinition.
53
+ * Returns undefined if required fields are missing.
54
+ */
55
+ export declare function parseSkillFile(id: string, raw: string): SkillDefinition | undefined;
56
+ //# sourceMappingURL=skill-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-loader.d.ts","sourceRoot":"","sources":["../../src/skills/skill-loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAQH,MAAM,WAAW,eAAe;IAC9B,sDAAsD;IACtD,EAAE,EAAE,MAAM,CAAC;IACX,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,uBAAuB;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,oDAAoD;IACpD,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAID;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,GACV;IAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA4B3D;AAID;;;;;;;;;GASG;AACH,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,EAAE,CA2BtE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAUnF"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Skill Loader (M3-3, Issue #141)
3
+ *
4
+ * Reads SKILL.md files from a directory and parses them into
5
+ * SkillDefinition objects. Handles missing / malformed files gracefully.
6
+ *
7
+ * SKILL.md format:
8
+ * ```
9
+ * ---
10
+ * name: TypeScript Testing
11
+ * domain: testing
12
+ * triggers: [vitest, jest, test, spec]
13
+ * roles: [tester, developer]
14
+ * ---
15
+ * Markdown body content…
16
+ * ```
17
+ */
18
+ import * as fs from 'node:fs';
19
+ import * as path from 'node:path';
20
+ import { normalizeEol } from '../utils/normalize-eol.js';
21
+ // --- Frontmatter Parser ---
22
+ /**
23
+ * Parse simple YAML-like frontmatter from a SKILL.md string.
24
+ * Returns the parsed fields and the remaining body content.
25
+ */
26
+ export function parseFrontmatter(raw) {
27
+ raw = normalizeEol(raw);
28
+ const meta = {};
29
+ let body = raw;
30
+ const match = raw.match(/^---\s*\n([\s\S]*?)---\s*\n?([\s\S]*)$/);
31
+ if (!match)
32
+ return { meta, body };
33
+ const frontmatter = match[1];
34
+ body = match[2].trim();
35
+ for (const line of frontmatter.split('\n')) {
36
+ const colonIdx = line.indexOf(':');
37
+ if (colonIdx === -1)
38
+ continue;
39
+ const key = line.slice(0, colonIdx).trim();
40
+ let value = line.slice(colonIdx + 1).trim();
41
+ // Parse inline arrays: [a, b, c]
42
+ const arrayMatch = value.match(/^\[(.+)\]$/);
43
+ if (arrayMatch) {
44
+ meta[key] = arrayMatch[1].split(',').map((s) => s.trim()).filter(Boolean);
45
+ }
46
+ else {
47
+ meta[key] = value;
48
+ }
49
+ }
50
+ return { meta, body };
51
+ }
52
+ // --- Directory Loader ---
53
+ /**
54
+ * Load all skill definitions from a directory.
55
+ *
56
+ * Expected structure:
57
+ * dir/
58
+ * skill-a/SKILL.md
59
+ * skill-b/SKILL.md
60
+ *
61
+ * Malformed or missing files are silently skipped.
62
+ */
63
+ export function loadSkillsFromDirectory(dir) {
64
+ if (!fs.existsSync(dir))
65
+ return [];
66
+ const skills = [];
67
+ let entries;
68
+ try {
69
+ entries = fs.readdirSync(dir, { withFileTypes: true });
70
+ }
71
+ catch {
72
+ return [];
73
+ }
74
+ for (const entry of entries) {
75
+ if (!entry.isDirectory())
76
+ continue;
77
+ const skillFile = path.join(dir, entry.name, 'SKILL.md');
78
+ if (!fs.existsSync(skillFile))
79
+ continue;
80
+ try {
81
+ const raw = fs.readFileSync(skillFile, 'utf-8');
82
+ const skill = parseSkillFile(entry.name, raw);
83
+ if (skill)
84
+ skills.push(skill);
85
+ }
86
+ catch {
87
+ // Malformed file — skip gracefully
88
+ }
89
+ }
90
+ return skills;
91
+ }
92
+ /**
93
+ * Parse a single SKILL.md raw string into a SkillDefinition.
94
+ * Returns undefined if required fields are missing.
95
+ */
96
+ export function parseSkillFile(id, raw) {
97
+ const { meta, body } = parseFrontmatter(raw);
98
+ if (!body)
99
+ return undefined;
100
+ const name = typeof meta.name === 'string' ? meta.name : id;
101
+ const domain = typeof meta.domain === 'string' ? meta.domain : 'general';
102
+ const triggers = Array.isArray(meta.triggers) ? meta.triggers : [];
103
+ const agentRoles = Array.isArray(meta.roles) ? meta.roles : [];
104
+ return { id, name, domain, content: body, triggers, agentRoles };
105
+ }
106
+ //# sourceMappingURL=skill-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../src/skills/skill-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Skill Source Interface & Implementations (M5-5, Issue #128)
3
+ *
4
+ * Pluggable skill discovery from local filesystem or GitHub repos.
5
+ */
6
+ import { type SkillDefinition } from './skill-loader.js';
7
+ import type { GitHubFetcher } from '../config/agent-source.js';
8
+ export interface SkillSource {
9
+ readonly name: string;
10
+ readonly type: 'local' | 'github';
11
+ readonly priority: number;
12
+ listSkills(): Promise<SkillManifest[]>;
13
+ getSkill(id: string): Promise<SkillDefinition | null>;
14
+ getContent(id: string): Promise<string | null>;
15
+ }
16
+ export interface SkillManifest {
17
+ id: string;
18
+ name: string;
19
+ domain: string;
20
+ source: string;
21
+ }
22
+ export declare class LocalSkillSource implements SkillSource {
23
+ private basePath;
24
+ readonly name = "local";
25
+ readonly type: "local";
26
+ readonly priority: number;
27
+ constructor(basePath: string, priority?: number);
28
+ private get skillsDir();
29
+ listSkills(): Promise<SkillManifest[]>;
30
+ getSkill(id: string): Promise<SkillDefinition | null>;
31
+ getContent(id: string): Promise<string | null>;
32
+ }
33
+ export declare class GitHubSkillSource implements SkillSource {
34
+ readonly name = "github";
35
+ readonly type: "github";
36
+ readonly priority: number;
37
+ private owner;
38
+ private repoName;
39
+ private branch?;
40
+ private pathPrefix;
41
+ private fetcher;
42
+ constructor(repo: string, options?: {
43
+ ref?: string;
44
+ pathPrefix?: string;
45
+ fetcher?: GitHubFetcher;
46
+ priority?: number;
47
+ });
48
+ listSkills(): Promise<SkillManifest[]>;
49
+ getSkill(id: string): Promise<SkillDefinition | null>;
50
+ getContent(id: string): Promise<string | null>;
51
+ }
52
+ export declare class SkillSourceRegistry {
53
+ private sources;
54
+ register(source: SkillSource): void;
55
+ unregister(name: string): boolean;
56
+ getSource(name: string): SkillSource | undefined;
57
+ /** Sources sorted by priority descending (higher priority first). */
58
+ private sortedSources;
59
+ listAllSkills(): Promise<SkillManifest[]>;
60
+ findSkill(id: string): Promise<SkillDefinition | null>;
61
+ getContent(id: string): Promise<string | null>;
62
+ }
63
+ //# sourceMappingURL=skill-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-source.d.ts","sourceRoot":"","sources":["../../src/skills/skill-source.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAoB,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC3E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAI/D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAAC;IACtD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAID,qBAAa,gBAAiB,YAAW,WAAW;IAKtC,OAAO,CAAC,QAAQ;IAJ5B,QAAQ,CAAC,IAAI,WAAW;IACxB,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;gBAEN,QAAQ,EAAE,MAAM,EAAE,QAAQ,SAAI;IAIlD,OAAO,KAAK,SAAS,GAEpB;IAEK,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IA8BtC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAoBrD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAWrD;AAID,qBAAa,iBAAkB,YAAW,WAAW;IACnD,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAC,CAAS;IACxB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAgB;gBAG7B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,aAAa,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAiBvF,UAAU,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAwBtC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAkBrD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CASrD;AAID,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,OAAO,CAAuC;IAEtD,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAInC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIjC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAIhD,qEAAqE;IACrE,OAAO,CAAC,aAAa;IAIf,aAAa,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;IAMzC,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAQtD,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAOrD"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * Skill Source Interface & Implementations (M5-5, Issue #128)
3
+ *
4
+ * Pluggable skill discovery from local filesystem or GitHub repos.
5
+ */
6
+ import * as fs from 'node:fs';
7
+ import * as path from 'node:path';
8
+ import { parseFrontmatter } from './skill-loader.js';
9
+ // --- Local implementation ---
10
+ export class LocalSkillSource {
11
+ basePath;
12
+ name = 'local';
13
+ type = 'local';
14
+ priority;
15
+ constructor(basePath, priority = 0) {
16
+ this.basePath = basePath;
17
+ this.priority = priority;
18
+ }
19
+ get skillsDir() {
20
+ return path.join(this.basePath, '.squad', 'skills');
21
+ }
22
+ async listSkills() {
23
+ if (!fs.existsSync(this.skillsDir))
24
+ return [];
25
+ let entries;
26
+ try {
27
+ entries = fs.readdirSync(this.skillsDir, { withFileTypes: true });
28
+ }
29
+ catch {
30
+ return [];
31
+ }
32
+ const manifests = [];
33
+ for (const entry of entries) {
34
+ if (!entry.isDirectory())
35
+ continue;
36
+ const skillFile = path.join(this.skillsDir, entry.name, 'SKILL.md');
37
+ if (!fs.existsSync(skillFile))
38
+ continue;
39
+ try {
40
+ const raw = fs.readFileSync(skillFile, 'utf-8');
41
+ const { meta } = parseFrontmatter(raw);
42
+ manifests.push({
43
+ id: entry.name,
44
+ name: typeof meta.name === 'string' ? meta.name : entry.name,
45
+ domain: typeof meta.domain === 'string' ? meta.domain : 'general',
46
+ source: 'local',
47
+ });
48
+ }
49
+ catch {
50
+ // skip malformed
51
+ }
52
+ }
53
+ return manifests;
54
+ }
55
+ async getSkill(id) {
56
+ const skillFile = path.join(this.skillsDir, id, 'SKILL.md');
57
+ if (!fs.existsSync(skillFile))
58
+ return null;
59
+ try {
60
+ const raw = fs.readFileSync(skillFile, 'utf-8');
61
+ const { meta, body } = parseFrontmatter(raw);
62
+ if (!body)
63
+ return null;
64
+ return {
65
+ id,
66
+ name: typeof meta.name === 'string' ? meta.name : id,
67
+ domain: typeof meta.domain === 'string' ? meta.domain : 'general',
68
+ content: body,
69
+ triggers: Array.isArray(meta.triggers) ? meta.triggers : [],
70
+ agentRoles: Array.isArray(meta.roles) ? meta.roles : [],
71
+ };
72
+ }
73
+ catch {
74
+ return null;
75
+ }
76
+ }
77
+ async getContent(id) {
78
+ const skillFile = path.join(this.skillsDir, id, 'SKILL.md');
79
+ if (!fs.existsSync(skillFile))
80
+ return null;
81
+ try {
82
+ const raw = fs.readFileSync(skillFile, 'utf-8');
83
+ const { body } = parseFrontmatter(raw);
84
+ return body || null;
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ }
90
+ }
91
+ // --- GitHub implementation ---
92
+ export class GitHubSkillSource {
93
+ name = 'github';
94
+ type = 'github';
95
+ priority;
96
+ owner;
97
+ repoName;
98
+ branch;
99
+ pathPrefix;
100
+ fetcher;
101
+ constructor(repo, options) {
102
+ const parts = repo.split('/');
103
+ if (parts.length !== 2 || !parts[0] || !parts[1]) {
104
+ throw new Error(`Invalid repo format "${repo}": expected "owner/repo"`);
105
+ }
106
+ this.owner = parts[0];
107
+ this.repoName = parts[1];
108
+ this.branch = options?.ref;
109
+ this.pathPrefix = options?.pathPrefix ?? '.squad/skills';
110
+ this.fetcher = options?.fetcher ?? {
111
+ async listDirectory() { throw new Error('No GitHubFetcher configured'); },
112
+ async getFileContent() { throw new Error('No GitHubFetcher configured'); },
113
+ };
114
+ this.priority = options?.priority ?? 0;
115
+ }
116
+ async listSkills() {
117
+ const entries = await this.fetcher.listDirectory(this.owner, this.repoName, this.pathPrefix, this.branch);
118
+ const dirs = entries.filter(e => e.type === 'dir');
119
+ const manifests = [];
120
+ for (const dir of dirs) {
121
+ const skillPath = `${this.pathPrefix}/${dir.name}/SKILL.md`;
122
+ const content = await this.fetcher.getFileContent(this.owner, this.repoName, skillPath, this.branch);
123
+ if (!content)
124
+ continue;
125
+ const { meta } = parseFrontmatter(content);
126
+ manifests.push({
127
+ id: dir.name,
128
+ name: typeof meta.name === 'string' ? meta.name : dir.name,
129
+ domain: typeof meta.domain === 'string' ? meta.domain : 'general',
130
+ source: 'github',
131
+ });
132
+ }
133
+ return manifests;
134
+ }
135
+ async getSkill(id) {
136
+ const skillPath = `${this.pathPrefix}/${id}/SKILL.md`;
137
+ const content = await this.fetcher.getFileContent(this.owner, this.repoName, skillPath, this.branch);
138
+ if (!content)
139
+ return null;
140
+ const { meta, body } = parseFrontmatter(content);
141
+ if (!body)
142
+ return null;
143
+ return {
144
+ id,
145
+ name: typeof meta.name === 'string' ? meta.name : id,
146
+ domain: typeof meta.domain === 'string' ? meta.domain : 'general',
147
+ content: body,
148
+ triggers: Array.isArray(meta.triggers) ? meta.triggers : [],
149
+ agentRoles: Array.isArray(meta.roles) ? meta.roles : [],
150
+ };
151
+ }
152
+ async getContent(id) {
153
+ const skillPath = `${this.pathPrefix}/${id}/SKILL.md`;
154
+ const content = await this.fetcher.getFileContent(this.owner, this.repoName, skillPath, this.branch);
155
+ if (!content)
156
+ return null;
157
+ const { body } = parseFrontmatter(content);
158
+ return body || null;
159
+ }
160
+ }
161
+ // --- Registry ---
162
+ export class SkillSourceRegistry {
163
+ sources = new Map();
164
+ register(source) {
165
+ this.sources.set(source.name, source);
166
+ }
167
+ unregister(name) {
168
+ return this.sources.delete(name);
169
+ }
170
+ getSource(name) {
171
+ return this.sources.get(name);
172
+ }
173
+ /** Sources sorted by priority descending (higher priority first). */
174
+ sortedSources() {
175
+ return Array.from(this.sources.values()).sort((a, b) => b.priority - a.priority);
176
+ }
177
+ async listAllSkills() {
178
+ const sorted = this.sortedSources();
179
+ const results = await Promise.all(sorted.map(s => s.listSkills()));
180
+ return results.flat();
181
+ }
182
+ async findSkill(id) {
183
+ for (const source of this.sortedSources()) {
184
+ const skill = await source.getSkill(id);
185
+ if (skill)
186
+ return skill;
187
+ }
188
+ return null;
189
+ }
190
+ async getContent(id) {
191
+ for (const source of this.sortedSources()) {
192
+ const content = await source.getContent(id);
193
+ if (content)
194
+ return content;
195
+ }
196
+ return null;
197
+ }
198
+ }
199
+ //# sourceMappingURL=skill-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-source.js","sourceRoot":"","sources":["../../src/skills/skill-source.ts"],"names":[],"mappings":"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"}