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