📝 Add AGENTS.md as the agent entry point
AI coding agents read AGENTS.md automatically, not README. Make AGENTS.md a thin pointer: the stable first-action facts plus links to CONTRIBUTING.md, README.md, and package.json#scripts. Keep the rules prose in CONTRIBUTING.md so humans and agents don't diverge (same anti-drift move as dropping project-specs.md). Clarify the agent's verification loop: npm run test is the mandatory gate; the pre-commit hook already runs the fast offline checks (tsc, oxlint, oxfmt, cspell) on staged files, and npm run check (knip + outdated) is repo-maintenance, not part of the feature loop. Forbid type-system escape hatches (@ts-nocheck, oxlint-disable, as-casts) as agent-only rules; a human may still add a review-visible disable as a last resort, so the location convention stays in CONTRIBUTING.md with a forward reference.
This commit is contained in:
1 parent
8924dd67d3
commit
436b49e3be
3 files changed
+54
-2
No files matched your search
+17
-1
@@ -1,6 +1,22 @@
|
||||
# Contributing
|
||||
|
||||
This document is for maintainers and contributors working on the project itself. End-user documentation is in [README.md](./README.md).
|
||||
This document is for maintainers and contributors working on the project itself. End-user documentation is in [README.md](./README.md). The machine entry point for AI coding agents is [AGENTS.md](./AGENTS.md); keep this file as the prose home for the rules below so agents and humans don't diverge.
|
||||
|
||||
## Rules the tools don't enforce
|
||||
|
||||
CI and review will bounce these even though `npm run check` and the linters don't catch them. They're the high-frequency things a contributor (or an agent) reaches for by default:
|
||||
|
||||
- **Source imports use `.ts` extensions, never `.js`.** `node --strip-types` resolves the `.ts` form at test time; `rewriteRelativeImportExtensions` emits `.js` in `dist/`. "Pre-fixing" an import to `.js` breaks the inner loop. (rationale: README § Tooling decisions)
|
||||
- **A new `npm run` script must reuse an existing prefix** (`check:` / `fix:` / `test:` / `watch:` / `publish:`). If none fits, that's a signal the script doesn't belong in the pipeline — not a reason to invent a new prefix. (see [Script prefix convention](#script-prefix-convention))
|
||||
- **`oxlint-disable` directives live in source, not `.oxlintrc.json`.** The trade-off must sit next to the code it silences. This is a _human_ last-resort convention; agents must not add these — see [AGENTS.md § Never do](./AGENTS.md#never-do). (rationale: README § Tooling decisions)
|
||||
- **Don't put slow / network / whole-project checks in pre-commit.** `check:knip` (~4s) and `check:outdated` (~6.5s, network) are deliberately excluded from the hook to keep it fast and offline. (see [Why these splits](#why-these-splits))
|
||||
- **There is no local `npm run publish`, and `publish:publint` / `publish:attw` don't go in `check`.** They validate the publishable artifact (`dist/`) and run only in the CI `publish` job. (see [Publishing workflow](#publishing-workflow))
|
||||
|
||||
## Commit messages
|
||||
|
||||
Gitmoji subject, imperative mood, 50/72 wrapping. The template is `commit-message-template`; `npm run use:git-commit-message` installs it into `.git/COMMIT_EDITMSG`.
|
||||
|
||||
Examples from history: `:sparkles: Add watch tier with watch:test child`, `:recycle: Move type-aware config to .oxlintrc.json; use source-level disable directives`, `:memo: Restore unique maintainer content as CONTRIBUTING.md`. The body explains _what and why_, not _how_; link issues with `Resolves #...`.
|
||||
|
||||
## Script prefix convention
|
||||
|
||||
|
||||
Reference in new issue
Block a user