@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,126 @@
1
+ import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
+ const DANGEROUS_PATTERNS = [
3
+ { pattern: /\brm\s+-rf\b/, message: "uses rm -rf" },
4
+ { pattern: /--no-verify\b/, message: "bypasses git hooks (--no-verify)" },
5
+ { pattern: /--force\b|\s-f\b(?!ile)/, message: "uses --force / -f" },
6
+ { pattern: /\bcurl\s.*\|\s*(sh|bash|zsh)\b/, message: "pipes curl into a shell" },
7
+ { pattern: /\bsudo\b/, message: "invokes sudo" },
8
+ ];
9
+ export default defineProbe({
10
+ id: "safety.dangerous-script-flags",
11
+ version: "1.0.0",
12
+ dimensions: [{ id: "safety", weight: 1 }],
13
+ tier: "static",
14
+ evidence: ["node_package"],
15
+ rationale: `
16
+ npm scripts are the most likely thing an agent runs unsupervised in a
17
+ repo. Flags like rm -rf, --no-verify, --force, or piping curl into a
18
+ shell can do irreversible damage. Surfacing them lets the agent (or a
19
+ reviewer) decide whether each one is justified.
20
+ `,
21
+ remediation: "Remove dangerous flags from npm scripts where possible: prefer `rimraf dist` over `rm -rf dist`, drop `--no-verify` (fix the hook instead), avoid `--force` and `sudo`, and never pipe `curl … | bash`. If a script genuinely needs one of these (e.g., `rm -rf dist` is fine for a clean step), add a comment explaining why so reviewers and agents skip the alarm.",
22
+ async detect(ev) {
23
+ if (!ev.node_package.present)
24
+ return { kind: "na", reason: "no package.json" };
25
+ const items = [];
26
+ for (const [name, body] of Object.entries(ev.node_package.scripts)) {
27
+ for (const { pattern, message } of DANGEROUS_PATTERNS) {
28
+ if (pattern.test(body)) {
29
+ items.push({
30
+ location: { path: `package.json#scripts.${name}` },
31
+ severity: "warn",
32
+ message: `script "${name}" ${message}`,
33
+ });
34
+ }
35
+ }
36
+ }
37
+ return { kind: "inventory", items };
38
+ },
39
+ score: {
40
+ kind: "inventory",
41
+ severityWeights: { info: 1, warn: 3, error: 10 },
42
+ bands: [{ upTo: 0, score: 100 }, { upTo: 3, score: 70 }, { upTo: 9, score: 40 }, { score: 0 }],
43
+ },
44
+ fixtures: [
45
+ {
46
+ name: "no-package-json",
47
+ evidence: { node_package: { present: false } },
48
+ expect: { reading: { kind: "na", reason: "no package.json" }, score: null },
49
+ },
50
+ {
51
+ name: "clean-scripts",
52
+ evidence: {
53
+ node_package: {
54
+ present: true,
55
+ scripts: { build: "tsc", test: "vitest run" },
56
+ },
57
+ },
58
+ expect: { reading: { kind: "inventory", items: [] }, score: 100 },
59
+ },
60
+ {
61
+ name: "one-rm-rf",
62
+ evidence: {
63
+ node_package: {
64
+ present: true,
65
+ scripts: { clean: "rm -rf dist" },
66
+ },
67
+ },
68
+ expect: {
69
+ reading: {
70
+ kind: "inventory",
71
+ items: [
72
+ {
73
+ location: { path: "package.json#scripts.clean" },
74
+ severity: "warn",
75
+ message: 'script "clean" uses rm -rf',
76
+ },
77
+ ],
78
+ },
79
+ score: 70,
80
+ },
81
+ },
82
+ {
83
+ name: "multiple-dangerous",
84
+ evidence: {
85
+ node_package: {
86
+ present: true,
87
+ scripts: {
88
+ clean: "rm -rf node_modules",
89
+ commit: "git commit --no-verify",
90
+ install: "curl https://example.com/i.sh | bash",
91
+ deploy: "sudo systemctl restart app",
92
+ },
93
+ },
94
+ },
95
+ expect: {
96
+ reading: {
97
+ kind: "inventory",
98
+ items: [
99
+ {
100
+ location: { path: "package.json#scripts.clean" },
101
+ severity: "warn",
102
+ message: 'script "clean" uses rm -rf',
103
+ },
104
+ {
105
+ location: { path: "package.json#scripts.commit" },
106
+ severity: "warn",
107
+ message: 'script "commit" bypasses git hooks (--no-verify)',
108
+ },
109
+ {
110
+ location: { path: "package.json#scripts.install" },
111
+ severity: "warn",
112
+ message: 'script "install" pipes curl into a shell',
113
+ },
114
+ {
115
+ location: { path: "package.json#scripts.deploy" },
116
+ severity: "warn",
117
+ message: 'script "deploy" invokes sudo',
118
+ },
119
+ ],
120
+ },
121
+ score: 0,
122
+ },
123
+ },
124
+ ],
125
+ });
126
+ //# sourceMappingURL=safety-dangerous-script-flags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safety-dangerous-script-flags.js","sourceRoot":"","sources":["../../src/probes/safety-dangerous-script-flags.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=secrets-dotenv-gitignored.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-dotenv-gitignored.d.ts","sourceRoot":"","sources":["../../src/probes/secrets-dotenv-gitignored.ts"],"names":[],"mappings":";AAEA,wBA+CG"}
@@ -0,0 +1,45 @@
1
+ import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
+ export default defineProbe({
3
+ id: "secrets.dotenv-gitignored",
4
+ version: "1.0.0",
5
+ dimensions: [{ id: "safety", weight: 1 }],
6
+ tier: "static",
7
+ evidence: ["gitignore"],
8
+ rationale: `
9
+ .env files routinely hold API keys, database passwords, and other
10
+ secrets. If .gitignore doesn't cover them, an agent running "git add"
11
+ or "git commit -A" can leak the entire credential set into history in
12
+ one move. This is a high-blast-radius mistake we can prevent with a
13
+ one-line check.
14
+ `,
15
+ remediation: "Add `.env` (and ideally `.env.*` to cover `.env.local`, `.env.production`, etc.) to your `.gitignore`. Keep an `.env.example` file checked in with placeholder values so newcomers know which variables are expected.",
16
+ async detect(ev) {
17
+ if (!ev.gitignore.present)
18
+ return { kind: "na", reason: "no .gitignore" };
19
+ return { kind: "predicate", value: ev.gitignore.ignores(".env") };
20
+ },
21
+ score: { kind: "predicate", direction: "positive" },
22
+ fixtures: [
23
+ {
24
+ name: "no-gitignore",
25
+ evidence: { gitignore: { present: false, patterns: [] } },
26
+ expect: { reading: { kind: "na", reason: "no .gitignore" }, score: null },
27
+ },
28
+ {
29
+ name: "dotenv-ignored",
30
+ evidence: { gitignore: { present: true, patterns: [".env"] } },
31
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
32
+ },
33
+ {
34
+ name: "wildcard-ignored",
35
+ evidence: { gitignore: { present: true, patterns: [".env*"] } },
36
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
37
+ },
38
+ {
39
+ name: "not-ignored",
40
+ evidence: { gitignore: { present: true, patterns: ["node_modules"] } },
41
+ expect: { reading: { kind: "predicate", value: false }, score: 0 },
42
+ },
43
+ ],
44
+ });
45
+ //# sourceMappingURL=secrets-dotenv-gitignored.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-dotenv-gitignored.js","sourceRoot":"","sources":["../../src/probes/secrets-dotenv-gitignored.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,eAAe,WAAW,CAAC;IACzB,EAAE,EAAE,2BAA2B;IAC/B,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACzC,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,WAAW,CAAC;IAEvB,SAAS,EAAE;;;;;;GAMV;IAED,WAAW,EACT,uNAAuN;IAEzN,KAAK,CAAC,MAAM,CAAC,EAAE;QACb,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,OAAO;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,CAAC;QAC1E,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;IACpE,CAAC;IAED,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE;IAEnD,QAAQ,EAAE;QACR;YACE,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE;YACzD,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SAC1E;QACD;YACE,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE;YAC9D,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;SACpE;QACD;YACE,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,EAAE;YAC/D,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,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,cAAc,CAAC,EAAE,EAAE;YACtE,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=secrets-precommit-scan-configured.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-precommit-scan-configured.d.ts","sourceRoot":"","sources":["../../src/probes/secrets-precommit-scan-configured.ts"],"names":[],"mappings":";AA8BA,wBAwGG"}
@@ -0,0 +1,130 @@
1
+ import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
+ const SECRET_TOOL_HINTS = [
3
+ /\bsecretlint\b/i,
4
+ /\bgitleaks\b/i,
5
+ /\btruffle?hog\b/i,
6
+ /\bdetect-secrets\b/i,
7
+ /\bggshield\b/i,
8
+ /\btrivy\s+fs\b/i,
9
+ ];
10
+ const PRECOMMIT_PATHS = [
11
+ ".pre-commit-config.yaml",
12
+ ".pre-commit-config.yml",
13
+ ".husky/pre-commit",
14
+ ".githooks/pre-commit",
15
+ ];
16
+ const SH_PATH = /([A-Za-z0-9_./-]+\.sh)\b/g;
17
+ function resolveHelperPaths(hookPath, scriptRef, allFiles) {
18
+ const basename = scriptRef.split("/").pop();
19
+ if (!basename?.endsWith(".sh"))
20
+ return [];
21
+ const hookDir = hookPath.split("/").slice(0, -1).join("/");
22
+ return allFiles.filter((p) => {
23
+ if (p.split("/").pop() !== basename)
24
+ return false;
25
+ return hookDir.length === 0 || p.startsWith(`${hookDir}/`);
26
+ });
27
+ }
28
+ export default defineProbe({
29
+ id: "secrets.precommit-scan-configured",
30
+ version: "1.1.0",
31
+ dimensions: [{ id: "safety", weight: 1 }],
32
+ tier: "derived",
33
+ evidence: ["files", "size_stats", "ci_workflows"],
34
+ rationale: `
35
+ A pre-commit or CI step that scans for secrets is the only durable
36
+ defense against accidentally committing a token. Without it, prevention
37
+ relies on every human and every agent remembering to check by hand.
38
+ Hooks that source helper scripts (e.g. .githooks/lib/secret-checks.sh)
39
+ are followed one level deep so the scanner is still recognised.
40
+ `,
41
+ remediation: "Add a secret scanner that runs on every commit. Easiest paths: `gitleaks` (single binary, fast), `secretlint` (npm, configurable), `trufflehog`, or `detect-secrets`. Wire it into a pre-commit hook (`.husky/pre-commit`, `.githooks/pre-commit`, or `.pre-commit-config.yaml`) and/or a CI job. Either alone is fine — both is better.",
42
+ async detect(ev) {
43
+ const allFiles = ev.size_stats.files.map((f) => f.path);
44
+ const visited = new Set();
45
+ for (const path of PRECOMMIT_PATHS) {
46
+ const raw = await ev.files.readText(path);
47
+ if (!raw)
48
+ continue;
49
+ if (SECRET_TOOL_HINTS.some((p) => p.test(raw))) {
50
+ return { kind: "predicate", value: true };
51
+ }
52
+ for (const m of raw.matchAll(SH_PATH)) {
53
+ const ref = m[1];
54
+ if (!ref)
55
+ continue;
56
+ for (const candidate of resolveHelperPaths(path, ref, allFiles)) {
57
+ if (visited.has(candidate))
58
+ continue;
59
+ visited.add(candidate);
60
+ const childRaw = await ev.files.readText(candidate);
61
+ if (childRaw && SECRET_TOOL_HINTS.some((p) => p.test(childRaw))) {
62
+ return { kind: "predicate", value: true };
63
+ }
64
+ }
65
+ }
66
+ }
67
+ for (const wf of ev.ci_workflows.workflows) {
68
+ if (SECRET_TOOL_HINTS.some((p) => p.test(wf.raw))) {
69
+ return { kind: "predicate", value: true };
70
+ }
71
+ }
72
+ return { kind: "predicate", value: false };
73
+ },
74
+ score: { kind: "predicate", direction: "positive" },
75
+ fixtures: [
76
+ {
77
+ name: "nothing-configured",
78
+ evidence: {
79
+ files: [],
80
+ size_stats: { files: [], totalBytes: 0, totalFiles: 0, source: "git-ls-files" },
81
+ ci_workflows: { present: false, workflows: [] },
82
+ },
83
+ expect: { reading: { kind: "predicate", value: false }, score: 0 },
84
+ },
85
+ {
86
+ name: "secretlint-in-husky",
87
+ evidence: {
88
+ files: { ".husky/pre-commit": "npx secretlint --maskSecrets '**/*'\n" },
89
+ size_stats: { files: [], totalBytes: 0, totalFiles: 0, source: "git-ls-files" },
90
+ ci_workflows: { present: false, workflows: [] },
91
+ },
92
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
93
+ },
94
+ {
95
+ name: "gitleaks-in-sourced-helper",
96
+ evidence: {
97
+ files: {
98
+ ".githooks/pre-commit": 'bash "$SCRIPT_DIR/lib/secret-checks.sh"\n',
99
+ ".githooks/lib/secret-checks.sh": "gitleaks protect --staged\n",
100
+ },
101
+ size_stats: {
102
+ source: "git-ls-files",
103
+ totalBytes: 100,
104
+ totalFiles: 2,
105
+ files: [
106
+ { path: ".githooks/pre-commit", bytes: 50, lines: 5, depth: 1 },
107
+ { path: ".githooks/lib/secret-checks.sh", bytes: 50, lines: 5, depth: 2 },
108
+ ],
109
+ },
110
+ ci_workflows: { present: false, workflows: [] },
111
+ },
112
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
113
+ },
114
+ {
115
+ name: "gitleaks-in-ci",
116
+ evidence: {
117
+ files: [],
118
+ size_stats: { files: [], totalBytes: 0, totalFiles: 0, source: "git-ls-files" },
119
+ ci_workflows: {
120
+ present: true,
121
+ workflows: [
122
+ { path: ".github/workflows/security.yml", raw: "uses: zricethezav/gitleaks-action@v2" },
123
+ ],
124
+ },
125
+ },
126
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
127
+ },
128
+ ],
129
+ });
130
+ //# sourceMappingURL=secrets-precommit-scan-configured.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-precommit-scan-configured.js","sourceRoot":"","sources":["../../src/probes/secrets-precommit-scan-configured.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=secrets-scan-clean.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-scan-clean.d.ts","sourceRoot":"","sources":["../../src/probes/secrets-scan-clean.ts"],"names":[],"mappings":";AAWA,wBA2EG"}
@@ -0,0 +1,80 @@
1
+ import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
+ const SCAN_SCRIPT_CANDIDATES = [
3
+ "secrets",
4
+ "secret:scan",
5
+ "secrets:scan",
6
+ "secrets:check",
7
+ "secret-scan",
8
+ "scan:secrets",
9
+ ];
10
+ export default defineProbe({
11
+ id: "secrets.scan-clean",
12
+ version: "1.0.0",
13
+ dimensions: [{ id: "safety", weight: 1 }],
14
+ tier: "executed",
15
+ evidence: ["node_package", "commands"],
16
+ rationale: `
17
+ A configured secret scanner only helps if it's actually run. This
18
+ probe runs the project's secret-scan script and reports clean only
19
+ when it exits zero — meaning no secrets detected in the working
20
+ tree. Pairs with \`secrets.precommit-scan-configured\`: configured
21
+ tells you the gate exists, clean tells you the tree currently
22
+ passes it. N/A if no scan script is exposed (the precommit hook
23
+ alone can't be invoked uniformly across tools).
24
+ `,
25
+ remediation: 'Expose your secret scanner as a runnable script so the gate can be invoked outside the precommit hook. Node: add `"secrets": "gitleaks detect --no-banner --no-git"` (or the equivalent for `trufflehog`, `detect-secrets`, `secretlint`) to `package.json` scripts. Then run it and clean up any findings — a flagged secret in the working tree is the only thing that matters here.',
26
+ async detect(ev) {
27
+ if (!ev.node_package.present)
28
+ return { kind: "na", reason: "no package.json" };
29
+ const scripts = ev.node_package.scripts;
30
+ const scriptName = SCAN_SCRIPT_CANDIDATES.find((name) => typeof scripts[name] === "string" && scripts[name].trim().length > 0);
31
+ if (!scriptName) {
32
+ return { kind: "na", reason: "no secrets scan script" };
33
+ }
34
+ const run = await ev.commands.run({
35
+ argv: ["npm", "run", scriptName, "--silent"],
36
+ timeoutMs: 300_000,
37
+ });
38
+ if (run.timedOut)
39
+ return { kind: "na", reason: "secrets scan timed out" };
40
+ return { kind: "predicate", value: run.exitCode === 0 };
41
+ },
42
+ score: { kind: "predicate", direction: "positive" },
43
+ fixtures: [
44
+ {
45
+ name: "no-package-json",
46
+ evidence: { node_package: { present: false } },
47
+ expect: { reading: { kind: "na", reason: "no package.json" }, score: null },
48
+ },
49
+ {
50
+ name: "no-scan-script",
51
+ evidence: { node_package: { present: true, scripts: { test: "vitest" } } },
52
+ expect: { reading: { kind: "na", reason: "no secrets scan script" }, score: null },
53
+ },
54
+ {
55
+ name: "scan-clean",
56
+ evidence: {
57
+ node_package: {
58
+ present: true,
59
+ scripts: { secrets: "gitleaks detect --no-banner --no-git" },
60
+ },
61
+ commands: [{ argv: ["npm", "run", "secrets", "--silent"], exitCode: 0, durationMs: 1200 }],
62
+ },
63
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
64
+ },
65
+ {
66
+ name: "scan-finds-leak",
67
+ evidence: {
68
+ node_package: {
69
+ present: true,
70
+ scripts: { "secrets:scan": "gitleaks detect --no-banner --no-git" },
71
+ },
72
+ commands: [
73
+ { argv: ["npm", "run", "secrets:scan", "--silent"], exitCode: 1, durationMs: 1500 },
74
+ ],
75
+ },
76
+ expect: { reading: { kind: "predicate", value: false }, score: 0 },
77
+ },
78
+ ],
79
+ });
80
+ //# sourceMappingURL=secrets-scan-clean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-scan-clean.js","sourceRoot":"","sources":["../../src/probes/secrets-scan-clean.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,MAAM,sBAAsB,GAAG;IAC7B,SAAS;IACT,aAAa;IACb,cAAc;IACd,eAAe;IACf,aAAa;IACb,cAAc;CACf,CAAC;AAEF,eAAe,WAAW,CAAC;IACzB,EAAE,EAAE,oBAAoB;IACxB,OAAO,EAAE,OAAO;IAChB,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACzC,IAAI,EAAE,UAAU;IAChB,QAAQ,EAAE,CAAC,cAAc,EAAE,UAAU,CAAC;IAEtC,SAAS,EAAE;;;;;;;;GAQV;IAED,WAAW,EACT,wXAAwX;IAE1X,KAAK,CAAC,MAAM,CAAC,EAAE;QACb,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO;YAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC;QAC/E,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC;QACxC,MAAM,UAAU,GAAG,sBAAsB,CAAC,IAAI,CAC5C,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAC/E,CAAC;QACF,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAC;QAC1D,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC;YAChC,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC;YAC5C,SAAS,EAAE,OAAO;SACnB,CAAC,CAAC;QACH,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,YAAY,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;YAC9C,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE;SAC5E;QACD;YACE,IAAI,EAAE,gBAAgB;YACtB,QAAQ,EAAE,EAAE,YAAY,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;YAC1E,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,YAAY,EAAE;oBACZ,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,EAAE,OAAO,EAAE,sCAAsC,EAAE;iBAC7D;gBACD,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;aAC3F;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,iBAAiB;YACvB,QAAQ,EAAE;gBACR,YAAY,EAAE;oBACZ,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,EAAE,cAAc,EAAE,sCAAsC,EAAE;iBACpE;gBACD,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,EAAE,UAAU,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE;iBACpF;aACF;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,3 @@
1
+ declare const _default: import("@esbenwiberg/repofit/sdk").Probe;
2
+ export default _default;
3
+ //# sourceMappingURL=size-directory-depth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"size-directory-depth.d.ts","sourceRoot":"","sources":["../../src/probes/size-directory-depth.ts"],"names":[],"mappings":";AAEA,wBAmFG"}
@@ -0,0 +1,80 @@
1
+ import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
+ export default defineProbe({
3
+ id: "size.directory-depth",
4
+ version: "1.1.0",
5
+ dimensions: [{ id: "cost", weight: 1 }],
6
+ tier: "derived",
7
+ evidence: ["size_stats"],
8
+ rationale: `
9
+ Very deeply nested paths add navigation cost: more tokens per file
10
+ reference, more overhead resolving "where does this live?", and a higher
11
+ chance of typos in path-driven tool calls. The p95 of path depth is a
12
+ robust summary that one shallow tree of fixtures can't skew.
13
+ `,
14
+ remediation: "If p95 path depth is high, inspect `git ls-files | awk -F/ '{ print NF \" \" $0 }' | sort -nr | head` to find the deepest tracked paths. Flatten redundant grouping when it is only ceremony, but do not collapse meaningful package/module boundaries. Aim for p95 depth ≤ 6.",
15
+ async detect(ev) {
16
+ if (ev.size_stats.source === "none") {
17
+ return { kind: "na", reason: "no git working tree" };
18
+ }
19
+ if (ev.size_stats.files.length === 0) {
20
+ return { kind: "na", reason: "no tracked files" };
21
+ }
22
+ const depths = ev.size_stats.files.map((f) => f.depth);
23
+ return { kind: "distribution", samples: depths };
24
+ },
25
+ score: {
26
+ kind: "distribution",
27
+ stat: "p95",
28
+ bands: [
29
+ { upTo: 6, score: 100 },
30
+ { upTo: 8, score: 80 },
31
+ { upTo: 10, score: 50 },
32
+ { upTo: 12, score: 20 },
33
+ { score: 0 },
34
+ ],
35
+ },
36
+ fixtures: [
37
+ {
38
+ name: "shallow-tree",
39
+ evidence: {
40
+ size_stats: {
41
+ source: "git-ls-files",
42
+ totalBytes: 0,
43
+ totalFiles: 3,
44
+ totalBytesEffective: 0,
45
+ totalFilesEffective: 3,
46
+ files: [
47
+ { path: "a.md", bytes: 1, lines: 1, depth: 1, generated: false },
48
+ { path: "src/x.ts", bytes: 1, lines: 1, depth: 2, generated: false },
49
+ { path: "src/y.ts", bytes: 1, lines: 1, depth: 2, generated: false },
50
+ ],
51
+ },
52
+ },
53
+ expect: { reading: { kind: "distribution", samples: [1, 2, 2] }, score: 100 },
54
+ },
55
+ {
56
+ name: "deep-tree",
57
+ evidence: {
58
+ size_stats: {
59
+ source: "git-ls-files",
60
+ totalBytes: 0,
61
+ totalFiles: 2,
62
+ totalBytesEffective: 0,
63
+ totalFilesEffective: 2,
64
+ files: [
65
+ { path: "a/b/c/d/e/f/g/h/i/file.ts", bytes: 1, lines: 1, depth: 10, generated: false },
66
+ {
67
+ path: "a/b/c/d/e/f/g/h/i/j/k/file.ts",
68
+ bytes: 1,
69
+ lines: 1,
70
+ depth: 12,
71
+ generated: false,
72
+ },
73
+ ],
74
+ },
75
+ },
76
+ expect: { reading: { kind: "distribution", samples: [10, 12] }, score: 20 },
77
+ },
78
+ ],
79
+ });
80
+ //# sourceMappingURL=size-directory-depth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"size-directory-depth.js","sourceRoot":"","sources":["../../src/probes/size-directory-depth.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=size-large-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"size-large-files.d.ts","sourceRoot":"","sources":["../../src/probes/size-large-files.ts"],"names":[],"mappings":";AAMA,wBAqHG"}