Repository navigation
v0.1.0
·
84 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
The first release of the catalog on its own. fleetlint 0.3 and older embedded the rules under the ids listed as renamed below.
Added
- The presets
minimal,recommended,slop,strictandoss, the rule library (94 rules and 12 capabilities with 129 per-stack implementations), the stack definitions and the fix templates, moved here from the fleetlint repository. fleetlint embeds this module. - Capabilities. A requirement that every stack meets with its own tools is one capability with an implementation per stack at
rules/<family>/<name>/<stack>.yaml;any.yamlis the stack-neutral implementation, and an implementation withwhen: "false"says the requirement does not apply to its stack. Capabilities:lint/configured,lint/strict,types/strict,format/configured,repo/lockfile-committed,repo/toolchain-pinned,deps/vulnerability-scan,deps/license-check,deps/locked-install,deps/unused-check,quality/coverage-threshold,release/reproducible-build. Selecting, overriding or excepting a capability reaches all its implementations. - Stacks as data.
stacks/<id>.yamlfor cpp, dotnet, flutter, go, hugo, java, kotlin, node, php, python, ruby and rust: detection markers, dev container feature or image, the image targets run in, Renovate lockfile maintenance. - New rules:
ci/no-script-injection,ci/no-pipe-to-shell,ci/checkout-no-persist-credentials,ci/workflow-lint,ci/sast,hooks/revs-pinned,release/trusted-publishing,release/hosted-builder,deps/update-coverage,deps/update-cooldown,slop/forced-unwraps; new capabilitiesformat/configured,types/strict,deps/locked-install,deps/unused-check,release/reproducible-build. - GitLab CI: every rule that reads CI understands
.gitlab-ci.yml(jobs, scripts,timeout:,interruptible, includes pinned to a commit, release pipelines on$CI_COMMIT_TAG); Forgejo Actions workflows are read too. lefthook is understood byhooks/secret-scan,hooks/conventional-commitsandhooks/pre-push-check. - Every tag is published as a signed OCI artifact,
ghcr.io/fleetlint/catalog:<tag>, holding the whole catalog version; a repository pins it withcatalog: {oci: ghcr.io/fleetlint/catalog:<tag>}. The check workflow builds and loads the artifact on every change. aliases.yamlmaps every renamed rule id to the ids that replace it; fleetlint reads an old id in a configuration as those, with a warning.deps/update-automationhas a fix:fleetlint fixwrites a renovate.json with only the settings the repository's stacks need.- Templates for a justfile and a Taskfile next to the Makefile, and workflow fragments that install those runners.
Changed
- Renamed.
lint/<stack>-configislint/configured/<stack>,lint/hugo-strict-buildislint/configured/hugo;lint/go-linters-enabled,lint/python-rules-enabled,lint/rust-lints-deniedandlint/kotlin-detekt-strictarelint/strict/<stack>;lint/node-strict-flagsandlint/flutter-strict-modesaretypes/strict/<stack>, and the tsconfig and mypy parts oflint/node-configandlint/python-configmoved there;quality/no-slop-markersisslop/marketing-words(info, inslop). - Presets.
public/no-agent-filesandpublic/no-ai-attributionmoved fromminimaltoslop.minimaladdsslop/conflict-markers,repo/no-large-filesandpublic/license.recommendedaddsformat/*andtypes/*and lists its public rules.strictalso forbids exceptions onci/no-script-injection,ci/no-pipe-to-shell,hooks/revs-pinnedandrelease/trusted-publishing. Presets stateengine: 3and no version of their own: they take the release tag. - The lint, format and type capabilities apply at tiers 1 and 2; the lint rules before applied at every tier. Lint rules find a configuration in a parent directory, as the tools do, so workspace members inherit the root's.
public/no-ai-attributionmatches AI tool and bot addresses and generator footers, never a person's name.public/no-agent-filesalso coversGEMINI.md,.github/copilot-instructions.md,.cursorrules,.windsurfrules,.clinerules,.aider*and.cursor/.- Vulnerability scanners, license checks and coverage gates count only where they are run: an
echo, a comment or an install line no longer satisfies those rules, and the templates' TODO lines name no tool. hooks/secret-scanneeds a secret scanner (gitleaks, trufflehog, ggshield, detect-secrets, secretlint);detect-private-keyalone is a partial.ci/check-workflowandhooks/pre-push-checkno longer acceptcheck-fast.ci/actions-pinnedneeds a digest fordocker://and a commit for GitLab includes.repo/toolchain-pinnedneeds the tool named with a version (and a JDK pin for Java and Kotlin);repo/lockfile-committedno longer counts an unhashed requirements.txt.release/sbomis a warning and does not apply when a release only publishes to a package registry or when git-cliff is the only release tool.repo/no-tracked-envandrepo/no-tracked-junkrun once at the root. The per-stack capabilities run in every workspace member and nested project, and accept what the repository provides above it: a workspace's root lockfile, a pin in a parent directory, a scanner or coverage gate in the root's CI or task runner.- A Gradle build is
javawhen it applies the Java plugins and neither Kotlin nor Android; every other Gradle build (Kotlin, Android, Kotlin Multiplatform) iskotlin. ci/least-privilegechecks GitHub Actions workflows only: Gitea and Forgejo do not take the token's scope from the workflow file.repo/readme-presentaccepts a heading on running, developing or building the project too.repo/no-tracked-envandrepo/no-tracked-junkpass.envfiles, logs and dependency directories under test and fixture directories: they are test inputs.- A Hugo site's
go.mod(Hugo modules) does not make it a Go project; Go sources next to it do. - Slop heuristics report fewer false positives:
model.eval(),iter().skip(), "Enter your password", mdBook'sSUMMARY.md, pytest'stest_*.py,isNew, versioned API files, Git'sRevert "..."subjects and the initial commit no longer count; conflict markers are found in every file type. - Templates: ESLint flat config with
defineConfig, PHPStan 2 and PHP CS Fixer rule sets, clang-tidy header filter, ruff without a hardcoded target version, current Dart analyzer options,.editorconfigwith tabs for Go and two spaces for Dart,ciandstylecommit types, npm publishing through trusted publishing.
Fixed
ci/concurrency-cancelno longer errors onconcurrencywithoutcancel-in-progress.hooks/conventional-commitsno longer passes onno-commit-to-branch.containers/non-root-userreads the final stage only.slop/focused-testsreads test files only, and looks forfdescribe,fitand.onlyin JavaScript and TypeScript and forsolo: truein Dart; a Go function calledfitwas an error before.repo/no-tracked-envaccepts encrypted environment files (.sops,.enc,.age,.gpg,.asc).- The agent instructions of
ci/least-privilegeandci/concurrency-cancelshowed an escaped\n; they now give the YAML in flow form.
Engine level 3: needs fleetlint 0.4.0 or newer.
Pin this version in .fleetlint.yaml, by digest from the registry:
catalog: { oci: ghcr.io/fleetlint/catalog@sha256:ed48a3fa614a10bdaa520f697cb1d733068a162c6bbf97ce23e73afd5403c894 }or by tag from git: catalog: { version: v0.1.0 }.
As a Go module: go get github.com/fleetlint/catalog@v0.1.0.
Verify the signature of the published artifact:
cosign verify ghcr.io/fleetlint/catalog@sha256:ed48a3fa614a10bdaa520f697cb1d733068a162c6bbf97ce23e73afd5403c894 \
--certificate-identity-regexp '^https://github\.com/fleetlint/catalog/\.github/workflows/publish\.yml@refs/tags/v' \
--certificate-oidc-issuer https://token.actions.githubusercontent.com