Markdown authoring and linting
Single source of truth for "is this markdown going to land cleanly" in this repo. Wraps the project markdownlint rules,
the custom authoring-guide and skill-authoring-guide rules from @public-projects/agents-tooling, and oxfmt's
markdown prose-wrap behavior into one workflow.
The deep authoring conventions live in
node_modules/@public-projects/agents-tooling/guides/skill-authoring-guide.md
and
node_modules/@public-projects/agents-tooling/guides/authoring-guide.md;
read them before writing a new SKILL.md, AGENTS.md, reference doc, or plan. This skill covers the formatting and linting
surface only.
When to use this skill
Apply whenever the user asks to:
- Add or edit any
.md / .mdc file in this repo (root docs, docs/**, plans/**, .agents/skills/**,
config/**/skills/**, package READMEs, etc.).
- Fix
markdownlint-cli2 or oxfmt failures on a markdown file.
- Restructure or rewrap an existing markdown file.
- Convert ad-hoc markdown into something safe to commit through
lint-staged.
Stop and defer when the task is governed by a more specific skill:
- Commit messages and PR descriptions -- use
commit-message.
REFERENCE.md / README.md doc-sync after a shell-surface change -- use doc-sync.
- A new SKILL.md, AGENTS.md, or active plan -- still use this skill for formatting, but the structural rules live in the
upstream authoring guides linked above.
Repo configuration at a glance
Three config files drive the rules; do not duplicate or override them in prose, just satisfy them.
| File |
What it sets |
.markdownlint.jsonc |
default: true (all standard rules), MD013 line length 120 (code/tables exempt), MD024 siblings-only |
.markdownlint-cli2.jsonc |
Loads custom authoring-guide + skill-authoring-guide rule packs, honors .gitignore |
oxfmt.config.ts |
proseWrap: 'always', printWidth: 120, singleQuote: true, trailingComma: 'all' |
lint-staged.config.mjs |
On commit: markdownlint-cli2 --fix --no-globs then oxfmt for *.{md,mdc} |
research/.markdownlint.jsonc |
Research subtree relaxes MD013 to 1200 and disables MD034 -- only applies under research/ |
plans/** is in the markdownlint ignores list, so plan files do not get linted on commit. Still wrap at 120 and use
the same conventions; the lint exemption is for in-flight drafting, not a license to ship malformed prose.
Rules to satisfy
Standard markdownlint defaults all apply. The ones that bite most often in this repo:
- MD003 / MD022 / MD023 -- ATX-style headings (
#, not Setext underlines), surrounded by blank lines, no leading
whitespace.
- MD013 line length 120, code blocks and tables exempt. Wrap prose at 120; do not split inside an inline code span
if it would push the line under but break the span.
- MD024 siblings_only -- duplicate headings are fine across H2 sections, not within the same parent.
- MD025 -- exactly one H1 per file. The H1 must come before the first H2.
- MD031 / MD032 -- fenced code blocks and lists must be surrounded by blank lines.
- MD034 no-bare-urls -- wrap URLs in
<https://...> or [text](url). (Disabled under research/ only.)
- MD036 -- do not use bold/italic as a fake heading; use a real heading.
- MD040 -- code fences need a language tag (
text is fine for plain output, bash for shell, sh when the command
is portable, ts for TypeScript, jsonc for commented JSON).
- MD047 -- single trailing newline at end of file.
- MD051 -- relative anchor links must point at real headings; rename safely.
Custom rules from @public-projects/agents-tooling (see
skill-authoring-guide.md for
the full surface):
skill-authoring-guide-frontmatter-required / frontmatter-shape -- every .agents/skills/*/SKILL.md and
config/**/skills/*/SKILL.md needs YAML frontmatter with name (kebab-case, matching the directory) and a
description containing all three of WHAT:, WHEN:, DO-NOT: markers, under 1024 characters, no angle brackets.
skill-authoring-guide-folder-layout -- skill subdirectories must be from the allowed set (scripts, references,
assets, evals).
skill-authoring-guide-no-readme -- never put a README.md inside a skill folder; use SKILL.md.
skill-authoring-guide-resource-mentions -- if a skill has a non-empty scripts/, references/, or assets/
directory, SKILL.md must mention it.
skill-authoring-guide-skill-required-sections -- SKILL.md needs both a "when to use" section (e.g.
## When to use this skill) and an action-oriented section (## Steps, ## Workflow, ## Procedure,
## Diagnostic flow, etc.).
authoring-guide-doc-size-budget -- soft caps: root AGENTS.md 120 lines, nested AGENTS.md 80, reference docs in
docs/ 300, active plans 400, skills 500. Trim or split when you exceed.
authoring-guide-non-empty-required-sections -- AGENTS.md Commands / Directory map / Key patterns /
Boundaries / References sections must have content; reference docs in docs/** must include Related docs.
authoring-guide-doc-opening-structure -- docs start with an H1 and an early scope-statement paragraph.
authoring-guide-related-docs-last / -required -- in reference docs, ## Related docs is required and must be the
final H2.
authoring-guide-no-bare-repo-paths / path-references / local-links -- repo paths in prose must be markdown links
or path: references, links must be relative, and path: references must point at real files.
authoring-guide-directory-map-table / -paths -- AGENTS.md ## Directory map is a Path | Purpose table whose
paths resolve.
authoring-guide-boundaries-shape -- AGENTS.md ## Boundaries uses Always, Ask first, Never markers.
authoring-guide-commands-shape -- AGENTS.md ## Commands uses a bash fence or described command bullets.
Style conventions to layer on top of lint
Lint passes are necessary but not sufficient. Match the existing tone:
- Imperative, concrete, low-fluff prose. No marketing voice, no rhetorical asides; see the
commit-message skill
for the rule set, applied here too.
- No em-dashes (
—) anywhere. Use a regular hyphen with spaces around it (-) or restructure the sentence.
Existing skills are written this way; oxfmt does not auto-convert.
- Tables for tabular data, lists for steps, fenced code for commands. Do not encode steps as a numbered table; do
not encode a table as a bulleted list.
- Single quotes in YAML frontmatter when the description contains colons (which it always does, due to
WHAT: /
WHEN: / DO-NOT:). Escape inner single quotes by doubling them (it''s). Existing skills use this; do not switch
to double quotes mid-file.
- Relative links to real files (
../../../node_modules/.../guide.md, ../bats-test-conventions/SKILL.md). No
absolute paths, no bare URLs to repo files.
- Code fence languages:
bash for shell snippets the user runs, sh only when truly POSIX, text for opaque
output, ts / tsx / jsonc / yaml / toml as appropriate. Never leave a fence untagged.
- One blank line between block elements. Two blanks is not "more readable", it is a lint failure waiting to happen.
oxfmt and prose wrap
oxfmt runs after markdownlint-cli2 --fix on commit, so it reflows prose last:
proseWrap: 'always' rewraps each paragraph to fit printWidth: 120. Do not hand-wrap to a narrower width to "look
nicer"; oxfmt will undo it and the diff churns.
- Lists, fenced code, and tables are not reflowed. Keep table rows as one logical line.
- Hard line breaks (two trailing spaces or
\) are preserved; use them only when meaningful.
- Inline HTML, comments (
<!-- -->), and link reference definitions are left alone.
If oxfmt reflows your wrapping on the first run after editing, that is expected; let it win and move on.
Workflow
- Read before writing. For an edit,
read the file (and any neighbors) so you match local voice and section
structure. For a new SKILL.md / AGENTS.md / plan / docs reference, read the relevant authoring guide in
node_modules/@public-projects/agents-tooling/guides/ first.
- Pick the right home. SKILL.md goes in
.agents/skills/<kebab-name>/; pi/agent skills go in
config/agents/skills/<kebab-name>/ or config/pi/skills/<kebab-name>/. Reference docs go in docs/. Active
execution plans go in plans/. Domain READMEs sit at the directory root they index.
- Draft to the rules. Write with the lint rules in mind: ATX headings, blank lines around blocks, fence languages,
relative links, no bare URLs, no em-dashes, 120-column prose.
- Lint with autofix. Run
npm run markdownlint -- <files> (or npx markdownlint-cli2 --fix '<glob>') on the
touched files first; full-suite npm run markdownlint before claiming done if the change spans many files.
- Format. Run
npx oxfmt <files> (or npm run format -- <files>) to apply prose-wrap. Re-read the diff; if oxfmt
rewrapped a paragraph, accept its choice rather than fighting it.
- Re-lint. Run
npm run markdownlint:check -- <files> (or npx markdownlint-cli2 '<glob>' without --fix) to
confirm no remaining findings. The :check script omits --fix so it surfaces anything the autofix could not
resolve.
- Verify links and paths. For any
path: reference, link to a docs file, or directory-map entry, run a quick ls
/ read to confirm the target exists. The path-references, directory-map-paths, and local-links rules will
fail otherwise.
- Stage and commit.
lint-staged re-runs both tools on commit; if either fails, fix and re-stage rather than
bypassing with --no-verify.
Validation gates
Before claiming the markdown change is done, all of these must pass:
npx markdownlint-cli2 '<changed-files-glob>' exits 0 (no --fix, so it reflects what the autofix could not
resolve).
npx oxfmt --check <files> exits 0.
- For SKILL.md: directory name matches frontmatter
name, frontmatter contains WHAT: / WHEN: / DO-NOT:, and the
body has at least one ## When to use this skill and one action-oriented section (## Workflow, ## Steps,
## Procedure, ## Diagnostic flow).
- For AGENTS.md: line count under the budget (root 120, nested 80), and the required sections are non-empty.
- For reference docs in
docs/**: ends with ## Related docs containing real links.
Quote the relevant pass output in the reply, per lint-and-test-gate.
Common pitfalls
- Bypassing oxfmt by hand-wrapping at 80 or 100 characters. The reflow runs on commit; the diff fights you next
edit. Wrap at 120.
- Setext-underline H1/H2 (
==== / ---- under a heading). MD003 wants ATX (# / ##).
- Code fences without a language tag. MD040 fails. Use
text if nothing else fits.
- Bare URLs like
https://example.com in prose. Use <https://example.com> or [anchor](https://example.com).
- Bare repo paths in prose like
dotenv/bin/git-sync. Wrap them in a markdown link to the file or use
path: dotenv/bin/git-sync. Code spans (`dotenv/bin/git-sync`) are also accepted by no-bare-repo-paths for
reference; check the rule output if unsure.
- Em-dashes in prose, especially around the
WHAT/WHEN/DO-NOT markers. The existing skills standardize on hyphens
with spaces.
- README.md inside a skill folder.
skill-authoring-guide-no-readme blocks it. Put installation notes in a
repo-level README.
- New skill subdirectories beyond
scripts/ / references/ / assets/ / evals/. The folder-layout rule rejects
anything else.
- Frontmatter description missing one of the three markers (
WHAT:, WHEN:, DO-NOT:). All three are required;
the rule is checked verbatim, so do not paraphrase the markers.
- Frontmatter
name not matching the directory name. Both must be kebab-case and identical.
- Adding
## Related docs to a SKILL.md just because reference docs need one. It is required only in docs/**.md,
not in skills.
- Editing
REFERENCE.md / README.md without running the doc-sync workflow -- markdown lint will pass, but the doc
surface will be inconsistent.
- Letting lint-staged silently fix a file you did not re-read. Always re-read after
--fix so you understand the
diff that landed.
Quick reference
| Need |
Command |
| Lint everything (with autofix) |
npm run markdownlint |
| Lint everything (check only) |
npm run markdownlint:check |
| Lint a single file (autofix) |
npx markdownlint-cli2 --fix path/to/file.md |
| Format prose (oxfmt) |
npm run format -- path/to/file.md |
| Check format only |
npm run format:check -- path/to/file.md |
| Confirm a path link resolves |
ls path/to/target or read it |
Related docs
1---2name: markdown3description: WHAT: Author and edit markdown in this dotfiles repo so it conforms to the project markdownlint config and oxfmt prose-wrap settings, and runs through `markdownlint-cli2 --fix` and `oxfmt` cleanly. WHEN: User asks to write, edit, restructure, or fix lint on any `.md` / `.mdc` file. Defer to the more specific `commit-message`, `doc-sync`, or skill/plan/AGENTS authoring guides when those apply. DO-NOT: Run prettier instead of oxfmt, mass-rewrap mid-edit, or add a `README.md` inside a skill folder.4---56# Markdown authoring and linting78Single source of truth for "is this markdown going to land cleanly" in this repo. Wraps the project markdownlint rules,9the custom `authoring-guide` and `skill-authoring-guide` rules from `@public-projects/agents-tooling`, and oxfmt's10markdown prose-wrap behavior into one workflow.1112The deep authoring conventions live in13[node_modules/@public-projects/agents-tooling/guides/skill-authoring-guide.md](../../../node_modules/@public-projects/agents-tooling/guides/skill-authoring-guide.md)14and15[node_modules/@public-projects/agents-tooling/guides/authoring-guide.md](../../../node_modules/@public-projects/agents-tooling/guides/authoring-guide.md);16read them before writing a new SKILL.md, AGENTS.md, reference doc, or plan. This skill covers the formatting and linting17surface only.1819## When to use this skill2021Apply whenever the user asks to:2223- Add or edit any `.md` / `.mdc` file in this repo (root docs, `docs/**`, `plans/**`, `.agents/skills/**`,24 `config/**/skills/**`, package READMEs, etc.).25- Fix `markdownlint-cli2` or `oxfmt` failures on a markdown file.26- Restructure or rewrap an existing markdown file.27- Convert ad-hoc markdown into something safe to commit through `lint-staged`.2829Stop and defer when the task is governed by a more specific skill:3031- Commit messages and PR descriptions -- use `commit-message`.32- `REFERENCE.md` / `README.md` doc-sync after a shell-surface change -- use `doc-sync`.33- A new SKILL.md, AGENTS.md, or active plan -- still use this skill for formatting, but the structural rules live in the34 upstream authoring guides linked above.3536## Repo configuration at a glance3738Three config files drive the rules; do not duplicate or override them in prose, just satisfy them.3940| File | What it sets |41| ------------------------------ | ----------------------------------------------------------------------------------------------------- |42| `.markdownlint.jsonc` | `default: true` (all standard rules), MD013 line length 120 (code/tables exempt), MD024 siblings-only |43| `.markdownlint-cli2.jsonc` | Loads custom `authoring-guide` + `skill-authoring-guide` rule packs, honors `.gitignore` |44| `oxfmt.config.ts` | `proseWrap: 'always'`, `printWidth: 120`, `singleQuote: true`, `trailingComma: 'all'` |45| `lint-staged.config.mjs` | On commit: `markdownlint-cli2 --fix --no-globs` then `oxfmt` for `*.{md,mdc}` |46| `research/.markdownlint.jsonc` | Research subtree relaxes MD013 to 1200 and disables MD034 -- only applies under `research/` |4748`plans/**` is in the markdownlint `ignores` list, so plan files do not get linted on commit. Still wrap at 120 and use49the same conventions; the lint exemption is for in-flight drafting, not a license to ship malformed prose.5051## Rules to satisfy5253Standard markdownlint defaults all apply. The ones that bite most often in this repo:5455- **MD003 / MD022 / MD023** -- ATX-style headings (`#`, not Setext underlines), surrounded by blank lines, no leading56 whitespace.57- **MD013 line length 120**, code blocks and tables exempt. Wrap prose at 120; do not split inside an inline code span58 if it would push the line under but break the span.59- **MD024 siblings_only** -- duplicate headings are fine across H2 sections, not within the same parent.60- **MD025** -- exactly one H1 per file. The H1 must come before the first H2.61- **MD031 / MD032** -- fenced code blocks and lists must be surrounded by blank lines.62- **MD034 no-bare-urls** -- wrap URLs in `<https://...>` or `[text](url)`. (Disabled under `research/` only.)63- **MD036** -- do not use bold/italic as a fake heading; use a real heading.64- **MD040** -- code fences need a language tag (`text` is fine for plain output, `bash` for shell, `sh` when the command65 is portable, `ts` for TypeScript, `jsonc` for commented JSON).66- **MD047** -- single trailing newline at end of file.67- **MD051** -- relative anchor links must point at real headings; rename safely.6869Custom rules from `@public-projects/agents-tooling` (see70[skill-authoring-guide.md](../../../node_modules/@public-projects/agents-tooling/guides/skill-authoring-guide.md) for71the full surface):7273- `skill-authoring-guide-frontmatter-required` / `frontmatter-shape` -- every `.agents/skills/*/SKILL.md` and74 `config/**/skills/*/SKILL.md` needs YAML frontmatter with `name` (kebab-case, matching the directory) and a75 `description` containing all three of `WHAT:`, `WHEN:`, `DO-NOT:` markers, under 1024 characters, no angle brackets.76- `skill-authoring-guide-folder-layout` -- skill subdirectories must be from the allowed set (`scripts`, `references`,77 `assets`, `evals`).78- `skill-authoring-guide-no-readme` -- never put a `README.md` inside a skill folder; use `SKILL.md`.79- `skill-authoring-guide-resource-mentions` -- if a skill has a non-empty `scripts/`, `references/`, or `assets/`80 directory, `SKILL.md` must mention it.81- `skill-authoring-guide-skill-required-sections` -- SKILL.md needs both a "when to use" section (e.g.82 `## When to use this skill`) and an action-oriented section (`## Steps`, `## Workflow`, `## Procedure`,83 `## Diagnostic flow`, etc.).84- `authoring-guide-doc-size-budget` -- soft caps: root AGENTS.md 120 lines, nested AGENTS.md 80, reference docs in85 `docs/` 300, active plans 400, skills 500. Trim or split when you exceed.86- `authoring-guide-non-empty-required-sections` -- AGENTS.md `Commands` / `Directory map` / `Key patterns` /87 `Boundaries` / `References` sections must have content; reference docs in `docs/**` must include `Related docs`.88- `authoring-guide-doc-opening-structure` -- docs start with an H1 and an early scope-statement paragraph.89- `authoring-guide-related-docs-last` / `-required` -- in reference docs, `## Related docs` is required and must be the90 final H2.91- `authoring-guide-no-bare-repo-paths` / `path-references` / `local-links` -- repo paths in prose must be markdown links92 or `path:` references, links must be relative, and `path:` references must point at real files.93- `authoring-guide-directory-map-table` / `-paths` -- AGENTS.md `## Directory map` is a `Path | Purpose` table whose94 paths resolve.95- `authoring-guide-boundaries-shape` -- AGENTS.md `## Boundaries` uses `Always`, `Ask first`, `Never` markers.96- `authoring-guide-commands-shape` -- AGENTS.md `## Commands` uses a bash fence or described command bullets.9798## Style conventions to layer on top of lint99100Lint passes are necessary but not sufficient. Match the existing tone:101102- **Imperative, concrete, low-fluff prose.** No marketing voice, no rhetorical asides; see the `commit-message` skill103 for the rule set, applied here too.104- **No em-dashes (`—`) anywhere.** Use a regular hyphen with spaces around it (`-`) or restructure the sentence.105 Existing skills are written this way; oxfmt does not auto-convert.106- **Tables for tabular data, lists for steps, fenced code for commands.** Do not encode steps as a numbered table; do107 not encode a table as a bulleted list.108- **Single quotes in YAML frontmatter** when the description contains colons (which it always does, due to `WHAT:` /109 `WHEN:` / `DO-NOT:`). Escape inner single quotes by doubling them (`it''s`). Existing skills use this; do not switch110 to double quotes mid-file.111- **Relative links** to real files (`../../../node_modules/.../guide.md`, `../bats-test-conventions/SKILL.md`). No112 absolute paths, no bare URLs to repo files.113- **Code fence languages**: `bash` for shell snippets the user runs, `sh` only when truly POSIX, `text` for opaque114 output, `ts` / `tsx` / `jsonc` / `yaml` / `toml` as appropriate. Never leave a fence untagged.115- **One blank line between block elements.** Two blanks is not "more readable", it is a lint failure waiting to happen.116117## oxfmt and prose wrap118119`oxfmt` runs after `markdownlint-cli2 --fix` on commit, so it reflows prose last:120121- `proseWrap: 'always'` rewraps each paragraph to fit `printWidth: 120`. Do not hand-wrap to a narrower width to "look122 nicer"; oxfmt will undo it and the diff churns.123- Lists, fenced code, and tables are not reflowed. Keep table rows as one logical line.124- Hard line breaks (two trailing spaces or `\`) are preserved; use them only when meaningful.125- Inline HTML, comments (`<!-- -->`), and link reference definitions are left alone.126127If oxfmt reflows your wrapping on the first run after editing, that is expected; let it win and move on.128129## Workflow1301311. **Read before writing.** For an edit, `read` the file (and any neighbors) so you match local voice and section132 structure. For a new SKILL.md / AGENTS.md / plan / docs reference, read the relevant authoring guide in133 `node_modules/@public-projects/agents-tooling/guides/` first.1342. **Pick the right home.** SKILL.md goes in `.agents/skills/<kebab-name>/`; pi/agent skills go in135 `config/agents/skills/<kebab-name>/` or `config/pi/skills/<kebab-name>/`. Reference docs go in `docs/`. Active136 execution plans go in `plans/`. Domain READMEs sit at the directory root they index.1373. **Draft to the rules.** Write with the lint rules in mind: ATX headings, blank lines around blocks, fence languages,138 relative links, no bare URLs, no em-dashes, 120-column prose.1394. **Lint with autofix.** Run `npm run markdownlint -- <files>` (or `npx markdownlint-cli2 --fix '<glob>'`) on the140 touched files first; full-suite `npm run markdownlint` before claiming done if the change spans many files.1415. **Format.** Run `npx oxfmt <files>` (or `npm run format -- <files>`) to apply prose-wrap. Re-read the diff; if oxfmt142 rewrapped a paragraph, accept its choice rather than fighting it.1436. **Re-lint.** Run `npm run markdownlint:check -- <files>` (or `npx markdownlint-cli2 '<glob>'` without `--fix`) to144 confirm no remaining findings. The `:check` script omits `--fix` so it surfaces anything the autofix could not145 resolve.1467. **Verify links and paths.** For any `path:` reference, link to a docs file, or directory-map entry, run a quick `ls`147 / `read` to confirm the target exists. The `path-references`, `directory-map-paths`, and `local-links` rules will148 fail otherwise.1498. **Stage and commit.** `lint-staged` re-runs both tools on commit; if either fails, fix and re-stage rather than150 bypassing with `--no-verify`.151152## Validation gates153154Before claiming the markdown change is done, all of these must pass:155156- `npx markdownlint-cli2 '<changed-files-glob>'` exits 0 (no `--fix`, so it reflects what the autofix could not157 resolve).158- `npx oxfmt --check <files>` exits 0.159- For SKILL.md: directory name matches frontmatter `name`, frontmatter contains `WHAT:` / `WHEN:` / `DO-NOT:`, and the160 body has at least one `## When to use this skill` and one action-oriented section (`## Workflow`, `## Steps`,161 `## Procedure`, `## Diagnostic flow`).162- For AGENTS.md: line count under the budget (root 120, nested 80), and the required sections are non-empty.163- For reference docs in `docs/**`: ends with `## Related docs` containing real links.164165Quote the relevant pass output in the reply, per `lint-and-test-gate`.166167## Common pitfalls168169- **Bypassing oxfmt** by hand-wrapping at 80 or 100 characters. The reflow runs on commit; the diff fights you next170 edit. Wrap at 120.171- **Setext-underline H1/H2** (`====` / `----` under a heading). MD003 wants ATX (`#` / `##`).172- **Code fences without a language tag.** MD040 fails. Use `text` if nothing else fits.173- **Bare URLs** like `https://example.com` in prose. Use `<https://example.com>` or `[anchor](https://example.com)`.174- **Bare repo paths in prose** like `dotenv/bin/git-sync`. Wrap them in a markdown link to the file or use175 `path: dotenv/bin/git-sync`. Code spans (`` `dotenv/bin/git-sync` ``) are also accepted by `no-bare-repo-paths` for176 reference; check the rule output if unsure.177- **Em-dashes in prose, especially around the `WHAT/WHEN/DO-NOT` markers.** The existing skills standardize on hyphens178 with spaces.179- **README.md inside a skill folder.** `skill-authoring-guide-no-readme` blocks it. Put installation notes in a180 repo-level README.181- **New skill subdirectories** beyond `scripts/` / `references/` / `assets/` / `evals/`. The folder-layout rule rejects182 anything else.183- **Frontmatter description missing one of the three markers** (`WHAT:`, `WHEN:`, `DO-NOT:`). All three are required;184 the rule is checked verbatim, so do not paraphrase the markers.185- **Frontmatter `name` not matching the directory name.** Both must be kebab-case and identical.186- **Adding `## Related docs` to a SKILL.md just because reference docs need one.** It is required only in `docs/**.md`,187 not in skills.188- **Editing `REFERENCE.md` / README.md without running the `doc-sync` workflow** -- markdown lint will pass, but the doc189 surface will be inconsistent.190- **Letting lint-staged silently fix a file you did not re-read.** Always re-read after `--fix` so you understand the191 diff that landed.192193## Quick reference194195| Need | Command |196| ------------------------------ | --------------------------------------------- |197| Lint everything (with autofix) | `npm run markdownlint` |198| Lint everything (check only) | `npm run markdownlint:check` |199| Lint a single file (autofix) | `npx markdownlint-cli2 --fix path/to/file.md` |200| Format prose (oxfmt) | `npm run format -- path/to/file.md` |201| Check format only | `npm run format:check -- path/to/file.md` |202| Confirm a path link resolves | `ls path/to/target` or `read` it |203204## Related docs205206- [Skill authoring guide](../../../node_modules/@public-projects/agents-tooling/guides/skill-authoring-guide.md) -207 Source of truth for SKILL.md frontmatter, layout, and validation rules.208- [Documentation authoring guide](../../../node_modules/@public-projects/agents-tooling/guides/authoring-guide.md) -209 AGENTS.md, reference doc, and plan structure rules enforced by the custom markdownlint pack.210- [commit-message skill](../commit-message/SKILL.md) - Subject + body rules that also apply to markdown prose voice.211- [doc-sync skill](../doc-sync/SKILL.md) - Pair this skill with `doc-sync` whenever a code change touches the public212 shell surface.213- [lint-and-test-gate skill](../lint-and-test-gate/SKILL.md) - Repo-wide rule: quote the pass output before claiming214 done.