@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.
- package/dist/.tsbuildinfo +1 -0
- package/dist/src/__tests__/get-skill.test.d.ts +6 -0
- package/dist/src/__tests__/get-skill.test.d.ts.map +1 -0
- package/dist/src/__tests__/get-skill.test.js +88 -0
- package/dist/src/__tests__/get-skill.test.js.map +1 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.d.ts +7 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.js +304 -0
- package/dist/src/__tests__/middleware/errorFormatter.test.js.map +1 -0
- package/dist/src/__tests__/middleware/license.test.d.ts +7 -0
- package/dist/src/__tests__/middleware/license.test.d.ts.map +1 -0
- package/dist/src/__tests__/middleware/license.test.js +500 -0
- package/dist/src/__tests__/middleware/license.test.js.map +1 -0
- package/dist/src/__tests__/search.test.d.ts +6 -0
- package/dist/src/__tests__/search.test.d.ts.map +1 -0
- package/dist/src/__tests__/search.test.js +86 -0
- package/dist/src/__tests__/search.test.js.map +1 -0
- package/dist/src/__tests__/test-utils.d.ts +19 -0
- package/dist/src/__tests__/test-utils.d.ts.map +1 -0
- package/dist/src/__tests__/test-utils.js +87 -0
- package/dist/src/__tests__/test-utils.js.map +1 -0
- package/dist/src/context/index.d.ts +19 -0
- package/dist/src/context/index.d.ts.map +1 -0
- package/dist/src/context/index.js +25 -0
- package/dist/src/context/index.js.map +1 -0
- package/dist/src/context/project-detector.d.ts +145 -0
- package/dist/src/context/project-detector.d.ts.map +1 -0
- package/dist/src/context/project-detector.js +321 -0
- package/dist/src/context/project-detector.js.map +1 -0
- package/dist/src/context.d.ts +100 -0
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +157 -0
- package/dist/src/context.js.map +1 -0
- package/dist/src/core-shim.d.ts +7 -0
- package/dist/src/core-shim.d.ts.map +1 -0
- package/dist/src/core-shim.js +9 -0
- package/dist/src/core-shim.js.map +1 -0
- package/dist/src/health/healthCheck.d.ts +88 -0
- package/dist/src/health/healthCheck.d.ts.map +1 -0
- package/dist/src/health/healthCheck.js +117 -0
- package/dist/src/health/healthCheck.js.map +1 -0
- package/dist/src/health/index.d.ts +21 -0
- package/dist/src/health/index.d.ts.map +1 -0
- package/dist/src/health/index.js +21 -0
- package/dist/src/health/index.js.map +1 -0
- package/dist/src/health/readinessCheck.d.ts +139 -0
- package/dist/src/health/readinessCheck.d.ts.map +1 -0
- package/dist/src/health/readinessCheck.js +266 -0
- package/dist/src/health/readinessCheck.js.map +1 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +178 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/index.test.d.ts +2 -0
- package/dist/src/index.test.d.ts.map +1 -0
- package/dist/src/index.test.js +43 -0
- package/dist/src/index.test.js.map +1 -0
- package/dist/src/logger.d.ts +26 -0
- package/dist/src/logger.d.ts.map +1 -0
- package/dist/src/logger.js +179 -0
- package/dist/src/logger.js.map +1 -0
- package/dist/src/middleware/__tests__/csp.test.d.ts +2 -0
- package/dist/src/middleware/__tests__/csp.test.d.ts.map +1 -0
- package/dist/src/middleware/__tests__/csp.test.js +389 -0
- package/dist/src/middleware/__tests__/csp.test.js.map +1 -0
- package/dist/src/middleware/csp.d.ts +87 -0
- package/dist/src/middleware/csp.d.ts.map +1 -0
- package/dist/src/middleware/csp.js +273 -0
- package/dist/src/middleware/csp.js.map +1 -0
- package/dist/src/middleware/degradation.d.ts +99 -0
- package/dist/src/middleware/degradation.d.ts.map +1 -0
- package/dist/src/middleware/degradation.js +315 -0
- package/dist/src/middleware/degradation.js.map +1 -0
- package/dist/src/middleware/errorFormatter.d.ts +119 -0
- package/dist/src/middleware/errorFormatter.d.ts.map +1 -0
- package/dist/src/middleware/errorFormatter.js +294 -0
- package/dist/src/middleware/errorFormatter.js.map +1 -0
- package/dist/src/middleware/index.d.ts +10 -0
- package/dist/src/middleware/index.d.ts.map +1 -0
- package/dist/src/middleware/index.js +14 -0
- package/dist/src/middleware/index.js.map +1 -0
- package/dist/src/middleware/license.d.ts +161 -0
- package/dist/src/middleware/license.d.ts.map +1 -0
- package/dist/src/middleware/license.js +281 -0
- package/dist/src/middleware/license.js.map +1 -0
- package/dist/src/middleware/toolFeatureMapping.d.ts +36 -0
- package/dist/src/middleware/toolFeatureMapping.d.ts.map +1 -0
- package/dist/src/middleware/toolFeatureMapping.js +90 -0
- package/dist/src/middleware/toolFeatureMapping.js.map +1 -0
- package/dist/src/onboarding/first-run.d.ts +64 -0
- package/dist/src/onboarding/first-run.d.ts.map +1 -0
- package/dist/src/onboarding/first-run.js +77 -0
- package/dist/src/onboarding/first-run.js.map +1 -0
- package/dist/src/onboarding/index.d.ts +7 -0
- package/dist/src/onboarding/index.d.ts.map +1 -0
- package/dist/src/onboarding/index.js +7 -0
- package/dist/src/onboarding/index.js.map +1 -0
- package/dist/src/suggestions/index.d.ts +21 -0
- package/dist/src/suggestions/index.d.ts.map +1 -0
- package/dist/src/suggestions/index.js +20 -0
- package/dist/src/suggestions/index.js.map +1 -0
- package/dist/src/suggestions/suggestion-engine.d.ts +185 -0
- package/dist/src/suggestions/suggestion-engine.d.ts.map +1 -0
- package/dist/src/suggestions/suggestion-engine.js +352 -0
- package/dist/src/suggestions/suggestion-engine.js.map +1 -0
- package/dist/src/suggestions/types.d.ts +88 -0
- package/dist/src/suggestions/types.d.ts.map +1 -0
- package/dist/src/suggestions/types.js +21 -0
- package/dist/src/suggestions/types.js.map +1 -0
- package/dist/src/tools/analyze.d.ts +151 -0
- package/dist/src/tools/analyze.d.ts.map +1 -0
- package/dist/src/tools/analyze.js +205 -0
- package/dist/src/tools/analyze.js.map +1 -0
- package/dist/src/tools/compare.d.ts +149 -0
- package/dist/src/tools/compare.d.ts.map +1 -0
- package/dist/src/tools/compare.js +464 -0
- package/dist/src/tools/compare.js.map +1 -0
- package/dist/src/tools/get-skill.d.ts +116 -0
- package/dist/src/tools/get-skill.d.ts.map +1 -0
- package/dist/src/tools/get-skill.js +224 -0
- package/dist/src/tools/get-skill.js.map +1 -0
- package/dist/src/tools/index.d.ts +20 -0
- package/dist/src/tools/index.d.ts.map +1 -0
- package/dist/src/tools/index.js +20 -0
- package/dist/src/tools/index.js.map +1 -0
- package/dist/src/tools/install.d.ts +122 -0
- package/dist/src/tools/install.d.ts.map +1 -0
- package/dist/src/tools/install.js +314 -0
- package/dist/src/tools/install.js.map +1 -0
- package/dist/src/tools/recommend.d.ts +171 -0
- package/dist/src/tools/recommend.d.ts.map +1 -0
- package/dist/src/tools/recommend.js +325 -0
- package/dist/src/tools/recommend.js.map +1 -0
- package/dist/src/tools/search.d.ts +121 -0
- package/dist/src/tools/search.d.ts.map +1 -0
- package/dist/src/tools/search.js +249 -0
- package/dist/src/tools/search.js.map +1 -0
- package/dist/src/tools/suggest.d.ts +181 -0
- package/dist/src/tools/suggest.d.ts.map +1 -0
- package/dist/src/tools/suggest.js +342 -0
- package/dist/src/tools/suggest.js.map +1 -0
- package/dist/src/tools/uninstall.d.ts +123 -0
- package/dist/src/tools/uninstall.d.ts.map +1 -0
- package/dist/src/tools/uninstall.js +250 -0
- package/dist/src/tools/uninstall.js.map +1 -0
- package/dist/src/tools/validate.d.ts +122 -0
- package/dist/src/tools/validate.d.ts.map +1 -0
- package/dist/src/tools/validate.js +497 -0
- package/dist/src/tools/validate.js.map +1 -0
- package/dist/src/utils/installed-skills.d.ts +101 -0
- package/dist/src/utils/installed-skills.d.ts.map +1 -0
- package/dist/src/utils/installed-skills.js +220 -0
- package/dist/src/utils/installed-skills.js.map +1 -0
- package/dist/src/utils/validation.d.ts +76 -0
- package/dist/src/utils/validation.d.ts.map +1 -0
- package/dist/src/utils/validation.js +153 -0
- package/dist/src/utils/validation.js.map +1 -0
- package/dist/src/webhooks/index.d.ts +8 -0
- package/dist/src/webhooks/index.d.ts.map +1 -0
- package/dist/src/webhooks/index.js +9 -0
- package/dist/src/webhooks/index.js.map +1 -0
- package/dist/src/webhooks/webhook-endpoint.d.ts +149 -0
- package/dist/src/webhooks/webhook-endpoint.d.ts.map +1 -0
- package/dist/src/webhooks/webhook-endpoint.js +339 -0
- package/dist/src/webhooks/webhook-endpoint.js.map +1 -0
- package/dist/tests/compare.test.d.ts +6 -0
- package/dist/tests/compare.test.d.ts.map +1 -0
- package/dist/tests/compare.test.js +225 -0
- package/dist/tests/compare.test.js.map +1 -0
- package/dist/tests/context/project-detector.test.d.ts +6 -0
- package/dist/tests/context/project-detector.test.d.ts.map +1 -0
- package/dist/tests/context/project-detector.test.js +719 -0
- package/dist/tests/context/project-detector.test.js.map +1 -0
- package/dist/tests/e2e/compare.e2e.test.d.ts +10 -0
- package/dist/tests/e2e/compare.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/compare.e2e.test.js +286 -0
- package/dist/tests/e2e/compare.e2e.test.js.map +1 -0
- package/dist/tests/e2e/install-flow.e2e.test.d.ts +10 -0
- package/dist/tests/e2e/install-flow.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/install-flow.e2e.test.js +209 -0
- package/dist/tests/e2e/install-flow.e2e.test.js.map +1 -0
- package/dist/tests/e2e/recommend.e2e.test.d.ts +12 -0
- package/dist/tests/e2e/recommend.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/recommend.e2e.test.js +347 -0
- package/dist/tests/e2e/recommend.e2e.test.js.map +1 -0
- package/dist/tests/e2e/skill-flow.e2e.test.d.ts +10 -0
- package/dist/tests/e2e/skill-flow.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/skill-flow.e2e.test.js +280 -0
- package/dist/tests/e2e/skill-flow.e2e.test.js.map +1 -0
- package/dist/tests/e2e/suggest.e2e.test.d.ts +13 -0
- package/dist/tests/e2e/suggest.e2e.test.d.ts.map +1 -0
- package/dist/tests/e2e/suggest.e2e.test.js +347 -0
- package/dist/tests/e2e/suggest.e2e.test.js.map +1 -0
- package/dist/tests/e2e/utils/baseline-collector.d.ts +107 -0
- package/dist/tests/e2e/utils/baseline-collector.d.ts.map +1 -0
- package/dist/tests/e2e/utils/baseline-collector.js +211 -0
- package/dist/tests/e2e/utils/baseline-collector.js.map +1 -0
- package/dist/tests/e2e/utils/hardcoded-detector.d.ts +46 -0
- package/dist/tests/e2e/utils/hardcoded-detector.d.ts.map +1 -0
- package/dist/tests/e2e/utils/hardcoded-detector.js +255 -0
- package/dist/tests/e2e/utils/hardcoded-detector.js.map +1 -0
- package/dist/tests/e2e/utils/index.d.ts +7 -0
- package/dist/tests/e2e/utils/index.d.ts.map +1 -0
- package/dist/tests/e2e/utils/index.js +7 -0
- package/dist/tests/e2e/utils/index.js.map +1 -0
- package/dist/tests/e2e/utils/linear-reporter.d.ts +60 -0
- package/dist/tests/e2e/utils/linear-reporter.d.ts.map +1 -0
- package/dist/tests/e2e/utils/linear-reporter.js +232 -0
- package/dist/tests/e2e/utils/linear-reporter.js.map +1 -0
- package/dist/tests/health.test.d.ts +9 -0
- package/dist/tests/health.test.d.ts.map +1 -0
- package/dist/tests/health.test.js +308 -0
- package/dist/tests/health.test.js.map +1 -0
- package/dist/tests/integration/analyze.integration.test.d.ts +2 -0
- package/dist/tests/integration/analyze.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/analyze.integration.test.js +244 -0
- package/dist/tests/integration/analyze.integration.test.js.map +1 -0
- package/dist/tests/integration/compare.integration.test.d.ts +2 -0
- package/dist/tests/integration/compare.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/compare.integration.test.js +120 -0
- package/dist/tests/integration/compare.integration.test.js.map +1 -0
- package/dist/tests/integration/fixtures/test-skills.d.ts +62 -0
- package/dist/tests/integration/fixtures/test-skills.d.ts.map +1 -0
- package/dist/tests/integration/fixtures/test-skills.js +644 -0
- package/dist/tests/integration/fixtures/test-skills.js.map +1 -0
- package/dist/tests/integration/get-skill.integration.test.d.ts +6 -0
- package/dist/tests/integration/get-skill.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/get-skill.integration.test.js +203 -0
- package/dist/tests/integration/get-skill.integration.test.js.map +1 -0
- package/dist/tests/integration/github-api.integration.test.d.ts +14 -0
- package/dist/tests/integration/github-api.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/github-api.integration.test.js +190 -0
- package/dist/tests/integration/github-api.integration.test.js.map +1 -0
- package/dist/tests/integration/install.integration.test.d.ts +6 -0
- package/dist/tests/integration/install.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/install.integration.test.js +282 -0
- package/dist/tests/integration/install.integration.test.js.map +1 -0
- package/dist/tests/integration/recommend.integration.test.d.ts +2 -0
- package/dist/tests/integration/recommend.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/recommend.integration.test.js +215 -0
- package/dist/tests/integration/recommend.integration.test.js.map +1 -0
- package/dist/tests/integration/search.integration.test.d.ts +6 -0
- package/dist/tests/integration/search.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/search.integration.test.js +229 -0
- package/dist/tests/integration/search.integration.test.js.map +1 -0
- package/dist/tests/integration/setup.d.ts +71 -0
- package/dist/tests/integration/setup.d.ts.map +1 -0
- package/dist/tests/integration/setup.js +124 -0
- package/dist/tests/integration/setup.js.map +1 -0
- package/dist/tests/integration/uninstall.integration.test.d.ts +6 -0
- package/dist/tests/integration/uninstall.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/uninstall.integration.test.js +296 -0
- package/dist/tests/integration/uninstall.integration.test.js.map +1 -0
- package/dist/tests/integration/validate.integration.test.d.ts +2 -0
- package/dist/tests/integration/validate.integration.test.d.ts.map +1 -0
- package/dist/tests/integration/validate.integration.test.js +181 -0
- package/dist/tests/integration/validate.integration.test.js.map +1 -0
- package/dist/tests/onboarding/first-run.test.d.ts +7 -0
- package/dist/tests/onboarding/first-run.test.d.ts.map +1 -0
- package/dist/tests/onboarding/first-run.test.js +258 -0
- package/dist/tests/onboarding/first-run.test.js.map +1 -0
- package/dist/tests/performance/search-performance.test.d.ts +10 -0
- package/dist/tests/performance/search-performance.test.d.ts.map +1 -0
- package/dist/tests/performance/search-performance.test.js +218 -0
- package/dist/tests/performance/search-performance.test.js.map +1 -0
- package/dist/tests/recommend.test.d.ts +6 -0
- package/dist/tests/recommend.test.d.ts.map +1 -0
- package/dist/tests/recommend.test.js +208 -0
- package/dist/tests/recommend.test.js.map +1 -0
- package/dist/tests/suggestions/suggestion-engine.test.d.ts +6 -0
- package/dist/tests/suggestions/suggestion-engine.test.d.ts.map +1 -0
- package/dist/tests/suggestions/suggestion-engine.test.js +448 -0
- package/dist/tests/suggestions/suggestion-engine.test.js.map +1 -0
- package/dist/tests/test-utils.d.ts +74 -0
- package/dist/tests/test-utils.d.ts.map +1 -0
- package/dist/tests/test-utils.js +98 -0
- package/dist/tests/test-utils.js.map +1 -0
- package/dist/tests/tools.test.d.ts +5 -0
- package/dist/tests/tools.test.d.ts.map +1 -0
- package/dist/tests/tools.test.js +138 -0
- package/dist/tests/tools.test.js.map +1 -0
- package/dist/tests/unit/installed-skills.test.d.ts +6 -0
- package/dist/tests/unit/installed-skills.test.d.ts.map +1 -0
- package/dist/tests/unit/installed-skills.test.js +285 -0
- package/dist/tests/unit/installed-skills.test.js.map +1 -0
- package/dist/tests/unit/logger.test.d.ts +6 -0
- package/dist/tests/unit/logger.test.d.ts.map +1 -0
- package/dist/tests/unit/logger.test.js +281 -0
- package/dist/tests/unit/logger.test.js.map +1 -0
- package/dist/tests/validate.test.d.ts +5 -0
- package/dist/tests/validate.test.d.ts.map +1 -0
- package/dist/tests/validate.test.js +303 -0
- package/dist/tests/validate.test.js.map +1 -0
- package/dist/tests/webhooks/proxy-trust.security.test.d.ts +8 -0
- package/dist/tests/webhooks/proxy-trust.security.test.d.ts.map +1 -0
- package/dist/tests/webhooks/proxy-trust.security.test.js +145 -0
- package/dist/tests/webhooks/proxy-trust.security.test.js.map +1 -0
- package/dist/tests/webhooks/rate-limiter.security.test.d.ts +8 -0
- package/dist/tests/webhooks/rate-limiter.security.test.d.ts.map +1 -0
- package/dist/tests/webhooks/rate-limiter.security.test.js +122 -0
- package/dist/tests/webhooks/rate-limiter.security.test.js.map +1 -0
- package/dist/vitest.config.d.ts +6 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +13 -0
- package/dist/vitest.config.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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"}
|