@skillsmith/core 0.4.0 → 0.4.1

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 (308) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/src/analysis/CodebaseAnalyzer.d.ts.map +1 -1
  3. package/dist/src/analysis/CodebaseAnalyzer.js.map +1 -1
  4. package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -1
  5. package/dist/src/analysis/language-detector.d.ts +4 -20
  6. package/dist/src/analysis/language-detector.d.ts.map +1 -1
  7. package/dist/src/analysis/language-detector.js +2 -399
  8. package/dist/src/analysis/language-detector.js.map +1 -1
  9. package/dist/src/analysis/language-detector.patterns.d.ts +17 -0
  10. package/dist/src/analysis/language-detector.patterns.d.ts.map +1 -0
  11. package/dist/src/analysis/language-detector.patterns.js +413 -0
  12. package/dist/src/analysis/language-detector.patterns.js.map +1 -0
  13. package/dist/src/analysis/language-detector.types.d.ts +48 -0
  14. package/dist/src/analysis/language-detector.types.d.ts.map +1 -0
  15. package/dist/src/analysis/language-detector.types.js +6 -0
  16. package/dist/src/analysis/language-detector.types.js.map +1 -0
  17. package/dist/src/analysis/metrics.d.ts +22 -219
  18. package/dist/src/analysis/metrics.d.ts.map +1 -1
  19. package/dist/src/analysis/metrics.implementations.d.ts +39 -0
  20. package/dist/src/analysis/metrics.implementations.d.ts.map +1 -0
  21. package/dist/src/analysis/metrics.implementations.js +114 -0
  22. package/dist/src/analysis/metrics.implementations.js.map +1 -0
  23. package/dist/src/analysis/metrics.js +21 -224
  24. package/dist/src/analysis/metrics.js.map +1 -1
  25. package/dist/src/analysis/metrics.types.d.ts +79 -0
  26. package/dist/src/analysis/metrics.types.d.ts.map +1 -0
  27. package/dist/src/analysis/metrics.types.js +6 -0
  28. package/dist/src/analysis/metrics.types.js.map +1 -0
  29. package/dist/src/analytics/ROIDashboardService.js +4 -2
  30. package/dist/src/analytics/ROIDashboardService.js.map +1 -1
  31. package/dist/src/api/cache.d.ts.map +1 -1
  32. package/dist/src/api/cache.js.map +1 -1
  33. package/dist/src/api/client.d.ts +1 -0
  34. package/dist/src/api/client.d.ts.map +1 -1
  35. package/dist/src/api/client.js +17 -3
  36. package/dist/src/api/client.js.map +1 -1
  37. package/dist/src/api/types.d.ts +1 -1
  38. package/dist/src/api/types.d.ts.map +1 -1
  39. package/dist/src/benchmarks/BenchmarkRunner.d.ts.map +1 -1
  40. package/dist/src/benchmarks/BenchmarkRunner.js +1 -1
  41. package/dist/src/benchmarks/BenchmarkRunner.js.map +1 -1
  42. package/dist/src/billing/BillingService.d.ts +15 -53
  43. package/dist/src/billing/BillingService.d.ts.map +1 -1
  44. package/dist/src/billing/BillingService.helpers.d.ts +15 -0
  45. package/dist/src/billing/BillingService.helpers.d.ts.map +1 -0
  46. package/dist/src/billing/BillingService.helpers.js +45 -0
  47. package/dist/src/billing/BillingService.helpers.js.map +1 -0
  48. package/dist/src/billing/BillingService.js +49 -179
  49. package/dist/src/billing/BillingService.js.map +1 -1
  50. package/dist/src/billing/BillingService.types.d.ts +52 -0
  51. package/dist/src/billing/BillingService.types.d.ts.map +1 -0
  52. package/dist/src/billing/BillingService.types.js +6 -0
  53. package/dist/src/billing/BillingService.types.js.map +1 -0
  54. package/dist/src/billing/StripeClient.d.ts +3 -2
  55. package/dist/src/billing/StripeClient.d.ts.map +1 -1
  56. package/dist/src/billing/StripeClient.js +4 -3
  57. package/dist/src/billing/StripeClient.js.map +1 -1
  58. package/dist/src/billing/StripeWebhookHandler.d.ts +13 -0
  59. package/dist/src/billing/StripeWebhookHandler.d.ts.map +1 -1
  60. package/dist/src/billing/StripeWebhookHandler.js +52 -9
  61. package/dist/src/billing/StripeWebhookHandler.js.map +1 -1
  62. package/dist/src/db/migration.d.ts +129 -0
  63. package/dist/src/db/migration.d.ts.map +1 -0
  64. package/dist/src/db/migration.js +289 -0
  65. package/dist/src/db/migration.js.map +1 -0
  66. package/dist/src/db/schema.d.ts +2 -2
  67. package/dist/src/db/schema.d.ts.map +1 -1
  68. package/dist/src/db/schema.js +23 -1
  69. package/dist/src/db/schema.js.map +1 -1
  70. package/dist/src/embeddings/hnsw-store.d.ts +8 -518
  71. package/dist/src/embeddings/hnsw-store.d.ts.map +1 -1
  72. package/dist/src/embeddings/hnsw-store.helpers.d.ts +83 -0
  73. package/dist/src/embeddings/hnsw-store.helpers.d.ts.map +1 -0
  74. package/dist/src/embeddings/hnsw-store.helpers.js +147 -0
  75. package/dist/src/embeddings/hnsw-store.helpers.js.map +1 -0
  76. package/dist/src/embeddings/hnsw-store.js +66 -517
  77. package/dist/src/embeddings/hnsw-store.js.map +1 -1
  78. package/dist/src/embeddings/hnsw-store.types.d.ts +154 -0
  79. package/dist/src/embeddings/hnsw-store.types.d.ts.map +1 -0
  80. package/dist/src/embeddings/hnsw-store.types.js +26 -0
  81. package/dist/src/embeddings/hnsw-store.types.js.map +1 -0
  82. package/dist/src/errors.d.ts.map +1 -1
  83. package/dist/src/errors.js +1 -1
  84. package/dist/src/errors.js.map +1 -1
  85. package/dist/src/index.d.ts +8 -1
  86. package/dist/src/index.d.ts.map +1 -1
  87. package/dist/src/index.js +18 -0
  88. package/dist/src/index.js.map +1 -1
  89. package/dist/src/indexer/GitHubIndexer.d.ts.map +1 -1
  90. package/dist/src/indexer/GitHubIndexer.js +17 -4
  91. package/dist/src/indexer/GitHubIndexer.js.map +1 -1
  92. package/dist/src/indexer/SwarmIndexer.d.ts.map +1 -1
  93. package/dist/src/indexer/SwarmIndexer.js +1 -1
  94. package/dist/src/indexer/SwarmIndexer.js.map +1 -1
  95. package/dist/src/learning/PatternStore.d.ts +6 -426
  96. package/dist/src/learning/PatternStore.d.ts.map +1 -1
  97. package/dist/src/learning/PatternStore.helpers.d.ts +88 -0
  98. package/dist/src/learning/PatternStore.helpers.d.ts.map +1 -0
  99. package/dist/src/learning/PatternStore.helpers.js +286 -0
  100. package/dist/src/learning/PatternStore.helpers.js.map +1 -0
  101. package/dist/src/learning/PatternStore.js +52 -598
  102. package/dist/src/learning/PatternStore.js.map +1 -1
  103. package/dist/src/learning/PatternStore.queries.d.ts +83 -0
  104. package/dist/src/learning/PatternStore.queries.d.ts.map +1 -0
  105. package/dist/src/learning/PatternStore.queries.js +189 -0
  106. package/dist/src/learning/PatternStore.queries.js.map +1 -0
  107. package/dist/src/learning/PatternStore.types.d.ts +308 -0
  108. package/dist/src/learning/PatternStore.types.d.ts.map +1 -0
  109. package/dist/src/learning/PatternStore.types.js +44 -0
  110. package/dist/src/learning/PatternStore.types.js.map +1 -0
  111. package/dist/src/learning/ReasoningBankIntegration.d.ts +5 -345
  112. package/dist/src/learning/ReasoningBankIntegration.d.ts.map +1 -1
  113. package/dist/src/learning/ReasoningBankIntegration.helpers.d.ts +49 -0
  114. package/dist/src/learning/ReasoningBankIntegration.helpers.d.ts.map +1 -0
  115. package/dist/src/learning/ReasoningBankIntegration.helpers.js +180 -0
  116. package/dist/src/learning/ReasoningBankIntegration.helpers.js.map +1 -0
  117. package/dist/src/learning/ReasoningBankIntegration.js +21 -390
  118. package/dist/src/learning/ReasoningBankIntegration.js.map +1 -1
  119. package/dist/src/learning/ReasoningBankIntegration.types.d.ts +167 -0
  120. package/dist/src/learning/ReasoningBankIntegration.types.d.ts.map +1 -0
  121. package/dist/src/learning/ReasoningBankIntegration.types.js +51 -0
  122. package/dist/src/learning/ReasoningBankIntegration.types.js.map +1 -0
  123. package/dist/src/learning/interfaces.d.ts.map +1 -1
  124. package/dist/src/pipeline/DailyIndexPipeline.js +1 -1
  125. package/dist/src/pipeline/DailyIndexPipeline.js.map +1 -1
  126. package/dist/src/repositories/IndexerRepository.d.ts +1 -0
  127. package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
  128. package/dist/src/repositories/IndexerRepository.js +6 -0
  129. package/dist/src/repositories/IndexerRepository.js.map +1 -1
  130. package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
  131. package/dist/src/repositories/SkillRepository.js +20 -5
  132. package/dist/src/repositories/SkillRepository.js.map +1 -1
  133. package/dist/src/routing/SONARouter.d.ts +3 -101
  134. package/dist/src/routing/SONARouter.d.ts.map +1 -1
  135. package/dist/src/routing/SONARouter.helpers.d.ts +112 -0
  136. package/dist/src/routing/SONARouter.helpers.d.ts.map +1 -0
  137. package/dist/src/routing/SONARouter.helpers.js +184 -0
  138. package/dist/src/routing/SONARouter.helpers.js.map +1 -0
  139. package/dist/src/routing/SONARouter.js +16 -318
  140. package/dist/src/routing/SONARouter.js.map +1 -1
  141. package/dist/src/scripts/github-import/github-client.js +0 -1
  142. package/dist/src/scripts/github-import/github-client.js.map +1 -1
  143. package/dist/src/scripts/ingest-lenny-skills.d.ts +40 -0
  144. package/dist/src/scripts/ingest-lenny-skills.d.ts.map +1 -0
  145. package/dist/src/scripts/ingest-lenny-skills.js +346 -0
  146. package/dist/src/scripts/ingest-lenny-skills.js.map +1 -0
  147. package/dist/src/scripts/review-lenny-skills.d.ts +25 -0
  148. package/dist/src/scripts/review-lenny-skills.d.ts.map +1 -0
  149. package/dist/src/scripts/review-lenny-skills.js +520 -0
  150. package/dist/src/scripts/review-lenny-skills.js.map +1 -0
  151. package/dist/src/scripts/sync-to-supabase.d.ts +10 -0
  152. package/dist/src/scripts/sync-to-supabase.d.ts.map +1 -0
  153. package/dist/src/scripts/sync-to-supabase.js +93 -0
  154. package/dist/src/scripts/sync-to-supabase.js.map +1 -0
  155. package/dist/src/security/AuditLogger.js +1 -1
  156. package/dist/src/security/AuditLogger.js.map +1 -1
  157. package/dist/src/security/__tests__/pathValidation.test.js.map +1 -1
  158. package/dist/src/security/scanner/SecurityScanner.d.ts +12 -88
  159. package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
  160. package/dist/src/security/scanner/SecurityScanner.formatters.d.ts +49 -0
  161. package/dist/src/security/scanner/SecurityScanner.formatters.d.ts.map +1 -0
  162. package/dist/src/security/scanner/SecurityScanner.formatters.js +139 -0
  163. package/dist/src/security/scanner/SecurityScanner.formatters.js.map +1 -0
  164. package/dist/src/security/scanner/SecurityScanner.helpers.d.ts +40 -0
  165. package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -0
  166. package/dist/src/security/scanner/SecurityScanner.helpers.js +142 -0
  167. package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -0
  168. package/dist/src/security/scanner/SecurityScanner.js +26 -255
  169. package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
  170. package/dist/src/services/SearchService.d.ts +5 -0
  171. package/dist/src/services/SearchService.d.ts.map +1 -1
  172. package/dist/src/services/SearchService.js +143 -11
  173. package/dist/src/services/SearchService.js.map +1 -1
  174. package/dist/src/services/SkillAnalyzer.d.ts +117 -0
  175. package/dist/src/services/SkillAnalyzer.d.ts.map +1 -0
  176. package/dist/src/services/SkillAnalyzer.js +421 -0
  177. package/dist/src/services/SkillAnalyzer.js.map +1 -0
  178. package/dist/src/services/SkillDecomposer.d.ts +103 -0
  179. package/dist/src/services/SkillDecomposer.d.ts.map +1 -0
  180. package/dist/src/services/SkillDecomposer.js +359 -0
  181. package/dist/src/services/SkillDecomposer.js.map +1 -0
  182. package/dist/src/services/SubagentGenerator.d.ts +68 -0
  183. package/dist/src/services/SubagentGenerator.d.ts.map +1 -0
  184. package/dist/src/services/SubagentGenerator.js +319 -0
  185. package/dist/src/services/SubagentGenerator.js.map +1 -0
  186. package/dist/src/services/TransformationService.d.ts +163 -0
  187. package/dist/src/services/TransformationService.d.ts.map +1 -0
  188. package/dist/src/services/TransformationService.js +291 -0
  189. package/dist/src/services/TransformationService.js.map +1 -0
  190. package/dist/src/services/__tests__/SkillAnalyzer.test.d.ts +6 -0
  191. package/dist/src/services/__tests__/SkillAnalyzer.test.d.ts.map +1 -0
  192. package/dist/src/services/__tests__/SkillAnalyzer.test.js +177 -0
  193. package/dist/src/services/__tests__/SkillAnalyzer.test.js.map +1 -0
  194. package/dist/src/services/__tests__/SkillDecomposer.test.d.ts +6 -0
  195. package/dist/src/services/__tests__/SkillDecomposer.test.d.ts.map +1 -0
  196. package/dist/src/services/__tests__/SkillDecomposer.test.js +235 -0
  197. package/dist/src/services/__tests__/SkillDecomposer.test.js.map +1 -0
  198. package/dist/src/services/__tests__/SubagentGenerator.test.d.ts +6 -0
  199. package/dist/src/services/__tests__/SubagentGenerator.test.d.ts.map +1 -0
  200. package/dist/src/services/__tests__/SubagentGenerator.test.js +174 -0
  201. package/dist/src/services/__tests__/SubagentGenerator.test.js.map +1 -0
  202. package/dist/src/services/__tests__/TransformationService.test.d.ts +6 -0
  203. package/dist/src/services/__tests__/TransformationService.test.d.ts.map +1 -0
  204. package/dist/src/services/__tests__/TransformationService.test.js +242 -0
  205. package/dist/src/services/__tests__/TransformationService.test.js.map +1 -0
  206. package/dist/src/session/SessionContext.js +1 -1
  207. package/dist/src/session/SessionContext.js.map +1 -1
  208. package/dist/src/session/SessionManager.d.ts +3 -67
  209. package/dist/src/session/SessionManager.d.ts.map +1 -1
  210. package/dist/src/session/SessionManager.helpers.d.ts +68 -0
  211. package/dist/src/session/SessionManager.helpers.d.ts.map +1 -0
  212. package/dist/src/session/SessionManager.helpers.js +152 -0
  213. package/dist/src/session/SessionManager.helpers.js.map +1 -0
  214. package/dist/src/session/SessionManager.js +58 -163
  215. package/dist/src/session/SessionManager.js.map +1 -1
  216. package/dist/src/session/SessionManager.types.d.ts +88 -0
  217. package/dist/src/session/SessionManager.types.d.ts.map +1 -0
  218. package/dist/src/session/SessionManager.types.js +27 -0
  219. package/dist/src/session/SessionManager.types.js.map +1 -0
  220. package/dist/src/session/SessionRecovery.d.ts.map +1 -1
  221. package/dist/src/session/SessionRecovery.js +3 -2
  222. package/dist/src/session/SessionRecovery.js.map +1 -1
  223. package/dist/src/sources/RawUrlSourceAdapter.js.map +1 -1
  224. package/dist/src/sources/SourceAdapterRegistry.js +1 -1
  225. package/dist/src/sources/SourceAdapterRegistry.js.map +1 -1
  226. package/dist/src/telemetry/tracer.d.ts.map +1 -1
  227. package/dist/src/telemetry/tracer.js +2 -3
  228. package/dist/src/telemetry/tracer.js.map +1 -1
  229. package/dist/src/testing/MultiLLMProvider.d.ts +17 -293
  230. package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -1
  231. package/dist/src/testing/MultiLLMProvider.helpers.d.ts +54 -0
  232. package/dist/src/testing/MultiLLMProvider.helpers.d.ts.map +1 -0
  233. package/dist/src/testing/MultiLLMProvider.helpers.js +126 -0
  234. package/dist/src/testing/MultiLLMProvider.helpers.js.map +1 -0
  235. package/dist/src/testing/MultiLLMProvider.js +50 -323
  236. package/dist/src/testing/MultiLLMProvider.js.map +1 -1
  237. package/dist/src/testing/MultiLLMProvider.types.d.ts +253 -0
  238. package/dist/src/testing/MultiLLMProvider.types.d.ts.map +1 -0
  239. package/dist/src/testing/MultiLLMProvider.types.js +111 -0
  240. package/dist/src/testing/MultiLLMProvider.types.js.map +1 -0
  241. package/dist/src/triggers/__tests__/TriggerDetector.test.js +1 -1
  242. package/dist/src/triggers/__tests__/TriggerDetector.test.js.map +1 -1
  243. package/dist/src/types/skill.d.ts +29 -0
  244. package/dist/src/types/skill.d.ts.map +1 -1
  245. package/dist/src/types/skill.js +11 -1
  246. package/dist/src/types/skill.js.map +1 -1
  247. package/dist/src/types.d.ts +22 -0
  248. package/dist/src/types.d.ts.map +1 -1
  249. package/dist/src/utils/retry.js +2 -2
  250. package/dist/src/utils/retry.js.map +1 -1
  251. package/dist/src/validation/index.js +2 -2
  252. package/dist/src/validation/index.js.map +1 -1
  253. package/dist/src/webhooks/WebhookHandler.d.ts.map +1 -1
  254. package/dist/src/webhooks/WebhookHandler.js.map +1 -1
  255. package/dist/src/webhooks/WebhookPayload.js +1 -1
  256. package/dist/src/webhooks/WebhookPayload.js.map +1 -1
  257. package/dist/tests/Analytics.integration.test.js +2 -2
  258. package/dist/tests/Analytics.integration.test.js.map +1 -1
  259. package/dist/tests/AnalyticsRepository.test.js +3 -5
  260. package/dist/tests/AnalyticsRepository.test.js.map +1 -1
  261. package/dist/tests/AnalyticsStorage.test.js.map +1 -1
  262. package/dist/tests/ApiPartialResponses.test.d.ts +12 -0
  263. package/dist/tests/ApiPartialResponses.test.d.ts.map +1 -0
  264. package/dist/tests/ApiPartialResponses.test.js +202 -0
  265. package/dist/tests/ApiPartialResponses.test.js.map +1 -0
  266. package/dist/tests/AuditLogger.test.js.map +1 -1
  267. package/dist/tests/BenchmarkRunner.test.js +6 -6
  268. package/dist/tests/BenchmarkRunner.test.js.map +1 -1
  269. package/dist/tests/CacheSecurity.test.js.map +1 -1
  270. package/dist/tests/CodebaseAnalyzer.test.js.map +1 -1
  271. package/dist/tests/DailyIndexPipeline.test.js.map +1 -1
  272. package/dist/tests/EmbeddingService.test.js.map +1 -1
  273. package/dist/tests/GitHubIndexer.test.js +4 -3
  274. package/dist/tests/GitHubIndexer.test.js.map +1 -1
  275. package/dist/tests/MemoryProfiler.test.js +3 -3
  276. package/dist/tests/MemoryProfiler.test.js.map +1 -1
  277. package/dist/tests/QualityScorer.test.js.map +1 -1
  278. package/dist/tests/RateLimiter.test.js.map +1 -1
  279. package/dist/tests/ScraperAdapters.test.js.map +1 -1
  280. package/dist/tests/SecurityScanner.test.js +4 -4
  281. package/dist/tests/SecurityScanner.test.js.map +1 -1
  282. package/dist/tests/SessionManager.security.test.js +1 -1
  283. package/dist/tests/SessionManager.security.test.js.map +1 -1
  284. package/dist/tests/SessionManager.test.js +4 -4
  285. package/dist/tests/SessionManager.test.js.map +1 -1
  286. package/dist/tests/SwarmIndexer.test.js +1 -1
  287. package/dist/tests/SwarmIndexer.test.js.map +1 -1
  288. package/dist/tests/TieredCache.test.js +2 -11
  289. package/dist/tests/TieredCache.test.js.map +1 -1
  290. package/dist/tests/WebhookHandler.test.js.map +1 -1
  291. package/dist/tests/fixtures/api-responses/index.d.ts +119 -0
  292. package/dist/tests/fixtures/api-responses/index.d.ts.map +1 -0
  293. package/dist/tests/fixtures/api-responses/index.js +419 -0
  294. package/dist/tests/fixtures/api-responses/index.js.map +1 -0
  295. package/dist/tests/logger.test.js +1 -1
  296. package/dist/tests/logger.test.js.map +1 -1
  297. package/dist/tests/performance/LargeScalePerformance.test.js +1 -1
  298. package/dist/tests/performance/LargeScalePerformance.test.js.map +1 -1
  299. package/dist/tests/sanitization.test.js.map +1 -1
  300. package/dist/tests/session/SessionManager.helpers.test.d.ts +8 -0
  301. package/dist/tests/session/SessionManager.helpers.test.d.ts.map +1 -0
  302. package/dist/tests/session/SessionManager.helpers.test.js +105 -0
  303. package/dist/tests/session/SessionManager.helpers.test.js.map +1 -0
  304. package/dist/tests/sources.test.js.map +1 -1
  305. package/dist/tests/webhooks/WebhookHandler.idempotency.test.js +1 -1
  306. package/dist/tests/webhooks/WebhookHandler.idempotency.test.js.map +1 -1
  307. package/dist/tests/webhooks/WebhookPayload.security.test.js.map +1 -1
  308. package/package.json +9 -9
