openpitstop 1.0.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 (274) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +512 -0
  3. package/demo-repo/README.md +24 -0
  4. package/demo-repo/package-lock.json +4483 -0
  5. package/demo-repo/package.json +17 -0
  6. package/demo-repo/src/config.js +5 -0
  7. package/demo-repo/src/db.js +31 -0
  8. package/demo-repo/src/server.js +13 -0
  9. package/demo-repo/src/userController.js +22 -0
  10. package/demo-repo/src/userRepo.js +18 -0
  11. package/demo-repo/src/userService.js +59 -0
  12. package/demo-repo/test/user.test.js +12 -0
  13. package/demo-repo-fintech/README.md +27 -0
  14. package/demo-repo-fintech/package-lock.json +1023 -0
  15. package/demo-repo-fintech/package.json +14 -0
  16. package/demo-repo-fintech/pitstop-repro-ledger-order-ord-conc-1-charged-2.test.mjs +175 -0
  17. package/demo-repo-fintech/pitstop-repro-ledger-order-ord-retry-2-charged-2.test.mjs +175 -0
  18. package/demo-repo-fintech/pitstop-repro-ledger-order-ord-webhook-3-charged-2.test.mjs +175 -0
  19. package/demo-repo-fintech/src/gateway.js +26 -0
  20. package/demo-repo-fintech/src/server.js +61 -0
  21. package/demo-repo-generators/package-lock.json +1508 -0
  22. package/demo-repo-generators/package.json +17 -0
  23. package/demo-repo-generators/public/index.html +10 -0
  24. package/demo-repo-generators/scripts/build.js +17 -0
  25. package/demo-repo-generators/src/counter.js +16 -0
  26. package/demo-repo-integrity/README.md +49 -0
  27. package/demo-repo-integrity/package.json +12 -0
  28. package/demo-repo-integrity/src/money.js +19 -0
  29. package/demo-repo-integrity/test/money.test.js +17 -0
  30. package/dist/analyzers/accessibility.d.ts +18 -0
  31. package/dist/analyzers/accessibility.js +248 -0
  32. package/dist/analyzers/accessibility.js.map +1 -0
  33. package/dist/analyzers/dependencyGraph.d.ts +14 -0
  34. package/dist/analyzers/dependencyGraph.js +206 -0
  35. package/dist/analyzers/dependencyGraph.js.map +1 -0
  36. package/dist/analyzers/devex.d.ts +19 -0
  37. package/dist/analyzers/devex.js +301 -0
  38. package/dist/analyzers/devex.js.map +1 -0
  39. package/dist/analyzers/duplication.d.ts +2 -0
  40. package/dist/analyzers/duplication.js +47 -0
  41. package/dist/analyzers/duplication.js.map +1 -0
  42. package/dist/analyzers/index.d.ts +12 -0
  43. package/dist/analyzers/index.js +38 -0
  44. package/dist/analyzers/index.js.map +1 -0
  45. package/dist/analyzers/integrity/assertionLiteralTamper.d.ts +2 -0
  46. package/dist/analyzers/integrity/assertionLiteralTamper.js +164 -0
  47. package/dist/analyzers/integrity/assertionLiteralTamper.js.map +1 -0
  48. package/dist/analyzers/integrity/exceptionSwallow.d.ts +2 -0
  49. package/dist/analyzers/integrity/exceptionSwallow.js +198 -0
  50. package/dist/analyzers/integrity/exceptionSwallow.js.map +1 -0
  51. package/dist/analyzers/integrity/exitCheat.d.ts +2 -0
  52. package/dist/analyzers/integrity/exitCheat.js +31 -0
  53. package/dist/analyzers/integrity/exitCheat.js.map +1 -0
  54. package/dist/analyzers/integrity/git.d.ts +10 -0
  55. package/dist/analyzers/integrity/git.js +181 -0
  56. package/dist/analyzers/integrity/git.js.map +1 -0
  57. package/dist/analyzers/integrity/hardcodedMatch.d.ts +2 -0
  58. package/dist/analyzers/integrity/hardcodedMatch.js +93 -0
  59. package/dist/analyzers/integrity/hardcodedMatch.js.map +1 -0
  60. package/dist/analyzers/integrity/helpers.d.ts +21 -0
  61. package/dist/analyzers/integrity/helpers.js +66 -0
  62. package/dist/analyzers/integrity/helpers.js.map +1 -0
  63. package/dist/analyzers/integrity/index.d.ts +10 -0
  64. package/dist/analyzers/integrity/index.js +27 -0
  65. package/dist/analyzers/integrity/index.js.map +1 -0
  66. package/dist/analyzers/integrity/mockOverreach.d.ts +2 -0
  67. package/dist/analyzers/integrity/mockOverreach.js +72 -0
  68. package/dist/analyzers/integrity/mockOverreach.js.map +1 -0
  69. package/dist/analyzers/integrity/suppressionCreep.d.ts +2 -0
  70. package/dist/analyzers/integrity/suppressionCreep.js +27 -0
  71. package/dist/analyzers/integrity/suppressionCreep.js.map +1 -0
  72. package/dist/analyzers/integrity/testTamper.d.ts +2 -0
  73. package/dist/analyzers/integrity/testTamper.js +153 -0
  74. package/dist/analyzers/integrity/testTamper.js.map +1 -0
  75. package/dist/analyzers/integrity/types.d.ts +63 -0
  76. package/dist/analyzers/integrity/types.js +13 -0
  77. package/dist/analyzers/integrity/types.js.map +1 -0
  78. package/dist/analyzers/ledger/attacks.d.ts +17 -0
  79. package/dist/analyzers/ledger/attacks.js +135 -0
  80. package/dist/analyzers/ledger/attacks.js.map +1 -0
  81. package/dist/analyzers/ledger/discover.d.ts +15 -0
  82. package/dist/analyzers/ledger/discover.js +122 -0
  83. package/dist/analyzers/ledger/discover.js.map +1 -0
  84. package/dist/analyzers/ledger/evidence.d.ts +22 -0
  85. package/dist/analyzers/ledger/evidence.js +127 -0
  86. package/dist/analyzers/ledger/evidence.js.map +1 -0
  87. package/dist/analyzers/ledger/harness.d.ts +4 -0
  88. package/dist/analyzers/ledger/harness.js +270 -0
  89. package/dist/analyzers/ledger/harness.js.map +1 -0
  90. package/dist/analyzers/ledger/index.d.ts +14 -0
  91. package/dist/analyzers/ledger/index.js +116 -0
  92. package/dist/analyzers/ledger/index.js.map +1 -0
  93. package/dist/analyzers/ledger/types.d.ts +31 -0
  94. package/dist/analyzers/ledger/types.js +2 -0
  95. package/dist/analyzers/ledger/types.js.map +1 -0
  96. package/dist/analyzers/perf.d.ts +2 -0
  97. package/dist/analyzers/perf.js +106 -0
  98. package/dist/analyzers/perf.js.map +1 -0
  99. package/dist/analyzers/reliability.d.ts +22 -0
  100. package/dist/analyzers/reliability.js +339 -0
  101. package/dist/analyzers/reliability.js.map +1 -0
  102. package/dist/analyzers/routes.d.ts +17 -0
  103. package/dist/analyzers/routes.js +115 -0
  104. package/dist/analyzers/routes.js.map +1 -0
  105. package/dist/analyzers/security.d.ts +2 -0
  106. package/dist/analyzers/security.js +302 -0
  107. package/dist/analyzers/security.js.map +1 -0
  108. package/dist/analyzers/suiteRunner.d.ts +64 -0
  109. package/dist/analyzers/suiteRunner.js +381 -0
  110. package/dist/analyzers/suiteRunner.js.map +1 -0
  111. package/dist/analyzers/tests.d.ts +2 -0
  112. package/dist/analyzers/tests.js +215 -0
  113. package/dist/analyzers/tests.js.map +1 -0
  114. package/dist/analyzers/types.d.ts +203 -0
  115. package/dist/analyzers/types.js +2 -0
  116. package/dist/analyzers/types.js.map +1 -0
  117. package/dist/analyzers/util.d.ts +35 -0
  118. package/dist/analyzers/util.js +209 -0
  119. package/dist/analyzers/util.js.map +1 -0
  120. package/dist/ciCheckA.d.ts +2 -0
  121. package/dist/ciCheckA.js +5 -0
  122. package/dist/ciCheckA.js.map +1 -0
  123. package/dist/ciCheckB.d.ts +2 -0
  124. package/dist/ciCheckB.js +6 -0
  125. package/dist/ciCheckB.js.map +1 -0
  126. package/dist/cli.d.ts +2 -0
  127. package/dist/cli.js +65 -0
  128. package/dist/cli.js.map +1 -0
  129. package/dist/commands/budget.d.ts +33 -0
  130. package/dist/commands/budget.js +108 -0
  131. package/dist/commands/budget.js.map +1 -0
  132. package/dist/commands/ci.d.ts +14 -0
  133. package/dist/commands/ci.js +157 -0
  134. package/dist/commands/ci.js.map +1 -0
  135. package/dist/commands/demo.d.ts +2 -0
  136. package/dist/commands/demo.js +163 -0
  137. package/dist/commands/demo.js.map +1 -0
  138. package/dist/commands/digest.d.ts +8 -0
  139. package/dist/commands/digest.js +189 -0
  140. package/dist/commands/digest.js.map +1 -0
  141. package/dist/commands/doctor.d.ts +2 -0
  142. package/dist/commands/doctor.js +98 -0
  143. package/dist/commands/doctor.js.map +1 -0
  144. package/dist/commands/drive.d.ts +3 -0
  145. package/dist/commands/drive.js +170 -0
  146. package/dist/commands/drive.js.map +1 -0
  147. package/dist/commands/gate.d.ts +2 -0
  148. package/dist/commands/gate.js +136 -0
  149. package/dist/commands/gate.js.map +1 -0
  150. package/dist/commands/honesty.d.ts +2 -0
  151. package/dist/commands/honesty.js +182 -0
  152. package/dist/commands/honesty.js.map +1 -0
  153. package/dist/commands/inspect.d.ts +2 -0
  154. package/dist/commands/inspect.js +244 -0
  155. package/dist/commands/inspect.js.map +1 -0
  156. package/dist/commands/install.d.ts +2 -0
  157. package/dist/commands/install.js +81 -0
  158. package/dist/commands/install.js.map +1 -0
  159. package/dist/commands/integrity.d.ts +2 -0
  160. package/dist/commands/integrity.js +74 -0
  161. package/dist/commands/integrity.js.map +1 -0
  162. package/dist/commands/memory.d.ts +6 -0
  163. package/dist/commands/memory.js +90 -0
  164. package/dist/commands/memory.js.map +1 -0
  165. package/dist/commands/pen.d.ts +17 -0
  166. package/dist/commands/pen.js +158 -0
  167. package/dist/commands/pen.js.map +1 -0
  168. package/dist/commands/prompt.d.ts +2 -0
  169. package/dist/commands/prompt.js +37 -0
  170. package/dist/commands/prompt.js.map +1 -0
  171. package/dist/commands/readyCheck.d.ts +21 -0
  172. package/dist/commands/readyCheck.js +68 -0
  173. package/dist/commands/readyCheck.js.map +1 -0
  174. package/dist/commands/report.d.ts +2 -0
  175. package/dist/commands/report.js +48 -0
  176. package/dist/commands/report.js.map +1 -0
  177. package/dist/commands/repro.d.ts +3 -0
  178. package/dist/commands/repro.js +61 -0
  179. package/dist/commands/repro.js.map +1 -0
  180. package/dist/commands/scan.d.ts +27 -0
  181. package/dist/commands/scan.js +348 -0
  182. package/dist/commands/scan.js.map +1 -0
  183. package/dist/commands/share.d.ts +2 -0
  184. package/dist/commands/share.js +163 -0
  185. package/dist/commands/share.js.map +1 -0
  186. package/dist/commands/trends.d.ts +2 -0
  187. package/dist/commands/trends.js +103 -0
  188. package/dist/commands/trends.js.map +1 -0
  189. package/dist/commands/try.d.ts +12 -0
  190. package/dist/commands/try.js +208 -0
  191. package/dist/commands/try.js.map +1 -0
  192. package/dist/commands/verify.d.ts +44 -0
  193. package/dist/commands/verify.js +381 -0
  194. package/dist/commands/verify.js.map +1 -0
  195. package/dist/commands/watch.d.ts +10 -0
  196. package/dist/commands/watch.js +70 -0
  197. package/dist/commands/watch.js.map +1 -0
  198. package/dist/evidence.d.ts +37 -0
  199. package/dist/evidence.js +61 -0
  200. package/dist/evidence.js.map +1 -0
  201. package/dist/graph/correlate.d.ts +7 -0
  202. package/dist/graph/correlate.js +246 -0
  203. package/dist/graph/correlate.js.map +1 -0
  204. package/dist/graph/integrity.d.ts +22 -0
  205. package/dist/graph/integrity.js +39 -0
  206. package/dist/graph/integrity.js.map +1 -0
  207. package/dist/installer/targets.d.ts +23 -0
  208. package/dist/installer/targets.js +162 -0
  209. package/dist/installer/targets.js.map +1 -0
  210. package/dist/memory/store.d.ts +33 -0
  211. package/dist/memory/store.js +131 -0
  212. package/dist/memory/store.js.map +1 -0
  213. package/dist/pen/dynamic.d.ts +36 -0
  214. package/dist/pen/dynamic.js +622 -0
  215. package/dist/pen/dynamic.js.map +1 -0
  216. package/dist/pen/fix.d.ts +35 -0
  217. package/dist/pen/fix.js +239 -0
  218. package/dist/pen/fix.js.map +1 -0
  219. package/dist/pen/proof.d.ts +46 -0
  220. package/dist/pen/proof.js +112 -0
  221. package/dist/pen/proof.js.map +1 -0
  222. package/dist/pen/report.d.ts +11 -0
  223. package/dist/pen/report.js +258 -0
  224. package/dist/pen/report.js.map +1 -0
  225. package/dist/pen/static.d.ts +17 -0
  226. package/dist/pen/static.js +565 -0
  227. package/dist/pen/static.js.map +1 -0
  228. package/dist/pen/store.d.ts +11 -0
  229. package/dist/pen/store.js +36 -0
  230. package/dist/pen/store.js.map +1 -0
  231. package/dist/pen/types.d.ts +112 -0
  232. package/dist/pen/types.js +53 -0
  233. package/dist/pen/types.js.map +1 -0
  234. package/dist/report/format.d.ts +126 -0
  235. package/dist/report/format.js +706 -0
  236. package/dist/report/format.js.map +1 -0
  237. package/dist/report/score.d.ts +47 -0
  238. package/dist/report/score.js +164 -0
  239. package/dist/report/score.js.map +1 -0
  240. package/dist/repro/framework.d.ts +26 -0
  241. package/dist/repro/framework.js +224 -0
  242. package/dist/repro/framework.js.map +1 -0
  243. package/dist/repro/generate.d.ts +14 -0
  244. package/dist/repro/generate.js +669 -0
  245. package/dist/repro/generate.js.map +1 -0
  246. package/dist/repro/ids.d.ts +32 -0
  247. package/dist/repro/ids.js +175 -0
  248. package/dist/repro/ids.js.map +1 -0
  249. package/dist/repro/index.d.ts +24 -0
  250. package/dist/repro/index.js +69 -0
  251. package/dist/repro/index.js.map +1 -0
  252. package/dist/repro/pen.d.ts +26 -0
  253. package/dist/repro/pen.js +321 -0
  254. package/dist/repro/pen.js.map +1 -0
  255. package/dist/repro/run.d.ts +18 -0
  256. package/dist/repro/run.js +36 -0
  257. package/dist/repro/run.js.map +1 -0
  258. package/dist/sandbox/proxy.d.ts +41 -0
  259. package/dist/sandbox/proxy.js +231 -0
  260. package/dist/sandbox/proxy.js.map +1 -0
  261. package/dist/sandbox/startCmd.d.ts +24 -0
  262. package/dist/sandbox/startCmd.js +71 -0
  263. package/dist/sandbox/startCmd.js.map +1 -0
  264. package/dist/ui/spinner.d.ts +18 -0
  265. package/dist/ui/spinner.js +26 -0
  266. package/dist/ui/spinner.js.map +1 -0
  267. package/dist/verify/metrics.d.ts +13 -0
  268. package/dist/verify/metrics.js +72 -0
  269. package/dist/verify/metrics.js.map +1 -0
  270. package/package.json +68 -0
  271. package/scripts/cheat-demo.cjs +102 -0
  272. package/templates/ledger/preload.cjs +331 -0
  273. package/templates/pen/preload.cjs +196 -0
  274. package/templates/pitstop.prompt.md +371 -0
