@skillsmith/core 0.5.3 → 0.5.5

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 (276) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/src/activation/ActivationManager.d.ts +7 -0
  4. package/dist/src/activation/ActivationManager.d.ts.map +1 -1
  5. package/dist/src/activation/ActivationManager.js +13 -4
  6. package/dist/src/activation/ActivationManager.js.map +1 -1
  7. package/dist/src/analysis/adapters/python.d.ts +16 -11
  8. package/dist/src/analysis/adapters/python.d.ts.map +1 -1
  9. package/dist/src/analysis/adapters/python.js +46 -61
  10. package/dist/src/analysis/adapters/python.js.map +1 -1
  11. package/dist/src/analysis/router.test.d.ts +2 -0
  12. package/dist/src/analysis/router.test.d.ts.map +1 -0
  13. package/dist/src/analysis/router.test.js +411 -0
  14. package/dist/src/analysis/router.test.js.map +1 -0
  15. package/dist/src/analysis/tree-sitter/manager.d.ts.map +1 -1
  16. package/dist/src/analysis/tree-sitter/manager.js +12 -5
  17. package/dist/src/analysis/tree-sitter/manager.js.map +1 -1
  18. package/dist/src/analysis/tree-sitter/pythonExtractor.d.ts +45 -0
  19. package/dist/src/analysis/tree-sitter/pythonExtractor.d.ts.map +1 -0
  20. package/dist/src/analysis/tree-sitter/pythonExtractor.js +264 -0
  21. package/dist/src/analysis/tree-sitter/pythonExtractor.js.map +1 -0
  22. package/dist/src/analysis/tree-sitter/pythonExtractor.test.d.ts +12 -0
  23. package/dist/src/analysis/tree-sitter/pythonExtractor.test.d.ts.map +1 -0
  24. package/dist/src/analysis/tree-sitter/pythonExtractor.test.js +74 -0
  25. package/dist/src/analysis/tree-sitter/pythonExtractor.test.js.map +1 -0
  26. package/dist/src/analysis/tree-sitter/pythonIncremental.d.ts +93 -0
  27. package/dist/src/analysis/tree-sitter/pythonIncremental.d.ts.map +1 -0
  28. package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.d.ts +22 -0
  29. package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.d.ts.map +1 -0
  30. package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.js +229 -0
  31. package/dist/src/analysis/tree-sitter/pythonIncremental.hardening.test.js.map +1 -0
  32. package/dist/src/analysis/tree-sitter/pythonIncremental.js +287 -0
  33. package/dist/src/analysis/tree-sitter/pythonIncremental.js.map +1 -0
  34. package/dist/src/analysis/tree-sitter/pythonIncremental.test.d.ts +17 -0
  35. package/dist/src/analysis/tree-sitter/pythonIncremental.test.d.ts.map +1 -0
  36. package/dist/src/analysis/tree-sitter/pythonIncremental.test.js +142 -0
  37. package/dist/src/analysis/tree-sitter/pythonIncremental.test.js.map +1 -0
  38. package/dist/src/analysis/tree-sitter/queries/python.d.ts +43 -0
  39. package/dist/src/analysis/tree-sitter/queries/python.d.ts.map +1 -0
  40. package/dist/src/analysis/tree-sitter/queries/python.js +88 -0
  41. package/dist/src/analysis/tree-sitter/queries/python.js.map +1 -0
  42. package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.d.ts +13 -0
  43. package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.d.ts.map +1 -0
  44. package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.js +174 -0
  45. package/dist/src/analysis/tree-sitter/queryExtractionMatchesOrExceedsRegex.test.js.map +1 -0
  46. package/dist/src/analytics/ROIDashboardService.csv.d.ts +11 -0
  47. package/dist/src/analytics/ROIDashboardService.csv.d.ts.map +1 -0
  48. package/dist/src/analytics/ROIDashboardService.csv.js +43 -0
  49. package/dist/src/analytics/ROIDashboardService.csv.js.map +1 -0
  50. package/dist/src/analytics/ROIDashboardService.d.ts +64 -3
  51. package/dist/src/analytics/ROIDashboardService.d.ts.map +1 -1
  52. package/dist/src/analytics/ROIDashboardService.js +116 -45
  53. package/dist/src/analytics/ROIDashboardService.js.map +1 -1
  54. package/dist/src/api/client.d.ts +4 -66
  55. package/dist/src/api/client.d.ts.map +1 -1
  56. package/dist/src/api/client.events.d.ts.map +1 -1
  57. package/dist/src/api/client.events.js +10 -1
  58. package/dist/src/api/client.events.js.map +1 -1
  59. package/dist/src/api/client.js +40 -66
  60. package/dist/src/api/client.js.map +1 -1
  61. package/dist/src/api/client.token-refresh.d.ts +3 -0
  62. package/dist/src/api/client.token-refresh.d.ts.map +1 -0
  63. package/dist/src/api/client.token-refresh.js +19 -0
  64. package/dist/src/api/client.token-refresh.js.map +1 -0
  65. package/dist/src/api/client.token-refresh.test.d.ts +2 -0
  66. package/dist/src/api/client.token-refresh.test.d.ts.map +1 -0
  67. package/dist/src/api/client.token-refresh.test.js +73 -0
  68. package/dist/src/api/client.token-refresh.test.js.map +1 -0
  69. package/dist/src/api/client.types.d.ts +2 -0
  70. package/dist/src/api/client.types.d.ts.map +1 -1
  71. package/dist/src/api/index.d.ts +1 -1
  72. package/dist/src/api/index.d.ts.map +1 -1
  73. package/dist/src/api/index.js +1 -1
  74. package/dist/src/api/index.js.map +1 -1
  75. package/dist/src/api/schemas.d.ts +60 -60
  76. package/dist/src/api/schemas.d.ts.map +1 -1
  77. package/dist/src/benchmarks/incrementalParseBenchmark.d.ts +18 -0
  78. package/dist/src/benchmarks/incrementalParseBenchmark.d.ts.map +1 -0
  79. package/dist/src/benchmarks/incrementalParseBenchmark.js +121 -0
  80. package/dist/src/benchmarks/incrementalParseBenchmark.js.map +1 -0
  81. package/dist/src/billing/GDPRComplianceService.test.d.ts +2 -0
  82. package/dist/src/billing/GDPRComplianceService.test.d.ts.map +1 -0
  83. package/dist/src/billing/GDPRComplianceService.test.js +405 -0
  84. package/dist/src/billing/GDPRComplianceService.test.js.map +1 -0
  85. package/dist/src/config/index.d.ts +4 -0
  86. package/dist/src/config/index.d.ts.map +1 -1
  87. package/dist/src/config/index.js +6 -0
  88. package/dist/src/config/index.js.map +1 -1
  89. package/dist/src/config/token-credentials.d.ts +13 -0
  90. package/dist/src/config/token-credentials.d.ts.map +1 -0
  91. package/dist/src/config/token-credentials.js +126 -0
  92. package/dist/src/config/token-credentials.js.map +1 -0
  93. package/dist/src/config/token-credentials.test.d.ts +10 -0
  94. package/dist/src/config/token-credentials.test.d.ts.map +1 -0
  95. package/dist/src/config/token-credentials.test.js +91 -0
  96. package/dist/src/config/token-credentials.test.js.map +1 -0
  97. package/dist/src/index.d.ts +7 -4
  98. package/dist/src/index.d.ts.map +1 -1
  99. package/dist/src/index.js +6 -3
  100. package/dist/src/index.js.map +1 -1
  101. package/dist/src/indexer/SkillParser.coverage.test.d.ts +10 -0
  102. package/dist/src/indexer/SkillParser.coverage.test.d.ts.map +1 -0
  103. package/dist/src/indexer/SkillParser.coverage.test.js +76 -0
  104. package/dist/src/indexer/SkillParser.coverage.test.js.map +1 -0
  105. package/dist/src/indexer/SkillParser.test.d.ts +2 -0
  106. package/dist/src/indexer/SkillParser.test.d.ts.map +1 -0
  107. package/dist/src/indexer/SkillParser.test.js +375 -0
  108. package/dist/src/indexer/SkillParser.test.js.map +1 -0
  109. package/dist/src/scripts/__tests__/scan-imported-skills.test.js +34 -5
  110. package/dist/src/scripts/__tests__/scan-imported-skills.test.js.map +1 -1
  111. package/dist/src/scripts/github-import/blocklist.d.ts +65 -0
  112. package/dist/src/scripts/github-import/blocklist.d.ts.map +1 -0
  113. package/dist/src/scripts/github-import/blocklist.js +124 -0
  114. package/dist/src/scripts/github-import/blocklist.js.map +1 -0
  115. package/dist/src/scripts/github-import/index.d.ts +1 -0
  116. package/dist/src/scripts/github-import/index.d.ts.map +1 -1
  117. package/dist/src/scripts/github-import/index.js +3 -0
  118. package/dist/src/scripts/github-import/index.js.map +1 -1
  119. package/dist/src/scripts/github-import/signal-of-intent.d.ts +87 -0
  120. package/dist/src/scripts/github-import/signal-of-intent.d.ts.map +1 -0
  121. package/dist/src/scripts/github-import/signal-of-intent.js +213 -0
  122. package/dist/src/scripts/github-import/signal-of-intent.js.map +1 -0
  123. package/dist/src/scripts/github-import/types.d.ts +22 -0
  124. package/dist/src/scripts/github-import/types.d.ts.map +1 -1
  125. package/dist/src/scripts/github-import/types.js.map +1 -1
  126. package/dist/src/scripts/import-github-skills.js +73 -3
  127. package/dist/src/scripts/import-github-skills.js.map +1 -1
  128. package/dist/src/scripts/skill-scanner/allowlist.d.ts +38 -0
  129. package/dist/src/scripts/skill-scanner/allowlist.d.ts.map +1 -0
  130. package/dist/src/scripts/skill-scanner/allowlist.js +178 -0
  131. package/dist/src/scripts/skill-scanner/allowlist.js.map +1 -0
  132. package/dist/src/scripts/skill-scanner/scanner.d.ts +10 -2
  133. package/dist/src/scripts/skill-scanner/scanner.d.ts.map +1 -1
  134. package/dist/src/scripts/skill-scanner/scanner.js +15 -3
  135. package/dist/src/scripts/skill-scanner/scanner.js.map +1 -1
  136. package/dist/src/scripts/skill-scanner/trust-scorer.d.ts +20 -6
  137. package/dist/src/scripts/skill-scanner/trust-scorer.d.ts.map +1 -1
  138. package/dist/src/scripts/skill-scanner/trust-scorer.js +28 -9
  139. package/dist/src/scripts/skill-scanner/trust-scorer.js.map +1 -1
  140. package/dist/src/scripts/skill-scanner/types.d.ts +50 -0
  141. package/dist/src/scripts/skill-scanner/types.d.ts.map +1 -1
  142. package/dist/src/scripts/validation/types.d.ts +14 -24
  143. package/dist/src/scripts/validation/types.d.ts.map +1 -1
  144. package/dist/src/security/scanner/SecurityScanner.helpers.d.ts +18 -0
  145. package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -1
  146. package/dist/src/security/scanner/SecurityScanner.helpers.js +54 -6
  147. package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -1
  148. package/dist/src/security/scanner/patterns.d.ts.map +1 -1
  149. package/dist/src/security/scanner/patterns.js +45 -5
  150. package/dist/src/security/scanner/patterns.js.map +1 -1
  151. package/dist/src/services/skill-config-schema.d.ts +4 -36
  152. package/dist/src/services/skill-config-schema.d.ts.map +1 -1
  153. package/dist/src/sources/LocalFilesystemAdapter.d.ts +104 -10
  154. package/dist/src/sources/LocalFilesystemAdapter.d.ts.map +1 -1
  155. package/dist/src/sources/LocalFilesystemAdapter.helpers.d.ts +92 -0
  156. package/dist/src/sources/LocalFilesystemAdapter.helpers.d.ts.map +1 -0
  157. package/dist/src/sources/LocalFilesystemAdapter.helpers.js +157 -0
  158. package/dist/src/sources/LocalFilesystemAdapter.helpers.js.map +1 -0
  159. package/dist/src/sources/LocalFilesystemAdapter.js +218 -159
  160. package/dist/src/sources/LocalFilesystemAdapter.js.map +1 -1
  161. package/dist/src/sources/LocalFilesystemAdapter.scan.d.ts +78 -0
  162. package/dist/src/sources/LocalFilesystemAdapter.scan.d.ts.map +1 -0
  163. package/dist/src/sources/LocalFilesystemAdapter.scan.js +118 -0
  164. package/dist/src/sources/LocalFilesystemAdapter.scan.js.map +1 -0
  165. package/dist/src/sources/index.d.ts +1 -1
  166. package/dist/src/sources/index.d.ts.map +1 -1
  167. package/dist/src/sources/index.js.map +1 -1
  168. package/dist/src/sources/types.d.ts +28 -0
  169. package/dist/src/sources/types.d.ts.map +1 -1
  170. package/dist/src/telemetry/tracer-imports.d.ts +13 -0
  171. package/dist/src/telemetry/tracer-imports.d.ts.map +1 -0
  172. package/dist/src/telemetry/tracer-imports.js +26 -0
  173. package/dist/src/telemetry/tracer-imports.js.map +1 -0
  174. package/dist/src/telemetry/tracer.d.ts.map +1 -1
  175. package/dist/src/telemetry/tracer.js +18 -21
  176. package/dist/src/telemetry/tracer.js.map +1 -1
  177. package/dist/src/utils/rate-limit.d.ts +39 -0
  178. package/dist/src/utils/rate-limit.d.ts.map +1 -0
  179. package/dist/src/utils/rate-limit.js +48 -0
  180. package/dist/src/utils/rate-limit.js.map +1 -0
  181. package/dist/src/utils/rate-limit.test.d.ts +11 -0
  182. package/dist/src/utils/rate-limit.test.d.ts.map +1 -0
  183. package/dist/src/utils/rate-limit.test.js +86 -0
  184. package/dist/src/utils/rate-limit.test.js.map +1 -0
  185. package/dist/src/webhooks/WebhookDeadLetterRepository.d.ts +178 -0
  186. package/dist/src/webhooks/WebhookDeadLetterRepository.d.ts.map +1 -0
  187. package/dist/src/webhooks/WebhookDeadLetterRepository.js +196 -0
  188. package/dist/src/webhooks/WebhookDeadLetterRepository.js.map +1 -0
  189. package/dist/src/webhooks/WebhookQueue.d.ts +1 -0
  190. package/dist/src/webhooks/WebhookQueue.d.ts.map +1 -1
  191. package/dist/src/webhooks/WebhookQueue.js +19 -0
  192. package/dist/src/webhooks/WebhookQueue.js.map +1 -1
  193. package/dist/src/webhooks/WebhookQueue.types.d.ts +11 -0
  194. package/dist/src/webhooks/WebhookQueue.types.d.ts.map +1 -1
  195. package/dist/src/webhooks/index.d.ts +1 -0
  196. package/dist/src/webhooks/index.d.ts.map +1 -1
  197. package/dist/src/webhooks/index.js +2 -0
  198. package/dist/src/webhooks/index.js.map +1 -1
  199. package/dist/src/webhooks/webhook-schemas.d.ts +117 -1212
  200. package/dist/src/webhooks/webhook-schemas.d.ts.map +1 -1
  201. package/dist/tests/ActivationManager.test.d.ts +13 -0
  202. package/dist/tests/ActivationManager.test.d.ts.map +1 -0
  203. package/dist/tests/ActivationManager.test.js +218 -0
  204. package/dist/tests/ActivationManager.test.js.map +1 -0
  205. package/dist/tests/LocalFilesystemAdapter.coverage.test.d.ts +13 -0
  206. package/dist/tests/LocalFilesystemAdapter.coverage.test.d.ts.map +1 -0
  207. package/dist/tests/LocalFilesystemAdapter.coverage.test.js +314 -0
  208. package/dist/tests/LocalFilesystemAdapter.coverage.test.js.map +1 -0
  209. package/dist/tests/LocalFilesystemAdapter.security.test.d.ts +18 -0
  210. package/dist/tests/LocalFilesystemAdapter.security.test.d.ts.map +1 -0
  211. package/dist/tests/LocalFilesystemAdapter.security.test.js +344 -0
  212. package/dist/tests/LocalFilesystemAdapter.security.test.js.map +1 -0
  213. package/dist/tests/LocalFilesystemAdapter.test.d.ts +12 -0
  214. package/dist/tests/LocalFilesystemAdapter.test.d.ts.map +1 -0
  215. package/dist/tests/LocalFilesystemAdapter.test.js +301 -0
  216. package/dist/tests/LocalFilesystemAdapter.test.js.map +1 -0
  217. package/dist/tests/ROIDashboardService.coverage.test.d.ts +9 -0
  218. package/dist/tests/ROIDashboardService.coverage.test.d.ts.map +1 -0
  219. package/dist/tests/ROIDashboardService.coverage.test.js +118 -0
  220. package/dist/tests/ROIDashboardService.coverage.test.js.map +1 -0
  221. package/dist/tests/ROIDashboardService.test.js +87 -0
  222. package/dist/tests/ROIDashboardService.test.js.map +1 -1
  223. package/dist/tests/ScraperAdapters.gitlab-coverage.test.d.ts +14 -0
  224. package/dist/tests/ScraperAdapters.gitlab-coverage.test.d.ts.map +1 -0
  225. package/dist/tests/ScraperAdapters.gitlab-coverage.test.js +169 -0
  226. package/dist/tests/ScraperAdapters.gitlab-coverage.test.js.map +1 -0
  227. package/dist/tests/ScraperAdapters.test.d.ts +5 -1
  228. package/dist/tests/ScraperAdapters.test.d.ts.map +1 -1
  229. package/dist/tests/ScraperAdapters.test.js +6 -336
  230. package/dist/tests/ScraperAdapters.test.js.map +1 -1
  231. package/dist/tests/WebhookDeadLetterRepository.test.d.ts +2 -0
  232. package/dist/tests/WebhookDeadLetterRepository.test.d.ts.map +1 -0
  233. package/dist/tests/WebhookDeadLetterRepository.test.js +333 -0
  234. package/dist/tests/WebhookDeadLetterRepository.test.js.map +1 -0
  235. package/dist/tests/WebhookHandler.test.js +93 -1
  236. package/dist/tests/WebhookHandler.test.js.map +1 -1
  237. package/dist/tests/WebhookQueue.coverage.test.d.ts +19 -0
  238. package/dist/tests/WebhookQueue.coverage.test.d.ts.map +1 -0
  239. package/dist/tests/WebhookQueue.coverage.test.js +190 -0
  240. package/dist/tests/WebhookQueue.coverage.test.js.map +1 -0
  241. package/dist/tests/api/client.events.test.d.ts +10 -0
  242. package/dist/tests/api/client.events.test.d.ts.map +1 -0
  243. package/dist/tests/api/client.events.test.js +85 -0
  244. package/dist/tests/api/client.events.test.js.map +1 -0
  245. package/dist/tests/billing/GDPRCompliance.test.d.ts +2 -2
  246. package/dist/tests/billing/GDPRCompliance.test.js +221 -36
  247. package/dist/tests/billing/GDPRCompliance.test.js.map +1 -1
  248. package/dist/tests/github-import/blocklist.test.d.ts +15 -0
  249. package/dist/tests/github-import/blocklist.test.d.ts.map +1 -0
  250. package/dist/tests/github-import/blocklist.test.js +182 -0
  251. package/dist/tests/github-import/blocklist.test.js.map +1 -0
  252. package/dist/tests/github-import/signal-of-intent.test.d.ts +15 -0
  253. package/dist/tests/github-import/signal-of-intent.test.d.ts.map +1 -0
  254. package/dist/tests/github-import/signal-of-intent.test.js +171 -0
  255. package/dist/tests/github-import/signal-of-intent.test.js.map +1 -0
  256. package/dist/tests/security/scanner-regression-guard.test.d.ts +12 -0
  257. package/dist/tests/security/scanner-regression-guard.test.d.ts.map +1 -1
  258. package/dist/tests/security/scanner-regression-guard.test.js +15 -3
  259. package/dist/tests/security/scanner-regression-guard.test.js.map +1 -1
  260. package/dist/tests/security/scanner-wave2-fixtures.test.d.ts +12 -0
  261. package/dist/tests/security/scanner-wave2-fixtures.test.d.ts.map +1 -0
  262. package/dist/tests/security/scanner-wave2-fixtures.test.js +173 -0
  263. package/dist/tests/security/scanner-wave2-fixtures.test.js.map +1 -0
  264. package/dist/tests/security.test.js +1 -0
  265. package/dist/tests/security.test.js.map +1 -1
  266. package/dist/tests/skill-scanner/allowlist.test.d.ts +16 -0
  267. package/dist/tests/skill-scanner/allowlist.test.d.ts.map +1 -0
  268. package/dist/tests/skill-scanner/allowlist.test.js +332 -0
  269. package/dist/tests/skill-scanner/allowlist.test.js.map +1 -0
  270. package/dist/tests/telemetry.test.js +126 -0
  271. package/dist/tests/telemetry.test.js.map +1 -1
  272. package/dist/tests/webhooks/WebhookDeadLetterRepository.test.d.ts +10 -0
  273. package/dist/tests/webhooks/WebhookDeadLetterRepository.test.d.ts.map +1 -0
  274. package/dist/tests/webhooks/WebhookDeadLetterRepository.test.js +109 -0
  275. package/dist/tests/webhooks/WebhookDeadLetterRepository.test.js.map +1 -0
  276. package/package.json +8 -3
