@elench/testkit 0.1.109 → 0.1.111

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 (42) hide show
  1. package/lib/cli/assistant/actions.mjs +10 -7
  2. package/lib/cli/assistant/app.mjs +19 -5
  3. package/lib/cli/assistant/command-classifier.d.mts +6 -0
  4. package/lib/cli/assistant/command-classifier.d.mts.map +1 -0
  5. package/lib/cli/assistant/command-classifier.mjs +48 -0
  6. package/lib/cli/assistant/command-classifier.mjs.map +1 -0
  7. package/lib/cli/assistant/command-observer.mjs +20 -11
  8. package/lib/cli/assistant/command-results.mjs +2 -34
  9. package/lib/cli/assistant/context-pack.mjs +53 -45
  10. package/lib/cli/assistant/prompt-builder.mjs +21 -13
  11. package/lib/cli/assistant/providers/claude.mjs +77 -19
  12. package/lib/cli/assistant/providers/codex.mjs +8 -12
  13. package/lib/cli/assistant/providers/index.mjs +3 -2
  14. package/lib/cli/assistant/providers/shared.mjs +22 -3
  15. package/lib/cli/assistant/quality-signal-strip.mjs +103 -0
  16. package/lib/cli/assistant/session-paths.d.mts +23 -0
  17. package/lib/cli/assistant/session-paths.d.mts.map +1 -0
  18. package/lib/cli/assistant/session-paths.mjs +31 -0
  19. package/lib/cli/assistant/session-paths.mjs.map +1 -0
  20. package/lib/cli/assistant/session.mjs +10 -2
  21. package/lib/cli/assistant/state.mjs +51 -2
  22. package/lib/cli/assistant/transcript-text.mjs +2 -1
  23. package/lib/cli/assistant/view-model.mjs +79 -0
  24. package/lib/cli/commands/assistant.mjs +3 -0
  25. package/lib/runner/maintenance.mjs +1 -1
  26. package/lib/runner/status-model.mjs +11 -2
  27. package/node_modules/@elench/next-analysis/package.json +1 -1
  28. package/node_modules/@elench/testkit-bridge/package.json +2 -2
  29. package/node_modules/@elench/testkit-protocol/package.json +1 -1
  30. package/node_modules/@elench/ts-analysis/package.json +1 -1
  31. package/package.json +10 -9
  32. package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.d.ts +188 -0
  33. package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.d.ts.map +1 -0
  34. package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.js +293 -0
  35. package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/dist/index.js.map +1 -0
  36. package/packages/testkit-bridge/node_modules/@elench/testkit-protocol/package.json +25 -0
  37. package/node_modules/es-toolkit/CHANGELOG.md +0 -801
  38. package/node_modules/es-toolkit/src/compat/_internal/Equals.d.ts +0 -1
  39. package/node_modules/es-toolkit/src/compat/_internal/IsWritable.d.ts +0 -3
  40. package/node_modules/es-toolkit/src/compat/_internal/MutableList.d.ts +0 -4
  41. package/node_modules/es-toolkit/src/compat/_internal/RejectReadonly.d.ts +0 -4
  42. package/node_modules/esprima/ChangeLog +0 -235
