@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,72 @@
1
+ import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
+ export default defineProbe({
3
+ id: "build.clean",
4
+ version: "2.0.0",
5
+ dimensions: [{ id: "feedback", weight: 1 }],
6
+ tier: "executed",
7
+ evidence: ["toolchain", "commands"],
8
+ rationale: `
9
+ A configured build that doesn't actually pass is a half-set gate.
10
+ This runs the build command for the primary stack
11
+ (Node \`npm run build\`, Python \`python -m build\`,
12
+ .NET \`dotnet build\`, Go \`go build ./...\`) and reports clean
13
+ only when it exits zero.
14
+ `,
15
+ remediation: "Run the build command for your stack and fix the errors until it exits clean. A configured-but-broken build means an agent has no signal on whether its diff still compiles.",
16
+ async detect(ev) {
17
+ const cmd = ev.toolchain.commands.build;
18
+ if (!cmd) {
19
+ return {
20
+ kind: "na",
21
+ reason: "no build command — declare commands.build in repofit.config.json, or configure a build for your stack (e.g. an npm 'build' script, a [build-system] in pyproject.toml)",
22
+ };
23
+ }
24
+ const run = await ev.commands.run({ argv: cmd.argv, timeoutMs: 600_000 });
25
+ if (run.timedOut)
26
+ return { kind: "na", reason: "build command timed out" };
27
+ return { kind: "predicate", value: run.exitCode === 0 };
28
+ },
29
+ score: { kind: "predicate", direction: "positive" },
30
+ fixtures: [
31
+ {
32
+ name: "no-build-command",
33
+ evidence: { toolchain: { primary: null } },
34
+ expect: {
35
+ reading: {
36
+ kind: "na",
37
+ reason: "no build command — declare commands.build in repofit.config.json, or configure a build for your stack (e.g. an npm 'build' script, a [build-system] in pyproject.toml)",
38
+ },
39
+ score: null,
40
+ },
41
+ },
42
+ {
43
+ name: "node-build-clean",
44
+ evidence: {
45
+ toolchain: {
46
+ stacks: ["node"],
47
+ primary: "node",
48
+ commands: {
49
+ build: { source: "node", argv: ["npm", "run", "build", "--silent"] },
50
+ },
51
+ },
52
+ commands: [{ argv: ["npm", "run", "build", "--silent"], exitCode: 0, durationMs: 3200 }],
53
+ },
54
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
55
+ },
56
+ {
57
+ name: "go-build-fails",
58
+ evidence: {
59
+ toolchain: {
60
+ stacks: ["go"],
61
+ primary: "go",
62
+ commands: {
63
+ build: { source: "go", argv: ["go", "build", "./..."] },
64
+ },
65
+ },
66
+ commands: [{ argv: ["go", "build", "./..."], exitCode: 1, durationMs: 1000 }],
67
+ },
68
+ expect: { reading: { kind: "predicate", value: false }, score: 0 },
69
+ },
70
+ ],
71
+ });
72
+ //# sourceMappingURL=build-clean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-clean.js","sourceRoot":"","sources":["../../src/probes/build-clean.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=build-configured.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-configured.d.ts","sourceRoot":"","sources":["../../src/probes/build-configured.ts"],"names":[],"mappings":";AAuBA,wBAyJG"}
@@ -0,0 +1,158 @@
1
+ import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
+ const GO_MOD = /(?:^|\/)go\.mod$/i;
3
+ const RUST_MANIFEST = /(?:^|\/)Cargo\.toml$/i;
4
+ const JAVA_BUILD = /(?:^|\/)(?:pom\.xml|build\.gradle(?:\.kts)?|settings\.gradle(?:\.kts)?)$/i;
5
+ const DOTNET_PROJECT = /\.(?:csproj|fsproj|vbproj|sln)$/i;
6
+ const PY_PYPROJECT = /(?:^|\/)pyproject\.toml$/i;
7
+ const PY_BUILD_SYSTEM = /^\s*\[build-system\]/m;
8
+ async function anyMatchInFiles(paths, patterns, readText) {
9
+ for (const p of paths) {
10
+ const text = await readText(p);
11
+ if (!text)
12
+ continue;
13
+ if (patterns.some((re) => re.test(text)))
14
+ return true;
15
+ }
16
+ return false;
17
+ }
18
+ export default defineProbe({
19
+ id: "build.configured",
20
+ version: "1.0.0",
21
+ dimensions: [{ id: "feedback", weight: 1 }],
22
+ tier: "static",
23
+ evidence: ["node_package", "files", "size_stats"],
24
+ rationale: `
25
+ A configured build is how an agent verifies its diff still
26
+ integrates — typecheck catches type errors but not module resolution,
27
+ bundler config, or output emission. For Node, that's an explicit
28
+ \`build\` script; for compiled languages the toolchain build is
29
+ built in (\`go build\`, \`cargo build\`, \`mvn compile\`,
30
+ \`dotnet build\`, \`python -m build\` for libs). A TypeScript repo
31
+ with no \`build\` script means the agent has no way to confirm the
32
+ project still compiles to ship-shape JS.
33
+ `,
34
+ remediation: 'Wire a build step. Node: add `"build"` to `package.json` scripts (e.g., `"build": "tsc"`, `"build": "vite build"`, `"build": "tsup"`). Go: ensure `go.mod` exists — `go build ./...` works out of the box. Rust: `cargo build` ships with Cargo.toml. Java: a `pom.xml` or `build.gradle`. .NET: a `.csproj` or `.sln`. Python libraries: declare `[build-system]` in `pyproject.toml`.',
35
+ async detect(ev) {
36
+ if (ev.node_package.present) {
37
+ const buildScript = ev.node_package.scripts.build;
38
+ if (typeof buildScript === "string" && buildScript.trim().length > 0) {
39
+ return { kind: "predicate", value: true };
40
+ }
41
+ }
42
+ const allPaths = ev.size_stats.files.map((f) => f.path);
43
+ if (allPaths.some((p) => GO_MOD.test(p)))
44
+ return { kind: "predicate", value: true };
45
+ if (allPaths.some((p) => RUST_MANIFEST.test(p)))
46
+ return { kind: "predicate", value: true };
47
+ if (allPaths.some((p) => JAVA_BUILD.test(p)))
48
+ return { kind: "predicate", value: true };
49
+ if (allPaths.some((p) => DOTNET_PROJECT.test(p)))
50
+ return { kind: "predicate", value: true };
51
+ const pyProjects = allPaths.filter((p) => PY_PYPROJECT.test(p));
52
+ if (pyProjects.length > 0 &&
53
+ (await anyMatchInFiles(pyProjects, [PY_BUILD_SYSTEM], ev.files.readText))) {
54
+ return { kind: "predicate", value: true };
55
+ }
56
+ if (!ev.node_package.present &&
57
+ pyProjects.length === 0 &&
58
+ !allPaths.some((p) => GO_MOD.test(p) || RUST_MANIFEST.test(p) || JAVA_BUILD.test(p) || DOTNET_PROJECT.test(p))) {
59
+ return { kind: "na", reason: "no recognised project manifest" };
60
+ }
61
+ return { kind: "predicate", value: false };
62
+ },
63
+ score: { kind: "predicate", direction: "positive" },
64
+ fixtures: [
65
+ {
66
+ name: "no-manifest",
67
+ evidence: {
68
+ node_package: { present: false },
69
+ size_stats: { files: [], totalBytes: 0, totalFiles: 0, source: "git-ls-files" },
70
+ },
71
+ expect: { reading: { kind: "na", reason: "no recognised project manifest" }, score: null },
72
+ },
73
+ {
74
+ name: "node-build-script",
75
+ evidence: {
76
+ node_package: { present: true, scripts: { build: "tsc" } },
77
+ size_stats: { files: [], totalBytes: 0, totalFiles: 0, source: "git-ls-files" },
78
+ },
79
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
80
+ },
81
+ {
82
+ name: "node-no-build-script",
83
+ evidence: {
84
+ node_package: { present: true, scripts: { test: "vitest" } },
85
+ size_stats: { files: [], totalBytes: 0, totalFiles: 0, source: "git-ls-files" },
86
+ },
87
+ expect: { reading: { kind: "predicate", value: false }, score: 0 },
88
+ },
89
+ {
90
+ name: "cargo-toml",
91
+ evidence: {
92
+ node_package: { present: false },
93
+ size_stats: {
94
+ source: "git-ls-files",
95
+ totalBytes: 50,
96
+ totalFiles: 1,
97
+ files: [{ path: "Cargo.toml", bytes: 50, lines: 5, depth: 0 }],
98
+ },
99
+ },
100
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
101
+ },
102
+ {
103
+ name: "go-mod",
104
+ evidence: {
105
+ node_package: { present: false },
106
+ size_stats: {
107
+ source: "git-ls-files",
108
+ totalBytes: 50,
109
+ totalFiles: 1,
110
+ files: [{ path: "go.mod", bytes: 50, lines: 3, depth: 0 }],
111
+ },
112
+ },
113
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
114
+ },
115
+ {
116
+ name: "csproj",
117
+ evidence: {
118
+ node_package: { present: false },
119
+ size_stats: {
120
+ source: "git-ls-files",
121
+ totalBytes: 200,
122
+ totalFiles: 1,
123
+ files: [{ path: "src/App.csproj", bytes: 200, lines: 10, depth: 1 }],
124
+ },
125
+ },
126
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
127
+ },
128
+ {
129
+ name: "pyproject-with-build-system",
130
+ evidence: {
131
+ files: { "pyproject.toml": "[build-system]\nrequires = ['setuptools']\n" },
132
+ node_package: { present: false },
133
+ size_stats: {
134
+ source: "git-ls-files",
135
+ totalBytes: 50,
136
+ totalFiles: 1,
137
+ files: [{ path: "pyproject.toml", bytes: 50, lines: 2, depth: 0 }],
138
+ },
139
+ },
140
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
141
+ },
142
+ {
143
+ name: "pyproject-no-build-system",
144
+ evidence: {
145
+ files: { "pyproject.toml": "[tool.ruff]\nline-length = 100\n" },
146
+ node_package: { present: false },
147
+ size_stats: {
148
+ source: "git-ls-files",
149
+ totalBytes: 30,
150
+ totalFiles: 1,
151
+ files: [{ path: "pyproject.toml", bytes: 30, lines: 2, depth: 0 }],
152
+ },
153
+ },
154
+ expect: { reading: { kind: "predicate", value: false }, score: 0 },
155
+ },
156
+ ],
157
+ });
158
+ //# sourceMappingURL=build-configured.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-configured.js","sourceRoot":"","sources":["../../src/probes/build-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=changelog-strategy-declared.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changelog-strategy-declared.d.ts","sourceRoot":"","sources":["../../src/probes/changelog-strategy-declared.ts"],"names":[],"mappings":";AAeA,wBAwEG"}
@@ -0,0 +1,81 @@
1
+ import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
+ const STRATEGY_FILES = [
3
+ "CHANGELOG.md",
4
+ "CHANGES.md",
5
+ "RELEASES.md",
6
+ "RELEASE_NOTES.md",
7
+ ".changeset/config.json",
8
+ ".changes/config.json",
9
+ ];
10
+ const RELEASE_NOTES_DIRS = ["docs/release", "docs/releases", "releases", "release-notes"];
11
+ const RELEASE_NOTE_FILE = /^(docs\/release|docs\/releases|releases|release-notes)\/[^/]+\.md$/i;
12
+ export default defineProbe({
13
+ id: "changelog.strategy-declared",
14
+ version: "1.1.0",
15
+ dimensions: [{ id: "consistency", weight: 1 }],
16
+ tier: "static",
17
+ evidence: ["files", "size_stats"],
18
+ rationale: `
19
+ A declared changelog strategy tells the agent how release notes are
20
+ captured here — a hand-edited CHANGELOG, a fragments directory like
21
+ .changeset, a tool config, or a per-release notes directory
22
+ (docs/release/, releases/). Without a declared strategy, the agent has
23
+ to guess, and may invent a process that conflicts with the team's
24
+ actual release flow.
25
+ `,
26
+ remediation: "Pick a changelog strategy and commit at least one artifact for it: a hand-edited `CHANGELOG.md`, a fragments directory like `.changeset/`, or per-release notes under `docs/release/`. The shape doesn't matter — what matters is that an agent can see the pattern and follow it.",
27
+ async detect(ev) {
28
+ if (STRATEGY_FILES.some((p) => ev.files.has(p))) {
29
+ return { kind: "predicate", value: true };
30
+ }
31
+ for (const dir of RELEASE_NOTES_DIRS) {
32
+ if (!ev.files.has(dir))
33
+ continue;
34
+ const hasNote = ev.size_stats.files.some((f) => RELEASE_NOTE_FILE.test(f.path));
35
+ if (hasNote)
36
+ return { kind: "predicate", value: true };
37
+ }
38
+ return { kind: "predicate", value: false };
39
+ },
40
+ score: { kind: "predicate", direction: "positive" },
41
+ fixtures: [
42
+ {
43
+ name: "changelog-md",
44
+ evidence: {
45
+ files: ["CHANGELOG.md"],
46
+ size_stats: { files: [], totalBytes: 0, totalFiles: 0, source: "git-ls-files" },
47
+ },
48
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
49
+ },
50
+ {
51
+ name: "changesets",
52
+ evidence: {
53
+ files: [".changeset/config.json"],
54
+ size_stats: { files: [], totalBytes: 0, totalFiles: 0, source: "git-ls-files" },
55
+ },
56
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
57
+ },
58
+ {
59
+ name: "release-notes-dir",
60
+ evidence: {
61
+ files: ["docs/release", "docs/release/v1.0.0.md"],
62
+ size_stats: {
63
+ source: "git-ls-files",
64
+ totalBytes: 100,
65
+ totalFiles: 1,
66
+ files: [{ path: "docs/release/v1.0.0.md", bytes: 100, lines: 10, depth: 2 }],
67
+ },
68
+ },
69
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
70
+ },
71
+ {
72
+ name: "no-strategy",
73
+ evidence: {
74
+ files: [],
75
+ size_stats: { files: [], totalBytes: 0, totalFiles: 0, source: "git-ls-files" },
76
+ },
77
+ expect: { reading: { kind: "predicate", value: false }, score: 0 },
78
+ },
79
+ ],
80
+ });
81
+ //# sourceMappingURL=changelog-strategy-declared.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changelog-strategy-declared.js","sourceRoot":"","sources":["../../src/probes/changelog-strategy-declared.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=ci-configured.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-configured.d.ts","sourceRoot":"","sources":["../../src/probes/ci-configured.ts"],"names":[],"mappings":";AAiBA,wBAyJG"}
@@ -0,0 +1,164 @@
1
+ import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
+ const CI_PATTERNS = [
3
+ { name: "GitHub Actions", pattern: /^\.github\/workflows\/[^/]+\.ya?ml$/i },
4
+ { name: "GitLab CI", pattern: /^\.gitlab-ci\.ya?ml$/i },
5
+ { name: "CircleCI", pattern: /^\.circleci\/config\.ya?ml$/i },
6
+ { name: "Azure Pipelines", pattern: /^(?:\.?)azure-pipelines(?:\.[^/]+)?\.ya?ml$/i },
7
+ { name: "Azure Pipelines", pattern: /^\.azure-pipelines\/[^/]+\.ya?ml$/i },
8
+ { name: "Bitbucket Pipelines", pattern: /^bitbucket-pipelines\.ya?ml$/i },
9
+ { name: "Jenkins", pattern: /^Jenkinsfile$/ },
10
+ { name: "Travis CI", pattern: /^\.travis\.ya?ml$/i },
11
+ { name: "Buildkite", pattern: /^\.buildkite\/pipeline\.ya?ml$/i },
12
+ { name: "Drone", pattern: /^\.drone\.ya?ml$/i },
13
+ { name: "AppVeyor", pattern: /^\.?appveyor\.ya?ml$/i },
14
+ { name: "Woodpecker", pattern: /^\.woodpecker\.ya?ml$/i },
15
+ ];
16
+ export default defineProbe({
17
+ id: "ci.configured",
18
+ version: "1.0.0",
19
+ dimensions: [{ id: "feedback", weight: 1 }],
20
+ tier: "static",
21
+ evidence: ["size_stats"],
22
+ rationale: `
23
+ Continuous integration is how an agent's changes get verified against
24
+ the full test + lint + build surface on a clean machine. A repo
25
+ without any CI config is one where regressions only surface after a
26
+ human pulls the branch. This probe detects configuration for the
27
+ common CI systems: GitHub Actions, GitLab CI, CircleCI, Azure
28
+ Pipelines, Bitbucket Pipelines, Jenkins, Travis CI, Buildkite,
29
+ Drone, AppVeyor, and Woodpecker.
30
+ `,
31
+ remediation: "Add a CI workflow that runs your test, lint, and build steps on every push. GitHub: `.github/workflows/ci.yml`. GitLab: `.gitlab-ci.yml`. Azure DevOps: `azure-pipelines.yml`. CircleCI: `.circleci/config.yml`. The shape doesn't matter as much as the gate — green-on-main means an agent can trust the tree.",
32
+ async detect(ev) {
33
+ for (const f of ev.size_stats.files) {
34
+ if (CI_PATTERNS.some(({ pattern }) => pattern.test(f.path))) {
35
+ return { kind: "predicate", value: true };
36
+ }
37
+ }
38
+ return { kind: "predicate", value: false };
39
+ },
40
+ score: { kind: "predicate", direction: "positive" },
41
+ fixtures: [
42
+ {
43
+ name: "no-ci",
44
+ evidence: {
45
+ size_stats: {
46
+ source: "git-ls-files",
47
+ totalBytes: 0,
48
+ totalFiles: 0,
49
+ files: [],
50
+ },
51
+ },
52
+ expect: { reading: { kind: "predicate", value: false }, score: 0 },
53
+ },
54
+ {
55
+ name: "github-actions",
56
+ evidence: {
57
+ size_stats: {
58
+ source: "git-ls-files",
59
+ totalBytes: 100,
60
+ totalFiles: 1,
61
+ files: [{ path: ".github/workflows/ci.yml", bytes: 100, lines: 10, depth: 3 }],
62
+ },
63
+ },
64
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
65
+ },
66
+ {
67
+ name: "gitlab-ci",
68
+ evidence: {
69
+ size_stats: {
70
+ source: "git-ls-files",
71
+ totalBytes: 100,
72
+ totalFiles: 1,
73
+ files: [{ path: ".gitlab-ci.yml", bytes: 100, lines: 10, depth: 0 }],
74
+ },
75
+ },
76
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
77
+ },
78
+ {
79
+ name: "azure-pipelines-root",
80
+ evidence: {
81
+ size_stats: {
82
+ source: "git-ls-files",
83
+ totalBytes: 100,
84
+ totalFiles: 1,
85
+ files: [{ path: "azure-pipelines.yml", bytes: 100, lines: 10, depth: 0 }],
86
+ },
87
+ },
88
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
89
+ },
90
+ {
91
+ name: "azure-pipelines-subdir",
92
+ evidence: {
93
+ size_stats: {
94
+ source: "git-ls-files",
95
+ totalBytes: 100,
96
+ totalFiles: 1,
97
+ files: [{ path: ".azure-pipelines/main.yml", bytes: 100, lines: 10, depth: 1 }],
98
+ },
99
+ },
100
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
101
+ },
102
+ {
103
+ name: "circleci",
104
+ evidence: {
105
+ size_stats: {
106
+ source: "git-ls-files",
107
+ totalBytes: 100,
108
+ totalFiles: 1,
109
+ files: [{ path: ".circleci/config.yml", bytes: 100, lines: 10, depth: 1 }],
110
+ },
111
+ },
112
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
113
+ },
114
+ {
115
+ name: "jenkinsfile",
116
+ evidence: {
117
+ size_stats: {
118
+ source: "git-ls-files",
119
+ totalBytes: 100,
120
+ totalFiles: 1,
121
+ files: [{ path: "Jenkinsfile", bytes: 100, lines: 10, depth: 0 }],
122
+ },
123
+ },
124
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
125
+ },
126
+ {
127
+ name: "bitbucket-pipelines",
128
+ evidence: {
129
+ size_stats: {
130
+ source: "git-ls-files",
131
+ totalBytes: 100,
132
+ totalFiles: 1,
133
+ files: [{ path: "bitbucket-pipelines.yml", bytes: 100, lines: 10, depth: 0 }],
134
+ },
135
+ },
136
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
137
+ },
138
+ {
139
+ name: "travis",
140
+ evidence: {
141
+ size_stats: {
142
+ source: "git-ls-files",
143
+ totalBytes: 100,
144
+ totalFiles: 1,
145
+ files: [{ path: ".travis.yml", bytes: 100, lines: 10, depth: 0 }],
146
+ },
147
+ },
148
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
149
+ },
150
+ {
151
+ name: "unrelated-yaml-not-detected",
152
+ evidence: {
153
+ size_stats: {
154
+ source: "git-ls-files",
155
+ totalBytes: 100,
156
+ totalFiles: 1,
157
+ files: [{ path: "config.yml", bytes: 100, lines: 10, depth: 0 }],
158
+ },
159
+ },
160
+ expect: { reading: { kind: "predicate", value: false }, score: 0 },
161
+ },
162
+ ],
163
+ });
164
+ //# sourceMappingURL=ci-configured.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-configured.js","sourceRoot":"","sources":["../../src/probes/ci-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=ci-runs-build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-runs-build.d.ts","sourceRoot":"","sources":["../../src/probes/ci-runs-build.ts"],"names":[],"mappings":";AAkBA,wBAgFG"}
@@ -0,0 +1,92 @@
1
+ import { defineProbe } from "@esbenwiberg/repofit/sdk";
2
+ const BUILD_COMMAND_HINTS = [
3
+ /\bnpm\s+(?:run\s+)?build\b/,
4
+ /\byarn\s+build\b/,
5
+ /\bpnpm\s+(?:run\s+)?build\b/,
6
+ /\bgo\s+build\b/,
7
+ /\bcargo\s+build\b/,
8
+ /\bdotnet\s+build\b/,
9
+ /\bmvn\s+(?:compile|package|verify|install)\b/,
10
+ /\bgradle\s+(?:build|assemble)\b/,
11
+ /\bpython\s+-m\s+build\b/,
12
+ /\bvite\s+build\b/,
13
+ /\btsup\b/,
14
+ /\bturbo\s+(?:run\s+)?build\b/,
15
+ /\bnx\s+(?:run-many\s+)?(?:--target=)?build\b/,
16
+ ];
17
+ export default defineProbe({
18
+ id: "ci.runs-build",
19
+ version: "1.0.0",
20
+ dimensions: [{ id: "feedback", weight: 1 }],
21
+ tier: "derived",
22
+ evidence: ["ci_workflows"],
23
+ rationale: `
24
+ Build only counts as a feedback loop if CI runs it on every push.
25
+ Local builds drift — a project that builds on the maintainer's
26
+ machine but not on a clean checkout is one a fresh agent (or
27
+ contributor) can't onboard to. This probe looks for a recognisable
28
+ build command inside any GitHub Actions workflow. Non-GitHub CI is
29
+ out of scope until we add adapters.
30
+ `,
31
+ remediation: "Add a build step to your CI workflow. GitHub Actions: a `run: npm run build` (or `go build ./...`, `cargo build --release`, `dotnet build`, `mvn package`, `gradle build`) step in `.github/workflows/ci.yml`. Pair with `build.configured` — a build that's defined but never run on CI will silently rot.",
32
+ async detect(ev) {
33
+ if (!ev.ci_workflows.present) {
34
+ return { kind: "predicate", value: false };
35
+ }
36
+ for (const wf of ev.ci_workflows.workflows) {
37
+ if (BUILD_COMMAND_HINTS.some((p) => p.test(wf.raw))) {
38
+ return { kind: "predicate", value: true };
39
+ }
40
+ }
41
+ return { kind: "predicate", value: false };
42
+ },
43
+ score: { kind: "predicate", direction: "positive" },
44
+ fixtures: [
45
+ {
46
+ name: "no-workflows",
47
+ evidence: { ci_workflows: { present: false, workflows: [] } },
48
+ expect: { reading: { kind: "predicate", value: false }, score: 0 },
49
+ },
50
+ {
51
+ name: "workflow-runs-npm-build",
52
+ evidence: {
53
+ ci_workflows: {
54
+ present: true,
55
+ workflows: [{ path: ".github/workflows/ci.yml", raw: "run: npm run build" }],
56
+ },
57
+ },
58
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
59
+ },
60
+ {
61
+ name: "workflow-runs-cargo-build",
62
+ evidence: {
63
+ ci_workflows: {
64
+ present: true,
65
+ workflows: [{ path: ".github/workflows/ci.yml", raw: "run: cargo build --release" }],
66
+ },
67
+ },
68
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
69
+ },
70
+ {
71
+ name: "workflow-runs-dotnet-build",
72
+ evidence: {
73
+ ci_workflows: {
74
+ present: true,
75
+ workflows: [{ path: ".github/workflows/ci.yml", raw: "run: dotnet build" }],
76
+ },
77
+ },
78
+ expect: { reading: { kind: "predicate", value: true }, score: 100 },
79
+ },
80
+ {
81
+ name: "workflow-no-build",
82
+ evidence: {
83
+ ci_workflows: {
84
+ present: true,
85
+ workflows: [{ path: ".github/workflows/lint.yml", raw: "run: npm run lint" }],
86
+ },
87
+ },
88
+ expect: { reading: { kind: "predicate", value: false }, score: 0 },
89
+ },
90
+ ],
91
+ });
92
+ //# sourceMappingURL=ci-runs-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci-runs-build.js","sourceRoot":"","sources":["../../src/probes/ci-runs-build.ts"],"names":[],"mappings":"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"}