Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ jobs:
fi
done

# Computes the next version from commits since the last tag, generates release notes and a CHANGELOG.md entry, creates the GitHub Release and version tag, commits CHANGELOG.md back to main, and (via the move-major-tag plugin in release.config.ts) moves the moving vN tag to point at the new release -- see release.config.ts and scripts/move-major-tag.mjs. There is no npm-publish step and therefore no id-token: write permission -- this repository ships a GitHub Action, not an npm package.
# Computes the next version from commits since the last tag, generates release notes and a CHANGELOG.md entry, creates the GitHub Release and version tag, commits CHANGELOG.md back to main, and (via the move-major-tag plugin in release.config.ts) moves the moving vN tag to point at the new release -- see release.config.ts and scripts/move-major-tag.mts. There is no npm-publish step and therefore no id-token: write permission -- this repository ships a GitHub Action, not an npm package.
release:
name: Release
needs: [required-checks]
Expand All @@ -138,7 +138,7 @@ jobs:
with:
# semantic-release analyses the full commit history since the last tag.
fetch-depth: 0
# actions/checkout wires this into git's own credential config, so every subsequent plain `git push` in this job (the version tag, the CHANGELOG.md commit, and move-major-tag.mjs's tag move) authenticates as the App, not just this one checkout.
# actions/checkout wires this into git's own credential config, so every subsequent plain `git push` in this job (the version tag, the CHANGELOG.md commit, and move-major-tag.mts's tag move) authenticates as the App, not just this one checkout.
token: ${{ steps.app-token.outputs.token }}
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
Expand Down
1 change: 1 addition & 0 deletions .npmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
save-exact=true
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -388,7 +388,7 @@ These native-metadata capabilities widen triage's allowlist with `Bash(gh api:*)

## Versioning

Releases are automated by [`semantic-release`](https://semantic-release.gitbook.io/) (`release.config.ts`), triggered by the `release` job in `.github/workflows/ci.yml` on every push to `main` that passes `required-checks` — the single gate job aggregating commitlint, actionlint, typecheck, lint, and format, so adding, renaming, or splitting a check only ever means editing that one job's `needs:` list, never touching branch protection settings. It computes the next version from the conventional-commit types of the commits since the last release, writes `CHANGELOG.md`, creates the GitHub Release and the version tag, and moves the moving `v1` tag to it (`scripts/move-major-tag.mjs`, a local plugin — semantic-release has no concept of a moving major tag, since that's a GitHub-Actions-consumer convention, not a package-semver one). Consuming repositories reference `@v1`; a breaking change would ship as `v2` and require callers to opt in.
Releases are automated by [`semantic-release`](https://semantic-release.gitbook.io/) (`release.config.ts`), triggered by the `release` job in `.github/workflows/ci.yml` on every push to `main` that passes `required-checks` — the single gate job aggregating commitlint, actionlint, typecheck, lint, and format, so adding, renaming, or splitting a check only ever means editing that one job's `needs:` list, never touching branch protection settings. It computes the next version from the conventional-commit types of the commits since the last release, writes `CHANGELOG.md`, creates the GitHub Release and the version tag, and moves the moving `v1` tag to it (`scripts/move-major-tag.mts`, a local plugin — semantic-release has no concept of a moving major tag, since that's a GitHub-Actions-consumer convention, not a package-semver one). Consuming repositories reference `@v1`; a breaking change would ship as `v2` and require callers to opt in.

**The commit type you use is the release decision — get it right.** `commitlint.config.ts` and `release.config.ts` share one list (`commitTypes` in `release.config.ts`) mapping each conventional-commit type to a release level:

Expand Down Expand Up @@ -456,7 +456,7 @@ action.yml Composite action: input validation, prompt compos
call, automatic fixes
turbo.json Turborepo task cache config (lint/typecheck/format:check)
commitlint.config.ts Conventional-commit enforcement (local hook + CI)
release.config.ts semantic-release config; scripts/move-major-tag.mjs is its
release.config.ts semantic-release config; scripts/move-major-tag.mts is its
local plugin that moves the moving vN tag after each release
lint-staged.config.js Deliberately .js, not .ts -- see its own header comment
.github/dependabot.yml Dependabot config: daily npm + github-actions scan, 7-day cooldown
Expand Down
12 changes: 9 additions & 3 deletions eslint.config.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
import { defineConfig } from "eslint/config";
import tseslint from "typescript-eslint";
import exadev from "@exadev/eslint-config";
import json from "@eslint/json";
import markdown from "@eslint/markdown";
// Recommended config, not the plugin itself: this both enables the prettier/prettier rule (reports formatting differences as lint errors, reading prettier.config.ts the same way `prettier --check` does) and applies eslint-config-prettier, which turns off every ESLint stylistic rule that could otherwise disagree with Prettier. It carries no `files:` restriction of its own, so it applies to everything ESLint actually lints below — YAML is untouched here (no ESLint language plugin for it), so `npm run format:check` remains the one authoritative formatting check that also covers the workflow/action YAML files.
import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended";

export default defineConfig([
{
files: ["**/*.ts"],
extends: [tseslint.configs.recommended],
files: ["**/*.{ts,mts}"],
languageOptions: {
parserOptions: {
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
},
...exadev,
{
files: ["**/*.json"],
ignores: ["package-lock.json"], // generated, not hand-maintained
Expand Down
2 changes: 1 addition & 1 deletion lint-staged.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import { defineConfig } from "lint-staged/config";

export default defineConfig({
"*.{ts,md}": [
"*.{ts,mts,md}": [
"eslint --fix --cache --cache-location node_modules/.cache/eslint/.eslintcache",
"prettier --write --cache",
],
Expand Down
Loading