@@ -0,0 +1,291 @@
1
+ /**
2
+ * SMI-XXX: TransformationService - Orchestrate skill optimization pipeline
3
+ *
4
+ * The central service for transforming community skills into optimized versions.
5
+ * Coordinates the full pipeline:
6
+ * 1. SkillAnalyzer - Analyze skill for optimization patterns
7
+ * 2. SkillDecomposer - Decompose large skills into sub-skills
8
+ * 3. SubagentGenerator - Generate companion subagent definitions
9
+ * 4. Caching - Cache transformed skills for reuse
10
+ *
11
+ * Implements the hybrid approach:
12
+ * - Hot skills (>100 installs): Pre-transformed, cached
13
+ * - Warm skills (10-100 installs): JIT on first install, cached
14
+ * - Cold skills (<10 installs): JIT on demand, short TTL
15
+ *
16
+ * Part of the Skillsmith Optimization Layer.
17
+ */
18
+ import { CacheRepository } from '../repositories/CacheRepository.js';
19
+ import { analyzeSkill, quickTransformCheck } from './SkillAnalyzer.js';
20
+ import { decomposeSkill, parallelizeTaskCalls, } from './SkillDecomposer.js';
21
+ import { generateSubagent, } from './SubagentGenerator.js';
22
+ const DEFAULT_OPTIONS = {
23
+ cacheTtl: 3600, // 1 hour
24
+ enableCache: true,
25
+ forceTransform: false,
26
+ version: '1.0.0',
27
+ };
28
+ /** Cache key prefix for transformed skills */
29
+ const CACHE_KEY_PREFIX = 'transform:';
30
+ /** Attribution text added to optimized skills */
31
+ const ATTRIBUTION = '\n\n---\n\n*Optimized by Skillsmith - Token usage reduced through intelligent decomposition*';
32
+ /**
33
+ * TransformationService orchestrates the skill optimization pipeline
34
+ */
35
+ export class TransformationService {
36
+ cache;
37
+ options;
38
+ /**
39
+ * Create a new TransformationService
40
+ *
41
+ * @param db - Database connection (optional, for caching)
42
+ * @param options - Service configuration
43
+ */
44
+ constructor(db, options) {
45
+ this.options = { ...DEFAULT_OPTIONS, ...options };
46
+ this.cache = db && this.options.enableCache ? new CacheRepository(db) : null;
47
+ }
48
+ /**
49
+ * Transform a skill through the full optimization pipeline
50
+ *
51
+ * @param skillId - Unique identifier for the skill (for caching)
52
+ * @param skillName - Human-readable skill name
53
+ * @param description - Skill description
54
+ * @param content - The full SKILL.md content
55
+ * @returns Transformation result
56
+ */
57
+ async transform(skillId, skillName, description, content) {
58
+ const startTime = Date.now();
59
+ // Check cache first (unless force transform)
60
+ if (!this.options.forceTransform && this.cache) {
61
+ const cached = this.getCachedTransformation(skillId, content);
62
+ if (cached) {
63
+ return cached;
64
+ }
65
+ }
66
+ // Quick check if transformation is needed
67
+ if (!quickTransformCheck(content)) {
68
+ // Still add attribution but skip full transformation
69
+ const result = this.createMinimalResult(content, startTime);
70
+ // Cache the result
71
+ if (this.cache) {
72
+ this.cacheTransformation(skillId, content, result);
73
+ }
74
+ return result;
75
+ }
76
+ // Full analysis
77
+ const analysis = analyzeSkill(content);
78
+ // Apply transformations
79
+ let transformedContent = content;
80
+ // 1. Parallelize Task() calls
81
+ let tasksParallelized = false;
82
+ if (analysis.taskPatterns.canBatch) {
83
+ transformedContent = parallelizeTaskCalls(transformedContent);
84
+ tasksParallelized = true;
85
+ }
86
+ // 2. Decompose if needed
87
+ const decomposition = decomposeSkill(transformedContent, analysis);
88
+ // 3. Generate subagent if beneficial
89
+ const subagentResult = generateSubagent(skillName, description, content, analysis);
90
+ // Build result
91
+ const result = this.buildResult(decomposition, subagentResult, analysis, tasksParallelized, startTime);
92
+ // Cache the result
93
+ if (this.cache) {
94
+ this.cacheTransformation(skillId, content, result);
95
+ }
96
+ return result;
97
+ }
98
+ /**
99
+ * Quick transform without caching (for testing or one-off transforms)
100
+ *
101
+ * @param skillName - Human-readable skill name
102
+ * @param description - Skill description
103
+ * @param content - The full SKILL.md content
104
+ * @returns Transformation result
105
+ */
106
+ transformSync(skillName, description, content) {
107
+ const startTime = Date.now();
108
+ // Quick check if transformation is needed
109
+ if (!quickTransformCheck(content)) {
110
+ return this.createMinimalResult(content, startTime);
111
+ }
112
+ // Full analysis
113
+ const analysis = analyzeSkill(content);
114
+ // Apply transformations
115
+ let transformedContent = content;
116
+ // 1. Parallelize Task() calls
117
+ let tasksParallelized = false;
118
+ if (analysis.taskPatterns.canBatch) {
119
+ transformedContent = parallelizeTaskCalls(transformedContent);
120
+ tasksParallelized = true;
121
+ }
122
+ // 2. Decompose if needed
123
+ const decomposition = decomposeSkill(transformedContent, analysis);
124
+ // 3. Generate subagent if beneficial
125
+ const subagentResult = generateSubagent(skillName, description, content, analysis);
126
+ return this.buildResult(decomposition, subagentResult, analysis, tasksParallelized, startTime);
127
+ }
128
+ /**
129
+ * Check if a skill would benefit from transformation without fully transforming
130
+ *
131
+ * @param content - The SKILL.md content
132
+ * @returns Analysis with transformation recommendations
133
+ */
134
+ analyze(content) {
135
+ return analyzeSkill(content);
136
+ }
137
+ /**
138
+ * Get cached transformation if available and valid
139
+ */
140
+ getCachedTransformation(skillId, content) {
141
+ if (!this.cache)
142
+ return null;
143
+ const cacheKey = this.buildCacheKey(skillId);
144
+ const cached = this.cache.get(cacheKey);
145
+ if (!cached)
146
+ return null;
147
+ // Validate cache entry
148
+ const contentHash = this.hashContent(content);
149
+ if (cached.skillHash !== contentHash) {
150
+ // Content changed, invalidate cache
151
+ return null;
152
+ }
153
+ if (cached.version !== this.options.version) {
154
+ // Version mismatch, invalidate cache
155
+ return null;
156
+ }
157
+ return cached.result;
158
+ }
159
+ /**
160
+ * Cache a transformation result
161
+ */
162
+ cacheTransformation(skillId, content, result) {
163
+ if (!this.cache)
164
+ return;
165
+ const cacheKey = this.buildCacheKey(skillId);
166
+ const contentHash = this.hashContent(content);
167
+ const cacheEntry = {
168
+ result,
169
+ skillHash: contentHash,
170
+ cachedAt: new Date().toISOString(),
171
+ version: this.options.version,
172
+ };
173
+ this.cache.set(cacheKey, cacheEntry, this.options.cacheTtl);
174
+ }
175
+ /**
176
+ * Build cache key for a skill
177
+ */
178
+ buildCacheKey(skillId) {
179
+ return `${CACHE_KEY_PREFIX}${skillId}`;
180
+ }
181
+ /**
182
+ * Simple hash function for content comparison
183
+ */
184
+ hashContent(content) {
185
+ // Simple hash for content comparison
186
+ let hash = 0;
187
+ for (let i = 0; i < content.length; i++) {
188
+ const char = content.charCodeAt(i);
189
+ hash = (hash << 5) - hash + char;
190
+ hash = hash & hash; // Convert to 32-bit integer
191
+ }
192
+ return hash.toString(16);
193
+ }
194
+ /**
195
+ * Create minimal result for skills that don't need transformation
196
+ */
197
+ createMinimalResult(content, startTime) {
198
+ const lineCount = content.split('\n').length;
199
+ // Add attribution if not present
200
+ let mainSkillContent = content;
201
+ if (!content.includes('Optimized by Skillsmith')) {
202
+ mainSkillContent = content.trimEnd() + ATTRIBUTION;
203
+ }
204
+ return {
205
+ transformed: false,
206
+ mainSkillContent,
207
+ subSkills: [],
208
+ stats: {
209
+ originalLines: lineCount,
210
+ optimizedLines: mainSkillContent.split('\n').length,
211
+ subSkillCount: 0,
212
+ tasksParallelized: false,
213
+ subagentGenerated: false,
214
+ tokenReductionPercent: 0,
215
+ transformDurationMs: Date.now() - startTime,
216
+ },
217
+ analysis: analyzeSkill(content),
218
+ attribution: ATTRIBUTION,
219
+ };
220
+ }
221
+ /**
222
+ * Build full transformation result
223
+ */
224
+ buildResult(decomposition, subagentResult, analysis, tasksParallelized, startTime) {
225
+ // Calculate token reduction
226
+ let tokenReductionPercent = decomposition.stats.tokenReductionPercent;
227
+ // Add savings from subagent context isolation
228
+ if (subagentResult.generated) {
229
+ tokenReductionPercent += 20; // Subagent provides ~20% additional savings
230
+ }
231
+ // Add savings from task parallelization
232
+ if (tasksParallelized) {
233
+ tokenReductionPercent += analysis.taskPatterns.batchSavingsPercent / 2;
234
+ }
235
+ // Cap at 80% (realistic maximum)
236
+ tokenReductionPercent = Math.min(80, Math.round(tokenReductionPercent));
237
+ return {
238
+ transformed: decomposition.wasDecomposed || subagentResult.generated || tasksParallelized,
239
+ mainSkillContent: decomposition.mainSkill.content,
240
+ subSkills: decomposition.subSkills.map((s) => ({
241
+ filename: s.filename,
242
+ content: s.content,
243
+ })),
244
+ subagent: subagentResult.subagent,
245
+ claudeMdSnippet: subagentResult.claudeMdSnippet,
246
+ stats: {
247
+ originalLines: decomposition.stats.originalLines,
248
+ optimizedLines: decomposition.mainSkill.lineCount,
249
+ subSkillCount: decomposition.subSkills.length,
250
+ tasksParallelized,
251
+ subagentGenerated: subagentResult.generated,
252
+ tokenReductionPercent,
253
+ transformDurationMs: Date.now() - startTime,
254
+ },
255
+ analysis,
256
+ attribution: ATTRIBUTION,
257
+ };
258
+ }
259
+ /**
260
+ * Clear transformation cache
261
+ */
262
+ clearCache() {
263
+ if (!this.cache)
264
+ return 0;
265
+ return this.cache.clear();
266
+ }
267
+ /**
268
+ * Get cache statistics
269
+ */
270
+ getCacheStats() {
271
+ return {
272
+ enabled: this.cache !== null,
273
+ ttl: this.options.cacheTtl,
274
+ version: this.options.version,
275
+ };
276
+ }
277
+ }
278
+ /**
279
+ * Create a standalone transformation (no caching)
280
+ *
281
+ * @param skillName - Human-readable skill name
282
+ * @param description - Skill description
283
+ * @param content - The full SKILL.md content
284
+ * @returns Transformation result
285
+ */
286
+ export function transformSkill(skillName, description, content) {
287
+ const service = new TransformationService();
288
+ return service.transformSync(skillName, description, content);
289
+ }
290
+ export default TransformationService;
291
+ //# sourceMappingURL=TransformationService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransformationService.js","sourceRoot":"","sources":["../../../src/services/TransformationService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Tests for SkillAnalyzer service
3
+ * Part of Skillsmith Optimization Layer
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=SkillAnalyzer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillAnalyzer.test.d.ts","sourceRoot":"","sources":["../../../../src/services/__tests__/SkillAnalyzer.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,177 @@
1
+ /**
2
+ * @fileoverview Tests for SkillAnalyzer service
3
+ * Part of Skillsmith Optimization Layer
4
+ */
5
+ import { describe, it, expect } from 'vitest';
6
+ import { analyzeSkill, quickTransformCheck } from '../SkillAnalyzer.js';
7
+ describe('SkillAnalyzer', () => {
8
+ describe('analyzeSkill', () => {
9
+ it('should analyze a simple skill with low complexity', () => {
10
+ const content = `---
11
+ name: simple-skill
12
+ description: A simple skill for testing
13
+ ---
14
+
15
+ # Simple Skill
16
+
17
+ This is a simple skill with minimal content.
18
+
19
+ ## Usage
20
+
21
+ Just use it normally.
22
+ `;
23
+ const analysis = analyzeSkill(content);
24
+ expect(analysis.lineCount).toBeLessThan(500);
25
+ expect(analysis.shouldTransform).toBe(false);
26
+ expect(analysis.optimizationScore).toBeLessThan(30);
27
+ });
28
+ it('should detect large skills that need decomposition', () => {
29
+ // Create a skill with >500 lines
30
+ const sections = Array(100)
31
+ .fill(null)
32
+ .map((_, i) => `## Section ${i}\n\nContent for section ${i}.\n\n`.repeat(5))
33
+ .join('\n');
34
+ const content = `---
35
+ name: large-skill
36
+ description: A large skill that needs decomposition
37
+ ---
38
+
39
+ # Large Skill
40
+
41
+ ${sections}
42
+ `;
43
+ const analysis = analyzeSkill(content);
44
+ expect(analysis.lineCount).toBeGreaterThan(500);
45
+ expect(analysis.shouldTransform).toBe(true);
46
+ expect(analysis.recommendations.some((r) => r.type === 'decompose')).toBe(true);
47
+ });
48
+ it('should detect heavy tool usage suggesting subagent', () => {
49
+ const content = `---
50
+ name: tool-heavy-skill
51
+ description: A skill with heavy tool usage
52
+ ---
53
+
54
+ # Tool Heavy Skill
55
+
56
+ This skill uses many tools:
57
+ - Run npm install
58
+ - Execute git commands
59
+ - Run docker build
60
+ - Use npx to execute
61
+ - Run yarn commands
62
+ - Use pnpm for package management
63
+
64
+ ## Commands
65
+
66
+ bash: npm run build
67
+ bash: git status
68
+ bash: docker compose up
69
+ `;
70
+ const analysis = analyzeSkill(content);
71
+ expect(analysis.toolUsage.detectedTools).toContain('Bash');
72
+ expect(analysis.toolUsage.suggestsSubagent).toBe(true);
73
+ expect(analysis.recommendations.some((r) => r.type === 'subagent')).toBe(true);
74
+ });
75
+ it('should detect sequential Task() calls that can be parallelized', () => {
76
+ const content = `---
77
+ name: task-skill
78
+ description: A skill with sequential Task() calls
79
+ ---
80
+
81
+ # Task Skill
82
+
83
+ ## Execution
84
+
85
+ \`\`\`javascript
86
+ Task("agent1", "do task 1")
87
+ Task("agent2", "do task 2")
88
+ Task("agent3", "do task 3")
89
+ \`\`\`
90
+
91
+ These tasks are independent and can run in parallel.
92
+ `;
93
+ const analysis = analyzeSkill(content);
94
+ expect(analysis.taskPatterns.taskCallCount).toBeGreaterThanOrEqual(3);
95
+ expect(analysis.taskPatterns.canBatch).toBe(true);
96
+ expect(analysis.recommendations.some((r) => r.type === 'parallelize')).toBe(true);
97
+ });
98
+ it('should identify extractable sections', () => {
99
+ // Create content with large API reference section
100
+ const apiSection = Array(60).fill('- endpoint: /api/v1/resource').join('\n');
101
+ const content = `---
102
+ name: api-skill
103
+ description: A skill with large API reference
104
+ ---
105
+
106
+ # API Skill
107
+
108
+ ## Overview
109
+
110
+ Quick overview here.
111
+
112
+ ## API Reference
113
+
114
+ ${apiSection}
115
+
116
+ ## Examples
117
+
118
+ Some examples here.
119
+ `;
120
+ const analysis = analyzeSkill(content);
121
+ expect(analysis.extractableSections.length).toBeGreaterThan(0);
122
+ expect(analysis.extractableSections.some((s) => s.name.toLowerCase().includes('api') || s.name.toLowerCase().includes('reference'))).toBe(true);
123
+ });
124
+ it('should calculate optimization score based on multiple factors', () => {
125
+ // Skill with multiple optimization opportunities
126
+ const content = `---
127
+ name: complex-skill
128
+ description: A complex skill with multiple optimization opportunities
129
+ ---
130
+
131
+ # Complex Skill
132
+
133
+ This skill has multiple areas for optimization.
134
+
135
+ ## Heavy Commands
136
+
137
+ Run npm install
138
+ Run npx something
139
+ Run git commands
140
+ Run docker build
141
+ Run yarn add
142
+ Use bash terminal
143
+
144
+ ## Large Examples Section
145
+
146
+ ${'Example code here.\n'.repeat(250)}
147
+
148
+ ## API Reference
149
+
150
+ ${Array(60).fill('- endpoint').join('\n')}
151
+ `;
152
+ const analysis = analyzeSkill(content);
153
+ // Score should reflect multiple optimization opportunities
154
+ expect(analysis.optimizationScore).toBeGreaterThan(20);
155
+ expect(analysis.recommendations.length).toBeGreaterThan(0);
156
+ });
157
+ });
158
+ describe('quickTransformCheck', () => {
159
+ it('should return false for small, simple skills', () => {
160
+ const content = `# Simple Skill\n\nJust a simple skill.`;
161
+ expect(quickTransformCheck(content)).toBe(false);
162
+ });
163
+ it('should return true for skills with >500 lines', () => {
164
+ const content = Array(600).fill('line content').join('\n');
165
+ expect(quickTransformCheck(content)).toBe(true);
166
+ });
167
+ it('should return true for skills with heavy tool patterns', () => {
168
+ const content = `# Skill\n\nnpm install\ngit status\ndocker build`;
169
+ expect(quickTransformCheck(content)).toBe(true);
170
+ });
171
+ it('should return true for skills with multiple Task() calls', () => {
172
+ const content = `# Skill\n\nTask("a", "b")\nTask("c", "d")`;
173
+ expect(quickTransformCheck(content)).toBe(true);
174
+ });
175
+ });
176
+ });
177
+ //# sourceMappingURL=SkillAnalyzer.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillAnalyzer.test.js","sourceRoot":"","sources":["../../../../src/services/__tests__/SkillAnalyzer.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @fileoverview Tests for SkillDecomposer service
3
+ * Part of Skillsmith Optimization Layer
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=SkillDecomposer.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillDecomposer.test.d.ts","sourceRoot":"","sources":["../../../../src/services/__tests__/SkillDecomposer.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}