@svp-labs/talos 0.0.0 → 0.1.1
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/ENGINEERING.md +408 -0
- package/README.md +49 -0
- package/assets/claude/kit-block.md +58 -0
- package/assets/codeowners +2 -0
- package/assets/dependabot/update.yml +7 -0
- package/assets/hooks/pre-push +76 -0
- package/assets/issue-forms/bug.yml +44 -0
- package/assets/issue-forms/chore.yml +32 -0
- package/assets/issue-forms/config.yml +2 -0
- package/assets/issue-forms/dead-code.yml +32 -0
- package/assets/issue-forms/debt.yml +32 -0
- package/assets/issue-forms/epic.yml +34 -0
- package/assets/issue-forms/feature.yml +40 -0
- package/assets/issue-forms/refactor.yml +32 -0
- package/assets/issue-forms/spike.yml +32 -0
- package/assets/labels.yml +101 -0
- package/assets/patches/@stryker-mutator__vitest-runner@10.0.0.patch +14 -0
- package/assets/prompts/review.md +66 -0
- package/assets/pull_request_template.md +14 -0
- package/assets/rulesets/channel.json +28 -0
- package/assets/rulesets/channels-branch.json +8 -0
- package/assets/rulesets/merge-queue.json +34 -0
- package/assets/rulesets/owner-review.json +21 -0
- package/assets/rulesets/release-tags.json +8 -0
- package/assets/rulesets/self-test.json +21 -0
- package/assets/workflows/talos.yml +423 -0
- package/bootstrap/find-pin.sh +76 -0
- package/bootstrap/launch.ts +347 -0
- package/bootstrap/php.sh +55 -0
- package/dist/adopt/assets.js +40 -0
- package/dist/adopt/assets.js.map +1 -0
- package/dist/adopt/config.js +68 -0
- package/dist/adopt/config.js.map +1 -0
- package/dist/adopt/dependabot.js +176 -0
- package/dist/adopt/dependabot.js.map +1 -0
- package/dist/adopt/detect.js +148 -0
- package/dist/adopt/detect.js.map +1 -0
- package/dist/adopt/dev-deps.js +179 -0
- package/dist/adopt/dev-deps.js.map +1 -0
- package/dist/adopt/draft.js +43 -0
- package/dist/adopt/draft.js.map +1 -0
- package/dist/adopt/hooks.js +101 -0
- package/dist/adopt/hooks.js.map +1 -0
- package/dist/adopt/json-text.js +45 -0
- package/dist/adopt/json-text.js.map +1 -0
- package/dist/adopt/kit.js +68 -0
- package/dist/adopt/kit.js.map +1 -0
- package/dist/adopt/languages.js +127 -0
- package/dist/adopt/languages.js.map +1 -0
- package/dist/adopt/local.js +100 -0
- package/dist/adopt/local.js.map +1 -0
- package/dist/adopt/php.js +67 -0
- package/dist/adopt/php.js.map +1 -0
- package/dist/adopt/plan.js +114 -0
- package/dist/adopt/plan.js.map +1 -0
- package/dist/adopt/python.js +200 -0
- package/dist/adopt/python.js.map +1 -0
- package/dist/adopt/remote.js +110 -0
- package/dist/adopt/remote.js.map +1 -0
- package/dist/adopt/rust.js +250 -0
- package/dist/adopt/rust.js.map +1 -0
- package/dist/adopt/scaffold.js +76 -0
- package/dist/adopt/scaffold.js.map +1 -0
- package/dist/adopt/security.js +153 -0
- package/dist/adopt/security.js.map +1 -0
- package/dist/adopt/supply.js +153 -0
- package/dist/adopt/supply.js.map +1 -0
- package/dist/adopt/talos-yml.js +95 -0
- package/dist/adopt/talos-yml.js.map +1 -0
- package/dist/adopt/texts.js +121 -0
- package/dist/adopt/texts.js.map +1 -0
- package/dist/adopt/toml-text.js +180 -0
- package/dist/adopt/toml-text.js.map +1 -0
- package/dist/adopt/tool-pins.js +133 -0
- package/dist/adopt/tool-pins.js.map +1 -0
- package/dist/adopt/tsconfig.js +80 -0
- package/dist/adopt/tsconfig.js.map +1 -0
- package/dist/bin/talos.js +7 -0
- package/dist/bin/talos.js.map +1 -0
- package/dist/central/channels-file.js +82 -0
- package/dist/central/channels-file.js.map +1 -0
- package/dist/central/channels-job.js +112 -0
- package/dist/central/channels-job.js.map +1 -0
- package/dist/central/channels.js +204 -0
- package/dist/central/channels.js.map +1 -0
- package/dist/central/drift-job.js +132 -0
- package/dist/central/drift-job.js.map +1 -0
- package/dist/central/drift.js +195 -0
- package/dist/central/drift.js.map +1 -0
- package/dist/central/gate-runs.js +48 -0
- package/dist/central/gate-runs.js.map +1 -0
- package/dist/central/org-rulesets.js +129 -0
- package/dist/central/org-rulesets.js.map +1 -0
- package/dist/central/pick.js +67 -0
- package/dist/central/pick.js.map +1 -0
- package/dist/central/privacy.js +158 -0
- package/dist/central/privacy.js.map +1 -0
- package/dist/central/releases.js +130 -0
- package/dist/central/releases.js.map +1 -0
- package/dist/central/repos.js +36 -0
- package/dist/central/repos.js.map +1 -0
- package/dist/central/runtime-port.js +49 -0
- package/dist/central/runtime-port.js.map +1 -0
- package/dist/central/sweep-job.js +62 -0
- package/dist/central/sweep-job.js.map +1 -0
- package/dist/central/sweep.js +182 -0
- package/dist/central/sweep.js.map +1 -0
- package/dist/checks/common/code-files.js +59 -0
- package/dist/checks/common/code-files.js.map +1 -0
- package/dist/checks/common/custom.js +123 -0
- package/dist/checks/common/custom.js.map +1 -0
- package/dist/checks/common/duplication.js +96 -0
- package/dist/checks/common/duplication.js.map +1 -0
- package/dist/checks/common/index.js +14 -0
- package/dist/checks/common/index.js.map +1 -0
- package/dist/checks/common/jscpd-config.js +50 -0
- package/dist/checks/common/jscpd-config.js.map +1 -0
- package/dist/checks/common/jscpd-report.js +62 -0
- package/dist/checks/common/jscpd-report.js.map +1 -0
- package/dist/checks/common/suppression-rules.js +271 -0
- package/dist/checks/common/suppression-rules.js.map +1 -0
- package/dist/checks/common/suppression-scan.js +103 -0
- package/dist/checks/common/suppression-scan.js.map +1 -0
- package/dist/checks/common/suppressions.js +26 -0
- package/dist/checks/common/suppressions.js.map +1 -0
- package/dist/checks/common/texts.js +34 -0
- package/dist/checks/common/texts.js.map +1 -0
- package/dist/checks/docs/claude-md.js +71 -0
- package/dist/checks/docs/claude-md.js.map +1 -0
- package/dist/checks/docs/comments.js +31 -0
- package/dist/checks/docs/comments.js.map +1 -0
- package/dist/checks/docs/cspell.js +138 -0
- package/dist/checks/docs/cspell.js.map +1 -0
- package/dist/checks/docs/decisions.js +30 -0
- package/dist/checks/docs/decisions.js.map +1 -0
- package/dist/checks/docs/files.js +64 -0
- package/dist/checks/docs/files.js.map +1 -0
- package/dist/checks/docs/glossary.js +99 -0
- package/dist/checks/docs/glossary.js.map +1 -0
- package/dist/checks/docs/index.js +25 -0
- package/dist/checks/docs/index.js.map +1 -0
- package/dist/checks/docs/markdown.js +39 -0
- package/dist/checks/docs/markdown.js.map +1 -0
- package/dist/checks/docs/markdownlint.js +86 -0
- package/dist/checks/docs/markdownlint.js.map +1 -0
- package/dist/checks/docs/references.js +82 -0
- package/dist/checks/docs/references.js.map +1 -0
- package/dist/checks/docs/spelling.js +83 -0
- package/dist/checks/docs/spelling.js.map +1 -0
- package/dist/checks/infra/actionlint.js +95 -0
- package/dist/checks/infra/actionlint.js.map +1 -0
- package/dist/checks/infra/configs.js +52 -0
- package/dist/checks/infra/configs.js.map +1 -0
- package/dist/checks/infra/dockerfile.js +69 -0
- package/dist/checks/infra/dockerfile.js.map +1 -0
- package/dist/checks/infra/files.js +123 -0
- package/dist/checks/infra/files.js.map +1 -0
- package/dist/checks/infra/index.js +59 -0
- package/dist/checks/infra/index.js.map +1 -0
- package/dist/checks/infra/powershell.js +128 -0
- package/dist/checks/infra/powershell.js.map +1 -0
- package/dist/checks/infra/report.js +46 -0
- package/dist/checks/infra/report.js.map +1 -0
- package/dist/checks/infra/shell.js +64 -0
- package/dist/checks/infra/shell.js.map +1 -0
- package/dist/checks/infra/zizmor.js +93 -0
- package/dist/checks/infra/zizmor.js.map +1 -0
- package/dist/checks/process/commits.js +74 -0
- package/dist/checks/process/commits.js.map +1 -0
- package/dist/checks/runtime/assess.js +140 -0
- package/dist/checks/runtime/assess.js.map +1 -0
- package/dist/checks/runtime/check.js +67 -0
- package/dist/checks/runtime/check.js.map +1 -0
- package/dist/checks/runtime/declaration.js +33 -0
- package/dist/checks/runtime/declaration.js.map +1 -0
- package/dist/checks/runtime/declarations.js +38 -0
- package/dist/checks/runtime/declarations.js.map +1 -0
- package/dist/checks/runtime/dockerfile.js +228 -0
- package/dist/checks/runtime/dockerfile.js.map +1 -0
- package/dist/checks/runtime/feeds.js +120 -0
- package/dist/checks/runtime/feeds.js.map +1 -0
- package/dist/checks/runtime/fetchers.js +72 -0
- package/dist/checks/runtime/fetchers.js.map +1 -0
- package/dist/checks/runtime/index.js +7 -0
- package/dist/checks/runtime/index.js.map +1 -0
- package/dist/checks/runtime/runtimes.js +30 -0
- package/dist/checks/runtime/runtimes.js.map +1 -0
- package/dist/checks/runtime/tools-lock.js +40 -0
- package/dist/checks/runtime/tools-lock.js.map +1 -0
- package/dist/checks/runtime/version-files.js +95 -0
- package/dist/checks/runtime/version-files.js.map +1 -0
- package/dist/checks/runtime/versions.js +51 -0
- package/dist/checks/runtime/versions.js.map +1 -0
- package/dist/checks/security/dependencies.js +70 -0
- package/dist/checks/security/dependencies.js.map +1 -0
- package/dist/checks/security/gitleaks-config.js +114 -0
- package/dist/checks/security/gitleaks-config.js.map +1 -0
- package/dist/checks/security/gitleaks.js +93 -0
- package/dist/checks/security/gitleaks.js.map +1 -0
- package/dist/checks/security/index.js +12 -0
- package/dist/checks/security/index.js.map +1 -0
- package/dist/checks/security/licences.js +50 -0
- package/dist/checks/security/licences.js.map +1 -0
- package/dist/checks/security/osv-config.js +56 -0
- package/dist/checks/security/osv-config.js.map +1 -0
- package/dist/checks/security/osv.js +146 -0
- package/dist/checks/security/osv.js.map +1 -0
- package/dist/checks/security/secrets.js +35 -0
- package/dist/checks/security/secrets.js.map +1 -0
- package/dist/checks/security/semgrep.js +184 -0
- package/dist/checks/security/semgrep.js.map +1 -0
- package/dist/checks/security/strength.js +80 -0
- package/dist/checks/security/strength.js.map +1 -0
- package/dist/checks/supply/advisories.js +66 -0
- package/dist/checks/supply/advisories.js.map +1 -0
- package/dist/checks/supply/base.js +37 -0
- package/dist/checks/supply/base.js.map +1 -0
- package/dist/checks/supply/dates.js +26 -0
- package/dist/checks/supply/dates.js.map +1 -0
- package/dist/checks/supply/dependabot.js +87 -0
- package/dist/checks/supply/dependabot.js.map +1 -0
- package/dist/checks/supply/deps.js +8 -0
- package/dist/checks/supply/deps.js.map +1 -0
- package/dist/checks/supply/exotic.js +36 -0
- package/dist/checks/supply/exotic.js.map +1 -0
- package/dist/checks/supply/expired.js +72 -0
- package/dist/checks/supply/expired.js.map +1 -0
- package/dist/checks/supply/fetcher.js +52 -0
- package/dist/checks/supply/fetcher.js.map +1 -0
- package/dist/checks/supply/index.js +21 -0
- package/dist/checks/supply/index.js.map +1 -0
- package/dist/checks/supply/judged.js +55 -0
- package/dist/checks/supply/judged.js.map +1 -0
- package/dist/checks/supply/lockfiles/cargo.js +34 -0
- package/dist/checks/supply/lockfiles/cargo.js.map +1 -0
- package/dist/checks/supply/lockfiles/composer.js +41 -0
- package/dist/checks/supply/lockfiles/composer.js.map +1 -0
- package/dist/checks/supply/lockfiles/index.js +51 -0
- package/dist/checks/supply/lockfiles/index.js.map +1 -0
- package/dist/checks/supply/lockfiles/locked.js +69 -0
- package/dist/checks/supply/lockfiles/locked.js.map +1 -0
- package/dist/checks/supply/lockfiles/npm.js +68 -0
- package/dist/checks/supply/lockfiles/npm.js.map +1 -0
- package/dist/checks/supply/lockfiles/pnpm.js +47 -0
- package/dist/checks/supply/lockfiles/pnpm.js.map +1 -0
- package/dist/checks/supply/lockfiles/python.js +77 -0
- package/dist/checks/supply/lockfiles/python.js.map +1 -0
- package/dist/checks/supply/lockfiles/yarn.js +77 -0
- package/dist/checks/supply/lockfiles/yarn.js.map +1 -0
- package/dist/checks/supply/pnpm-settings.js +95 -0
- package/dist/checks/supply/pnpm-settings.js.map +1 -0
- package/dist/checks/supply/provenance.js +82 -0
- package/dist/checks/supply/provenance.js.map +1 -0
- package/dist/checks/supply/registries.js +109 -0
- package/dist/checks/supply/registries.js.map +1 -0
- package/dist/checks/supply/release-age.js +63 -0
- package/dist/checks/supply/release-age.js.map +1 -0
- package/dist/checks/supply/settings.js +129 -0
- package/dist/checks/supply/settings.js.map +1 -0
- package/dist/cli/adopt.js +269 -0
- package/dist/cli/adopt.js.map +1 -0
- package/dist/cli/central.js +201 -0
- package/dist/cli/central.js.map +1 -0
- package/dist/cli/check.js +121 -0
- package/dist/cli/check.js.map +1 -0
- package/dist/cli/configs.js +65 -0
- package/dist/cli/configs.js.map +1 -0
- package/dist/cli/debt.js +75 -0
- package/dist/cli/debt.js.map +1 -0
- package/dist/cli/doctor.js +38 -0
- package/dist/cli/doctor.js.map +1 -0
- package/dist/cli/findings.js +32 -0
- package/dist/cli/findings.js.map +1 -0
- package/dist/cli/govern.js +98 -0
- package/dist/cli/govern.js.map +1 -0
- package/dist/cli/io.js +29 -0
- package/dist/cli/io.js.map +1 -0
- package/dist/cli/job.js +173 -0
- package/dist/cli/job.js.map +1 -0
- package/dist/cli/main.js +109 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/new.js +73 -0
- package/dist/cli/new.js.map +1 -0
- package/dist/cli/org.js +88 -0
- package/dist/cli/org.js.map +1 -0
- package/dist/cli/plan.js +49 -0
- package/dist/cli/plan.js.map +1 -0
- package/dist/cli/run.js +78 -0
- package/dist/cli/run.js.map +1 -0
- package/dist/cli/self-test.js +127 -0
- package/dist/cli/self-test.js.map +1 -0
- package/dist/cli/shrinkwrap.js +20 -0
- package/dist/cli/shrinkwrap.js.map +1 -0
- package/dist/cli/status.js +39 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/ticket.js +180 -0
- package/dist/cli/ticket.js.map +1 -0
- package/dist/cli/verdict.js +57 -0
- package/dist/cli/verdict.js.map +1 -0
- package/dist/cli/version.js +29 -0
- package/dist/cli/version.js.map +1 -0
- package/dist/cli/why.js +96 -0
- package/dist/cli/why.js.map +1 -0
- package/dist/config/load.js +41 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/schema.js +75 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/configs/drift.js +112 -0
- package/dist/configs/drift.js.map +1 -0
- package/dist/configs/files.js +35 -0
- package/dist/configs/files.js.map +1 -0
- package/dist/configs/header.js +31 -0
- package/dist/configs/header.js.map +1 -0
- package/dist/configs/index.js +8 -0
- package/dist/configs/index.js.map +1 -0
- package/dist/configs/json.js +26 -0
- package/dist/configs/json.js.map +1 -0
- package/dist/configs/packs.js +30 -0
- package/dist/configs/packs.js.map +1 -0
- package/dist/core/check.js +9 -0
- package/dist/core/check.js.map +1 -0
- package/dist/core/compare.js +46 -0
- package/dist/core/compare.js.map +1 -0
- package/dist/core/component.js +57 -0
- package/dist/core/component.js.map +1 -0
- package/dist/core/finding.js +2 -0
- package/dist/core/finding.js.map +1 -0
- package/dist/core/fingerprint.js +29 -0
- package/dist/core/fingerprint.js.map +1 -0
- package/dist/core/literal.js +85 -0
- package/dist/core/literal.js.map +1 -0
- package/dist/core/log.js +20 -0
- package/dist/core/log.js.map +1 -0
- package/dist/core/pack.js +2 -0
- package/dist/core/pack.js.map +1 -0
- package/dist/core/pool.js +16 -0
- package/dist/core/pool.js.map +1 -0
- package/dist/core/registry.js +28 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/result.js +45 -0
- package/dist/core/result.js.map +1 -0
- package/dist/core/xml.js +63 -0
- package/dist/core/xml.js.map +1 -0
- package/dist/docs/claude.js +79 -0
- package/dist/docs/claude.js.map +1 -0
- package/dist/docs/comments/c-family.js +180 -0
- package/dist/docs/comments/c-family.js.map +1 -0
- package/dist/docs/comments/index.js +41 -0
- package/dist/docs/comments/index.js.map +1 -0
- package/dist/docs/comments/rules.js +174 -0
- package/dist/docs/comments/rules.js.map +1 -0
- package/dist/docs/comments/scan.js +138 -0
- package/dist/docs/comments/scan.js.map +1 -0
- package/dist/docs/comments/script.js +135 -0
- package/dist/docs/comments/script.js.map +1 -0
- package/dist/docs/decisions.js +168 -0
- package/dist/docs/decisions.js.map +1 -0
- package/dist/docs/glossary.js +81 -0
- package/dist/docs/glossary.js.map +1 -0
- package/dist/docs/links.js +119 -0
- package/dist/docs/links.js.map +1 -0
- package/dist/docs/markdown.js +176 -0
- package/dist/docs/markdown.js.map +1 -0
- package/dist/engine/gate.js +144 -0
- package/dist/engine/gate.js.map +1 -0
- package/dist/engine/local.js +90 -0
- package/dist/engine/local.js.map +1 -0
- package/dist/engine/plan.js +165 -0
- package/dist/engine/plan.js.map +1 -0
- package/dist/engine/prepare.js +140 -0
- package/dist/engine/prepare.js.map +1 -0
- package/dist/engine/report.js +71 -0
- package/dist/engine/report.js.map +1 -0
- package/dist/engine/run.js +142 -0
- package/dist/engine/run.js.map +1 -0
- package/dist/engine/session.js +10 -0
- package/dist/engine/session.js.map +1 -0
- package/dist/engine/verdict-caps.js +30 -0
- package/dist/engine/verdict-caps.js.map +1 -0
- package/dist/engine/verdict.js +49 -0
- package/dist/engine/verdict.js.map +1 -0
- package/dist/exec/exec.js +136 -0
- package/dist/exec/exec.js.map +1 -0
- package/dist/github/actions.js +62 -0
- package/dist/github/actions.js.map +1 -0
- package/dist/github/api.js +138 -0
- package/dist/github/api.js.map +1 -0
- package/dist/github/artifacts.js +203 -0
- package/dist/github/artifacts.js.map +1 -0
- package/dist/github/checks.js +86 -0
- package/dist/github/checks.js.map +1 -0
- package/dist/github/contents.js +38 -0
- package/dist/github/contents.js.map +1 -0
- package/dist/github/gate-runs.js +59 -0
- package/dist/github/gate-runs.js.map +1 -0
- package/dist/github/identities.js +29 -0
- package/dist/github/identities.js.map +1 -0
- package/dist/github/org-variables.js +41 -0
- package/dist/github/org-variables.js.map +1 -0
- package/dist/github/pulls.js +32 -0
- package/dist/github/pulls.js.map +1 -0
- package/dist/github/remote.js +26 -0
- package/dist/github/remote.js.map +1 -0
- package/dist/github/repos.js +64 -0
- package/dist/github/repos.js.map +1 -0
- package/dist/github/rulesets.js +44 -0
- package/dist/github/rulesets.js.map +1 -0
- package/dist/govern/commit.js +31 -0
- package/dist/govern/commit.js.map +1 -0
- package/dist/govern/compare.js +52 -0
- package/dist/govern/compare.js.map +1 -0
- package/dist/govern/create.js +97 -0
- package/dist/govern/create.js.map +1 -0
- package/dist/govern/govern.js +77 -0
- package/dist/govern/govern.js.map +1 -0
- package/dist/govern/installations.js +64 -0
- package/dist/govern/installations.js.map +1 -0
- package/dist/govern/org.js +170 -0
- package/dist/govern/org.js.map +1 -0
- package/dist/govern/output.js +32 -0
- package/dist/govern/output.js.map +1 -0
- package/dist/govern/plan.js +166 -0
- package/dist/govern/plan.js.map +1 -0
- package/dist/govern/rulesets-api.js +39 -0
- package/dist/govern/rulesets-api.js.map +1 -0
- package/dist/govern/state.js +108 -0
- package/dist/govern/state.js.map +1 -0
- package/dist/govern/steps.js +143 -0
- package/dist/govern/steps.js.map +1 -0
- package/dist/govern/templates.js +140 -0
- package/dist/govern/templates.js.map +1 -0
- package/dist/jobs/act.js +60 -0
- package/dist/jobs/act.js.map +1 -0
- package/dist/jobs/analyze.js +68 -0
- package/dist/jobs/analyze.js.map +1 -0
- package/dist/jobs/artifacts.js +35 -0
- package/dist/jobs/artifacts.js.map +1 -0
- package/dist/jobs/context.js +2 -0
- package/dist/jobs/context.js.map +1 -0
- package/dist/jobs/debt-issues.js +129 -0
- package/dist/jobs/debt-issues.js.map +1 -0
- package/dist/jobs/debt-report.js +125 -0
- package/dist/jobs/debt-report.js.map +1 -0
- package/dist/jobs/dispatch.js +103 -0
- package/dist/jobs/dispatch.js.map +1 -0
- package/dist/jobs/flaky.js +151 -0
- package/dist/jobs/flaky.js.map +1 -0
- package/dist/jobs/label-sync.js +67 -0
- package/dist/jobs/label-sync.js.map +1 -0
- package/dist/jobs/payloads.js +62 -0
- package/dist/jobs/payloads.js.map +1 -0
- package/dist/jobs/readiness-job.js +91 -0
- package/dist/jobs/readiness-job.js.map +1 -0
- package/dist/jobs/readiness.js +154 -0
- package/dist/jobs/readiness.js.map +1 -0
- package/dist/jobs/schedule.js +19 -0
- package/dist/jobs/schedule.js.map +1 -0
- package/dist/jobs/sync-chore.js +77 -0
- package/dist/jobs/sync-chore.js.map +1 -0
- package/dist/jobs/talos-issues.js +79 -0
- package/dist/jobs/talos-issues.js.map +1 -0
- package/dist/langs/lua/busted.js +124 -0
- package/dist/langs/lua/busted.js.map +1 -0
- package/dist/langs/lua/configs.js +173 -0
- package/dist/langs/lua/configs.js.map +1 -0
- package/dist/langs/lua/deadcode.js +11 -0
- package/dist/langs/lua/deadcode.js.map +1 -0
- package/dist/langs/lua/devtools.js +64 -0
- package/dist/langs/lua/devtools.js.map +1 -0
- package/dist/langs/lua/format.js +41 -0
- package/dist/langs/lua/format.js.map +1 -0
- package/dist/langs/lua/index.js +86 -0
- package/dist/langs/lua/index.js.map +1 -0
- package/dist/langs/lua/install.js +80 -0
- package/dist/langs/lua/install.js.map +1 -0
- package/dist/langs/lua/lint.js +46 -0
- package/dist/langs/lua/lint.js.map +1 -0
- package/dist/langs/lua/luacheck-config.js +151 -0
- package/dist/langs/lua/luacheck-config.js.map +1 -0
- package/dist/langs/lua/luacheck.js +102 -0
- package/dist/langs/lua/luacheck.js.map +1 -0
- package/dist/langs/lua/luals.js +66 -0
- package/dist/langs/lua/luals.js.map +1 -0
- package/dist/langs/lua/paths.js +94 -0
- package/dist/langs/lua/paths.js.map +1 -0
- package/dist/langs/lua/run.js +63 -0
- package/dist/langs/lua/run.js.map +1 -0
- package/dist/langs/lua/scripts/json.js +39 -0
- package/dist/langs/lua/scripts/json.js.map +1 -0
- package/dist/langs/lua/scripts/lcov.js +77 -0
- package/dist/langs/lua/scripts/lcov.js.map +1 -0
- package/dist/langs/lua/scripts/luacheck.js +97 -0
- package/dist/langs/lua/scripts/luacheck.js.map +1 -0
- package/dist/langs/lua/scripts/shape.js +197 -0
- package/dist/langs/lua/scripts/shape.js.map +1 -0
- package/dist/langs/lua/shape.js +142 -0
- package/dist/langs/lua/shape.js.map +1 -0
- package/dist/langs/lua/strength.js +38 -0
- package/dist/langs/lua/strength.js.map +1 -0
- package/dist/langs/lua/stylua.js +43 -0
- package/dist/langs/lua/stylua.js.map +1 -0
- package/dist/langs/lua/toolchain.js +49 -0
- package/dist/langs/lua/toolchain.js.map +1 -0
- package/dist/langs/lua/types.js +41 -0
- package/dist/langs/lua/types.js.map +1 -0
- package/dist/langs/php/analysis.js +22 -0
- package/dist/langs/php/analysis.js.map +1 -0
- package/dist/langs/php/composer.js +88 -0
- package/dist/langs/php/composer.js.map +1 -0
- package/dist/langs/php/configs.js +54 -0
- package/dist/langs/php/configs.js.map +1 -0
- package/dist/langs/php/deptrac-config.js +118 -0
- package/dist/langs/php/deptrac-config.js.map +1 -0
- package/dist/langs/php/deptrac.js +117 -0
- package/dist/langs/php/deptrac.js.map +1 -0
- package/dist/langs/php/format.js +94 -0
- package/dist/langs/php/format.js.map +1 -0
- package/dist/langs/php/index.js +81 -0
- package/dist/langs/php/index.js.map +1 -0
- package/dist/langs/php/infection.js +151 -0
- package/dist/langs/php/infection.js.map +1 -0
- package/dist/langs/php/install.js +52 -0
- package/dist/langs/php/install.js.map +1 -0
- package/dist/langs/php/neon.js +41 -0
- package/dist/langs/php/neon.js.map +1 -0
- package/dist/langs/php/paths.js +78 -0
- package/dist/langs/php/paths.js.map +1 -0
- package/dist/langs/php/pest.js +91 -0
- package/dist/langs/php/pest.js.map +1 -0
- package/dist/langs/php/phpmd-config.js +58 -0
- package/dist/langs/php/phpmd-config.js.map +1 -0
- package/dist/langs/php/phpmd.js +80 -0
- package/dist/langs/php/phpmd.js.map +1 -0
- package/dist/langs/php/phpstan-config.js +100 -0
- package/dist/langs/php/phpstan-config.js.map +1 -0
- package/dist/langs/php/phpstan.js +128 -0
- package/dist/langs/php/phpstan.js.map +1 -0
- package/dist/langs/php/pint-config.js +22 -0
- package/dist/langs/php/pint-config.js.map +1 -0
- package/dist/langs/php/run.js +88 -0
- package/dist/langs/php/run.js.map +1 -0
- package/dist/langs/php/runtime.js +60 -0
- package/dist/langs/php/runtime.js.map +1 -0
- package/dist/langs/php/scope.js +50 -0
- package/dist/langs/php/scope.js.map +1 -0
- package/dist/langs/php/shape.js +212 -0
- package/dist/langs/php/shape.js.map +1 -0
- package/dist/langs/php/strength-rules.js +114 -0
- package/dist/langs/php/strength-rules.js.map +1 -0
- package/dist/langs/php/strength.js +98 -0
- package/dist/langs/php/strength.js.map +1 -0
- package/dist/langs/php/toolchain.js +73 -0
- package/dist/langs/php/toolchain.js.map +1 -0
- package/dist/langs/php/typecov.js +84 -0
- package/dist/langs/php/typecov.js.map +1 -0
- package/dist/langs/py/arch.js +97 -0
- package/dist/langs/py/arch.js.map +1 -0
- package/dist/langs/py/complexipy.js +42 -0
- package/dist/langs/py/complexipy.js.map +1 -0
- package/dist/langs/py/configs.js +144 -0
- package/dist/langs/py/configs.js.map +1 -0
- package/dist/langs/py/deadcode.js +77 -0
- package/dist/langs/py/deadcode.js.map +1 -0
- package/dist/langs/py/environment.js +35 -0
- package/dist/langs/py/environment.js.map +1 -0
- package/dist/langs/py/format.js +32 -0
- package/dist/langs/py/format.js.map +1 -0
- package/dist/langs/py/importlinter.js +147 -0
- package/dist/langs/py/importlinter.js.map +1 -0
- package/dist/langs/py/index.js +73 -0
- package/dist/langs/py/index.js.map +1 -0
- package/dist/langs/py/install.js +49 -0
- package/dist/langs/py/install.js.map +1 -0
- package/dist/langs/py/lint.js +98 -0
- package/dist/langs/py/lint.js.map +1 -0
- package/dist/langs/py/lock.js +66 -0
- package/dist/langs/py/lock.js.map +1 -0
- package/dist/langs/py/mutation.js +164 -0
- package/dist/langs/py/mutation.js.map +1 -0
- package/dist/langs/py/mutmut-report.js +81 -0
- package/dist/langs/py/mutmut-report.js.map +1 -0
- package/dist/langs/py/mutmut-settings.js +168 -0
- package/dist/langs/py/mutmut-settings.js.map +1 -0
- package/dist/langs/py/paths.js +57 -0
- package/dist/langs/py/paths.js.map +1 -0
- package/dist/langs/py/pyright-config.js +123 -0
- package/dist/langs/py/pyright-config.js.map +1 -0
- package/dist/langs/py/pytest.js +96 -0
- package/dist/langs/py/pytest.js.map +1 -0
- package/dist/langs/py/ruff-settings.js +166 -0
- package/dist/langs/py/ruff-settings.js.map +1 -0
- package/dist/langs/py/ruff.js +44 -0
- package/dist/langs/py/ruff.js.map +1 -0
- package/dist/langs/py/run.js +44 -0
- package/dist/langs/py/run.js.map +1 -0
- package/dist/langs/py/sizes.js +65 -0
- package/dist/langs/py/sizes.js.map +1 -0
- package/dist/langs/py/spans.js +76 -0
- package/dist/langs/py/spans.js.map +1 -0
- package/dist/langs/py/strength.js +101 -0
- package/dist/langs/py/strength.js.map +1 -0
- package/dist/langs/py/toolchain.js +34 -0
- package/dist/langs/py/toolchain.js.map +1 -0
- package/dist/langs/py/types.js +66 -0
- package/dist/langs/py/types.js.map +1 -0
- package/dist/langs/rust/cargo-config.js +91 -0
- package/dist/langs/rust/cargo-config.js.map +1 -0
- package/dist/langs/rust/cargo-test.js +50 -0
- package/dist/langs/rust/cargo-test.js.map +1 -0
- package/dist/langs/rust/compile.js +99 -0
- package/dist/langs/rust/compile.js.map +1 -0
- package/dist/langs/rust/configs.js +60 -0
- package/dist/langs/rust/configs.js.map +1 -0
- package/dist/langs/rust/deadcode.js +47 -0
- package/dist/langs/rust/deadcode.js.map +1 -0
- package/dist/langs/rust/diagnostics.js +103 -0
- package/dist/langs/rust/diagnostics.js.map +1 -0
- package/dist/langs/rust/doctests.js +49 -0
- package/dist/langs/rust/doctests.js.map +1 -0
- package/dist/langs/rust/format.js +97 -0
- package/dist/langs/rust/format.js.map +1 -0
- package/dist/langs/rust/index.js +49 -0
- package/dist/langs/rust/index.js.map +1 -0
- package/dist/langs/rust/install.js +56 -0
- package/dist/langs/rust/install.js.map +1 -0
- package/dist/langs/rust/junit.js +49 -0
- package/dist/langs/rust/junit.js.map +1 -0
- package/dist/langs/rust/lcov.js +53 -0
- package/dist/langs/rust/lcov.js.map +1 -0
- package/dist/langs/rust/lint.js +47 -0
- package/dist/langs/rust/lint.js.map +1 -0
- package/dist/langs/rust/lints.js +61 -0
- package/dist/langs/rust/lints.js.map +1 -0
- package/dist/langs/rust/machete.js +53 -0
- package/dist/langs/rust/machete.js.map +1 -0
- package/dist/langs/rust/metadata.js +78 -0
- package/dist/langs/rust/metadata.js.map +1 -0
- package/dist/langs/rust/mutants.js +73 -0
- package/dist/langs/rust/mutants.js.map +1 -0
- package/dist/langs/rust/nextest.js +164 -0
- package/dist/langs/rust/nextest.js.map +1 -0
- package/dist/langs/rust/paths.js +60 -0
- package/dist/langs/rust/paths.js.map +1 -0
- package/dist/langs/rust/run.js +37 -0
- package/dist/langs/rust/run.js.map +1 -0
- package/dist/langs/rust/scan.js +173 -0
- package/dist/langs/rust/scan.js.map +1 -0
- package/dist/langs/rust/shapes.js +80 -0
- package/dist/langs/rust/shapes.js.map +1 -0
- package/dist/langs/rust/strength-rules.js +109 -0
- package/dist/langs/rust/strength-rules.js.map +1 -0
- package/dist/langs/rust/strength.js +114 -0
- package/dist/langs/rust/strength.js.map +1 -0
- package/dist/langs/rust/structure.js +222 -0
- package/dist/langs/rust/structure.js.map +1 -0
- package/dist/langs/rust/testfiles.js +62 -0
- package/dist/langs/rust/testfiles.js.map +1 -0
- package/dist/langs/rust/toolchain.js +91 -0
- package/dist/langs/rust/toolchain.js.map +1 -0
- package/dist/langs/rust/types.js +9 -0
- package/dist/langs/rust/types.js.map +1 -0
- package/dist/langs/ts/checks/arch.js +129 -0
- package/dist/langs/ts/checks/arch.js.map +1 -0
- package/dist/langs/ts/checks/deadcode.js +125 -0
- package/dist/langs/ts/checks/deadcode.js.map +1 -0
- package/dist/langs/ts/checks/e2e.js +174 -0
- package/dist/langs/ts/checks/e2e.js.map +1 -0
- package/dist/langs/ts/checks/format.js +107 -0
- package/dist/langs/ts/checks/format.js.map +1 -0
- package/dist/langs/ts/checks/javascript.js +30 -0
- package/dist/langs/ts/checks/javascript.js.map +1 -0
- package/dist/langs/ts/checks/lint.js +133 -0
- package/dist/langs/ts/checks/lint.js.map +1 -0
- package/dist/langs/ts/checks/size.js +79 -0
- package/dist/langs/ts/checks/size.js.map +1 -0
- package/dist/langs/ts/checks/strength.js +168 -0
- package/dist/langs/ts/checks/strength.js.map +1 -0
- package/dist/langs/ts/checks/toolchain.js +54 -0
- package/dist/langs/ts/checks/toolchain.js.map +1 -0
- package/dist/langs/ts/checks/typecov.js +121 -0
- package/dist/langs/ts/checks/typecov.js.map +1 -0
- package/dist/langs/ts/checks/types.js +71 -0
- package/dist/langs/ts/checks/types.js.map +1 -0
- package/dist/langs/ts/compare.js +110 -0
- package/dist/langs/ts/compare.js.map +1 -0
- package/dist/langs/ts/configs/depcruise.js +97 -0
- package/dist/langs/ts/configs/depcruise.js.map +1 -0
- package/dist/langs/ts/configs/eslint.js +209 -0
- package/dist/langs/ts/configs/eslint.js.map +1 -0
- package/dist/langs/ts/configs/index.js +59 -0
- package/dist/langs/ts/configs/index.js.map +1 -0
- package/dist/langs/ts/configs/knip.js +43 -0
- package/dist/langs/ts/configs/knip.js.map +1 -0
- package/dist/langs/ts/configs/prettier.js +37 -0
- package/dist/langs/ts/configs/prettier.js.map +1 -0
- package/dist/langs/ts/configs/shared.js +19 -0
- package/dist/langs/ts/configs/shared.js.map +1 -0
- package/dist/langs/ts/configs/stryker.js +117 -0
- package/dist/langs/ts/configs/stryker.js.map +1 -0
- package/dist/langs/ts/configs/tsconfig.js +64 -0
- package/dist/langs/ts/configs/tsconfig.js.map +1 -0
- package/dist/langs/ts/configs/vitest.js +62 -0
- package/dist/langs/ts/configs/vitest.js.map +1 -0
- package/dist/langs/ts/devtools.js +29 -0
- package/dist/langs/ts/devtools.js.map +1 -0
- package/dist/langs/ts/files.js +73 -0
- package/dist/langs/ts/files.js.map +1 -0
- package/dist/langs/ts/generated.js +29 -0
- package/dist/langs/ts/generated.js.map +1 -0
- package/dist/langs/ts/index.js +45 -0
- package/dist/langs/ts/index.js.map +1 -0
- package/dist/langs/ts/install.js +48 -0
- package/dist/langs/ts/install.js.map +1 -0
- package/dist/langs/ts/node.js +139 -0
- package/dist/langs/ts/node.js.map +1 -0
- package/dist/langs/ts/runners/stryker.js +56 -0
- package/dist/langs/ts/runners/stryker.js.map +1 -0
- package/dist/langs/ts/runners/vitest.js +79 -0
- package/dist/langs/ts/runners/vitest.js.map +1 -0
- package/dist/langs/ts/shadows.js +90 -0
- package/dist/langs/ts/shadows.js.map +1 -0
- package/dist/langs/ts/spans.js +57 -0
- package/dist/langs/ts/spans.js.map +1 -0
- package/dist/quality/coverage.js +162 -0
- package/dist/quality/coverage.js.map +1 -0
- package/dist/quality/index.js +4 -0
- package/dist/quality/index.js.map +1 -0
- package/dist/quality/junit.js +166 -0
- package/dist/quality/junit.js.map +1 -0
- package/dist/quality/lines.js +58 -0
- package/dist/quality/lines.js.map +1 -0
- package/dist/quality/luacov.js +345 -0
- package/dist/quality/luacov.js.map +1 -0
- package/dist/quality/mutants.js +202 -0
- package/dist/quality/mutants.js.map +1 -0
- package/dist/quality/mutation.js +121 -0
- package/dist/quality/mutation.js.map +1 -0
- package/dist/quality/paths.js +36 -0
- package/dist/quality/paths.js.map +1 -0
- package/dist/quality/protocol.js +2 -0
- package/dist/quality/protocol.js.map +1 -0
- package/dist/quality/reports.js +79 -0
- package/dist/quality/reports.js.map +1 -0
- package/dist/quality/suite.js +64 -0
- package/dist/quality/suite.js.map +1 -0
- package/dist/quality/tests.js +63 -0
- package/dist/quality/tests.js.map +1 -0
- package/dist/quality/text.js +32 -0
- package/dist/quality/text.js.map +1 -0
- package/dist/quality/typecov.js +16 -0
- package/dist/quality/typecov.js.map +1 -0
- package/dist/quality/verdicts.js +96 -0
- package/dist/quality/verdicts.js.map +1 -0
- package/dist/quality/xml.js +42 -0
- package/dist/quality/xml.js.map +1 -0
- package/dist/repo/changes.js +108 -0
- package/dist/repo/changes.js.map +1 -0
- package/dist/repo/facts.js +38 -0
- package/dist/repo/facts.js.map +1 -0
- package/dist/repo/git.js +79 -0
- package/dist/repo/git.js.map +1 -0
- package/dist/repo/talos-dir.js +36 -0
- package/dist/repo/talos-dir.js.map +1 -0
- package/dist/review/approval.js +73 -0
- package/dist/review/approval.js.map +1 -0
- package/dist/review/assemble.js +80 -0
- package/dist/review/assemble.js.map +1 -0
- package/dist/review/codeowners.js +28 -0
- package/dist/review/codeowners.js.map +1 -0
- package/dist/review/conditions.js +114 -0
- package/dist/review/conditions.js.map +1 -0
- package/dist/review/github.js +206 -0
- package/dist/review/github.js.map +1 -0
- package/dist/review/guard.js +119 -0
- package/dist/review/guard.js.map +1 -0
- package/dist/review/header.js +61 -0
- package/dist/review/header.js.map +1 -0
- package/dist/review/integrity.js +148 -0
- package/dist/review/integrity.js.map +1 -0
- package/dist/review/job.js +213 -0
- package/dist/review/job.js.map +1 -0
- package/dist/review/model.js +178 -0
- package/dist/review/model.js.map +1 -0
- package/dist/review/prompt.js +125 -0
- package/dist/review/prompt.js.map +1 -0
- package/dist/review/report.js +73 -0
- package/dist/review/report.js.map +1 -0
- package/dist/review/reviewer.js +205 -0
- package/dist/review/reviewer.js.map +1 -0
- package/dist/review/rules.js +54 -0
- package/dist/review/rules.js.map +1 -0
- package/dist/review/scope.js +39 -0
- package/dist/review/scope.js.map +1 -0
- package/dist/review/testfiles.js +53 -0
- package/dist/review/testfiles.js.map +1 -0
- package/dist/review/types.js +6 -0
- package/dist/review/types.js.map +1 -0
- package/dist/sarif/sarif.js +63 -0
- package/dist/sarif/sarif.js.map +1 -0
- package/dist/status/build.js +154 -0
- package/dist/status/build.js.map +1 -0
- package/dist/status/collect.js +132 -0
- package/dist/status/collect.js.map +1 -0
- package/dist/status/doctor.js +191 -0
- package/dist/status/doctor.js.map +1 -0
- package/dist/status/findings.js +161 -0
- package/dist/status/findings.js.map +1 -0
- package/dist/status/history.js +113 -0
- package/dist/status/history.js.map +1 -0
- package/dist/status/markers.js +65 -0
- package/dist/status/markers.js.map +1 -0
- package/dist/status/query.js +148 -0
- package/dist/status/query.js.map +1 -0
- package/dist/status/resolve.js +92 -0
- package/dist/status/resolve.js.map +1 -0
- package/dist/status/schema.js +110 -0
- package/dist/status/schema.js.map +1 -0
- package/dist/status/text.js +57 -0
- package/dist/status/text.js.map +1 -0
- package/dist/ticket/claim.js +147 -0
- package/dist/ticket/claim.js.map +1 -0
- package/dist/ticket/github.js +94 -0
- package/dist/ticket/github.js.map +1 -0
- package/dist/ticket/labels.js +64 -0
- package/dist/ticket/labels.js.map +1 -0
- package/dist/ticket/payload.js +37 -0
- package/dist/ticket/payload.js.map +1 -0
- package/dist/ticket/queue.js +51 -0
- package/dist/ticket/queue.js.map +1 -0
- package/dist/ticket/schemas.js +106 -0
- package/dist/ticket/schemas.js.map +1 -0
- package/dist/ticket/sections.js +66 -0
- package/dist/ticket/sections.js.map +1 -0
- package/dist/ticket/stale.js +108 -0
- package/dist/ticket/stale.js.map +1 -0
- package/dist/ticket/status.js +96 -0
- package/dist/ticket/status.js.map +1 -0
- package/dist/ticket/trust.js +29 -0
- package/dist/ticket/trust.js.map +1 -0
- package/dist/tools/fetch.js +117 -0
- package/dist/tools/fetch.js.map +1 -0
- package/dist/tools/lock.js +100 -0
- package/dist/tools/lock.js.map +1 -0
- package/dist/tools/lockfile.js +81 -0
- package/dist/tools/lockfile.js.map +1 -0
- package/dist/tools/pypi.js +44 -0
- package/dist/tools/pypi.js.map +1 -0
- package/dist/tools/store.js +62 -0
- package/dist/tools/store.js.map +1 -0
- package/dist/tools/tools.js +2 -0
- package/dist/tools/tools.js.map +1 -0
- package/dist/version/cache.js +18 -0
- package/dist/version/cache.js.map +1 -0
- package/dist/version/enforced.js +54 -0
- package/dist/version/enforced.js.map +1 -0
- package/dist/version/errors.js +8 -0
- package/dist/version/errors.js.map +1 -0
- package/dist/version/install.js +149 -0
- package/dist/version/install.js.map +1 -0
- package/dist/version/launch.js +104 -0
- package/dist/version/launch.js.map +1 -0
- package/dist/version/pin.js +121 -0
- package/dist/version/pin.js.map +1 -0
- package/dist/version/provenance.js +118 -0
- package/dist/version/provenance.js.map +1 -0
- package/dist/version/release.js +44 -0
- package/dist/version/release.js.map +1 -0
- package/dist/version/self.js +55 -0
- package/dist/version/self.js.map +1 -0
- package/dist/version/shrinkwrap.js +207 -0
- package/dist/version/shrinkwrap.js.map +1 -0
- package/npm-shrinkwrap.json +2140 -0
- package/package.json +81 -8
- package/tools/semgrep.in +1 -0
- package/tools/semgrep.txt +1150 -0
- package/tools.lock +429 -0
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { isGoverned, openTalosIssues, soleRepository } from './repos.js';
|
|
3
|
+
import { groupAlerts, isRuntimeFile, SECURITY_LABEL, securityIssue, sweepPaths, unfiled, } from './sweep.js';
|
|
4
|
+
import { readFileAt } from '../github/contents.js';
|
|
5
|
+
import { fileIssue } from '../jobs/talos-issues.js';
|
|
6
|
+
const treeSchema = z.object({
|
|
7
|
+
truncated: z.boolean().default(false),
|
|
8
|
+
tree: z.array(z.object({ path: z.string(), type: z.string() })),
|
|
9
|
+
});
|
|
10
|
+
/** The default branch's files that can declare a runtime, through the trees API. */
|
|
11
|
+
async function runtimePaths(gh, repo, branch) {
|
|
12
|
+
const raw = await gh.request('GET', `repos/${repo}/git/trees/${encodeURIComponent(branch)}?recursive=1`);
|
|
13
|
+
const tree = treeSchema.parse(raw);
|
|
14
|
+
const paths = tree.tree
|
|
15
|
+
.filter((entry) => entry.type === 'blob' && isRuntimeFile(entry.path))
|
|
16
|
+
.map((entry) => entry.path);
|
|
17
|
+
return { ...sweepPaths(paths), truncated: tree.truncated };
|
|
18
|
+
}
|
|
19
|
+
const NONE = {
|
|
20
|
+
governed: 0,
|
|
21
|
+
files: 0,
|
|
22
|
+
alerts: 0,
|
|
23
|
+
filed: 0,
|
|
24
|
+
open: 0,
|
|
25
|
+
errors: 0,
|
|
26
|
+
skipped: 0,
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* One repository's sweep: read its runtime declarations, ask the runtime pack, and file one p0
|
|
30
|
+
* `security` issue per vulnerable runtime that no open Talos issue already covers.
|
|
31
|
+
*/
|
|
32
|
+
export async function runSweep(deps) {
|
|
33
|
+
const repository = await soleRepository(deps.gh);
|
|
34
|
+
if (!isGoverned(repository))
|
|
35
|
+
return NONE;
|
|
36
|
+
const repo = repository.fullName;
|
|
37
|
+
const branch = repository.defaultBranch;
|
|
38
|
+
const { read: paths, skipped, truncated } = await runtimePaths(deps.gh, repo, branch);
|
|
39
|
+
const texts = await Promise.all(paths.map((path) => readFileAt(deps.gh, repo, path, branch)));
|
|
40
|
+
const files = new Map();
|
|
41
|
+
for (const [index, path] of paths.entries()) {
|
|
42
|
+
const text = texts[index];
|
|
43
|
+
if (text !== undefined)
|
|
44
|
+
files.set(path, text);
|
|
45
|
+
}
|
|
46
|
+
const assessment = await deps.assess(files);
|
|
47
|
+
const groups = groupAlerts(assessment.alerts);
|
|
48
|
+
const open = await openTalosIssues(deps.gh, { repo, who: deps.who }, SECURITY_LABEL);
|
|
49
|
+
const fresh = unfiled(groups, open);
|
|
50
|
+
for (const group of fresh)
|
|
51
|
+
await fileIssue(deps.gh, repo, securityIssue(group));
|
|
52
|
+
return {
|
|
53
|
+
governed: 1,
|
|
54
|
+
files: files.size,
|
|
55
|
+
alerts: groups.length,
|
|
56
|
+
filed: fresh.length,
|
|
57
|
+
open: open.length,
|
|
58
|
+
errors: assessment.errors + (truncated ? 1 : 0),
|
|
59
|
+
skipped,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=sweep-job.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sweep-job.js","sourceRoot":"","sources":["../../src/central/sweep-job.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
import { isDeclaringFile } from '../checks/runtime/declarations.js';
|
|
2
|
+
import { markerFields } from '../status/markers.js';
|
|
3
|
+
import { LABEL } from '../ticket/labels.js';
|
|
4
|
+
/**
|
|
5
|
+
* The hourly runtime sweep's decisions: which files to read, which findings are security
|
|
6
|
+
* releases, and the one issue per vulnerable runtime that reaches Thea as an event. Pure; the
|
|
7
|
+
* effects live in `sweep-job.ts`.
|
|
8
|
+
*/
|
|
9
|
+
const SECURITY_RULE = 'runtime/security';
|
|
10
|
+
const SECURITY_MARKER = 'talos-security/1';
|
|
11
|
+
export const SECURITY_LABEL = 'security';
|
|
12
|
+
const P0_LABEL = 'priority/p0';
|
|
13
|
+
const TOOLS_LOCK = 'tools.lock';
|
|
14
|
+
const CONFIG = 'talos.yml';
|
|
15
|
+
/** At most this many files are read from one repository per sweep. */
|
|
16
|
+
const MAX_FILES = 60;
|
|
17
|
+
/**
|
|
18
|
+
* Whether the sweep reads a path: every file the gate's runtime check reads, and the root
|
|
19
|
+
* `talos.yml`, whose `exclude` and exceptions that check honours.
|
|
20
|
+
*/
|
|
21
|
+
export function isRuntimeFile(path) {
|
|
22
|
+
return path === CONFIG || isDeclaringFile(path);
|
|
23
|
+
}
|
|
24
|
+
/** The rank a path is read in: the configuration, then what pins a runtime, then the floors. */
|
|
25
|
+
function rank(path) {
|
|
26
|
+
if (path === CONFIG)
|
|
27
|
+
return 0;
|
|
28
|
+
return path.split('/').at(-1) === 'composer.json' ? 2 : 1;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The paths a sweep reads, at most {@link MAX_FILES}: `talos.yml` first, then the files that pin
|
|
32
|
+
* a runtime (Dockerfiles, version files, `tools.lock`), and `composer.json`, whose platform PHP
|
|
33
|
+
* is only a floor, last; `skipped` counts the ones left over.
|
|
34
|
+
*/
|
|
35
|
+
export function sweepPaths(paths) {
|
|
36
|
+
const ordered = paths
|
|
37
|
+
.map((path, index) => ({ path, index }))
|
|
38
|
+
.sort((a, b) => rank(a.path) - rank(b.path) || a.index - b.index)
|
|
39
|
+
.map((entry) => entry.path);
|
|
40
|
+
return { read: ordered.slice(0, MAX_FILES), skipped: Math.max(0, ordered.length - MAX_FILES) };
|
|
41
|
+
}
|
|
42
|
+
const WORD = /^[A-Za-z0-9][A-Za-z0-9._+-]{0,39}$/;
|
|
43
|
+
const VERSION = /^\d+(?:\.\d+)+$/;
|
|
44
|
+
const VERSIONS_IN_TEXT = /\b\d+(?:\.\d+)+\b/g;
|
|
45
|
+
function parts(version) {
|
|
46
|
+
return version.split('.').map(Number);
|
|
47
|
+
}
|
|
48
|
+
/** Numeric order of dotted versions; a shorter one sorts first on a tie. */
|
|
49
|
+
export function compareVersions(a, b) {
|
|
50
|
+
const [x, y] = [parts(a), parts(b)];
|
|
51
|
+
for (let i = 0; i < Math.max(x.length, y.length); i += 1) {
|
|
52
|
+
const diff = (x[i] ?? -1) - (y[i] ?? -1);
|
|
53
|
+
if (diff !== 0)
|
|
54
|
+
return diff;
|
|
55
|
+
}
|
|
56
|
+
return 0;
|
|
57
|
+
}
|
|
58
|
+
/** The newest version a message names beside `version`, with as many parts. */
|
|
59
|
+
function fixedIn(message, version) {
|
|
60
|
+
const width = parts(version).length;
|
|
61
|
+
return [...message.matchAll(VERSIONS_IN_TEXT)]
|
|
62
|
+
.map((match) => match[0])
|
|
63
|
+
.filter((v) => v !== version && parts(v).length === width)
|
|
64
|
+
.sort(compareVersions)
|
|
65
|
+
.at(-1);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* A `runtime/security` finding as an alert. Its key is `<runtime> <version>`, optionally followed
|
|
69
|
+
* by the fixed version; otherwise the fixed version is the newest one its message names.
|
|
70
|
+
*/
|
|
71
|
+
export function alertOf(finding) {
|
|
72
|
+
if (finding.rule !== SECURITY_RULE)
|
|
73
|
+
return undefined;
|
|
74
|
+
const [runtime = '', version = '', ...rest] = (finding.key ?? '').trim().split(/\s+/);
|
|
75
|
+
if (!WORD.test(runtime) || !VERSION.test(version))
|
|
76
|
+
return undefined;
|
|
77
|
+
const named = rest.find((word) => VERSION.test(word));
|
|
78
|
+
const fixed = named ?? fixedIn(finding.message, version) ?? 'unknown';
|
|
79
|
+
return { runtime: runtime.toLowerCase(), version, fixed, file: finding.location?.file ?? null };
|
|
80
|
+
}
|
|
81
|
+
/** Code-point order, the same on every machine whatever its locale. */
|
|
82
|
+
function byCodePoint(a, b) {
|
|
83
|
+
if (a === b)
|
|
84
|
+
return 0;
|
|
85
|
+
return a < b ? -1 : 1;
|
|
86
|
+
}
|
|
87
|
+
function newer(a, b) {
|
|
88
|
+
if (a === 'unknown')
|
|
89
|
+
return b;
|
|
90
|
+
if (b === 'unknown')
|
|
91
|
+
return a;
|
|
92
|
+
return compareVersions(a, b) >= 0 ? a : b;
|
|
93
|
+
}
|
|
94
|
+
/** One group per runtime and declared version, naming every file that declares it. */
|
|
95
|
+
export function groupAlerts(alerts) {
|
|
96
|
+
const groups = new Map();
|
|
97
|
+
for (const alert of alerts) {
|
|
98
|
+
const key = `${alert.runtime} ${alert.version}`;
|
|
99
|
+
const group = groups.get(key) ?? { fixed: alert.fixed, files: new Set(), alert };
|
|
100
|
+
group.fixed = newer(group.fixed, alert.fixed);
|
|
101
|
+
if (alert.file !== null)
|
|
102
|
+
group.files.add(alert.file);
|
|
103
|
+
groups.set(key, group);
|
|
104
|
+
}
|
|
105
|
+
return [...groups.values()]
|
|
106
|
+
.map(({ fixed, files, alert }) => ({
|
|
107
|
+
runtime: alert.runtime,
|
|
108
|
+
version: alert.version,
|
|
109
|
+
fixed,
|
|
110
|
+
files: [...files].sort(byCodePoint),
|
|
111
|
+
}))
|
|
112
|
+
.sort((a, b) => byCodePoint(`${a.runtime} ${a.version}`, `${b.runtime} ${b.version}`));
|
|
113
|
+
}
|
|
114
|
+
/** The issue's first line, which Thea's hub turns into an event: a p0 jumps her budget. */
|
|
115
|
+
export function securityLine(group) {
|
|
116
|
+
const { runtime, version, fixed } = group;
|
|
117
|
+
return `${SECURITY_MARKER} kind=runtime runtime=${runtime} version=${version} fixed=${fixed} priority=p0`;
|
|
118
|
+
}
|
|
119
|
+
/** The fields of a body's `talos-security/1` first line, or `undefined` without one. */
|
|
120
|
+
export function readSecurityLine(body) {
|
|
121
|
+
return markerFields(body, SECURITY_MARKER);
|
|
122
|
+
}
|
|
123
|
+
/** The groups no open security issue of Talos's covers yet: same runtime, same version. */
|
|
124
|
+
export function unfiled(groups, open) {
|
|
125
|
+
const filed = new Set(open.flatMap((issue) => {
|
|
126
|
+
const fields = readSecurityLine(issue.body);
|
|
127
|
+
return fields?.kind === 'runtime' ? [`${fields.runtime ?? ''} ${fields.version ?? ''}`] : [];
|
|
128
|
+
}));
|
|
129
|
+
return groups.filter((group) => !filed.has(`${group.runtime} ${group.version}`));
|
|
130
|
+
}
|
|
131
|
+
function pathItem(path) {
|
|
132
|
+
return /^[^\s`]+$/.test(path) ? `- \`${path}\`` : '- (a file whose name needs quoting)';
|
|
133
|
+
}
|
|
134
|
+
/** The security issue for one runtime: ready to claim, its first line machine-readable. */
|
|
135
|
+
export function securityIssue(group) {
|
|
136
|
+
const { runtime, version, fixed } = group;
|
|
137
|
+
const target = fixed === 'unknown' ? 'its cycle’s latest security release' : fixed;
|
|
138
|
+
const locked = group.files.includes(TOOLS_LOCK);
|
|
139
|
+
const body = [
|
|
140
|
+
securityLine(group),
|
|
141
|
+
'',
|
|
142
|
+
'### Goal',
|
|
143
|
+
'',
|
|
144
|
+
`Move ${runtime} ${version} to ${target}, wherever this repository declares it: a newer ` +
|
|
145
|
+
'patch of its cycle is a security release.',
|
|
146
|
+
'',
|
|
147
|
+
'### Acceptance criteria',
|
|
148
|
+
'',
|
|
149
|
+
`- [ ] Every file below declares ${runtime} ${target} or later in the same cycle`,
|
|
150
|
+
'- [ ] `talos check` reports no `runtime/security` finding',
|
|
151
|
+
'',
|
|
152
|
+
'### Out of scope',
|
|
153
|
+
'',
|
|
154
|
+
'Other runtimes, dependency updates and every other finding.',
|
|
155
|
+
'',
|
|
156
|
+
'### Affected areas',
|
|
157
|
+
'',
|
|
158
|
+
...(group.files.length > 0 ? group.files.map(pathItem) : ['- the runtime declarations']),
|
|
159
|
+
'',
|
|
160
|
+
'### Repro',
|
|
161
|
+
'',
|
|
162
|
+
"Talos's hourly runtime sweep compared these declarations with the vendor's release feed.",
|
|
163
|
+
'',
|
|
164
|
+
'### Expected / Actual',
|
|
165
|
+
'',
|
|
166
|
+
`Expected: ${runtime} ${target}. Actual: ${runtime} ${version}.`,
|
|
167
|
+
...(locked
|
|
168
|
+
? [
|
|
169
|
+
'',
|
|
170
|
+
'`tools.lock` pins this runtime for every repository Talos governs: the fix ships in a ' +
|
|
171
|
+
'Talos release, which the owner promotes through the urgent path.',
|
|
172
|
+
]
|
|
173
|
+
: []),
|
|
174
|
+
'',
|
|
175
|
+
].join('\n');
|
|
176
|
+
return {
|
|
177
|
+
title: `Security release: ${runtime} ${version} needs ${fixed === 'unknown' ? 'a patch' : fixed}`,
|
|
178
|
+
body,
|
|
179
|
+
labels: [LABEL.bug, SECURITY_LABEL, P0_LABEL, LABEL.ready, LABEL.eligible],
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=sweep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/central/sweep.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import picomatch from 'picomatch';
|
|
2
|
+
/**
|
|
3
|
+
* The programming languages jscpd compares, as jscpd names them and by the extensions it reads
|
|
4
|
+
* for each: the languages Talos governs, scripts, and any other language a repository carries.
|
|
5
|
+
* Markup, styles, docs and data are left out: repeating them is layout, not logic.
|
|
6
|
+
*/
|
|
7
|
+
const LANGUAGES = [
|
|
8
|
+
['typescript', ['ts', 'mts', 'cts']],
|
|
9
|
+
['tsx', ['tsx']],
|
|
10
|
+
['javascript', ['js', 'mjs', 'cjs']],
|
|
11
|
+
['jsx', ['jsx']],
|
|
12
|
+
['vue', ['vue']],
|
|
13
|
+
['svelte', ['svelte']],
|
|
14
|
+
['astro', ['astro']],
|
|
15
|
+
['python', ['py', 'pyi']],
|
|
16
|
+
['php', ['php']],
|
|
17
|
+
['lua', ['lua']],
|
|
18
|
+
['rust', ['rs']],
|
|
19
|
+
['bash', ['sh', 'bash']],
|
|
20
|
+
['powershell', ['ps1', 'psm1']],
|
|
21
|
+
['go', ['go']],
|
|
22
|
+
['java', ['java']],
|
|
23
|
+
['kotlin', ['kt', 'kts']],
|
|
24
|
+
['scala', ['scala']],
|
|
25
|
+
['csharp', ['cs']],
|
|
26
|
+
['c', ['c']],
|
|
27
|
+
['c-header', ['h']],
|
|
28
|
+
['cpp', ['cc', 'cpp', 'cxx']],
|
|
29
|
+
['cpp-header', ['hpp', 'hh']],
|
|
30
|
+
['ruby', ['rb']],
|
|
31
|
+
['swift', ['swift']],
|
|
32
|
+
['dart', ['dart']],
|
|
33
|
+
];
|
|
34
|
+
/** jscpd's names for the languages it compares. */
|
|
35
|
+
export const JSCPD_FORMATS = LANGUAGES.map(([format]) => format);
|
|
36
|
+
/** Every file of a language jscpd compares. */
|
|
37
|
+
const CODE_GLOBS = [
|
|
38
|
+
`**/*.{${LANGUAGES.flatMap(([, extensions]) => extensions).join(',')}}`,
|
|
39
|
+
];
|
|
40
|
+
/** Tests and what only tests use, by each language's conventions; repeating them is allowed. */
|
|
41
|
+
const TEST_GLOBS = [
|
|
42
|
+
'**/{test,tests,spec,specs,e2e,testing,__tests__,__mocks__,fixtures}/**',
|
|
43
|
+
'**/*.{test,spec}.*',
|
|
44
|
+
'**/test_*.py',
|
|
45
|
+
'**/*_test.{py,go,lua}',
|
|
46
|
+
'**/conftest.py',
|
|
47
|
+
'**/*Test.php',
|
|
48
|
+
'**/*_spec.lua',
|
|
49
|
+
];
|
|
50
|
+
/** Blade views: markup in PHP files, whose repetition is layout. */
|
|
51
|
+
const TEMPLATE_GLOBS = ['**/*.blade.php'];
|
|
52
|
+
/** What the duplication check never compares, beside `talos.yml`'s `exclude`. */
|
|
53
|
+
export const NOT_COMPARED = [...TEST_GLOBS, ...TEMPLATE_GLOBS];
|
|
54
|
+
/** The tracked code the duplication check compares: every language's, minus tests. */
|
|
55
|
+
export function comparedFiles(facts) {
|
|
56
|
+
const skipped = picomatch([...NOT_COMPARED], { dot: true });
|
|
57
|
+
return facts.matching(...CODE_GLOBS).filter((file) => !skipped(file));
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=code-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"code-files.js","sourceRoot":"","sources":["../../../src/checks/common/code-files.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { access } from 'node:fs/promises';
|
|
2
|
+
import { isAbsolute, posix, relative, win32 } from 'node:path';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
import { APPLIES, EngineError, skip, } from '../../core/check.js';
|
|
5
|
+
/** One line of a custom check's output (`talos.yml`'s `checks.<id>`): one finding. */
|
|
6
|
+
const reported = z.object({
|
|
7
|
+
rule: z.string().regex(/^\w[\w.:/-]*$/, 'must be a rule id: letters, digits, _ . : / -'),
|
|
8
|
+
file: z.string().min(1),
|
|
9
|
+
line: z.number().int().positive(),
|
|
10
|
+
message: z.string().trim().min(1),
|
|
11
|
+
});
|
|
12
|
+
const MAX_QUOTED = 200;
|
|
13
|
+
function quoted(text) {
|
|
14
|
+
return text.length <= MAX_QUOTED ? text : `${text.slice(0, MAX_QUOTED - 1)}…`;
|
|
15
|
+
}
|
|
16
|
+
/** A reported path made repository-relative, or undefined when it lies outside the repository. */
|
|
17
|
+
export function insideRepo(root, file) {
|
|
18
|
+
const local = isAbsolute(file) ? relative(root, file) : file;
|
|
19
|
+
const normal = posix.normalize(local.replaceAll('\\', '/')).replace(/^\.\//, '');
|
|
20
|
+
const outside = normal === '..' ||
|
|
21
|
+
normal.startsWith('../') ||
|
|
22
|
+
posix.isAbsolute(normal) ||
|
|
23
|
+
win32.isAbsolute(normal);
|
|
24
|
+
return outside || normal === '.' ? undefined : normal;
|
|
25
|
+
}
|
|
26
|
+
function parseLine(id, root, text, number) {
|
|
27
|
+
let raw;
|
|
28
|
+
try {
|
|
29
|
+
raw = JSON.parse(text);
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
throw new EngineError(`custom check ${id}: output line ${number} is not JSON: ${quoted(text)}`);
|
|
33
|
+
}
|
|
34
|
+
const parsed = reported.safeParse(raw);
|
|
35
|
+
if (!parsed.success) {
|
|
36
|
+
const problem = z.prettifyError(parsed.error);
|
|
37
|
+
const expected = '{rule, file, line, message}';
|
|
38
|
+
throw new EngineError(`custom check ${id}: output line ${number} is not ${expected}: ${problem}`);
|
|
39
|
+
}
|
|
40
|
+
const file = insideRepo(root, parsed.data.file);
|
|
41
|
+
if (file === undefined) {
|
|
42
|
+
throw new EngineError(`custom check ${id}: ${quoted(parsed.data.file)} is not a file in the repository`);
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
rule: `custom/${id}/${parsed.data.rule}`,
|
|
46
|
+
message: parsed.data.message,
|
|
47
|
+
location: { file, line: parsed.data.line },
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A custom check's findings: one JSON object `{rule, file, line, message}` per non-blank line
|
|
52
|
+
* of its output. Anything else is an engine error naming the check, so a broken script never
|
|
53
|
+
* passes for a clean one.
|
|
54
|
+
*/
|
|
55
|
+
export function customFindings(id, root, stdout) {
|
|
56
|
+
return stdout
|
|
57
|
+
.split('\n')
|
|
58
|
+
.map((text, index) => ({ text: text.trim(), number: index + 1 }))
|
|
59
|
+
.filter(({ text }) => text !== '')
|
|
60
|
+
.map(({ text, number }) => parseLine(id, root, text, number));
|
|
61
|
+
}
|
|
62
|
+
async function exists(path) {
|
|
63
|
+
return access(path).then(() => true, () => false);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* The bash that runs a custom check: Git Bash on Windows, found where Git for Windows installs
|
|
67
|
+
* it, since the `bash.exe` Windows itself ships starts WSL instead.
|
|
68
|
+
*/
|
|
69
|
+
export async function bashFor(os, env, present = exists) {
|
|
70
|
+
if (os !== 'windows')
|
|
71
|
+
return 'bash';
|
|
72
|
+
const programs = env.ProgramFiles ?? String.raw `C:\Program Files`;
|
|
73
|
+
const gitBash = win32.join(programs, 'Git', 'bin', 'bash.exe');
|
|
74
|
+
return (await present(gitBash)) ? gitBash : 'bash.exe';
|
|
75
|
+
}
|
|
76
|
+
function tail(result) {
|
|
77
|
+
return `${result.stderr}\n${result.stdout}`.trim().split('\n').slice(-15).join('\n');
|
|
78
|
+
}
|
|
79
|
+
async function runOne(ctx, id, command) {
|
|
80
|
+
const bash = await bashFor(ctx.os, process.env);
|
|
81
|
+
let result;
|
|
82
|
+
try {
|
|
83
|
+
result = await ctx.exec(bash, ['-c', command], { cwd: ctx.root });
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
const reason = error instanceof Error ? error.message : String(error);
|
|
87
|
+
throw new EngineError(`custom check ${id} could not run: ${reason}`);
|
|
88
|
+
}
|
|
89
|
+
const findings = customFindings(id, ctx.root, result.stdout);
|
|
90
|
+
if (result.code !== 0 && findings.length === 0) {
|
|
91
|
+
throw new EngineError(`custom check ${id} exited ${result.code} with no findings:\n${tail(result)}`);
|
|
92
|
+
}
|
|
93
|
+
return findings;
|
|
94
|
+
}
|
|
95
|
+
function declaredFor(ctx, tier) {
|
|
96
|
+
return Object.entries(ctx.config.checks)
|
|
97
|
+
.filter(([, check]) => check.scope === tier)
|
|
98
|
+
.map(([id, check]) => [id, check.run]);
|
|
99
|
+
}
|
|
100
|
+
async function runDeclared(ctx, tier) {
|
|
101
|
+
const findings = [];
|
|
102
|
+
for (const [id, command] of declaredFor(ctx, tier)) {
|
|
103
|
+
findings.push(...(await runOne(ctx, id, command)));
|
|
104
|
+
}
|
|
105
|
+
return findings;
|
|
106
|
+
}
|
|
107
|
+
function customCheck(tier) {
|
|
108
|
+
return {
|
|
109
|
+
id: `common/custom-${tier}`,
|
|
110
|
+
tier,
|
|
111
|
+
scope: 'repo',
|
|
112
|
+
title: `the project's own ${tier}-tier checks from talos.yml`,
|
|
113
|
+
applies: (ctx) => declaredFor(ctx, tier).length > 0
|
|
114
|
+
? APPLIES
|
|
115
|
+
: skip(`talos.yml declares no custom check with scope ${tier}`),
|
|
116
|
+
run: (ctx) => runDeclared(ctx, tier),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/** `talos.yml`'s `checks` with `scope: commit`, run on every commit, from the repository root. */
|
|
120
|
+
export const customCommitCheck = customCheck('commit');
|
|
121
|
+
/** `talos.yml`'s `checks` with `scope: head`, run at a PR's head and its base, from the root. */
|
|
122
|
+
export const customHeadCheck = customCheck('head');
|
|
123
|
+
//# sourceMappingURL=custom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom.js","sourceRoot":"","sources":["../../../src/checks/common/custom.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { readFile, realpath, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { dirname, join } from 'node:path';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { comparedFiles } from './code-files.js';
|
|
6
|
+
import { gateSettings } from './jscpd-config.js';
|
|
7
|
+
import { cloneFindings } from './jscpd-report.js';
|
|
8
|
+
import { ownTexts } from './texts.js';
|
|
9
|
+
import { APPLIES, EngineError, skip } from '../../core/check.js';
|
|
10
|
+
const resolveFromTalos = createRequire(import.meta.url);
|
|
11
|
+
const manifest = z.object({
|
|
12
|
+
bin: z.union([z.string(), z.object({ jscpd: z.string() })]),
|
|
13
|
+
});
|
|
14
|
+
/** jscpd ships with Talos as a dependency: its launcher script, run with Talos's own Node. */
|
|
15
|
+
async function jscpdScript() {
|
|
16
|
+
let path;
|
|
17
|
+
try {
|
|
18
|
+
path = resolveFromTalos.resolve('jscpd/package.json');
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
throw new EngineError("jscpd is missing from Talos's installation");
|
|
22
|
+
}
|
|
23
|
+
const text = await readFile(path, 'utf8');
|
|
24
|
+
let raw;
|
|
25
|
+
try {
|
|
26
|
+
raw = JSON.parse(text);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
raw = undefined;
|
|
30
|
+
}
|
|
31
|
+
const parsed = manifest.safeParse(raw);
|
|
32
|
+
if (!parsed.success)
|
|
33
|
+
throw new EngineError("jscpd's package.json names no program");
|
|
34
|
+
const bin = typeof parsed.data.bin === 'string' ? parsed.data.bin : parsed.data.bin.jscpd;
|
|
35
|
+
return join(dirname(path), bin);
|
|
36
|
+
}
|
|
37
|
+
function tail(result) {
|
|
38
|
+
return `${result.stderr}\n${result.stdout}`.trim().split('\n').slice(-15).join('\n');
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Runs jscpd over the files, absolute, listed in its config rather than on its command line,
|
|
42
|
+
* which a large repository would overflow. jscpd reads an empty list as the working directory,
|
|
43
|
+
* so the caller never passes one.
|
|
44
|
+
*/
|
|
45
|
+
async function runJscpd(ctx, root, files) {
|
|
46
|
+
const config = join(ctx.scratch, 'jscpd.json');
|
|
47
|
+
await writeFile(config, gateSettings(files.map((file) => join(root, file))));
|
|
48
|
+
const args = [
|
|
49
|
+
await jscpdScript(),
|
|
50
|
+
'--config',
|
|
51
|
+
config,
|
|
52
|
+
'--reporters',
|
|
53
|
+
'json',
|
|
54
|
+
'--output',
|
|
55
|
+
ctx.scratch,
|
|
56
|
+
'--absolute',
|
|
57
|
+
'--silent',
|
|
58
|
+
'--no-gitignore',
|
|
59
|
+
'--no-colors',
|
|
60
|
+
'--no-tips',
|
|
61
|
+
];
|
|
62
|
+
try {
|
|
63
|
+
return await ctx.exec(process.execPath, args, {
|
|
64
|
+
cwd: root,
|
|
65
|
+
env: { NO_COLOR: '1', JSCPD_NO_TIPS: '1' },
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
throw new EngineError(`jscpd could not run: ${error instanceof Error ? error.message : ''}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** jscpd over every language's code at once, tests and `exclude` left out. */
|
|
73
|
+
async function duplication(ctx) {
|
|
74
|
+
const files = (await ownTexts(ctx.root, comparedFiles(ctx.facts))).map((text) => text.file);
|
|
75
|
+
if (files.length < 1)
|
|
76
|
+
return [];
|
|
77
|
+
// jscpd reports paths with links resolved, so the checkout's own path is resolved too.
|
|
78
|
+
const root = await realpath(ctx.root);
|
|
79
|
+
const result = await runJscpd(ctx, root, files);
|
|
80
|
+
if (result.code !== 0) {
|
|
81
|
+
throw new EngineError(`jscpd exited ${result.code}:\n${tail(result)}`);
|
|
82
|
+
}
|
|
83
|
+
const report = await readFile(join(ctx.scratch, 'jscpd-report.json'), 'utf8').catch(() => undefined);
|
|
84
|
+
if (report === undefined)
|
|
85
|
+
throw new EngineError(`jscpd wrote no report:\n${tail(result)}`);
|
|
86
|
+
return cloneFindings(report, root);
|
|
87
|
+
}
|
|
88
|
+
export const duplicationCheck = {
|
|
89
|
+
id: 'common/duplication',
|
|
90
|
+
tier: 'head',
|
|
91
|
+
scope: 'repo',
|
|
92
|
+
title: 'jscpd: no repeated code of 50 tokens or 5 lines',
|
|
93
|
+
applies: (ctx) => comparedFiles(ctx.facts).length > 0 ? APPLIES : skip('the repository has no code to compare'),
|
|
94
|
+
run: duplication,
|
|
95
|
+
};
|
|
96
|
+
//# sourceMappingURL=duplication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duplication.js","sourceRoot":"","sources":["../../../src/checks/common/duplication.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { customCommitCheck, customHeadCheck } from './custom.js';
|
|
2
|
+
import { duplicationCheck } from './duplication.js';
|
|
3
|
+
import { jscpdBase } from './jscpd-config.js';
|
|
4
|
+
import { suppressionsCheck } from './suppressions.js';
|
|
5
|
+
/**
|
|
6
|
+
* The checks every repository gets whatever its languages: no suppressions per commit, the
|
|
7
|
+
* project's own checks from `talos.yml`, and no repeated code across every language at the head.
|
|
8
|
+
*/
|
|
9
|
+
export const commonPack = {
|
|
10
|
+
name: 'common',
|
|
11
|
+
checks: [suppressionsCheck, customCommitCheck, duplicationCheck, customHeadCheck],
|
|
12
|
+
generated: [jscpdBase],
|
|
13
|
+
};
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/checks/common/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAGtD;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAS;IAC9B,IAAI,EAAE,QAAQ;IACd,MAAM,EAAE,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,eAAe,CAAC;IACjF,SAAS,EAAE,CAAC,SAAS,CAAC;CACvB,CAAC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { comparedFiles, JSCPD_FORMATS, NOT_COMPARED } from './code-files.js';
|
|
2
|
+
import { generatedJsonNote } from '../../configs/header.js';
|
|
3
|
+
import { renderFlatJson } from '../../configs/json.js';
|
|
4
|
+
const JSCPD_CONFIG = '.jscpd.json';
|
|
5
|
+
/** The smallest repetition that counts: 50 tokens spanning at least 5 lines. */
|
|
6
|
+
const MIN_TOKENS = 50;
|
|
7
|
+
const MIN_LINES = 5;
|
|
8
|
+
function trimSlashes(entry) {
|
|
9
|
+
let end = entry.length;
|
|
10
|
+
while (end > 0 && entry[end - 1] === '/')
|
|
11
|
+
end -= 1;
|
|
12
|
+
return entry.slice(0, end);
|
|
13
|
+
}
|
|
14
|
+
/** `talos.yml`'s `exclude` entries as globs: each names a file, a directory or a glob. */
|
|
15
|
+
export function excludeGlobs(exclude) {
|
|
16
|
+
return exclude.flatMap((entry) => {
|
|
17
|
+
const trimmed = trimSlashes(entry);
|
|
18
|
+
return [trimmed, `${trimmed}/**`];
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The base for editors and a local `jscpd` run, with the gate's thresholds and what it leaves
|
|
23
|
+
* out. jscpd reads one config file and extends none, and the only thing a project could want to
|
|
24
|
+
* change is what is compared, which `talos.yml`'s `exclude` already says; so there is no
|
|
25
|
+
* extension file.
|
|
26
|
+
*/
|
|
27
|
+
export function renderJscpdBase(version, exclude) {
|
|
28
|
+
return renderFlatJson({
|
|
29
|
+
'//': generatedJsonNote(version),
|
|
30
|
+
minTokens: MIN_TOKENS,
|
|
31
|
+
minLines: MIN_LINES,
|
|
32
|
+
threshold: 0,
|
|
33
|
+
gitignore: true,
|
|
34
|
+
absolute: false,
|
|
35
|
+
reporters: ['console'],
|
|
36
|
+
format: JSCPD_FORMATS,
|
|
37
|
+
ignore: ['**/node_modules/**', ...NOT_COMPARED, ...excludeGlobs(exclude)],
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/** What the gate passes jscpd: the thresholds and every file to compare, by absolute path. */
|
|
41
|
+
export function gateSettings(paths) {
|
|
42
|
+
return JSON.stringify({ minTokens: MIN_TOKENS, minLines: MIN_LINES, path: paths });
|
|
43
|
+
}
|
|
44
|
+
export const jscpdBase = {
|
|
45
|
+
path: JSCPD_CONFIG,
|
|
46
|
+
scope: 'repo',
|
|
47
|
+
applies: (ctx) => comparedFiles(ctx.facts).length > 0,
|
|
48
|
+
render: (ctx) => renderJscpdBase(ctx.version, ctx.config.exclude),
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=jscpd-config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jscpd-config.js","sourceRoot":"","sources":["../../../src/checks/common/jscpd-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAGvD,MAAM,YAAY,GAAG,aAAa,CAAC;AAEnC,gFAAgF;AAChF,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,SAAS,GAAG,CAAC,CAAC;AAEpB,SAAS,WAAW,CAAC,KAAa;IAChC,IAAI,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IACvB,OAAO,GAAG,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG;QAAE,GAAG,IAAI,CAAC,CAAC;IACnD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,YAAY,CAAC,OAA0B;IACrD,OAAO,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/B,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO,CAAC,OAAO,EAAE,GAAG,OAAO,KAAK,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAe,EAAE,OAA0B;IACzE,OAAO,cAAc,CAAC;QACpB,IAAI,EAAE,iBAAiB,CAAC,OAAO,CAAC;QAChC,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,SAAS;QACnB,SAAS,EAAE,CAAC;QACZ,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,KAAK;QACf,SAAS,EAAE,CAAC,SAAS,CAAC;QACtB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,CAAC,oBAAoB,EAAE,GAAG,YAAY,EAAE,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;KAC1E,CAAC,CAAC;AACL,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAc;IAClC,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;IACrD,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC;CAClE,CAAC"}
|