@elench/testkit 0.1.110 → 0.1.112

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 (49) hide show
  1. package/README.md +1 -1
  2. package/lib/cli/args.mjs +1 -1
  3. package/lib/cli/assistant/actions.mjs +10 -7
  4. package/lib/cli/assistant/app.mjs +70 -20
  5. package/lib/cli/assistant/command-classifier.d.mts +6 -0
  6. package/lib/cli/assistant/command-classifier.d.mts.map +1 -0
  7. package/lib/cli/assistant/command-classifier.mjs +48 -0
  8. package/lib/cli/assistant/command-classifier.mjs.map +1 -0
  9. package/lib/cli/assistant/command-normalize.mjs +22 -0
  10. package/lib/cli/assistant/command-observer.mjs +69 -15
  11. package/lib/cli/assistant/command-results.mjs +12 -35
  12. package/lib/cli/assistant/context-pack.mjs +95 -57
  13. package/lib/cli/assistant/domain.d.mts +59 -0
  14. package/lib/cli/assistant/domain.d.mts.map +1 -0
  15. package/lib/cli/assistant/domain.mjs +2 -0
  16. package/lib/cli/assistant/domain.mjs.map +1 -0
  17. package/lib/cli/assistant/prompt-builder.mjs +21 -13
  18. package/lib/cli/assistant/providers/claude.mjs +77 -19
  19. package/lib/cli/assistant/providers/codex.mjs +8 -12
  20. package/lib/cli/assistant/providers/index.mjs +3 -2
  21. package/lib/cli/assistant/providers/shared.mjs +22 -3
  22. package/lib/cli/assistant/session-paths.d.mts +23 -0
  23. package/lib/cli/assistant/session-paths.d.mts.map +1 -0
  24. package/lib/cli/assistant/session-paths.mjs +31 -0
  25. package/lib/cli/assistant/session-paths.mjs.map +1 -0
  26. package/lib/cli/assistant/session.mjs +13 -3
  27. package/lib/cli/assistant/state.mjs +159 -3
  28. package/lib/cli/assistant/view-model.mjs +69 -9
  29. package/lib/cli/commands/assistant.mjs +3 -0
  30. package/lib/cli/commands/run.mjs +1 -1
  31. package/lib/cli/components/blocks/run-tree.mjs +2 -1
  32. package/lib/cli/entrypoint.mjs +1 -1
  33. package/lib/config/discovery.mjs +0 -10
  34. package/lib/discovery/index.mjs +1 -1
  35. package/lib/domain/test-types.mjs +5 -14
  36. package/lib/runner/maintenance.mjs +2 -2
  37. package/lib/runner/provenance.mjs +4 -1
  38. package/lib/runner/status-model.mjs +26 -9
  39. package/lib/runner/suite-selection.mjs +2 -3
  40. package/node_modules/@elench/next-analysis/package.json +1 -1
  41. package/node_modules/@elench/testkit-bridge/package.json +2 -2
  42. package/node_modules/@elench/testkit-protocol/package.json +1 -1
  43. package/node_modules/@elench/ts-analysis/package.json +1 -1
  44. package/package.json +10 -9
  45. package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.d.ts +0 -188
  46. package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.d.ts.map +0 -1
  47. package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.js +0 -293
  48. package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.js.map +0 -1
  49. package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/package.json +0 -25
@@ -2,9 +2,6 @@ export const TEST_TYPE_ORDER = ["ui", "e2e", "scenario", "int", "dal", "load"];
2
2
  export const TEST_TYPES = new Set(TEST_TYPE_ORDER);
3
3
  export const RUN_TYPE_ORDER = [...TEST_TYPE_ORDER, "all"];
4
4
  export const RUN_TYPES = new Set(RUN_TYPE_ORDER);
5
- export const LEGACY_TEST_TYPE_ALIASES = new Map([
6
- ["pw", "ui"],
7
- ]);
8
5
 
