@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.
Files changed (291) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -0
  3. package/dist/dimensions/consistency.d.ts +3 -0
  4. package/dist/dimensions/consistency.d.ts.map +1 -0
  5. package/dist/dimensions/consistency.js +8 -0
  6. package/dist/dimensions/consistency.js.map +1 -0
  7. package/dist/dimensions/context.d.ts +3 -0
  8. package/dist/dimensions/context.d.ts.map +1 -0
  9. package/dist/dimensions/context.js +8 -0
  10. package/dist/dimensions/context.js.map +1 -0
  11. package/dist/dimensions/cost.d.ts +3 -0
  12. package/dist/dimensions/cost.d.ts.map +1 -0
  13. package/dist/dimensions/cost.js +8 -0
  14. package/dist/dimensions/cost.js.map +1 -0
  15. package/dist/dimensions/feedback.d.ts +3 -0
  16. package/dist/dimensions/feedback.d.ts.map +1 -0
  17. package/dist/dimensions/feedback.js +8 -0
  18. package/dist/dimensions/feedback.js.map +1 -0
  19. package/dist/dimensions/latency.d.ts +3 -0
  20. package/dist/dimensions/latency.d.ts.map +1 -0
  21. package/dist/dimensions/latency.js +8 -0
  22. package/dist/dimensions/latency.js.map +1 -0
  23. package/dist/dimensions/safety.d.ts +3 -0
  24. package/dist/dimensions/safety.d.ts.map +1 -0
  25. package/dist/dimensions/safety.js +8 -0
  26. package/dist/dimensions/safety.js.map +1 -0
  27. package/dist/fixers/agent-guidance-present-llm.d.ts +3 -0
  28. package/dist/fixers/agent-guidance-present-llm.d.ts.map +1 -0
  29. package/dist/fixers/agent-guidance-present-llm.js +109 -0
  30. package/dist/fixers/agent-guidance-present-llm.js.map +1 -0
  31. package/dist/fixers/agent-guidance-present.d.ts +3 -0
  32. package/dist/fixers/agent-guidance-present.d.ts.map +1 -0
  33. package/dist/fixers/agent-guidance-present.js +46 -0
  34. package/dist/fixers/agent-guidance-present.js.map +1 -0
  35. package/dist/fixers/docs-readme-present-llm.d.ts +3 -0
  36. package/dist/fixers/docs-readme-present-llm.d.ts.map +1 -0
  37. package/dist/fixers/docs-readme-present-llm.js +109 -0
  38. package/dist/fixers/docs-readme-present-llm.js.map +1 -0
  39. package/dist/fixers/docs-readme-present.d.ts +3 -0
  40. package/dist/fixers/docs-readme-present.d.ts.map +1 -0
  41. package/dist/fixers/docs-readme-present.js +41 -0
  42. package/dist/fixers/docs-readme-present.js.map +1 -0
  43. package/dist/fixers/editorconfig-present.d.ts +3 -0
  44. package/dist/fixers/editorconfig-present.d.ts.map +1 -0
  45. package/dist/fixers/editorconfig-present.js +30 -0
  46. package/dist/fixers/editorconfig-present.js.map +1 -0
  47. package/dist/fixers/gitignore-comprehensive.d.ts +3 -0
  48. package/dist/fixers/gitignore-comprehensive.d.ts.map +1 -0
  49. package/dist/fixers/gitignore-comprehensive.js +61 -0
  50. package/dist/fixers/gitignore-comprehensive.js.map +1 -0
  51. package/dist/index.d.ts +8 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +153 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/probes/_shared/latency-bands.d.ts +3 -0
  56. package/dist/probes/_shared/latency-bands.d.ts.map +1 -0
  57. package/dist/probes/_shared/latency-bands.js +8 -0
  58. package/dist/probes/_shared/latency-bands.js.map +1 -0
  59. package/dist/probes/agent-guidance-fresh.d.ts +3 -0
  60. package/dist/probes/agent-guidance-fresh.d.ts.map +1 -0
  61. package/dist/probes/agent-guidance-fresh.js +198 -0
  62. package/dist/probes/agent-guidance-fresh.js.map +1 -0
  63. package/dist/probes/agent-guidance-nested.d.ts +3 -0
  64. package/dist/probes/agent-guidance-nested.d.ts.map +1 -0
  65. package/dist/probes/agent-guidance-nested.js +177 -0
  66. package/dist/probes/agent-guidance-nested.js.map +1 -0
  67. package/dist/probes/agent-guidance-present.d.ts +3 -0
  68. package/dist/probes/agent-guidance-present.d.ts.map +1 -0
  69. package/dist/probes/agent-guidance-present.js +32 -0
  70. package/dist/probes/agent-guidance-present.js.map +1 -0
  71. package/dist/probes/agent-guidance-quality.d.ts +3 -0
  72. package/dist/probes/agent-guidance-quality.d.ts.map +1 -0
  73. package/dist/probes/agent-guidance-quality.js +134 -0
  74. package/dist/probes/agent-guidance-quality.js.map +1 -0
  75. package/dist/probes/agent-guidance-substance.d.ts +3 -0
  76. package/dist/probes/agent-guidance-substance.d.ts.map +1 -0
  77. package/dist/probes/agent-guidance-substance.js +64 -0
  78. package/dist/probes/agent-guidance-substance.js.map +1 -0
  79. package/dist/probes/arch-boundaries-clear.d.ts +3 -0
  80. package/dist/probes/arch-boundaries-clear.d.ts.map +1 -0
  81. package/dist/probes/arch-boundaries-clear.js +202 -0
  82. package/dist/probes/arch-boundaries-clear.js.map +1 -0
  83. package/dist/probes/arch-doc-present.d.ts +3 -0
  84. package/dist/probes/arch-doc-present.d.ts.map +1 -0
  85. package/dist/probes/arch-doc-present.js +46 -0
  86. package/dist/probes/arch-doc-present.js.map +1 -0
  87. package/dist/probes/arch-doc-quality.d.ts +3 -0
  88. package/dist/probes/arch-doc-quality.d.ts.map +1 -0
  89. package/dist/probes/arch-doc-quality.js +138 -0
  90. package/dist/probes/arch-doc-quality.js.map +1 -0
  91. package/dist/probes/arch-fitness-tests-configured.d.ts +3 -0
  92. package/dist/probes/arch-fitness-tests-configured.d.ts.map +1 -0
  93. package/dist/probes/arch-fitness-tests-configured.js +180 -0
  94. package/dist/probes/arch-fitness-tests-configured.js.map +1 -0
  95. package/dist/probes/build-clean.d.ts +3 -0
  96. package/dist/probes/build-clean.d.ts.map +1 -0
  97. package/dist/probes/build-clean.js +72 -0
  98. package/dist/probes/build-clean.js.map +1 -0
  99. package/dist/probes/build-configured.d.ts +3 -0
  100. package/dist/probes/build-configured.d.ts.map +1 -0
  101. package/dist/probes/build-configured.js +158 -0
  102. package/dist/probes/build-configured.js.map +1 -0
  103. package/dist/probes/changelog-strategy-declared.d.ts +3 -0
  104. package/dist/probes/changelog-strategy-declared.d.ts.map +1 -0
  105. package/dist/probes/changelog-strategy-declared.js +81 -0
  106. package/dist/probes/changelog-strategy-declared.js.map +1 -0
  107. package/dist/probes/ci-configured.d.ts +3 -0
  108. package/dist/probes/ci-configured.d.ts.map +1 -0
  109. package/dist/probes/ci-configured.js +164 -0
  110. package/dist/probes/ci-configured.js.map +1 -0
  111. package/dist/probes/ci-runs-build.d.ts +3 -0
  112. package/dist/probes/ci-runs-build.d.ts.map +1 -0
  113. package/dist/probes/ci-runs-build.js +92 -0
  114. package/dist/probes/ci-runs-build.js.map +1 -0
  115. package/dist/probes/ci-runs-lint.d.ts +3 -0
  116. package/dist/probes/ci-runs-lint.d.ts.map +1 -0
  117. package/dist/probes/ci-runs-lint.js +84 -0
  118. package/dist/probes/ci-runs-lint.js.map +1 -0
  119. package/dist/probes/ci-runs-tests.d.ts +3 -0
  120. package/dist/probes/ci-runs-tests.d.ts.map +1 -0
  121. package/dist/probes/ci-runs-tests.js +68 -0
  122. package/dist/probes/ci-runs-tests.js.map +1 -0
  123. package/dist/probes/ci-runs-typecheck.d.ts +3 -0
  124. package/dist/probes/ci-runs-typecheck.d.ts.map +1 -0
  125. package/dist/probes/ci-runs-typecheck.js +89 -0
  126. package/dist/probes/ci-runs-typecheck.js.map +1 -0
  127. package/dist/probes/commits-conventional-followed.d.ts +3 -0
  128. package/dist/probes/commits-conventional-followed.d.ts.map +1 -0
  129. package/dist/probes/commits-conventional-followed.js +80 -0
  130. package/dist/probes/commits-conventional-followed.js.map +1 -0
  131. package/dist/probes/dead-code-configured.d.ts +3 -0
  132. package/dist/probes/dead-code-configured.d.ts.map +1 -0
  133. package/dist/probes/dead-code-configured.js +218 -0
  134. package/dist/probes/dead-code-configured.js.map +1 -0
  135. package/dist/probes/deps-audit-configured.d.ts +3 -0
  136. package/dist/probes/deps-audit-configured.d.ts.map +1 -0
  137. package/dist/probes/deps-audit-configured.js +172 -0
  138. package/dist/probes/deps-audit-configured.js.map +1 -0
  139. package/dist/probes/deps-lockfile-present.d.ts +3 -0
  140. package/dist/probes/deps-lockfile-present.d.ts.map +1 -0
  141. package/dist/probes/deps-lockfile-present.js +190 -0
  142. package/dist/probes/deps-lockfile-present.js.map +1 -0
  143. package/dist/probes/docs-adr-presence.d.ts +3 -0
  144. package/dist/probes/docs-adr-presence.d.ts.map +1 -0
  145. package/dist/probes/docs-adr-presence.js +76 -0
  146. package/dist/probes/docs-adr-presence.js.map +1 -0
  147. package/dist/probes/docs-adr-quality.d.ts +3 -0
  148. package/dist/probes/docs-adr-quality.d.ts.map +1 -0
  149. package/dist/probes/docs-adr-quality.js +128 -0
  150. package/dist/probes/docs-adr-quality.js.map +1 -0
  151. package/dist/probes/docs-contributing-present.d.ts +3 -0
  152. package/dist/probes/docs-contributing-present.d.ts.map +1 -0
  153. package/dist/probes/docs-contributing-present.js +15 -0
  154. package/dist/probes/docs-contributing-present.js.map +1 -0
  155. package/dist/probes/docs-links-resolved.d.ts +3 -0
  156. package/dist/probes/docs-links-resolved.d.ts.map +1 -0
  157. package/dist/probes/docs-links-resolved.js +252 -0
  158. package/dist/probes/docs-links-resolved.js.map +1 -0
  159. package/dist/probes/docs-readme-clarity.d.ts +3 -0
  160. package/dist/probes/docs-readme-clarity.d.ts.map +1 -0
  161. package/dist/probes/docs-readme-clarity.js +118 -0
  162. package/dist/probes/docs-readme-clarity.js.map +1 -0
  163. package/dist/probes/docs-readme-present.d.ts +3 -0
  164. package/dist/probes/docs-readme-present.d.ts.map +1 -0
  165. package/dist/probes/docs-readme-present.js +15 -0
  166. package/dist/probes/docs-readme-present.js.map +1 -0
  167. package/dist/probes/docs-readme-substance.d.ts +3 -0
  168. package/dist/probes/docs-readme-substance.d.ts.map +1 -0
  169. package/dist/probes/docs-readme-substance.js +62 -0
  170. package/dist/probes/docs-readme-substance.js.map +1 -0
  171. package/dist/probes/editorconfig-present.d.ts +3 -0
  172. package/dist/probes/editorconfig-present.d.ts.map +1 -0
  173. package/dist/probes/editorconfig-present.js +15 -0
  174. package/dist/probes/editorconfig-present.js.map +1 -0
  175. package/dist/probes/errors-actionability.d.ts +3 -0
  176. package/dist/probes/errors-actionability.d.ts.map +1 -0
  177. package/dist/probes/errors-actionability.js +180 -0
  178. package/dist/probes/errors-actionability.js.map +1 -0
  179. package/dist/probes/format-clean.d.ts +3 -0
  180. package/dist/probes/format-clean.d.ts.map +1 -0
  181. package/dist/probes/format-clean.js +114 -0
  182. package/dist/probes/format-clean.js.map +1 -0
  183. package/dist/probes/format-configured.d.ts +3 -0
  184. package/dist/probes/format-configured.d.ts.map +1 -0
  185. package/dist/probes/format-configured.js +243 -0
  186. package/dist/probes/format-configured.js.map +1 -0
  187. package/dist/probes/git-branch-protection.d.ts +3 -0
  188. package/dist/probes/git-branch-protection.d.ts.map +1 -0
  189. package/dist/probes/git-branch-protection.js +47 -0
  190. package/dist/probes/git-branch-protection.js.map +1 -0
  191. package/dist/probes/gitignore-comprehensive.d.ts +3 -0
  192. package/dist/probes/gitignore-comprehensive.d.ts.map +1 -0
  193. package/dist/probes/gitignore-comprehensive.js +59 -0
  194. package/dist/probes/gitignore-comprehensive.js.map +1 -0
  195. package/dist/probes/hooks-gates-lint-test-build.d.ts +3 -0
  196. package/dist/probes/hooks-gates-lint-test-build.d.ts.map +1 -0
  197. package/dist/probes/hooks-gates-lint-test-build.js +231 -0
  198. package/dist/probes/hooks-gates-lint-test-build.js.map +1 -0
  199. package/dist/probes/hooks-precommit-present.d.ts +3 -0
  200. package/dist/probes/hooks-precommit-present.d.ts.map +1 -0
  201. package/dist/probes/hooks-precommit-present.js +43 -0
  202. package/dist/probes/hooks-precommit-present.js.map +1 -0
  203. package/dist/probes/latency-build.d.ts +3 -0
  204. package/dist/probes/latency-build.d.ts.map +1 -0
  205. package/dist/probes/latency-build.js +53 -0
  206. package/dist/probes/latency-build.js.map +1 -0
  207. package/dist/probes/latency-lint.d.ts +3 -0
  208. package/dist/probes/latency-lint.d.ts.map +1 -0
  209. package/dist/probes/latency-lint.js +50 -0
  210. package/dist/probes/latency-lint.js.map +1 -0
  211. package/dist/probes/latency-test-suite.d.ts +3 -0
  212. package/dist/probes/latency-test-suite.d.ts.map +1 -0
  213. package/dist/probes/latency-test-suite.js +75 -0
  214. package/dist/probes/latency-test-suite.js.map +1 -0
  215. package/dist/probes/latency-typecheck.d.ts +3 -0
  216. package/dist/probes/latency-typecheck.d.ts.map +1 -0
  217. package/dist/probes/latency-typecheck.js +67 -0
  218. package/dist/probes/latency-typecheck.js.map +1 -0
  219. package/dist/probes/lint-clean.d.ts +3 -0
  220. package/dist/probes/lint-clean.d.ts.map +1 -0
  221. package/dist/probes/lint-clean.js +109 -0
  222. package/dist/probes/lint-clean.js.map +1 -0
  223. package/dist/probes/lint-configured.d.ts +3 -0
  224. package/dist/probes/lint-configured.d.ts.map +1 -0
  225. package/dist/probes/lint-configured.js +268 -0
  226. package/dist/probes/lint-configured.js.map +1 -0
  227. package/dist/probes/readme-commands-runnable.d.ts +3 -0
  228. package/dist/probes/readme-commands-runnable.d.ts.map +1 -0
  229. package/dist/probes/readme-commands-runnable.js +307 -0
  230. package/dist/probes/readme-commands-runnable.js.map +1 -0
  231. package/dist/probes/runtime-dev-loop-bootable.d.ts +3 -0
  232. package/dist/probes/runtime-dev-loop-bootable.d.ts.map +1 -0
  233. package/dist/probes/runtime-dev-loop-bootable.js +239 -0
  234. package/dist/probes/runtime-dev-loop-bootable.js.map +1 -0
  235. package/dist/probes/safety-dangerous-script-flags.d.ts +3 -0
  236. package/dist/probes/safety-dangerous-script-flags.d.ts.map +1 -0
  237. package/dist/probes/safety-dangerous-script-flags.js +126 -0
  238. package/dist/probes/safety-dangerous-script-flags.js.map +1 -0
  239. package/dist/probes/secrets-dotenv-gitignored.d.ts +3 -0
  240. package/dist/probes/secrets-dotenv-gitignored.d.ts.map +1 -0
  241. package/dist/probes/secrets-dotenv-gitignored.js +45 -0
  242. package/dist/probes/secrets-dotenv-gitignored.js.map +1 -0
  243. package/dist/probes/secrets-precommit-scan-configured.d.ts +3 -0
  244. package/dist/probes/secrets-precommit-scan-configured.d.ts.map +1 -0
  245. package/dist/probes/secrets-precommit-scan-configured.js +130 -0
  246. package/dist/probes/secrets-precommit-scan-configured.js.map +1 -0
  247. package/dist/probes/secrets-scan-clean.d.ts +3 -0
  248. package/dist/probes/secrets-scan-clean.d.ts.map +1 -0
  249. package/dist/probes/secrets-scan-clean.js +80 -0
  250. package/dist/probes/secrets-scan-clean.js.map +1 -0
  251. package/dist/probes/size-directory-depth.d.ts +3 -0
  252. package/dist/probes/size-directory-depth.d.ts.map +1 -0
  253. package/dist/probes/size-directory-depth.js +80 -0
  254. package/dist/probes/size-directory-depth.js.map +1 -0
  255. package/dist/probes/size-large-files.d.ts +3 -0
  256. package/dist/probes/size-large-files.d.ts.map +1 -0
  257. package/dist/probes/size-large-files.js +117 -0
  258. package/dist/probes/size-large-files.js.map +1 -0
  259. package/dist/probes/size-repo-token-estimate.d.ts +3 -0
  260. package/dist/probes/size-repo-token-estimate.d.ts.map +1 -0
  261. package/dist/probes/size-repo-token-estimate.js +83 -0
  262. package/dist/probes/size-repo-token-estimate.js.map +1 -0
  263. package/dist/probes/specs-present.d.ts +3 -0
  264. package/dist/probes/specs-present.d.ts.map +1 -0
  265. package/dist/probes/specs-present.js +77 -0
  266. package/dist/probes/specs-present.js.map +1 -0
  267. package/dist/probes/specs-quality.d.ts +3 -0
  268. package/dist/probes/specs-quality.d.ts.map +1 -0
  269. package/dist/probes/specs-quality.js +153 -0
  270. package/dist/probes/specs-quality.js.map +1 -0
  271. package/dist/probes/tests-clean.d.ts +3 -0
  272. package/dist/probes/tests-clean.d.ts.map +1 -0
  273. package/dist/probes/tests-clean.js +69 -0
  274. package/dist/probes/tests-clean.js.map +1 -0
  275. package/dist/probes/tests-cover-public-surface.d.ts +3 -0
  276. package/dist/probes/tests-cover-public-surface.d.ts.map +1 -0
  277. package/dist/probes/tests-cover-public-surface.js +172 -0
  278. package/dist/probes/tests-cover-public-surface.js.map +1 -0
  279. package/dist/probes/tests-runner-configured.d.ts +3 -0
  280. package/dist/probes/tests-runner-configured.d.ts.map +1 -0
  281. package/dist/probes/tests-runner-configured.js +261 -0
  282. package/dist/probes/tests-runner-configured.js.map +1 -0
  283. package/dist/probes/types-clean.d.ts +3 -0
  284. package/dist/probes/types-clean.d.ts.map +1 -0
  285. package/dist/probes/types-clean.js +72 -0
  286. package/dist/probes/types-clean.js.map +1 -0
  287. package/dist/probes/types-configured.d.ts +3 -0
  288. package/dist/probes/types-configured.d.ts.map +1 -0
  289. package/dist/probes/types-configured.js +77 -0
  290. package/dist/probes/types-configured.js.map +1 -0
  291. package/package.json +30 -0