@@ -12,6 +12,7 @@ export function buildAssistantViewModel(snapshot, { cwd = process.cwd(), termina
12
12
  return {
13
13
  title: `testkit · ${repoName}`,
14
14
  welcome: buildWelcomeModel(snapshot, { cwd, providerLabel }),
15
+ qualitySignal: buildQualitySignal(snapshot),
15
16
  blocks: buildTranscriptBlocks(snapshot.messages || []),
16
17
  composer: {
17
18
  text: snapshot.composer || "",
@@ -25,6 +26,84 @@ export function buildAssistantViewModel(snapshot, { cwd = process.cwd(), termina
25
26
  };
26
27
  }
27
28
 
29
+ export function buildQualitySignal(snapshot = {}) {
30
+ const summaryRows = snapshot?.run?.summaryData?.rows || snapshot?.summaryData?.rows || [];
31
+ const rowValue = (label) => summaryRows.find(([key]) => key === label)?.[1] || null;
32
+ const latestResult = rowValue("Result");
33
+ const summaryFiles = rowValue("Files");
34
+ const plannedFiles = snapshot?.run?.totalCount ? String(snapshot.run.totalCount) : null;
35
+ const files = summaryFiles || plannedFiles;
36
+ const failed = rowValue("Failed");
37
+ const duration = rowValue("Duration");
38
+ const newRegressions = rowValue("New regressions");
39
+ const fixedKnown = rowValue("Fixed known");
40
+ const contextSelection = snapshot?.context?.selection || {};
41
+ const items = [];
42
+
43
+ if (files && files !== "0") {
44
+ items.push({
45
+ id: summaryFiles ? "tested-files" : "planned-files",
46
+ text: `${files} ${summaryFiles ? "tested" : "planned"}`,
47
+ tone: "neutral",
48
+ });
49
+ }
50
+
51
+ if (newRegressions && newRegressions !== "0") {
52
+ items.push({
53
+ id: "new-regressions",
54
+ text: `${newRegressions} new regression${newRegressions === "1" ? "" : "s"}`,
55
+ tone: "danger",
56
+ });
57
+ } else if (fixedKnown && fixedKnown !== "0") {
58
+ items.push({
59
+ id: "fixed-known",
60
+ text: `${fixedKnown} fixed known`,
61
+ tone: "good",
62
+ });
63
+ } else if (latestResult === "PASSED") {
64
+ items.push({
65
+ id: "no-regressions",
66
+ text: "no regressions",
67
+ tone: "good",
68
+ });
69
+ } else if (latestResult === "FAILED" && failed && failed !== "0") {
70
+ items.push({
71
+ id: "failed-files",
72
+ text: `${failed} failed`,
73
+ tone: "danger",
74
+ });
75
+ }
76
+
77
+ if (latestResult) {
78
+ const status = latestResult === "PASSED" ? "passed" : latestResult === "FAILED" ? "failed" : latestResult.toLowerCase();
79
+ items.push({
80
+ id: "latest-status",
81
+ text: duration ? `${status} in ${duration}` : status,
82
+ tone: latestResult === "PASSED" ? "good" : latestResult === "FAILED" ? "danger" : "neutral",
83
+ });
84
+ }
85
+
86
+ if (contextSelection.filePath) {
87
+ items.push({
88
+ id: "focus",
89
+ text: `focus ${path.basename(contextSelection.filePath)}`,
90
+ tone: "progress",
91
+ });
92
+ } else if (!latestResult) {
93
+ items.push({
94
+ id: "ready",
95
+ text: "ready to run",
96
+ tone: "progress",
97
+ });
98
+ }
99
+
100
+ return {
101
+ label: "Quality signal",
102
+ tone: latestResult === "FAILED" ? "danger" : latestResult === "PASSED" ? "good" : "neutral",
103
+ items,
104
+ };
105
+ }
106
+
28
107
  export function buildWelcomeModel(snapshot, { cwd = process.cwd(), providerLabel = null } = {}) {
29
108
  const summaryRows = snapshot?.run?.summaryData?.rows || snapshot?.summaryData?.rows || [];
30
109
  const rowValue = (label) => summaryRows.find(([key]) => key === label)?.[1] || null;
@@ -95,6 +95,9 @@ export default class AssistantCommand extends Command {
95
95
  this.log(`${message.role}: ${message.text}`);
96
96
  }
97
97
  }
98
+ if (snapshot.lastTurnError?.kind === "provider") {
99
+ process.exitCode = 1;
100
+ }
98
101
  return snapshot;
99
102
  }
100
103
 
@@ -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"),
@@ -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,7 +241,7 @@ 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");
244
+ const dir = path.join(productDir, ".testkit", "assistant", "sessions");
243
245
  return listFiles(dir)
244
246
  .filter((file) => file.size >= ASSISTANT_LARGE_RESULT_BYTES || now - file.mtimeMs >= ASSISTANT_RESULT_TTL_MS)
245
247
  .map((file) => ({
@@ -249,6 +251,13 @@ export function collectAssistantCleanupTargets(productDir) {
249
251
  }));
250
252
  }
251
253
 
254
+ function listDirectories(dir) {
255
+ if (!fs.existsSync(dir)) return [];
256
+ return fs.readdirSync(dir, { withFileTypes: true })
257
+ .filter((entry) => entry.isDirectory())
258
+ .map((entry) => path.join(dir, entry.name));
259
+ }
260
+
252
261
  function collectRunStatus(productDir) {
253
262
  const manifests = listRunManifests(productDir);
254
263
  const runs = manifests.map((manifest) => ({
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elench/next-analysis",
3
- "version": "0.1.109",
3
+ "version": "0.1.111",
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.109",
3
+ "version": "0.1.111",
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.109"
25
+ "@elench/testkit-protocol": "0.1.111"
26
26
  },
27
27
  "private": false
28
28
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elench/testkit-protocol",
3
- "version": "0.1.109",
3
+ "version": "0.1.111",
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.109",
3
+ "version": "0.1.111",
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.109",
3
+ "version": "0.1.111",
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.109",
93
- "@elench/testkit-bridge": "0.1.109",
94
- "@elench/testkit-protocol": "0.1.109",
95
- "@elench/ts-analysis": "0.1.109",
93
+ "@elench/next-analysis": "0.1.111",
94
+ "@elench/testkit-bridge": "0.1.111",
95
+ "@elench/testkit-protocol": "0.1.111",
96
+ "@elench/ts-analysis": "0.1.111",
96
97
  "@oclif/core": "^4.10.6",
97
98
  "@playwright/test": "^1.52.0",
98
99
  "esbuild": "^0.25.11",
@@ -0,0 +1,188 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}