@@ -0,0 +1,48 @@
1
+ import { Command } from "commander";
2
+ import path from "node:path";
3
+ import fs from "node:fs";
4
+ import chalk from "chalk";
5
+ import { buildModel, renderTerminal, renderMarkdown, renderHtml } from "../report/format.js";
6
+ import { computeScore, renderBadgeSvg } from "../report/score.js";
7
+ export const report = new Command("report")
8
+ .description("Generate a repository analysis report from scan/verify history")
9
+ .argument("[repo]", "path to the repo to report on", ".")
10
+ .option("--html", "also write a self-contained PITSTOP_REPORT.html (zero external assets)")
11
+ .option("--badge-json", "also write PITSTOP_BADGE.json — a shields.io `endpoint`-schema badge you can host " +
12
+ "(https://img.shields.io/endpoint?url=<hosted.json>)")
13
+ .action(async (repoArg, options) => {
14
+ const repo = path.resolve(repoArg);
15
+ console.log(chalk.cyan(`\nGenerating report for ${repo} ...\n`));
16
+ const model = buildModel(repo);
17
+ console.log(renderTerminal(model));
18
+ const md = renderMarkdown(model);
19
+ const mdPath = path.join(repo, "PITSTOP_REPORT.md");
20
+ fs.writeFileSync(mdPath, md);
21
+ if (model.latestScan) {
22
+ const sc = computeScore(model.latestScan);
23
+ const badgePath = path.join(repo, "PITSTOP_BADGE.svg");
24
+ fs.writeFileSync(badgePath, renderBadgeSvg(sc));
25
+ console.log(chalk.dim(`\nBadge (README-ready) written to ${badgePath}\n`) +
26
+ chalk.dim(` embed with: ![OpenPitStop score](PITSTOP_BADGE.svg)\n`));
27
+ if (options.badgeJson) {
28
+ const payload = {
29
+ schemaVersion: 1,
30
+ label: "pitstop",
31
+ message: `${sc.score}/100 ${sc.grade}`,
32
+ color: sc.grade[0] === "A" ? "brightgreen" : sc.grade[0] === "B" ? "green" : sc.grade[0] === "C" ? "yellow" : "red",
33
+ cacheSeconds: 3600,
34
+ };
35
+ const jsonPath = path.join(repo, "PITSTOP_BADGE.json");
36
+ fs.writeFileSync(jsonPath, JSON.stringify(payload, null, 2) + "\n");
37
+ console.log(chalk.dim(`Shield badge JSON written to ${jsonPath}\n`) +
38
+ chalk.dim(` host it and use: https://img.shields.io/endpoint?url=<url>/PITSTOP_BADGE.json\n`));
39
+ }
40
+ }
41
+ console.log(chalk.dim(`\nReport written to ${mdPath}\n`));
42
+ if (options.html) {
43
+ const htmlPath = path.join(repo, "PITSTOP_REPORT.html");
44
+ fs.writeFileSync(htmlPath, renderHtml(model));
45
+ console.log(chalk.dim(`HTML report written to ${htmlPath}\n`));
46
+ }
47
+ });
48
+ //# sourceMappingURL=report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/commands/report.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const reproCmd: Command;
3
+ export default reproCmd;
@@ -0,0 +1,61 @@
1
+ import { Command } from "commander";
2
+ import path from "node:path";
3
+ import chalk from "chalk";
4
+ import boxen from "boxen";
5
+ import { repro } from "../repro/index.js";
6
+ export const reproCmd = new Command("repro")
7
+ .description("Generate and run a permanent repro test for a finding id from scan-latest.json: " +
8
+ "it must FAIL while the bug is present and PASS only after the fix.")
9
+ .argument("<finding-id>", "finding id shown in the scan box / scan-latest.json")
10
+ .argument("[repo]", "path to the repo", ".")
11
+ .option("-w, --write-only", "write the repro test but do not run it")
12
+ .action(async (findingId, repoArg, options) => {
13
+ const repo = path.resolve(repoArg);
14
+ const result = await repro(repo, findingId, { writeOnly: options.writeOnly });
15
+ switch (result.status) {
16
+ case "no-scan":
17
+ case "not-found":
18
+ console.log(chalk.yellow(`\n${result.reason}\n`));
19
+ return;
20
+ case "refused":
21
+ console.log(boxen(`pitstop repro ${findingId}\n\n${chalk.yellow("Not generated:")}\n${result.reason}`, {
22
+ title: " PITSTOP — Repro Refused (honest, not fabricated) ",
23
+ titleAlignment: "center",
24
+ borderStyle: "round",
25
+ padding: 1,
26
+ borderColor: "yellow",
27
+ }));
28
+ return;
29
+ case "generated":
30
+ console.log(chalk.green(`\nWrote repro test ${chalk.bold(result.file)} (not run — --write-only)\n`));
31
+ return;
32
+ case "generated-and-ran": {
33
+ const r = result.ran;
34
+ const pass = r.passed;
35
+ const paint = pass ? chalk.green : chalk.red;
36
+ const borderColor = pass ? "green" : "red";
37
+ const verdict = pass ? "PASS — bug not reproduced (hypothesis unproven)" : "FAIL — bug reproduced";
38
+ console.log(boxen(`pitstop repro ${result.findingId}\n\n` +
39
+ `Test file: ${chalk.bold(result.file)}\n` +
40
+ `Framework: ${r.framework ?? "unknown"}${r.timedOut ? " (timed out)" : ""}\n\n` +
41
+ `${paint(verdict)}\n\n` +
42
+ (pass
43
+ ? "The repro did NOT fail. Under the new contract this means the hypothesis is\n" +
44
+ "unproven — stop and re-diagnose instead of fixing blind."
45
+ : "The repro FAILED, so the bug is real and captured as a failing test.\n" +
46
+ "Fix it, then re-run the SAME repro test and confirm it now PASSES.") +
47
+ `\n\n${chalk.dim(r.stdout || r.stderr || "").slice(0, 2000)}`, {
48
+ title: ` PITSTOP — Repro ${pass ? "PASS" : "FAIL"} `,
49
+ titleAlignment: "center",
50
+ borderStyle: pass ? "round" : "double",
51
+ padding: 1,
52
+ borderColor,
53
+ }));
54
+ // exit non-zero when the repro failed (i.e. bug is present) so callers/CI can gate on it.
55
+ process.exitCode = pass ? 0 : 1;
56
+ return;
57
+ }
58
+ }
59
+ });
60
+ export default reproCmd;
61
+ //# sourceMappingURL=repro.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repro.js","sourceRoot":"","sources":["../../src/commands/repro.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ import { Command } from "commander";
2
+ import type { ScanResult } from "../analyzers/types.js";
3
+ export declare function renderBox(r: ScanResult): string;
4
+ export interface RunScanOptions {
5
+ ledger?: boolean;
6
+ reliabilityRuns?: number;
7
+ reuse?: boolean;
8
+ }
9
+ /**
10
+ * Reuse a sealed baseline when nothing in the working tree changed since it
11
+ * was written. Zero compute, zero model tokens: the exact previous result
12
+ * (with its evidence chain intact) is returned.
13
+ */
14
+ export declare function reuseScan(repo: string): ScanResult | null;
15
+ /**
16
+ * Persist a scan result into .pitstop: the timestamped history file plus the
17
+ * live scan-latest.json, both sealed with the evidence signature (`pitstop
18
+ * verify`/`gate` check it and flag any post-write editing as tampering).
19
+ */
20
+ export declare function persistScan(repo: string, result: ScanResult): {
21
+ file: string;
22
+ };
23
+ export declare function runScan(repo: string, opts?: RunScanOptions): Promise<{
24
+ result: ScanResult;
25
+ file: string;
26
+ }>;
27
+ export declare const scan: Command;
@@ -0,0 +1,348 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import boxen from "boxen";
4
+ import path from "node:path";
5
+ import fs from "node:fs";
6
+ import { runAllAnalyzers } from "../analyzers/index.js";
7
+ import { runLedgerAnalyzer } from "../analyzers/ledger/index.js";
8
+ import { newestModifiedFile } from "../analyzers/util.js";
9
+ import { correlate } from "../graph/correlate.js";
10
+ import { relevantEntriesForFiles } from "../memory/store.js";
11
+ import { stampFindings, findingIdFor } from "../repro/ids.js";
12
+ import { computeScore } from "../report/score.js";
13
+ import { createSpinner } from "../ui/spinner.js";
14
+ import { seal } from "../evidence.js";
15
+ function memTypeColor(t) {
16
+ switch (t) {
17
+ case "decision":
18
+ return chalk.cyan;
19
+ case "fix":
20
+ return chalk.green;
21
+ case "rejection":
22
+ return chalk.red;
23
+ }
24
+ }
25
+ function rel(repo, p) {
26
+ return p ? path.relative(repo, p) : "";
27
+ }
28
+ function label(text) {
29
+ return chalk.bold(text.padEnd(17));
30
+ }
31
+ function scorePaint(s) {
32
+ switch (s.grade[0]) {
33
+ case "A": return chalk.greenBright;
34
+ case "B":
35
+ case "C": return chalk.yellow;
36
+ default: return chalk.red;
37
+ }
38
+ }
39
+ /**
40
+ * One-line fix for a category that printed "skipped" because a dependency was
41
+ * missing. Doubles as `pitstop doctor`-lite, right inside the box, so a fresh
42
+ * machine's first scan never looks like the product is half-missing.
43
+ */
44
+ const SKIPPED_HINTS = [
45
+ [/jscpd not found/i, "install: npm i -g jscpd"],
46
+ [/pa11y\/axe/i, "install: npm i -g pa11y (falls back to static JSX lint)"],
47
+ [/pa11y/i, "install: npm i -g pa11y"],
48
+ [/unsupported language/i, "install: npm i -g gitleaks · pip install semgrep"],
49
+ [/semgrep can?t/i, "install: pip install semgrep"],
50
+ ];
51
+ function skipHint(note) {
52
+ if (!note)
53
+ return "";
54
+ for (const [re, hint] of SKIPPED_HINTS)
55
+ if (re.test(note))
56
+ return hint;
57
+ return "";
58
+ }
59
+ function skippedLine(status, note) {
60
+ const hint = skipHint(note);
61
+ return `skipped — ${note ?? "unavailable"}${hint ? ` · ${chalk.cyan(hint)}` : ""}`;
62
+ }
63
+ export function renderBox(r) {
64
+ const lines = [];
65
+ const sc = computeScore(r);
66
+ const paint = scorePaint(sc);
67
+ const skippedHint = sc.analyzed < sc.total ? chalk.dim(` · ${sc.total - sc.analyzed} skipped`) : "";
68
+ lines.push(`${label("OpenPitStop Score")}: ${paint.bold(`${sc.score}/100 (${sc.grade})`)}${skippedHint}`);
69
+ lines.push("");
70
+ const dg = r.dependencyGraph;
71
+ if (dg.status === "ok") {
72
+ if (dg.circular.length > 0) {
73
+ const cyc = dg.circular[0].map((f) => rel(r.repo, f)).join(" → ");
74
+ lines.push(`${label("Dependency Graph")}: ${chalk.red(`${dg.circular.length} circular`)} — ${cyc}`);
75
+ }
76
+ else {
77
+ const top = dg.mostDependedOn[0];
78
+ const topStr = top ? `${top.file} (${top.count} dependents)` : "no hubs";
79
+ lines.push(`${label("Dependency Graph")}: ${chalk.green("0 circular")} — clean · ${topStr} · ${dg.orphans.length} orphans`);
80
+ }
81
+ }
82
+ else {
83
+ lines.push(`${label("Dependency Graph")}: ${chalk.yellow(skippedLine(dg.status, dg.note))}`);
84
+ }
85
+ const securityClusterCount = r.clusters.filter((c) => [c.rootCause, ...c.symptoms].some((f) => f.source === "security")).length;
86
+ const clusteredSecurity = r.clusters.reduce((n, c) => n + [c.rootCause, ...c.symptoms].filter((f) => f.source === "security").length, 0);
87
+ const sec = r.security;
88
+ if (sec.status === "ok") {
89
+ if (sec.issues.length > 0) {
90
+ if (securityClusterCount > 0) {
91
+ lines.push(`${label("Security")}: ${chalk.red(`${securityClusterCount} root cause(s)`)} → ${clusteredSecurity} symptoms (see below)`);
92
+ }
93
+ else {
94
+ const i = sec.issues[0];
95
+ const loc = i.file
96
+ ? ` (${rel(r.repo, i.file)}${i.line ? ":" + i.line : ""})`
97
+ : "";
98
+ lines.push(`${label("Security")}: ${chalk.red(`${sec.issues.length} issues`)} — ${i.severity} ${i.type}: ${i.description}${loc} [${chalk.dim(findingIdFor("security", i.type, i.file, i.description))}]`);
99
+ }
100
+ }
101
+ else {
102
+ lines.push(`${label("Security")}: ${chalk.green("0 issues")} — clean`);
103
+ }
104
+ }
105
+ else {
106
+ lines.push(`${label("Security")}: ${chalk.yellow(skippedLine(sec.status, sec.note))}`);
107
+ }
108
+ const lg = r.ledger;
109
+ if (lg) {
110
+ if (lg.status === "ok") {
111
+ const proven = lg.evidence.filter((e) => e.doubleCharged);
112
+ if (proven.length > 0) {
113
+ const e = proven[0];
114
+ const evFile = e.evidenceFile
115
+ ? rel(r.repo, e.evidenceFile)
116
+ : "";
117
+ lines.push(`${label("Ledger")}: ${chalk.red(`PROVEN: ${e.summary}`)} — see ${chalk.dim(evFile)} for full request/response logs`);
118
+ }
119
+ else {
120
+ lines.push(`${label("Ledger")}: ${chalk.green(`${lg.endpoints.length} endpoint(s) probed`)} — 0 double-charges (idempotency holds)`);
121
+ }
122
+ }
123
+ else {
124
+ lines.push(`${label("Ledger")}: ${chalk.yellow(lg.status)} — ${lg.note ?? "ledger mode aborted"}`);
125
+ }
126
+ }
127
+ if (r.clusters.length > 0) {
128
+ lines.push("");
129
+ const totalSymptoms = r.clusters.reduce((s, c) => s + c.symptoms.length, 0);
130
+ lines.push(`${label("Root Causes")}: ${r.clusters.length} root cause(s) → ${totalSymptoms} symptom(s)`);
131
+ r.clusters.slice(0, 3).forEach((c, i) => {
132
+ const rc = `${c.rootCause.severity.toUpperCase()} ${c.rootCause.type}${c.rootCause.id ? ` [${c.rootCause.id}]` : ""}`;
133
+ const shared = c.sharedFiles.slice(0, 3).join(", ");
134
+ lines.push(` ${i + 1}. ${chalk.red(rc)}: ${c.rootCause.description}`);
135
+ lines.push(` → ${c.symptoms.length} symptom(s) · shared: ${chalk.dim(shared)}`);
136
+ const mem = relevantEntriesForFiles(r.repo, c.sharedFiles);
137
+ for (const m of mem.slice(0, 3)) {
138
+ const mc = memTypeColor(m.type);
139
+ lines.push(` ${chalk.dim("↳ recall:")} ${mc(m.type)} — ${m.summary}`);
140
+ }
141
+ });
142
+ }
143
+ const dup = r.duplication;
144
+ if (dup.status === "ok") {
145
+ if (dup.cloneCount > 0) {
146
+ const top = dup.clones[0];
147
+ const files = top?.files.map((f) => rel(r.repo, f)).join(", ") ?? "";
148
+ lines.push(`${label("Duplication")}: ${chalk.red(`${dup.cloneCount} clones`)} — ${files}`);
149
+ }
150
+ else {
151
+ lines.push(`${label("Duplication")}: ${chalk.green("0 clones")} — clean`);
152
+ }
153
+ }
154
+ else {
155
+ lines.push(`${label("Duplication")}: ${chalk.yellow(skippedLine(dup.status, dup.note))}`);
156
+ }
157
+ const t = r.tests;
158
+ if (t.status === "ok") {
159
+ const cov = t.coverage != null ? `, ${t.coverage}% cov` : "";
160
+ const body = t.failed > 0
161
+ ? chalk.red(`${t.failed} failed`) + ` / ${t.total}`
162
+ : chalk.green(`${t.passed}/${t.total} passed`);
163
+ lines.push(`${label("Tests")}: ${body} — ${t.durationMs}ms${cov}`);
164
+ }
165
+ else {
166
+ lines.push(`${label("Tests")}: ${chalk.yellow(skippedLine(t.status, t.note))}`);
167
+ }
168
+ const p = r.perf;
169
+ if (p.status === "ok") {
170
+ const kb = p.bundleSizeBytes != null ? (p.bundleSizeBytes / 1024).toFixed(1) : "0";
171
+ lines.push(`${label("Performance")}: ${chalk.green(`build ${p.buildTimeMs}ms`)} — bundle ${kb} KB`);
172
+ }
173
+ else {
174
+ lines.push(`${label("Performance")}: ${chalk.yellow(skippedLine(p.status, p.note))}`);
175
+ }
176
+ const a = r.accessibility;
177
+ if (a.status === "ok") {
178
+ const sev = a.issues.length > 0 &&
179
+ a.issues.some((i) => i.severity === "high" || i.severity === "critical");
180
+ const body = a.issues.length > 0
181
+ ? sev
182
+ ? chalk.red(`${a.issues.length} issues`)
183
+ : chalk.yellow(`${a.issues.length} issues`)
184
+ : chalk.green("clean");
185
+ const eng = a.engine ? ` · ${a.engine}` : "";
186
+ lines.push(`${label("Accessibility")}: ${body}${eng}`);
187
+ }
188
+ else {
189
+ lines.push(`${label("Accessibility")}: ${chalk.yellow(skippedLine(a.status, a.note))}`);
190
+ }
191
+ const reliab = r.reliability;
192
+ if (reliab.status === "ok") {
193
+ const flaky = reliab.flakyTests.length > 0
194
+ ? chalk.red(`${reliab.flakyTests.length} flaky`)
195
+ : chalk.green("0 flaky");
196
+ const smells = reliab.raceSmells.length > 0
197
+ ? chalk.yellow(`${reliab.raceSmells.length} race smell(s)`)
198
+ : chalk.green("0 race smells");
199
+ const runs = reliab.runs > 0 ? ` · ${reliab.runs} runs` : "";
200
+ lines.push(`${label("Reliability")}: ${flaky} · ${smells}${runs}`);
201
+ }
202
+ else {
203
+ lines.push(`${label("Reliability")}: ${chalk.yellow(skippedLine(reliab.status, reliab.note))}`);
204
+ }
205
+ const dx = r.devex;
206
+ if (dx.status === "ok") {
207
+ const unused = dx.unusedExports.length > 0
208
+ ? chalk.yellow(`${dx.unusedExports.length} unused export(s)`)
209
+ : chalk.green("0 unused exports");
210
+ const dups = dx.duplicateFunctions.length > 0
211
+ ? chalk.yellow(`${dx.duplicateFunctions.length} dup function(s)`)
212
+ : chalk.green("0 dup functions");
213
+ lines.push(`${label("Devex")}: ${unused} · ${dups}`);
214
+ }
215
+ else {
216
+ lines.push(`${label("Devex")}: ${chalk.yellow(skippedLine(dx.status, dx.note))}`);
217
+ }
218
+ const content = lines.join("\n") +
219
+ "\n\n " +
220
+ chalk.bold("Awaiting confirmation to begin autonomous fixing.");
221
+ return boxen(content, {
222
+ title: " PITSTOP — Repository Scan Complete ",
223
+ titleAlignment: "center",
224
+ borderStyle: "double",
225
+ padding: 1,
226
+ borderColor: "cyan",
227
+ });
228
+ }
229
+ /**
230
+ * Reuse a sealed baseline when nothing in the working tree changed since it
231
+ * was written. Zero compute, zero model tokens: the exact previous result
232
+ * (with its evidence chain intact) is returned.
233
+ */
234
+ export function reuseScan(repo) {
235
+ const latestPath = path.join(repo, ".pitstop", "scan-latest.json");
236
+ if (!fs.existsSync(latestPath))
237
+ return null;
238
+ let latest;
239
+ try {
240
+ latest = JSON.parse(fs.readFileSync(latestPath, "utf8"));
241
+ }
242
+ catch {
243
+ return null;
244
+ }
245
+ const baselineMs = Date.parse(latest.timestamp ?? "");
246
+ if (!baselineMs || Number.isNaN(baselineMs))
247
+ return null;
248
+ const newest = newestModifiedFile(repo);
249
+ if (!newest)
250
+ return latest;
251
+ if (newest.mtimeMs > baselineMs)
252
+ return null;
253
+ return latest;
254
+ }
255
+ /**
256
+ * Persist a scan result into .pitstop: the timestamped history file plus the
257
+ * live scan-latest.json, both sealed with the evidence signature (`pitstop
258
+ * verify`/`gate` check it and flag any post-write editing as tampering).
259
+ */
260
+ export function persistScan(repo, result) {
261
+ const sealed = seal(result, `pitstop scan result for ${repo}`);
262
+ const outDir = path.join(repo, ".pitstop");
263
+ fs.mkdirSync(outDir, { recursive: true });
264
+ const ts = new Date().toISOString().replace(/[:.]/g, "-");
265
+ const file = path.join(outDir, `scan-${ts}.json`);
266
+ const json = JSON.stringify(sealed, null, 2);
267
+ fs.writeFileSync(file, json);
268
+ fs.writeFileSync(path.join(outDir, "scan-latest.json"), json);
269
+ return { file };
270
+ }
271
+ export async function runScan(repo, opts = {}) {
272
+ const result = await runAllAnalyzers(repo, { reliabilityRuns: opts.reliabilityRuns });
273
+ // Ledger mode is invasive (it boots the app and probes live endpoints), so it
274
+ // never runs unless explicitly requested via `--ledger`.
275
+ if (opts?.ledger) {
276
+ result.ledger = await runLedgerAnalyzer(repo);
277
+ }
278
+ // Stable finding ids first, so clusters and scan-latest.json carry the ids
279
+ // that `pitstop repro <id>` (and committed repro tests) reference.
280
+ stampFindings(result);
281
+ const { clusters } = correlate(repo, result);
282
+ result.clusters = clusters;
283
+ const { file } = persistScan(repo, result);
284
+ return { result, file };
285
+ }
286
+ export const scan = new Command("scan")
287
+ .description("Scan a repo for dependency, security, duplication, test and performance issues")
288
+ .argument("[repo]", "path to the repo to scan", ".")
289
+ .option("--ledger", "opt-in, invasive: boot the app under a nock sandbox and probe money-moving " +
290
+ "endpoints (charge/capture/payment/transfer/refund/webhook) for missing " +
291
+ "idempotency. Never runs unless --ledger is passed.")
292
+ .option("--json", "print the raw scan result as JSON instead of the boxed report")
293
+ .option("--reuse", "token-economy: if the working tree is unchanged since the last scan, return the sealed " +
294
+ "baseline instead of re-running every analyzer (0 model credits, 0 compute).")
295
+ .option("--reliability-runs <n>", "how many sequential times the test suite runs for flaky detection (default 2; " +
296
+ "1 disables flaky detection, >2 costs an extra full suite run each)", "2")
297
+ .action(async (repoArg, options) => {
298
+ const repo = path.resolve(repoArg);
299
+ const reliabilityRuns = Math.max(1, Math.floor(Number(options.reliabilityRuns) || 2));
300
+ if (!options.json) {
301
+ console.log(chalk.cyan(`\nScanning ${repo}${options.ledger ? " with --ledger" : ""} ` +
302
+ `(reliability: ${reliabilityRuns} run${reliabilityRuns > 1 ? "s" : ""}) ...\n`));
303
+ }
304
+ // --reuse: unchanged tree → sealed baseline comes back in zero time.
305
+ if (options.reuse) {
306
+ const reused = reuseScan(repo);
307
+ if (reused) {
308
+ if (options.json) {
309
+ console.log(JSON.stringify(reused, null, 2));
310
+ }
311
+ else {
312
+ console.log(renderBox(reused));
313
+ console.log(chalk.dim(`\n[reuse] baseline from ${reused.timestamp} returned — sources unchanged, nothing re-ran.\n`));
314
+ }
315
+ return;
316
+ }
317
+ }
318
+ const run = async () => {
319
+ const { result, file } = await runScan(repo, {
320
+ ledger: options.ledger,
321
+ reliabilityRuns,
322
+ });
323
+ return { result, file };
324
+ };
325
+ let result;
326
+ let file;
327
+ if (options.json) {
328
+ ({ result, file } = await run());
329
+ }
330
+ else {
331
+ const spin = createSpinner("Running analyzers");
332
+ try {
333
+ ({ result, file } = await run());
334
+ spin.succeed("Scan complete");
335
+ }
336
+ catch (err) {
337
+ spin.fail("Scan failed");
338
+ throw err;
339
+ }
340
+ }
341
+ if (options.json) {
342
+ console.log(JSON.stringify(result, null, 2));
343
+ return;
344
+ }
345
+ console.log(renderBox(result));
346
+ console.log(chalk.dim(`\nReports written to ${file}\n`));
347
+ });
348
+ //# sourceMappingURL=scan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/commands/scan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const share: Command;