@@ -1,53 +1,80 @@
1
1
  /**
2
2
  * SMI-1068: GDPR Compliance Tests
3
- *
4
- * Tests for GDPR data export and deletion functionality.
3
+ * SMI-4286: Absorbed unique assertions from the deleted mock-chain duplicate
4
+ * (src/billing/GDPRComplianceService.test.ts) into this integration suite.
5
5
  */
6
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
6
+ import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest';
7
7
  import { createDatabaseSync } from '../../src/db/createDatabase.js';
8
8
  import { GDPRComplianceService } from '../../src/billing/GDPRComplianceService.js';
9
9
  import { initializeAnalyticsSchema } from '../../src/analytics/schema.js';
10
10
  import { randomUUID } from 'crypto';
11
+ /**
12
+ * Build a minimal Stripe client double exposing `getStripeInstance().customers.del()`.
13
+ * Pass a custom `deletesFn` (e.g. `vi.fn().mockRejectedValue(...)`) to exercise
14
+ * Stripe error paths. The default resolves successfully.
15
+ */
16
+ function makeMockStripe(deletesFn = vi.fn().mockResolvedValue({})) {
17
+ return {
18
+ getStripeInstance: vi.fn().mockReturnValue({
19
+ customers: { del: deletesFn },
20
+ }),
21
+ };
22
+ }
11
23
  describe('GDPRComplianceService', () => {
12
24
  let db;
13
25
  let gdprService;
14
26
  beforeEach(() => {
15
- // Create in-memory database
16
27
  db = createDatabaseSync(':memory:');
17
28
  initializeAnalyticsSchema(db);
18
29
  gdprService = new GDPRComplianceService({ db });
30
+ // Suppress expected logger.error output during DB-throw / Stripe-error tests.
31
+ // Do NOT spy on createLogger()'s return — the service holds its own module-level
32
+ // instance. Spy on console.error (the logger's ultimate sink) instead.
33
+ vi.spyOn(console, 'error').mockImplementation(() => { });
19
34
  });
20
35
  afterEach(() => {
36
+ vi.restoreAllMocks();
21
37
  db.close();
22
38
  });
23
- // Helper to create test data
24
- function createTestCustomer(customerId) {
25
- const subscriptionId = randomUUID();
39
+ function insertSubscription(customerId, opts = {}) {
40
+ const subId = opts.subscriptionId ?? randomUUID();
26
41
  const now = new Date().toISOString();
27
- // Create subscription
28
- db.prepare(`INSERT INTO user_subscriptions (
42
+ const seat = opts.seatCount === undefined ? 5 : opts.seatCount;
43
+ const stmt = db.prepare(`INSERT INTO user_subscriptions (
29
44
  id, customer_id, email, stripe_customer_id, stripe_subscription_id,
30
45
  stripe_price_id, tier, status, seat_count,
31
46
  current_period_start, current_period_end, created_at, updated_at
32
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(subscriptionId, customerId, 'test@example.com', `cus_${customerId}`, `sub_${customerId}`, 'price_test', 'team', 'active', 5, now, now, now, now);
33
- // Create invoice
34
- db.prepare(`INSERT INTO invoices (
47
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
48
+ const args = [
49
+ subId, customerId, 'test@example.com', `cus_${customerId}`, `sub_${customerId}`,
50
+ 'price_test', opts.tier ?? 'team', 'active', seat, now, now, now, now,
51
+ ]; // prettier-ignore
52
+ stmt.run(...args);
53
+ return subId;
54
+ }
55
+ function createTestCustomer(customerId) {
56
+ const subId = insertSubscription(customerId);
57
+ const now = new Date().toISOString();
58
+ const invStmt = db.prepare(`INSERT INTO invoices (
35
59
  id, customer_id, stripe_invoice_id, subscription_id,
36
60
  amount_cents, currency, status, invoice_number, created_at
37
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(randomUUID(), customerId, `in_${customerId}`, subscriptionId, 2500, 'usd', 'paid', 'INV-001', now);
38
- // Create license key with unique hash per customer
61
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`);
62
+ const invArgs = [randomUUID(), customerId, `in_${customerId}`, subId, 2500, 'usd', 'paid', 'INV-001', now]; // prettier-ignore
63
+ invStmt.run(...invArgs);
39
64
  const licenseKeyId = randomUUID();
40
- db.prepare(`INSERT INTO license_keys (
65
+ const keyStmt = db.prepare(`INSERT INTO license_keys (
41
66
  id, subscription_id, organization_id, key_jwt, key_hash,
42
67
  key_expiry, is_active, generated_at
43
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(licenseKeyId, subscriptionId, customerId, `test.jwt.token.${customerId}`, `hash_${customerId}_${licenseKeyId}`, // Unique hash per customer
44
- now, 1, now);
45
- // Create webhook event
46
- db.prepare(`INSERT INTO stripe_webhook_events (
68
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`);
69
+ const keyArgs = [licenseKeyId, subId, customerId, `test.jwt.token.${customerId}`, `hash_${customerId}_${licenseKeyId}`, now, 1, now]; // prettier-ignore
70
+ keyStmt.run(...keyArgs);
71
+ const whStmt = db.prepare(`INSERT INTO stripe_webhook_events (
47
72
  id, stripe_event_id, event_type, processed_at,
48
73
  payload, success, created_at
49
- ) VALUES (?, ?, ?, ?, ?, ?, ?)`).run(randomUUID(), `evt_${customerId}`, 'customer.subscription.created', now, JSON.stringify({ customer: `cus_${customerId}` }), 1, now);
50
- return subscriptionId;
74
+ ) VALUES (?, ?, ?, ?, ?, ?, ?)`);
75
+ const whArgs = [randomUUID(), `evt_${customerId}`, 'customer.subscription.created', now, JSON.stringify({ customer: `cus_${customerId}` }), 1, now]; // prettier-ignore
76
+ whStmt.run(...whArgs);
77
+ return subId;
51
78
  }
52
79
  describe('Data Export (Article 20)', () => {
53
80
  it('should export all customer data', () => {
@@ -83,7 +110,6 @@ describe('GDPRComplianceService', () => {
83
110
  const exportData = gdprService.exportCustomerData(customerId);
84
111
  expect(exportData.licenseKeys).toHaveLength(1);
85
112
  expect(exportData.licenseKeys[0].isActive).toBe(true);
86
- // Ensure the actual JWT is not exported - use unknown cast for property check
87
113
  const keyData = exportData.licenseKeys[0];
88
114
  expect(keyData['keyJwt']).toBeUndefined();
89
115
  expect(keyData['keyHash']).toBeUndefined();
@@ -104,14 +130,35 @@ describe('GDPRComplianceService', () => {
104
130
  expect(exportData.webhookEvents).toHaveLength(0);
105
131
  });
106
132
  });
107
- describe('Data Deletion (Article 17)', () => {
133
+ describe('Data Export (Article 20) — metadata', () => {
134
+ it('should return metadata with format=json and version=1.0', () => {
135
+ const customerId = 'metadata_customer_1';
136
+ createTestCustomer(customerId);
137
+ const exportData = gdprService.exportCustomerData(customerId);
138
+ expect(exportData.metadata.format).toBe('json');
139
+ expect(exportData.metadata.version).toBe('1.0');
140
+ });
141
+ it('should default seatCount to 1 when subscription row has seatCount=NULL', () => {
142
+ const customerId = 'metadata_customer_null_seat';
143
+ insertSubscription(customerId, { tier: 'individual', seatCount: null });
144
+ const exportData = gdprService.exportCustomerData(customerId);
145
+ expect(exportData.subscriptions).toHaveLength(1);
146
+ expect(exportData.subscriptions[0].seatCount).toBe(1);
147
+ });
148
+ it('should include an ISO-8601 exportedAt timestamp', () => {
149
+ const customerId = 'metadata_customer_iso';
150
+ createTestCustomer(customerId);
151
+ const exportData = gdprService.exportCustomerData(customerId);
152
+ expect(exportData.metadata.exportedAt).toMatch(/^\d{4}-\d{2}-\d{2}T/);
153
+ });
154
+ });
155
+ describe('Data Deletion (Article 17) — happy path', () => {
108
156
  it('should delete all customer data', async () => {
109
157
  const customerId = 'test_customer_123';
110
158
  createTestCustomer(customerId);
111
- // Verify data exists
112
159
  expect(gdprService.hasCustomerData(customerId)).toBe(true);
113
160
  const result = await gdprService.deleteCustomerData(customerId, {
114
- deleteFromStripe: false, // No Stripe client configured
161
+ deleteFromStripe: false,
115
162
  });
116
163
  expect(result.success).toBe(true);
117
164
  expect(result.customerId).toBe(customerId);
@@ -123,10 +170,7 @@ describe('GDPRComplianceService', () => {
123
170
  it('should perform cascading deletion in correct order', async () => {
124
171
  const customerId = 'test_customer_123';
125
172
  createTestCustomer(customerId);
126
- await gdprService.deleteCustomerData(customerId, {
127
- deleteFromStripe: false,
128
- });
129
- // Verify all data is deleted
173
+ await gdprService.deleteCustomerData(customerId, { deleteFromStripe: false });
130
174
  expect(gdprService.hasCustomerData(customerId)).toBe(false);
131
175
  const invoices = db.prepare(`SELECT id FROM invoices WHERE customer_id = ?`).all(customerId);
132
176
  expect(invoices).toHaveLength(0);
@@ -138,11 +182,9 @@ describe('GDPRComplianceService', () => {
138
182
  deleteFromStripe: false,
139
183
  dryRun: true,
140
184
  });
141
- // Dry run should report counts but not delete
142
185
  expect(result.counts.subscriptions).toBe(1);
143
186
  expect(result.counts.invoices).toBe(1);
144
187
  expect(result.counts.licenseKeys).toBe(1);
145
- // Data should still exist
146
188
  expect(gdprService.hasCustomerData(customerId)).toBe(true);
147
189
  });
148
190
  it('should handle deletion of non-existent customer', async () => {
@@ -158,15 +200,158 @@ describe('GDPRComplianceService', () => {
158
200
  const customer2 = 'test_customer_2';
159
201
  createTestCustomer(customer1);
160
202
  createTestCustomer(customer2);
161
- // Delete first customer
162
- await gdprService.deleteCustomerData(customer1, {
163
- deleteFromStripe: false,
164
- });
165
- // First customer deleted, second still exists
203
+ await gdprService.deleteCustomerData(customer1, { deleteFromStripe: false });
166
204
  expect(gdprService.hasCustomerData(customer1)).toBe(false);
167
205
  expect(gdprService.hasCustomerData(customer2)).toBe(true);
168
206
  });
169
207
  });
208
+ describe('Data Deletion (Article 17) — error paths', () => {
209
+ it('should rollback and report error when a DELETE throws', async () => {
210
+ const customerId = 'error_path_customer_1';
211
+ createTestCustomer(customerId);
212
+ // Capture originalPrepare before the spy — spy impl delegates for other SQL.
213
+ const originalPrepare = db.prepare.bind(db);
214
+ vi.spyOn(db, 'prepare').mockImplementation((sql) => {
215
+ if (typeof sql === 'string' && sql.includes('DELETE FROM invoices')) {
216
+ throw new Error('disk I/O error');
217
+ }
218
+ return originalPrepare(sql);
219
+ });
220
+ const result = await gdprService.deleteCustomerData(customerId, {
221
+ deleteFromStripe: false,
222
+ });
223
+ expect(result.success).toBe(false);
224
+ expect(result.errors).toHaveLength(1);
225
+ expect(result.errors[0]).toContain('disk I/O error');
226
+ // Restore prepare so we can verify data is intact (rollback worked).
227
+ vi.restoreAllMocks();
228
+ vi.spyOn(console, 'error').mockImplementation(() => { });
229
+ expect(gdprService.hasCustomerData(customerId)).toBe(true);
230
+ const invoices = db.prepare(`SELECT id FROM invoices WHERE customer_id = ?`).all(customerId);
231
+ expect(invoices).toHaveLength(1);
232
+ });
233
+ it('should capture Stripe deletion error in errors without failing db deletion', async () => {
234
+ const customerId = 'error_path_customer_2';
235
+ createTestCustomer(customerId);
236
+ const stripeDel = vi.fn().mockRejectedValue(new Error('Stripe unavailable'));
237
+ const serviceWithStripe = new GDPRComplianceService({
238
+ db,
239
+ stripeClient: makeMockStripe(stripeDel),
240
+ });
241
+ const result = await serviceWithStripe.deleteCustomerData(customerId);
242
+ // DB deletion should have succeeded — customer data is gone.
243
+ expect(gdprService.hasCustomerData(customerId)).toBe(false);
244
+ expect(result.counts.subscriptions).toBe(1);
245
+ expect(result.counts.invoices).toBe(1);
246
+ // Stripe error is captured but db deletion is not undone.
247
+ expect(result.errors).toHaveLength(1);
248
+ expect(result.errors[0]).toContain('Stripe unavailable');
249
+ expect(result.stripeDeleted).toBe(false);
250
+ expect(result.success).toBe(false);
251
+ });
252
+ it('should report both errors when DB and Stripe both fail', async () => {
253
+ const customerId = 'error_path_customer_3';
254
+ createTestCustomer(customerId);
255
+ const originalPrepare = db.prepare.bind(db);
256
+ vi.spyOn(db, 'prepare').mockImplementation((sql) => {
257
+ if (typeof sql === 'string' && sql.includes('DELETE FROM invoices')) {
258
+ throw new Error('disk I/O error');
259
+ }
260
+ return originalPrepare(sql);
261
+ });
262
+ const stripeDel = vi.fn().mockRejectedValue(new Error('Stripe unavailable'));
263
+ const serviceWithStripe = new GDPRComplianceService({
264
+ db,
265
+ stripeClient: makeMockStripe(stripeDel),
266
+ });
267
+ const result = await serviceWithStripe.deleteCustomerData(customerId);
268
+ expect(result.success).toBe(false);
269
+ expect(result.stripeDeleted).toBe(false);
270
+ expect(result.errors).toHaveLength(2);
271
+ expect(result.errors.some((e) => e.includes('disk I/O error'))).toBe(true);
272
+ expect(result.errors.some((e) => e.includes('Stripe unavailable'))).toBe(true);
273
+ });
274
+ });
275
+ describe('Data Deletion (Article 17) — stripe flag semantics', () => {
276
+ it('should set stripeDeleted=true after successful Stripe deletion', async () => {
277
+ const customerId = 'stripe_flag_customer_1';
278
+ createTestCustomer(customerId);
279
+ const stripeDel = vi.fn().mockResolvedValue({});
280
+ const serviceWithStripe = new GDPRComplianceService({
281
+ db,
282
+ stripeClient: makeMockStripe(stripeDel),
283
+ });
284
+ const result = await serviceWithStripe.deleteCustomerData(customerId);
285
+ expect(result.stripeDeleted).toBe(true);
286
+ expect(stripeDel).toHaveBeenCalledWith(`cus_${customerId}`);
287
+ expect(result.success).toBe(true);
288
+ expect(result.errors).toEqual([]);
289
+ });
290
+ it('should set stripeDeleted=false on Stripe error', async () => {
291
+ const customerId = 'stripe_flag_customer_2';
292
+ createTestCustomer(customerId);
293
+ const stripeDel = vi.fn().mockRejectedValue(new Error('network error'));
294
+ const serviceWithStripe = new GDPRComplianceService({
295
+ db,
296
+ stripeClient: makeMockStripe(stripeDel),
297
+ });
298
+ const result = await serviceWithStripe.deleteCustomerData(customerId);
299
+ expect(result.stripeDeleted).toBe(false);
300
+ });
301
+ it('should skip Stripe client call when deleteFromStripe=false', async () => {
302
+ const customerId = 'stripe_flag_customer_3';
303
+ createTestCustomer(customerId);
304
+ const stripeDel = vi.fn();
305
+ const serviceWithStripe = new GDPRComplianceService({
306
+ db,
307
+ stripeClient: makeMockStripe(stripeDel),
308
+ });
309
+ const result = await serviceWithStripe.deleteCustomerData(customerId, {
310
+ deleteFromStripe: false,
311
+ });
312
+ expect(stripeDel).not.toHaveBeenCalled();
313
+ expect(result.stripeDeleted).toBe(false);
314
+ });
315
+ });
316
+ describe('Data Deletion (Article 17) — dryRun', () => {
317
+ it('should return counts without deleting data', async () => {
318
+ const customerId = 'dryrun_customer_1';
319
+ createTestCustomer(customerId);
320
+ const result = await gdprService.deleteCustomerData(customerId, {
321
+ deleteFromStripe: false,
322
+ dryRun: true,
323
+ });
324
+ expect(result.counts.subscriptions).toBe(1);
325
+ expect(result.counts.invoices).toBe(1);
326
+ expect(result.counts.licenseKeys).toBe(1);
327
+ expect(result.counts.webhookEvents).toBe(1);
328
+ // Data remains intact — hasCustomerData + row-count probe both confirm.
329
+ expect(gdprService.hasCustomerData(customerId)).toBe(true);
330
+ const invoices = db.prepare(`SELECT id FROM invoices WHERE customer_id = ?`).all(customerId);
331
+ expect(invoices).toHaveLength(1);
332
+ const subs = db
333
+ .prepare(`SELECT id FROM user_subscriptions WHERE customer_id = ?`)
334
+ .all(customerId);
335
+ expect(subs).toHaveLength(1);
336
+ });
337
+ // The mock-chain suite asserted `db.exec` was never called with BEGIN/COMMIT in
338
+ // dry run. With real SQLite we cannot observe that without wrapping `exec`, and
339
+ // the stronger property — "dry run does not mutate the database" — is already
340
+ // proven by the data-unchanged assertion above. Transaction boundaries are an
341
+ // implementation detail.
342
+ it.skip('should not start a transaction in dry run (covered by data-unchanged assertion)', () => { });
343
+ it('should not call Stripe deletion in dry run', async () => {
344
+ const customerId = 'dryrun_customer_3';
345
+ createTestCustomer(customerId);
346
+ const stripeDel = vi.fn();
347
+ const serviceWithStripe = new GDPRComplianceService({
348
+ db,
349
+ stripeClient: makeMockStripe(stripeDel),
350
+ });
351
+ await serviceWithStripe.deleteCustomerData(customerId, { dryRun: true });
352
+ expect(stripeDel).not.toHaveBeenCalled();
353
+ });
354
+ });
170
355
  describe('Utility Methods', () => {
171
356
  it('should check if customer has data', () => {
172
357
  const customerId = 'test_customer_123';
@@ -1 +1 @@
1
- {"version":3,"file":"GDPRCompliance.test.js","sourceRoot":"","sources":["../../../tests/billing/GDPRCompliance.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AAEnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAA;AAClF,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAA;AAEnC,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,IAAI,EAAY,CAAA;IAChB,IAAI,WAAkC,CAAA;IAEtC,UAAU,CAAC,GAAG,EAAE;QACd,4BAA4B;QAC5B,EAAE,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAA;QACnC,yBAAyB,CAAC,EAAE,CAAC,CAAA;QAE7B,WAAW,GAAG,IAAI,qBAAqB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,KAAK,EAAE,CAAA;IACZ,CAAC,CAAC,CAAA;IAEF,6BAA6B;IAC7B,SAAS,kBAAkB,CAAC,UAAkB;QAC5C,MAAM,cAAc,GAAG,UAAU,EAAE,CAAA;QACnC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAA;QAEpC,sBAAsB;QACtB,EAAE,CAAC,OAAO,CACR;;;;uDAIiD,CAClD,CAAC,GAAG,CACH,cAAc,EACd,UAAU,EACV,kBAAkB,EAClB,OAAO,UAAU,EAAE,EACnB,OAAO,UAAU,EAAE,EACnB,YAAY,EACZ,MAAM,EACN,QAAQ,EACR,CAAC,EACD,GAAG,EACH,GAAG,EACH,GAAG,EACH,GAAG,CACJ,CAAA;QAED,iBAAiB;QACjB,EAAE,CAAC,OAAO,CACR;;;2CAGqC,CACtC,CAAC,GAAG,CACH,UAAU,EAAE,EACZ,UAAU,EACV,MAAM,UAAU,EAAE,EAClB,cAAc,EACd,IAAI,EACJ,KAAK,EACL,MAAM,EACN,SAAS,EACT,GAAG,CACJ,CAAA;QAED,mDAAmD;QACnD,MAAM,YAAY,GAAG,UAAU,EAAE,CAAA;QACjC,EAAE,CAAC,OAAO,CACR;;;wCAGkC,CACnC,CAAC,GAAG,CACH,YAAY,EACZ,cAAc,EACd,UAAU,EACV,kBAAkB,UAAU,EAAE,EAC9B,QAAQ,UAAU,IAAI,YAAY,EAAE,EAAE,2BAA2B;QACjE,GAAG,EACH,CAAC,EACD,GAAG,CACJ,CAAA;QAED,uBAAuB;QACvB,EAAE,CAAC,OAAO,CACR;;;qCAG+B,CAChC,CAAC,GAAG,CACH,UAAU,EAAE,EACZ,OAAO,UAAU,EAAE,EACnB,+BAA+B,EAC/B,GAAG,EACH,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,OAAO,UAAU,EAAE,EAAE,CAAC,EACjD,CAAC,EACD,GAAG,CACJ,CAAA;QAED,OAAO,cAAc,CAAA;IACvB,CAAC;IAED,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;QACxC,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,UAAU,GAAG,mBAAmB,CAAA;YACtC,kBAAkB,CAAC,UAAU,CAAC,CAAA;YAE9B,MAAM,UAAU,GAAG,WAAW,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA;YAE7D,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YACvD,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YAC/C,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC/C,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAA;QACtD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,MAAM,UAAU,GAAG,mBAAmB,CAAA;YACtC,kBAAkB,CAAC,UAAU,CAAC,CAAA;YAE9B,MAAM,UAAU,GAAG,WAAW,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA;YAE7D,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAChD,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;YACrD,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;YACzD,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACvD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,UAAU,GAAG,mBAAmB,CAAA;YACtC,kBAAkB,CAAC,UAAU,CAAC,CAAA;YAE9B,MAAM,UAAU,GAAG,WAAW,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA;YAE7D,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC3C,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrD,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACnD,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QACpD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,UAAU,GAAG,mBAAmB,CAAA;YACtC,kBAAkB,CAAC,UAAU,CAAC,CAAA;YAE9B,MAAM,UAAU,GAAG,WAAW,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA;YAE7D,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC9C,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACrD,8EAA8E;YAC9E,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAuC,CAAA;YAC/E,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;YACzC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAA;QAC5C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;YACtC,MAAM,UAAU,GAAG,mBAAmB,CAAA;YACtC,kBAAkB,CAAC,UAAU,CAAC,CAAA;YAE9B,MAAM,UAAU,GAAG,WAAW,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA;YAE7D,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAChD,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAA;YACnF,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxD,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,UAAU,GAAG,WAAW,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAA;YAEjE,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAChD,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC3C,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;YAC9C,MAAM,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAClD,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAC1C,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;YAC/C,MAAM,UAAU,GAAG,mBAAmB,CAAA;YACtC,kBAAkB,CAAC,UAAU,CAAC,CAAA;YAE9B,qBAAqB;YACrB,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAE1D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,UAAU,EAAE;gBAC9D,gBAAgB,EAAE,KAAK,EAAE,8BAA8B;aACxD,CAAC,CAAA;YAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACjC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;YAC1C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;YAClE,MAAM,UAAU,GAAG,mBAAmB,CAAA;YACtC,kBAAkB,CAAC,UAAU,CAAC,CAAA;YAE9B,MAAM,WAAW,CAAC,kBAAkB,CAAC,UAAU,EAAE;gBAC/C,gBAAgB,EAAE,KAAK;aACxB,CAAC,CAAA;YAEF,6BAA6B;YAC7B,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAE3D,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;YAC5F,MAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;YAC3C,MAAM,UAAU,GAAG,mBAAmB,CAAA;YACtC,kBAAkB,CAAC,UAAU,CAAC,CAAA;YAE9B,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,UAAU,EAAE;gBAC9D,gBAAgB,EAAE,KAAK;gBACvB,MAAM,EAAE,IAAI;aACb,CAAC,CAAA;YAEF,8CAA8C;YAC9C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACtC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAEzC,0BAA0B;YAC1B,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;YAC/D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,kBAAkB,CAAC,cAAc,EAAE;gBAClE,gBAAgB,EAAE,KAAK;aACxB,CAAC,CAAA;YAEF,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACjC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACxC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;YAC9D,MAAM,SAAS,GAAG,iBAAiB,CAAA;YACnC,MAAM,SAAS,GAAG,iBAAiB,CAAA;YACnC,kBAAkB,CAAC,SAAS,CAAC,CAAA;YAC7B,kBAAkB,CAAC,SAAS,CAAC,CAAA;YAE7B,wBAAwB;YACxB,MAAM,WAAW,CAAC,kBAAkB,CAAC,SAAS,EAAE;gBAC9C,gBAAgB,EAAE,KAAK;aACxB,CAAC,CAAA;YAEF,8CAA8C;YAC9C,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC1D,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3D,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,UAAU,GAAG,mBAAmB,CAAA;YAEtC,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAE3D,kBAAkB,CAAC,UAAU,CAAC,CAAA;YAE9B,MAAM,CAAC,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YACpC,MAAM,UAAU,GAAG,mBAAmB,CAAA;YACtC,kBAAkB,CAAC,UAAU,CAAC,CAAA;YAE9B,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,UAAU,CAAC,CAAA;YAEtD,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC1C,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACpC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,OAAO,UAAU,EAAE,CAAC,CAAA;QAC5D,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;YAC/D,MAAM,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,cAAc,CAAC,CAAA;YAE1D,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAC3C,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACpC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACvC,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,QAAQ,EAAE,CAAA;QAC7C,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"GDPRCompliance.test.js","sourceRoot":"","sources":["../../../tests/billing/GDPRCompliance.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * SMI-4408: Indexer blocklist tests.
3
+ *
4
+ * Covers:
5
+ * - Exact-match blocking (owner/name, case-sensitive)
6
+ * - Non-blocklisted repos pass through
7
+ * - Empty/missing blocklist file returns EMPTY_BLOCKLIST (no-op)
8
+ * - Schema validation: version=1, required fields, valid repo format, valid dates
9
+ * - Duplicate entries rejected at load
10
+ * - Malformed JSON rejected at load
11
+ * - Ship-it sanity check: data/indexer-blocklist.json parses and contains
12
+ * the 2 known-bad entries from SMI-4396 Wave 2 residuals.
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=blocklist.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocklist.test.d.ts","sourceRoot":"","sources":["../../../tests/github-import/blocklist.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * SMI-4408: Indexer blocklist tests.
3
+ *
4
+ * Covers:
5
+ * - Exact-match blocking (owner/name, case-sensitive)
6
+ * - Non-blocklisted repos pass through
7
+ * - Empty/missing blocklist file returns EMPTY_BLOCKLIST (no-op)
8
+ * - Schema validation: version=1, required fields, valid repo format, valid dates
9
+ * - Duplicate entries rejected at load
10
+ * - Malformed JSON rejected at load
11
+ * - Ship-it sanity check: data/indexer-blocklist.json parses and contains
12
+ * the 2 known-bad entries from SMI-4396 Wave 2 residuals.
13
+ */
14
+ import { describe, it, expect } from 'vitest';
15
+ import * as fs from 'fs';
16
+ import * as os from 'os';
17
+ import * as path from 'path';
18
+ import { buildBlocklist, EMPTY_BLOCKLIST, loadBlocklist, parseBlocklistFile, } from '../../src/scripts/github-import/blocklist.js';
19
+ const VALID_ENTRY = {
20
+ repo: 'vinayaksavle/UploadDownloadPDF',
21
+ reason: 'ASP.NET MVC tutorial, not a Claude skill',
22
+ addedBy: 'ryansmith108',
23
+ addedAt: '2026-04-21',
24
+ };
25
+ // ------------------------ matcher behavior ------------------------
26
+ describe('BlocklistMatcher (SMI-4408)', () => {
27
+ it('blocks exact-match owner/name (case-sensitive)', () => {
28
+ const matcher = buildBlocklist([VALID_ENTRY]);
29
+ expect(matcher.isBlocked('vinayaksavle/UploadDownloadPDF')).toBe(true);
30
+ });
31
+ it('does not block case-mismatched repo (exact match)', () => {
32
+ const matcher = buildBlocklist([VALID_ENTRY]);
33
+ expect(matcher.isBlocked('vinayaksavle/uploaddownloadpdf')).toBe(false);
34
+ expect(matcher.isBlocked('Vinayaksavle/UploadDownloadPDF')).toBe(false);
35
+ });
36
+ it('does not block non-blocklisted repos', () => {
37
+ const matcher = buildBlocklist([VALID_ENTRY]);
38
+ expect(matcher.isBlocked('anthropics/skills')).toBe(false);
39
+ expect(matcher.isBlocked('smith-horn/skill-image-pipeline')).toBe(false);
40
+ });
41
+ it('does not match partial strings (substring not allowed)', () => {
42
+ const matcher = buildBlocklist([VALID_ENTRY]);
43
+ expect(matcher.isBlocked('vinayaksavle/UploadDownloadPDF-extra')).toBe(false);
44
+ expect(matcher.isBlocked('other/vinayaksavle/UploadDownloadPDF')).toBe(false);
45
+ });
46
+ it('exposes entries() for audit-log output', () => {
47
+ const matcher = buildBlocklist([VALID_ENTRY]);
48
+ const entries = matcher.entries();
49
+ expect(entries).toHaveLength(1);
50
+ expect(entries[0]).toEqual(VALID_ENTRY);
51
+ });
52
+ it('EMPTY_BLOCKLIST blocks nothing', () => {
53
+ expect(EMPTY_BLOCKLIST.isBlocked('anything/at-all')).toBe(false);
54
+ expect(EMPTY_BLOCKLIST.entries()).toEqual([]);
55
+ });
56
+ });
57
+ // ------------------------ schema validation ------------------------
58
+ describe('parseBlocklistFile (SMI-4408)', () => {
59
+ const validFile = {
60
+ version: 1,
61
+ updatedAt: '2026-04-21',
62
+ blocked: [VALID_ENTRY],
63
+ };
64
+ it('parses a valid file', () => {
65
+ const result = parseBlocklistFile(validFile);
66
+ expect(result.version).toBe(1);
67
+ expect(result.updatedAt).toBe('2026-04-21');
68
+ expect(result.blocked).toHaveLength(1);
69
+ expect(result.blocked[0]).toEqual(VALID_ENTRY);
70
+ });
71
+ it('rejects non-object root', () => {
72
+ expect(() => parseBlocklistFile(null)).toThrow(/must be an object/i);
73
+ expect(() => parseBlocklistFile('string')).toThrow(/must be an object/i);
74
+ // Arrays pass typeof === 'object' but fail on missing `version` field.
75
+ expect(() => parseBlocklistFile([])).toThrow(/unsupported blocklist file version/i);
76
+ });
77
+ it('rejects unsupported version', () => {
78
+ expect(() => parseBlocklistFile({ ...validFile, version: 2 })).toThrow(/unsupported blocklist file version/i);
79
+ expect(() => parseBlocklistFile({ ...validFile, version: 0 })).toThrow(/unsupported blocklist file version/i);
80
+ });
81
+ it('rejects invalid updatedAt', () => {
82
+ expect(() => parseBlocklistFile({ ...validFile, updatedAt: '04/21/2026' })).toThrow(/updatedAt must be YYYY-MM-DD/i);
83
+ expect(() => parseBlocklistFile({ ...validFile, updatedAt: 42 })).toThrow(/updatedAt must be YYYY-MM-DD/i);
84
+ });
85
+ it('rejects blocked field when not an array', () => {
86
+ expect(() => parseBlocklistFile({ ...validFile, blocked: {} })).toThrow(/blocked must be an array/i);
87
+ });
88
+ it('rejects entry with missing required field', () => {
89
+ for (const field of ['repo', 'reason', 'addedBy', 'addedAt']) {
90
+ const badEntry = { ...VALID_ENTRY };
91
+ delete badEntry[field];
92
+ expect(() => parseBlocklistFile({ ...validFile, blocked: [badEntry] })).toThrow(new RegExp(`missing or empty required field: ${field}`, 'i'));
93
+ }
94
+ });
95
+ it('rejects entry with empty required field', () => {
96
+ expect(() => parseBlocklistFile({ ...validFile, blocked: [{ ...VALID_ENTRY, reason: '' }] })).toThrow(/missing or empty required field: reason/i);
97
+ });
98
+ it('rejects malformed repo string', () => {
99
+ const bad = ['no-slash', '/leading', 'trailing/', 'too/many/slashes', 'has spaces/ok'];
100
+ for (const repo of bad) {
101
+ expect(() => parseBlocklistFile({ ...validFile, blocked: [{ ...VALID_ENTRY, repo }] })).toThrow(/repo must be 'owner\/name'/i);
102
+ }
103
+ });
104
+ it('accepts GitHub-valid repo names with common punctuation', () => {
105
+ const good = ['foo/bar', 'foo-bar/baz.qux', 'Foo123/Bar_v2', 'org.name/repo-name'];
106
+ for (const repo of good) {
107
+ expect(() => parseBlocklistFile({ ...validFile, blocked: [{ ...VALID_ENTRY, repo }] })).not.toThrow();
108
+ }
109
+ });
110
+ it('rejects invalid addedAt format', () => {
111
+ expect(() => parseBlocklistFile({ ...validFile, blocked: [{ ...VALID_ENTRY, addedAt: 'yesterday' }] })).toThrow(/addedAt must be YYYY-MM-DD/i);
112
+ });
113
+ it('rejects duplicate repo entries', () => {
114
+ expect(() => parseBlocklistFile({
115
+ ...validFile,
116
+ blocked: [VALID_ENTRY, { ...VALID_ENTRY, addedAt: '2026-04-22' }],
117
+ })).toThrow(/duplicate entry: vinayaksavle\/UploadDownloadPDF/i);
118
+ });
119
+ it('non-object entry rejected with index', () => {
120
+ expect(() => parseBlocklistFile({ ...validFile, blocked: [VALID_ENTRY, 'string-entry'] })).toThrow(/entry #1 is not an object/i);
121
+ });
122
+ });
123
+ // ------------------------ loadBlocklist ------------------------
124
+ describe('loadBlocklist (SMI-4408)', () => {
125
+ it('returns EMPTY_BLOCKLIST when file is absent', () => {
126
+ const tmp = path.join(os.tmpdir(), `blocklist-absent-${Date.now()}.json`);
127
+ const matcher = loadBlocklist(tmp);
128
+ expect(matcher).toBe(EMPTY_BLOCKLIST);
129
+ expect(matcher.isBlocked('anything/at-all')).toBe(false);
130
+ });
131
+ it('throws on malformed JSON', () => {
132
+ const tmp = path.join(os.tmpdir(), `blocklist-malformed-${Date.now()}.json`);
133
+ fs.writeFileSync(tmp, '{ not valid json');
134
+ try {
135
+ expect(() => loadBlocklist(tmp)).toThrow(/is not valid JSON/i);
136
+ }
137
+ finally {
138
+ fs.unlinkSync(tmp);
139
+ }
140
+ });
141
+ it('throws on invalid schema', () => {
142
+ const tmp = path.join(os.tmpdir(), `blocklist-invalid-${Date.now()}.json`);
143
+ fs.writeFileSync(tmp, JSON.stringify({ version: 2, updatedAt: '2026-04-21', blocked: [] }));
144
+ try {
145
+ expect(() => loadBlocklist(tmp)).toThrow(/unsupported blocklist file version/i);
146
+ }
147
+ finally {
148
+ fs.unlinkSync(tmp);
149
+ }
150
+ });
151
+ it('loads a valid file', () => {
152
+ const tmp = path.join(os.tmpdir(), `blocklist-valid-${Date.now()}.json`);
153
+ fs.writeFileSync(tmp, JSON.stringify({
154
+ version: 1,
155
+ updatedAt: '2026-04-21',
156
+ blocked: [VALID_ENTRY],
157
+ }));
158
+ try {
159
+ const matcher = loadBlocklist(tmp);
160
+ expect(matcher.isBlocked('vinayaksavle/UploadDownloadPDF')).toBe(true);
161
+ expect(matcher.isBlocked('anthropics/skills')).toBe(false);
162
+ }
163
+ finally {
164
+ fs.unlinkSync(tmp);
165
+ }
166
+ });
167
+ });
168
+ // ------------------------ ship-it sanity ------------------------
169
+ describe('data/indexer-blocklist.json (ship-it sanity)', () => {
170
+ it('is parseable and contains the 2 SMI-4396 Wave 2 residuals', () => {
171
+ const filePath = path.resolve(__dirname, '../../../../data/indexer-blocklist.json');
172
+ const raw = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
173
+ const parsed = parseBlocklistFile(raw);
174
+ expect(parsed.blocked.length).toBe(2);
175
+ const repos = parsed.blocked.map((e) => e.repo).sort();
176
+ expect(repos).toEqual(['Sfedfcv/redesigned-pancake', 'vinayaksavle/UploadDownloadPDF'].sort());
177
+ // Each entry must carry a reason for audit trail.
178
+ expect(parsed.blocked.every((e) => e.reason.length > 0)).toBe(true);
179
+ expect(parsed.blocked.every((e) => e.addedBy.length > 0)).toBe(true);
180
+ });
181
+ });
182
+ //# sourceMappingURL=blocklist.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blocklist.test.js","sourceRoot":"","sources":["../../../tests/github-import/blocklist.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * SMI-4415: Unit tests for the signal-of-intent gate.
3
+ *
4
+ * Fixture-driven verification of the Wave 0 admit/reject gate criteria:
5
+ * - ≥ 98% known-good admission (known-good.json, 10 entries → 100% expected)
6
+ * - ≥ 95% non-skill rejection (non-skills.json, 20 entries → 100% expected)
7
+ *
8
+ * Plus explicit regression guards:
9
+ * - Plan-review H4 floor: metadata-only skills must reject even at high score
10
+ * - Score-boundary: score === SIGNAL_THRESHOLD with structural signal admits,
11
+ * score === SIGNAL_THRESHOLD - 1 rejects
12
+ * - mcp-server-only: structural but below threshold → reject
13
+ */
14
+ export {};
15
+ //# sourceMappingURL=signal-of-intent.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signal-of-intent.test.d.ts","sourceRoot":"","sources":["../../../tests/github-import/signal-of-intent.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG"}