The short version of how a change moves through this repo:
- Start from an issue. File one with the template that fits the work (epic, story, bug,
technical-task, spike, or chore). The
create-issueskill walks you through checking for duplicates, choosing a template, wording it for its audience, reviewing it, labeling it, and filing it. Every template opens with an "Issue readiness state" checklist that tracks the issue's lifecycle: reviewed by a human engineer, refinement complete, all open questions answered, post-refinement changes reviewed by a human, and ready for work. Tick the boxes as the issue advances; therefine-issueskill manages the middle three and requires the initial human review (at least one human comment on the issue) before it will run. - Branch. Use the naming shape in Branching below.
- Make your changes. Keep commits terse and explain why, not what. Wire up the commit template (see Commit message template).
- Review, then open a draft PR. Run the
review-draftskill on the PR description, then open the PR as a draft and fill in the template (see Opening pull requests). Thecreate-prskill walks you through branch naming, the review, and opening the PR. - Mark ready. Move the PR out of draft once it is self-reviewed and CI passes.
Run review-draft before any durable artifact goes up: an issue, a PR description, or a commit
message set. It checks quality, template adherence, voice, punctuation, and house style. The rest of
this document covers each step in detail.
Requires Python 3.13.
pip install -r scripts/requirements.txt pytestThis repo ships a .gitmessage file that scaffolds commit messages with the expected format and a few guiding comments. Wire it up once per clone:
git config commit.template .gitmessageAfter this, git commit (without -m) will open your editor pre-populated with the template. The comment lines (#) are stripped from the final message.
Use the team's standard branch shape:
<your-github-username>/<issue-number>-<short-kebab-description>
Example: jeffhorn/42-add-github-templates
If the branch lives in a different repo than the originating issue, prefix the branch description with the originating project:
jeffhorn/oscer-42-short-description
Open all pull requests as drafts initially. Mark ready for review when the work is complete and self-reviewed.
GitHub renders issue descriptions, PR descriptions, and comments as GitHub-Flavored Markdown, and in
that context it treats a single newline inside a paragraph as a line break (unlike a .md file
rendered on github.com, where single newlines collapse into a space). So a body that was hard-wrapped
at 72 or 80 columns renders as ragged, broken lines.
Write one line per paragraph and let it soft-wrap. Separate paragraphs with a blank line. Lists, tables, and fenced code blocks keep their own line structure and are unaffected. This is the opposite of a commit message body, which is plain text and should wrap at 72 columns (see the commit template). The distinction is by artifact: wrap commit bodies, do not wrap issue or PR bodies.
python -m scripts.lint_manifest # validate sources.md
python -m scripts.lint_docs # validate doc frontmatter
python -m scripts.build_graph # write docs/INDEX.md and docs/graph.jsonRun these in order before pushing. CI runs them on every relevant change. If build_graph produces a diff in docs/INDEX.md or docs/graph.json, commit the regenerated files or CI will fail.
python -m pytest -v