@elench/testkit 0.1.117 → 0.1.118

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.
@@ -0,0 +1,164 @@
1
+ import crypto from "crypto";
2
+ import fs from "fs";
3
+ import path from "path";
4
+ import { execFileSync } from "child_process";
5
+ import { parseGitHubRepoSlug } from "../regressions/github.mjs";
6
+
7
+ const IGNORED_DIRS = new Set([".git", ".testkit", "node_modules"]);
8
+
9
+ export function collectRepoState(productDir) {
10
+ const repoRoot = readGit(productDir, ["rev-parse", "--show-toplevel"]);
11
+ if (!repoRoot) {
12
+ const fingerprint = fingerprintDirectory(productDir);
13
+ return {
14
+ kind: "nogit",
15
+ repoRoot: null,
16
+ worktreePath: path.resolve(productDir),
17
+ branch: null,
18
+ detached: false,
19
+ commitSha: null,
20
+ remoteUrl: null,
21
+ repoSlug: null,
22
+ dirty: false,
23
+ dirtyFingerprint: null,
24
+ contentFingerprint: fingerprint,
25
+ cacheKey: `nogit/${fingerprint}`,
26
+ };
27
+ }
28
+
29
+ const commitSha = readGit(productDir, ["rev-parse", "--verify", "HEAD"]);
30
+ const branchName = readGit(productDir, ["rev-parse", "--abbrev-ref", "HEAD"]);
31
+ const remoteUrl = readGit(productDir, ["remote", "get-url", "origin"]);
32
+ const detached = branchName === "HEAD";
33
+ const dirtyFingerprint = fingerprintGitDirtyState(productDir);
34
+ const dirty = Boolean(dirtyFingerprint);
35
+ const baseCommit = commitSha || "unborn";
36
+
37
+ return {
38
+ kind: dirty ? "dirty" : "commit",
39
+ repoRoot,
40
+ worktreePath: path.resolve(repoRoot),
41
+ branch: detached ? null : branchName,
42
+ detached,
43
+ commitSha,
44
+ remoteUrl,
45
+ repoSlug: parseGitHubRepoSlug(remoteUrl),
46
+ dirty,
47
+ dirtyFingerprint,
48
+ contentFingerprint: null,
49
+ cacheKey: dirty
50
+ ? `dirty/${baseCommit}-${dirtyFingerprint}`
51
+ : `commits/${baseCommit}`,
52
+ };
53
+ }
54
+
55
+ export function summarizeRepoStateForMetadata(repoState) {
56
+ if (!repoState) return null;
57
+ return {
58
+ kind: repoState.kind,
59
+ cacheKey: repoState.cacheKey,
60
+ branch: repoState.branch,
61
+ detached: repoState.detached,
62
+ commitSha: repoState.commitSha,
63
+ dirty: repoState.dirty,
64
+ dirtyFingerprint: repoState.dirtyFingerprint,
65
+ contentFingerprint: repoState.contentFingerprint,
66
+ repoRoot: repoState.repoRoot,
67
+ worktreePath: repoState.worktreePath,
68
+ remoteUrl: repoState.remoteUrl,
69
+ repoSlug: repoState.repoSlug,
70
+ };
71
+ }
72
+
73
+ function fingerprintGitDirtyState(productDir) {
74
+ const hash = crypto.createHash("sha256");
75
+ let hasChanges = false;
76
+
77
+ const trackedStatus = readGit(productDir, ["status", "--porcelain=v1", "-uno"]) || "";
78
+ if (trackedStatus.trim()) {
79
+ hasChanges = true;
80
+ hash.update("tracked-status\0");
81
+ hash.update(trackedStatus);
82
+ appendGitOutput(hash, productDir, ["diff", "--binary", "--no-ext-diff"]);
83
+ appendGitOutput(hash, productDir, ["diff", "--binary", "--cached", "--no-ext-diff"]);
84
+ }
85
+
86
+ const untracked = readGit(productDir, ["ls-files", "--others", "--exclude-standard", "-z"]) || "";
87
+ const untrackedFiles = untracked
88
+ .split("\0")
89
+ .filter(Boolean)
90
+ .filter((entry) => !hasIgnoredPathSegment(entry))
91
+ .sort();
92
+ if (untrackedFiles.length > 0) {
93
+ hasChanges = true;
94
+ hash.update("untracked\0");
95
+ for (const relativePath of untrackedFiles) {
96
+ const absPath = path.join(productDir, relativePath);
97
+ if (!fs.existsSync(absPath) || !fs.statSync(absPath).isFile()) continue;
98
+ hash.update(`file:${normalizePath(relativePath)}\0`);
99
+ const stat = fs.statSync(absPath);
100
+ hash.update(`${stat.size}\0`);
101
+ hash.update(fs.readFileSync(absPath));
102
+ }
103
+ }
104
+
105
+ return hasChanges ? hash.digest("hex").slice(0, 24) : null;
106
+ }
107
+
108
+ function appendGitOutput(hash, cwd, args) {
109
+ const output = readGit(cwd, args) || "";
110
+ hash.update(args.join(" "));
111
+ hash.update("\0");
112
+ hash.update(output);
113
+ hash.update("\0");
114
+ }
115
+
116
+ function fingerprintDirectory(rootDir) {
117
+ const hash = crypto.createHash("sha256");
118
+ appendDirectoryToHash(hash, rootDir, rootDir);
119
+ return hash.digest("hex").slice(0, 24);
120
+ }
121
+
122
+ function appendDirectoryToHash(hash, rootDir, absPath) {
123
+ if (!fs.existsSync(absPath)) {
124
+ hash.update(`missing:${normalizePath(path.relative(rootDir, absPath))}`);
125
+ return;
126
+ }
127
+ const stat = fs.statSync(absPath);
128
+ if (stat.isDirectory()) {
129
+ const relative = path.relative(rootDir, absPath);
130
+ if (relative && hasIgnoredPathSegment(relative)) return;
131
+ hash.update(`dir:${normalizePath(relative)}`);
132
+ for (const entry of fs.readdirSync(absPath).sort()) {
133
+ if (IGNORED_DIRS.has(entry)) continue;
134
+ appendDirectoryToHash(hash, rootDir, path.join(absPath, entry));
135
+ }
136
+ return;
137
+ }
138
+ if (!stat.isFile()) return;
139
+ const relative = normalizePath(path.relative(rootDir, absPath));
140
+ hash.update(`file:${relative}:${stat.size}:${stat.mtimeMs}`);
141
+ hash.update(fs.readFileSync(absPath));
142
+ }
143
+
144
+ function hasIgnoredPathSegment(relativePath) {
145
+ return normalizePath(relativePath)
146
+ .split("/")
147
+ .some((segment) => IGNORED_DIRS.has(segment));
148
+ }
149
+
150
+ function normalizePath(value) {
151
+ return String(value).split(path.sep).join("/");
152
+ }
153
+
154
+ function readGit(cwd, args) {
155
+ try {
156
+ return execFileSync("git", args, {
157
+ cwd,
158
+ encoding: "utf8",
159
+ stdio: ["ignore", "pipe", "ignore"],
160
+ }).trim() || null;
161
+ } catch {
162
+ return null;
163
+ }
164
+ }
@@ -1,27 +1,22 @@
1
1
  import fs from "fs";
