Repository navigation
Releases: Cadasto/docs-editing-plugin
Release list
v0.4.1
A docs-only release: the README follows the sibling go-coding layout without the Status column, each docs/ page names its reader, and statements that had drifted from the tree are corrected. No component changes.
Install with /plugin install docs-editing@cadasto.
Changed
- Docs:
README.mdgains a badge row, a requirements paragraph, a table of contents and aFeatureslist;InstallandComponent surfacebecomeInstallationandComponents, and the scope section folds into the intro andHow it decides. - Docs:
README.mdlinks the validator's four plugin-specific invariants indocs/testing.mdinstead of restating them. - Docs: each
docs/page opens with a paragraph naming its reader and purpose. - Docs:
docs/testing.mdadds a/humanizesmoke test and checks that/docs-lint-setupcopies theai-tellsstyle. - Docs:
docs/versioning.mdadds a release step to update the README version badge. - Docs:
README.mddrops theStatuscolumn fromComponentsand foldsThe rule that defines itintoHow it decides. - Docs:
README.mdaddsRoutingandCursor parityfeatures, a grounding-sources paragraph, and aComponentsrow forreferences/vale.ini. - Docs:
README.mdstates that both agents holdBashbut notWriteorEdit.
Fixed
- Docs:
docs/install.mdno longer listsgo installas a Vale install route, and names one prose linter instead of two. - Docs:
docs/testing.mdsays to load a working copy with--plugin-dir, not install it. - Docs:
README.mdlimits the claims-rule feature to the skills that write or edit prose. - Docs:
README.mdcredits the read-the-repo-first step to the router and Cursor rule, not to every skill. - Docs:
docs/install.mdnames the Cursor-only rule among host differences and the_vale.inialternative. - Docs:
docs/testing.mdsays a missing agenttools:key is an error too. - Docs:
docs/testing.mdsays CI runsscripts/validate.pydirectly, notscripts/validate.sh. - Docs:
docs/authoring.mdlistsai-tells.mdamong the references. - Docs:
docs/install.mdcalls the prose-lint hook by name instead of "save hook".
v0.4.0
Adds /humanize and the ai-tells catalogue and Vale style, and makes the house style em-dash free: the assistant writes none, a human author's deliberate dash is kept, and the plugin's own prose now follows the rule.
Install with /plugin install docs-editing@cadasto.
Added
- Skills:
humanizeremoves AI tells from existing prose, with a--report-onlymode that names patterns and never judges authorship. - References:
references/ai-tells.md, the canonical catalogue of AI tells ranked by strength, with the house em-dash rule and the when-not-to-act list. - References: the
ai-tellsVale style inreferences/vale-styles/ai-tells/:chatbot-residue,tool-markup(error),signposting,stock-vocabulary,vague-attribution(warning),negation-contrast,em-dash(suggestion). Tested against Vale 3.18.0 with positive and false-positive fixtures. - References:
vocab-accept.txtacceptschatbot.
Changed
- References:
style-guide.md§3 forbids em dashes in assistant-written prose and keeps a human author's; §2 points toai-tells.md. - References:
vale.iniaddsai-tellstoBasedOnStyles. - Skills:
/docs-lint-setupcopies theai-tellsstyle intostyles/ai-tells/and keeps it tracked in.gitignore. - Skills:
docs-editingroutes AI-tell requests tohumanizeand refuses authorship verdicts and detector evasion. - Skills:
copy-editingnameshumanizein its anti-trigger. - References: the good examples in
claims-and-evidence.md§3 andmarketing-copyuse a colon instead of an em dash. - Skills:
copy-editing,technical-writingandmarketing-copyapply the strong tells and the em-dash rule. - Agents:
prose-reviewerreports AI tells in its style pass. - Hooks:
session-start.shannounces/humanizeand the em-dash rule. - Rules:
docs-editing-context.mdcnames/humanizeand the em-dash rule. - Docs: em dashes removed from every skill, agent, reference, rule, doc,
README.md,AGENTS.mdand this changelog; lone—table cells in the router readnone. - Manifests:
descriptionnames AI-tell cleanup and uses a colon instead of an em dash.
v0.3.0
Makes the shipped Vale setup usable out of the box, and corrects three claims this repo's own docs made about tooling it had not actually run.
Install with /plugin install docs-editing@cadasto.
The linter now works on first run
A seeded vocabulary. /docs-lint-setup used to touch an empty accept.txt, so Vale.Spelling ran against a general dictionary with no project terms and reported ordinary jargon — repo, config, frontmatter, validator, stderr — as misspellings, burying every real style finding underneath. On this plugin's own tree that was 190 spelling alerts. The new references/vocab-accept.txt ships as the seed and leaves 11, all product names and cited proper nouns, which is the category a repo appends for itself.
Entries are case-tolerant regexes ([Cc]onfigs?). Vale.Terms requires a term to appear exactly as listed, so a bare lowercase entry silences the spelling warning and then reports every sentence-initial capital instead — one class of false positive traded for another. A product name still goes in with its exact capitalisation, where that rule enforcing it is the point.
The seed carries no British/American spelling pairs, because Vale's dictionary already accepts both: behaviour, organisation, initialise, licence, and catalogue all pass unaided.
Google.Quotes is off. It enforces American punctuation-inside-quotes while the house style is British, which places the comma or period outside unless it belongs to the quote — so the rule fired on correct prose. Seven error-level false positives on this repo's docs, now zero.
The vocabulary is no longer named after an organisation. Vocab = Cadasto became Vocab = Project, a neutral default a repo can rename; scaffolding no longer creates a Cadasto/ directory in someone else's tree. /docs-lint-setup takes the name as a VOCAB variable used for both the directory and the config value, so the two cannot drift apart.
Corrected claims
Each of these was stated in the docs without the tool having been run. All three are now verified against Vale 3.18.0 and cite that version.
valedoes not warn about an unknown rule name. The docs said it "warns but exits 0". The exit-0 half was right; it produces no output at all — empty stderr — which is exactly what makes a renamed upstream rule dangerous. An unknown style package is the loud case:E100 [loadStyles], exit 2. So a brokenPackages =line is caught for you and a broken rule line is not.vale syncdoes not warn about a missing vocabulary directory. It reports success and exits 0. The lint then fails hard withE100 [vocab] … vocabulary not foundand exit 2, so the config reads as healthy until someone lints.- The validator enforces four invariants, not two.
README.mdclaimed two and named two — reference resolution, markdown links, tool grants, and doc sync — whiledocs/testing.mdalready said four.
Documentation
Sentence-case headings, answer-first openings, and the rules the reference config escalates to error cleared from this repo's own prose. AGENTS.md no longer pins a version: it read v0.1.1, stale by two releases and a version never released at all. CHANGELOG.md and the git tags own that fact.
Full changelog: v0.2.0...v0.3.0
v0.2.0
Tightens the plugin to a single prose linter and makes its always-on surface cheap.
Install with /plugin install docs-editing@cadasto — the catalog entry is pinned to this tag.
Removed
The markdownlint integration, entirely. Deleted references/markdownlint.jsonc and removed the tool from docs-lint-setup (now Vale-only), copy-editing, technical-writing, the docs-editing router, prose-reviewer, the Cursor rule, and both hooks. It required a Node toolchain that could not be verified, and prescribing a tool the assistant cannot run contradicts this plugin's own advice-equals-tooling principle. Vale is now the only linter shipped.
Markdown structure rules therefore have no enforcer. style-guide.md §6 no longer claims otherwise — those rules are conventions applied by judgment, and a consuming repo's own structural linter takes precedence.
Changed
Every skill description rewritten for the skill-listing budget. Claude Code caps the always-on skill listing at contextWindow × 4 × skillListingBudgetFraction characters. Over budget it does not shorten descriptions — it drops them whole, so a skill degrades to a bare name with nothing to trigger on. Selection is greedy by usage priority (usageCount × 0.5^(days/7)), which is exactly 0 for a never-used skill, so a new plugin's skills compete last and length is the only lever they control.
Trigger phrases and sibling disambiguation were kept; the lead-in restating the skill name and the mechanism prose were dropped. Total description weight falls from 3,635 to 1,861 characters — measured over an identical 84-skill listing, 35,560 → 33,786, taking the plugin from 10.8% of the listing for 8.3% of the skills to 6.1%.
Hooks. prose-lint-on-save.sh is Vale-only and opt-in on .vale.ini alone; session-start.sh no longer treats a markdownlint config as a docs-workspace signal.
Docs. docs/install.md records Vale's exit codes (0 clean, 1 findings, 2 config error) and that the release binary is the working install route — go install fails to build against tree-sitter.
Fixed
The agents were described as read-only while holding Bash. prose-reviewer and seo-auditor are now report-only: no Write/Edit in the tool grant, with no-edit stated as a contract the body keeps rather than a sandbox that enforces it. The v0.1.0 notes and README carried the inaccurate wording.
marketing-copy prescribed vale without declaring Bash, so its own pre-handover self-check could not run without a permission prompt its sibling skills avoid.
The documented local-install command did not exist. claude plugin add is not a subcommand — and because claude plugin <unknown> prints general help and exits 0, the wrong command never failed visibly. Replaced with claude --plugin-dir <path> (session-scoped) across README.md, docs/install.md, docs/versioning.md, and AGENTS.md.
Added
Tool-grant invariants in scripts/validate.py. A component whose body prescribes a shell command must declare Bash; an agent must not declare Write/Edit, nor call itself "read-only" while holding a write-capable tool. Both are negative-tested against the defects above — the advice/capability mismatches that shipped in 0.1.0 now fail CI.
Full changelog: v0.1.0...v0.2.0
v0.1.0
First build of the Docs Editing Plugin — documentation, editing, and content standards for AI coding assistants, targeting both Claude Code and Cursor from a single shared component set. Pure Markdown + JSON: no build step, no MCP server.
The rule that defines it
A claim that cannot be traced to a source does not ship.
Generative copy tooling fails in one predictable way: asked to make a page more persuasive, it invents the persuasion — statistics, customer counts, testimonials, awards, urgency. Every component here substitutes the observable mechanism instead, and treats hedging ("up to", "designed to", "teams report") as still a violation rather than a repair.
Scope
Prose written for people — documentation, guides, references, page and marketing copy, changelogs, release notes, site metadata, llms.txt.
Agent-instruction files (AGENTS.md, CLAUDE.md, .cursorrules, rule and skill definitions) are read for a repository's conventions and never authored or rewritten. That genre addresses a model rather than a reader, which inverts several rules here — repetition becomes deliberate, hard constraints must stay hard.
Components
Skills (7) — docs-editing (always-on router) plus /technical-writing, /copy-editing, /marketing-copy, /seo-audit, /ai-seo, /docs-lint-setup.
Agents (2, read-only) — prose-reviewer for what linters cannot see (unsourced claims, doc-kind bleed, stale inventories); seo-auditor for a discoverability sweep with a mandatory coverage statement.
References (4 + 2 configs) — the canonical rules every component cites: claims and evidence, house style, document kinds (Diátaxis), SEO checklist; plus reference vale.ini and markdownlint.jsonc.
Hooks (2, dual-host) — a session-start context line, and a prose-lint-on-save reporter that is advisory and never rewrites the file, and stays silent unless the repo carries its own linter config.
Cursor rule — docs-editing-context.mdc.
Install
Claude Code:
/plugin marketplace add Cadasto/plugin-marketplace
/plugin install docs-editing@cadasto
Cursor: add this repository as a plugin (Settings → Plugins). See docs/install.md.
Prerequisites: none. Installing Vale and markdownlint-cli2 and running /docs-lint-setup makes the mechanical half of the house style machine-enforced.
Validation
scripts/validate.py is stdlib-only and enforces manifest parity, frontmatter (including the YAML trap that silently drops all metadata, and the allowed-tools: foot-gun that would leave an agent inheriting every tool), plus three project invariants: reference citations resolve, every relative Markdown link and #anchor resolves, and every skill and agent is wired into both the router and the session-start surface.
Known limitation: references/vale.ini names rules from upstream style packages, and vale warns but exits 0 on an unknown rule name — so an upstream rename silently stops that rule applying. This is not yet checked automatically; see docs/versioning.md.