@esbenwiberg/corpus-default 1.1.0 → 1.2.1

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 (74) hide show
  1. package/dist/index.d.ts.map +1 -1
  2. package/dist/index.js +24 -0
  3. package/dist/index.js.map +1 -1
  4. package/dist/probes/_shared/guidance-content.d.ts +9 -0
  5. package/dist/probes/_shared/guidance-content.d.ts.map +1 -0
  6. package/dist/probes/_shared/guidance-content.js +140 -0
  7. package/dist/probes/_shared/guidance-content.js.map +1 -0
  8. package/dist/probes/agent-guidance-aligned.d.ts +3 -0
  9. package/dist/probes/agent-guidance-aligned.d.ts.map +1 -0
  10. package/dist/probes/agent-guidance-aligned.js +130 -0
  11. package/dist/probes/agent-guidance-aligned.js.map +1 -0
  12. package/dist/probes/agent-guidance-fresh.d.ts.map +1 -1
  13. package/dist/probes/agent-guidance-fresh.js +3 -13
  14. package/dist/probes/agent-guidance-fresh.js.map +1 -1
  15. package/dist/probes/agent-guidance-quality.d.ts.map +1 -1
  16. package/dist/probes/agent-guidance-quality.js +3 -13
  17. package/dist/probes/agent-guidance-quality.js.map +1 -1
  18. package/dist/probes/agent-guidance-substance.d.ts.map +1 -1
  19. package/dist/probes/agent-guidance-substance.js +20 -3
  20. package/dist/probes/agent-guidance-substance.js.map +1 -1
  21. package/dist/probes/agent-skills-present.d.ts +3 -0
  22. package/dist/probes/agent-skills-present.d.ts.map +1 -0
  23. package/dist/probes/agent-skills-present.js +82 -0
  24. package/dist/probes/agent-skills-present.js.map +1 -0
  25. package/dist/probes/agent-skills-quality.d.ts +3 -0
  26. package/dist/probes/agent-skills-quality.d.ts.map +1 -0
  27. package/dist/probes/agent-skills-quality.js +148 -0
  28. package/dist/probes/agent-skills-quality.js.map +1 -0
  29. package/dist/probes/arch-coupling-hotspots.d.ts +3 -0
  30. package/dist/probes/arch-coupling-hotspots.d.ts.map +1 -0
  31. package/dist/probes/arch-coupling-hotspots.js +222 -0
  32. package/dist/probes/arch-coupling-hotspots.js.map +1 -0
  33. package/dist/probes/contracts-machine-readable.d.ts +3 -0
  34. package/dist/probes/contracts-machine-readable.d.ts.map +1 -0
  35. package/dist/probes/contracts-machine-readable.js +139 -0
  36. package/dist/probes/contracts-machine-readable.js.map +1 -0
  37. package/dist/probes/errors-actionability.d.ts.map +1 -1
  38. package/dist/probes/errors-actionability.js +132 -22
  39. package/dist/probes/errors-actionability.js.map +1 -1
  40. package/dist/probes/generated-code-marked.d.ts +3 -0
  41. package/dist/probes/generated-code-marked.d.ts.map +1 -0
  42. package/dist/probes/generated-code-marked.js +110 -0
  43. package/dist/probes/generated-code-marked.js.map +1 -0
  44. package/dist/probes/hooks-precommit-present.d.ts.map +1 -1
  45. package/dist/probes/hooks-precommit-present.js +81 -5
  46. package/dist/probes/hooks-precommit-present.js.map +1 -1
  47. package/dist/probes/specs-test-traceability.d.ts +3 -0
  48. package/dist/probes/specs-test-traceability.d.ts.map +1 -0
  49. package/dist/probes/specs-test-traceability.js +198 -0
  50. package/dist/probes/specs-test-traceability.js.map +1 -0
  51. package/dist/probes/tests-agent-safe-command.d.ts +3 -0
  52. package/dist/probes/tests-agent-safe-command.d.ts.map +1 -0
  53. package/dist/probes/tests-agent-safe-command.js +158 -0
  54. package/dist/probes/tests-agent-safe-command.js.map +1 -0
  55. package/dist/probes/tests-cover-public-surface.d.ts.map +1 -1
  56. package/dist/probes/tests-cover-public-surface.js +93 -12
  57. package/dist/probes/tests-cover-public-surface.js.map +1 -1
  58. package/dist/probes/tests-deterministic.d.ts +3 -0
  59. package/dist/probes/tests-deterministic.d.ts.map +1 -0
  60. package/dist/probes/tests-deterministic.js +204 -0
  61. package/dist/probes/tests-deterministic.js.map +1 -0
  62. package/dist/probes/tests-failure-actionability.d.ts +3 -0
  63. package/dist/probes/tests-failure-actionability.d.ts.map +1 -0
  64. package/dist/probes/tests-failure-actionability.js +139 -0
  65. package/dist/probes/tests-failure-actionability.js.map +1 -0
  66. package/dist/probes/tests-oracle-quality.d.ts +3 -0
  67. package/dist/probes/tests-oracle-quality.d.ts.map +1 -0
  68. package/dist/probes/tests-oracle-quality.js +140 -0
  69. package/dist/probes/tests-oracle-quality.js.map +1 -0
  70. package/dist/probes/types-escape-hatches.d.ts +3 -0
  71. package/dist/probes/types-escape-hatches.d.ts.map +1 -0
  72. package/dist/probes/types-escape-hatches.js +229 -0
  73. package/dist/probes/types-escape-hatches.js.map +1 -0
  74. package/package.json +2 -2
