@skillsmith/core 0.4.14 → 0.4.16

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 (287) hide show
  1. package/README.md +2 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/analysis/DependencyMerger.d.ts +39 -0
  4. package/dist/src/analysis/DependencyMerger.d.ts.map +1 -0
  5. package/dist/src/analysis/DependencyMerger.js +191 -0
  6. package/dist/src/analysis/DependencyMerger.js.map +1 -0
  7. package/dist/src/analysis/DependencyMerger.test.d.ts +2 -0
  8. package/dist/src/analysis/DependencyMerger.test.d.ts.map +1 -0
  9. package/dist/src/analysis/DependencyMerger.test.js +258 -0
  10. package/dist/src/analysis/DependencyMerger.test.js.map +1 -0
  11. package/dist/src/analysis/McpReferenceExtractor.d.ts +42 -0
  12. package/dist/src/analysis/McpReferenceExtractor.d.ts.map +1 -0
  13. package/dist/src/analysis/McpReferenceExtractor.js +92 -0
  14. package/dist/src/analysis/McpReferenceExtractor.js.map +1 -0
  15. package/dist/src/analysis/McpReferenceExtractor.test.d.ts +2 -0
  16. package/dist/src/analysis/McpReferenceExtractor.test.d.ts.map +1 -0
  17. package/dist/src/analysis/McpReferenceExtractor.test.js +262 -0
  18. package/dist/src/analysis/McpReferenceExtractor.test.js.map +1 -0
  19. package/dist/src/api/client.d.ts +1 -0
  20. package/dist/src/api/client.d.ts.map +1 -1
  21. package/dist/src/api/client.health.d.ts +26 -0
  22. package/dist/src/api/client.health.d.ts.map +1 -0
  23. package/dist/src/api/client.health.js +74 -0
  24. package/dist/src/api/client.health.js.map +1 -0
  25. package/dist/src/api/client.js +3 -51
  26. package/dist/src/api/client.js.map +1 -1
  27. package/dist/src/api/schemas.d.ts +4 -4
  28. package/dist/src/db/createDatabase.d.ts +9 -1
  29. package/dist/src/db/createDatabase.d.ts.map +1 -1
  30. package/dist/src/db/createDatabase.js +9 -1
  31. package/dist/src/db/createDatabase.js.map +1 -1
  32. package/dist/src/db/drivers/sqljsDriver.d.ts.map +1 -1
  33. package/dist/src/db/drivers/sqljsDriver.js +7 -8
  34. package/dist/src/db/drivers/sqljsDriver.js.map +1 -1
  35. package/dist/src/db/migrations/v10-dependencies.d.ts +18 -0
  36. package/dist/src/db/migrations/v10-dependencies.d.ts.map +1 -0
  37. package/dist/src/db/migrations/v10-dependencies.js +50 -0
  38. package/dist/src/db/migrations/v10-dependencies.js.map +1 -0
  39. package/dist/src/db/migrations/v2-phase5-columns.d.ts +7 -0
  40. package/dist/src/db/migrations/v2-phase5-columns.d.ts.map +1 -0
  41. package/dist/src/db/migrations/v2-phase5-columns.js +16 -0
  42. package/dist/src/db/migrations/v2-phase5-columns.js.map +1 -0
  43. package/dist/src/db/migrations/v3-sync-tables.d.ts +6 -0
  44. package/dist/src/db/migrations/v3-sync-tables.d.ts.map +1 -0
  45. package/dist/src/db/migrations/v3-sync-tables.js +41 -0
  46. package/dist/src/db/migrations/v3-sync-tables.js.map +1 -0
  47. package/dist/src/db/migrations/v4-security-columns.d.ts +7 -0
  48. package/dist/src/db/migrations/v4-security-columns.d.ts.map +1 -0
  49. package/dist/src/db/migrations/v4-security-columns.js +17 -0
  50. package/dist/src/db/migrations/v4-security-columns.js.map +1 -0
  51. package/dist/src/db/migrations/v5b-change-type.d.ts +19 -0
  52. package/dist/src/db/migrations/v5b-change-type.d.ts.map +1 -0
  53. package/dist/src/db/migrations/v5b-change-type.js +22 -0
  54. package/dist/src/db/migrations/v5b-change-type.js.map +1 -0
  55. package/dist/src/db/migrations/v6-advisories.d.ts +32 -0
  56. package/dist/src/db/migrations/v6-advisories.d.ts.map +1 -0
  57. package/dist/src/db/migrations/v6-advisories.js +53 -0
  58. package/dist/src/db/migrations/v6-advisories.js.map +1 -0
  59. package/dist/src/db/migrations/v7-compatibility.d.ts +21 -0
  60. package/dist/src/db/migrations/v7-compatibility.d.ts.map +1 -0
  61. package/dist/src/db/migrations/v7-compatibility.js +23 -0
  62. package/dist/src/db/migrations/v7-compatibility.js.map +1 -0
  63. package/dist/src/db/migrations/v8-co-installs.d.ts +21 -0
  64. package/dist/src/db/migrations/v8-co-installs.d.ts.map +1 -0
  65. package/dist/src/db/migrations/v8-co-installs.js +33 -0
  66. package/dist/src/db/migrations/v8-co-installs.js.map +1 -0
  67. package/dist/src/db/schema.d.ts +5 -16
  68. package/dist/src/db/schema.d.ts.map +1 -1
  69. package/dist/src/db/schema.js +50 -79
  70. package/dist/src/db/schema.js.map +1 -1
  71. package/dist/src/exports/repositories.d.ts +6 -0
  72. package/dist/src/exports/repositories.d.ts.map +1 -1
  73. package/dist/src/exports/repositories.js +21 -0
  74. package/dist/src/exports/repositories.js.map +1 -1
  75. package/dist/src/exports/services.d.ts +2 -0
  76. package/dist/src/exports/services.d.ts.map +1 -1
  77. package/dist/src/exports/services.js +5 -0
  78. package/dist/src/exports/services.js.map +1 -1
  79. package/dist/src/exports/types.d.ts +2 -1
  80. package/dist/src/exports/types.d.ts.map +1 -1
  81. package/dist/src/exports/types.js.map +1 -1
  82. package/dist/src/indexer/GitHubIndexer.d.ts +3 -1
  83. package/dist/src/indexer/GitHubIndexer.d.ts.map +1 -1
  84. package/dist/src/indexer/GitHubIndexer.js.map +1 -1
  85. package/dist/src/indexer/SkillParser.d.ts +22 -9
  86. package/dist/src/indexer/SkillParser.d.ts.map +1 -1
  87. package/dist/src/indexer/SkillParser.js +17 -10
  88. package/dist/src/indexer/SkillParser.js.map +1 -1
  89. package/dist/src/learning/PatternStore.d.ts +0 -2
  90. package/dist/src/learning/PatternStore.d.ts.map +1 -1
  91. package/dist/src/learning/PatternStore.helpers.d.ts +19 -1
  92. package/dist/src/learning/PatternStore.helpers.d.ts.map +1 -1
  93. package/dist/src/learning/PatternStore.helpers.js +51 -0
  94. package/dist/src/learning/PatternStore.helpers.js.map +1 -1
  95. package/dist/src/learning/PatternStore.js +5 -37
  96. package/dist/src/learning/PatternStore.js.map +1 -1
  97. package/dist/src/repositories/AdvisoryRepository.d.ts +80 -0
  98. package/dist/src/repositories/AdvisoryRepository.d.ts.map +1 -0
  99. package/dist/src/repositories/AdvisoryRepository.js +128 -0
  100. package/dist/src/repositories/AdvisoryRepository.js.map +1 -0
  101. package/dist/src/repositories/AdvisoryRepository.test.d.ts +6 -0
  102. package/dist/src/repositories/AdvisoryRepository.test.d.ts.map +1 -0
  103. package/dist/src/repositories/AdvisoryRepository.test.js +149 -0
  104. package/dist/src/repositories/AdvisoryRepository.test.js.map +1 -0
  105. package/dist/src/repositories/CoInstallRepository.d.ts +68 -0
  106. package/dist/src/repositories/CoInstallRepository.d.ts.map +1 -0
  107. package/dist/src/repositories/CoInstallRepository.js +122 -0
  108. package/dist/src/repositories/CoInstallRepository.js.map +1 -0
  109. package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
  110. package/dist/src/repositories/IndexerRepository.js +5 -1
  111. package/dist/src/repositories/IndexerRepository.js.map +1 -1
  112. package/dist/src/repositories/SkillDependencyRepository.d.ts +73 -0
  113. package/dist/src/repositories/SkillDependencyRepository.d.ts.map +1 -0
  114. package/dist/src/repositories/SkillDependencyRepository.js +199 -0
  115. package/dist/src/repositories/SkillDependencyRepository.js.map +1 -0
  116. package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
  117. package/dist/src/repositories/SkillRepository.js +16 -5
  118. package/dist/src/repositories/SkillRepository.js.map +1 -1
  119. package/dist/src/scripts/validation/types.d.ts +2 -2
  120. package/dist/src/services/SearchService.helpers.d.ts.map +1 -1
  121. package/dist/src/services/SearchService.helpers.js +4 -0
  122. package/dist/src/services/SearchService.helpers.js.map +1 -1
  123. package/dist/src/services/SearchService.types.d.ts +1 -0
  124. package/dist/src/services/SearchService.types.d.ts.map +1 -1
  125. package/dist/src/services/TaskRunner.d.ts +5 -81
  126. package/dist/src/services/TaskRunner.d.ts.map +1 -1
  127. package/dist/src/services/TaskRunner.js +7 -68
  128. package/dist/src/services/TaskRunner.js.map +1 -1
  129. package/dist/src/services/TaskRunner.process.d.ts +33 -0
  130. package/dist/src/services/TaskRunner.process.d.ts.map +1 -0
  131. package/dist/src/services/TaskRunner.process.js +70 -0
  132. package/dist/src/services/TaskRunner.process.js.map +1 -0
  133. package/dist/src/services/TaskRunner.types.d.ts +76 -0
  134. package/dist/src/services/TaskRunner.types.d.ts.map +1 -0
  135. package/dist/src/services/TaskRunner.types.js +22 -0
  136. package/dist/src/services/TaskRunner.types.js.map +1 -0
  137. package/dist/src/services/__tests__/TaskRunner.process.test.d.ts +13 -0
  138. package/dist/src/services/__tests__/TaskRunner.process.test.d.ts.map +1 -0
  139. package/dist/src/services/__tests__/TaskRunner.process.test.js +91 -0
  140. package/dist/src/services/__tests__/TaskRunner.process.test.js.map +1 -0
  141. package/dist/src/services/quarantine/QuarantineService.d.ts +3 -24
  142. package/dist/src/services/quarantine/QuarantineService.d.ts.map +1 -1
  143. package/dist/src/services/quarantine/QuarantineService.js +8 -205
  144. package/dist/src/services/quarantine/QuarantineService.js.map +1 -1
  145. package/dist/src/services/quarantine/QuarantineService.multiapproval.d.ts +57 -0
  146. package/dist/src/services/quarantine/QuarantineService.multiapproval.d.ts.map +1 -0
  147. package/dist/src/services/quarantine/QuarantineService.multiapproval.js +211 -0
  148. package/dist/src/services/quarantine/QuarantineService.multiapproval.js.map +1 -0
  149. package/dist/src/session/SessionManager.d.ts +2 -33
  150. package/dist/src/session/SessionManager.d.ts.map +1 -1
  151. package/dist/src/session/SessionManager.js +14 -238
  152. package/dist/src/session/SessionManager.js.map +1 -1
  153. package/dist/src/session/SessionManager.memory.d.ts +67 -0
  154. package/dist/src/session/SessionManager.memory.d.ts.map +1 -0
  155. package/dist/src/session/SessionManager.memory.js +262 -0
  156. package/dist/src/session/SessionManager.memory.js.map +1 -0
  157. package/dist/src/sources/SourceIndexer.d.ts +3 -1
  158. package/dist/src/sources/SourceIndexer.d.ts.map +1 -1
  159. package/dist/src/sources/SourceIndexer.js.map +1 -1
  160. package/dist/src/sync/SyncEngine.d.ts +13 -1
  161. package/dist/src/sync/SyncEngine.d.ts.map +1 -1
  162. package/dist/src/sync/SyncEngine.js +50 -1
  163. package/dist/src/sync/SyncEngine.js.map +1 -1
  164. package/dist/src/testing/MultiLLMProvider.d.ts +5 -6
  165. package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -1
  166. package/dist/src/testing/MultiLLMProvider.js +18 -130
  167. package/dist/src/testing/MultiLLMProvider.js.map +1 -1
  168. package/dist/src/testing/MultiLLMProvider.metrics.d.ts +33 -0
  169. package/dist/src/testing/MultiLLMProvider.metrics.d.ts.map +1 -0
  170. package/dist/src/testing/MultiLLMProvider.metrics.js +87 -0
  171. package/dist/src/testing/MultiLLMProvider.metrics.js.map +1 -0
  172. package/dist/src/testing/MultiLLMProvider.selection.d.ts +77 -0
  173. package/dist/src/testing/MultiLLMProvider.selection.d.ts.map +1 -0
  174. package/dist/src/testing/MultiLLMProvider.selection.js +151 -0
  175. package/dist/src/testing/MultiLLMProvider.selection.js.map +1 -0
  176. package/dist/src/types/dependencies.d.ts +85 -0
  177. package/dist/src/types/dependencies.d.ts.map +1 -0
  178. package/dist/src/types/dependencies.js +11 -0
  179. package/dist/src/types/dependencies.js.map +1 -0
  180. package/dist/src/types/skill.d.ts +13 -0
  181. package/dist/src/types/skill.d.ts.map +1 -1
  182. package/dist/src/types/skill.js.map +1 -1
  183. package/dist/src/types.d.ts +32 -0
  184. package/dist/src/types.d.ts.map +1 -1
  185. package/dist/src/versioning/change-classifier.d.ts +38 -0
  186. package/dist/src/versioning/change-classifier.d.ts.map +1 -0
  187. package/dist/src/versioning/change-classifier.js +187 -0
  188. package/dist/src/versioning/change-classifier.js.map +1 -0
  189. package/dist/src/versioning/change-classifier.test.d.ts +6 -0
  190. package/dist/src/versioning/change-classifier.test.d.ts.map +1 -0
  191. package/dist/src/versioning/change-classifier.test.js +275 -0
  192. package/dist/src/versioning/change-classifier.test.js.map +1 -0
  193. package/dist/src/versioning/update-risk.d.ts +50 -0
  194. package/dist/src/versioning/update-risk.d.ts.map +1 -0
  195. package/dist/src/versioning/update-risk.js +80 -0
  196. package/dist/src/versioning/update-risk.js.map +1 -0
  197. package/dist/src/versioning/update-risk.test.d.ts +6 -0
  198. package/dist/src/versioning/update-risk.test.d.ts.map +1 -0
  199. package/dist/src/versioning/update-risk.test.js +200 -0
  200. package/dist/src/versioning/update-risk.test.js.map +1 -0
  201. package/dist/tests/AuditLogger.edge-cases.test.d.ts +10 -0
  202. package/dist/tests/AuditLogger.edge-cases.test.d.ts.map +1 -0
  203. package/dist/tests/AuditLogger.edge-cases.test.js +183 -0
  204. package/dist/tests/AuditLogger.edge-cases.test.js.map +1 -0
  205. package/dist/tests/CacheManager.test.d.ts +9 -0
  206. package/dist/tests/CacheManager.test.d.ts.map +1 -0
  207. package/dist/tests/CacheManager.test.js +163 -0
  208. package/dist/tests/CacheManager.test.js.map +1 -0
  209. package/dist/tests/DailyIndexPipeline.test.js +3 -3
  210. package/dist/tests/DailyIndexPipeline.test.js.map +1 -1
  211. package/dist/tests/GitHubIndexer.edge-cases.test.d.ts +10 -0
  212. package/dist/tests/GitHubIndexer.edge-cases.test.d.ts.map +1 -0
  213. package/dist/tests/GitHubIndexer.edge-cases.test.js +255 -0
  214. package/dist/tests/GitHubIndexer.edge-cases.test.js.map +1 -0
  215. package/dist/tests/GitHubIndexer.test.js +4 -2
  216. package/dist/tests/GitHubIndexer.test.js.map +1 -1
  217. package/dist/tests/SearchService.test.js +71 -0
  218. package/dist/tests/SearchService.test.js.map +1 -1
  219. package/dist/tests/SkillVersionRepository.test.d.ts +0 -11
  220. package/dist/tests/SkillVersionRepository.test.d.ts.map +1 -1
  221. package/dist/tests/SkillVersionRepository.test.js +131 -194
  222. package/dist/tests/SkillVersionRepository.test.js.map +1 -1
  223. package/dist/tests/api/client.health.test.d.ts +15 -0
  224. package/dist/tests/api/client.health.test.d.ts.map +1 -0
  225. package/dist/tests/api/client.health.test.js +111 -0
  226. package/dist/tests/api/client.health.test.js.map +1 -0
  227. package/dist/tests/db/betterSqlite3Driver.test.d.ts +8 -0
  228. package/dist/tests/db/betterSqlite3Driver.test.d.ts.map +1 -0
  229. package/dist/tests/db/betterSqlite3Driver.test.js +88 -0
  230. package/dist/tests/db/betterSqlite3Driver.test.js.map +1 -0
  231. package/dist/tests/db/database-abstraction.test.js +12 -0
  232. package/dist/tests/db/database-abstraction.test.js.map +1 -1
  233. package/dist/tests/db/schema-migrations.test.d.ts +10 -0
  234. package/dist/tests/db/schema-migrations.test.d.ts.map +1 -0
  235. package/dist/tests/db/schema-migrations.test.js +134 -0
  236. package/dist/tests/db/schema-migrations.test.js.map +1 -0
  237. package/dist/tests/db/sqljsDriver.test.d.ts +9 -0
  238. package/dist/tests/db/sqljsDriver.test.d.ts.map +1 -0
  239. package/dist/tests/db/sqljsDriver.test.js +75 -0
  240. package/dist/tests/db/sqljsDriver.test.js.map +1 -0
  241. package/dist/tests/edge-cases/EdgeCases.test.js +4 -1
  242. package/dist/tests/edge-cases/EdgeCases.test.js.map +1 -1
  243. package/dist/tests/helpers/database.d.ts +32 -0
  244. package/dist/tests/helpers/database.d.ts.map +1 -0
  245. package/dist/tests/helpers/database.js +54 -0
  246. package/dist/tests/helpers/database.js.map +1 -0
  247. package/dist/tests/learning/PatternStore.helpers.test.d.ts +17 -0
  248. package/dist/tests/learning/PatternStore.helpers.test.d.ts.map +1 -0
  249. package/dist/tests/learning/PatternStore.helpers.test.js +301 -0
  250. package/dist/tests/learning/PatternStore.helpers.test.js.map +1 -0
  251. package/dist/tests/repositories/CoInstallRepository.test.d.ts +9 -0
  252. package/dist/tests/repositories/CoInstallRepository.test.d.ts.map +1 -0
  253. package/dist/tests/repositories/CoInstallRepository.test.js +126 -0
  254. package/dist/tests/repositories/CoInstallRepository.test.js.map +1 -0
  255. package/dist/tests/repositories/SkillDependencyRepository.test.d.ts +10 -0
  256. package/dist/tests/repositories/SkillDependencyRepository.test.d.ts.map +1 -0
  257. package/dist/tests/repositories/SkillDependencyRepository.test.js +336 -0
  258. package/dist/tests/repositories/SkillDependencyRepository.test.js.map +1 -0
  259. package/dist/tests/routing/LanguageRouter.test.d.ts +9 -0
  260. package/dist/tests/routing/LanguageRouter.test.d.ts.map +1 -0
  261. package/dist/tests/routing/LanguageRouter.test.js +150 -0
  262. package/dist/tests/routing/LanguageRouter.test.js.map +1 -0
  263. package/dist/tests/session/SessionManager.memory.test.d.ts +11 -0
  264. package/dist/tests/session/SessionManager.memory.test.d.ts.map +1 -0
  265. package/dist/tests/session/SessionManager.memory.test.js +219 -0
  266. package/dist/tests/session/SessionManager.memory.test.js.map +1 -0
  267. package/dist/tests/sources.test.js +1 -1
  268. package/dist/tests/sources.test.js.map +1 -1
  269. package/dist/tests/sync/SyncEngine.test.js +32 -18
  270. package/dist/tests/sync/SyncEngine.test.js.map +1 -1
  271. package/dist/tests/testing/MultiLLMProvider.metrics.test.d.ts +13 -0
  272. package/dist/tests/testing/MultiLLMProvider.metrics.test.d.ts.map +1 -0
  273. package/dist/tests/testing/MultiLLMProvider.metrics.test.js +149 -0
  274. package/dist/tests/testing/MultiLLMProvider.metrics.test.js.map +1 -0
  275. package/dist/tests/testing/MultiLLMProvider.selection.test.d.ts +15 -0
  276. package/dist/tests/testing/MultiLLMProvider.selection.test.d.ts.map +1 -0
  277. package/dist/tests/testing/MultiLLMProvider.selection.test.js +249 -0
  278. package/dist/tests/testing/MultiLLMProvider.selection.test.js.map +1 -0
  279. package/dist/tests/unit/migrations/v10-dependencies.test.d.ts +6 -0
  280. package/dist/tests/unit/migrations/v10-dependencies.test.d.ts.map +1 -0
  281. package/dist/tests/unit/migrations/v10-dependencies.test.js +166 -0
  282. package/dist/tests/unit/migrations/v10-dependencies.test.js.map +1 -0
  283. package/dist/tests/unit/quarantine-query-builder.test.d.ts +10 -0
  284. package/dist/tests/unit/quarantine-query-builder.test.d.ts.map +1 -0
  285. package/dist/tests/unit/quarantine-query-builder.test.js +157 -0
  286. package/dist/tests/unit/quarantine-query-builder.test.js.map +1 -0
  287. package/package.json +1 -1
