@skillsmith/mcp-server 0.1.0

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 (306) hide show
  1. package/dist/.tsbuildinfo +1 -0
  2. package/dist/src/__tests__/get-skill.test.d.ts +6 -0
  3. package/dist/src/__tests__/get-skill.test.d.ts.map +1 -0
  4. package/dist/src/__tests__/get-skill.test.js +88 -0
  5. package/dist/src/__tests__/get-skill.test.js.map +1 -0
  6. package/dist/src/__tests__/middleware/errorFormatter.test.d.ts +7 -0
  7. package/dist/src/__tests__/middleware/errorFormatter.test.d.ts.map +1 -0
  8. package/dist/src/__tests__/middleware/errorFormatter.test.js +304 -0
  9. package/dist/src/__tests__/middleware/errorFormatter.test.js.map +1 -0
  10. package/dist/src/__tests__/middleware/license.test.d.ts +7 -0
  11. package/dist/src/__tests__/middleware/license.test.d.ts.map +1 -0
  12. package/dist/src/__tests__/middleware/license.test.js +500 -0
  13. package/dist/src/__tests__/middleware/license.test.js.map +1 -0
  14. package/dist/src/__tests__/search.test.d.ts +6 -0
  15. package/dist/src/__tests__/search.test.d.ts.map +1 -0
  16. package/dist/src/__tests__/search.test.js +86 -0
  17. package/dist/src/__tests__/search.test.js.map +1 -0
  18. package/dist/src/__tests__/test-utils.d.ts +19 -0
  19. package/dist/src/__tests__/test-utils.d.ts.map +1 -0
  20. package/dist/src/__tests__/test-utils.js +87 -0
  21. package/dist/src/__tests__/test-utils.js.map +1 -0
  22. package/dist/src/context/index.d.ts +19 -0
  23. package/dist/src/context/index.d.ts.map +1 -0
  24. package/dist/src/context/index.js +25 -0
  25. package/dist/src/context/index.js.map +1 -0
  26. package/dist/src/context/project-detector.d.ts +145 -0
  27. package/dist/src/context/project-detector.d.ts.map +1 -0
  28. package/dist/src/context/project-detector.js +321 -0
  29. package/dist/src/context/project-detector.js.map +1 -0
  30. package/dist/src/context.d.ts +100 -0
  31. package/dist/src/context.d.ts.map +1 -0
  32. package/dist/src/context.js +157 -0
  33. package/dist/src/context.js.map +1 -0
  34. package/dist/src/core-shim.d.ts +7 -0
  35. package/dist/src/core-shim.d.ts.map +1 -0
  36. package/dist/src/core-shim.js +9 -0
  37. package/dist/src/core-shim.js.map +1 -0
  38. package/dist/src/health/healthCheck.d.ts +88 -0
  39. package/dist/src/health/healthCheck.d.ts.map +1 -0
  40. package/dist/src/health/healthCheck.js +117 -0
  41. package/dist/src/health/healthCheck.js.map +1 -0
  42. package/dist/src/health/index.d.ts +21 -0
  43. package/dist/src/health/index.d.ts.map +1 -0
  44. package/dist/src/health/index.js +21 -0
  45. package/dist/src/health/index.js.map +1 -0
  46. package/dist/src/health/readinessCheck.d.ts +139 -0
  47. package/dist/src/health/readinessCheck.d.ts.map +1 -0
  48. package/dist/src/health/readinessCheck.js +266 -0
  49. package/dist/src/health/readinessCheck.js.map +1 -0
  50. package/dist/src/index.d.ts +8 -0
  51. package/dist/src/index.d.ts.map +1 -0
  52. package/dist/src/index.js +178 -0
  53. package/dist/src/index.js.map +1 -0
  54. package/dist/src/index.test.d.ts +2 -0
  55. package/dist/src/index.test.d.ts.map +1 -0
  56. package/dist/src/index.test.js +43 -0
  57. package/dist/src/index.test.js.map +1 -0
  58. package/dist/src/logger.d.ts +26 -0
  59. package/dist/src/logger.d.ts.map +1 -0
  60. package/dist/src/logger.js +179 -0
  61. package/dist/src/logger.js.map +1 -0
  62. package/dist/src/middleware/__tests__/csp.test.d.ts +2 -0
  63. package/dist/src/middleware/__tests__/csp.test.d.ts.map +1 -0
  64. package/dist/src/middleware/__tests__/csp.test.js +389 -0
  65. package/dist/src/middleware/__tests__/csp.test.js.map +1 -0
  66. package/dist/src/middleware/csp.d.ts +87 -0
  67. package/dist/src/middleware/csp.d.ts.map +1 -0
  68. package/dist/src/middleware/csp.js +273 -0
  69. package/dist/src/middleware/csp.js.map +1 -0
  70. package/dist/src/middleware/degradation.d.ts +99 -0
  71. package/dist/src/middleware/degradation.d.ts.map +1 -0
  72. package/dist/src/middleware/degradation.js +315 -0
  73. package/dist/src/middleware/degradation.js.map +1 -0
  74. package/dist/src/middleware/errorFormatter.d.ts +119 -0
  75. package/dist/src/middleware/errorFormatter.d.ts.map +1 -0
  76. package/dist/src/middleware/errorFormatter.js +294 -0
  77. package/dist/src/middleware/errorFormatter.js.map +1 -0
  78. package/dist/src/middleware/index.d.ts +10 -0
  79. package/dist/src/middleware/index.d.ts.map +1 -0
  80. package/dist/src/middleware/index.js +14 -0
  81. package/dist/src/middleware/index.js.map +1 -0
  82. package/dist/src/middleware/license.d.ts +161 -0
  83. package/dist/src/middleware/license.d.ts.map +1 -0
  84. package/dist/src/middleware/license.js +281 -0
  85. package/dist/src/middleware/license.js.map +1 -0
  86. package/dist/src/middleware/toolFeatureMapping.d.ts +36 -0
  87. package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -0
  88. package/dist/src/middleware/toolFeatureMapping.js +90 -0
  89. package/dist/src/middleware/toolFeatureMapping.js.map +1 -0
  90. package/dist/src/onboarding/first-run.d.ts +64 -0
  91. package/dist/src/onboarding/first-run.d.ts.map +1 -0
  92. package/dist/src/onboarding/first-run.js +77 -0
  93. package/dist/src/onboarding/first-run.js.map +1 -0
  94. package/dist/src/onboarding/index.d.ts +7 -0
  95. package/dist/src/onboarding/index.d.ts.map +1 -0
  96. package/dist/src/onboarding/index.js +7 -0
  97. package/dist/src/onboarding/index.js.map +1 -0
  98. package/dist/src/suggestions/index.d.ts +21 -0
  99. package/dist/src/suggestions/index.d.ts.map +1 -0
  100. package/dist/src/suggestions/index.js +20 -0
  101. package/dist/src/suggestions/index.js.map +1 -0
  102. package/dist/src/suggestions/suggestion-engine.d.ts +185 -0
  103. package/dist/src/suggestions/suggestion-engine.d.ts.map +1 -0
  104. package/dist/src/suggestions/suggestion-engine.js +352 -0
  105. package/dist/src/suggestions/suggestion-engine.js.map +1 -0
  106. package/dist/src/suggestions/types.d.ts +88 -0
  107. package/dist/src/suggestions/types.d.ts.map +1 -0
  108. package/dist/src/suggestions/types.js +21 -0
  109. package/dist/src/suggestions/types.js.map +1 -0
  110. package/dist/src/tools/analyze.d.ts +151 -0
  111. package/dist/src/tools/analyze.d.ts.map +1 -0
  112. package/dist/src/tools/analyze.js +205 -0
  113. package/dist/src/tools/analyze.js.map +1 -0
  114. package/dist/src/tools/compare.d.ts +149 -0
  115. package/dist/src/tools/compare.d.ts.map +1 -0
  116. package/dist/src/tools/compare.js +464 -0
  117. package/dist/src/tools/compare.js.map +1 -0
  118. package/dist/src/tools/get-skill.d.ts +116 -0
  119. package/dist/src/tools/get-skill.d.ts.map +1 -0
  120. package/dist/src/tools/get-skill.js +224 -0
  121. package/dist/src/tools/get-skill.js.map +1 -0
  122. package/dist/src/tools/index.d.ts +20 -0
  123. package/dist/src/tools/index.d.ts.map +1 -0
  124. package/dist/src/tools/index.js +20 -0
  125. package/dist/src/tools/index.js.map +1 -0
  126. package/dist/src/tools/install.d.ts +122 -0
  127. package/dist/src/tools/install.d.ts.map +1 -0
  128. package/dist/src/tools/install.js +314 -0
  129. package/dist/src/tools/install.js.map +1 -0
  130. package/dist/src/tools/recommend.d.ts +171 -0
  131. package/dist/src/tools/recommend.d.ts.map +1 -0
  132. package/dist/src/tools/recommend.js +325 -0
  133. package/dist/src/tools/recommend.js.map +1 -0
  134. package/dist/src/tools/search.d.ts +121 -0
  135. package/dist/src/tools/search.d.ts.map +1 -0
  136. package/dist/src/tools/search.js +249 -0
  137. package/dist/src/tools/search.js.map +1 -0
  138. package/dist/src/tools/suggest.d.ts +181 -0
  139. package/dist/src/tools/suggest.d.ts.map +1 -0
  140. package/dist/src/tools/suggest.js +342 -0
  141. package/dist/src/tools/suggest.js.map +1 -0
  142. package/dist/src/tools/uninstall.d.ts +123 -0
  143. package/dist/src/tools/uninstall.d.ts.map +1 -0
  144. package/dist/src/tools/uninstall.js +250 -0
  145. package/dist/src/tools/uninstall.js.map +1 -0
  146. package/dist/src/tools/validate.d.ts +122 -0
  147. package/dist/src/tools/validate.d.ts.map +1 -0
  148. package/dist/src/tools/validate.js +497 -0
  149. package/dist/src/tools/validate.js.map +1 -0
  150. package/dist/src/utils/installed-skills.d.ts +101 -0
  151. package/dist/src/utils/installed-skills.d.ts.map +1 -0
  152. package/dist/src/utils/installed-skills.js +220 -0
  153. package/dist/src/utils/installed-skills.js.map +1 -0
  154. package/dist/src/utils/validation.d.ts +76 -0
  155. package/dist/src/utils/validation.d.ts.map +1 -0
  156. package/dist/src/utils/validation.js +153 -0
  157. package/dist/src/utils/validation.js.map +1 -0
  158. package/dist/src/webhooks/index.d.ts +8 -0
  159. package/dist/src/webhooks/index.d.ts.map +1 -0
  160. package/dist/src/webhooks/index.js +9 -0
  161. package/dist/src/webhooks/index.js.map +1 -0
  162. package/dist/src/webhooks/webhook-endpoint.d.ts +149 -0
  163. package/dist/src/webhooks/webhook-endpoint.d.ts.map +1 -0
  164. package/dist/src/webhooks/webhook-endpoint.js +339 -0
  165. package/dist/src/webhooks/webhook-endpoint.js.map +1 -0
  166. package/dist/tests/compare.test.d.ts +6 -0
  167. package/dist/tests/compare.test.d.ts.map +1 -0
  168. package/dist/tests/compare.test.js +225 -0
  169. package/dist/tests/compare.test.js.map +1 -0
  170. package/dist/tests/context/project-detector.test.d.ts +6 -0
  171. package/dist/tests/context/project-detector.test.d.ts.map +1 -0
  172. package/dist/tests/context/project-detector.test.js +719 -0
  173. package/dist/tests/context/project-detector.test.js.map +1 -0
  174. package/dist/tests/e2e/compare.e2e.test.d.ts +10 -0
  175. package/dist/tests/e2e/compare.e2e.test.d.ts.map +1 -0
  176. package/dist/tests/e2e/compare.e2e.test.js +286 -0
  177. package/dist/tests/e2e/compare.e2e.test.js.map +1 -0
  178. package/dist/tests/e2e/install-flow.e2e.test.d.ts +10 -0
  179. package/dist/tests/e2e/install-flow.e2e.test.d.ts.map +1 -0
  180. package/dist/tests/e2e/install-flow.e2e.test.js +209 -0
  181. package/dist/tests/e2e/install-flow.e2e.test.js.map +1 -0
  182. package/dist/tests/e2e/recommend.e2e.test.d.ts +12 -0
  183. package/dist/tests/e2e/recommend.e2e.test.d.ts.map +1 -0
  184. package/dist/tests/e2e/recommend.e2e.test.js +347 -0
  185. package/dist/tests/e2e/recommend.e2e.test.js.map +1 -0
  186. package/dist/tests/e2e/skill-flow.e2e.test.d.ts +10 -0
  187. package/dist/tests/e2e/skill-flow.e2e.test.d.ts.map +1 -0
  188. package/dist/tests/e2e/skill-flow.e2e.test.js +280 -0
  189. package/dist/tests/e2e/skill-flow.e2e.test.js.map +1 -0
  190. package/dist/tests/e2e/suggest.e2e.test.d.ts +13 -0
  191. package/dist/tests/e2e/suggest.e2e.test.d.ts.map +1 -0
  192. package/dist/tests/e2e/suggest.e2e.test.js +347 -0
  193. package/dist/tests/e2e/suggest.e2e.test.js.map +1 -0
  194. package/dist/tests/e2e/utils/baseline-collector.d.ts +107 -0
  195. package/dist/tests/e2e/utils/baseline-collector.d.ts.map +1 -0
  196. package/dist/tests/e2e/utils/baseline-collector.js +211 -0
  197. package/dist/tests/e2e/utils/baseline-collector.js.map +1 -0
  198. package/dist/tests/e2e/utils/hardcoded-detector.d.ts +46 -0
  199. package/dist/tests/e2e/utils/hardcoded-detector.d.ts.map +1 -0
  200. package/dist/tests/e2e/utils/hardcoded-detector.js +255 -0
  201. package/dist/tests/e2e/utils/hardcoded-detector.js.map +1 -0
  202. package/dist/tests/e2e/utils/index.d.ts +7 -0
  203. package/dist/tests/e2e/utils/index.d.ts.map +1 -0
  204. package/dist/tests/e2e/utils/index.js +7 -0
  205. package/dist/tests/e2e/utils/index.js.map +1 -0
  206. package/dist/tests/e2e/utils/linear-reporter.d.ts +60 -0
  207. package/dist/tests/e2e/utils/linear-reporter.d.ts.map +1 -0
  208. package/dist/tests/e2e/utils/linear-reporter.js +232 -0
  209. package/dist/tests/e2e/utils/linear-reporter.js.map +1 -0
  210. package/dist/tests/health.test.d.ts +9 -0
  211. package/dist/tests/health.test.d.ts.map +1 -0
  212. package/dist/tests/health.test.js +308 -0
  213. package/dist/tests/health.test.js.map +1 -0
  214. package/dist/tests/integration/analyze.integration.test.d.ts +2 -0
  215. package/dist/tests/integration/analyze.integration.test.d.ts.map +1 -0
  216. package/dist/tests/integration/analyze.integration.test.js +244 -0
  217. package/dist/tests/integration/analyze.integration.test.js.map +1 -0
  218. package/dist/tests/integration/compare.integration.test.d.ts +2 -0
  219. package/dist/tests/integration/compare.integration.test.d.ts.map +1 -0
  220. package/dist/tests/integration/compare.integration.test.js +120 -0
  221. package/dist/tests/integration/compare.integration.test.js.map +1 -0
  222. package/dist/tests/integration/fixtures/test-skills.d.ts +62 -0
  223. package/dist/tests/integration/fixtures/test-skills.d.ts.map +1 -0
  224. package/dist/tests/integration/fixtures/test-skills.js +644 -0
  225. package/dist/tests/integration/fixtures/test-skills.js.map +1 -0
  226. package/dist/tests/integration/get-skill.integration.test.d.ts +6 -0
  227. package/dist/tests/integration/get-skill.integration.test.d.ts.map +1 -0
  228. package/dist/tests/integration/get-skill.integration.test.js +203 -0
  229. package/dist/tests/integration/get-skill.integration.test.js.map +1 -0
  230. package/dist/tests/integration/github-api.integration.test.d.ts +14 -0
  231. package/dist/tests/integration/github-api.integration.test.d.ts.map +1 -0
  232. package/dist/tests/integration/github-api.integration.test.js +190 -0
  233. package/dist/tests/integration/github-api.integration.test.js.map +1 -0
  234. package/dist/tests/integration/install.integration.test.d.ts +6 -0
  235. package/dist/tests/integration/install.integration.test.d.ts.map +1 -0
  236. package/dist/tests/integration/install.integration.test.js +282 -0
  237. package/dist/tests/integration/install.integration.test.js.map +1 -0
  238. package/dist/tests/integration/recommend.integration.test.d.ts +2 -0
  239. package/dist/tests/integration/recommend.integration.test.d.ts.map +1 -0
  240. package/dist/tests/integration/recommend.integration.test.js +215 -0
  241. package/dist/tests/integration/recommend.integration.test.js.map +1 -0
  242. package/dist/tests/integration/search.integration.test.d.ts +6 -0
  243. package/dist/tests/integration/search.integration.test.d.ts.map +1 -0
  244. package/dist/tests/integration/search.integration.test.js +229 -0
  245. package/dist/tests/integration/search.integration.test.js.map +1 -0
  246. package/dist/tests/integration/setup.d.ts +71 -0
  247. package/dist/tests/integration/setup.d.ts.map +1 -0
  248. package/dist/tests/integration/setup.js +124 -0
  249. package/dist/tests/integration/setup.js.map +1 -0
  250. package/dist/tests/integration/uninstall.integration.test.d.ts +6 -0
  251. package/dist/tests/integration/uninstall.integration.test.d.ts.map +1 -0
  252. package/dist/tests/integration/uninstall.integration.test.js +296 -0
  253. package/dist/tests/integration/uninstall.integration.test.js.map +1 -0
  254. package/dist/tests/integration/validate.integration.test.d.ts +2 -0
  255. package/dist/tests/integration/validate.integration.test.d.ts.map +1 -0
  256. package/dist/tests/integration/validate.integration.test.js +181 -0
  257. package/dist/tests/integration/validate.integration.test.js.map +1 -0
  258. package/dist/tests/onboarding/first-run.test.d.ts +7 -0
  259. package/dist/tests/onboarding/first-run.test.d.ts.map +1 -0
  260. package/dist/tests/onboarding/first-run.test.js +258 -0
  261. package/dist/tests/onboarding/first-run.test.js.map +1 -0
  262. package/dist/tests/performance/search-performance.test.d.ts +10 -0
  263. package/dist/tests/performance/search-performance.test.d.ts.map +1 -0
  264. package/dist/tests/performance/search-performance.test.js +218 -0
  265. package/dist/tests/performance/search-performance.test.js.map +1 -0
  266. package/dist/tests/recommend.test.d.ts +6 -0
  267. package/dist/tests/recommend.test.d.ts.map +1 -0
  268. package/dist/tests/recommend.test.js +208 -0
  269. package/dist/tests/recommend.test.js.map +1 -0
  270. package/dist/tests/suggestions/suggestion-engine.test.d.ts +6 -0
  271. package/dist/tests/suggestions/suggestion-engine.test.d.ts.map +1 -0
  272. package/dist/tests/suggestions/suggestion-engine.test.js +448 -0
  273. package/dist/tests/suggestions/suggestion-engine.test.js.map +1 -0
  274. package/dist/tests/test-utils.d.ts +74 -0
  275. package/dist/tests/test-utils.d.ts.map +1 -0
  276. package/dist/tests/test-utils.js +98 -0
  277. package/dist/tests/test-utils.js.map +1 -0
  278. package/dist/tests/tools.test.d.ts +5 -0
  279. package/dist/tests/tools.test.d.ts.map +1 -0
  280. package/dist/tests/tools.test.js +138 -0
  281. package/dist/tests/tools.test.js.map +1 -0
  282. package/dist/tests/unit/installed-skills.test.d.ts +6 -0
  283. package/dist/tests/unit/installed-skills.test.d.ts.map +1 -0
  284. package/dist/tests/unit/installed-skills.test.js +285 -0
  285. package/dist/tests/unit/installed-skills.test.js.map +1 -0
  286. package/dist/tests/unit/logger.test.d.ts +6 -0
  287. package/dist/tests/unit/logger.test.d.ts.map +1 -0
  288. package/dist/tests/unit/logger.test.js +281 -0
  289. package/dist/tests/unit/logger.test.js.map +1 -0
  290. package/dist/tests/validate.test.d.ts +5 -0
  291. package/dist/tests/validate.test.d.ts.map +1 -0
  292. package/dist/tests/validate.test.js +303 -0
  293. package/dist/tests/validate.test.js.map +1 -0
  294. package/dist/tests/webhooks/proxy-trust.security.test.d.ts +8 -0
  295. package/dist/tests/webhooks/proxy-trust.security.test.d.ts.map +1 -0
  296. package/dist/tests/webhooks/proxy-trust.security.test.js +145 -0
  297. package/dist/tests/webhooks/proxy-trust.security.test.js.map +1 -0
  298. package/dist/tests/webhooks/rate-limiter.security.test.d.ts +8 -0
  299. package/dist/tests/webhooks/rate-limiter.security.test.d.ts.map +1 -0
  300. package/dist/tests/webhooks/rate-limiter.security.test.js +122 -0
  301. package/dist/tests/webhooks/rate-limiter.security.test.js.map +1 -0
  302. package/dist/vitest.config.d.ts +6 -0
  303. package/dist/vitest.config.d.ts.map +1 -0
  304. package/dist/vitest.config.js +13 -0
  305. package/dist/vitest.config.js.map +1 -0
  306. package/package.json +63 -0
