Skip to content

akurganow/prose-discipline

v2.2.0MIT

An engineering prose standard for agent-written text: short active sentences, plain words, comments that explain why, and labelled review comments.

prose-discipline

An engineering prose standard for agent-written text: short active sentences, plain words, comments that explain why, and labelled review comments.

Install

Claude Code

/plugin marketplace add Akurganow/pegboard
/plugin install prose-discipline@pegboard

Source: Claude Code documentation, https://code.claude.com/docs/en/discover-plugins. CI installs it on Ubuntu, macOS and Windows.

Codex

codex plugin marketplace add Akurganow/pegboard --ref main
codex plugin add prose-discipline@pegboard

Source: Codex documentation, https://developers.openai.com/plugins/build/plugins, for marketplace add; Codex source, plugin_cmd.rs, for plugin add. CI installs it on Ubuntu, macOS and Windows.

Oh-My-Pi

omp plugin marketplace add Akurganow/pegboard
omp plugin install prose-discipline@pegboard

Source: Oh-My-Pi documentation, docs/marketplace.md. CI installs it on Ubuntu, macOS and Windows.

Hermes

hermes plugins install Akurganow/pegboard/plugins/prose-discipline --no-enable
hermes plugins list
hermes plugins enable prose-discipline

Keep the plugins/prose-discipline suffix: without it Hermes copies the whole repository, and its two-level scan finds no package.

Source: Hermes documentation, developer-guide/plugins/index.md, for the commands; Hermes source, plugins_cmd.py (_resolve_git_url), for the subdirectory form and what happens without it. CI installs it on Ubuntu and macOS.

Cursor

Cursor's documentation names no command that installs from a repository. It names three routes:

  • Public marketplace: open Customize, find the plugin, select Install. A plugin appears there only after Cursor reviews a submitted repository, and this repository claims no listing.
  • Team marketplace, on Teams and Enterprise plans: in Dashboard, Plugins & MCPs, Team Marketplaces, select Add Marketplace, then Import from Repo, and paste https://github.com/Akurganow/pegboard. Developers then install from Customize.
  • Local: copy bundles/prose-discipline to ~/.cursor/plugins/local/prose-discipline, then restart Cursor or run Developer: Reload Window.

Source: Cursor documentation, Plugins, read 2026-11-04, for the three routes; Plugins reference, read 2026-11-04, for the submission and review. CI does not install it.

OpenClaw

openclaw plugins install prose-discipline --marketplace Akurganow/pegboard

Source: OpenClaw documentation, docs/cli/plugins/install.md. OpenClaw reads this repository's .claude-plugin/marketplace.json (OpenClaw source, marketplace.ts). CI does not install it.

Kiro

No install command is given. Kiro's documentation says Powers follow the Agent Plugins specification, and plugins/prose-discipline/plugin.json carries every field the documentation requires. The documentation does not say how Kiro finds several packages in one repository. CI does not install it.

Source: Kiro documentation, Create a power and Installation, read 2026-11-04.

Usage

The standard needs no prompt. Claude Code, Cursor and Oh-My-Pi load it into every session on their own. Codex runs its hooks once you trust them (hooks, documentation). Hermes loads it once you pin the skill, as its section below shows. OpenClaw loads the skill only.

To check existing text against the standard, ask for it:

Check this commit message against the house style: "Updated some stuff in auth so it works better now."

The agent reports each finding with the rule it breaks and the smallest fix. In an interactive session it applies the fixes after you approve them.

Each client gets the same core rules by its own documented route:

ClientRouteWhat you do
Claude CodeSessionStart and SubagentStart hooksnothing
Codexthe same hooks, declared in the Codex manifest, .codex-plugin/plugin.json, as hooks: ./hooks/codex.jsontrust the hooks, again after each release
Cursorthe .mdc rule, with alwaysApply: truenothing
Oh-My-Pithe .mdc rule, applied to every requestnothing
Hermesthe skill, pinned with skills.auto_loadadd the lines below to config.yaml
OpenClawthe skill onlynothing

Claude Code

The SessionStart hook prints the short form of the core rules as plain text, and Claude Code adds that text to the context. The short form ends by saying that the full rules, with their reasons and examples, are in the house-style skill. The hook also runs on a resume, a fork, /clear and every compaction, so the rules come back after /clear or a compaction removes them. The SubagentStart hook hands each subagent the same text as additionalContext. Claude Code does not load a plugin's CLAUDE.md. Its documentation says to put instructions for the context in a skill.

Sources, all Claude Code documentation:

  • Hooks, the SessionStart and SubagentStart sections: the SessionStart matchers, and plain stdout and additionalContext as context.
  • Hooks guide, "Re-inject context after compaction".
  • Plugins reference, "Standard layout": a CLAUDE.md at the plugin root is not loaded as context, and instructions for the context go in a skill.

Codex

The Codex manifest, .codex-plugin/plugin.json, declares "hooks": "./hooks/codex.json". A declared hooks entry replaces Codex's default hooks/hooks.json, so Codex never runs Claude Code's hooks file. The file holds the SessionStart and SubagentStart hooks, each with a Windows command. Codex skips a plugin's hooks until you review and trust the current hook definition. When hooks are new or changed, Codex opens a "Hooks need review" prompt at startup. Its options include "Review hooks" and "Trust all and continue". Codex ties that trust to a hash of the whole installed plugin, and every release changes version in the manifests, so it asks again after each release. Codex also lists every installed skill and tells the model to use one whose description matches the task.