@@ -0,0 +1,198 @@
1
+ import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
+ const PROBE_VERSION = "1.0.0";
3
+ const MAX_SPECS = 5;
4
+ const MAX_TEST_FILES = 40;
5
+ const MAX_CHARS_PER_SPEC = 2_500;
6
+ const MAX_INPUT_CHARS = 18_000;
7
+ const SPEC_DIRS = [
8
+ "specs",
9
+ "spec",
10
+ ".specify",
11
+ "docs/specs",
12
+ "docs/features",
13
+ "features",
14
+ ".features",
15
+ "rfcs",
16
+ "docs/rfcs",
17
+ ];
18
+ const SPEC_FILE = /\.(?:md|markdown)$/i;
19
+ const TEST_FILE = /(?:\.test\.|\.spec\.|__tests__|^tests?\/|^e2e\/)/i;
20
+ const TEST_SOURCE_FILE = /\.(?:ts|tsx|js|jsx|mjs|cjs|py|cs|go|rs|java|kt)$/i;
21
+ const TEST_NAME_LINE = /\b(?:test|it|describe|scenario|context)\s*\(\s*["'`]([^"'`]{4,120})["'`]/i;
22
+ const PY_TEST_NAME = /^\s*def\s+(test_[a-zA-Z0-9_]+)/;
23
+ const GO_TEST_NAME = /^\s*func\s+(Test[A-Za-z0-9_]+)\s*\(/;
24
+ const RUBRIC = {
25
+ task: "Judge whether acceptance criteria and scenario facts in the repo's specs are traceable to executable tests.",
26
+ criteria: [
27
+ {
28
+ id: "criteria-extracted",
29
+ description: "Do the specs contain concrete acceptance criteria, test cases, examples, or Given/When/Then scenarios that can become tests? Vague prose without checkable facts scores low.",
30
+ },
31
+ {
32
+ id: "tests-map-to-criteria",
33
+ description: "Do test names or test files clearly correspond to those criteria or scenarios? Strong traceability means a reviewer can point from a spec bullet to a test.",
34
+ },
35
+ {
36
+ id: "behavior-not-implementation",
37
+ description: "Are the traced tests framed around user-visible behavior, API contracts, or business rules rather than implementation details?",
38
+ },
39
+ {
40
+ id: "coverage-of-negative-cases",
41
+ description: "Are important failure, edge, permission, or invalid-input criteria represented in tests, not only happy paths?",
42
+ },
43
+ ],
44
+ };
45
+ function extractInterestingTestLines(text) {
46
+ const out = [];
47
+ for (const line of text.split(/\n/)) {
48
+ const trimmed = line.trim();
49
+ if (TEST_NAME_LINE.test(trimmed) || PY_TEST_NAME.test(trimmed) || GO_TEST_NAME.test(trimmed)) {
50
+ out.push(trimmed);
51
+ }
52
+ }
53
+ return out;
54
+ }
55
+ function specExcerpt(text) {
56
+ if (text.length <= MAX_CHARS_PER_SPEC)
57
+ return text;
58
+ const half = Math.floor((MAX_CHARS_PER_SPEC - 80) / 2);
59
+ return `${text.slice(0, half)}\n\n[...middle omitted...]\n\n${text.slice(-half)}`;
60
+ }
61
+ export default defineProbe({
62
+ id: "specs.test-traceability",
63
+ version: PROBE_VERSION,
64
+ dimensions: [
65
+ { id: "context", weight: 0.7 },
66
+ { id: "feedback", weight: 1 },
67
+ ],
68
+ tier: "reasoned",
69
+ evidence: ["files", "size_stats", "judge"],
70
+ rationale: `
71
+ Acceptance criteria only become reliable agent feedback when they are
72
+ connected to tests. This probe samples feature specs plus test names and
73
+ asks whether G/W/T, acceptance criteria, and test-case facts are traceable
74
+ to executable checks.
75
+ `,
76
+ remediation: "For every acceptance criterion or Given/When/Then scenario, add or name a matching test. Keep the wording close enough that reviewers and agents can trace spec facts to executable checks, including negative and edge cases.",
77
+ async detect(ev) {
78
+ const specPaths = ev.size_stats.files
79
+ .map((f) => f.path)
80
+ .filter((p) => SPEC_FILE.test(p) && SPEC_DIRS.some((dir) => p.startsWith(`${dir}/`)))
81
+ .sort();
82
+ if (specPaths.length === 0) {
83
+ return { kind: "na", reason: "no feature specs found" };
84
+ }
85
+ const testPaths = ev.size_stats.files
86
+ .map((f) => f.path)
87
+ .filter((p) => TEST_SOURCE_FILE.test(p) && TEST_FILE.test(p))
88
+ .sort();
89
+ if (testPaths.length === 0) {
90
+ return { kind: "na", reason: "no test files detected" };
91
+ }
92
+ const specs = [];
93
+ let chars = 0;
94
+ for (const p of specPaths) {
95
+ if (specs.length >= MAX_SPECS)
96
+ break;
97
+ const text = await ev.files.readText(p);
98
+ if (!text)
99
+ continue;
100
+ const slice = specExcerpt(text);
101
+ specs.push({ path: p, text: slice });
102
+ chars += slice.length;
103
+ if (chars >= MAX_INPUT_CHARS)
104
+ break;
105
+ }
106
+ const tests = [];
107
+ for (const p of testPaths.slice(0, MAX_TEST_FILES)) {
108
+ const text = await ev.files.readText(p);
109
+ const names = text ? extractInterestingTestLines(text) : [];
110
+ tests.push(`${p}${names.length ? `\n${names.map((n) => ` ${n}`).join("\n")}` : ""}`);
111
+ }
112
+ if (specs.length === 0) {
113
+ return { kind: "na", reason: "spec files declared but unreadable" };
114
+ }
115
+ const input = [
116
+ "# Specs",
117
+ specs.map((s) => `## ${s.path}\n${s.text}`).join("\n\n---\n\n"),
118
+ "",
119
+ "# Test files and test names",
120
+ tests.join("\n\n"),
121
+ ]
122
+ .join("\n")
123
+ .slice(0, MAX_INPUT_CHARS);
124
+ const result = await ev.judge.score({
125
+ probeId: "specs.test-traceability",
126
+ probeVersion: PROBE_VERSION,
127
+ input,
128
+ rubric: RUBRIC,
129
+ });
130
+ return {
131
+ kind: "judge",
132
+ score: result.score,
133
+ perCriterion: result.perCriterion,
134
+ rationale: result.rationale,
135
+ model: result.model,
136
+ };
137
+ },
138
+ score: { kind: "judge" },
139
+ fixtures: [
140
+ {
141
+ name: "no-specs",
142
+ evidence: {
143
+ size_stats: {
144
+ source: "git-ls-files",
145
+ totalBytes: 100,
146
+ totalFiles: 1,
147
+ files: [{ path: "src/login.test.ts", bytes: 100, lines: 3, depth: 1 }],
148
+ },
149
+ },
150
+ expect: { reading: { kind: "na", reason: "no feature specs found" }, score: null },
151
+ },
152
+ {
153
+ name: "criteria-traced-to-tests",
154
+ evidence: {
155
+ files: {
156
+ "specs/login.md": "# Login\n\n## Acceptance\n- Given valid credentials, when the user signs in, then the app creates a session.\n- Given invalid credentials, then the app returns an error.\n",
157
+ "src/login.test.ts": 'test("valid credentials create a session", () => {});\ntest("invalid credentials return an error", () => {});\n',
158
+ },
159
+ size_stats: {
160
+ source: "git-ls-files",
161
+ totalBytes: 300,
162
+ totalFiles: 2,
163
+ files: [
164
+ { path: "specs/login.md", bytes: 180, lines: 5, depth: 1 },
165
+ { path: "src/login.test.ts", bytes: 120, lines: 2, depth: 1 },
166
+ ],
167
+ },
168
+ judge: {
169
+ score: 80,
170
+ perCriterion: {
171
+ "criteria-extracted": 80,
172
+ "tests-map-to-criteria": 80,
173
+ "behavior-not-implementation": 80,
174
+ "coverage-of-negative-cases": 80,
175
+ },
176
+ rationale: "Concrete criteria are named in matching behavior tests.",
177
+ model: "fixture",
178
+ },
179
+ },
180
+ expect: {
181
+ reading: {
182
+ kind: "judge",
183
+ score: 80,
184
+ perCriterion: {
185
+ "criteria-extracted": 80,
186
+ "tests-map-to-criteria": 80,
187
+ "behavior-not-implementation": 80,
188
+ "coverage-of-negative-cases": 80,
189
+ },
190
+ rationale: "Concrete criteria are named in matching behavior tests.",
191
+ model: "fixture",
192
+ },
193
+ score: 80,
194
+ },
195
+ },
196
+ ],
197
+ });
198
+ //# sourceMappingURL=specs-test-traceability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"specs-test-traceability.js","sourceRoot":"","sources":["../../src/probes/specs-test-traceability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@esbenwiberg/repofit/sdk").Probe;
2
+ export default _default;
3
+ //# sourceMappingURL=tests-agent-safe-command.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tests-agent-safe-command.d.ts","sourceRoot":"","sources":["../../src/probes/tests-agent-safe-command.ts"],"names":[],"mappings":";AAMA,wBAoKG"}
@@ -0,0 +1,158 @@
1
+ import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
+ const AGENT_SAFE_TEST_SCRIPTS = ["test:agent", "test:unit", "test:smoke", "test:fast"];
3
+ const E2E_TEST_HINT = /\b(playwright|cypress|testcafe|webdriver|selenium|detox|e2e)\b/i;
4
+ export default defineProbe({
5
+ id: "tests.agent-safe-command",
6
+ version: "2.0.0",
7
+ dimensions: [
8
+ { id: "feedback", weight: 1 },
9
+ { id: "latency", weight: 0.5 },
10
+ ],
11
+ tier: "static",
12
+ evidence: ["node_package", "toolchain"],
13
+ rationale: `
14
+ Executed probes should not surprise a repo by running hundreds of browser
15
+ tests. Repofit resolves one test command for the primary stack (Node,
16
+ Python, .NET, or Go). For Node projects it prefers fast agent-safe scripts
17
+ (test:agent, test:unit, test:smoke, test:fast) before npm test. If the
18
+ resolved command looks e2e-heavy, this probe asks the repo to expose a
19
+ smaller verification command or configure toolchain.commands.test.
20
+ `,
21
+ remediation: "Expose a fast verification command for the primary stack. Node: add `test:agent`, `test:unit`, `test:smoke`, or `test:fast`, and keep full browser/e2e suites under `test:e2e` or an explicit CI-only command. Python/.NET/Go: keep the default test command focused on the fast suite, or set `toolchain.commands.test` in `repofit.config.json` to the exact command repofit should run in executed mode.",
22
+ async detect(ev) {
23
+ if (!ev.toolchain.primary)
24
+ return { kind: "na", reason: "no supported primary stack" };
25
+ const items = [];
26
+ const resolvedTest = ev.toolchain.commands.test;
27
+ if (!resolvedTest) {
28
+ items.push({
29
+ location: { path: "repofit.config.json#toolchain.commands.test" },
30
+ severity: "warn",
31
+ message: "no fast test command resolved for the primary stack",
32
+ });
33
+ return { kind: "inventory", items };
34
+ }
35
+ if (ev.toolchain.primary === "node") {
36
+ const scripts = ev.node_package.scripts ?? {};
37
+ const hasSafe = AGENT_SAFE_TEST_SCRIPTS.some((script) => hasScript(scripts, script));
38
+ const test = scripts.test ?? "";
39
+ if (!hasSafe && E2E_TEST_HINT.test(test)) {
40
+ items.push({
41
+ location: { path: "package.json#scripts.test" },
42
+ severity: "warn",
43
+ message: "npm test looks e2e-heavy; add test:agent/test:unit/test:smoke or configure toolchain.commands.test",
44
+ });
45
+ }
46
+ }
47
+ const argvText = resolvedTest.argv.join(" ");
48
+ if (resolvedTest.source !== "node" && E2E_TEST_HINT.test(argvText)) {
49
+ items.push({
50
+ location: { path: "repofit.config.json#toolchain.commands.test" },
51
+ severity: "warn",
52
+ message: "resolved test command looks e2e-heavy; configure toolchain.commands.test with a faster suite",
53
+ });
54
+ }
55
+ return { kind: "inventory", items };
56
+ },
57
+ score: {
58
+ kind: "inventory",
59
+ severityWeights: { info: 1, warn: 3, error: 10 },
60
+ bands: [{ upTo: 0, score: 100 }, { upTo: 3, score: 70 }, { score: 0 }],
61
+ },
62
+ fixtures: [
63
+ {
64
+ name: "no-supported-stack",
65
+ evidence: { toolchain: { primary: null } },
66
+ expect: { reading: { kind: "na", reason: "no supported primary stack" }, score: null },
67
+ },
68
+ {
69
+ name: "python-pytest-is-safe",
70
+ evidence: {
71
+ toolchain: {
72
+ stacks: ["python"],
73
+ primary: "python",
74
+ commands: { test: { source: "python", argv: ["pytest"] } },
75
+ },
76
+ },
77
+ expect: { reading: { kind: "inventory", items: [] }, score: 100 },
78
+ },
79
+ {
80
+ name: "primary-stack-without-test-command",
81
+ evidence: {
82
+ toolchain: {
83
+ stacks: ["python"],
84
+ primary: "python",
85
+ commands: { test: null },
86
+ },
87
+ },
88
+ expect: {
89
+ reading: {
90
+ kind: "inventory",
91
+ items: [
92
+ {
93
+ location: { path: "repofit.config.json#toolchain.commands.test" },
94
+ severity: "warn",
95
+ message: "no fast test command resolved for the primary stack",
96
+ },
97
+ ],
98
+ },
99
+ score: 70,
100
+ },
101
+ },
102
+ {
103
+ name: "safe-test-script-present",
104
+ evidence: {
105
+ toolchain: {
106
+ stacks: ["node"],
107
+ primary: "node",
108
+ commands: { test: { source: "node", argv: ["npm", "run", "test:agent", "--silent"] } },
109
+ },
110
+ node_package: {
111
+ present: true,
112
+ scripts: { test: "playwright test", "test:agent": "vitest run" },
113
+ },
114
+ },
115
+ expect: { reading: { kind: "inventory", items: [] }, score: 100 },
116
+ },
117
+ {
118
+ name: "normal-npm-test",
119
+ evidence: {
120
+ toolchain: {
121
+ stacks: ["node"],
122
+ primary: "node",
123
+ commands: { test: { source: "node", argv: ["npm", "test", "--silent"] } },
124
+ },
125
+ node_package: { present: true, scripts: { test: "vitest run" } },
126
+ },
127
+ expect: { reading: { kind: "inventory", items: [] }, score: 100 },
128
+ },
129
+ {
130
+ name: "e2e-only-npm-test",
131
+ evidence: {
132
+ toolchain: {
133
+ stacks: ["node"],
134
+ primary: "node",
135
+ commands: { test: { source: "node", argv: ["npm", "test", "--silent"] } },
136
+ },
137
+ node_package: { present: true, scripts: { test: "playwright test" } },
138
+ },
139
+ expect: {
140
+ reading: {
141
+ kind: "inventory",
142
+ items: [
143
+ {
144
+ location: { path: "package.json#scripts.test" },
145
+ severity: "warn",
146
+ message: "npm test looks e2e-heavy; add test:agent/test:unit/test:smoke or configure toolchain.commands.test",
147
+ },
148
+ ],
149
+ },
150
+ score: 70,
151
+ },
152
+ },
153
+ ],
154
+ });
155
+ function hasScript(scripts, name) {
156
+ return typeof scripts[name] === "string" && scripts[name].trim().length > 0;
157
+ }
158
+ //# sourceMappingURL=tests-agent-safe-command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tests-agent-safe-command.js","sourceRoot":"","sources":["../../src/probes/tests-agent-safe-command.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tests-cover-public-surface.d.ts","sourceRoot":"","sources":["../../src/probes/tests-cover-public-surface.ts"],"names":[],"mappings":";AA4CA,wBA2JG"}
1
+ {"version":3,"file":"tests-cover-public-surface.d.ts","sourceRoot":"","sources":["../../src/probes/tests-cover-public-surface.ts"],"names":[],"mappings":";AAuGA,wBA8LG"}
@@ -1,20 +1,17 @@
1
1
  import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
