@esbenwiberg/corpus-default 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +10 -0
- package/dist/dimensions/consistency.d.ts +3 -0
- package/dist/dimensions/consistency.d.ts.map +1 -0
- package/dist/dimensions/consistency.js +8 -0
- package/dist/dimensions/consistency.js.map +1 -0
- package/dist/dimensions/context.d.ts +3 -0
- package/dist/dimensions/context.d.ts.map +1 -0
- package/dist/dimensions/context.js +8 -0
- package/dist/dimensions/context.js.map +1 -0
- package/dist/dimensions/cost.d.ts +3 -0
- package/dist/dimensions/cost.d.ts.map +1 -0
- package/dist/dimensions/cost.js +8 -0
- package/dist/dimensions/cost.js.map +1 -0
- package/dist/dimensions/feedback.d.ts +3 -0
- package/dist/dimensions/feedback.d.ts.map +1 -0
- package/dist/dimensions/feedback.js +8 -0
- package/dist/dimensions/feedback.js.map +1 -0
- package/dist/dimensions/latency.d.ts +3 -0
- package/dist/dimensions/latency.d.ts.map +1 -0
- package/dist/dimensions/latency.js +8 -0
- package/dist/dimensions/latency.js.map +1 -0
- package/dist/dimensions/safety.d.ts +3 -0
- package/dist/dimensions/safety.d.ts.map +1 -0
- package/dist/dimensions/safety.js +8 -0
- package/dist/dimensions/safety.js.map +1 -0
- package/dist/fixers/agent-guidance-present-llm.d.ts +3 -0
- package/dist/fixers/agent-guidance-present-llm.d.ts.map +1 -0
- package/dist/fixers/agent-guidance-present-llm.js +109 -0
- package/dist/fixers/agent-guidance-present-llm.js.map +1 -0
- package/dist/fixers/agent-guidance-present.d.ts +3 -0
- package/dist/fixers/agent-guidance-present.d.ts.map +1 -0
- package/dist/fixers/agent-guidance-present.js +46 -0
- package/dist/fixers/agent-guidance-present.js.map +1 -0
- package/dist/fixers/docs-readme-present-llm.d.ts +3 -0
- package/dist/fixers/docs-readme-present-llm.d.ts.map +1 -0
- package/dist/fixers/docs-readme-present-llm.js +109 -0
- package/dist/fixers/docs-readme-present-llm.js.map +1 -0
- package/dist/fixers/docs-readme-present.d.ts +3 -0
- package/dist/fixers/docs-readme-present.d.ts.map +1 -0
- package/dist/fixers/docs-readme-present.js +41 -0
- package/dist/fixers/docs-readme-present.js.map +1 -0
- package/dist/fixers/editorconfig-present.d.ts +3 -0
- package/dist/fixers/editorconfig-present.d.ts.map +1 -0
- package/dist/fixers/editorconfig-present.js +30 -0
- package/dist/fixers/editorconfig-present.js.map +1 -0
- package/dist/fixers/gitignore-comprehensive.d.ts +3 -0
- package/dist/fixers/gitignore-comprehensive.d.ts.map +1 -0
- package/dist/fixers/gitignore-comprehensive.js +61 -0
- package/dist/fixers/gitignore-comprehensive.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +153 -0
- package/dist/index.js.map +1 -0
- package/dist/probes/_shared/latency-bands.d.ts +3 -0
- package/dist/probes/_shared/latency-bands.d.ts.map +1 -0
- package/dist/probes/_shared/latency-bands.js +8 -0
- package/dist/probes/_shared/latency-bands.js.map +1 -0
- package/dist/probes/agent-guidance-fresh.d.ts +3 -0
- package/dist/probes/agent-guidance-fresh.d.ts.map +1 -0
- package/dist/probes/agent-guidance-fresh.js +198 -0
- package/dist/probes/agent-guidance-fresh.js.map +1 -0
- package/dist/probes/agent-guidance-nested.d.ts +3 -0
- package/dist/probes/agent-guidance-nested.d.ts.map +1 -0
- package/dist/probes/agent-guidance-nested.js +177 -0
- package/dist/probes/agent-guidance-nested.js.map +1 -0
- package/dist/probes/agent-guidance-present.d.ts +3 -0
- package/dist/probes/agent-guidance-present.d.ts.map +1 -0
- package/dist/probes/agent-guidance-present.js +32 -0
- package/dist/probes/agent-guidance-present.js.map +1 -0
- package/dist/probes/agent-guidance-quality.d.ts +3 -0
- package/dist/probes/agent-guidance-quality.d.ts.map +1 -0
- package/dist/probes/agent-guidance-quality.js +134 -0
- package/dist/probes/agent-guidance-quality.js.map +1 -0
- package/dist/probes/agent-guidance-substance.d.ts +3 -0
- package/dist/probes/agent-guidance-substance.d.ts.map +1 -0
- package/dist/probes/agent-guidance-substance.js +64 -0
- package/dist/probes/agent-guidance-substance.js.map +1 -0
- package/dist/probes/arch-boundaries-clear.d.ts +3 -0
- package/dist/probes/arch-boundaries-clear.d.ts.map +1 -0
- package/dist/probes/arch-boundaries-clear.js +202 -0
- package/dist/probes/arch-boundaries-clear.js.map +1 -0
- package/dist/probes/arch-doc-present.d.ts +3 -0
- package/dist/probes/arch-doc-present.d.ts.map +1 -0
- package/dist/probes/arch-doc-present.js +46 -0
- package/dist/probes/arch-doc-present.js.map +1 -0
- package/dist/probes/arch-doc-quality.d.ts +3 -0
- package/dist/probes/arch-doc-quality.d.ts.map +1 -0
- package/dist/probes/arch-doc-quality.js +138 -0
- package/dist/probes/arch-doc-quality.js.map +1 -0
- package/dist/probes/arch-fitness-tests-configured.d.ts +3 -0
- package/dist/probes/arch-fitness-tests-configured.d.ts.map +1 -0
- package/dist/probes/arch-fitness-tests-configured.js +180 -0
- package/dist/probes/arch-fitness-tests-configured.js.map +1 -0
- package/dist/probes/build-clean.d.ts +3 -0
- package/dist/probes/build-clean.d.ts.map +1 -0
- package/dist/probes/build-clean.js +72 -0
- package/dist/probes/build-clean.js.map +1 -0
- package/dist/probes/build-configured.d.ts +3 -0
- package/dist/probes/build-configured.d.ts.map +1 -0
- package/dist/probes/build-configured.js +158 -0
- package/dist/probes/build-configured.js.map +1 -0
- package/dist/probes/changelog-strategy-declared.d.ts +3 -0
- package/dist/probes/changelog-strategy-declared.d.ts.map +1 -0
- package/dist/probes/changelog-strategy-declared.js +81 -0
- package/dist/probes/changelog-strategy-declared.js.map +1 -0
- package/dist/probes/ci-configured.d.ts +3 -0
- package/dist/probes/ci-configured.d.ts.map +1 -0
- package/dist/probes/ci-configured.js +164 -0
- package/dist/probes/ci-configured.js.map +1 -0
- package/dist/probes/ci-runs-build.d.ts +3 -0
- package/dist/probes/ci-runs-build.d.ts.map +1 -0
- package/dist/probes/ci-runs-build.js +92 -0
- package/dist/probes/ci-runs-build.js.map +1 -0
- package/dist/probes/ci-runs-lint.d.ts +3 -0
- package/dist/probes/ci-runs-lint.d.ts.map +1 -0
- package/dist/probes/ci-runs-lint.js +84 -0
- package/dist/probes/ci-runs-lint.js.map +1 -0
- package/dist/probes/ci-runs-tests.d.ts +3 -0
- package/dist/probes/ci-runs-tests.d.ts.map +1 -0
- package/dist/probes/ci-runs-tests.js +68 -0
- package/dist/probes/ci-runs-tests.js.map +1 -0
- package/dist/probes/ci-runs-typecheck.d.ts +3 -0
- package/dist/probes/ci-runs-typecheck.d.ts.map +1 -0
- package/dist/probes/ci-runs-typecheck.js +89 -0
- package/dist/probes/ci-runs-typecheck.js.map +1 -0
- package/dist/probes/commits-conventional-followed.d.ts +3 -0
- package/dist/probes/commits-conventional-followed.d.ts.map +1 -0
- package/dist/probes/commits-conventional-followed.js +80 -0
- package/dist/probes/commits-conventional-followed.js.map +1 -0
- package/dist/probes/dead-code-configured.d.ts +3 -0
- package/dist/probes/dead-code-configured.d.ts.map +1 -0
- package/dist/probes/dead-code-configured.js +218 -0
- package/dist/probes/dead-code-configured.js.map +1 -0
- package/dist/probes/deps-audit-configured.d.ts +3 -0
- package/dist/probes/deps-audit-configured.d.ts.map +1 -0
- package/dist/probes/deps-audit-configured.js +172 -0
- package/dist/probes/deps-audit-configured.js.map +1 -0
- package/dist/probes/deps-lockfile-present.d.ts +3 -0
- package/dist/probes/deps-lockfile-present.d.ts.map +1 -0
- package/dist/probes/deps-lockfile-present.js +190 -0
- package/dist/probes/deps-lockfile-present.js.map +1 -0
- package/dist/probes/docs-adr-presence.d.ts +3 -0
- package/dist/probes/docs-adr-presence.d.ts.map +1 -0
- package/dist/probes/docs-adr-presence.js +76 -0
- package/dist/probes/docs-adr-presence.js.map +1 -0
- package/dist/probes/docs-adr-quality.d.ts +3 -0
- package/dist/probes/docs-adr-quality.d.ts.map +1 -0
- package/dist/probes/docs-adr-quality.js +128 -0
- package/dist/probes/docs-adr-quality.js.map +1 -0
- package/dist/probes/docs-contributing-present.d.ts +3 -0
- package/dist/probes/docs-contributing-present.d.ts.map +1 -0
- package/dist/probes/docs-contributing-present.js +15 -0
- package/dist/probes/docs-contributing-present.js.map +1 -0
- package/dist/probes/docs-links-resolved.d.ts +3 -0
- package/dist/probes/docs-links-resolved.d.ts.map +1 -0
- package/dist/probes/docs-links-resolved.js +252 -0
- package/dist/probes/docs-links-resolved.js.map +1 -0
- package/dist/probes/docs-readme-clarity.d.ts +3 -0
- package/dist/probes/docs-readme-clarity.d.ts.map +1 -0
- package/dist/probes/docs-readme-clarity.js +118 -0
- package/dist/probes/docs-readme-clarity.js.map +1 -0
- package/dist/probes/docs-readme-present.d.ts +3 -0
- package/dist/probes/docs-readme-present.d.ts.map +1 -0
- package/dist/probes/docs-readme-present.js +15 -0
- package/dist/probes/docs-readme-present.js.map +1 -0
- package/dist/probes/docs-readme-substance.d.ts +3 -0
- package/dist/probes/docs-readme-substance.d.ts.map +1 -0
- package/dist/probes/docs-readme-substance.js +62 -0
- package/dist/probes/docs-readme-substance.js.map +1 -0
- package/dist/probes/editorconfig-present.d.ts +3 -0
- package/dist/probes/editorconfig-present.d.ts.map +1 -0
- package/dist/probes/editorconfig-present.js +15 -0
- package/dist/probes/editorconfig-present.js.map +1 -0
- package/dist/probes/errors-actionability.d.ts +3 -0
- package/dist/probes/errors-actionability.d.ts.map +1 -0
- package/dist/probes/errors-actionability.js +180 -0
- package/dist/probes/errors-actionability.js.map +1 -0
- package/dist/probes/format-clean.d.ts +3 -0
- package/dist/probes/format-clean.d.ts.map +1 -0
- package/dist/probes/format-clean.js +114 -0
- package/dist/probes/format-clean.js.map +1 -0
- package/dist/probes/format-configured.d.ts +3 -0
- package/dist/probes/format-configured.d.ts.map +1 -0
- package/dist/probes/format-configured.js +243 -0
- package/dist/probes/format-configured.js.map +1 -0
- package/dist/probes/git-branch-protection.d.ts +3 -0
- package/dist/probes/git-branch-protection.d.ts.map +1 -0
- package/dist/probes/git-branch-protection.js +47 -0
- package/dist/probes/git-branch-protection.js.map +1 -0
- package/dist/probes/gitignore-comprehensive.d.ts +3 -0
- package/dist/probes/gitignore-comprehensive.d.ts.map +1 -0
- package/dist/probes/gitignore-comprehensive.js +59 -0
- package/dist/probes/gitignore-comprehensive.js.map +1 -0
- package/dist/probes/hooks-gates-lint-test-build.d.ts +3 -0
- package/dist/probes/hooks-gates-lint-test-build.d.ts.map +1 -0
- package/dist/probes/hooks-gates-lint-test-build.js +231 -0
- package/dist/probes/hooks-gates-lint-test-build.js.map +1 -0
- package/dist/probes/hooks-precommit-present.d.ts +3 -0
- package/dist/probes/hooks-precommit-present.d.ts.map +1 -0
- package/dist/probes/hooks-precommit-present.js +43 -0
- package/dist/probes/hooks-precommit-present.js.map +1 -0
- package/dist/probes/latency-build.d.ts +3 -0
- package/dist/probes/latency-build.d.ts.map +1 -0
- package/dist/probes/latency-build.js +53 -0
- package/dist/probes/latency-build.js.map +1 -0
- package/dist/probes/latency-lint.d.ts +3 -0
- package/dist/probes/latency-lint.d.ts.map +1 -0
- package/dist/probes/latency-lint.js +50 -0
- package/dist/probes/latency-lint.js.map +1 -0
- package/dist/probes/latency-test-suite.d.ts +3 -0
- package/dist/probes/latency-test-suite.d.ts.map +1 -0
- package/dist/probes/latency-test-suite.js +75 -0
- package/dist/probes/latency-test-suite.js.map +1 -0
- package/dist/probes/latency-typecheck.d.ts +3 -0
- package/dist/probes/latency-typecheck.d.ts.map +1 -0
- package/dist/probes/latency-typecheck.js +67 -0
- package/dist/probes/latency-typecheck.js.map +1 -0
- package/dist/probes/lint-clean.d.ts +3 -0
- package/dist/probes/lint-clean.d.ts.map +1 -0
- package/dist/probes/lint-clean.js +109 -0
- package/dist/probes/lint-clean.js.map +1 -0
- package/dist/probes/lint-configured.d.ts +3 -0
- package/dist/probes/lint-configured.d.ts.map +1 -0
- package/dist/probes/lint-configured.js +268 -0
- package/dist/probes/lint-configured.js.map +1 -0
- package/dist/probes/readme-commands-runnable.d.ts +3 -0
- package/dist/probes/readme-commands-runnable.d.ts.map +1 -0
- package/dist/probes/readme-commands-runnable.js +307 -0
- package/dist/probes/readme-commands-runnable.js.map +1 -0
- package/dist/probes/runtime-dev-loop-bootable.d.ts +3 -0
- package/dist/probes/runtime-dev-loop-bootable.d.ts.map +1 -0
- package/dist/probes/runtime-dev-loop-bootable.js +239 -0
- package/dist/probes/runtime-dev-loop-bootable.js.map +1 -0
- package/dist/probes/safety-dangerous-script-flags.d.ts +3 -0
- package/dist/probes/safety-dangerous-script-flags.d.ts.map +1 -0
- package/dist/probes/safety-dangerous-script-flags.js +126 -0
- package/dist/probes/safety-dangerous-script-flags.js.map +1 -0
- package/dist/probes/secrets-dotenv-gitignored.d.ts +3 -0
- package/dist/probes/secrets-dotenv-gitignored.d.ts.map +1 -0
- package/dist/probes/secrets-dotenv-gitignored.js +45 -0
- package/dist/probes/secrets-dotenv-gitignored.js.map +1 -0
- package/dist/probes/secrets-precommit-scan-configured.d.ts +3 -0
- package/dist/probes/secrets-precommit-scan-configured.d.ts.map +1 -0
- package/dist/probes/secrets-precommit-scan-configured.js +130 -0
- package/dist/probes/secrets-precommit-scan-configured.js.map +1 -0
- package/dist/probes/secrets-scan-clean.d.ts +3 -0
- package/dist/probes/secrets-scan-clean.d.ts.map +1 -0
- package/dist/probes/secrets-scan-clean.js +80 -0
- package/dist/probes/secrets-scan-clean.js.map +1 -0
- package/dist/probes/size-directory-depth.d.ts +3 -0
- package/dist/probes/size-directory-depth.d.ts.map +1 -0
- package/dist/probes/size-directory-depth.js +80 -0
- package/dist/probes/size-directory-depth.js.map +1 -0
- package/dist/probes/size-large-files.d.ts +3 -0
- package/dist/probes/size-large-files.d.ts.map +1 -0
- package/dist/probes/size-large-files.js +117 -0
- package/dist/probes/size-large-files.js.map +1 -0
- package/dist/probes/size-repo-token-estimate.d.ts +3 -0
- package/dist/probes/size-repo-token-estimate.d.ts.map +1 -0
- package/dist/probes/size-repo-token-estimate.js +83 -0
- package/dist/probes/size-repo-token-estimate.js.map +1 -0
- package/dist/probes/specs-present.d.ts +3 -0
- package/dist/probes/specs-present.d.ts.map +1 -0
- package/dist/probes/specs-present.js +77 -0
- package/dist/probes/specs-present.js.map +1 -0
- package/dist/probes/specs-quality.d.ts +3 -0
- package/dist/probes/specs-quality.d.ts.map +1 -0
- package/dist/probes/specs-quality.js +153 -0
- package/dist/probes/specs-quality.js.map +1 -0
- package/dist/probes/tests-clean.d.ts +3 -0
- package/dist/probes/tests-clean.d.ts.map +1 -0
- package/dist/probes/tests-clean.js +69 -0
- package/dist/probes/tests-clean.js.map +1 -0
- package/dist/probes/tests-cover-public-surface.d.ts +3 -0
- package/dist/probes/tests-cover-public-surface.d.ts.map +1 -0
- package/dist/probes/tests-cover-public-surface.js +172 -0
- package/dist/probes/tests-cover-public-surface.js.map +1 -0
- package/dist/probes/tests-runner-configured.d.ts +3 -0
- package/dist/probes/tests-runner-configured.d.ts.map +1 -0
- package/dist/probes/tests-runner-configured.js +261 -0
- package/dist/probes/tests-runner-configured.js.map +1 -0
- package/dist/probes/types-clean.d.ts +3 -0
- package/dist/probes/types-clean.d.ts.map +1 -0
- package/dist/probes/types-clean.js +72 -0
- package/dist/probes/types-clean.js.map +1 -0
- package/dist/probes/types-configured.d.ts +3 -0
- package/dist/probes/types-configured.d.ts.map +1 -0
- package/dist/probes/types-configured.js +77 -0
- package/dist/probes/types-configured.js.map +1 -0
- package/package.json +30 -0
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { defineProbe } from "@esbenwiberg/repofit/sdk";
|
|
2
|
+
const LINE_THRESHOLD = 2000;
|
|
3
|
+
const BYTE_THRESHOLD = 100 * 1024;
|
|
4
|
+
export default defineProbe({
|
|
5
|
+
id: "size.large-files",
|
|
6
|
+
version: "1.0.0",
|
|
7
|
+
dimensions: [{ id: "cost", weight: 1 }],
|
|
8
|
+
tier: "derived",
|
|
9
|
+
evidence: ["size_stats"],
|
|
10
|
+
rationale: `
|
|
11
|
+
Large files punish agents twice: they cost more tokens to load and they
|
|
12
|
+
invite "find the relevant 20 lines in this 3000-line file" reasoning
|
|
13
|
+
detours. Counting files past a width threshold surfaces the worst
|
|
14
|
+
offenders. Generated files (lockfiles, files marked
|
|
15
|
+
\`linguist-generated\`) are excluded — they're large by necessity and
|
|
16
|
+
no agent should read them end-to-end.
|
|
17
|
+
`,
|
|
18
|
+
remediation: "Split files over ~2000 lines or ~100KB. Common patterns: extract one cohesive class/module per file, move generated code out of the repo (or store under a `generated/` directory excluded from typical edits), break up monolithic config files. Smaller files mean cheaper agent context and less time spent navigating.",
|
|
19
|
+
async detect(ev) {
|
|
20
|
+
if (ev.size_stats.source === "none") {
|
|
21
|
+
return { kind: "na", reason: "no git working tree" };
|
|
22
|
+
}
|
|
23
|
+
const samples = [];
|
|
24
|
+
for (const f of ev.size_stats.files) {
|
|
25
|
+
if (f.generated)
|
|
26
|
+
continue;
|
|
27
|
+
if (f.lines > LINE_THRESHOLD || f.bytes > BYTE_THRESHOLD) {
|
|
28
|
+
samples.push({ path: f.path });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return { kind: "count", value: samples.length, samples };
|
|
32
|
+
},
|
|
33
|
+
score: {
|
|
34
|
+
kind: "count",
|
|
35
|
+
direction: "negative",
|
|
36
|
+
bands: [
|
|
37
|
+
{ upTo: 0, score: 100 },
|
|
38
|
+
{ upTo: 2, score: 80 },
|
|
39
|
+
{ upTo: 5, score: 60 },
|
|
40
|
+
{ upTo: 10, score: 30 },
|
|
41
|
+
{ score: 0 },
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
fixtures: [
|
|
45
|
+
{
|
|
46
|
+
name: "no-large-files",
|
|
47
|
+
evidence: {
|
|
48
|
+
size_stats: {
|
|
49
|
+
source: "git-ls-files",
|
|
50
|
+
totalBytes: 100,
|
|
51
|
+
totalFiles: 1,
|
|
52
|
+
totalBytesEffective: 100,
|
|
53
|
+
totalFilesEffective: 1,
|
|
54
|
+
files: [{ path: "src/index.ts", bytes: 100, lines: 5, depth: 2, generated: false }],
|
|
55
|
+
},
|
|
56
|
+
},
|
|
57
|
+
expect: { reading: { kind: "count", value: 0, samples: [] }, score: 100 },
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: "one-giant",
|
|
61
|
+
evidence: {
|
|
62
|
+
size_stats: {
|
|
63
|
+
source: "git-ls-files",
|
|
64
|
+
totalBytes: 5000000,
|
|
65
|
+
totalFiles: 1,
|
|
66
|
+
totalBytesEffective: 5000000,
|
|
67
|
+
totalFilesEffective: 1,
|
|
68
|
+
files: [
|
|
69
|
+
{ path: "src/legacy.ts", bytes: 5000000, lines: 3000, depth: 2, generated: false },
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
expect: {
|
|
74
|
+
reading: { kind: "count", value: 1, samples: [{ path: "src/legacy.ts" }] },
|
|
75
|
+
score: 80,
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
name: "giant-lockfile-ignored",
|
|
80
|
+
evidence: {
|
|
81
|
+
size_stats: {
|
|
82
|
+
source: "git-ls-files",
|
|
83
|
+
totalBytes: 200000,
|
|
84
|
+
totalFiles: 2,
|
|
85
|
+
totalBytesEffective: 100,
|
|
86
|
+
totalFilesEffective: 1,
|
|
87
|
+
files: [
|
|
88
|
+
{ path: "src/index.ts", bytes: 100, lines: 5, depth: 2, generated: false },
|
|
89
|
+
{
|
|
90
|
+
path: "package-lock.json",
|
|
91
|
+
bytes: 199900,
|
|
92
|
+
lines: 5000,
|
|
93
|
+
depth: 1,
|
|
94
|
+
generated: true,
|
|
95
|
+
},
|
|
96
|
+
],
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
expect: { reading: { kind: "count", value: 0, samples: [] }, score: 100 },
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
name: "no-evidence",
|
|
103
|
+
evidence: {
|
|
104
|
+
size_stats: {
|
|
105
|
+
source: "none",
|
|
106
|
+
totalBytes: 0,
|
|
107
|
+
totalFiles: 0,
|
|
108
|
+
totalBytesEffective: 0,
|
|
109
|
+
totalFilesEffective: 0,
|
|
110
|
+
files: [],
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
expect: { reading: { kind: "na", reason: "no git working tree" }, score: null },
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
});
|
|
117
|
+
//# sourceMappingURL=size-large-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"size-large-files.js","sourceRoot":"","sources":["../../src/probes/size-large-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"size-repo-token-estimate.d.ts","sourceRoot":"","sources":["../../src/probes/size-repo-token-estimate.ts"],"names":[],"mappings":";AAIA,wBAqFG"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { defineProbe } from "@esbenwiberg/repofit/sdk";
|
|
2
|
+
const CHARS_PER_TOKEN = 4;
|
|
3
|
+
export default defineProbe({
|
|
4
|
+
id: "size.repo-token-estimate",
|
|
5
|
+
version: "1.1.0",
|
|
6
|
+
dimensions: [{ id: "cost", weight: 1 }],
|
|
7
|
+
tier: "derived",
|
|
8
|
+
evidence: ["size_stats"],
|
|
9
|
+
rationale: `
|
|
10
|
+
Total tracked bytes divided by a rough chars-per-token constant is a
|
|
11
|
+
crude but stable proxy for "how expensive is full-repo context here?".
|
|
12
|
+
The bands are coarse on purpose: precision matters less than separating
|
|
13
|
+
cheap, moderate, expensive, and genuinely huge full-repo context loads.
|
|
14
|
+
Generated files (lockfiles, \`linguist-generated\`) are excluded from the
|
|
15
|
+
total — they bloat the byte count without ever entering an agent's context.
|
|
16
|
+
`,
|
|
17
|
+
remediation: "If full-repo context is costly, first check whether generated or vendored content is being counted and mark it with `.gitattributes` `linguist-generated=true` when appropriate. For genuinely large repos, split independent subsystems or avoid full-repo context in agent workflows. A moderate score is advisory — it means broad context costs more, not that the repo is inherently too big.",
|
|
18
|
+
async detect(ev) {
|
|
19
|
+
if (ev.size_stats.source === "none") {
|
|
20
|
+
return { kind: "na", reason: "no git working tree" };
|
|
21
|
+
}
|
|
22
|
+
const effectiveBytes = ev.size_stats.totalBytesEffective ?? ev.size_stats.totalBytes;
|
|
23
|
+
const tokens = Math.round(effectiveBytes / CHARS_PER_TOKEN);
|
|
24
|
+
return { kind: "magnitude", value: tokens, unit: "tokens" };
|
|
25
|
+
},
|
|
26
|
+
score: {
|
|
27
|
+
kind: "magnitude",
|
|
28
|
+
direction: "negative",
|
|
29
|
+
bands: [
|
|
30
|
+
{ upTo: 50_000, score: 100 },
|
|
31
|
+
{ upTo: 300_000, score: 80 },
|
|
32
|
+
{ upTo: 600_000, score: 70 },
|
|
33
|
+
{ upTo: 1_000_000, score: 50 },
|
|
34
|
+
{ upTo: 5_000_000, score: 20 },
|
|
35
|
+
{ score: 0 },
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
fixtures: [
|
|
39
|
+
{
|
|
40
|
+
name: "tiny-repo",
|
|
41
|
+
evidence: {
|
|
42
|
+
size_stats: {
|
|
43
|
+
source: "git-ls-files",
|
|
44
|
+
totalBytes: 40_000,
|
|
45
|
+
totalFiles: 5,
|
|
46
|
+
totalBytesEffective: 40_000,
|
|
47
|
+
totalFilesEffective: 5,
|
|
48
|
+
files: [],
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
expect: { reading: { kind: "magnitude", value: 10_000, unit: "tokens" }, score: 100 },
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: "medium-repo",
|
|
55
|
+
evidence: {
|
|
56
|
+
size_stats: {
|
|
57
|
+
source: "git-ls-files",
|
|
58
|
+
totalBytes: 2_000_000,
|
|
59
|
+
totalFiles: 200,
|
|
60
|
+
totalBytesEffective: 2_000_000,
|
|
61
|
+
totalFilesEffective: 200,
|
|
62
|
+
files: [],
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
expect: { reading: { kind: "magnitude", value: 500_000, unit: "tokens" }, score: 70 },
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: "lockfile-doesnt-count",
|
|
69
|
+
evidence: {
|
|
70
|
+
size_stats: {
|
|
71
|
+
source: "git-ls-files",
|
|
72
|
+
totalBytes: 500_000,
|
|
73
|
+
totalFiles: 10,
|
|
74
|
+
totalBytesEffective: 40_000,
|
|
75
|
+
totalFilesEffective: 9,
|
|
76
|
+
files: [],
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
expect: { reading: { kind: "magnitude", value: 10_000, unit: "tokens" }, score: 100 },
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=size-repo-token-estimate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"size-repo-token-estimate.js","sourceRoot":"","sources":["../../src/probes/size-repo-token-estimate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B,eAAe,WAAW,CAAC;IACzB,EAAE,EAAE,0BAA0B;IAC9B,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACvC,IAAI,EAAE,SAAS;IACf,QAAQ,EAAE,CAAC,YAAY,CAAC;IAExB,SAAS,EAAE;;;;;;;GAOV;IAED,WAAW,EACT,oYAAoY;IAEtY,KAAK,CAAC,MAAM,CAAC,EAAE;QACb,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;YACpC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,qBAAqB,EAAE,CAAC;QACvD,CAAC;QACD,MAAM,cAAc,GAAG,EAAE,CAAC,UAAU,CAAC,mBAAmB,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;QACrF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,eAAe,CAAC,CAAC;QAC5D,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC9D,CAAC;IAED,KAAK,EAAE;QACL,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE;YAC5B,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;YAC5B,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE;YAC5B,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;YAC9B,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE;YAC9B,EAAE,KAAK,EAAE,CAAC,EAAE;SACb;KACF;IAED,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE;gBACR,UAAU,EAAE;oBACV,MAAM,EAAE,cAAc;oBACtB,UAAU,EAAE,MAAM;oBAClB,UAAU,EAAE,CAAC;oBACb,mBAAmB,EAAE,MAAM;oBAC3B,mBAAmB,EAAE,CAAC;oBACtB,KAAK,EAAE,EAAE;iBACV;aACF;YACD,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;SACtF;QACD;YACE,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE;gBACR,UAAU,EAAE;oBACV,MAAM,EAAE,cAAc;oBACtB,UAAU,EAAE,SAAS;oBACrB,UAAU,EAAE,GAAG;oBACf,mBAAmB,EAAE,SAAS;oBAC9B,mBAAmB,EAAE,GAAG;oBACxB,KAAK,EAAE,EAAE;iBACV;aACF;YACD,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;SACtF;QACD;YACE,IAAI,EAAE,uBAAuB;YAC7B,QAAQ,EAAE;gBACR,UAAU,EAAE;oBACV,MAAM,EAAE,cAAc;oBACtB,UAAU,EAAE,OAAO;oBACnB,UAAU,EAAE,EAAE;oBACd,mBAAmB,EAAE,MAAM;oBAC3B,mBAAmB,EAAE,CAAC;oBACtB,KAAK,EAAE,EAAE;iBACV;aACF;YACD,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;SACtF;KACF;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specs-present.d.ts","sourceRoot":"","sources":["../../src/probes/specs-present.ts"],"names":[],"mappings":";AAgBA,wBAoEG"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { defineProbe } from "@esbenwiberg/repofit/sdk";
|
|
2
|
+
const SPEC_DIRS = [
|
|
3
|
+
"specs",
|
|
4
|
+
"spec",
|
|
5
|
+
".specify",
|
|
6
|
+
"docs/specs",
|
|
7
|
+
"docs/features",
|
|
8
|
+
"features",
|
|
9
|
+
".features",
|
|
10
|
+
"rfcs",
|
|
11
|
+
"docs/rfcs",
|
|
12
|
+
];
|
|
13
|
+
const SPEC_FILE = /\.(?:md|markdown)$/i;
|
|
14
|
+
export default defineProbe({
|
|
15
|
+
id: "specs.present",
|
|
16
|
+
version: "1.0.0",
|
|
17
|
+
dimensions: [{ id: "context", weight: 1 }],
|
|
18
|
+
tier: "derived",
|
|
19
|
+
evidence: ["files", "size_stats"],
|
|
20
|
+
rationale: `
|
|
21
|
+
Spec-driven development — a short doc per feature with description,
|
|
22
|
+
design, acceptance criteria, and test cases — is the most reliable way
|
|
23
|
+
to keep agents and humans aligned on what to build. A repo with a
|
|
24
|
+
specs/ or .specify/ directory of feature specs gives the agent the
|
|
25
|
+
same starting point a human gets. This probe checks for that directory
|
|
26
|
+
and at least one spec file inside it.
|
|
27
|
+
`,
|
|
28
|
+
remediation: "Create a `specs/` (or `.specify/`) directory and put one markdown file per feature in it. Each spec should cover: problem, design sketch, acceptance criteria, and edge cases. Even a single short spec is a meaningful signal.",
|
|
29
|
+
async detect(ev) {
|
|
30
|
+
for (const dir of SPEC_DIRS) {
|
|
31
|
+
if (!ev.files.has(dir))
|
|
32
|
+
continue;
|
|
33
|
+
const hasSpec = ev.size_stats.files.some((f) => f.path.startsWith(`${dir}/`) && SPEC_FILE.test(f.path));
|
|
34
|
+
if (hasSpec)
|
|
35
|
+
return { kind: "predicate", value: true };
|
|
36
|
+
}
|
|
37
|
+
return { kind: "predicate", value: false };
|
|
38
|
+
},
|
|
39
|
+
score: { kind: "predicate", direction: "positive" },
|
|
40
|
+
fixtures: [
|
|
41
|
+
{
|
|
42
|
+
name: "specs-dir-with-md",
|
|
43
|
+
evidence: {
|
|
44
|
+
files: ["specs", "specs/auth.md"],
|
|
45
|
+
size_stats: {
|
|
46
|
+
source: "git-ls-files",
|
|
47
|
+
totalBytes: 100,
|
|
48
|
+
totalFiles: 1,
|
|
49
|
+
files: [{ path: "specs/auth.md", bytes: 100, lines: 10, depth: 1 }],
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
expect: { reading: { kind: "predicate", value: true }, score: 100 },
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
name: "specify-dir",
|
|
56
|
+
evidence: {
|
|
57
|
+
files: [".specify", ".specify/login.md"],
|
|
58
|
+
size_stats: {
|
|
59
|
+
source: "git-ls-files",
|
|
60
|
+
totalBytes: 100,
|
|
61
|
+
totalFiles: 1,
|
|
62
|
+
files: [{ path: ".specify/login.md", bytes: 100, lines: 10, depth: 1 }],
|
|
63
|
+
},
|
|
64
|
+
},
|
|
65
|
+
expect: { reading: { kind: "predicate", value: true }, score: 100 },
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: "no-specs",
|
|
69
|
+
evidence: {
|
|
70
|
+
files: [],
|
|
71
|
+
size_stats: { files: [], totalBytes: 0, totalFiles: 0, source: "git-ls-files" },
|
|
72
|
+
},
|
|
73
|
+
expect: { reading: { kind: "predicate", value: false }, score: 0 },
|
|
74
|
+
},
|
|
75
|
+
],
|
|
76
|
+
});
|
|
77
|
+
//# sourceMappingURL=specs-present.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specs-present.js","sourceRoot":"","sources":["../../src/probes/specs-present.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specs-quality.d.ts","sourceRoot":"","sources":["../../src/probes/specs-quality.ts"],"names":[],"mappings":";AA+CA,wBAyHG"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { defineProbe } from "@esbenwiberg/repofit/sdk";
|
|
2
|
+
const PROBE_VERSION = "1.0.0";
|
|
3
|
+
const MAX_SPECS = 4;
|
|
4
|
+
const MAX_CHARS_PER_SPEC = 4_000;
|
|
5
|
+
const MAX_INPUT_CHARS = 18_000;
|
|
6
|
+
const SPEC_DIRS = [
|
|
7
|
+
"specs",
|
|
8
|
+
"spec",
|
|
9
|
+
".specify",
|
|
10
|
+
"docs/specs",
|
|
11
|
+
"docs/features",
|
|
12
|
+
"features",
|
|
13
|
+
".features",
|
|
14
|
+
"rfcs",
|
|
15
|
+
"docs/rfcs",
|
|
16
|
+
];
|
|
17
|
+
const SPEC_FILE = /\.(?:md|markdown)$/i;
|
|
18
|
+
const RUBRIC = {
|
|
19
|
+
task: "Judge whether the feature specs in this repo would let a coding agent build a feature correctly without further back-and-forth — and whether they'd recognize when the agent's work is done.",
|
|
20
|
+
criteria: [
|
|
21
|
+
{
|
|
22
|
+
id: "description",
|
|
23
|
+
description: "Does each spec actually describe what's being built — the user-facing behaviour, who it's for, what problem it solves? A title and one-liner score low; a clear narrative of the feature scores high.",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
id: "design",
|
|
27
|
+
description: "Is there a design section — data shape, API surface, key flows, UI sketch or wireframe reference, integration points? Specs that jump straight from 'add a search bar' to 'tests' miss the place where ambiguity hides.",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: "acceptance",
|
|
31
|
+
description: "Are there acceptance criteria or test cases — concrete, checkable statements the agent (and reviewer) can verify? Vague 'works well' / 'feels nice' criteria score low; a numbered list of 'when X then Y' statements scores high.",
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: "consistency",
|
|
35
|
+
description: "Do the spec files follow a recognisable shape — same headings, similar level of detail — or do they look like ad-hoc notes from different authors? Consistency is what lets the agent know which section to write into when adding a new feature.",
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
};
|
|
39
|
+
export default defineProbe({
|
|
40
|
+
id: "specs.quality",
|
|
41
|
+
version: PROBE_VERSION,
|
|
42
|
+
dimensions: [{ id: "context", weight: 1 }],
|
|
43
|
+
tier: "reasoned",
|
|
44
|
+
evidence: ["files", "size_stats", "judge"],
|
|
45
|
+
rationale: `
|
|
46
|
+
specs.present checks that a specs/ folder exists with at least one
|
|
47
|
+
file. It can't tell whether those files are actual feature specs
|
|
48
|
+
(description + design + acceptance criteria) or empty templates. This
|
|
49
|
+
probe samples up to four specs and asks an LLM whether they describe
|
|
50
|
+
what to build, how, and how to know when it's done. Cached.
|
|
51
|
+
`,
|
|
52
|
+
remediation: "Each spec should cover four sections: (1) Description — what the feature is and who it's for, (2) Design — data shape, API surface, key flows, (3) Acceptance — concrete checkable criteria ('given X, then Y'), (4) consistent shape across specs (same headings, similar depth). The goal: an agent reads one spec and can build the feature without further questions.",
|
|
53
|
+
async detect(ev) {
|
|
54
|
+
const specPaths = [];
|
|
55
|
+
for (const f of ev.size_stats.files) {
|
|
56
|
+
if (!SPEC_FILE.test(f.path))
|
|
57
|
+
continue;
|
|
58
|
+
if (SPEC_DIRS.some((dir) => f.path.startsWith(`${dir}/`))) {
|
|
59
|
+
specPaths.push(f.path);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (specPaths.length === 0) {
|
|
63
|
+
return { kind: "na", reason: "no feature specs found" };
|
|
64
|
+
}
|
|
65
|
+
const sorted = [...new Set(specPaths)].sort();
|
|
66
|
+
const sampled = [];
|
|
67
|
+
let totalChars = 0;
|
|
68
|
+
for (const p of sorted) {
|
|
69
|
+
if (sampled.length >= MAX_SPECS)
|
|
70
|
+
break;
|
|
71
|
+
const text = await ev.files.readText(p);
|
|
72
|
+
if (!text)
|
|
73
|
+
continue;
|
|
74
|
+
const slice = text.slice(0, MAX_CHARS_PER_SPEC);
|
|
75
|
+
sampled.push({ path: p, text: slice });
|
|
76
|
+
totalChars += slice.length;
|
|
77
|
+
if (totalChars >= MAX_INPUT_CHARS)
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
if (sampled.length === 0) {
|
|
81
|
+
return { kind: "na", reason: "spec files declared but unreadable" };
|
|
82
|
+
}
|
|
83
|
+
const input = sampled.map((s) => `# ${s.path}\n\n${s.text}`).join("\n\n---\n\n");
|
|
84
|
+
const result = await ev.judge.score({
|
|
85
|
+
probeId: "specs.quality",
|
|
86
|
+
probeVersion: PROBE_VERSION,
|
|
87
|
+
input,
|
|
88
|
+
rubric: RUBRIC,
|
|
89
|
+
});
|
|
90
|
+
return {
|
|
91
|
+
kind: "judge",
|
|
92
|
+
score: result.score,
|
|
93
|
+
perCriterion: result.perCriterion,
|
|
94
|
+
rationale: result.rationale,
|
|
95
|
+
model: result.model,
|
|
96
|
+
};
|
|
97
|
+
},
|
|
98
|
+
score: { kind: "judge" },
|
|
99
|
+
fixtures: [
|
|
100
|
+
{
|
|
101
|
+
name: "no-specs",
|
|
102
|
+
evidence: {
|
|
103
|
+
files: [],
|
|
104
|
+
size_stats: { files: [], totalBytes: 0, totalFiles: 0, source: "git-ls-files" },
|
|
105
|
+
},
|
|
106
|
+
expect: { reading: { kind: "na", reason: "no feature specs found" }, score: null },
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: "strong-specs",
|
|
110
|
+
evidence: {
|
|
111
|
+
files: {
|
|
112
|
+
"specs/login.md": "# Login\n\n## Problem\nUsers can't sign in.\n## Design\nForm + POST /login.\n## Acceptance\n- given valid creds, returns 200.\n",
|
|
113
|
+
},
|
|
114
|
+
size_stats: {
|
|
115
|
+
source: "git-ls-files",
|
|
116
|
+
totalBytes: 200,
|
|
117
|
+
totalFiles: 2,
|
|
118
|
+
files: [
|
|
119
|
+
{ path: "specs", bytes: 0, lines: 0, depth: 0 },
|
|
120
|
+
{ path: "specs/login.md", bytes: 200, lines: 15, depth: 1 },
|
|
121
|
+
],
|
|
122
|
+
},
|
|
123
|
+
judge: {
|
|
124
|
+
score: 80,
|
|
125
|
+
perCriterion: {
|
|
126
|
+
description: 80,
|
|
127
|
+
design: 80,
|
|
128
|
+
acceptance: 80,
|
|
129
|
+
consistency: 80,
|
|
130
|
+
},
|
|
131
|
+
rationale: "Problem stated, design sketched, acceptance criteria concrete.",
|
|
132
|
+
model: "fixture",
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
expect: {
|
|
136
|
+
reading: {
|
|
137
|
+
kind: "judge",
|
|
138
|
+
score: 80,
|
|
139
|
+
perCriterion: {
|
|
140
|
+
description: 80,
|
|
141
|
+
design: 80,
|
|
142
|
+
acceptance: 80,
|
|
143
|
+
consistency: 80,
|
|
144
|
+
},
|
|
145
|
+
rationale: "Problem stated, design sketched, acceptance criteria concrete.",
|
|
146
|
+
model: "fixture",
|
|
147
|
+
},
|
|
148
|
+
score: 80,
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
});
|
|
153
|
+
//# sourceMappingURL=specs-quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"specs-quality.js","sourceRoot":"","sources":["../../src/probes/specs-quality.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tests-clean.d.ts","sourceRoot":"","sources":["../../src/probes/tests-clean.ts"],"names":[],"mappings":";AAEA,wBAyEG"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { defineProbe } from "@esbenwiberg/repofit/sdk";
|
|
2
|
+
export default defineProbe({
|
|
3
|
+
id: "tests.clean",
|
|
4
|
+
version: "2.0.0",
|
|
5
|
+
dimensions: [{ id: "feedback", weight: 1 }],
|
|
6
|
+
tier: "executed",
|
|
7
|
+
evidence: ["toolchain", "commands"],
|
|
8
|
+
rationale: `
|
|
9
|
+
A configured test runner only helps an agent verify itself if the
|
|
10
|
+
suite is actually green. This runs the test command for the primary
|
|
11
|
+
stack (Node \`npm test\`, Python \`pytest\`, .NET \`dotnet test\`,
|
|
12
|
+
Go \`go test ./...\`) and reports clean only when it exits zero.
|
|
13
|
+
A red suite is a feedback loop the agent can't trust — every change
|
|
14
|
+
looks like it broke something even when it didn't.
|
|
15
|
+
`,
|
|
16
|
+
remediation: "Run the test command for your stack and fix every failing test. If a test is flaky, mark it explicitly (`test.skip`/`it.skip` with a TODO and link) rather than ignoring CI red — an agent reading the repo can't tell the difference between a flake and a real regression. Add a pre-commit or CI gate so the tree stays green.",
|
|
17
|
+
async detect(ev) {
|
|
18
|
+
const cmd = ev.toolchain.commands.test;
|
|
19
|
+
if (!cmd) {
|
|
20
|
+
return {
|
|
21
|
+
kind: "na",
|
|
22
|
+
reason: "no test command — declare commands.test in repofit.config.json, or configure a test runner for your stack (e.g. pytest, an npm 'test' script)",
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
const run = await ev.commands.run({ argv: cmd.argv, timeoutMs: 600_000 });
|
|
26
|
+
if (run.timedOut)
|
|
27
|
+
return { kind: "na", reason: "test command timed out" };
|
|
28
|
+
return { kind: "predicate", value: run.exitCode === 0 };
|
|
29
|
+
},
|
|
30
|
+
score: { kind: "predicate", direction: "positive" },
|
|
31
|
+
fixtures: [
|
|
32
|
+
{
|
|
33
|
+
name: "no-test-command",
|
|
34
|
+
evidence: { toolchain: { primary: null } },
|
|
35
|
+
expect: {
|
|
36
|
+
reading: {
|
|
37
|
+
kind: "na",
|
|
38
|
+
reason: "no test command — declare commands.test in repofit.config.json, or configure a test runner for your stack (e.g. pytest, an npm 'test' script)",
|
|
39
|
+
},
|
|
40
|
+
score: null,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
name: "node-tests-clean",
|
|
45
|
+
evidence: {
|
|
46
|
+
toolchain: {
|
|
47
|
+
stacks: ["node"],
|
|
48
|
+
primary: "node",
|
|
49
|
+
commands: { test: { source: "node", argv: ["npm", "test", "--silent"] } },
|
|
50
|
+
},
|
|
51
|
+
commands: [{ argv: ["npm", "test", "--silent"], exitCode: 0, durationMs: 4500 }],
|
|
52
|
+
},
|
|
53
|
+
expect: { reading: { kind: "predicate", value: true }, score: 100 },
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: "python-pytest-failing",
|
|
57
|
+
evidence: {
|
|
58
|
+
toolchain: {
|
|
59
|
+
stacks: ["python"],
|
|
60
|
+
primary: "python",
|
|
61
|
+
commands: { test: { source: "python", argv: ["pytest"] } },
|
|
62
|
+
},
|
|
63
|
+
commands: [{ argv: ["pytest"], exitCode: 1, durationMs: 3000 }],
|
|
64
|
+
},
|
|
65
|
+
expect: { reading: { kind: "predicate", value: false }, score: 0 },
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
});
|
|
69
|
+
//# sourceMappingURL=tests-clean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tests-clean.js","sourceRoot":"","sources":["../../src/probes/tests-clean.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,eAAe,WAAW,CAAC;IACzB,EAAE,EAAE,aAAa;IACjB,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC3C,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;IAEnC,SAAS,EAAE;;;;;;;GAOV;IAED,WAAW,EACT,mUAAmU;IAErU,KAAK,CAAC,MAAM,CAAC,EAAE;QACb,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;QACvC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO;gBACL,IAAI,EAAE,IAAI;gBACV,MAAM,EACJ,+IAA+I;aAClJ,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;QAC1E,IAAI,GAAG,CAAC,QAAQ;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;QAC1E,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;IAC1D,CAAC;IAED,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE;IAEnD,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;YAC1C,MAAM,EAAE;gBACN,OAAO,EAAE;oBACP,IAAI,EAAE,IAAI;oBACV,MAAM,EACJ,+IAA+I;iBAClJ;gBACD,KAAK,EAAE,IAAI;aACZ;SACF;QACD;YACE,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE;gBACR,SAAS,EAAE;oBACT,MAAM,EAAE,CAAC,MAAM,CAAC;oBAChB,OAAO,EAAE,MAAM;oBACf,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,EAAE;iBAC1E;gBACD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;aACjF;YACD,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;SACpE;QACD;YACE,IAAI,EAAE,uBAAuB;YAC7B,QAAQ,EAAE;gBACR,SAAS,EAAE;oBACT,MAAM,EAAE,CAAC,QAAQ,CAAC;oBAClB,OAAO,EAAE,QAAQ;oBACjB,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE;iBAC3D;gBACD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;aAChE;YACD,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;SACnE;KACF;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tests-cover-public-surface.d.ts","sourceRoot":"","sources":["../../src/probes/tests-cover-public-surface.ts"],"names":[],"mappings":";AA4CA,wBA2JG"}
|