Sources:

  • Codex documentation, plugin packaging: legacy packages declare hooks in .codex-plugin/plugin.json, loading an enabled plugin's hooks, and hook trust.
  • Codex documentation, hooks: the SessionStart and SubagentStart events, commandWindows, and a new review after a plugin update.
  • Codex source, loader.rs L1220–L1275: a declared hooks entry replaces the default hooks/hooks.json.
  • Codex source, plugin_trust.rs and plugin_fingerprint.rs, at rust-v0.166.0: trust is bound to a hash of every file in the installed plugin.
  • Codex source, catalog_prompt.rs: the skill trigger rule.
  • Codex source, startup_hooks_review.rs: the startup prompt that asks you to trust new or changed hooks.

Oh-My-Pi

Oh-My-Pi reads rules/prose-discipline.mdc from the bundle that a marketplace install copies. The file's alwaysApply: true puts its full text into the system prompt of every request. The file names no agents, so subagents get it too.

Sources:

Cursor

Cursor reads the same rules/prose-discipline.mdc from the bundle. Its default discovery takes every .mdc file in rules/, and a rule with alwaysApply: true applies to all files. Cursor's default discovery also parses hooks/hooks.json, where the bundle holds Claude Code's hooks file. The documentation does not say whether Cursor accepts that file, and nothing here ran it. CI does not install the plugin into Cursor.

Source: Cursor documentation, Plugins reference, component discovery and rules, read 2026-11-04.

OpenClaw

OpenClaw loads this plugin's skill and nothing else. It picks the Codex manifest when a bundle holds several, detects hooks/hooks.json without running it, reads a Codex manifest's hooks value as a list of hook directories, so hooks/codex.json loads nothing, and reads no plugin-root rules/. CI does not install the plugin into OpenClaw.

Sources, at OpenClaw commit db6ac58:

Hermes

Hermes loads plugin.json and skills/ from this package, and lists no plugin skill in its system prompt. To keep the standard active, pin the skill with skills.auto_load in config.yaml. Merge the lines into an existing skills: block:

skills:
  auto_load:
    - agent-plugin-prose-discipline-cf518319:house-style

Hermes then puts the whole skill, core rules included, into the system prompt of every new session and marks it as active guidance. The name has the form agent-plugin-<slug>-<hash>:house-style. The slug is plugin.json's name in lower case, with each character other than an ASCII letter, digit, _ or - turned into -. Hermes then strips leading and trailing - and _. The hash is the first eight hex digits of the SHA-256 of that name. Hermes builds the namespace from that name for a package installed directly under the plugins directory. Source: Hermes source, hermes_cli/plugins_manifest.py lines 60–69 and lines 455–467.

hermes plugins install names the package directory after the manifest name and puts it directly under the plugins directory. Source: Hermes source, hermes_cli/plugins_cmd.py lines 873–876 and line 210.

Sources:

What's inside

PathWhat it is
src/prose-discipline/rules/prose-discipline.mdthe core rules, the one source of every client's copy, with a hook-text region that holds the short form the hooks print
src/prose-discipline/skills/house-style/SKILL.mdthe skill: a generated copy of the core rules, the checking procedure, and which reference to read when
src/prose-discipline/skills/house-style/references/structural rules, vocabulary, slop pruning, comment hygiene, artifact formats, and a calibration corpus
bundles/prose-discipline/hooks/hooks.jsonClaude Code's SessionStart and SubagentStart hooks
bundles/prose-discipline/hooks/codex.jsonCodex's two hooks, each with a Windows command
bundles/prose-discipline/rules/prose-discipline.mdcthe full rules without the short-form region, with alwaysApply: true, for Cursor and Oh-My-Pi
plugins/prose-discipline/plugin.jsonthe Agent Plugins 1.0.0 manifest, for Hermes and Kiro
LICENSEthe MIT license

bundles/ and plugins/ are generated from src/. No file in the package is a script.

Changes to the hand-written files above must pass this standard, so the package stays an example of what it asks for.

Requirements and network

The hooks print text with a literal echo or printf. They read no file, name no variable and run no script, so they need no awk and no runtime. On Windows, Claude Code runs shell-form hooks in Git Bash when it is installed, and in PowerShell otherwise. Source: Claude Code documentation, hooks, "Exec form and shell form". The SubagentStart command uses printf. Whether PowerShell has a printf is untested, so without Git Bash that command may print nothing, and a subagent then gets no rules. Codex runs cmd.exe on Windows, and its file carries a commandWindows for it. The skill still ships.

The builder limits the short form, the text the hooks print. It must stay under 8,000 bytes, because Codex's default 2,500-token threshold for hook context and Claude Code's 10,000-character cap would otherwise cut it (Codex hooks, Claude Code hooks, both documentation). Its Windows command must stay under 8,191 characters, the command-line limit of cmd.exe (Microsoft, documentation). The builder also refuses characters that sh, PowerShell or cmd.exe would read as something other than text. About this repository's design gives each limit and its reason.

The package makes no network requests, needs no credentials and writes no files. It adds no MCP servers and no settings files.

Boundaries

  • It governs text mechanics, not whether a document serves its reader.
  • It governs durable artifacts, not the register of a live conversation.
  • It is not a code linter. Behaviour-level checks belong to a linter. For the design of the code itself, use design-review or cognitive-load.
  • It states the standard once per context and never blocks a reply. There is no checker script: enforcement is model judgement over rule texts a person can read and argue with.

License

MIT. See LICENSE.

Help

See SUPPORT.md.