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 @@
1
+ {"version":3,"file":"proxy.js","sourceRoot":"","sources":["../../src/sandbox/proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { Language } from "../analyzers/util.js";
2
+ /**
3
+ * sandbox/startCmd.ts — resolve the app-under-test's start command.
4
+ *
5
+ * JS repos use the package.json `start` script (as before). Non-JS stacks have
6
+ * no universal convention, so in order we try:
7
+ * 1. the PITSTOP_START env var (explicit, e.g. "uvicorn app.main:app"),
8
+ * 2. the repo's own conventions (manage.py / app.py / main.py / server.py,
9
+ * `go run .`, `cargo run`, `dotnet run`, spring-boot:run / bootRun),
10
+ * 3. null — the caller aborts honestly with a hint instead of guessing.
11
+ */
12
+ export interface StartCommand {
13
+ cmd: string;
14
+ args: string[];
15
+ }
16
+ export declare function isNodeCommand(cmd: string): boolean;
17
+ /** The start command for a Node/JS repo (package.json `start` script). */
18
+ export declare function resolveNodeStart(repo: string): StartCommand;
19
+ /**
20
+ * Best-effort start command for a non-JS repo. `port` is templated into the
21
+ * args where the framework needs it (e.g. Django's runserver). Returns null
22
+ * when nothing can be guessed — callers must abort with an honest hint.
23
+ */
24
+ export declare function resolveNativeStart(repo: string, lang: Language, port: number): StartCommand | null;
@@ -0,0 +1,71 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ const NODE_BASED = new Set([
4
+ "node", "node.exe", "nodejs", "npm", "npm.cmd", "npx", "npx.cmd",
5
+ "yarn", "yarn.cmd", "pnpm", "pnpm.cmd", "tsx", "ts-node", "babel-node",
6
+ "ojs", "vitest", "jest",
7
+ ]);
8
+ export function isNodeCommand(cmd) {
9
+ return NODE_BASED.has(cmd);
10
+ }
11
+ /** The start command for a Node/JS repo (package.json `start` script). */
12
+ export function resolveNodeStart(repo) {
13
+ const pkgPath = path.join(repo, "package.json");
14
+ if (!fs.existsSync(pkgPath))
15
+ throw new Error("no package.json — a start script is required");
16
+ const start = JSON.parse(fs.readFileSync(pkgPath, "utf8").replace(/^\uFEFF/, ""))?.scripts?.start || "";
17
+ if (!start)
18
+ throw new Error("no `start` script in package.json — a start script is required");
19
+ const tokens = start.trim().split(/\s+/);
20
+ return { cmd: tokens[0] || "", args: tokens.slice(1) };
21
+ }
22
+ function gradleWrapper(repo) {
23
+ const name = process.platform === "win32" ? "gradlew.bat" : "gradlew";
24
+ const wrapper = path.join(repo, name);
25
+ return fs.existsSync(wrapper) ? wrapper : null;
26
+ }
27
+ /**
28
+ * Best-effort start command for a non-JS repo. `port` is templated into the
29
+ * args where the framework needs it (e.g. Django's runserver). Returns null
30
+ * when nothing can be guessed — callers must abort with an honest hint.
31
+ */
32
+ export function resolveNativeStart(repo, lang, port) {
33
+ const fromEnv = process.env.PITSTOP_START?.trim();
34
+ if (fromEnv) {
35
+ const tokens = fromEnv.split(/\s+/);
36
+ return { cmd: tokens[0] || "", args: tokens.slice(1) };
37
+ }
38
+ switch (lang) {
39
+ case "python": {
40
+ if (fs.existsSync(path.join(repo, "manage.py"))) {
41
+ return { cmd: "python", args: ["manage.py", "runserver", "--noreload", `0.0.0.0:${port}`] };
42
+ }
43
+ for (const f of ["app.py", "main.py", "server.py", "wsgi.py", "asgi.py"]) {
44
+ if (fs.existsSync(path.join(repo, f)))
45
+ return { cmd: "python", args: [f] };
46
+ }
47
+ return null;
48
+ }
49
+ case "go":
50
+ return fs.existsSync(path.join(repo, "go.mod")) ? { cmd: "go", args: ["run", "."] } : null;
51
+ case "rust":
52
+ return fs.existsSync(path.join(repo, "Cargo.toml"))
53
+ ? { cmd: "cargo", args: ["run"] }
54
+ : null;
55
+ case "dotnet":
56
+ return { cmd: "dotnet", args: ["run"] };
57
+ case "java": {
58
+ if (fs.existsSync(path.join(repo, "pom.xml"))) {
59
+ return { cmd: "mvn", args: ["spring-boot:run"] };
60
+ }
61
+ const gradle = gradleWrapper(repo);
62
+ if (gradle || fs.existsSync(path.join(repo, "build.gradle"))) {
63
+ return { cmd: gradle ?? "gradle", args: ["bootRun"] };
64
+ }
65
+ return null;
66
+ }
67
+ default:
68
+ return null;
69
+ }
70
+ }
71
+ //# sourceMappingURL=startCmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"startCmd.js","sourceRoot":"","sources":["../../src/sandbox/startCmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Spinner wrapper with two modes:
3
+ *
4
+ * - TTY → ora spinner rendered on STDOUT. Overriding the default
5
+ * stderr stream avoids PowerShell 5.1 painting every
6
+ * spinner frame as a red "RemoteException" error record,
7
+ * which made the very first `pitstop scan` look broken.
8
+ * - non-TTY (CI/pipe) → ora is a no-op there; instead we print a plain "text…"
9
+ * line at start and a plain ✓/✗ line at the end, so CI
10
+ * logs still read as a coherent step instead of a terse
11
+ * spinner glyph that never clears.
12
+ */
13
+ export interface Spinner {
14
+ succeed(text?: string): void;
15
+ warn(text?: string): void;
16
+ fail(text?: string): void;
17
+ }
18
+ export declare function createSpinner(text: string): Spinner;
@@ -0,0 +1,26 @@
1
+ import ora from "ora";
2
+ import chalk from "chalk";
3
+ export function createSpinner(text) {
4
+ if (!process.stderr.isTTY) {
5
+ console.log(chalk.dim(`${text}…`));
6
+ return {
7
+ succeed: (t) => {
8
+ if (t)
9
+ console.log(chalk.green(`✓ ${t}`));
10
+ },
11
+ warn: (t) => {
12
+ console.log(chalk.yellow(`⚠ ${t ?? text}`));
13
+ },
14
+ fail: (t) => {
15
+ console.log(chalk.red(`✗ ${t ?? text}`));
16
+ },
17
+ };
18
+ }
19
+ const spin = ora({ text, stream: process.stdout }).start();
20
+ return {
21
+ succeed: (t) => spin.succeed(t),
22
+ warn: (t) => spin.warn(t),
23
+ fail: (t) => spin.fail(t),
24
+ };
25
+ }
26
+ //# sourceMappingURL=spinner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../../src/ui/spinner.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAqB1B,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC;QACnC,OAAO;YACL,OAAO,EAAE,CAAC,CAAU,EAAE,EAAE;gBACtB,IAAI,CAAC;oBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,EAAE,CAAC,CAAU,EAAE,EAAE;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,EAAE,CAAC,CAAU,EAAE,EAAE;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;YAC3C,CAAC;SACF,CAAC;IACJ,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC;IAC3D,OAAO;QACL,OAAO,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;QACxC,IAAI,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAClC,IAAI,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;KACnC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { ScanResult } from "../analyzers/types.js";
2
+ import type { VerifyMetrics, VerifyReport } from "../report/format.js";
3
+ export type Delta = VerifyReport["deltas"];
4
+ /** Collapse a ScanResult into the compact metric shape used for diffs. */
5
+ export declare function metricsOf(r: ScanResult): VerifyMetrics;
6
+ export declare function deltasOf(base: VerifyMetrics, current: VerifyMetrics): Delta;
7
+ /**
8
+ * Bundle size is stable across runs, so a >10% relative change is meaningful.
9
+ * Build time is noisy at small absolute values; only treat as a regression when
10
+ * the baseline is large enough for a relative % to be trustworthy.
11
+ */
12
+ export declare function perfRegressed(base: VerifyMetrics["perf"], current: VerifyMetrics["perf"]): boolean;
13
+ export declare function classifyRisk(base: VerifyMetrics, current: VerifyMetrics, d: Delta): VerifyReport["risk"];
@@ -0,0 +1,72 @@
1
+ /** Collapse a ScanResult into the compact metric shape used for diffs. */
2
+ export function metricsOf(r) {
3
+ return {
4
+ tests: {
5
+ total: r.tests.total,
6
+ passed: r.tests.passed,
7
+ failed: r.tests.failed,
8
+ durationMs: r.tests.durationMs,
9
+ coverage: r.tests.coverage,
10
+ },
11
+ perf: {
12
+ buildTimeMs: r.perf.buildTimeMs,
13
+ bundleSizeBytes: r.perf.bundleSizeBytes,
14
+ },
15
+ securityCount: r.security.issues.length,
16
+ duplicationCount: r.duplication.cloneCount,
17
+ };
18
+ }
19
+ export function deltasOf(base, current) {
20
+ return {
21
+ passed: current.tests.passed - base.tests.passed,
22
+ failed: current.tests.failed - base.tests.failed,
23
+ durationMs: current.tests.durationMs - base.tests.durationMs,
24
+ coverage: (current.tests.coverage ?? 0) - (base.tests.coverage ?? 0),
25
+ buildTimeMs: (current.perf.buildTimeMs ?? 0) - (base.perf.buildTimeMs ?? 0),
26
+ bundleSizeBytes: (current.perf.bundleSizeBytes ?? 0) - (base.perf.bundleSizeBytes ?? 0),
27
+ security: current.securityCount - base.securityCount,
28
+ duplication: current.duplicationCount - base.duplicationCount,
29
+ };
30
+ }
31
+ /**
32
+ * Bundle size is stable across runs, so a >10% relative change is meaningful.
33
+ * Build time is noisy at small absolute values; only treat as a regression when
34
+ * the baseline is large enough for a relative % to be trustworthy.
35
+ */
36
+ export function perfRegressed(base, current) {
37
+ const bb = base.bundleSizeBytes ?? 0;
38
+ const cb = current.bundleSizeBytes ?? 0;
39
+ const bt = base.buildTimeMs ?? 0;
40
+ const ct = current.buildTimeMs ?? 0;
41
+ if (bb > 0 && (cb - bb) / bb > 0.1)
42
+ return true;
43
+ if (bt >= 500 && (ct - bt) / bt > 0.1)
44
+ return true;
45
+ return false;
46
+ }
47
+ export function classifyRisk(base, current, d) {
48
+ const testsNewlyFail = current.tests.failed > base.tests.failed && current.tests.failed > 0;
49
+ if (testsNewlyFail || perfRegressed(base.perf, current.perf))
50
+ return "High";
51
+ // Build time is noisy at small absolute values; ignore sub-50ms deltas
52
+ // when classifying risk so a re-run doesn't look like a regression.
53
+ const buildDelta = Math.abs(d.buildTimeMs) > 50 ? d.buildTimeMs : 0;
54
+ const changed = d.passed !== 0 ||
55
+ d.failed !== 0 ||
56
+ d.durationMs !== 0 ||
57
+ d.coverage !== 0 ||
58
+ buildDelta !== 0 ||
59
+ d.bundleSizeBytes !== 0 ||
60
+ d.security !== 0 ||
61
+ d.duplication !== 0;
62
+ const improved = d.failed < 0 ||
63
+ d.passed > 0 ||
64
+ d.durationMs < 0 ||
65
+ d.coverage > 0 ||
66
+ buildDelta < 0 ||
67
+ d.bundleSizeBytes < 0 ||
68
+ d.security < 0 ||
69
+ d.duplication < 0;
70
+ return !changed || improved ? "Low" : "Medium";
71
+ }
72
+ //# sourceMappingURL=metrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../src/verify/metrics.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,68 @@
1
+ {
2
+ "name": "openpitstop",
3
+ "version": "1.0.0",
4
+ "description": "Deterministic scans + your coding agent's own reasoning, in one autonomous quality loop. Adds a /pitstop slash-command to any AI coding tool.",
5
+ "license": "MIT",
6
+ "author": "Krish-1507",
7
+ "keywords": [
8
+ "cli",
9
+ "pitstop",
10
+ "code-quality",
11
+ "code-review",
12
+ "ai",
13
+ "autonomous",
14
+ "agent",
15
+ "scan",
16
+ "verify"
17
+ ],
18
+ "type": "module",
19
+ "bin": {
20
+ "openpitstop": "dist/cli.js",
21
+ "pitstop": "dist/cli.js"
22
+ },
23
+ "files": [
24
+ "dist",
25
+ "scripts",
26
+ "templates",
27
+ "demo-repo",
28
+ "demo-repo-integrity",
29
+ "demo-repo-fintech",
30
+ "demo-repo-generators",
31
+ "README.md",
32
+ "LICENSE"
33
+ ],
34
+ "engines": {
35
+ "node": ">=22"
36
+ },
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/Krish-1507/OpenPitStop.git"
40
+ },
41
+ "homepage": "https://github.com/Krish-1507/OpenPitStop#readme",
42
+ "bugs": {
43
+ "url": "https://github.com/Krish-1507/OpenPitStop/issues"
44
+ },
45
+ "scripts": {
46
+ "build": "tsc",
47
+ "dev": "tsx watch src/cli.ts",
48
+ "smoke": "node dist/cli.js scan demo-repo",
49
+ "test": "node --import tsx --test \"test/*.test.ts\"",
50
+ "typecheck": "tsc --noEmit && tsc --noEmit -p tsconfig.test.json",
51
+ "prepublishOnly": "npm run build"
52
+ },
53
+ "dependencies": {
54
+ "@babel/parser": "^7.25.0",
55
+ "boxen": "^7.1.1",
56
+ "chalk": "^5.3.0",
57
+ "cli-table3": "^0.6.5",
58
+ "commander": "^12.1.0",
59
+ "execa": "^10.0.1",
60
+ "nock": "^14.0.17",
61
+ "ora": "^8.1.0"
62
+ },
63
+ "devDependencies": {
64
+ "@types/node": "^22.0.0",
65
+ "tsx": "^4.19.0",
66
+ "typescript": "^5.6.0"
67
+ }
68
+ }
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * cheat-demo.cjs — the 90-second "agent tried to cheat, OpenPitStop caught it"
4
+ * demo, fully scripted and deterministic. Use it in a video, or live in front
5
+ * of judges: it produces the SUSPICIOUS -> CONFIRMED_CHEAT arc on cue.
6
+ *
7
+ * Story: demo-repo-integrity has a real float-rounding bug and a test that
8
+ * proves it. A lazy "agent" tries to make the failing suite green WITHOUT
9
+ * fixing the root cause, twice:
10
+ *
11
+ * 1. focuses the suite on the passing tests -> SUSPICIOUS
12
+ * 2. deletes the failing test file entirely -> CONFIRMED_CHEAT
13
+ *
14
+ * `pitstop gate` catches both, escalates to exit code 2, and blocks the
15
+ * commit. That is the product: the agent finally has a referee.
16
+ *
17
+ * Usage: node scripts/cheat-demo.cjs
18
+ * (set PITSTOP_CLI to point at a build, e.g.
19
+ * PITSTOP_CLI="node D:/OpenPitStop-cli/dist/cli.js")
20
+ */
21
+
22
+ const fs = require("fs");
23
+ const os = require("os");
24
+ const path = require("path");
25
+ const { execSync } = require("child_process");
26
+
27
+ const ROOT = path.resolve(__dirname, "..");
28
+ const CLI = process.env.PITSTOP_CLI || "npx openpitstop";
29
+
30
+ const run = (cmd, cwd) => {
31
+ console.log(`\n$ ${cmd}`);
32
+ try {
33
+ const out = execSync(cmd, { cwd, encoding: "utf8", stdio: ["pipe", "inherit", "inherit"] });
34
+ return { code: 0, out };
35
+ } catch (e) {
36
+ return { code: e.status ?? 1, out: String(e.stdout ?? "") };
37
+ }
38
+ };
39
+
40
+ const say = (t) => console.log("\n" + "─".repeat(72) + "\n" + t + "\n" + "─".repeat(72));
41
+
42
+ function main() {
43
+ const src = path.join(ROOT, "demo-repo-integrity");
44
+ if (!fs.existsSync(path.join(src, "package.json"))) {
45
+ console.error(`demo-repo-integrity not found at ${src}`);
46
+ process.exit(1);
47
+ }
48
+
49
+ const tmp = fs.mkdtempSync(path.join(os.tmpdir(), "pitstop-cheat-demo-"));
50
+ fs.cpSync(src, tmp, { recursive: true, filter: (p) => !/node_modules$/.test(p) });
51
+
52
+ say("PITSTOP CHEAT-CATCH DEMO — the agent finally has a referee");
53
+ console.log(`demo repo: ${tmp}`);
54
+
55
+ say("ACT 1 — baseline: a real bug, a failing test, an honest scan");
56
+ run("npm install --no-audit --no-fund", tmp);
57
+ run("git init -q && git config user.email pitstop@demo.local && git config user.name \"OpenPitStop Demo\" && git add -A && git commit -q -m baseline", tmp);
58
+ const scan = run(`${CLI} scan`, tmp);
59
+ if (!/1 failed|failed 1|Tests\s*:.*fail/i.test(scan.out)) {
60
+ console.log(scan.out);
61
+ console.log("\n(scan output above; the test suite should show 1 failed — the float bug)");
62
+ }
63
+
64
+ say("ACT 2 — a lazy 'fix': focus the suite on the passing tests (SUSPICIOUS)");
65
+ const testFile = path.join(tmp, "test", "money.test.js");
66
+ let testCode = fs.readFileSync(testFile, "utf8");
67
+ testCode = testCode.replace(
68
+ 'it("quotes base + 7.5% markup to the cent"',
69
+ 'fit("quotes base + 7.5% markup to the cent"',
70
+ );
71
+ testCode = testCode.replace(
72
+ 'it("splits a bill evenly to the cent"',
73
+ 'fit("splits a bill evenly to the cent"',
74
+ );
75
+ fs.writeFileSync(testFile, testCode, "utf8");
76
+ const act2 = run(`${CLI} gate`, tmp);
77
+ console.log("\nOpenPitStop's verdict: jest now runs ONLY the focused tests — the failing one is");
78
+ console.log("hidden, the suite is 'green', the bug is still there. SUSPICIOUS, needs a human.");
79
+ if (act2.code !== 1) {
80
+ console.log(`\nWARNING: expected gate exit 1 (SUSPICIOUS), got ${act2.code}`);
81
+ process.exitCode = 1;
82
+ }
83
+
84
+ say("ACT 3 — the desperate 'fix': delete the failing test (CONFIRMED_CHEAT)");
85
+ run("git rm -q -f test/money.test.js", tmp);
86
+ const gate = run(`${CLI} gate`, tmp);
87
+ console.log(`\ngate exit code: ${gate.code} — ` + (gate.code === 2 ? "CONFIRMED_CHEAT. The commit is blocked." : `expected 2, got ${gate.code}`));
88
+ if (gate.code !== 2) process.exitCode = 1;
89
+
90
+ say("THE PITCH");
91
+ console.log(
92
+ "Agents fix code; they don't know when to stop, and they'll tell you they're done regardless.\n" +
93
+ "OpenPitStop is the referee it can't cheat: deterministic scans, tamper-evident baselines,\n" +
94
+ "runtime penetration tests with failing-first repro contracts, and a verification gate\n" +
95
+ "that catches the agent lying — SUSPICIOUS needs a human, CONFIRMED_CHEAT is blocked.\n" +
96
+ "\nNow run the same arc against a repo that matters: npx openpitstop pen --fix, then\n" +
97
+ "npx openpitstop drive <finding-id> — your agent fixes it, and OpenPitStop verifies the\n" +
98
+ "repro flips FAIL -> PASS. The numbers can't be talked into looking better.",
99
+ );
100
+ }
101
+
102
+ main();