@@ -0,0 +1,177 @@
1
+ import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
+ const NESTED_MANIFESTS = [
3
+ /(?:^|\/)package\.json$/,
4
+ /(?:^|\/)pyproject\.toml$/,
5
+ /(?:^|\/)Cargo\.toml$/,
6
+ /(?:^|\/)go\.mod$/,
7
+ /(?:^|\/)pom\.xml$/,
8
+ /(?:^|\/)build\.gradle(?:\.kts)?$/,
9
+ /\.csproj$/,
10
+ /(?:^|\/)Gemfile$/,
11
+ ];
12
+ const GUIDANCE_FILES = ["CLAUDE.md", "AGENTS.md", ".cursorrules", ".aider.conf.yml"];
13
+ function dirOf(path) {
14
+ const i = path.lastIndexOf("/");
15
+ return i < 0 ? "" : path.slice(0, i);
16
+ }
17
+ function isSubPackageManifest(path) {
18
+ if (dirOf(path) === "")
19
+ return false;
20
+ return NESTED_MANIFESTS.some((re) => re.test(path));
21
+ }
22
+ function hasSiblingGuidance(dir, allPaths) {
23
+ return GUIDANCE_FILES.some((name) => allPaths.has(`${dir}/${name}`));
24
+ }
25
+ export default defineProbe({
26
+ id: "agent.guidance-nested",
27
+ version: "1.0.0",
28
+ dimensions: [{ id: "context", weight: 1 }],
29
+ tier: "static",
30
+ evidence: ["size_stats"],
31
+ rationale: `
32
+ In a monorepo, a root CLAUDE.md gives the agent shape-of-the-whole
33
+ context, but per-package guidance is what lets it work inside a
34
+ package without re-reading the entire repo. This probe finds
35
+ sub-package manifests (package.json, pyproject.toml, Cargo.toml,
36
+ go.mod, pom.xml, *.csproj, Gemfile) and checks each for a sibling
37
+ CLAUDE.md / AGENTS.md. Returns n/a for single-package repos.
38
+ `,
39
+ remediation: "For each sub-package without nested guidance, add a `CLAUDE.md` (or `AGENTS.md`) describing what that package does, how to build/test it, and any package-specific conventions. Even 10–20 lines per package is enough — the goal is letting the agent orient itself without reading the entire repo.",
40
+ async detect(ev) {
41
+ const allPaths = ev.size_stats.files.map((f) => f.path);
42
+ const pathSet = new Set(allPaths);
43
+ const packageDirs = new Set();
44
+ for (const p of allPaths) {
45
+ if (isSubPackageManifest(p))
46
+ packageDirs.add(dirOf(p));
47
+ }
48
+ if (packageDirs.size === 0) {
49
+ return { kind: "na", reason: "no sub-package manifests" };
50
+ }
51
+ const items = [];
52
+ for (const dir of packageDirs) {
53
+ if (!hasSiblingGuidance(dir, pathSet)) {
54
+ items.push({
55
+ location: { path: dir },
56
+ severity: "warn",
57
+ message: `no CLAUDE.md / AGENTS.md next to sub-package`,
58
+ });
59
+ }
60
+ }
61
+ return { kind: "inventory", items };
62
+ },
63
+ score: {
64
+ kind: "inventory",
65
+ severityWeights: { info: 1, warn: 1, error: 1 },
66
+ bands: [
67
+ { upTo: 0, score: 100 },
68
+ { upTo: 1, score: 80 },
69
+ { upTo: 3, score: 60 },
70
+ { upTo: 5, score: 30 },
71
+ { score: 0 },
72
+ ],
73
+ },
74
+ fixtures: [
75
+ {
76
+ name: "single-package-repo",
77
+ evidence: {
78
+ size_stats: {
79
+ source: "git-ls-files",
80
+ totalBytes: 50,
81
+ totalFiles: 1,
82
+ files: [{ path: "package.json", bytes: 50, lines: 3, depth: 0 }],
83
+ },
84
+ },
85
+ expect: { reading: { kind: "na", reason: "no sub-package manifests" }, score: null },
86
+ },
87
+ {
88
+ name: "monorepo-all-packages-have-guidance",
89
+ evidence: {
90
+ size_stats: {
91
+ source: "git-ls-files",
92
+ totalBytes: 400,
93
+ totalFiles: 6,
94
+ files: [
95
+ { path: "package.json", bytes: 50, lines: 3, depth: 0 },
96
+ { path: "CLAUDE.md", bytes: 100, lines: 10, depth: 0 },
97
+ { path: "packages/a/package.json", bytes: 50, lines: 3, depth: 2 },
98
+ { path: "packages/a/CLAUDE.md", bytes: 100, lines: 10, depth: 2 },
99
+ { path: "packages/b/package.json", bytes: 50, lines: 3, depth: 2 },
100
+ { path: "packages/b/AGENTS.md", bytes: 100, lines: 10, depth: 2 },
101
+ ],
102
+ },
103
+ },
104
+ expect: { reading: { kind: "inventory", items: [] }, score: 100 },
105
+ },
106
+ {
107
+ name: "monorepo-one-package-missing-guidance",
108
+ evidence: {
109
+ size_stats: {
110
+ source: "git-ls-files",
111
+ totalBytes: 300,
112
+ totalFiles: 5,
113
+ files: [
114
+ { path: "package.json", bytes: 50, lines: 3, depth: 0 },
115
+ { path: "packages/a/package.json", bytes: 50, lines: 3, depth: 2 },
116
+ { path: "packages/a/CLAUDE.md", bytes: 100, lines: 10, depth: 2 },
117
+ { path: "packages/b/package.json", bytes: 50, lines: 3, depth: 2 },
118
+ { path: "packages/c/package.json", bytes: 50, lines: 3, depth: 2 },
119
+ ],
120
+ },
121
+ },
122
+ expect: {
123
+ reading: {
124
+ kind: "inventory",
125
+ items: [
126
+ {
127
+ location: { path: "packages/b" },
128
+ severity: "warn",
129
+ message: "no CLAUDE.md / AGENTS.md next to sub-package",
130
+ },
131
+ {
132
+ location: { path: "packages/c" },
133
+ severity: "warn",
134
+ message: "no CLAUDE.md / AGENTS.md next to sub-package",
135
+ },
136
+ ],
137
+ },
138
+ score: 60,
139
+ },
140
+ },
141
+ {
142
+ name: "mixed-ecosystem-monorepo",
143
+ evidence: {
144
+ size_stats: {
145
+ source: "git-ls-files",
146
+ totalBytes: 300,
147
+ totalFiles: 4,
148
+ files: [
149
+ { path: "services/api/go.mod", bytes: 50, lines: 3, depth: 2 },
150
+ { path: "services/api/CLAUDE.md", bytes: 100, lines: 10, depth: 2 },
151
+ { path: "services/worker/Cargo.toml", bytes: 50, lines: 3, depth: 2 },
152
+ { path: "ui/package.json", bytes: 50, lines: 3, depth: 1 },
153
+ ],
154
+ },
155
+ },
156
+ expect: {
157
+ reading: {
158
+ kind: "inventory",
159
+ items: [
160
+ {
161
+ location: { path: "services/worker" },
162
+ severity: "warn",
163
+ message: "no CLAUDE.md / AGENTS.md next to sub-package",
164
+ },
165
+ {
166
+ location: { path: "ui" },
167
+ severity: "warn",
168
+ message: "no CLAUDE.md / AGENTS.md next to sub-package",
169
+ },
170
+ ],
171
+ },
172
+ score: 60,
173
+ },
174
+ },
175
+ ],
176
+ });
177
+ //# sourceMappingURL=agent-guidance-nested.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-guidance-nested.js","sourceRoot":"","sources":["../../src/probes/agent-guidance-nested.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=agent-guidance-present.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-guidance-present.d.ts","sourceRoot":"","sources":["../../src/probes/agent-guidance-present.ts"],"names":[],"mappings":";AAEA,wBAmCG"}
@@ -0,0 +1,32 @@
1
+ import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
+ export default defineProbe({
3
+ id: "agent.guidance-present",
4
+ version: "1.0.0",
5
+ dimensions: [{ id: "context", weight: 1 }],
6
+ tier: "static",
7
+ evidence: ["agent_config"],
8
+ rationale: `
9
+ An agent works dramatically better when it can find guidance files
10
+ (CLAUDE.md, AGENTS.md, .cursorrules, .aider.conf.yml). A repo with
11
+ none of these is invisible to agent priors — every session starts
12
+ from zero context.
13
+ `,
14
+ remediation: "Add a `CLAUDE.md` (or `AGENTS.md`) at the repo root. Cover: what the project is, how to build/test/lint, key conventions, and where to find things. Even 30–50 lines is a huge upgrade over nothing.",
15
+ async detect(ev) {
16
+ return { kind: "predicate", value: ev.agent_config.guidance.length > 0 };
17
+ },
18
+ score: { kind: "predicate", direction: "positive" },
19
+ fixtures: [
20
+ {
21
+ name: "guidance-present",
22
+ evidence: { agent_config: { guidance: [{ path: "CLAUDE.md", bytes: 1024, lines: 30 }] } },
23
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
24
+ },
25
+ {
26
+ name: "no-guidance",
27
+ evidence: { agent_config: { guidance: [] } },
28
+ expect: { reading: { kind: "predicate", value: false }, score: 0 },
29
+ },
30
+ ],
31
+ });
32
+ //# sourceMappingURL=agent-guidance-present.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-guidance-present.js","sourceRoot":"","sources":["../../src/probes/agent-guidance-present.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,eAAe,WAAW,CAAC;IACzB,EAAE,EAAE,wBAAwB;IAC5B,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC1C,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,cAAc,CAAC;IAE1B,SAAS,EAAE;;;;;GAKV;IAED,WAAW,EACT,sMAAsM;IAExM,KAAK,CAAC,MAAM,CAAC,EAAE;QACb,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IAC3E,CAAC;IAED,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE;IAEnD,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;YACzF,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;SACpE;QACD;YACE,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE;YAC5C,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,3 @@
1
+ declare const _default: import("@esbenwiberg/repofit/sdk").Probe;
2
+ export default _default;
3
+ //# sourceMappingURL=agent-guidance-quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-guidance-quality.d.ts","sourceRoot":"","sources":["../../src/probes/agent-guidance-quality.ts"],"names":[],"mappings":";AA+BA,wBAoHG"}
@@ -0,0 +1,134 @@
1
+ import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
+ const PROBE_VERSION = "1.0.0";
3
+ const MAX_INPUT_CHARS = 20_000;
4
+ const RUBRIC = {
5
+ task: "Score the agent-guidance file (CLAUDE.md / AGENTS.md / .cursorrules) on how useful it would be to a coding agent landing in this repository for the first time.",
6
+ criteria: [
7
+ {
8
+ id: "specific",
9
+ description: "Does the content describe THIS project in concrete terms (paths, commands, naming conventions, real constraints), or is it generic platitudes like 'write clean code' and 'follow best practices'?",
10
+ },
11
+ {
12
+ id: "actionable",
13
+ description: "If the agent reads only this file, can it take correct action (run the right command, edit the right file, follow the right convention) without further trial and error?",
14
+ },
15
+ {
16
+ id: "coverage",
17
+ description: "Does it cover the essentials: how to build, how to test, how to run, and where the major code lives? Missing any of these costs points; missing all four is a 0.",
18
+ },
19
+ {
20
+ id: "project-fit",
21
+ description: "Does the guidance reflect what's actually in the repo (real paths, real scripts, real conventions), or does it look like a generic template never tailored to this codebase?",
22
+ },
23
+ ],
24
+ };
25
+ export default defineProbe({
26
+ id: "agent.guidance-quality",
27
+ version: PROBE_VERSION,
28
+ dimensions: [
29
+ { id: "context", weight: 1 },
30
+ { id: "feedback", weight: 0.3 },
31
+ ],
32
+ tier: "reasoned",
33
+ evidence: ["agent_config", "files", "judge"],
34
+ rationale: `
35
+ Length is a crude proxy for guidance quality (see agent.guidance-substance).
36
+ A 200-line CLAUDE.md full of generic platitudes is worse than a 30-line
37
+ one that names the actual build command. This probe asks an LLM to judge
38
+ the guidance file against four criteria: specificity, actionability,
39
+ coverage of build/test/run/architecture, and project-fit. The result is
40
+ cached so a clean run is free; only changes to guidance content (or the
41
+ probe version) re-incur a model call.
42
+ `,
43
+ remediation: "Make your CLAUDE.md/AGENTS.md specific to THIS project: real paths, real commands, real conventions. Cover build, test, run, and where the major code lives. Generic platitudes ('write clean code') score poorly; concrete project-specific instructions score well. Tip: include the exact commands an agent should run for typecheck, test, lint, and dev server.",
44
+ async detect(ev) {
45
+ const guidance = ev.agent_config.guidance;
46
+ if (guidance.length === 0) {
47
+ return { kind: "na", reason: "no agent-guidance file present" };
48
+ }
49
+ const parts = [];
50
+ let remaining = MAX_INPUT_CHARS;
51
+ for (const g of guidance) {
52
+ if (remaining <= 0)
53
+ break;
54
+ const text = await ev.files.readText(g.path);
55
+ if (!text)
56
+ continue;
57
+ const slice = text.slice(0, remaining);
58
+ parts.push(`# ${g.path}\n\n${slice}`);
59
+ remaining -= slice.length;
60
+ }
61
+ if (parts.length === 0) {
62
+ return { kind: "na", reason: "agent-guidance files declared but unreadable" };
63
+ }
64
+ const combined = parts.join("\n\n---\n\n");
65
+ const result = await ev.judge.score({
66
+ probeId: "agent.guidance-quality",
67
+ probeVersion: PROBE_VERSION,
68
+ input: combined,
69
+ rubric: RUBRIC,
70
+ });
71
+ return {
72
+ kind: "judge",
73
+ score: result.score,
74
+ perCriterion: result.perCriterion,
75
+ rationale: result.rationale,
76
+ model: result.model,
77
+ };
78
+ },
79
+ score: { kind: "judge" },
80
+ fixtures: [
81
+ {
82
+ name: "no-guidance",
83
+ evidence: { agent_config: { guidance: [] } },
84
+ expect: { reading: { kind: "na", reason: "no agent-guidance file present" }, score: null },
85
+ },
86
+ {
87
+ name: "strong-guidance",
88
+ evidence: {
89
+ agent_config: { guidance: [{ path: "CLAUDE.md", bytes: 2000, lines: 80 }] },
90
+ files: { "CLAUDE.md": "# Project\n\nReal, specific guidance with concrete paths." },
91
+ judge: {
92
+ score: 80,
93
+ perCriterion: { specific: 80, actionable: 80, coverage: 80, "project-fit": 80 },
94
+ rationale: "Concrete, project-specific, covers the essentials.",
95
+ model: "fixture",
96
+ },
97
+ },
98
+ expect: {
99
+ reading: {
100
+ kind: "judge",
101
+ score: 80,
102
+ perCriterion: { specific: 80, actionable: 80, coverage: 80, "project-fit": 80 },
103
+ rationale: "Concrete, project-specific, covers the essentials.",
104
+ model: "fixture",
105
+ },
106
+ score: 80,
107
+ },
108
+ },
109
+ {
110
+ name: "weak-guidance",
111
+ evidence: {
112
+ agent_config: { guidance: [{ path: "CLAUDE.md", bytes: 200, lines: 8 }] },
113
+ files: { "CLAUDE.md": "Write clean code. Follow best practices." },
114
+ judge: {
115
+ score: 20,
116
+ perCriterion: { specific: 20, actionable: 20, coverage: 0, "project-fit": 20 },
117
+ rationale: "Generic platitudes; no project-specific content.",
118
+ model: "fixture",
119
+ },
120
+ },
121
+ expect: {
122
+ reading: {
123
+ kind: "judge",
124
+ score: 20,
125
+ perCriterion: { specific: 20, actionable: 20, coverage: 0, "project-fit": 20 },
126
+ rationale: "Generic platitudes; no project-specific content.",
127
+ model: "fixture",
128
+ },
129
+ score: 20,
130
+ },
131
+ },
132
+ ],
133
+ });
134
+ //# sourceMappingURL=agent-guidance-quality.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-guidance-quality.js","sourceRoot":"","sources":["../../src/probes/agent-guidance-quality.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=agent-guidance-substance.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-guidance-substance.d.ts","sourceRoot":"","sources":["../../src/probes/agent-guidance-substance.ts"],"names":[],"mappings":";AAEA,wBAmEG"}
@@ -0,0 +1,64 @@
1
+ import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
+ export default defineProbe({
3
+ id: "agent.guidance-substance",
4
+ version: "1.0.0",
5
+ dimensions: [{ id: "context", weight: 1 }],
6
+ tier: "static",
7
+ evidence: ["agent_config"],
8
+ rationale: `
9
+ Guidance files exist on a quality spectrum: a stub CLAUDE.md with three
10
+ lines is barely better than none. The total line count across all
11
+ guidance files is a crude but honest proxy for how much project-specific
12
+ context has been written down for agents to read.
13
+ `,
14
+ remediation: "Expand your CLAUDE.md/AGENTS.md beyond a stub. Aim for at least 40 lines covering: project purpose, build/test/run commands, directory layout, key conventions, and any non-obvious constraints. A short, focused 120-line file beats a sprawling one — but a 5-line file isn't enough for an agent to orient.",
15
+ async detect(ev) {
16
+ const total = ev.agent_config.guidance.reduce((sum, g) => sum + g.lines, 0);
17
+ return { kind: "magnitude", value: total, unit: "lines" };
18
+ },
19
+ score: {
20
+ kind: "magnitude",
21
+ direction: "positive",
22
+ bands: [
23
+ { upTo: 10, score: 0 },
24
+ { upTo: 40, score: 50 },
25
+ { upTo: 120, score: 80 },
26
+ { score: 100 },
27
+ ],
28
+ },
29
+ fixtures: [
30
+ {
31
+ name: "no-guidance",
32
+ evidence: { agent_config: { guidance: [] } },
33
+ expect: { reading: { kind: "magnitude", value: 0, unit: "lines" }, score: 0 },
34
+ },
35
+ {
36
+ name: "stub-guidance",
37
+ evidence: { agent_config: { guidance: [{ path: "CLAUDE.md", bytes: 100, lines: 5 }] } },
38
+ expect: { reading: { kind: "magnitude", value: 5, unit: "lines" }, score: 0 },
39
+ },
40
+ {
41
+ name: "modest-guidance",
42
+ evidence: { agent_config: { guidance: [{ path: "CLAUDE.md", bytes: 800, lines: 30 }] } },
43
+ expect: { reading: { kind: "magnitude", value: 30, unit: "lines" }, score: 50 },
44
+ },
45
+ {
46
+ name: "substantial-guidance",
47
+ evidence: {
48
+ agent_config: {
49
+ guidance: [
50
+ { path: "CLAUDE.md", bytes: 2000, lines: 80 },
51
+ { path: "AGENTS.md", bytes: 1000, lines: 40 },
52
+ ],
53
+ },
54
+ },
55
+ expect: { reading: { kind: "magnitude", value: 120, unit: "lines" }, score: 80 },
56
+ },
57
+ {
58
+ name: "rich-guidance",
59
+ evidence: { agent_config: { guidance: [{ path: "CLAUDE.md", bytes: 6000, lines: 200 }] } },
60
+ expect: { reading: { kind: "magnitude", value: 200, unit: "lines" }, score: 100 },
61
+ },
62
+ ],
63
+ });
64
+ //# sourceMappingURL=agent-guidance-substance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-guidance-substance.js","sourceRoot":"","sources":["../../src/probes/agent-guidance-substance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,eAAe,WAAW,CAAC;IACzB,EAAE,EAAE,0BAA0B;IAC9B,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC1C,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,cAAc,CAAC;IAE1B,SAAS,EAAE;;;;;GAKV;IAED,WAAW,EACT,gTAAgT;IAElT,KAAK,CAAC,MAAM,CAAC,EAAE;QACb,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC5E,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC5D,CAAC;IAED,KAAK,EAAE;QACL,IAAI,EAAE,WAAW;QACjB,SAAS,EAAE,UAAU;QACrB,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;YACtB,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;YACvB,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE;YACxB,EAAE,KAAK,EAAE,GAAG,EAAE;SACf;KACF;IAED,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,aAAa;YACnB,QAAQ,EAAE,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE;YAC5C,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;SAC9E;QACD;YACE,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACvF,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;SAC9E;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,QAAQ,EAAE,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE;YACxF,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;SAChF;QACD;YACE,IAAI,EAAE,sBAAsB;YAC5B,QAAQ,EAAE;gBACR,YAAY,EAAE;oBACZ,QAAQ,EAAE;wBACR,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;wBAC7C,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;qBAC9C;iBACF;aACF;YACD,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE;SACjF;QACD;YACE,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,EAAE,YAAY,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE;YAC1F,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;SAClF;KACF;CACF,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import("@esbenwiberg/repofit/sdk").Probe;
2
+ export default _default;
3
+ //# sourceMappingURL=arch-boundaries-clear.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arch-boundaries-clear.d.ts","sourceRoot":"","sources":["../../src/probes/arch-boundaries-clear.ts"],"names":[],"mappings":";AAuEA,wBAoJG"}