2
2
  import os from "os";
3
3
  import path from "path";
4
- import { execFileSync } from "child_process";
5
4
  import { fileURLToPath } from "url";
6
- import { parseGitHubRepoSlug } from "../regressions/github.mjs";
5
+ import { collectRepoState } from "../repo/state.mjs";
7
6
 
8
7
  export function collectGitMetadata(productDir) {
9
- const read = (args) => {
10
- try {
11
- return execaSyncCompat("git", args, { cwd: productDir }).trim() || null;
12
- } catch {
13
- return null;
14
- }
15
- };
16
-
17
- const remoteUrl = read(["remote", "get-url", "origin"]);
8
+ const state = collectRepoState(productDir);
18
9
 
19
10
  return {
20
- branch: read(["rev-parse", "--abbrev-ref", "HEAD"]),
21
- commitSha: read(["rev-parse", "HEAD"]),
22
- repoRoot: read(["rev-parse", "--show-toplevel"]),
23
- remoteUrl,
24
- repoSlug: parseGitHubRepoSlug(remoteUrl),
11
+ branch: state.branch || (state.detached ? "HEAD" : null),
12
+ commitSha: state.commitSha,
13
+ repoRoot: state.repoRoot,
14
+ remoteUrl: state.remoteUrl,
15
+ repoSlug: state.repoSlug,
16
+ detached: state.detached,
17
+ dirty: state.dirty,
18
+ dirtyFingerprint: state.dirtyFingerprint,
19
+ worktreePath: state.worktreePath,
25
20
  };
26
21
  }
