@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,421 @@
1
+ /**
2
+ * SMI-XXX: SkillAnalyzer - Analyze skills for optimization patterns
3
+ *
4
+ * Detects optimization opportunities based on:
5
+ * - Line count (>500 lines suggests decomposition)
6
+ * - Tool usage patterns (heavy tool usage suggests subagent)
7
+ * - Sequential Task() calls (can be parallelized)
8
+ * - Large examples sections (can use progressive disclosure)
9
+ *
10
+ * Part of the Skillsmith Optimization Layer for transforming
11
+ * community skills into more performant versions.
12
+ */
13
+ /**
14
+ * Tool detection patterns for analyzing skill content
15
+ */
16
+ const TOOL_PATTERNS = {
17
+ Read: {
18
+ patterns: ['read file', 'read the file', 'examine', 'view file', 'cat ', 'Read tool'],
19
+ weight: 1,
20
+ },
21
+ Write: {
22
+ patterns: [
23
+ 'write file',
24
+ 'create file',
25
+ 'save to',
26
+ 'output to file',
27
+ 'Write tool',
28
+ 'write the file',
29
+ ],
30
+ weight: 2,
31
+ },
32
+ Edit: {
33
+ patterns: ['edit file', 'modify file', 'update file', 'patch', 'Edit tool', 'replace in'],
34
+ weight: 2,
35
+ },
36
+ Bash: {
37
+ patterns: [
38
+ 'bash',
39
+ 'npm ',
40
+ 'npx ',
41
+ 'git ',
42
+ 'docker',
43
+ 'yarn ',
44
+ 'pnpm ',
45
+ 'execute command',
46
+ 'run command',
47
+ 'terminal',
48
+ 'shell',
49
+ 'Bash tool',
50
+ ],
51
+ weight: 3,
52
+ },
53
+ Grep: {
54
+ patterns: ['grep', 'search for', 'find text', 'pattern match', 'Grep tool'],
55
+ weight: 1,
56
+ },
57
+ Glob: {
58
+ patterns: ['glob', 'find file', 'file pattern', 'list files', 'Glob tool'],
59
+ weight: 1,
60
+ },
61
+ WebFetch: {
62
+ patterns: ['fetch', 'http', 'api call', 'url', 'WebFetch', 'download', 'request'],
63
+ weight: 2,
64
+ },
65
+ WebSearch: {
66
+ patterns: ['web search', 'search online', 'lookup online', 'WebSearch'],
67
+ weight: 2,
68
+ },
69
+ Task: {
70
+ patterns: ['Task(', 'Task tool', 'spawn agent', 'delegate to', 'subagent'],
71
+ weight: 3,
72
+ },
73
+ };
74
+ /**
75
+ * Thresholds for optimization decisions
76
+ */
77
+ const THRESHOLDS = {
78
+ /** Maximum lines before recommending decomposition */
79
+ maxLinesBeforeDecompose: 500,
80
+ /** Minimum lines for an extractable section */
81
+ minSectionLines: 50,
82
+ /** Heavy tool usage count that suggests subagent */
83
+ heavyToolUsageCount: 5,
84
+ /** Sequential Task() calls that should be parallelized */
85
+ sequentialTaskThreshold: 2,
86
+ /** Minimum optimization score to recommend transformation */
87
+ minTransformScore: 30,
88
+ /** Large examples section threshold */
89
+ largeExamplesThreshold: 200,
90
+ };
91
+ /**
92
+ * Analyze a skill's content for optimization opportunities
93
+ *
94
+ * @param content - The full SKILL.md content
95
+ * @returns Analysis of optimization potential
96
+ */
97
+ export function analyzeSkill(content) {
98
+ const lines = content.split('\n');
99
+ const lineCount = lines.length;
100
+ // Analyze sections
101
+ const { mainContentLines, examplesLines, sections } = analyzeSections(content);
102
+ // Analyze tool usage
103
+ const toolUsage = analyzeToolUsage(content);
104
+ // Analyze Task() patterns
105
+ const taskPatterns = analyzeTaskPatterns(content);
106
+ // Find extractable sections
107
+ const extractableSections = findExtractableSections(sections, lineCount);
108
+ // Generate recommendations
109
+ const recommendations = generateRecommendations(lineCount, mainContentLines, examplesLines, toolUsage, taskPatterns, extractableSections);
110
+ // Calculate optimization score
111
+ const optimizationScore = calculateOptimizationScore(lineCount, toolUsage, taskPatterns, recommendations);
112
+ return {
113
+ lineCount,
114
+ mainContentLines,
115
+ examplesLines,
116
+ toolUsage,
117
+ taskPatterns,
118
+ extractableSections,
119
+ recommendations,
120
+ optimizationScore,
121
+ shouldTransform: optimizationScore >= THRESHOLDS.minTransformScore,
122
+ };
123
+ }
124
+ /**
125
+ * Analyze sections within the skill content
126
+ */
127
+ function analyzeSections(content) {
128
+ const lines = content.split('\n');
129
+ const sections = [];
130
+ let currentSection = null;
131
+ let examplesStartLine = -1;
132
+ let examplesEndLine = -1;
133
+ for (let i = 0; i < lines.length; i++) {
134
+ const line = lines[i];
135
+ const headerMatch = line.match(/^(#{1,3})\s+(.+)$/);
136
+ if (headerMatch) {
137
+ // Save previous section
138
+ if (currentSection) {
139
+ sections.push({
140
+ name: currentSection.name,
141
+ startLine: currentSection.startLine,
142
+ endLine: i - 1,
143
+ content: currentSection.lines.join('\n'),
144
+ });
145
+ }
146
+ currentSection = {
147
+ name: headerMatch[2].trim(),
148
+ startLine: i,
149
+ lines: [],
150
+ };
151
+ // Track examples section
152
+ const sectionName = headerMatch[2].toLowerCase();
153
+ if (sectionName.includes('example') || sectionName.includes('usage')) {
154
+ examplesStartLine = i;
155
+ }
156
+ }
157
+ if (currentSection) {
158
+ currentSection.lines.push(line);
159
+ }
160
+ }
161
+ // Save last section
162
+ if (currentSection) {
163
+ sections.push({
164
+ name: currentSection.name,
165
+ startLine: currentSection.startLine,
166
+ endLine: lines.length - 1,
167
+ content: currentSection.lines.join('\n'),
168
+ });
169
+ if (examplesStartLine >= 0 && examplesEndLine < 0) {
170
+ examplesEndLine = lines.length - 1;
171
+ }
172
+ }
173
+ // Calculate line counts
174
+ const examplesLines = examplesStartLine >= 0
175
+ ? examplesEndLine - examplesStartLine + 1
176
+ : estimateExamplesLines(content);
177
+ const mainContentLines = lines.length - examplesLines;
178
+ return { mainContentLines, examplesLines, sections };
179
+ }
180
+ /**
181
+ * Estimate examples lines by looking for code blocks
182
+ */
183
+ function estimateExamplesLines(content) {
184
+ const codeBlockMatches = content.match(/```[\s\S]*?```/g) || [];
185
+ let totalLines = 0;
186
+ for (const block of codeBlockMatches) {
187
+ totalLines += block.split('\n').length;
188
+ }
189
+ return totalLines;
190
+ }
191
+ /**
192
+ * Analyze tool usage patterns in the content
193
+ */
194
+ function analyzeToolUsage(content) {
195
+ const lowerContent = content.toLowerCase();
196
+ const detectedTools = [];
197
+ let totalWeight = 0;
198
+ for (const [tool, config] of Object.entries(TOOL_PATTERNS)) {
199
+ for (const pattern of config.patterns) {
200
+ if (lowerContent.includes(pattern.toLowerCase())) {
201
+ if (!detectedTools.includes(tool)) {
202
+ detectedTools.push(tool);
203
+ totalWeight += config.weight;
204
+ }
205
+ break;
206
+ }
207
+ }
208
+ }
209
+ // Count specific tool patterns
210
+ const bashCommandCount = (content.match(/\b(npm|npx|git|docker|yarn|pnpm)\s/gi) || []).length;
211
+ const fileReadCount = (content.match(/\b(read|cat|head|tail|grep|find)\s/gi) || []).length;
212
+ const fileWriteCount = (content.match(/\b(write|edit|modify|create)\s+file/gi) || []).length;
213
+ // Determine if heavy tool usage suggests subagent
214
+ const suggestsSubagent = bashCommandCount >= THRESHOLDS.heavyToolUsageCount ||
215
+ fileReadCount + fileWriteCount >= THRESHOLDS.heavyToolUsageCount ||
216
+ totalWeight >= 10;
217
+ // Calculate confidence
218
+ const matchCount = detectedTools.length;
219
+ const confidence = matchCount >= 4 ? 'high' : matchCount >= 2 ? 'medium' : 'low';
220
+ return {
221
+ detectedTools,
222
+ bashCommandCount,
223
+ fileReadCount,
224
+ fileWriteCount,
225
+ suggestsSubagent,
226
+ confidence,
227
+ };
228
+ }
229
+ /**
230
+ * Analyze Task() call patterns
231
+ */
232
+ function analyzeTaskPatterns(content) {
233
+ // Find Task() calls
234
+ const taskCalls = content.match(/Task\s*\([^)]+\)/g) || [];
235
+ const taskCallCount = taskCalls.length;
236
+ // Detect sequential patterns (Task calls on consecutive lines without batching)
237
+ const lines = content.split('\n');
238
+ let sequentialCalls = 0;
239
+ let consecutiveTaskLines = 0;
240
+ for (const line of lines) {
241
+ if (line.includes('Task(') || line.includes('Task (')) {
242
+ consecutiveTaskLines++;
243
+ }
244
+ else if (consecutiveTaskLines > 0) {
245
+ if (consecutiveTaskLines >= THRESHOLDS.sequentialTaskThreshold) {
246
+ sequentialCalls += consecutiveTaskLines;
247
+ }
248
+ consecutiveTaskLines = 0;
249
+ }
250
+ }
251
+ // Check for final sequence
252
+ if (consecutiveTaskLines >= THRESHOLDS.sequentialTaskThreshold) {
253
+ sequentialCalls += consecutiveTaskLines;
254
+ }
255
+ const canBatch = sequentialCalls >= THRESHOLDS.sequentialTaskThreshold;
256
+ // Estimate savings from batching
257
+ // Batching reduces context overhead by ~30-50%
258
+ const batchSavingsPercent = canBatch ? Math.min(50, sequentialCalls * 10) : 0;
259
+ return {
260
+ taskCallCount,
261
+ sequentialCalls,
262
+ canBatch,
263
+ batchSavingsPercent,
264
+ };
265
+ }
266
+ /**
267
+ * Find sections that could be extracted as sub-skills
268
+ */
269
+ function findExtractableSections(sections, totalLines) {
270
+ const extractable = [];
271
+ for (const section of sections) {
272
+ const lineCount = section.endLine - section.startLine + 1;
273
+ // Skip small sections
274
+ if (lineCount < THRESHOLDS.minSectionLines) {
275
+ continue;
276
+ }
277
+ // Calculate priority based on size relative to total
278
+ const sizeRatio = lineCount / totalLines;
279
+ let priority = 3;
280
+ if (sizeRatio > 0.3) {
281
+ priority = 1;
282
+ }
283
+ else if (sizeRatio > 0.15) {
284
+ priority = 2;
285
+ }
286
+ // Determine reason for extraction
287
+ let reason = '';
288
+ const lowerName = section.name.toLowerCase();
289
+ if (lowerName.includes('api') || lowerName.includes('reference')) {
290
+ reason = 'API reference sections can be loaded on-demand';
291
+ }
292
+ else if (lowerName.includes('example') || lowerName.includes('usage')) {
293
+ reason = 'Examples can be progressively disclosed';
294
+ }
295
+ else if (lowerName.includes('advanced') || lowerName.includes('configuration')) {
296
+ reason = 'Advanced topics are rarely needed in initial context';
297
+ }
298
+ else if (lineCount > 100) {
299
+ reason = 'Large section suitable for sub-skill extraction';
300
+ }
301
+ else {
302
+ reason = 'Section size suggests separate loading benefit';
303
+ }
304
+ extractable.push({
305
+ name: section.name,
306
+ startLine: section.startLine,
307
+ endLine: section.endLine,
308
+ lineCount,
309
+ priority,
310
+ reason,
311
+ });
312
+ }
313
+ // Sort by priority
314
+ return extractable.sort((a, b) => a.priority - b.priority);
315
+ }
316
+ /**
317
+ * Generate optimization recommendations
318
+ */
319
+ function generateRecommendations(lineCount, mainContentLines, examplesLines, toolUsage, taskPatterns, extractableSections) {
320
+ const recommendations = [];
321
+ // Recommend decomposition for large skills
322
+ if (lineCount > THRESHOLDS.maxLinesBeforeDecompose) {
323
+ const sectionNames = extractableSections.slice(0, 3).map((s) => s.name);
324
+ recommendations.push({
325
+ type: 'decompose',
326
+ description: `Skill has ${lineCount} lines (threshold: ${THRESHOLDS.maxLinesBeforeDecompose}). Decompose into main SKILL.md + sub-skills.`,
327
+ estimatedSavings: Math.min(70, Math.floor((lineCount - 400) / 10)),
328
+ priority: 1,
329
+ affectedAreas: sectionNames.length > 0 ? sectionNames : ['full-content'],
330
+ });
331
+ }
332
+ // Recommend subagent for heavy tool usage
333
+ if (toolUsage.suggestsSubagent) {
334
+ recommendations.push({
335
+ type: 'subagent',
336
+ description: `Heavy tool usage detected (${toolUsage.bashCommandCount} bash, ${toolUsage.fileReadCount} reads). Generate companion subagent for context isolation.`,
337
+ estimatedSavings: 40,
338
+ priority: 2,
339
+ affectedAreas: toolUsage.detectedTools,
340
+ });
341
+ }
342
+ // Recommend parallelization for sequential Task() calls
343
+ if (taskPatterns.canBatch) {
344
+ recommendations.push({
345
+ type: 'parallelize',
346
+ description: `${taskPatterns.sequentialCalls} sequential Task() calls detected. Batch into single message for parallel execution.`,
347
+ estimatedSavings: taskPatterns.batchSavingsPercent,
348
+ priority: 2,
349
+ affectedAreas: ['Task-calls'],
350
+ });
351
+ }
352
+ // Recommend progressive disclosure for large examples
353
+ if (examplesLines > THRESHOLDS.largeExamplesThreshold) {
354
+ recommendations.push({
355
+ type: 'progressive-disclosure',
356
+ description: `Large examples section (${examplesLines} lines). Move to sub-skill for on-demand loading.`,
357
+ estimatedSavings: Math.min(60, Math.floor(examplesLines / 5)),
358
+ priority: 3,
359
+ affectedAreas: ['examples'],
360
+ });
361
+ }
362
+ // Sort by priority
363
+ return recommendations.sort((a, b) => a.priority - b.priority);
364
+ }
365
+ /**
366
+ * Calculate overall optimization score
367
+ */
368
+ function calculateOptimizationScore(lineCount, toolUsage, taskPatterns, recommendations) {
369
+ let score = 0;
370
+ // Line count factor (0-40 points)
371
+ if (lineCount > THRESHOLDS.maxLinesBeforeDecompose) {
372
+ score += Math.min(40, Math.floor((lineCount - 400) / 10));
373
+ }
374
+ else if (lineCount > 300) {
375
+ score += Math.floor((lineCount - 300) / 20);
376
+ }
377
+ // Tool usage factor (0-30 points)
378
+ if (toolUsage.suggestsSubagent) {
379
+ score += 20;
380
+ }
381
+ score += Math.min(10, toolUsage.detectedTools.length * 2);
382
+ // Task pattern factor (0-20 points)
383
+ if (taskPatterns.canBatch) {
384
+ score += Math.min(20, taskPatterns.sequentialCalls * 5);
385
+ }
386
+ // Recommendation impact (0-10 points)
387
+ score += Math.min(10, recommendations.length * 3);
388
+ return Math.min(100, score);
389
+ }
390
+ /**
391
+ * Quick check if a skill needs transformation without full analysis
392
+ *
393
+ * @param content - The full SKILL.md content
394
+ * @returns Whether quick transformation check passed
395
+ */
396
+ export function quickTransformCheck(content) {
397
+ const lineCount = content.split('\n').length;
398
+ // Quick checks that indicate transformation needed
399
+ if (lineCount > THRESHOLDS.maxLinesBeforeDecompose) {
400
+ return true;
401
+ }
402
+ // Check for heavy tool usage patterns
403
+ const heavyToolPatterns = ['npm ', 'npx ', 'git ', 'docker', 'Bash('];
404
+ let heavyToolCount = 0;
405
+ for (const pattern of heavyToolPatterns) {
406
+ if (content.includes(pattern)) {
407
+ heavyToolCount++;
408
+ }
409
+ }
410
+ if (heavyToolCount >= 3) {
411
+ return true;
412
+ }
413
+ // Check for sequential Task() calls
414
+ const taskMatches = content.match(/Task\s*\(/g) || [];
415
+ if (taskMatches.length >= THRESHOLDS.sequentialTaskThreshold) {
416
+ return true;
417
+ }
418
+ return false;
419
+ }
420
+ export default { analyzeSkill, quickTransformCheck };
421
+ //# sourceMappingURL=SkillAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillAnalyzer.js","sourceRoot":"","sources":["../../../src/services/SkillAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * SMI-XXX: SkillDecomposer - Decompose large skills into sub-skills
3
+ *
4
+ * Transforms skills >500 lines into a main SKILL.md + sub-skills structure
5
+ * following the Skillsmith optimization standard:
6
+ * - Main SKILL.md: <500 lines, contains header + navigation + core content
7
+ * - Sub-skills: Extracted sections loaded on-demand
8
+ *
9
+ * Part of the Skillsmith Optimization Layer for transforming
10
+ * community skills into more performant versions.
11
+ */
12
+ import type { SkillAnalysis } from './SkillAnalyzer.js';
13
+ /**
14
+ * Result of skill decomposition
15
+ */
16
+ export interface DecompositionResult {
17
+ /** The optimized main SKILL.md content */
18
+ mainSkill: DecomposedSkill;
19
+ /** Extracted sub-skills */
20
+ subSkills: SubSkill[];
21
+ /** Whether decomposition was applied */
22
+ wasDecomposed: boolean;
23
+ /** Statistics about the decomposition */
24
+ stats: DecompositionStats;
25
+ }
26
+ /**
27
+ * The main skill after decomposition
28
+ */
29
+ export interface DecomposedSkill {
30
+ /** Filename (always SKILL.md) */
31
+ filename: string;
32
+ /** The optimized content */
33
+ content: string;
34
+ /** Line count after optimization */
35
+ lineCount: number;
36
+ /** References to sub-skills */
37
+ subSkillRefs: string[];
38
+ }
39
+ /**
40
+ * An extracted sub-skill
41
+ */
42
+ export interface SubSkill {
43
+ /** Filename (e.g., api.md, examples.md) */
44
+ filename: string;
45
+ /** Original section name */
46
+ sectionName: string;
47
+ /** The extracted content */
48
+ content: string;
49
+ /** Line count */
50
+ lineCount: number;
51
+ /** Why this section was extracted */
52
+ extractionReason: string;
53
+ }
54
+ /**
55
+ * Statistics about the decomposition
56
+ */
57
+ export interface DecompositionStats {
58
+ /** Original line count */
59
+ originalLines: number;
60
+ /** Main skill line count after decomposition */
61
+ mainSkillLines: number;
62
+ /** Total lines in sub-skills */
63
+ subSkillLines: number;
64
+ /** Number of sub-skills created */
65
+ subSkillCount: number;
66
+ /** Estimated token reduction percentage */
67
+ tokenReductionPercent: number;
68
+ }
69
+ /**
70
+ * Configuration for decomposition behavior
71
+ */
72
+ export interface DecomposerOptions {
73
+ /** Maximum lines for main skill (default: 400) */
74
+ maxMainSkillLines?: number;
75
+ /** Minimum lines for a section to be extracted (default: 50) */
76
+ minExtractableLines?: number;
77
+ /** Whether to add navigation links to main skill (default: true) */
78
+ addNavigation?: boolean;
79
+ /** Whether to add "Optimized by Skillsmith" attribution (default: true) */
80
+ addAttribution?: boolean;
81
+ }
82
+ /**
83
+ * Decompose a skill into main + sub-skills based on analysis
84
+ *
85
+ * @param content - The original SKILL.md content
86
+ * @param analysis - Analysis from SkillAnalyzer
87
+ * @param options - Decomposition options
88
+ * @returns Decomposition result with main skill and sub-skills
89
+ */
90
+ export declare function decomposeSkill(content: string, analysis: SkillAnalysis, options?: DecomposerOptions): DecompositionResult;
91
+ /**
92
+ * Parallelize sequential Task() calls in skill content
93
+ *
94
+ * @param content - The skill content
95
+ * @returns Content with Task() calls batched for parallel execution
96
+ */
97
+ export declare function parallelizeTaskCalls(content: string): string;
98
+ declare const _default: {
99
+ decomposeSkill: typeof decomposeSkill;
100
+ parallelizeTaskCalls: typeof parallelizeTaskCalls;
101
+ };
102
+ export default _default;
103
+ //# sourceMappingURL=SkillDecomposer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SkillDecomposer.d.ts","sourceRoot":"","sources":["../../../src/services/SkillDecomposer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAsB,MAAM,oBAAoB,CAAA;AAE3E;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,SAAS,EAAE,eAAe,CAAA;IAE1B,2BAA2B;IAC3B,SAAS,EAAE,QAAQ,EAAE,CAAA;IAErB,wCAAwC;IACxC,aAAa,EAAE,OAAO,CAAA;IAEtB,yCAAyC;IACzC,KAAK,EAAE,kBAAkB,CAAA;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAA;IAEhB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAA;IAEf,oCAAoC;IACpC,SAAS,EAAE,MAAM,CAAA;IAEjB,+BAA+B;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,QAAQ;IACvB,2CAA2C;IAC3C,QAAQ,EAAE,MAAM,CAAA;IAEhB,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAA;IAEnB,4BAA4B;IAC5B,OAAO,EAAE,MAAM,CAAA;IAEf,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAA;IAEjB,qCAAqC;IACrC,gBAAgB,EAAE,MAAM,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,0BAA0B;IAC1B,aAAa,EAAE,MAAM,CAAA;IAErB,gDAAgD;IAChD,cAAc,EAAE,MAAM,CAAA;IAEtB,gCAAgC;IAChC,aAAa,EAAE,MAAM,CAAA;IAErB,mCAAmC;IACnC,aAAa,EAAE,MAAM,CAAA;IAErB,2CAA2C;IAC3C,qBAAqB,EAAE,MAAM,CAAA;CAC9B;AAWD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,MAAM,CAAA;IAE1B,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,MAAM,CAAA;IAE5B,oEAAoE;IACpE,aAAa,CAAC,EAAE,OAAO,CAAA;IAEvB,2EAA2E;IAC3E,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AASD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,aAAa,EACvB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,mBAAmB,CAoCrB;AAuUD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA2C5D;;;;;AAcD,wBAAuD"}