9
6
  const TEST_TYPE_LABELS = {
10
7
  ui: "UI",
@@ -15,28 +12,22 @@ const TEST_TYPE_LABELS = {
15
12
  load: "Load",
16
13
  };
17
14
 
18
- export function normalizePublicTestType(value) {
19
- const normalized = String(value || "").trim();
20
- return LEGACY_TEST_TYPE_ALIASES.get(normalized) || normalized;
21
- }
22
-
23
15
  export function isPublicTestType(value) {
24
- return TEST_TYPES.has(normalizePublicTestType(value));
16
+ return TEST_TYPES.has(String(value || "").trim());
25
17
  }
26
18
 
27
19
  export function isRunType(value) {
28
- const normalized = normalizePublicTestType(value);
20
+ const normalized = String(value || "").trim();
29
21
  return normalized === "all" || TEST_TYPES.has(normalized);
30
22
  }
31
23
 
32
24
  export function formatPublicTestType(value) {
33
- const normalized = normalizePublicTestType(value);
25
+ const normalized = String(value || "").trim();
34
26
  return TEST_TYPE_LABELS[normalized] || String(value || "");
35
27
  }
36
28
 
37
- export function publicTestTypeList({ includeAll = false, includeLegacy = false } = {}) {
38
- const values = includeAll ? RUN_TYPE_ORDER : TEST_TYPE_ORDER;
39
- return includeLegacy ? [...values, "pw"] : [...values];
29
+ export function publicTestTypeList({ includeAll = false } = {}) {
30
+ return includeAll ? [...RUN_TYPE_ORDER] : [...TEST_TYPE_ORDER];
40
31
  }
41
32
 
42
33
  export function publicTestTypeListText(options = {}) {
@@ -90,7 +90,7 @@ export async function cleanup(productDir, options = {}) {
90
90
  appendBoundedFileCleanupLines(lines, {
91
91
  productDir,
92
92
  targets: targets.assistant,
93
- label: "assistant command result",
93
+ label: "assistant session",
94
94
  dryRun,
95
95
  });
96
96
 
@@ -134,7 +134,7 @@ function normalizeCacheSelection(cache) {
134
134
 
135
135
  function pruneKnownEmptyDirs(productDir) {
136
136
  for (const dir of [
137
- path.join(productDir, ".testkit", "assistant", "command-results"),
137
+ path.join(productDir, ".testkit", "assistant", "sessions"),
138
138
  path.join(productDir, ".testkit", "assistant"),
139
139
  path.join(productDir, ".testkit", "_bundles"),
140
140
  path.join(productDir, ".testkit", "_graphs"),
@@ -1,13 +1,16 @@
1
1
  const ASSISTANT_SESSION_ENV = "TESTKIT_ASSISTANT_SESSION_ID";
2
+ const ASSISTANT_TURN_ENV = "TESTKIT_ASSISTANT_TURN_ID";
2
3
  const ASSISTANT_COMMAND_ID_ENV = "TESTKIT_ASSISTANT_COMMAND_ID";
3
4
 
4
5
  export function buildRunProvenance(env = process.env) {
5
6
  const sessionId = normalizeOptionalString(env?.[ASSISTANT_SESSION_ENV]);
7
+ const turnId = normalizeOptionalString(env?.[ASSISTANT_TURN_ENV]);
6
8
  const commandId = normalizeOptionalString(env?.[ASSISTANT_COMMAND_ID_ENV]);
7
- if (!sessionId && !commandId) return null;
9
+ if (!sessionId && !turnId && !commandId) return null;
8
10
  return {
9
11
  assistant: {
10
12
  sessionId,
13
+ turnId,
11
14
  commandId,
12
15
  },
13
16
  };
@@ -203,11 +203,13 @@ export function collectBundleCacheStatus(productDir, serviceName = "shared") {
203
203
  }
204
204
 
205
205
  export function collectAssistantResultStatus(productDir) {
206
- const dir = path.join(productDir, ".testkit", "assistant", "command-results");
206
+ const dir = path.join(productDir, ".testkit", "assistant", "sessions");
207
207
  const files = listFiles(dir).sort((left, right) => right.size - left.size || left.path.localeCompare(right.path));
208
+ const sessionDirs = listDirectories(dir);
208
209
  return {
209
210
  path: dir,
210
211
  exists: fs.existsSync(dir),
212
+ sessionCount: sessionDirs.length,
211
213
  sizeBytes: files.reduce((sum, file) => sum + file.size, 0),
212
214
  fileCount: files.length,
213
215
  largeFileCount: files.filter((file) => file.size >= ASSISTANT_LARGE_RESULT_BYTES).length,
@@ -239,14 +241,29 @@ export function collectBundleCleanupTargets(productDir, { allConfigs = [], servi
239
241
 
240
242
  export function collectAssistantCleanupTargets(productDir) {
241
243
  const now = Date.now();
242
- const dir = path.join(productDir, ".testkit", "assistant", "command-results");
243
- return listFiles(dir)
244
- .filter((file) => file.size >= ASSISTANT_LARGE_RESULT_BYTES || now - file.mtimeMs >= ASSISTANT_RESULT_TTL_MS)
245
- .map((file) => ({
246
- path: file.path,
247
- reason: file.size >= ASSISTANT_LARGE_RESULT_BYTES ? "large" : "expired",
248
- sizeBytes: file.size,
249
- }));
244
+ const dir = path.join(productDir, ".testkit", "assistant", "sessions");
245
+ return listDirectories(dir)
246
+ .map((sessionDir) => {
247
+ const files = listFiles(sessionDir);
248
+ const sizeBytes = files.reduce((sum, file) => sum + file.size, 0);
249
+ const newestMtimeMs = files.reduce((latest, file) => Math.max(latest, file.mtimeMs), 0);
250
+ const expired = newestMtimeMs > 0 && now - newestMtimeMs >= ASSISTANT_RESULT_TTL_MS;
251
+ const large = sizeBytes >= ASSISTANT_LARGE_RESULT_BYTES;
252
+ if (!expired && !large) return null;
253
+ return {
254
+ path: sessionDir,
255
+ reason: large ? "large" : "expired",
256
+ sizeBytes,
257
+ };
258
+ })
259
+ .filter(Boolean);
260
+ }
261
+
262
+ function listDirectories(dir) {
263
+ if (!fs.existsSync(dir)) return [];
264
+ return fs.readdirSync(dir, { withFileTypes: true })
265
+ .filter((entry) => entry.isDirectory())
266
+ .map((entry) => path.join(dir, entry.name));
250
267
  }
251
268
 
252
269
  function collectRunStatus(productDir) {
@@ -3,7 +3,6 @@ import {
3
3
  RUN_TYPES,
4
4
  TEST_TYPE_ORDER,
5
5
  TEST_TYPES,
6
- normalizePublicTestType,
7
6
  publicTestTypeListText,
8
7
  } from "../domain/test-types.mjs";
9
8
 
@@ -14,7 +13,7 @@ export function normalizeTypeValues(values = []) {
14
13
  for (const part of String(rawValue).split(",")) {
15
14
  const value = part.trim();
16
15
  if (!value) continue;
17
- const normalized = normalizePublicTestType(value);
16
+ const normalized = value;
18
17
  if (!RUN_TYPES.has(normalized)) {
19
18
  throw new Error(
20
19
  `Unknown type "${value}". Expected one of: ${publicTestTypeListText({ includeAll: true })}.`
@@ -57,7 +56,7 @@ export function parseSuiteSelectors(values = []) {
57
56
 
58
57
  const type = typeMatch[1];
59
58
  const name = typeMatch[2].trim();
60
- const normalizedType = normalizePublicTestType(type);
59
+ const normalizedType = type.trim();
61
60
  if (!TEST_TYPES.has(normalizedType)) {
62
61
  throw new Error(
63
62
  `Unknown suite selector type "${type}". Expected one of: ${publicTestTypeListText()}.`
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elench/next-analysis",
3
- "version": "0.1.110",
3
+ "version": "0.1.112",
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.110",
3
+ "version": "0.1.112",
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.110"
25
+ "@elench/testkit-protocol": "0.1.112"
26
26
  },
27
27
  "private": false
28
28
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elench/testkit-protocol",
3
- "version": "0.1.110",
3
+ "version": "0.1.112",
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.110",
3
+ "version": "0.1.112",
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.110",
3
+ "version": "0.1.112",
4
4
  "description": "Assistant-first CLI for running, inspecting, and debugging local testkit suites",
5
5
  "type": "module",
6
6
  "workspaces": [
@@ -56,14 +56,15 @@
56
56
  "topicSeparator": " "
57
57
  },
58
58
  "scripts": {
59
+ "build:assistant": "tsc -p tsconfig.assistant.json",
59
60
  "build:packages": "npm --workspace packages/testkit-protocol run build && npm --workspace packages/ts-analysis run build && npm --workspace packages/next-analysis run build && npm --workspace packages/testkit-bridge run build",
60
61
  "typecheck:packages": "npm --workspace packages/testkit-protocol run typecheck && npm --workspace packages/ts-analysis run typecheck && npm --workspace packages/next-analysis run typecheck && npm --workspace packages/testkit-bridge run typecheck && npm --workspace packages/testkit-extension run compile",
61
- "test": "npm run build:packages && vitest run && npm run test:live",
62
+ "test": "npm run build:assistant && npm run build:packages && vitest run && npm run test:live",
62
63
  "test:audit": "node scripts/test-boundary-audit.mjs",
63
64
  "test:live": "node scripts/live-sandbox/harness.mjs",
64
- "test:unit": "npm run build:packages && npm run test:audit && vitest run --config vitest.unit.config.mjs",
65
- "test:integration": "npm run build:packages && vitest run test/integration",
66
- "test:system": "npm run build:packages && vitest run test/system"
65
+ "test:unit": "npm run build:assistant && npm run build:packages && npm run test:audit && vitest run --config vitest.unit.config.mjs",
66
+ "test:integration": "npm run build:assistant && npm run build:packages && vitest run test/integration",
67
+ "test:system": "npm run build:assistant && npm run build:packages && vitest run test/system"
67
68
  },
68
69
  "files": [
69
70
  "bin/",
@@ -89,10 +90,10 @@
89
90
  },
90
91
  "dependencies": {
91
92
  "@babel/code-frame": "^7.29.0",
92
- "@elench/next-analysis": "0.1.110",
93
- "@elench/testkit-bridge": "0.1.110",
94
- "@elench/testkit-protocol": "0.1.110",
95
- "@elench/ts-analysis": "0.1.110",
93
+ "@elench/next-analysis": "0.1.112",
94
+ "@elench/testkit-bridge": "0.1.112",
95
+ "@elench/testkit-protocol": "0.1.112",
96
+ "@elench/ts-analysis": "0.1.112",
96
97
  "@oclif/core": "^4.10.6",
97
98
  "@playwright/test": "^1.52.0",
98
99
  "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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"}