27
22
 
@@ -50,11 +45,3 @@ export function safeUsername() {
50
45
  return process.env.USER || process.env.USERNAME || null;
51
46
  }
52
47
  }
53
-
54
- function execaSyncCompat(command, args, options) {
55
- return execFileSync(command, args, {
56
- cwd: options?.cwd,
57
- encoding: "utf8",
58
- stdio: ["ignore", "pipe", "pipe"],
59
- });
60
- }
@@ -202,9 +202,6 @@ function finalizeSourceSchema(sourceSchema, context) {
202
202
  return {
203
203
  ...sourceSchema,
204
204
  ...(typeof sourceSchema.env === "string" ? { env: finalizeString(sourceSchema.env, context) } : {}),
205
- ...(typeof sourceSchema.cachePath === "string"
206
- ? { cachePath: finalizeString(sourceSchema.cachePath, context) }
207
- : {}),
208
205
  };
209
206
  }
210
207
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elench/next-analysis",
3
- "version": "0.1.117",
3
+ "version": "0.1.118",
4
4
  "description": "SWC-backed Next.js source analysis primitives for Erench tools",
5
5
  "type": "module",
6
6
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elench/testkit-bridge",
3
- "version": "0.1.117",
3
+ "version": "0.1.118",
4
4
  "description": "Browser bridge helpers for testkit",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -22,7 +22,7 @@
22
22
  "typecheck": "tsc -p tsconfig.json --noEmit"
23
23
  },
24
24
  "dependencies": {
25
- "@elench/testkit-protocol": "0.1.117"
25
+ "@elench/testkit-protocol": "0.1.118"
26
26
  },
27
27
  "private": false
28
28
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elench/testkit-protocol",
3
- "version": "0.1.117",
3
+ "version": "0.1.118",
4
4
  "description": "Shared browser protocol for testkit bridge and extension consumers",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elench/ts-analysis",
3
- "version": "0.1.117",
3
+ "version": "0.1.118",
4
4
  "description": "TypeScript compiler-backed source analysis primitives for Erench tools",
5
5
  "type": "module",
6
6
  "exports": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elench/testkit",
3
- "version": "0.1.117",
3
+ "version": "0.1.118",
4
4
  "description": "Assistant-first CLI for running, inspecting, and debugging local testkit suites",
5
5
  "type": "module",
6
6
  "workspaces": [
@@ -65,6 +65,7 @@
65
65
  "test:database-version:compat": "node scripts/test-database-version-compat.mjs",
66
66
  "test:engine-version:compat": "node scripts/test-engine-version-compat.mjs",
67
67
  "test:live": "node scripts/live-sandbox/harness.mjs",
68
+ "test:live:github": "node scripts/test-live-github-fixture.mjs",
68
69
  "test:live:neon": "node scripts/test-database-version-compat.mjs --neon-only",
69
70
  "test:unit": "npm run build:assistant && npm run build:packages && npm run test:audit && vitest run --config vitest.unit.config.mjs",
70
71
  "test:integration": "npm run build:assistant && npm run build:packages && vitest run test/integration",
@@ -94,10 +95,10 @@
94
95
  },
