@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,347 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Runs Talos at the release this checkout of the Talos repository is at, for workflows that have
|
|
4
|
+
* no Talos yet. The checkout is at the pinned commit; this reads its own `package.json` version,
|
|
5
|
+
* installs `@svp-labs/talos@<version>` with npm (no install scripts), has `npm audit signatures`
|
|
6
|
+
* verify the registry's signatures and attestations, refuses the package unless its SLSA
|
|
7
|
+
* provenance names the Talos repository, this checkout's HEAD and the installed tarball, then
|
|
8
|
+
* runs it with the given arguments and exits with its code.
|
|
9
|
+
*
|
|
10
|
+
* Dependency-free on purpose: nothing is installed before it runs, and Node runs this file as it
|
|
11
|
+
* is, stripping its types, so it holds only syntax that erases (no enums, namespaces or parameter
|
|
12
|
+
* properties). What it reads from npm and the registry is narrowed by hand, field by field. It
|
|
13
|
+
* prints nothing of its own but one generic line when it refuses, since npm's messages can name
|
|
14
|
+
* things a public log must not show. Neither npm nor git is looked up on PATH: npm is the one
|
|
15
|
+
* beside the running Node, and HEAD is read from the checkout's files.
|
|
16
|
+
*/
|
|
17
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
18
|
+
import { existsSync, mkdtempSync, readFileSync, writeFileSync } from 'node:fs';
|
|
19
|
+
import { tmpdir } from 'node:os';
|
|
20
|
+
import { dirname, join, resolve } from 'node:path';
|
|
21
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
22
|
+
|
|
23
|
+
export const PACKAGE = '@svp-labs/talos';
|
|
24
|
+
export const SOURCE = 'SVP-Labs/Talos';
|
|
25
|
+
const PROVENANCE = 'https://slsa.dev/provenance/v1';
|
|
26
|
+
const STATEMENT = 'https://in-toto.io/Statement/v1';
|
|
27
|
+
const PAYLOAD = 'application/vnd.in-toto+json';
|
|
28
|
+
const GITHUB = 'https://github.com/';
|
|
29
|
+
const REGISTRY = 'https://registry.npmjs.org';
|
|
30
|
+
const VERSION = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;
|
|
31
|
+
const COMMIT = /^[0-9a-f]{40}$/;
|
|
32
|
+
const SHA512 = 'sha512-';
|
|
33
|
+
|
|
34
|
+
type Env = Readonly<Record<string, string | undefined>>;
|
|
35
|
+
|
|
36
|
+
/** A parsed JSON object: any field may hold anything. */
|
|
37
|
+
type JsonObject = Readonly<Record<string, unknown>>;
|
|
38
|
+
|
|
39
|
+
/** The DSSE envelope of an attestation, as far as it has been checked. */
|
|
40
|
+
type Envelope = { readonly payload: string; readonly payloadType?: unknown };
|
|
41
|
+
|
|
42
|
+
type BuildDefinition = {
|
|
43
|
+
readonly resolvedDependencies: readonly unknown[];
|
|
44
|
+
readonly externalParameters: { readonly workflow: { readonly repository: string } };
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/** The parts of an in-toto statement of SLSA provenance this reads, as far as it checks them. */
|
|
48
|
+
type Statement = {
|
|
49
|
+
readonly subject: readonly unknown[];
|
|
50
|
+
readonly predicate: { readonly buildDefinition: BuildDefinition };
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/** The build a release must come from. */
|
|
54
|
+
type Expected = {
|
|
55
|
+
readonly name: string;
|
|
56
|
+
readonly version: string;
|
|
57
|
+
/** `owner/name`. */
|
|
58
|
+
readonly repository: string;
|
|
59
|
+
readonly commit: string;
|
|
60
|
+
/** The installed tarball's integrity, from the lockfile. */
|
|
61
|
+
readonly integrity: string;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
type Release = { readonly version: string; readonly sha: string };
|
|
65
|
+
|
|
66
|
+
/** How an npm run ended; its status and output are null when it never started. */
|
|
67
|
+
type NpmRun = { readonly status: number | null; readonly stdout: string | null };
|
|
68
|
+
|
|
69
|
+
export class Refusal extends Error {
|
|
70
|
+
override name = 'Refusal';
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function isObject(value: unknown): value is JsonObject {
|
|
74
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function isList(value: unknown): value is readonly unknown[] {
|
|
78
|
+
return Array.isArray(value);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/** A parsed JSON value's field, as `value?.[key]` reads it: undefined unless it is an object. */
|
|
82
|
+
function field(value: unknown, key: string): unknown {
|
|
83
|
+
return isObject(value) ? value[key] : undefined;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* A parsed JSON value in lower case, as `value?.toLowerCase()` reads it: undefined when there is
|
|
88
|
+
* none, and a throw when it is there but not a string.
|
|
89
|
+
*/
|
|
90
|
+
function lowerCase(value: unknown): string | undefined {
|
|
91
|
+
if (value === undefined || value === null) return undefined;
|
|
92
|
+
if (typeof value !== 'string') throw new TypeError('expected a string');
|
|
93
|
+
return value.toLowerCase();
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function isEnvelope(value: unknown): value is Envelope {
|
|
97
|
+
return isObject(value) && typeof value.payload === 'string';
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** The SHA-512 of a Subresource Integrity string as hex, or undefined. */
|
|
101
|
+
export function integrityHex(integrity: unknown): string | undefined {
|
|
102
|
+
if (typeof integrity !== 'string') return undefined;
|
|
103
|
+
const parts = integrity.trim().split(/\s+/);
|
|
104
|
+
const base64 = parts.find((part) => part.startsWith(SHA512))?.slice(SHA512.length);
|
|
105
|
+
const bytes = base64 === undefined ? undefined : Buffer.from(base64, 'base64');
|
|
106
|
+
return bytes?.length === 64 ? bytes.toString('hex') : undefined;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export function packageUrl(name: string, version: string): string {
|
|
110
|
+
return `pkg:npm/${name.replace(/^@/, '%40')}@${version}`;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
function provenanceEnvelope(response: unknown): Envelope {
|
|
114
|
+
const attestations = field(response, 'attestations');
|
|
115
|
+
if (!isList(attestations)) throw new Refusal('the registry returned no attestations');
|
|
116
|
+
const provenance = attestations.filter((a) => field(a, 'predicateType') === PROVENANCE);
|
|
117
|
+
const envelope =
|
|
118
|
+
provenance.length === 1 ? field(field(provenance[0], 'bundle'), 'dsseEnvelope') : undefined;
|
|
119
|
+
if (!isEnvelope(envelope)) {
|
|
120
|
+
throw new Refusal(`expected one SLSA provenance attestation, found ${provenance.length}`);
|
|
121
|
+
}
|
|
122
|
+
if (envelope.payloadType !== PAYLOAD) throw new Refusal('the provenance is not in-toto');
|
|
123
|
+
return envelope;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function isProvenanceStatement(statement: unknown): statement is Statement {
|
|
127
|
+
const definition = field(field(statement, 'predicate'), 'buildDefinition');
|
|
128
|
+
const workflow = field(field(definition, 'externalParameters'), 'workflow');
|
|
129
|
+
return (
|
|
130
|
+
isObject(statement) &&
|
|
131
|
+
statement._type === STATEMENT &&
|
|
132
|
+
statement.predicateType === PROVENANCE &&
|
|
133
|
+
isList(statement.subject) &&
|
|
134
|
+
isList(field(definition, 'resolvedDependencies')) &&
|
|
135
|
+
typeof field(workflow, 'repository') === 'string'
|
|
136
|
+
);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/** The in-toto statement of the SLSA provenance among npm's attestations for a version. */
|
|
140
|
+
export function readStatement(response: unknown): Statement {
|
|
141
|
+
const envelope = provenanceEnvelope(response);
|
|
142
|
+
let statement: unknown;
|
|
143
|
+
try {
|
|
144
|
+
statement = JSON.parse(Buffer.from(envelope.payload, 'base64').toString('utf8'));
|
|
145
|
+
} catch {
|
|
146
|
+
throw new Refusal('the provenance payload is not JSON');
|
|
147
|
+
}
|
|
148
|
+
if (!isProvenanceStatement(statement)) {
|
|
149
|
+
throw new Refusal('the provenance is not an in-toto statement of SLSA provenance v1');
|
|
150
|
+
}
|
|
151
|
+
return statement;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function sourceCommit(definition: BuildDefinition): string | undefined {
|
|
155
|
+
const prefix = `git+${definition.externalParameters.workflow.repository}@`.toLowerCase();
|
|
156
|
+
const source = definition.resolvedDependencies.find((d) => {
|
|
157
|
+
const uri = field(d, 'uri');
|
|
158
|
+
return typeof uri === 'string' && uri.toLowerCase().startsWith(prefix);
|
|
159
|
+
});
|
|
160
|
+
const commit = field(field(source, 'digest'), 'gitCommit');
|
|
161
|
+
return typeof commit === 'string' ? commit : undefined;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/** Every way a statement fails to describe the expected build; empty when it matches. */
|
|
165
|
+
export function provenanceProblems(statement: Statement, expected: Expected): string[] {
|
|
166
|
+
const problems: string[] = [];
|
|
167
|
+
const definition = statement.predicate.buildDefinition;
|
|
168
|
+
const url = definition.externalParameters.workflow.repository;
|
|
169
|
+
const repository = url.toLowerCase().startsWith(GITHUB) ? url.slice(GITHUB.length) : url;
|
|
170
|
+
if (repository.toLowerCase() !== expected.repository.toLowerCase()) {
|
|
171
|
+
problems.push(`it was built from ${repository}, not ${expected.repository}`);
|
|
172
|
+
}
|
|
173
|
+
const commit = sourceCommit(definition);
|
|
174
|
+
if (commit?.toLowerCase() !== expected.commit.toLowerCase()) {
|
|
175
|
+
problems.push(`it was built from commit ${commit ?? '(none named)'}, not ${expected.commit}`);
|
|
176
|
+
}
|
|
177
|
+
const name = packageUrl(expected.name, expected.version);
|
|
178
|
+
const subject = statement.subject.find((s) => field(s, 'name') === name);
|
|
179
|
+
const digest = integrityHex(expected.integrity);
|
|
180
|
+
if (subject === undefined) {
|
|
181
|
+
problems.push(`it attests no ${name}`);
|
|
182
|
+
} else if (
|
|
183
|
+
digest === undefined ||
|
|
184
|
+
lowerCase(field(field(subject, 'digest'), 'sha512')) !== digest
|
|
185
|
+
) {
|
|
186
|
+
problems.push('the digest it attests is not the installed tarball’s');
|
|
187
|
+
}
|
|
188
|
+
return problems;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/** What `npm audit signatures --json` objects to; empty when every signature verified. */
|
|
192
|
+
export function auditProblems(code: number, stdout: string): string[] {
|
|
193
|
+
let report: unknown;
|
|
194
|
+
try {
|
|
195
|
+
report = JSON.parse(stdout);
|
|
196
|
+
} catch {
|
|
197
|
+
return [`npm audit signatures exited ${code} without a readable report`];
|
|
198
|
+
}
|
|
199
|
+
const invalid = field(report, 'invalid');
|
|
200
|
+
const missing = field(report, 'missing');
|
|
201
|
+
if (!isList(invalid) || !isList(missing)) {
|
|
202
|
+
return [`npm audit signatures exited ${code} without a readable report`];
|
|
203
|
+
}
|
|
204
|
+
const problems: string[] = [];
|
|
205
|
+
if (invalid.length > 0) problems.push(`${invalid.length} invalid signatures`);
|
|
206
|
+
if (missing.length > 0) problems.push(`${missing.length} missing signatures`);
|
|
207
|
+
if (problems.length === 0 && code !== 0) problems.push(`npm audit signatures exited ${code}`);
|
|
208
|
+
return problems;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/** The integrity npm recorded for the installed package, when it is the expected version. */
|
|
212
|
+
export function lockedIntegrity(lock: unknown, version: string): string | undefined {
|
|
213
|
+
const entry = field(field(lock, 'packages'), `node_modules/${PACKAGE}`);
|
|
214
|
+
return isObject(entry) && entry.version === version && typeof entry.integrity === 'string'
|
|
215
|
+
? entry.integrity
|
|
216
|
+
: undefined;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function readText(path: string): string | undefined {
|
|
220
|
+
try {
|
|
221
|
+
return readFileSync(path, 'utf8').trim();
|
|
222
|
+
} catch {
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
function gitDirOf(root: string): string {
|
|
228
|
+
const dotGit = join(root, '.git');
|
|
229
|
+
const pointer = readText(dotGit);
|
|
230
|
+
return pointer?.startsWith('gitdir: ') ? resolve(root, pointer.slice('gitdir: '.length)) : dotGit;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* The commit a checkout's HEAD is at, read from its files rather than by running git: a detached
|
|
235
|
+
* HEAD holds the commit; a branch's HEAD points at a loose or a packed ref.
|
|
236
|
+
*/
|
|
237
|
+
export function headCommit(root: string): string | undefined {
|
|
238
|
+
const gitDir = gitDirOf(root);
|
|
239
|
+
const head = readText(join(gitDir, 'HEAD')) ?? '';
|
|
240
|
+
if (COMMIT.test(head)) return head;
|
|
241
|
+
const ref = /^ref: (refs\/[\w./-]+)$/.exec(head)?.[1];
|
|
242
|
+
if (ref === undefined) return undefined;
|
|
243
|
+
const loose = readText(join(gitDir, ref));
|
|
244
|
+
if (loose !== undefined) return COMMIT.test(loose) ? loose : undefined;
|
|
245
|
+
const packed = (readText(join(gitDir, 'packed-refs')) ?? '').split('\n');
|
|
246
|
+
const commit = packed.find((line) => line.endsWith(` ${ref}`))?.slice(0, 40);
|
|
247
|
+
return commit !== undefined && COMMIT.test(commit) ? commit : undefined;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/** The release a checkout of the Talos repository is at: its version and HEAD commit. */
|
|
251
|
+
export function kitRelease(kitRoot: string): Release {
|
|
252
|
+
const manifest: unknown = JSON.parse(readFileSync(join(kitRoot, 'package.json'), 'utf8'));
|
|
253
|
+
const version = field(manifest, 'version');
|
|
254
|
+
if (
|
|
255
|
+
field(manifest, 'name') !== PACKAGE ||
|
|
256
|
+
typeof version !== 'string' ||
|
|
257
|
+
!VERSION.test(version)
|
|
258
|
+
) {
|
|
259
|
+
throw new Refusal('the checkout is not a Talos release');
|
|
260
|
+
}
|
|
261
|
+
const sha = headCommit(kitRoot);
|
|
262
|
+
if (sha === undefined) throw new Refusal('the checkout has no commit');
|
|
263
|
+
return { version, sha };
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/** npm's own script beside the running Node, so nothing is looked up on PATH. */
|
|
267
|
+
export function npmCli(execPath: string, platform: string, env: Env): string | undefined {
|
|
268
|
+
const bin = dirname(execPath);
|
|
269
|
+
const beside =
|
|
270
|
+
platform === 'win32'
|
|
271
|
+
? join(bin, 'node_modules', 'npm', 'bin', 'npm-cli.js')
|
|
272
|
+
: join(bin, '..', 'lib', 'node_modules', 'npm', 'bin', 'npm-cli.js');
|
|
273
|
+
return [beside, env.npm_execpath].find((path) => path !== undefined && existsSync(path));
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
function npm(args: readonly string[], cwd: string): NpmRun {
|
|
277
|
+
const cli = npmCli(process.execPath, process.platform, process.env);
|
|
278
|
+
if (cli === undefined) throw new Refusal('npm was not found beside node');
|
|
279
|
+
return spawnSync(process.execPath, [cli, ...args], {
|
|
280
|
+
cwd,
|
|
281
|
+
encoding: 'utf8',
|
|
282
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
283
|
+
maxBuffer: 64 * 1024 * 1024,
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
async function verifiedProvenance(release: Release, integrity: string): Promise<void> {
|
|
288
|
+
const url = `${REGISTRY}/-/npm/v1/attestations/${encodeURIComponent(PACKAGE)}@${release.version}`;
|
|
289
|
+
const response = await fetch(url, { headers: { accept: 'application/json' } });
|
|
290
|
+
if (!response.ok) throw new Refusal(`${PACKAGE}@${release.version} has no provenance`);
|
|
291
|
+
const problems = provenanceProblems(readStatement(await response.json()), {
|
|
292
|
+
name: PACKAGE,
|
|
293
|
+
version: release.version,
|
|
294
|
+
repository: SOURCE,
|
|
295
|
+
commit: release.sha,
|
|
296
|
+
integrity,
|
|
297
|
+
});
|
|
298
|
+
if (problems.length > 0) throw new Refusal(problems.join('; '));
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
async function installVerified(release: Release, directory: string): Promise<string> {
|
|
302
|
+
writeFileSync(join(directory, 'package.json'), '{ "private": true }\n');
|
|
303
|
+
const spec = `${PACKAGE}@${release.version}`;
|
|
304
|
+
const flags = ['--ignore-scripts', '--no-audit', '--no-fund', '--save-exact'];
|
|
305
|
+
const install = npm(['install', ...flags, spec], directory);
|
|
306
|
+
if (install.status !== 0) throw new Refusal(`npm install exited ${String(install.status)}`);
|
|
307
|
+
const lock: unknown = JSON.parse(readFileSync(join(directory, 'package-lock.json'), 'utf8'));
|
|
308
|
+
const integrity = lockedIntegrity(lock, release.version);
|
|
309
|
+
if (integrity === undefined) throw new Refusal(`npm installed no ${spec}`);
|
|
310
|
+
const audit = npm(['audit', 'signatures', '--json'], directory);
|
|
311
|
+
const audited = auditProblems(audit.status ?? 1, audit.stdout ?? '');
|
|
312
|
+
if (audited.length > 0) throw new Refusal(audited.join('; '));
|
|
313
|
+
await verifiedProvenance(release, integrity);
|
|
314
|
+
return join(directory, 'node_modules', '@svp-labs', 'talos', 'dist', 'bin', 'talos.js');
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
function run(bin: string, args: readonly string[], env: Env): Promise<number> {
|
|
318
|
+
return new Promise((done) => {
|
|
319
|
+
const child = spawn(process.execPath, [bin, ...args], { stdio: 'inherit', env });
|
|
320
|
+
child.on('error', () => done(2));
|
|
321
|
+
child.on('exit', (code) => done(code ?? 1));
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/** Installs and verifies the checkout's release, runs it with `args`, and returns its code. */
|
|
326
|
+
export async function main(args: readonly string[], env: Env): Promise<number> {
|
|
327
|
+
const kitRoot = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
328
|
+
try {
|
|
329
|
+
const release = kitRelease(kitRoot);
|
|
330
|
+
const directory = mkdtempSync(join(env.RUNNER_TEMP ?? tmpdir(), 'talos-'));
|
|
331
|
+
const bin = await installVerified(release, directory);
|
|
332
|
+
return await run(bin, args, {
|
|
333
|
+
...env,
|
|
334
|
+
TALOS_LAUNCHED: '1',
|
|
335
|
+
TALOS_VERSION: release.version,
|
|
336
|
+
TALOS_SHA: release.sha,
|
|
337
|
+
});
|
|
338
|
+
} catch (error) {
|
|
339
|
+
const reason = error instanceof Refusal ? error.message : 'the release could not be installed';
|
|
340
|
+
process.stderr.write(`talos bootstrap: refused: ${reason}\n`);
|
|
341
|
+
return 2;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
if (process.argv[1] !== undefined && pathToFileURL(process.argv[1]).href === import.meta.url) {
|
|
346
|
+
process.exitCode = await main(process.argv.slice(2), process.env);
|
|
347
|
+
}
|
package/bootstrap/php.sh
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Says which runs need PHP, and which PHP, for the workflows that set it up before Talos runs:
|
|
3
|
+
# the PHP checks run the project's own toolchain, which needs PHP with pcov and composer on the
|
|
4
|
+
# runner. Run it inside the repository's checkout, naming the commits whose talos.yml counts:
|
|
5
|
+
#
|
|
6
|
+
# php.sh <commit>...
|
|
7
|
+
#
|
|
8
|
+
# A PHP component in talos.yml at any of the commits needs PHP on each OS it lists (linux when it
|
|
9
|
+
# lists none). The version is the newest minor that any of their composer.json files asks for
|
|
10
|
+
# (config.platform.php, else require.php), and never older than 8.4, the oldest PHP the toolchain
|
|
11
|
+
# installs on. Prints two lines for $GITHUB_OUTPUT, the OSes as a JSON list and then the minor,
|
|
12
|
+
# such as `oses=["linux"]` and `version=8.4`.
|
|
13
|
+
#
|
|
14
|
+
# Needs git, jq and yq (mikefarah's, which GitHub's runners carry, or the Python one). The caller
|
|
15
|
+
# workflow, which never changes between releases, runs it from whichever release a repository
|
|
16
|
+
# enforces, so every release keeps it, with these arguments and this output.
|
|
17
|
+
set -euo pipefail
|
|
18
|
+
|
|
19
|
+
floor='8.4'
|
|
20
|
+
php_components='[.components[]? | select(.lang == "php")
|
|
21
|
+
| {root: ((.root // ".") | sub("/+$"; "") | sub("^\\./"; "") | if . == "" then "." else . end),
|
|
22
|
+
os: (.os // ["linux"])}]'
|
|
23
|
+
minor_asked='(.config.platform.php // .require.php // "") | tostring
|
|
24
|
+
| [scan("[0-9]+\\.[0-9]+")] | .[0] // empty'
|
|
25
|
+
|
|
26
|
+
fail() {
|
|
27
|
+
echo "php: $1" >&2
|
|
28
|
+
exit 1
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
(($# > 0)) || fail "name the commits whose talos.yml counts"
|
|
32
|
+
command -v yq >/dev/null || fail "yq is not on PATH"
|
|
33
|
+
|
|
34
|
+
oses=''
|
|
35
|
+
versions="$floor"
|
|
36
|
+
for commit in "$@"; do
|
|
37
|
+
config="$(git show "$commit:talos.yml" 2>/dev/null)" || continue
|
|
38
|
+
json="$(yq -o=json '.' <<<"$config" 2>/dev/null || yq '.' <<<"$config" 2>/dev/null)" ||
|
|
39
|
+
fail "talos.yml at $commit is not YAML"
|
|
40
|
+
php="$(jq -c "$php_components" <<<"$json" 2>/dev/null)" ||
|
|
41
|
+
fail "cannot read the components of talos.yml at $commit"
|
|
42
|
+
oses+="$(jq -r '.[].os[]' <<<"$php")"$'\n'
|
|
43
|
+
roots="$(jq -r '.[].root' <<<"$php")"
|
|
44
|
+
while IFS= read -r root; do
|
|
45
|
+
[[ -n "$root" ]] || continue
|
|
46
|
+
file="$root/composer.json"
|
|
47
|
+
[[ "$root" == "." ]] && file='composer.json'
|
|
48
|
+
composer="$(git show "$commit:$file" 2>/dev/null)" || continue
|
|
49
|
+
versions+=$'\n'"$(jq -r "$minor_asked" <<<"$composer" 2>/dev/null || true)"
|
|
50
|
+
done <<<"$roots"
|
|
51
|
+
done
|
|
52
|
+
|
|
53
|
+
version="$({ grep -E '^[0-9]+\.[0-9]+$' <<<"$versions" || true; } | sort -V | tail -n 1)"
|
|
54
|
+
list="$({ grep -E '^(linux|windows|macos)$' <<<"$oses" || true; } | sort -u | jq -R . | jq -cs .)"
|
|
55
|
+
printf 'oses=%s\nversion=%s\n' "$list" "$version"
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { readdir, readFile } from 'node:fs/promises';
|
|
2
|
+
import { parseDefaults } from './dependabot.js';
|
|
3
|
+
import { RUNNER_PATCH } from './supply.js';
|
|
4
|
+
import { assetsDir } from '../version/self.js';
|
|
5
|
+
async function optional(url) {
|
|
6
|
+
try {
|
|
7
|
+
return await readFile(url, 'utf8');
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return undefined;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The issue forms, PR template, Dependabot settings, `CLAUDE.md` block, patches and pre-push
|
|
15
|
+
* hook this Talos ships.
|
|
16
|
+
*/
|
|
17
|
+
export async function loadAdoptAssets(dir = assetsDir()) {
|
|
18
|
+
const formsDir = new URL('issue-forms/', dir);
|
|
19
|
+
const names = (await readdir(formsDir))
|
|
20
|
+
.filter((name) => /\.ya?ml$/.test(name))
|
|
21
|
+
.sort((a, b) => a.localeCompare(b));
|
|
22
|
+
const forms = await Promise.all(names.map((name) => readFile(new URL(name, formsDir), 'utf8')));
|
|
23
|
+
const issueForms = Object.fromEntries(names.map((name, index) => [name, forms[index] ?? '']));
|
|
24
|
+
const [prTemplate, defaults, claudeKit, runnerPatch, prePush] = await Promise.all([
|
|
25
|
+
optional(new URL('pull_request_template.md', dir)),
|
|
26
|
+
readFile(new URL('dependabot/update.yml', dir), 'utf8'),
|
|
27
|
+
readFile(new URL('claude/kit-block.md', dir), 'utf8'),
|
|
28
|
+
optional(new URL(`patches/${RUNNER_PATCH}`, dir)),
|
|
29
|
+
readFile(new URL('hooks/pre-push', dir), 'utf8'),
|
|
30
|
+
]);
|
|
31
|
+
return {
|
|
32
|
+
issueForms,
|
|
33
|
+
prTemplate,
|
|
34
|
+
dependabot: parseDefaults(defaults),
|
|
35
|
+
claudeKit,
|
|
36
|
+
runnerPatch,
|
|
37
|
+
prePush,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/adopt/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,KAAK,UAAU,QAAQ,CAAC,GAAQ;IAC9B,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAW,SAAS,EAAE;IAC1D,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,CAAC,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;SACpC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;SACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9F,MAAM,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QAChF,QAAQ,CAAC,IAAI,GAAG,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;QAClD,QAAQ,CAAC,IAAI,GAAG,CAAC,uBAAuB,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QACvD,QAAQ,CAAC,IAAI,GAAG,CAAC,qBAAqB,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QACrD,QAAQ,CAAC,IAAI,GAAG,CAAC,WAAW,YAAY,EAAE,EAAE,GAAG,CAAC,CAAC;QACjD,QAAQ,CAAC,IAAI,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,EAAE,MAAM,CAAC;KACjD,CAAC,CAAC;IACH,OAAO;QACL,UAAU;QACV,UAAU;QACV,UAAU,EAAE,aAAa,CAAC,QAAQ,CAAC;QACnC,SAAS;QACT,WAAW;QACX,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { detectComponents, detectDocs, guessExclude } from './detect.js';
|
|
2
|
+
import { derivePrefix, isSeed, renderTalosYml } from './talos-yml.js';
|
|
3
|
+
import { ConfigError, parseConfig } from '../config/load.js';
|
|
4
|
+
import { prefixHolder } from '../govern/create.js';
|
|
5
|
+
import { repoFacts } from '../repo/facts.js';
|
|
6
|
+
export class AdoptRefusal extends Error {
|
|
7
|
+
name = 'AdoptRefusal';
|
|
8
|
+
}
|
|
9
|
+
export function parsed(text) {
|
|
10
|
+
try {
|
|
11
|
+
return parseConfig(text);
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
if (error instanceof ConfigError)
|
|
15
|
+
throw new AdoptRefusal(error.message);
|
|
16
|
+
throw error;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function agree(flag, recorded, what) {
|
|
20
|
+
if (flag !== undefined && flag !== recorded) {
|
|
21
|
+
throw new AdoptRefusal(`talos.yml already names ${what} ${recorded}, not ${flag}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function draftConfig(input, recorded) {
|
|
25
|
+
const name = recorded?.name ?? input.name ?? input.repo.split('/').at(-1) ?? input.repo;
|
|
26
|
+
const exclude = guessExclude(input.files, input.read);
|
|
27
|
+
const facts = repoFacts(input.files, exclude);
|
|
28
|
+
return renderTalosYml({
|
|
29
|
+
name,
|
|
30
|
+
prefix: recorded?.prefix ?? input.prefix ?? derivePrefix(name),
|
|
31
|
+
components: detectComponents(facts.files, input.read, input.os),
|
|
32
|
+
exclude,
|
|
33
|
+
docs: detectDocs(facts.files),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* The repository's `talos.yml`: kept when someone has set it up, completed when it is only the
|
|
38
|
+
* name and prefix `talos new` recorded, and written from the manifests when there is none.
|
|
39
|
+
*/
|
|
40
|
+
export function resolveConfig(input) {
|
|
41
|
+
const existing = input.files.includes('talos.yml') ? input.read('talos.yml') : undefined;
|
|
42
|
+
if (existing === undefined) {
|
|
43
|
+
const text = draftConfig(input, undefined);
|
|
44
|
+
return { config: parsed(text), text, status: 'written' };
|
|
45
|
+
}
|
|
46
|
+
const recorded = parsed(existing);
|
|
47
|
+
agree(input.prefix, recorded.prefix, 'the prefix');
|
|
48
|
+
agree(input.name, recorded.name, 'the name');
|
|
49
|
+
if (!isSeed(existing))
|
|
50
|
+
return { config: recorded, text: undefined, status: 'kept' };
|
|
51
|
+
const text = draftConfig(input, recorded);
|
|
52
|
+
return { config: parsed(text), text, status: 'completed' };
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Refuses a prefix another repository of the organisation uses, as `talos new` does: a ticket
|
|
56
|
+
* branch `<P>-<N>` must name one repository. `uses` is `undefined` when the organisation couldn't
|
|
57
|
+
* be read, and then nothing is refused.
|
|
58
|
+
*/
|
|
59
|
+
export function checkPrefix(uses, repo, prefix) {
|
|
60
|
+
if (uses === undefined)
|
|
61
|
+
return;
|
|
62
|
+
const others = uses.filter((use) => use.repo.toLowerCase() !== repo.toLowerCase());
|
|
63
|
+
const holder = prefixHolder(others, prefix);
|
|
64
|
+
if (holder !== undefined) {
|
|
65
|
+
throw new AdoptRefusal(`prefix ${prefix} is in use by ${holder}; each repository needs its own`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/adopt/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,YAAY,EAAmB,MAAM,aAAa,CAAC;AAE1F,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE7D,OAAO,EAAE,YAAY,EAAkB,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,OAAO,YAAa,SAAQ,KAAK;IACnB,IAAI,GAAG,cAAc,CAAC;CACzC;AAmBD,MAAM,UAAU,MAAM,CAAC,IAAY;IACjC,IAAI,CAAC;QACH,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW;YAAE,MAAM,IAAI,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACxE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,IAAwB,EAAE,QAAgB,EAAE,IAAY;IACrE,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5C,MAAM,IAAI,YAAY,CAAC,2BAA2B,IAAI,IAAI,QAAQ,SAAS,IAAI,EAAE,CAAC,CAAC;IACrF,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,KAAkB,EAAE,QAAiC;IACxE,MAAM,IAAI,GAAG,QAAQ,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC;IACxF,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC9C,OAAO,cAAc,CAAC;QACpB,IAAI;QACJ,MAAM,EAAE,QAAQ,EAAE,MAAM,IAAI,KAAK,CAAC,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC;QAC9D,UAAU,EAAE,gBAAgB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QAC/D,OAAO;QACP,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC;KAC9B,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAkB;IAC9C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACzF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC3D,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACnD,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IACpF,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AAC7D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CACzB,IAAsC,EACtC,IAAY,EACZ,MAAc;IAEd,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACnF,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,IAAI,YAAY,CACpB,UAAU,MAAM,iBAAiB,MAAM,iCAAiC,CACzE,CAAC;IACJ,CAAC;AACH,CAAC"}
|