@@ -0,0 +1,211 @@
1
+ /**
2
+ * Performance Baseline Collector
3
+ *
4
+ * Captures timing and resource metrics during E2E tests
5
+ * to establish baselines for future performance tracking.
6
+ *
7
+ * @see docs/testing/e2e-testing-plan.md
8
+ */
9
+ // Collected metrics during test run
10
+ const timingMetrics = [];
11
+ const memoryMetrics = [];
12
+ /**
13
+ * Record timing for a command execution
14
+ */
15
+ export function recordTiming(name, command, durationMs) {
16
+ timingMetrics.push({
17
+ name,
18
+ command,
19
+ durationMs,
20
+ timestamp: new Date().toISOString(),
21
+ });
22
+ }
23
+ /**
24
+ * Record memory usage for a command execution
25
+ */
26
+ export function recordMemory(name, command) {
27
+ const usage = process.memoryUsage();
28
+ memoryMetrics.push({
29
+ name,
30
+ command,
31
+ heapUsedMB: Math.round((usage.heapUsed / 1024 / 1024) * 100) / 100,
32
+ heapTotalMB: Math.round((usage.heapTotal / 1024 / 1024) * 100) / 100,
33
+ externalMB: Math.round((usage.external / 1024 / 1024) * 100) / 100,
34
+ timestamp: new Date().toISOString(),
35
+ });
36
+ }
37
+ /**
38
+ * Measure async function execution time
39
+ */
40
+ export async function measureAsync(name, command, fn) {
41
+ const start = performance.now();
42
+ const result = await fn();
43
+ const durationMs = performance.now() - start;
44
+ recordTiming(name, command, durationMs);
45
+ recordMemory(name, command);
46
+ return { result, durationMs };
47
+ }
48
+ /**
49
+ * Measure sync function execution time
50
+ */
51
+ export function measureSync(name, command, fn) {
52
+ const start = performance.now();
53
+ const result = fn();
54
+ const durationMs = performance.now() - start;
55
+ recordTiming(name, command, durationMs);
56
+ recordMemory(name, command);
57
+ return { result, durationMs };
58
+ }
59
+ /**
60
+ * Calculate percentile statistics for an array of numbers
61
+ */
62
+ function calculateStats(values) {
63
+ if (values.length === 0) {
64
+ return { min: 0, max: 0, median: 0, mean: 0, p95: 0, p99: 0, count: 0 };
65
+ }
66
+ const sorted = [...values].sort((a, b) => a - b);
67
+ const sum = sorted.reduce((a, b) => a + b, 0);
68
+ const percentile = (p) => {
69
+ const index = Math.ceil((p / 100) * sorted.length) - 1;
70
+ return sorted[Math.max(0, index)] ?? 0;
71
+ };
72
+ return {
73
+ min: sorted[0] ?? 0,
74
+ max: sorted[sorted.length - 1] ?? 0,
75
+ median: percentile(50),
76
+ mean: Math.round((sum / sorted.length) * 100) / 100,
77
+ p95: percentile(95),
78
+ p99: percentile(99),
79
+ count: sorted.length,
80
+ };
81
+ }
82
+ /**
83
+ * Group metrics by command category
84
+ */
85
+ function groupByCategory(metrics) {
86
+ const groups = {};
87
+ for (const metric of metrics) {
88
+ // Extract category from command (e.g., "skillsmith search" -> "search")
89
+ const parts = metric.command.split(' ');
90
+ const category = (parts.length > 1 ? parts[1] : parts[0]) ?? 'unknown';
91
+ if (!groups[category]) {
92
+ groups[category] = [];
93
+ }
94
+ groups[category].push(metric);
95
+ }
96
+ return groups;
97
+ }
98
+ /**
99
+ * Generate baseline report from collected metrics
100
+ */
101
+ export function generateBaselineReport() {
102
+ const timingGroups = groupByCategory(timingMetrics);
103
+ const baselines = {};
104
+ // Calculate timing baselines per category
105
+ for (const [category, metrics] of Object.entries(timingGroups)) {
106
+ const durations = metrics.map((m) => m.durationMs);
107
+ baselines[category] = {
108
+ timing: calculateStats(durations),
109
+ };
110
+ }
111
+ // Calculate overall memory baseline
112
+ if (memoryMetrics.length > 0) {
113
+ const heapUsed = memoryMetrics.map((m) => m.heapUsedMB);
114
+ baselines['memory'] = {
115
+ heapUsedMB: calculateStats(heapUsed),
116
+ peakHeapMB: Math.max(...heapUsed),
117
+ };
118
+ }
119
+ return {
120
+ timestamp: new Date().toISOString(),
121
+ environment: {
122
+ type: process.env['SKILLSMITH_E2E'] ? 'codespace' : 'local',
123
+ nodeVersion: process.version,
124
+ platform: process.platform,
125
+ arch: process.arch,
126
+ },
127
+ baselines,
128
+ rawMetrics: {
129
+ timing: timingMetrics,
130
+ memory: memoryMetrics,
131
+ },
132
+ };
133
+ }
134
+ /**
135
+ * Export baseline report as JSON
136
+ */
137
+ export function exportBaselineJSON() {
138
+ return JSON.stringify(generateBaselineReport(), null, 2);
139
+ }
140
+ /**
141
+ * Export baseline report as Markdown
142
+ */
143
+ export function exportBaselineMarkdown() {
144
+ const report = generateBaselineReport();
145
+ const lines = [];
146
+ lines.push('# Performance Baseline Report');
147
+ lines.push('');
148
+ lines.push(`**Generated**: ${report.timestamp}`);
149
+ lines.push('');
150
+ lines.push('## Environment');
151
+ lines.push('');
152
+ lines.push(`- **Type**: ${report.environment.type}`);
153
+ lines.push(`- **Node Version**: ${report.environment.nodeVersion}`);
154
+ lines.push(`- **Platform**: ${report.environment.platform}-${report.environment.arch}`);
155
+ lines.push('');
156
+ lines.push('## Timing Baselines');
157
+ lines.push('');
158
+ lines.push('| Command | Median (ms) | P95 (ms) | P99 (ms) | Count |');
159
+ lines.push('|---------|-------------|----------|----------|-------|');
160
+ for (const [category, metrics] of Object.entries(report.baselines)) {
161
+ if (category === 'memory')
162
+ continue;
163
+ const timing = metrics.timing;
164
+ lines.push(`| ${category} | ${timing.median.toFixed(1)} | ${timing.p95.toFixed(1)} | ${timing.p99.toFixed(1)} | ${timing.count} |`);
165
+ }
166
+ lines.push('');
167
+ if (report.baselines['memory']) {
168
+ lines.push('## Memory Baselines');
169
+ lines.push('');
170
+ const mem = report.baselines['memory'];
171
+ const heapStats = mem.heapUsedMB;
172
+ lines.push(`- **Median Heap Used**: ${heapStats.median.toFixed(1)} MB`);
173
+ lines.push(`- **P95 Heap Used**: ${heapStats.p95.toFixed(1)} MB`);
174
+ lines.push(`- **Peak Heap**: ${mem.peakHeapMB} MB`);
175
+ lines.push('');
176
+ }
177
+ lines.push('## Raw Metrics');
178
+ lines.push('');
179
+ lines.push(`Total timing samples: ${report.rawMetrics.timing.length}`);
180
+ lines.push(`Total memory samples: ${report.rawMetrics.memory.length}`);
181
+ lines.push('');
182
+ return lines.join('\n');
183
+ }
184
+ /**
185
+ * Clear all collected metrics (for test isolation)
186
+ */
187
+ export function clearMetrics() {
188
+ timingMetrics.length = 0;
189
+ memoryMetrics.length = 0;
190
+ }
191
+ /**
192
+ * Get current metrics count
193
+ */
194
+ export function getMetricsCount() {
195
+ return {
196
+ timing: timingMetrics.length,
197
+ memory: memoryMetrics.length,
198
+ };
199
+ }
200
+ export default {
201
+ recordTiming,
202
+ recordMemory,
203
+ measureAsync,
204
+ measureSync,
205
+ generateBaselineReport,
206
+ exportBaselineJSON,
207
+ exportBaselineMarkdown,
208
+ clearMetrics,
209
+ getMetricsCount,
210
+ };
211
+ //# sourceMappingURL=baseline-collector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"baseline-collector.js","sourceRoot":"","sources":["../../../../tests/e2e/utils/baseline-collector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Hardcoded Value Detection Utility
3
+ *
4
+ * Scans command output and file contents for hardcoded values that
5
+ * would fail in clean environments (Codespaces).
6
+ *
7
+ * @see docs/testing/e2e-testing-plan.md
8
+ */
9
+ export interface HardcodedIssue {
10
+ type: 'path' | 'url' | 'credential' | 'env_assumption';
11
+ pattern: string;
12
+ value: string;
13
+ location: {
14
+ source: 'stdout' | 'stderr' | 'file' | 'database';
15
+ context?: string | undefined;
16
+ line?: number | undefined;
17
+ };
18
+ command: string;
19
+ timestamp: string;
20
+ severity: 'error' | 'warning';
21
+ }
22
+ export interface DetectionResult {
23
+ passed: boolean;
24
+ issues: HardcodedIssue[];
25
+ scannedBytes: number;
26
+ scanDurationMs: number;
27
+ }
28
+ /**
29
+ * Scan text content for hardcoded values
30
+ */
31
+ export declare function scanForHardcoded(content: string, command: string, source: 'stdout' | 'stderr' | 'file' | 'database', context?: string): HardcodedIssue[];
32
+ /**
33
+ * Scan command execution result for hardcoded values
34
+ */
35
+ export declare function scanCommandOutput(stdout: string, stderr: string, command: string): DetectionResult;
36
+ /**
37
+ * Create a summary report of detected issues
38
+ */
39
+ export declare function createDetectionReport(results: DetectionResult[]): string;
40
+ declare const _default: {
41
+ scanForHardcoded: typeof scanForHardcoded;
42
+ scanCommandOutput: typeof scanCommandOutput;
43
+ createDetectionReport: typeof createDetectionReport;
44
+ };
45
+ export default _default;
46
+ //# sourceMappingURL=hardcoded-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hardcoded-detector.d.ts","sourceRoot":"","sources":["../../../../tests/e2e/utils/hardcoded-detector.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,YAAY,GAAG,gBAAgB,CAAA;IACtD,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE;QACR,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAA;QACjD,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,CAAA;IACD,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAA;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAA;IACf,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,cAAc,EAAE,MAAM,CAAA;CACvB;AA0HD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,EACjD,OAAO,CAAC,EAAE,MAAM,GACf,cAAc,EAAE,CA0ElB;AAUD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GACd,eAAe,CAajB;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,eAAe,EAAE,GAAG,MAAM,CA4CxE;;;;;;AAED,wBAIC"}
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Hardcoded Value Detection Utility
3
+ *
4
+ * Scans command output and file contents for hardcoded values that
5
+ * would fail in clean environments (Codespaces).
6
+ *
7
+ * @see docs/testing/e2e-testing-plan.md
8
+ */
9
+ /**
10
+ * Patterns for detecting hardcoded values
11
+ */
12
+ const DETECTION_PATTERNS = {
13
+ // User-specific paths (high severity)
14
+ userPaths: [
15
+ { pattern: /\/Users\/[a-zA-Z0-9_-]+\//g, name: 'macOS user path' },
16
+ { pattern: /\/home\/[a-zA-Z0-9_-]+\//g, name: 'Linux user path' },
17
+ { pattern: /C:\\Users\\[a-zA-Z0-9_-]+\\/g, name: 'Windows user path' },
18
+ { pattern: /~\/(?!\.claude)/g, name: 'Home directory shorthand' },
19
+ ],
20
+ // Localhost/dev URLs (medium severity)
21
+ devUrls: [
22
+ { pattern: /localhost:\d+/g, name: 'localhost with port' },
23
+ { pattern: /127\.0\.0\.1(:\d+)?/g, name: 'IPv4 loopback' },
24
+ { pattern: /0\.0\.0\.0(:\d+)?/g, name: 'All interfaces bind' },
25
+ { pattern: /\[::1\](:\d+)?/g, name: 'IPv6 loopback' },
26
+ ],
27
+ // Hardcoded credentials (critical severity)
28
+ credentials: [
29
+ // AI & LLM Services
30
+ { pattern: /sk-[a-zA-Z0-9]{32,}(?![a-zA-Z0-9])/g, name: 'OpenAI API key' },
31
+ { pattern: /sk-ant-[a-zA-Z0-9-]+/g, name: 'Anthropic API key' },
32
+ // Version Control & Collaboration
33
+ { pattern: /ghp_[a-zA-Z0-9]{36}/g, name: 'GitHub personal token' },
34
+ { pattern: /gho_[a-zA-Z0-9]{36}/g, name: 'GitHub OAuth token' },
35
+ { pattern: /ghu_[a-zA-Z0-9]{36}/g, name: 'GitHub user-to-server token' },
36
+ { pattern: /ghs_[a-zA-Z0-9]{36}/g, name: 'GitHub server-to-server token' },
37
+ { pattern: /lin_api_[a-zA-Z0-9]+/g, name: 'Linear API key' },
38
+ // Communication Platforms
39
+ { pattern: /xoxb-[a-zA-Z0-9-]+/g, name: 'Slack bot token' },
40
+ { pattern: /xoxp-[a-zA-Z0-9-]+/g, name: 'Slack user token' },
41
+ { pattern: /xoxa-[a-zA-Z0-9-]+/g, name: 'Slack app token' },
42
+ // Payment Processing
43
+ { pattern: /sk_live_[a-zA-Z0-9]{24,}/g, name: 'Stripe secret key (live)' },
44
+ { pattern: /sk_test_[a-zA-Z0-9]{24,}/g, name: 'Stripe secret key (test)' },
45
+ { pattern: /pk_live_[a-zA-Z0-9]{24,}/g, name: 'Stripe publishable key (live)' },
46
+ { pattern: /pk_test_[a-zA-Z0-9]{24,}/g, name: 'Stripe publishable key (test)' },
47
+ { pattern: /rk_live_[a-zA-Z0-9]{24,}/g, name: 'Stripe restricted API key (live)' },
48
+ { pattern: /rk_test_[a-zA-Z0-9]{24,}/g, name: 'Stripe restricted API key (test)' },
49
+ // Cloud Platforms
50
+ { pattern: /AKIA[0-9A-Z]{16}/g, name: 'AWS access key ID' },
51
+ { pattern: /aws_secret_access_key\s*=\s*[a-zA-Z0-9/+=]{40}/g, name: 'AWS secret access key' },
52
+ // Email & Communication Services
53
+ { pattern: /SG\.[a-zA-Z0-9_-]{60,}/g, name: 'SendGrid API key' },
54
+ // Telecommunications
55
+ { pattern: /SK[a-f0-9]{32}/g, name: 'Twilio auth token' },
56
+ { pattern: /AC[a-f0-9]{32}/g, name: 'Twilio account SID' },
57
+ // Authentication & Tokens
58
+ {
59
+ pattern: /eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g,
60
+ name: 'JWT token',
61
+ },
62
+ // Generic Credential Patterns (lower confidence - check context)
63
+ { pattern: /password\s*=\s*[^\s;'"`]+(?![.\w])/g, name: 'Hardcoded password assignment' },
64
+ { pattern: /secret\s*=\s*[^\s;'"`]{12,}/g, name: 'Hardcoded secret assignment' },
65
+ { pattern: /api[_-]?key\s*=\s*[^\s;'"`]{16,}/gi, name: 'Hardcoded API key assignment' },
66
+ { pattern: /token\s*=\s*[^\s;'"`]{32,}/g, name: 'Hardcoded token assignment' },
67
+ // Database Connection Strings with Passwords
68
+ {
69
+ pattern: /(?:postgres|postgresql):\/\/[^@]+:[^@]+@[^\s'"`]+/g,
70
+ name: 'PostgreSQL connection string with password',
71
+ },
72
+ {
73
+ pattern: /(?:mysql|mariadb):\/\/[^@]+:[^@]+@[^\s'"`]+/g,
74
+ name: 'MySQL connection string with password',
75
+ },
76
+ {
77
+ pattern: /(?:mongodb|mongodb\+srv):\/\/[^@]+:[^@]+@[^\s'"`]+/g,
78
+ name: 'MongoDB connection string with password',
79
+ },
80
+ {
81
+ pattern: /sqlserver:\/\/[^;]*password=[^;]+/gi,
82
+ name: 'SQL Server connection string with password',
83
+ },
84
+ ],
85
+ // Environment assumptions (medium severity)
86
+ envAssumptions: [
87
+ { pattern: /\.skillsmith\/skills\.db(?!['"])/g, name: 'Hardcoded DB path' },
88
+ { pattern: /\/tmp\/skillsmith(?!-e2e)/g, name: 'Hardcoded temp path' },
89
+ ],
90
+ };
91
+ // Allowlist for known safe patterns (e.g., in security tests, documentation, examples)
92
+ const ALLOWLIST_CONTEXTS = [
93
+ 'security.test',
94
+ 'validation.test',
95
+ '.security.test',
96
+ 'RawUrlSourceAdapter',
97
+ 'example',
98
+ 'mock',
99
+ 'stub',
100
+ 'fixture',
101
+ 'README',
102
+ 'EXAMPLE',
103
+ 'documentation',
104
+ 'docs',
105
+ '.md',
106
+ ];
107
+ /**
108
+ * Check if a match should be allowed based on context
109
+ */
110
+ function isAllowlisted(context) {
111
+ if (!context)
112
+ return false;
113
+ return ALLOWLIST_CONTEXTS.some((allowed) => context.includes(allowed));
114
+ }
115
+ /**
116
+ * Scan text content for hardcoded values
117
+ */
118
+ export function scanForHardcoded(content, command, source, context) {
119
+ const issues = [];
120
+ const timestamp = new Date().toISOString();
121
+ // Skip allowlisted contexts
122
+ if (isAllowlisted(context)) {
123
+ return issues;
124
+ }
125
+ // Scan for user paths
126
+ for (const { pattern, name } of DETECTION_PATTERNS.userPaths) {
127
+ const matches = content.matchAll(pattern);
128
+ for (const match of matches) {
129
+ issues.push({
130
+ type: 'path',
131
+ pattern: name,
132
+ value: match[0],
133
+ location: { source, context },
134
+ command,
135
+ timestamp,
136
+ severity: 'error',
137
+ });
138
+ }
139
+ }
140
+ // Scan for dev URLs
141
+ for (const { pattern, name } of DETECTION_PATTERNS.devUrls) {
142
+ const matches = content.matchAll(pattern);
143
+ for (const match of matches) {
144
+ issues.push({
145
+ type: 'url',
146
+ pattern: name,
147
+ value: match[0],
148
+ location: { source, context },
149
+ command,
150
+ timestamp,
151
+ severity: 'warning',
152
+ });
153
+ }
154
+ }
155
+ // Scan for credentials
156
+ for (const { pattern, name } of DETECTION_PATTERNS.credentials) {
157
+ const matches = content.matchAll(pattern);
158
+ for (const match of matches) {
159
+ issues.push({
160
+ type: 'credential',
161
+ pattern: name,
162
+ value: maskCredential(match[0]),
163
+ location: { source, context },
164
+ command,
165
+ timestamp,
166
+ severity: 'error',
167
+ });
168
+ }
169
+ }
170
+ // Scan for environment assumptions
171
+ for (const { pattern, name } of DETECTION_PATTERNS.envAssumptions) {
172
+ const matches = content.matchAll(pattern);
173
+ for (const match of matches) {
174
+ issues.push({
175
+ type: 'env_assumption',
176
+ pattern: name,
177
+ value: match[0],
178
+ location: { source, context },
179
+ command,
180
+ timestamp,
181
+ severity: 'warning',
182
+ });
183
+ }
184
+ }
185
+ return issues;
186
+ }
187
+ /**
188
+ * Mask sensitive credential values for safe logging
189
+ */
190
+ function maskCredential(value) {
191
+ if (value.length <= 8)
192
+ return '***';
193
+ return value.substring(0, 4) + '***' + value.substring(value.length - 4);
194
+ }
195
+ /**
196
+ * Scan command execution result for hardcoded values
197
+ */
198
+ export function scanCommandOutput(stdout, stderr, command) {
199
+ const startTime = Date.now();
200
+ const issues = [];
201
+ issues.push(...scanForHardcoded(stdout, command, 'stdout'));
202
+ issues.push(...scanForHardcoded(stderr, command, 'stderr'));
203
+ return {
204
+ passed: issues.filter((i) => i.severity === 'error').length === 0,
205
+ issues,
206
+ scannedBytes: stdout.length + stderr.length,
207
+ scanDurationMs: Date.now() - startTime,
208
+ };
209
+ }
210
+ /**
211
+ * Create a summary report of detected issues
212
+ */
213
+ export function createDetectionReport(results) {
214
+ const allIssues = results.flatMap((r) => r.issues);
215
+ const errors = allIssues.filter((i) => i.severity === 'error');
216
+ const warnings = allIssues.filter((i) => i.severity === 'warning');
217
+ const lines = [
218
+ '# Hardcoded Value Detection Report',
219
+ '',
220
+ `**Scan Time**: ${new Date().toISOString()}`,
221
+ `**Total Scanned**: ${results.reduce((sum, r) => sum + r.scannedBytes, 0)} bytes`,
222
+ '',
223
+ '## Summary',
224
+ '',
225
+ `- **Errors**: ${errors.length}`,
226
+ `- **Warnings**: ${warnings.length}`,
227
+ `- **Status**: ${errors.length === 0 ? 'PASSED' : 'FAILED'}`,
228
+ '',
229
+ ];
230
+ if (errors.length > 0) {
231
+ lines.push('## Errors (Must Fix)', '');
232
+ lines.push('| Type | Pattern | Value | Command | Source |');
233
+ lines.push('|------|---------|-------|---------|--------|');
234
+ for (const issue of errors) {
235
+ lines.push(`| ${issue.type} | ${issue.pattern} | \`${issue.value}\` | ${issue.command} | ${issue.location.source} |`);
236
+ }
237
+ lines.push('');
238
+ }
239
+ if (warnings.length > 0) {
240
+ lines.push('## Warnings (Review Required)', '');
241
+ lines.push('| Type | Pattern | Value | Command | Source |');
242
+ lines.push('|------|---------|-------|---------|--------|');
243
+ for (const issue of warnings) {
244
+ lines.push(`| ${issue.type} | ${issue.pattern} | \`${issue.value}\` | ${issue.command} | ${issue.location.source} |`);
245
+ }
246
+ lines.push('');
247
+ }
248
+ return lines.join('\n');
249
+ }
250
+ export default {
251
+ scanForHardcoded,
252
+ scanCommandOutput,
253
+ createDetectionReport,
254
+ };
255
+ //# sourceMappingURL=hardcoded-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hardcoded-detector.js","sourceRoot":"","sources":["../../../../tests/e2e/utils/hardcoded-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * E2E Test Utilities Index
3
+ */
4
+ export * from './hardcoded-detector.js';
5
+ export * from './linear-reporter.js';
6
+ export * from './baseline-collector.js';
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../tests/e2e/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * E2E Test Utilities Index
3
+ */
4
+ export * from './hardcoded-detector.js';
5
+ export * from './linear-reporter.js';
6
+ export * from './baseline-collector.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../tests/e2e/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,yBAAyB,CAAA;AACvC,cAAc,sBAAsB,CAAA;AACpC,cAAc,yBAAyB,CAAA"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Linear Issue Reporter for E2E Test Failures
3
+ *
4
+ * Automatically creates Linear issues when E2E tests detect problems.
5
+ * Issues include detailed evidence for specialist agents to resolve.
6
+ *
7
+ * @see docs/testing/e2e-testing-plan.md
8
+ */
9
+ import type { HardcodedIssue } from './hardcoded-detector.js';
10
+ export interface LinearIssuePayload {
11
+ title: string;
12
+ description: string;
13
+ teamId?: string;
14
+ projectId?: string;
15
+ labelIds?: string[];
16
+ priority?: number;
17
+ estimate?: number;
18
+ }
19
+ export interface LinearIssueResult {
20
+ success: boolean;
21
+ issueId?: string;
22
+ issueUrl?: string;
23
+ error?: string;
24
+ }
25
+ export interface TestFailure {
26
+ testName: string;
27
+ testFile: string;
28
+ command: string;
29
+ error: string;
30
+ stdout?: string;
31
+ stderr?: string;
32
+ hardcodedIssues?: HardcodedIssue[];
33
+ duration?: number;
34
+ timestamp: string;
35
+ }
36
+ /**
37
+ * Create Linear issue description from test failure
38
+ */
39
+ export declare function createIssueDescription(failure: TestFailure): string;
40
+ /**
41
+ * Create Linear issue title from test failure
42
+ */
43
+ export declare function createIssueTitle(failure: TestFailure): string;
44
+ /**
45
+ * Create Linear issue via API
46
+ */
47
+ export declare function createLinearIssue(failure: TestFailure): Promise<LinearIssueResult>;
48
+ export declare function queueIssue(failure: TestFailure): void;
49
+ export declare function getQueuedIssues(): TestFailure[];
50
+ export declare function flushIssueQueue(): Promise<LinearIssueResult[]>;
51
+ declare const _default: {
52
+ createIssueDescription: typeof createIssueDescription;
53
+ createIssueTitle: typeof createIssueTitle;
54
+ createLinearIssue: typeof createLinearIssue;
55
+ queueIssue: typeof queueIssue;
56
+ getQueuedIssues: typeof getQueuedIssues;
57
+ flushIssueQueue: typeof flushIssueQueue;
58
+ };
59
+ export default _default;
60
+ //# sourceMappingURL=linear-reporter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-reporter.d.ts","sourceRoot":"","sources":["../../../../tests/e2e/utils/linear-reporter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAE7D,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,eAAe,CAAC,EAAE,cAAc,EAAE,CAAA;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAyBD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CA0FnE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAM7D;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4FxF;AAOD,wBAAgB,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAErD;AAED,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAE/C;AAED,wBAAsB,eAAe,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAepE;;;;;;;;;AAED,wBAOC"}