95
96
  "dependencies": {
96
97
  "@babel/code-frame": "^7.29.0",
97
- "@elench/next-analysis": "0.1.117",
98
- "@elench/testkit-bridge": "0.1.117",
99
- "@elench/testkit-protocol": "0.1.117",
100
- "@elench/ts-analysis": "0.1.117",
98
+ "@elench/next-analysis": "0.1.118",
99
+ "@elench/testkit-bridge": "0.1.118",
100
+ "@elench/testkit-protocol": "0.1.118",
101
+ "@elench/ts-analysis": "0.1.118",
101
102
  "@oclif/core": "^4.10.6",
102
103
  "@playwright/test": "^1.52.0",
103
104
  "esbuild": "^0.25.11",
@@ -1,188 +0,0 @@
1
- export declare const TESTKIT_BROWSER_PROTOCOL_VERSION = 1;
2
- export declare const TESTKIT_COVERAGE_GRAPH_VERSION = 1;
3
- export type BrowserTargetKind = "testId" | "role" | "text" | "css" | "xpath" | "component";
4
- export type BrowserConfidence = "low" | "medium" | "high";
5
- export type BrowserFailureState = "failing" | "healthy" | "unavailable";
6
- export type BrowserCoverageState = "covered" | "missing" | "unavailable";
7
- export type BridgeSurfaceImportance = "critical" | "high" | "medium" | "low";
8
- export type BridgeCoverageSupportKind = "direct" | "indirect" | "mixed";
9
- export type CoverageNodeKind = "page_view" | "ui_surface" | "ui_action" | "client_request" | "api_route" | "server_action" | "server_capability" | "data_capability" | "test_file";
10
- export type CoverageEdgeKind = "contains" | "renders" | "triggers" | "requests" | "handles" | "delegates_to" | "covers";
11
- export type CoverageEvidenceSource = "convention" | "static" | "runtime";
12
- export type CoverageGraphDiagnosticLevel = "info" | "warn";
13
- export interface BrowserTarget {
14
- kind: BrowserTargetKind;
15
- value: string;
16
- label?: string;
17
- confidence?: BrowserConfidence;
18
- }
19
- export interface BrowserMetadata {
20
- label?: string;
21
- origins?: string[];
22
- routes?: string[];
23
- targets?: BrowserTarget[];
24
- }
25
- export interface BrowserMetadataDocument {
26
- schemaVersion: number;
27
- browser: BrowserMetadata;
28
- }
29
- export interface CoverageGraphNode {
30
- id: string;
31
- kind: CoverageNodeKind;
32
- service: string;
33
- label: string;
34
- filePath?: string;
35
- route?: string;
36
- method?: string;
37
- path?: string;
38
- target?: BrowserTarget | null;
39
- metadata?: Record<string, string | number | boolean | null>;
40
- }
41
- export interface CoverageGraphEdge {
42
- id: string;
43
- kind: CoverageEdgeKind;
44
- from: string;
45
- to: string;
46
- confidence?: BrowserConfidence;
47
- metadata?: Record<string, string | number | boolean | null>;
48
- }
49
- export interface CoverageEvidenceDetails {
50
- requestPaths?: string[];
51
- route?: string;
52
- targets?: BrowserTarget[];
53
- }
54
- export interface CoverageEvidence {
55
- id: string;
56
- source: CoverageEvidenceSource;
57
- confidence?: BrowserConfidence;
58
- service: string;
59
- suiteName: string;
60
- type: string;
61
- testFilePath: string;
62
- coveredNodeIds: string[];
63
- details?: CoverageEvidenceDetails;
64
- }
65
- export interface CoverageGraphDiagnostic {
66
- level: CoverageGraphDiagnosticLevel;
67
- code: string;
68
- filePath: string;
69
- service: string;
70
- message: string;
71
- }
72
- export interface CoverageGraph {
73
- schemaVersion: number;
74
- nodes: CoverageGraphNode[];
75
- edges: CoverageGraphEdge[];
76
- evidence: CoverageEvidence[];
77
- diagnostics: CoverageGraphDiagnostic[];
78
- }
79
- export interface BridgeProductRef {
80
- name: string;
81
- directory: string;
82
- }
83
- export interface BridgeServiceRef {
84
- name: string;
85
- baseUrl: string;
86
- origin: string;
87
- }
88
- export interface BrowserMatchResponse {
89
- protocolVersion: number;
90
- url: string;
91
- origin: string;
92
- route: string;
93
- matched: boolean;
94
- product: BridgeProductRef;
95
- service: BridgeServiceRef | null;
96
- }
97
- export interface BridgeRunSummary {
98
- artifactAvailable: boolean;
99
- generatedAt: string | null;
100
- status: string | null;
101
- }
102
- export interface BridgeSupportingTestRef {
103
- service: string;
104
- suite: string;
105
- type: string;
106
- filePath: string;
107
- label: string;
108
- status?: "passed" | "failed" | "skipped" | "not_run";
109
- error?: string | null;
110
- }
111
- export interface BridgeCoverageViaNodeRef {
112
- id: string;
113
- kind: CoverageNodeKind;
114
- label: string;
115
- route?: string;
116
- method?: string;
117
- path?: string;
118
- }
119
- export interface FailureOverlayEntry {
120
- id: string;
121
- kind: CoverageNodeKind;
122
- label: string;
123
- service: string;
124
- route?: string | null;
125
- targets: BrowserTarget[];
126
- failedTests: BridgeSupportingTestRef[];
127
- viaNodes: BridgeCoverageViaNodeRef[];
128
- importance?: BridgeSurfaceImportance;
129
- surfaceKind?: string | null;
130
- reason?: string | null;
131
- }
132
- export interface CoverageOverlayEntry {
133
- id: string;
134
- kind: CoverageNodeKind;
135
- label: string;
136
- service: string;
137
- route?: string | null;
138
- targets: BrowserTarget[];
139
- supportingTests: BridgeSupportingTestRef[];
140
- viaNodes: BridgeCoverageViaNodeRef[];
141
- confidence: BrowserConfidence;
142
- importance?: BridgeSurfaceImportance;
143
- surfaceKind?: string | null;
144
- supportKind?: BridgeCoverageSupportKind;
145
- reason?: string | null;
146
- }
147
- export interface PageOverlayResponse {
148
- protocolVersion: number;
149
- page: {
150
- url: string;
151
- origin: string;
152
- route: string;
153
- };
154
- match: BrowserMatchResponse;
155
- run: BridgeRunSummary;
156
- summary: {
157
- failureState: BrowserFailureState;
158
- coverageState: BrowserCoverageState;
159
- relatedFailureCount: number;
160
- relatedCoverageCount: number;
161
- coverageBreakdown?: {
162
- direct: number;
163
- indirect: number;
164
- mixed: number;
165
- };
166
- };
167
- failures: FailureOverlayEntry[];
168
- coverage: CoverageOverlayEntry[];
169
- }
170
- export interface BridgeErrorResponse {
171
- protocolVersion: number;
172
- error: {
173
- code: string;
174
- message: string;
175
- };
176
- }
177
- export declare function normalizeBrowserTarget(value: unknown): BrowserTarget | null;
178
- export declare function normalizeBrowserMetadata(value: unknown): BrowserMetadata | null;
179
- export declare function normalizeBrowserMetadataDocument(value: unknown): BrowserMetadataDocument | null;
180
- export declare function normalizeCoverageGraphNode(value: unknown): CoverageGraphNode | null;
181
- export declare function normalizeCoverageGraphEdge(value: unknown): CoverageGraphEdge | null;
182
- export declare function normalizeCoverageEvidence(value: unknown): CoverageEvidence | null;
183
- export declare function normalizeCoverageGraphDiagnostic(value: unknown): CoverageGraphDiagnostic | null;
184
- export declare function normalizeCoverageGraph(value: unknown): CoverageGraph | null;
185
- export declare function isPageOverlayResponse(value: unknown): value is PageOverlayResponse;
186
- export declare function normalizePageOverlayResponse(value: unknown): PageOverlayResponse | null;
187
- export declare function createBridgeErrorResponse(code: string, message: string): BridgeErrorResponse;
188
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}