- const PROBE_VERSION = "1.0.0";
2
+ const PROBE_VERSION = "2.0.0";
3
3
  const MAX_SOURCE_FILES = 30;
4
4
  const MAX_TEST_FILES = 30;
5
5
  const MAX_INPUT_CHARS = 12_000;
6
- const TEST_FILE = /(?:\.test\.|\.spec\.|__tests__|^tests?\/)/i;
7
- const EXPORT_LINE = /^\s*export\s+(?:(?:async\s+)?function|class|const|let|var|interface|type|enum|default)\s+\w+/m;
8
- const EXPORT_NAMED_BRACE = /^\s*export\s*\{[^}]+\}/m;
9
- const IMPORT_LINE = /^\s*import\s.+?from\s+["'][^"']+["']/m;
10
- const SOURCE_FILE = /\.(?:ts|tsx|js|mjs|cjs)$/;
11
- const SKIP_DIRS = /(?:^|\/)(?:node_modules|dist|build|coverage|\.next|\.nuxt|out)\//;
6
+ const TEST_FILE = /(?:\.test\.|\.spec\.|__tests__|^tests?\/|(?:^|\/)test_[^/]+\.py$|(?:^|\/)[^/]+_test\.go$|(?:^|\/)[^/]+Tests?\.cs$)/i;
7
+ const SOURCE_FILE = /\.(?:ts|tsx|js|jsx|mjs|cjs|py|cs|go)$/i;
8
+ const SKIP_DIRS = /(?:^|\/)(?:node_modules|dist|build|coverage|\.next|\.nuxt|out|\.venv|venv|__pycache__|bin|obj)\//;
12
9
  const RUBRIC = {
13
- task: "Judge whether the test suite meaningfully covers this project's public surface — the named exports an agent would likely modify — based on what gets imported in tests.",
10
+ task: "Judge whether the test suite meaningfully covers this project's public surface — the exported/public functions, classes, types, and packages an agent would likely modify — based on what tests import or reference.",
14
11
  criteria: [
15
12
  {
16
13
  id: "surface-named",
17
- description: "Do the project's named exports (functions, classes, types from index/entry files) appear by name in test imports? Tests that only import and run main entry points without reference to specific exports score low; tests that import named symbols and exercise them score high.",
14
+ description: "Do the project's public symbols (JS/TS exports, Python top-level public defs/classes, Go exported identifiers, .NET public types/members) appear by name in test imports or references? Tests that only run main entry points without reference to specific public symbols score low.",
18
15
  },
19
16
  {
20
17
  id: "breadth",
@@ -34,6 +31,56 @@ function extract(text, pattern) {
34
31
  }
35
32
  return out;
36
33
  }
34
+ function extractPublicSurface(path, text) {
35
+ if (/\.(?:ts|tsx|js|jsx|mjs|cjs)$/i.test(path)) {
36
+ return [
37
+ ...extract(text, /^\s*export\s+(?:(?:async\s+)?function|class|const|let|var|interface|type|enum|default)\s+\w+/),
38
+ ...extract(text, /^\s*export\s*\{[^}]+\}/),
39
+ ];
40
+ }
41
+ if (/\.py$/i.test(path)) {
42
+ return [
43
+ ...extract(text, /^(?:async\s+)?def\s+[A-Za-z]\w*\s*\(/),
44
+ ...extract(text, /^class\s+[A-Za-z]\w*\b/),
45
+ ];
46
+ }
47
+ if (/\.go$/i.test(path)) {
48
+ return [
49
+ ...extract(text, /^func\s+(?:\([^)]*\)\s*)?[A-Z]\w*\s*\(/),
50
+ ...extract(text, /^type\s+[A-Z]\w*\b/),
51
+ ...extract(text, /^var\s+[A-Z]\w*\b/),
52
+ ...extract(text, /^const\s+[A-Z]\w*\b/),
53
+ ];
54
+ }
55
+ if (/\.cs$/i.test(path)) {
56
+ return [
57
+ ...extract(text, /^\s*public\s+(?:sealed\s+|abstract\s+|static\s+|partial\s+)*(?:class|record|interface|enum|struct)\s+\w+/),
58
+ ...extract(text, /^\s*public\s+(?:static\s+|virtual\s+|override\s+|async\s+)*[\w<>[\],.?]+\s+\w+\s*\(/),
59
+ ];
60
+ }
61
+ return [];
62
+ }
63
+ function extractTestReferences(path, text) {
64
+ if (/\.(?:ts|tsx|js|jsx|mjs|cjs)$/i.test(path)) {
65
+ return extract(text, /^\s*import\s.+?from\s+["'][^"']+["']/);
66
+ }
67
+ if (/\.py$/i.test(path)) {
68
+ return [
69
+ ...extract(text, /^\s*from\s+[A-Za-z_][\w.]*\s+import\s+.+/),
70
+ ...extract(text, /^\s*import\s+[A-Za-z_][\w.]*(?:\s+as\s+\w+)?/),
71
+ ];
72
+ }
73
+ if (/\.go$/i.test(path)) {
74
+ return [
75
+ ...extract(text, /^\s*import\s+(?:\w+\s+)?".+"/),
76
+ ...extract(text, /^\s*(?:\w+\s+)?".+"$/),
77
+ ];
78
+ }
79
+ if (/\.cs$/i.test(path)) {
80
+ return extract(text, /^\s*using\s+[\w.]+;/);
81
+ }
82
+ return [];
83
+ }
37
84
  export default defineProbe({
38
85
  id: "tests.cover-public-surface",
39
86
  version: PROBE_VERSION,
@@ -73,7 +120,7 @@ export default defineProbe({
73
120
  const text = await ev.files.readText(p);
74
121
  if (!text)
75
122
  continue;
76
- const lines = [...extract(text, EXPORT_LINE), ...extract(text, EXPORT_NAMED_BRACE)];
123
+ const lines = extractPublicSurface(p, text);
77
124
  for (const l of lines)
78
125
  exportLines.push(`${p}: ${l}`);
79
126
  }
@@ -83,7 +130,7 @@ export default defineProbe({
83
130
  const text = await ev.files.readText(p);
84
131
  if (!text)
85
132
  continue;
86
- const lines = extract(text, IMPORT_LINE);
133
+ const lines = extractTestReferences(p, text);
87
134
  for (const l of lines)
88
135
  importLines.push(`${p}: ${l}`);
89
136
  }
@@ -91,7 +138,7 @@ export default defineProbe({
91
138
  return { kind: "na", reason: "no exports or test imports could be extracted" };
92
139
  }
93
140
  const inputParts = [];
94
- inputParts.push(`# Project shape`, `${sourcePaths.length} source files, ${testPaths.length} test files`, `(showing exports from up to ${MAX_SOURCE_FILES} sources, imports from up to ${MAX_TEST_FILES} tests)`, "", "# Test file paths", testsToScan.join("\n"), "", "# Exports from source files", exportLines.join("\n"), "", "# Imports inside test files", importLines.join("\n"));
141
+ inputParts.push(`# Project shape`, `${sourcePaths.length} source files, ${testPaths.length} test files`, `(showing exports from up to ${MAX_SOURCE_FILES} sources, imports from up to ${MAX_TEST_FILES} tests)`, "", "# Test file paths", testsToScan.join("\n"), "", "# Public surface from source files", exportLines.join("\n"), "", "# Imports/references inside test files", importLines.join("\n"));
95
142
  const input = inputParts.join("\n").slice(0, MAX_INPUT_CHARS);
96
143
  const result = await ev.judge.score({
97
144
  probeId: "tests.cover-public-surface",
@@ -167,6 +214,40 @@ export default defineProbe({
167
214
  score: 80,
168
215
  },
169
216
  },
217
+ {
218
+ name: "python-public-surface",
219
+ evidence: {
220
+ size_stats: {
221
+ source: "git-ls-files",
222
+ totalBytes: 200,
223
+ totalFiles: 2,
224
+ files: [
225
+ { path: "src/demo/scoring.py", bytes: 100, lines: 10, depth: 2 },
226
+ { path: "tests/test_scoring.py", bytes: 100, lines: 10, depth: 1 },
227
+ ],
228
+ },
229
+ files: {
230
+ "src/demo/scoring.py": "def score(value: int) -> int:\n return value * 2\n",
231
+ "tests/test_scoring.py": "from demo.scoring import score\n\ndef test_score():\n assert score(2) == 4\n",
232
+ },
233
+ judge: {
234
+ score: 80,
235
+ perCriterion: { "surface-named": 80, breadth: 80, discoverability: 80 },
236
+ rationale: "Python public function imported by name from mirrored tests.",
237
+ model: "fixture",
238
+ },
239
+ },
240
+ expect: {
241
+ reading: {
242
+ kind: "judge",
243
+ score: 80,
244
+ perCriterion: { "surface-named": 80, breadth: 80, discoverability: 80 },
245
+ rationale: "Python public function imported by name from mirrored tests.",
246
+ model: "fixture",
247
+ },
248
+ score: 80,
249
+ },
250
+ },
170
251
  ],
171
252
  });
172
253
  //# sourceMappingURL=tests-cover-public-surface.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tests-cover-public-surface.js","sourceRoot":"","sources":["../../src/probes/tests-cover-public-surface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,aAAa,GAAG,OAAO,CAAC;AAC9B,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,MAAM,SAAS,GAAG,4CAA4C,CAAC;AAC/D,MAAM,WAAW,GACf,+FAA+F,CAAC;AAClG,MAAM,kBAAkB,GAAG,yBAAyB,CAAC;AACrD,MAAM,WAAW,GAAG,uCAAuC,CAAC;AAC5D,MAAM,WAAW,GAAG,0BAA0B,CAAC;AAC/C,MAAM,SAAS,GAAG,kEAAkE,CAAC;AAErF,MAAM,MAAM,GAAG;IACb,IAAI,EAAE,yKAAyK;IAC/K,QAAQ,EAAE;QACR;YACE,EAAE,EAAE,eAAe;YACnB,WAAW,EACT,mRAAmR;SACtR;QACD;YACE,EAAE,EAAE,SAAS;YACb,WAAW,EACT,kOAAkO;SACrO;QACD;YACE,EAAE,EAAE,iBAAiB;YACrB,WAAW,EACT,wPAAwP;SAC3P;KACF;CACO,CAAC;AAEX,SAAS,OAAO,CAAC,IAAY,EAAE,OAAe;IAC5C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,eAAe,WAAW,CAAC;IACzB,EAAE,EAAE,4BAA4B;IAChC,OAAO,EAAE,aAAa;IACtB,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC3C,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC;IAE1C,SAAS,EAAE;;;;;;;GAOV;IAED,WAAW,EACT,wTAAwT;IAE1T,KAAK,CAAC,MAAM,CAAC,EAAE;QACb,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAElE,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;gBACpC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;QAC1D,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;QAC5D,CAAC;QAED,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAC7D,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,MAAM,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC,CAAC;YACpF,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACvD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YACzC,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,+CAA+C,EAAE,CAAC;QACjF,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,UAAU,CAAC,IAAI,CACb,iBAAiB,EACjB,GAAG,WAAW,CAAC,MAAM,kBAAkB,SAAS,CAAC,MAAM,aAAa,EACpE,+BAA+B,gBAAgB,gCAAgC,cAAc,SAAS,EACtG,EAAE,EACF,mBAAmB,EACnB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EACtB,EAAE,EACF,6BAA6B,EAC7B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EACtB,EAAE,EACF,6BAA6B,EAC7B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CACvB,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;QAE9D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;YAClC,OAAO,EAAE,4BAA4B;YACrC,YAAY,EAAE,aAAa;YAC3B,KAAK;YACL,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QAEH,OAAO;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC;IACJ,CAAC;IAED,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;IAExB,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR,UAAU,EAAE;oBACV,MAAM,EAAE,cAAc;oBACtB,UAAU,EAAE,GAAG;oBACf,UAAU,EAAE,CAAC;oBACb,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;iBACnE;aACF;YACD,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,wBAAwB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SACnF;QACD;YACE,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE;gBACR,UAAU,EAAE;oBACV,MAAM,EAAE,cAAc;oBACtB,UAAU,EAAE,GAAG;oBACf,UAAU,EAAE,CAAC;oBACb,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;iBACvE;aACF;YACD,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,0BAA0B,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SACrF;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE;gBACR,UAAU,EAAE;oBACV,MAAM,EAAE,cAAc;oBACtB,UAAU,EAAE,GAAG;oBACf,UAAU,EAAE,CAAC;oBACb,KAAK,EAAE;wBACL,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;wBACzD,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;qBAC/D;iBACF;gBACD,KAAK,EAAE;oBACL,cAAc,EAAE,sDAAsD;oBACtE,mBAAmB,EAAE,8DAA8D;iBACpF;gBACD,KAAK,EAAE;oBACL,KAAK,EAAE,EAAE;oBACT,YAAY,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;oBACvE,SAAS,EAAE,8CAA8C;oBACzD,KAAK,EAAE,SAAS;iBACjB;aACF;YACD,MAAM,EAAE;gBACN,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE;oBACT,YAAY,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;oBACvE,SAAS,EAAE,8CAA8C;oBACzD,KAAK,EAAE,SAAS;iBACjB;gBACD,KAAK,EAAE,EAAE;aACV;SACF;KACF;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"tests-cover-public-surface.js","sourceRoot":"","sources":["../../src/probes/tests-cover-public-surface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,aAAa,GAAG,OAAO,CAAC;AAC9B,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,cAAc,GAAG,EAAE,CAAC;AAC1B,MAAM,eAAe,GAAG,MAAM,CAAC;AAE/B,MAAM,SAAS,GACb,qHAAqH,CAAC;AACxH,MAAM,WAAW,GAAG,wCAAwC,CAAC;AAC7D,MAAM,SAAS,GACb,kGAAkG,CAAC;AAErG,MAAM,MAAM,GAAG;IACb,IAAI,EAAE,sNAAsN;IAC5N,QAAQ,EAAE;QACR;YACE,EAAE,EAAE,eAAe;YACnB,WAAW,EACT,uRAAuR;SAC1R;QACD;YACE,EAAE,EAAE,SAAS;YACb,WAAW,EACT,kOAAkO;SACrO;QACD;YACE,EAAE,EAAE,iBAAiB;YACrB,WAAW,EACT,wPAAwP;SAC3P;KACF;CACO,CAAC;AAEX,SAAS,OAAO,CAAC,IAAY,EAAE,OAAe;IAC5C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY,EAAE,IAAY;IACtD,IAAI,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,OAAO;YACL,GAAG,OAAO,CACR,IAAI,EACJ,8FAA8F,CAC/F;YACD,GAAG,OAAO,CAAC,IAAI,EAAE,wBAAwB,CAAC;SAC3C,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,GAAG,OAAO,CAAC,IAAI,EAAE,sCAAsC,CAAC;YACxD,GAAG,OAAO,CAAC,IAAI,EAAE,wBAAwB,CAAC;SAC3C,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,GAAG,OAAO,CAAC,IAAI,EAAE,wCAAwC,CAAC;YAC1D,GAAG,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC;YACtC,GAAG,OAAO,CAAC,IAAI,EAAE,mBAAmB,CAAC;YACrC,GAAG,OAAO,CAAC,IAAI,EAAE,qBAAqB,CAAC;SACxC,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,GAAG,OAAO,CACR,IAAI,EACJ,0GAA0G,CAC3G;YACD,GAAG,OAAO,CACR,IAAI,EACJ,qFAAqF,CACtF;SACF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY,EAAE,IAAY;IACvD,IAAI,+BAA+B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/C,OAAO,OAAO,CAAC,IAAI,EAAE,sCAAsC,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,GAAG,OAAO,CAAC,IAAI,EAAE,0CAA0C,CAAC;YAC5D,GAAG,OAAO,CAAC,IAAI,EAAE,8CAA8C,CAAC;SACjE,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO;YACL,GAAG,OAAO,CAAC,IAAI,EAAE,8BAA8B,CAAC;YAChD,GAAG,OAAO,CAAC,IAAI,EAAE,sBAAsB,CAAC;SACzC,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,OAAO,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,eAAe,WAAW,CAAC;IACzB,EAAE,EAAE,4BAA4B;IAChC,OAAO,EAAE,aAAa;IACtB,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC3C,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC;IAE1C,SAAS,EAAE;;;;;;;GAOV;IAED,WAAW,EACT,wTAAwT;IAE1T,KAAK,CAAC,MAAM,CAAC,EAAE;QACb,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK;aACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAElE,MAAM,SAAS,GAAa,EAAE,CAAC;QAC/B,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;gBAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;;gBACpC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;QAC1D,CAAC;QACD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,0BAA0B,EAAE,CAAC;QAC5D,CAAC;QAED,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,aAAa,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAC7D,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,MAAM,KAAK,GAAG,oBAAoB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC5C,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,MAAM,WAAW,GAAa,EAAE,CAAC;QACjC,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;QACvD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,MAAM,KAAK,GAAG,qBAAqB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC7C,KAAK,MAAM,CAAC,IAAI,KAAK;gBAAE,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzD,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,+CAA+C,EAAE,CAAC;QACjF,CAAC;QAED,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,UAAU,CAAC,IAAI,CACb,iBAAiB,EACjB,GAAG,WAAW,CAAC,MAAM,kBAAkB,SAAS,CAAC,MAAM,aAAa,EACpE,+BAA+B,gBAAgB,gCAAgC,cAAc,SAAS,EACtG,EAAE,EACF,mBAAmB,EACnB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EACtB,EAAE,EACF,oCAAoC,EACpC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EACtB,EAAE,EACF,wCAAwC,EACxC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CACvB,CAAC;QACF,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC;QAE9D,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC;YAClC,OAAO,EAAE,4BAA4B;YACrC,YAAY,EAAE,aAAa;YAC3B,KAAK;YACL,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;QAEH,OAAO;YACL,IAAI,EAAE,OAAO;YACb,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,YAAY,EAAE,MAAM,CAAC,YAAY;YACjC,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC;IACJ,CAAC;IAED,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE;IAExB,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,UAAU;YAChB,QAAQ,EAAE;gBACR,UAAU,EAAE;oBACV,MAAM,EAAE,cAAc;oBACtB,UAAU,EAAE,GAAG;oBACf,UAAU,EAAE,CAAC;oBACb,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;iBACnE;aACF;YACD,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,wBAAwB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SACnF;QACD;YACE,IAAI,EAAE,YAAY;YAClB,QAAQ,EAAE;gBACR,UAAU,EAAE;oBACV,MAAM,EAAE,cAAc;oBACtB,UAAU,EAAE,GAAG;oBACf,UAAU,EAAE,CAAC;oBACb,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;iBACvE;aACF;YACD,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,0BAA0B,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SACrF;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE;gBACR,UAAU,EAAE;oBACV,MAAM,EAAE,cAAc;oBACtB,UAAU,EAAE,GAAG;oBACf,UAAU,EAAE,CAAC;oBACb,KAAK,EAAE;wBACL,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;wBACzD,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;qBAC/D;iBACF;gBACD,KAAK,EAAE;oBACL,cAAc,EAAE,sDAAsD;oBACtE,mBAAmB,EAAE,8DAA8D;iBACpF;gBACD,KAAK,EAAE;oBACL,KAAK,EAAE,EAAE;oBACT,YAAY,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;oBACvE,SAAS,EAAE,8CAA8C;oBACzD,KAAK,EAAE,SAAS;iBACjB;aACF;YACD,MAAM,EAAE;gBACN,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE;oBACT,YAAY,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;oBACvE,SAAS,EAAE,8CAA8C;oBACzD,KAAK,EAAE,SAAS;iBACjB;gBACD,KAAK,EAAE,EAAE;aACV;SACF;QACD;YACE,IAAI,EAAE,uBAAuB;YAC7B,QAAQ,EAAE;gBACR,UAAU,EAAE;oBACV,MAAM,EAAE,cAAc;oBACtB,UAAU,EAAE,GAAG;oBACf,UAAU,EAAE,CAAC;oBACb,KAAK,EAAE;wBACL,EAAE,IAAI,EAAE,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;wBAChE,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;qBACnE;iBACF;gBACD,KAAK,EAAE;oBACL,qBAAqB,EAAE,uDAAuD;oBAC9E,uBAAuB,EACrB,iFAAiF;iBACpF;gBACD,KAAK,EAAE;oBACL,KAAK,EAAE,EAAE;oBACT,YAAY,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;oBACvE,SAAS,EAAE,8DAA8D;oBACzE,KAAK,EAAE,SAAS;iBACjB;aACF;YACD,MAAM,EAAE;gBACN,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE;oBACT,YAAY,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE;oBACvE,SAAS,EAAE,8DAA8D;oBACzE,KAAK,EAAE,SAAS;iBACjB;gBACD,KAAK,EAAE,EAAE;aACV;SACF;KACF;CACF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@esbenwiberg/repofit/sdk").Probe;
2
+ export default _default;
3
+ //# sourceMappingURL=tests-deterministic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tests-deterministic.d.ts","sourceRoot":"","sources":["../../src/probes/tests-deterministic.ts"],"names":[],"mappings":";AAsDA,wBA2KG"}