@@ -0,0 +1,39 @@
1
+ /**
2
+ * @fileoverview Merges declared and inferred dependencies into a flat list
3
+ * @module @skillsmith/core/analysis/DependencyMerger
4
+ * @see SMI-3146: Build DependencyMerger
5
+ *
6
+ * Combines frontmatter-declared dependencies with statically inferred
7
+ * MCP references, deduplicating where declared trumps inferred.
8
+ */
9
+ import type { DependencyDeclaration, DepSource, DepType } from '../types/dependencies.js';
10
+ import type { McpExtractionResult } from './McpReferenceExtractor.js';
11
+ /** A single merged dependency ready for database insertion */
12
+ export interface MergedDependency {
13
+ /** Dependency category, e.g. 'mcp_server', 'skill_hard' */
14
+ depType: DepType;
15
+ /** Target identifier, e.g. 'linear', 'claude-flow' */
16
+ depTarget: string;
17
+ /** Semver constraint or null */
18
+ depVersion: string | null;
19
+ /** How the dependency was discovered */
20
+ depSource: DepSource;
21
+ /** Confidence score (1.0 for declared, 0.9/0.5 for inferred) */
22
+ confidence: number | null;
23
+ /** JSON-serialized metadata or null */
24
+ metadata: string | null;
25
+ }
26
+ /**
27
+ * Merge declared dependencies from SKILL.md frontmatter with
28
+ * inferred MCP references from static content analysis.
29
+ *
30
+ * Declared dependencies always take precedence: if a server appears
31
+ * in both declared MCP servers and inferred references, only the
32
+ * declared entry is included.
33
+ *
34
+ * @param declared - Parsed dependency declaration from frontmatter
35
+ * @param inferred - MCP references extracted from content
36
+ * @returns Flat array of merged dependencies
37
+ */
38
+ export declare function mergeDependencies(declared: DependencyDeclaration | undefined, inferred: McpExtractionResult): MergedDependency[];
39
+ //# sourceMappingURL=DependencyMerger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DependencyMerger.d.ts","sourceRoot":"","sources":["../../../src/analysis/DependencyMerger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAA;AACzF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAErE,8DAA8D;AAC9D,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAA;IAChB,sDAAsD;IACtD,SAAS,EAAE,MAAM,CAAA;IACjB,gCAAgC;IAChC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,wCAAwC;IACxC,SAAS,EAAE,SAAS,CAAA;IACpB,gEAAgE;IAChE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IACzB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,qBAAqB,GAAG,SAAS,EAC3C,QAAQ,EAAE,mBAAmB,GAC5B,gBAAgB,EAAE,CAepB"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * @fileoverview Merges declared and inferred dependencies into a flat list
3
+ * @module @skillsmith/core/analysis/DependencyMerger
4
+ * @see SMI-3146: Build DependencyMerger
5
+ *
6
+ * Combines frontmatter-declared dependencies with statically inferred
7
+ * MCP references, deduplicating where declared trumps inferred.
8
+ */
9
+ /**
10
+ * Merge declared dependencies from SKILL.md frontmatter with
11
+ * inferred MCP references from static content analysis.
12
+ *
13
+ * Declared dependencies always take precedence: if a server appears
14
+ * in both declared MCP servers and inferred references, only the
15
+ * declared entry is included.
16
+ *
17
+ * @param declared - Parsed dependency declaration from frontmatter
18
+ * @param inferred - MCP references extracted from content
19
+ * @returns Flat array of merged dependencies
20
+ */
21
+ export function mergeDependencies(declared, inferred) {
22
+ const result = [];
23
+ const declaredMcpServers = new Set();
24
+ if (declared) {
25
+ addSkillDeps(declared, result);
26
+ addPlatformDeps(declared, result, declaredMcpServers);
27
+ addModelDeps(declared, result);
28
+ addEnvironmentDeps(declared, result);
29
+ addConflicts(declared, result);
30
+ }
31
+ addInferredMcp(inferred, declaredMcpServers, result);
32
+ return result;
33
+ }
34
+ /** Add skill-to-skill dependencies */
35
+ function addSkillDeps(declared, result) {
36
+ if (!declared.skills)
37
+ return;
38
+ for (const skill of declared.skills) {
39
+ const depType = skill.type === 'hard' ? 'skill_hard' : skill.type === 'soft' ? 'skill_soft' : 'skill_peer';
40
+ result.push({
41
+ depType,
42
+ depTarget: skill.name,
43
+ depVersion: skill.version ?? null,
44
+ depSource: 'declared',
45
+ confidence: 1.0,
46
+ metadata: skill.reason ? JSON.stringify({ reason: skill.reason }) : null,
47
+ });
48
+ }
49
+ }
50
+ /** Add platform dependencies (CLI version, MCP servers) */
51
+ function addPlatformDeps(declared, result, declaredMcpServers) {
52
+ if (!declared.platform)
53
+ return;
54
+ if (declared.platform.cli) {
55
+ result.push({
56
+ depType: 'cli_version',
57
+ depTarget: 'claude',
58
+ depVersion: declared.platform.cli,
59
+ depSource: 'declared',
60
+ confidence: 1.0,
61
+ metadata: null,
62
+ });
63
+ }
64
+ if (declared.platform.mcp_servers) {
65
+ for (const server of declared.platform.mcp_servers) {
66
+ declaredMcpServers.add(server.name);
67
+ result.push({
68
+ depType: 'mcp_server',
69
+ depTarget: server.name,
70
+ depVersion: null,
71
+ depSource: 'declared',
72
+ confidence: 1.0,
73
+ metadata: server.package
74
+ ? JSON.stringify({
75
+ package: server.package,
76
+ required: server.required,
77
+ })
78
+ : JSON.stringify({ required: server.required }),
79
+ });
80
+ }
81
+ }
82
+ }
83
+ /** Add model dependencies */
84
+ function addModelDeps(declared, result) {
85
+ if (!declared.models)
86
+ return;
87
+ if (declared.models.minimum) {
88
+ result.push({
89
+ depType: 'model_minimum',
90
+ depTarget: declared.models.minimum,
91
+ depVersion: null,
92
+ depSource: 'declared',
93
+ confidence: 1.0,
94
+ metadata: declared.models.context_window
95
+ ? JSON.stringify({ context_window: declared.models.context_window })
96
+ : null,
97
+ });
98
+ }
99
+ if (declared.models.capabilities) {
100
+ for (const cap of declared.models.capabilities) {
101
+ result.push({
102
+ depType: 'model_capability',
103
+ depTarget: cap,
104
+ depVersion: null,
105
+ depSource: 'declared',
106
+ confidence: 1.0,
107
+ metadata: null,
108
+ });
109
+ }
110
+ }
111
+ }
112
+ /** Add environment dependencies (tools, OS, Node) */
113
+ function addEnvironmentDeps(declared, result) {
114
+ if (!declared.environment)
115
+ return;
116
+ if (declared.environment.tools) {
117
+ for (const tool of declared.environment.tools) {
118
+ result.push({
119
+ depType: 'env_tool',
120
+ depTarget: tool.name,
121
+ depVersion: null,
122
+ depSource: 'declared',
123
+ confidence: 1.0,
124
+ metadata: JSON.stringify({
125
+ required: tool.required,
126
+ ...(tool.check ? { check: tool.check } : {}),
127
+ }),
128
+ });
129
+ }
130
+ }
131
+ if (declared.environment.os) {
132
+ for (const os of declared.environment.os) {
133
+ result.push({
134
+ depType: 'env_os',
135
+ depTarget: os,
136
+ depVersion: null,
137
+ depSource: 'declared',
138
+ confidence: 1.0,
139
+ metadata: null,
140
+ });
141
+ }
142
+ }
143
+ if (declared.environment.node) {
144
+ result.push({
145
+ depType: 'env_node',
146
+ depTarget: 'node',
147
+ depVersion: declared.environment.node,
148
+ depSource: 'declared',
149
+ confidence: 1.0,
150
+ metadata: null,
151
+ });
152
+ }
153
+ }
154
+ /** Add conflict declarations — note: DependencyDeclaration doesn't have conflicts field yet */
155
+ function addConflicts(declared, result) {
156
+ // DependencyDeclaration type does not include a conflicts field.
157
+ // This is a forward-looking handler for when the type is extended.
158
+ // Access via type-safe indexing to avoid runtime errors.
159
+ const withConflicts = declared;
160
+ if (!withConflicts.conflicts)
161
+ return;
162
+ for (const conflict of withConflicts.conflicts) {
163
+ result.push({
164
+ depType: 'conflict',
165
+ depTarget: conflict.name,
166
+ depVersion: conflict.versions ?? null,
167
+ depSource: 'declared',
168
+ confidence: 1.0,
169
+ metadata: conflict.reason ? JSON.stringify({ reason: conflict.reason }) : null,
170
+ });
171
+ }
172
+ }
173
+ /** Add inferred MCP servers not already declared */
174
+ function addInferredMcp(inferred, declaredMcpServers, result) {
175
+ const highConfidenceSet = new Set(inferred.highConfidenceServers);
176
+ for (const server of inferred.servers) {
177
+ // Declared trumps inferred — skip if already declared
178
+ if (declaredMcpServers.has(server))
179
+ continue;
180
+ const isHighConfidence = highConfidenceSet.has(server);
181
+ result.push({
182
+ depType: 'mcp_server',
183
+ depTarget: server,
184
+ depVersion: null,
185
+ depSource: 'inferred_static',
186
+ confidence: isHighConfidence ? 0.9 : 0.5,
187
+ metadata: null,
188
+ });
189
+ }
190
+ }
191
+ //# sourceMappingURL=DependencyMerger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DependencyMerger.js","sourceRoot":"","sources":["../../../src/analysis/DependencyMerger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=DependencyMerger.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DependencyMerger.test.d.ts","sourceRoot":"","sources":["../../../src/analysis/DependencyMerger.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,258 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { mergeDependencies } from './DependencyMerger.js';
3
+ /** Helper: create an empty McpExtractionResult */
4
+ function emptyInferred() {
5
+ return { references: [], servers: [], highConfidenceServers: [] };
6
+ }
7
+ /** Helper: create a McpExtractionResult with servers */
8
+ function inferredServers(servers, highConfidence = []) {
9
+ return {
10
+ references: servers.map((s) => ({
11
+ server: s,
12
+ tool: 'some_tool',
13
+ line: 1,
14
+ inCodeBlock: !highConfidence.includes(s),
15
+ })),
16
+ servers,
17
+ highConfidenceServers: highConfidence,
18
+ };
19
+ }
20
+ describe('DependencyMerger', () => {
21
+ describe('mergeDependencies', () => {
22
+ it('should return empty array for undefined declared and empty inferred', () => {
23
+ const result = mergeDependencies(undefined, emptyInferred());
24
+ expect(result).toEqual([]);
25
+ });
26
+ it('should include declared skill dependencies', () => {
27
+ const declared = {
28
+ skills: [
29
+ { name: 'auth-helper', type: 'hard', version: '^1.0.0' },
30
+ { name: 'logger', type: 'soft' },
31
+ { name: 'formatter', type: 'peer', reason: 'shared config' },
32
+ ],
33
+ };
34
+ const result = mergeDependencies(declared, emptyInferred());
35
+ expect(result).toHaveLength(3);
36
+ expect(result[0]).toMatchObject({
37
+ depType: 'skill_hard',
38
+ depTarget: 'auth-helper',
39
+ depVersion: '^1.0.0',
40
+ depSource: 'declared',
41
+ confidence: 1.0,
42
+ });
43
+ expect(result[1]).toMatchObject({
44
+ depType: 'skill_soft',
45
+ depTarget: 'logger',
46
+ depVersion: null,
47
+ depSource: 'declared',
48
+ });
49
+ expect(result[2]).toMatchObject({
50
+ depType: 'skill_peer',
51
+ depTarget: 'formatter',
52
+ metadata: JSON.stringify({ reason: 'shared config' }),
53
+ });
54
+ });
55
+ it('should include declared MCP servers', () => {
56
+ const declared = {
57
+ platform: {
58
+ mcp_servers: [
59
+ { name: 'linear', required: true, package: '@linear/mcp' },
60
+ { name: 'slack', required: false },
61
+ ],
62
+ },
63
+ };
64
+ const result = mergeDependencies(declared, emptyInferred());
65
+ expect(result).toHaveLength(2);
66
+ expect(result[0]).toMatchObject({
67
+ depType: 'mcp_server',
68
+ depTarget: 'linear',
69
+ depSource: 'declared',
70
+ confidence: 1.0,
71
+ });
72
+ expect(JSON.parse(result[0].metadata)).toEqual({
73
+ package: '@linear/mcp',
74
+ required: true,
75
+ });
76
+ expect(result[1]).toMatchObject({
77
+ depType: 'mcp_server',
78
+ depTarget: 'slack',
79
+ depSource: 'declared',
80
+ });
81
+ expect(JSON.parse(result[1].metadata)).toEqual({ required: false });
82
+ });
83
+ it('should add inferred MCP servers when no declared deps', () => {
84
+ const inferred = inferredServers(['linear', 'claude-flow'], ['linear']);
85
+ const result = mergeDependencies(undefined, inferred);
86
+ expect(result).toHaveLength(2);
87
+ const linear = result.find((d) => d.depTarget === 'linear');
88
+ expect(linear.depType).toBe('mcp_server');
89
+ expect(linear.depSource).toBe('inferred_static');
90
+ expect(linear.confidence).toBe(0.9); // high confidence
91
+ const cf = result.find((d) => d.depTarget === 'claude-flow');
92
+ expect(cf.depSource).toBe('inferred_static');
93
+ expect(cf.confidence).toBe(0.5); // low confidence (code block only)
94
+ });
95
+ it('should skip inferred server when already declared (declared trumps)', () => {
96
+ const declared = {
97
+ platform: {
98
+ mcp_servers: [{ name: 'linear', required: true }],
99
+ },
100
+ };
101
+ const inferred = inferredServers(['linear', 'slack'], ['linear', 'slack']);
102
+ const result = mergeDependencies(declared, inferred);
103
+ // linear: declared only (not duplicated from inferred)
104
+ // slack: inferred (not declared)
105
+ const linearEntries = result.filter((d) => d.depTarget === 'linear');
106
+ expect(linearEntries).toHaveLength(1);
107
+ expect(linearEntries[0].depSource).toBe('declared');
108
+ expect(linearEntries[0].confidence).toBe(1.0);
109
+ const slackEntries = result.filter((d) => d.depTarget === 'slack');
110
+ expect(slackEntries).toHaveLength(1);
111
+ expect(slackEntries[0].depSource).toBe('inferred_static');
112
+ expect(slackEntries[0].confidence).toBe(0.9);
113
+ });
114
+ it('should assign correct confidence: 0.9 high, 0.5 code-block-only', () => {
115
+ const inferred = inferredServers(['high-server', 'low-server'], ['high-server'] // only high-server is high confidence
116
+ );
117
+ const result = mergeDependencies(undefined, inferred);
118
+ const high = result.find((d) => d.depTarget === 'high-server');
119
+ expect(high.confidence).toBe(0.9);
120
+ const low = result.find((d) => d.depTarget === 'low-server');
121
+ expect(low.confidence).toBe(0.5);
122
+ });
123
+ it('should include declared CLI version', () => {
124
+ const declared = {
125
+ platform: { cli: '>=1.0.0' },
126
+ };
127
+ const result = mergeDependencies(declared, emptyInferred());
128
+ expect(result).toHaveLength(1);
129
+ expect(result[0]).toMatchObject({
130
+ depType: 'cli_version',
131
+ depTarget: 'claude',
132
+ depVersion: '>=1.0.0',
133
+ depSource: 'declared',
134
+ confidence: 1.0,
135
+ });
136
+ });
137
+ it('should include model dependencies', () => {
138
+ const declared = {
139
+ models: {
140
+ minimum: 'claude-3-sonnet',
141
+ capabilities: ['tool_use', 'vision'],
142
+ context_window: 200000,
143
+ },
144
+ };
145
+ const result = mergeDependencies(declared, emptyInferred());
146
+ expect(result).toHaveLength(3);
147
+ const minimum = result.find((d) => d.depType === 'model_minimum');
148
+ expect(minimum.depTarget).toBe('claude-3-sonnet');
149
+ expect(JSON.parse(minimum.metadata)).toEqual({
150
+ context_window: 200000,
151
+ });
152
+ const capabilities = result.filter((d) => d.depType === 'model_capability');
153
+ expect(capabilities).toHaveLength(2);
154
+ expect(capabilities.map((c) => c.depTarget)).toEqual(['tool_use', 'vision']);
155
+ });
156
+ it('should include environment dependencies', () => {
157
+ const declared = {
158
+ environment: {
159
+ tools: [
160
+ { name: 'git', required: true, check: 'git --version' },
161
+ { name: 'docker', required: false },
162
+ ],
163
+ os: ['linux', 'darwin'],
164
+ node: '>=20.0.0',
165
+ },
166
+ };
167
+ const result = mergeDependencies(declared, emptyInferred());
168
+ const tools = result.filter((d) => d.depType === 'env_tool');
169
+ expect(tools).toHaveLength(2);
170
+ expect(JSON.parse(tools[0].metadata)).toEqual({
171
+ required: true,
172
+ check: 'git --version',
173
+ });
174
+ expect(JSON.parse(tools[1].metadata)).toEqual({ required: false });
175
+ const osEntries = result.filter((d) => d.depType === 'env_os');
176
+ expect(osEntries).toHaveLength(2);
177
+ expect(osEntries.map((o) => o.depTarget)).toEqual(['linux', 'darwin']);
178
+ const nodeEntry = result.find((d) => d.depType === 'env_node');
179
+ expect(nodeEntry.depTarget).toBe('node');
180
+ expect(nodeEntry.depVersion).toBe('>=20.0.0');
181
+ });
182
+ it('should merge full declared + inferred with no duplicates', () => {
183
+ const declared = {
184
+ skills: [{ name: 'auth', type: 'hard' }],
185
+ platform: {
186
+ cli: '>=1.0.0',
187
+ mcp_servers: [{ name: 'linear', required: true }],
188
+ },
189
+ models: { minimum: 'claude-3-sonnet' },
190
+ };
191
+ const inferred = inferredServers(['linear', 'claude-flow', 'skillsmith'], ['claude-flow', 'skillsmith']);
192
+ const result = mergeDependencies(declared, inferred);
193
+ // Declared: skill_hard(auth) + cli_version + mcp_server(linear) + model_minimum
194
+ // Inferred: mcp_server(claude-flow, skillsmith) — linear skipped
195
+ expect(result).toHaveLength(6);
196
+ const mcpServers = result.filter((d) => d.depType === 'mcp_server');
197
+ expect(mcpServers).toHaveLength(3);
198
+ const linearEntry = mcpServers.find((d) => d.depTarget === 'linear');
199
+ expect(linearEntry.depSource).toBe('declared');
200
+ const cfEntry = mcpServers.find((d) => d.depTarget === 'claude-flow');
201
+ expect(cfEntry.depSource).toBe('inferred_static');
202
+ expect(cfEntry.confidence).toBe(0.9);
203
+ const ssEntry = mcpServers.find((d) => d.depTarget === 'skillsmith');
204
+ expect(ssEntry.depSource).toBe('inferred_static');
205
+ expect(ssEntry.confidence).toBe(0.9);
206
+ });
207
+ it('should handle declared-only with no inferred', () => {
208
+ const declared = {
209
+ skills: [{ name: 'helper', type: 'soft' }],
210
+ };
211
+ const result = mergeDependencies(declared, emptyInferred());
212
+ expect(result).toHaveLength(1);
213
+ expect(result[0].depType).toBe('skill_soft');
214
+ });
215
+ it('should ensure metadata is always a string or null', () => {
216
+ const declared = {
217
+ skills: [
218
+ { name: 'with-reason', type: 'hard', reason: 'needed for auth' },
219
+ { name: 'no-reason', type: 'soft' },
220
+ ],
221
+ platform: {
222
+ mcp_servers: [{ name: 'linear', required: true }],
223
+ },
224
+ };
225
+ const result = mergeDependencies(declared, emptyInferred());
226
+ for (const dep of result) {
227
+ expect(dep.metadata === null || typeof dep.metadata === 'string').toBe(true);
228
+ // If metadata is a string, it must be valid JSON
229
+ if (dep.metadata !== null) {
230
+ expect(() => JSON.parse(dep.metadata)).not.toThrow();
231
+ }
232
+ }
233
+ });
234
+ it('should handle conflicts', () => {
235
+ // Use type assertion for forward-looking conflicts field
236
+ const declared = {
237
+ conflicts: [
238
+ {
239
+ name: 'bad-skill',
240
+ versions: '>=2.0.0',
241
+ reason: 'incompatible API',
242
+ },
243
+ ],
244
+ };
245
+ const result = mergeDependencies(declared, emptyInferred());
246
+ expect(result).toHaveLength(1);
247
+ expect(result[0]).toMatchObject({
248
+ depType: 'conflict',
249
+ depTarget: 'bad-skill',
250
+ depVersion: '>=2.0.0',
251
+ depSource: 'declared',
252
+ confidence: 1.0,
253
+ metadata: JSON.stringify({ reason: 'incompatible API' }),
254
+ });
255
+ });
256
+ });
257
+ });
258
+ //# sourceMappingURL=DependencyMerger.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DependencyMerger.test.js","sourceRoot":"","sources":["../../../src/analysis/DependencyMerger.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAI7C,OAAO,EAAE,iBAAiB,EAAyB,MAAM,uBAAuB,CAAA;AAEhF,kDAAkD;AAClD,SAAS,aAAa;IACpB,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,qBAAqB,EAAE,EAAE,EAAE,CAAA;AACnE,CAAC;AAED,wDAAwD;AACxD,SAAS,eAAe,CAAC,OAAiB,EAAE,iBAA2B,EAAE;IACvE,OAAO;QACL,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9B,MAAM,EAAE,CAAC;YACT,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,CAAC;YACP,WAAW,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;SACzC,CAAC,CAAC;QACH,OAAO;QACP,qBAAqB,EAAE,cAAc;KACtC,CAAA;AACH,CAAC;AAED,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC7E,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,EAAE,aAAa,EAAE,CAAC,CAAA;YAC5D,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC5B,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;YACpD,MAAM,QAAQ,GAA0B;gBACtC,MAAM,EAAE;oBACN,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;oBACxD,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE;oBAChC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE;iBAC7D;aACF,CAAA;YAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAA;YAE3D,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAE9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;gBAC9B,OAAO,EAAE,YAAY;gBACrB,SAAS,EAAE,aAAa;gBACxB,UAAU,EAAE,QAAQ;gBACpB,SAAS,EAAE,UAAU;gBACrB,UAAU,EAAE,GAAG;aAChB,CAAC,CAAA;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;gBAC9B,OAAO,EAAE,YAAY;gBACrB,SAAS,EAAE,QAAQ;gBACnB,UAAU,EAAE,IAAI;gBAChB,SAAS,EAAE,UAAU;aACtB,CAAC,CAAA;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;gBAC9B,OAAO,EAAE,YAAY;gBACrB,SAAS,EAAE,WAAW;gBACtB,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;aACtD,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,QAAQ,GAA0B;gBACtC,QAAQ,EAAE;oBACR,WAAW,EAAE;wBACX,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE;wBAC1D,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE;qBACnC;iBACF;aACF,CAAA;YAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAA;YAE3D,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAE9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;gBAC9B,OAAO,EAAE,YAAY;gBACrB,SAAS,EAAE,QAAQ;gBACnB,SAAS,EAAE,UAAU;gBACrB,UAAU,EAAE,GAAG;aAChB,CAAC,CAAA;YACF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAS,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC9C,OAAO,EAAE,aAAa;gBACtB,QAAQ,EAAE,IAAI;aACf,CAAC,CAAA;YAEF,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;gBAC9B,OAAO,EAAE,YAAY;gBACrB,SAAS,EAAE,OAAO;gBAClB,SAAS,EAAE,UAAU;aACtB,CAAC,CAAA;YACF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;QACtE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAA;YAEvE,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;YAErD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAE9B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAE,CAAA;YAC5D,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;YACzC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YAChD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,kBAAkB;YAEtD,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,aAAa,CAAE,CAAA;YAC7D,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YAC5C,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAC,mCAAmC;QACrE,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qEAAqE,EAAE,GAAG,EAAE;YAC7E,MAAM,QAAQ,GAA0B;gBACtC,QAAQ,EAAE;oBACR,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;iBAClD;aACF,CAAA;YAED,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;YAE1E,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YAEpD,uDAAuD;YACvD,iCAAiC;YACjC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAA;YACpE,MAAM,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YACrC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACnD,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAE7C,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,CAAA;YAClE,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YACpC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YACzD,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;YACzE,MAAM,QAAQ,GAAG,eAAe,CAC9B,CAAC,aAAa,EAAE,YAAY,CAAC,EAC7B,CAAC,aAAa,CAAC,CAAC,sCAAsC;aACvD,CAAA;YAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;YAErD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,aAAa,CAAE,CAAA;YAC/D,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAEjC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,YAAY,CAAE,CAAA;YAC7D,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;YAC7C,MAAM,QAAQ,GAA0B;gBACtC,QAAQ,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE;aAC7B,CAAA;YAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAA;YAE3D,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;gBAC9B,OAAO,EAAE,aAAa;gBACtB,SAAS,EAAE,QAAQ;gBACnB,UAAU,EAAE,SAAS;gBACrB,SAAS,EAAE,UAAU;gBACrB,UAAU,EAAE,GAAG;aAChB,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,QAAQ,GAA0B;gBACtC,MAAM,EAAE;oBACN,OAAO,EAAE,iBAAiB;oBAC1B,YAAY,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC;oBACpC,cAAc,EAAE,MAAM;iBACvB;aACF,CAAA;YAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAA;YAE3D,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAE9B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,eAAe,CAAE,CAAA;YAClE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YACjD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAS,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC5C,cAAc,EAAE,MAAM;aACvB,CAAC,CAAA;YAEF,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,kBAAkB,CAAC,CAAA;YAC3E,MAAM,CAAC,YAAY,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YACpC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAA;QAC9E,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;YACjD,MAAM,QAAQ,GAA0B;gBACtC,WAAW,EAAE;oBACX,KAAK,EAAE;wBACL,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,eAAe,EAAE;wBACvD,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE;qBACpC;oBACD,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,CAAC;oBACvB,IAAI,EAAE,UAAU;iBACjB;aACF,CAAA;YAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAA;YAE3D,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,UAAU,CAAC,CAAA;YAC5D,MAAM,CAAC,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC7B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAS,CAAC,CAAC,CAAC,OAAO,CAAC;gBAC7C,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,eAAe;aACvB,CAAC,CAAA;YACF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,QAAS,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAA;YAEnE,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAA;YAC9D,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YACjC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAA;YAEtE,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,UAAU,CAAE,CAAA;YAC/D,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACxC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;YAClE,MAAM,QAAQ,GAA0B;gBACtC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gBACxC,QAAQ,EAAE;oBACR,GAAG,EAAE,SAAS;oBACd,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;iBAClD;gBACD,MAAM,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE;aACvC,CAAA;YAED,MAAM,QAAQ,GAAG,eAAe,CAC9B,CAAC,QAAQ,EAAE,aAAa,EAAE,YAAY,CAAC,EACvC,CAAC,aAAa,EAAE,YAAY,CAAC,CAC9B,CAAA;YAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;YAEpD,gFAAgF;YAChF,iEAAiE;YACjE,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAE9B,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,YAAY,CAAC,CAAA;YACnE,MAAM,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAElC,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAE,CAAA;YACrE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAE9C,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,aAAa,CAAE,CAAA;YACtE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YACjD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;YAEpC,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,YAAY,CAAE,CAAA;YACrE,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;YACjD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QACtC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,QAAQ,GAA0B;gBACtC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;aAC3C,CAAA;YAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAA;YAE3D,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC9C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,MAAM,QAAQ,GAA0B;gBACtC,MAAM,EAAE;oBACN,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE;oBAChE,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE;iBACpC;gBACD,QAAQ,EAAE;oBACR,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;iBAClD;aACF,CAAA;YAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAA;YAE3D,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;gBACzB,MAAM,CAAC,GAAG,CAAC,QAAQ,KAAK,IAAI,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;gBAE5E,iDAAiD;gBACjD,IAAI,GAAG,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;oBAC1B,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAS,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;gBACvD,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;YACjC,yDAAyD;YACzD,MAAM,QAAQ,GAAG;gBACf,SAAS,EAAE;oBACT;wBACE,IAAI,EAAE,WAAW;wBACjB,QAAQ,EAAE,SAAS;wBACnB,MAAM,EAAE,kBAAkB;qBAC3B;iBACF;aACkC,CAAA;YAErC,MAAM,MAAM,GAAG,iBAAiB,CAAC,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAA;YAE3D,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAmB;gBAChD,OAAO,EAAE,UAAU;gBACnB,SAAS,EAAE,WAAW;gBACtB,UAAU,EAAE,SAAS;gBACrB,SAAS,EAAE,UAAU;gBACrB,UAAU,EAAE,GAAG;gBACf,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;aACzD,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * @fileoverview Extracts MCP tool references from SKILL.md content
3
+ * @module @skillsmith/core/analysis/McpReferenceExtractor
4
+ * @see SMI-3145: Build McpReferenceExtractor
5
+ *
6
+ * Scans skill content for `mcp__<server>__<tool>` patterns,
7
+ * tracking whether each reference appears inside a fenced code block.
8
+ */
9
+ /** A single MCP tool reference found in content */
10
+ export interface McpReference {
11
+ /** MCP server name, e.g. "linear" */
12
+ server: string;
13
+ /** MCP tool name, e.g. "save_issue" */
14
+ tool: string;
15
+ /** 1-indexed line number where the reference appears */
16
+ line: number;
17
+ /** true if the reference is inside a fenced code block */
18
+ inCodeBlock: boolean;
19
+ }
20
+ /** Aggregated extraction result */
21
+ export interface McpExtractionResult {
22
+ /** All individual references found */
23
+ references: McpReference[];
24
+ /** Unique server names across all references */
25
+ servers: string[];
26
+ /** Servers referenced at least once outside a code block */
27
+ highConfidenceServers: string[];
28
+ /** true if input exceeded the 100KB cap and was truncated */
29
+ truncated?: boolean;
30
+ }
31
+ /**
32
+ * Extract all MCP tool references from skill content.
33
+ *
34
+ * Scans each line for `mcp__server__tool` patterns, tracking fenced
35
+ * code block state to distinguish high-confidence (prose) references
36
+ * from low-confidence (code example) references.
37
+ *
38
+ * @param content - Raw SKILL.md content (markdown)
39
+ * @returns Extraction result with references, servers, and confidence info
40
+ */
41
+ export declare function extractMcpReferences(content: string): McpExtractionResult;
42
+ //# sourceMappingURL=McpReferenceExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"McpReferenceExtractor.d.ts","sourceRoot":"","sources":["../../../src/analysis/McpReferenceExtractor.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,mDAAmD;AACnD,MAAM,WAAW,YAAY;IAC3B,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAA;IACZ,wDAAwD;IACxD,IAAI,EAAE,MAAM,CAAA;IACZ,0DAA0D;IAC1D,WAAW,EAAE,OAAO,CAAA;CACrB;AAED,mCAAmC;AACnC,MAAM,WAAW,mBAAmB;IAClC,sCAAsC;IACtC,UAAU,EAAE,YAAY,EAAE,CAAA;IAC1B,gDAAgD;IAChD,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,4DAA4D;IAC5D,qBAAqB,EAAE,MAAM,EAAE,CAAA;IAC/B,6DAA6D;IAC7D,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AAeD;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAyEzE"}