Contributor-First PR Merge
HKUDS/OpenHarness
Merges external GitHub pull requests while keeping the original author credited, and fixes conflicts after the merge instead of rewriting the contribution.
Checks for newer pm-skills releases, compares local vs. An agent skill from product-on-purpose/pm-skills.
$ npx skills add product-on-purpose/pm-skills --skill utility-update-pm-skills -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install product-on-purpose/pm-skills utility-update-pm-skills --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/product-on-purpose/pm-skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/utility-update-pm-skills .claude/skills/utility-update-pm-skills && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "utility-update-pm-skills" agent skill from https://github.com/product-on-purpose/pm-skills/tree/main/skills/utility-update-pm-skills into .claude/skills/utility-update-pm-skills/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "utility-update-pm-skills", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/product-on-purpose/pm-skills/tree/main/skills/utility-update-pm-skillsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add product-on-purpose/pm-skills --skill utility-update-pm-skills -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install product-on-purpose/pm-skills utility-update-pm-skills --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/product-on-purpose/pm-skills.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/utility-update-pm-skills .agents/skills/utility-update-pm-skills && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "utility-update-pm-skills" agent skill from https://github.com/product-on-purpose/pm-skills/tree/main/skills/utility-update-pm-skills into .agents/skills/utility-update-pm-skills/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "utility-update-pm-skills", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add product-on-purpose/pm-skills --skill utility-update-pm-skills -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install product-on-purpose/pm-skills utility-update-pm-skills --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/product-on-purpose/pm-skills.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/utility-update-pm-skills .cursor/skills/utility-update-pm-skills && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "utility-update-pm-skills" agent skill from https://github.com/product-on-purpose/pm-skills/tree/main/skills/utility-update-pm-skills into .cursor/skills/utility-update-pm-skills/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "utility-update-pm-skills", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/product-on-purpose/pm-skills.git --path skills/utility-update-pm-skills--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add product-on-purpose/pm-skills --skill utility-update-pm-skills -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install product-on-purpose/pm-skills utility-update-pm-skills --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/product-on-purpose/pm-skills.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/utility-update-pm-skills .gemini/skills/utility-update-pm-skills && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "utility-update-pm-skills" agent skill from https://github.com/product-on-purpose/pm-skills/tree/main/skills/utility-update-pm-skills into .gemini/skills/utility-update-pm-skills/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "utility-update-pm-skills", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install product-on-purpose/pm-skills utility-update-pm-skillsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add product-on-purpose/pm-skills --skill utility-update-pm-skills -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/product-on-purpose/pm-skills.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/utility-update-pm-skills .github/skills/utility-update-pm-skills && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "utility-update-pm-skills" agent skill from https://github.com/product-on-purpose/pm-skills/tree/main/skills/utility-update-pm-skills into .github/skills/utility-update-pm-skills/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "utility-update-pm-skills", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add product-on-purpose/pm-skills --skill utility-update-pm-skills -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install product-on-purpose/pm-skills utility-update-pm-skills --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/product-on-purpose/pm-skills.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/utility-update-pm-skills .opencode/skills/utility-update-pm-skills && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "utility-update-pm-skills" agent skill from https://github.com/product-on-purpose/pm-skills/tree/main/skills/utility-update-pm-skills into .opencode/skills/utility-update-pm-skills/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "utility-update-pm-skills", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
utility-update-pm-skillsChecks for newer pm-skills releases, compares local vs. An agent skill from product-on-purpose/pm-skills.
Utility Update Pm Skills is an agent skill from product-on-purpose/pm-skills. Checks for newer pm-skills releases, compares local vs. latest version, previews what would change, and updates local files after user confirmation. Generates a structured update report documenting changed files, new capabilities, and the value delta between versions. Use when you want to bring a local pm-skills installation up to date.
Its SKILL.md is about 3.6k tokens, which your agent loads only when the skill is triggered. The skill folder holds 6 other files, including reference files (for example `HISTORY.md`, `evals/trigger-fixtures.json` and `references/EXAMPLE.md`).
It sits in Development. It works with GitHub and Git. The repository describes itself as: 68 plug-and-play, best-practice product management skills for AI agents: 30 Triple Diamond phase + 11 foundation + 12 utility + 15 tool (Foundation Sprint + Design Sprint). Plus… The licence is Apache-2.0.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 1cef1a9. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitnpmghFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, npm and gh, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Utility Update Pm Skills loads about 3.6k tokens when it runs, and up to ~6k if it reads all its reference files. Until then it costs about 91 tokens; SKILL.md has 1,551 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from product-on-purpose/pm-skills at commit 1cef1a9, republished under its Apache-2.0 licence (© product-on-purpose). 1,551 words, ~3,559 tokens.
.claude/skills/utility-update-pm-skills/SKILL.md (or your agent's skills folder). This skill also uses 4 other files; get the full folder from GitHub.<!-- PM-Skills | https://github.com/product-on-purpose/pm-skills | Apache 2.0 -->
This skill updates a local pm-skills installation to the latest public release. It validates connectivity, compares versions, previews changes, and produces a structured report documenting what was updated and what new capabilities are available.
utility-pm-skill-builder or utility-pm-skill-iterateutility-pm-skill-validate| Flag | Behavior |
|---|---|
| (none) | Full update flow: pre-flight → preview → confirm → update → report |
--report-only | Pre-flight → preview → report (no files written) |
--status | Lightweight version check - prints current and latest version, then stops |
When --status is provided, run only the pre-flight checks and display:
pm-skills v{local} (installed, from {source})
pm-skills v{latest} (latest, released {date})
{Status: up to date | update available ({type})}
Run utility-update-pm-skills for details, or utility-update-pm-skills --report-only for a preview.No report file is generated. No files are written.
When asked to update pm-skills (without --status), follow these steps:
Run three checks before proceeding:
Network access: Reach the GitHub API or repository URL
(https://github.com/product-on-purpose/pm-skills). Use any
available method: curl, wget, GitHub CLI (gh), or MCP tools.
Latest version: Query the latest release using this fallback chain (try each in order, use the first that succeeds):
GET /repos/product-on-purpose/pm-skills/releases/latestgh release list --repo product-on-purpose/pm-skills --limit 1git ls-remote --tags https://github.com/product-on-purpose/pm-skills.gitIf all three fail (rate limiting, 404, malformed response, no network), enter degraded mode (see below).
Record: version string, release date, release notes URL, release notes body.
Local version: Read from the first available source:
.claude-plugin/plugin.json → version fieldmarketplace.json → plugins[0].version fieldCHANGELOG.md → most recent version headerv* tagVersion parsing: Normalize by stripping an optional v prefix and
trimming whitespace. If a source is present but yields an empty,
non-semver, or malformed string (invalid JSON, missing field), skip it
with a warning and try the next source. Only fall back to 0.0.0
after all four sources fail.
If network access fails (degraded mode):
Visit https://github.com/product-on-purpose/pm-skills/releases to download the latest release. Extract the archive and copy the
skills/,commands/,_workflows/, and other content directories to your local pm-skills installation.
Compare the local version against the latest release using semver.
If local version >= latest version:
If local version < latest version:
Local version: v{local}
Latest version: v{latest}
Update type: {major | minor | patch}This is a major version update. It may include breaking changes to skill contracts. Review the release notes before proceeding.
Show the user what the update includes:
Version delta: local version, latest version, update type.
Value summary: Derive from CHANGELOG entries between the two versions, GitHub release notes, and directory diffs (new skills/, new _workflows/ files):
File manifest: List of files and folders that will be written, grouped by directory with counts:
Files to be written:
skills/ 31 files (2 new, 29 updated)
commands/ 38 files (2 new, 36 updated)
_workflows/ 9 files (1 new, 8 updated)
other 7 files
Total: 85 filesIf --report-only: Generate the report using references/TEMPLATE.md
with the banner "Report only - update was not applied." Save to
_pm-skills/updates/update-report_v{latest}_report-only_{YYYY-MM-DD_HHMMSS}.md. Stop
execution.
Prompt the user for two decisions:
Update confirmation: "These files will be overwritten. Proceed? [yes / no]"
Backup offer: "Create a backup of current files before updating? [yes (recommended) / no]"
_pm-skills/backups/v{current}_{YYYY-MM-DD_HHMMSS}/_pm-skills/ directory if it doesn't exist.Execute the update using validated-before-copy with backup:
Download: Fetch the release ZIP asset (pm-skills-vX.Y.Z.zip)
from the GitHub Release page to a temporary directory. This is the
curated build artifact produced by build-release.sh - it includes
only user-facing content and excludes docs/internal/.
Validate: Confirm the extracted archive contains skills/,
commands/, AGENTS.md, and .claude-plugin/plugin.json. If
validation fails, report the error and stop without writing any files.
Copy: Overwrite in-scope files from the extracted archive to the install root. Show progress per directory:
Updating pm-skills v2.9.0 -> v2.10.0...
skills/ 31/31 ████████████████████ done
commands/ 38/38 ████████████████████ done
_workflows/ 9/9 ████████████████████ done
other files 7/7 ████████████████████ doneClean up: Remove the temporary directory.
Smoke test:
plugin.json, marketplace.json, and
CHANGELOG.md all reflect the new version. (Note: version detection
in Step 1 uses first-match; the smoke test verifies all sources
agree. A mismatch here suggests a release packaging issue.)AGENTS.md, skills/, commands/, _workflows/
all exist.utility-update-pm-skills to re-download,
or restore from backup: cp -r _pm-skills/backups/{dir}/* ."Summary line: Show a single scannable confirmation:
Updated v{old} -> v{new} | +{n} skills, +{n} workflows | Report: _pm-skills/updates/{file}Completion report: Generate using references/TEMPLATE.md and
save to _pm-skills/updates/update-report_v{from}-to-v{to}_{YYYY-MM-DD_HHMMSS}.md
MCP advisory: If ../pm-skills-mcp/ exists, try to read
pm-skills-source.json. If the file is missing or malformed, show:
"pm-skills-mcp detected but pm-skills-source.json not found or
unreadable. Check the MCP repo manually." If readable, show:
pm-skills-mcp detected at ../pm-skills-mcp/
Embedded skills version: v{embedded}
Updated pm-skills version: v{new}
To update the MCP server's embedded skills:
cd ../pm-skills-mcp && npm run embed-skills && npm run buildNext steps:
Next Steps:
- Review the update report at _pm-skills/updates/{report-file}
- Run utility-pm-skill-validate --all to verify skill integrity
- Run local CI: bash scripts/lint-skills-frontmatter.sh
- Check release notes: {release-url}The updater writes only files present in the release ZIP asset
(pm-skills-vX.Y.Z.zip), which is the curated build produced by
build-release.sh. As of v2.30.0 the ZIP also carries the agents/
sub-agent definitions and the hooks/ activation hooks, so a ZIP install
has the runtime files the dispatch skills reference. The ZIP excludes
docs/internal/ and other non-user-facing content - no exclusion logic is
needed at copy time.
Files included in the release ZIP (updated):
| Path | Rationale |
|---|---|
skills/ | Core skill files |
commands/ | Slash command definitions |
_workflows/ | Workflow chains |
agents/ | Sub-agent definitions the utility-pm-* dispatch skills read at runtime |
hooks/ | Activation hooks (guardrails + phase router) including hooks.json |
library/ | Sample library and skill output samples (note: user-added samples may be overwritten) |
AGENTS.md | Skill discovery for IDEs |
.claude-plugin/plugin.json | Version + plugin metadata |
marketplace.json | Marketplace metadata |
CHANGELOG.md | Release history |
README.md | Public docs |
docs/ (public guides, reference, workflows) | User-facing documentation |
scripts/ | CI/validation scripts |
mkdocs.yml | Docs site config |
Files NOT in the release ZIP (never overwritten):
| Path | Rationale |
|---|---|
docs/internal/ | Excluded from ZIP by build-release.sh |
_NOTES/ | Local-only, gitignored, not in ZIP |
_pm-skills/ | Local state (reports, backups), not in ZIP |
.github/ | CI workflows, not in ZIP |
CONTRIBUTING.md, LICENSE | Not in ZIP (repo-level files) |
The skill MUST:
The skill MUST NOT:
docs/internal/, _NOTES/, or _pm-skills/ with upstream contentBefore marking the update complete, verify:
_pm-skills/updates/I'm a contributor who cloned the repo. Should I use this skill?
No. Use git pull or git fetch && git merge instead. This skill is
for end users who installed pm-skills as a plugin or downloaded a release.
Can I update to a specific version instead of the latest? Not in v1. This skill always targets the latest release. To install a specific version, download it manually from the releases page.
What happens to my local notes and planning docs?
They are never touched. The skill explicitly excludes docs/internal/,
_NOTES/, and _pm-skills/ from updates. See the File Scope table.
What happens to files I added that aren't in the upstream release? They are left untouched. The skill only overwrites files that exist in the new release - it never deletes local files.
How do I undo an update?
If you created a backup (the default offer), restore it:
cp -r _pm-skills/backups/v{version}_{timestamp}/* .
If you didn't create a backup but have git, use git checkout . to
restore tracked files to their last committed state.
The update failed partway through. What do I do?
The skill validates before copying (download to temp, check, then write),
so partial failures are rare. If it does happen: restore from backup if
available, or re-run utility-update-pm-skills to retry.
For a visual walkthrough and additional context, see the Updating PM Skills Guide.
© product-on-purpose, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 4 other files (references) in skills/utility-update-pm-skills of product-on-purpose/pm-skills.
Open the folder on GitHubat commit 1cef1a9
Utility Update Pm Skills next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Utility Update Pm Skills this skillproduct-on-purpose/pm-skills | 716 | — | ~3.6k | Automated safety check: Pass | Apache-2.0 | |
| Contributor-First PR MergeHKUDS/OpenHarness | 16k | 1 repos | ~847 | Automated safety check: Pass | MIT | |
| Create Pull Requestcline/cline | 70k | 1 repos | ~1.6k | Automated safety check: Pass | Apache-2.0 | |
| Pull Request Title and Body Writeropeninterpreter/openinterpreter | 69k | 2 repos | ~1.1k | Automated safety check: Pass | Apache-2.0 | |
| Draft Release Notesjamiepine/voicebox | 57k | — | ~941 | Automated safety check: Pass | MIT | |
| PR Review State Fetchprisma/orm | 48k | — | ~767 | Automated safety check: Pass | Apache-2.0 |
HKUDS/OpenHarness
Merges external GitHub pull requests while keeping the original author credited, and fixes conflicts after the merge instead of rewriting the contribution.
cline/cline
Opens a GitHub pull request from your current branch with the gh CLI, after reviewing the commits and diff and gathering the details the PR needs.
openinterpreter/openinterpreter
Rewrites the title and body of one or more pull requests with gh, leading with why the change was made, then what changed, and describing only the net result.
jamiepine/voicebox
Writes or refreshes the Unreleased section of CHANGELOG.md as a themed narrative built from the commits, PRs and diff since the last version tag.
prisma/orm
Fetches a pull request's canonical review state as JSON, validates it, and renders markdown, a text summary and triage target files from it using bundled scripts.
tw93/Mole
Publishes curated, bilingual release notes for an existing Mole version tag with gh release edit, including contributor thanks and reactions, after the release workflow finishes.
product-on-purpose/pm-skills
Defines a testable hypothesis with clear success metrics and a validation approach.
product-on-purpose/pm-skills
Creates a Jobs to be Done canvas capturing the functional, emotional, and social dimensions of a customer job.
product-on-purpose/pm-skills
Creates an opportunity solution tree connecting a desired outcome to customer opportunities and candidate solutions, preventing solution-first jumps in continuous discovery.
product-on-purpose/pm-skills
Creates a clear problem framing document with user impact, business context, and success criteria.
product-on-purpose/pm-skills
Generates structured Given/When/Then acceptance criteria for a user story or feature slice, covering the happy path, key failure scenarios, and non-functional expectations in testable form.
product-on-purpose/pm-skills
Creates a cross-functional pre-launch checklist covering engineering, design, marketing, support, legal, and operations readiness, with owners, dates, and go/no-go criteria so nothing is missed…
Categories
Checks for newer pm-skills releases, compares local vs. An agent skill from product-on-purpose/pm-skills. Utility Update Pm Skills is an agent skill from product-on-purpose/pm-skills. Checks for newer pm-skills releases, compares local vs.
Utility Update Pm Skills fits situations like: you want to bring a local pm-skills installation up to date.
Run `npx skills add product-on-purpose/pm-skills --skill utility-update-pm-skills -a claude-code`. Or copy the skill folder (skills/utility-update-pm-skills in product-on-purpose/pm-skills) into .claude/skills/utility-update-pm-skills in your project. Claude Code loads it when a task matches its description.
Run `npx skills add product-on-purpose/pm-skills --skill utility-update-pm-skills -a codex`. Or copy the skill folder (skills/utility-update-pm-skills in product-on-purpose/pm-skills) into .agents/skills/utility-update-pm-skills in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add product-on-purpose/pm-skills --skill utility-update-pm-skills -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/utility-update-pm-skills, .gemini/skills/utility-update-pm-skills, .github/skills/utility-update-pm-skills and .opencode/skills/utility-update-pm-skills in your project.
Going by SKILL.md and its folder, Utility Update Pm Skills needs the command-line tools its instructions call (git, npm and gh).
SKILL.md contains no URLs. Its commands use git, npm and gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Utility Update Pm Skills is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.6k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 2.4k tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Utility Update Pm Skills: Contributor-First PR Merge (HKUDS/OpenHarness, 16k stars), Create Pull Request (cline/cline, 70k stars), Pull Request Title and Body Writer (openinterpreter/openinterpreter, 69k stars) and Draft Release Notes (jamiepine/voicebox, 57k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
product-on-purpose (a GitHub organization) maintains it in product-on-purpose/pm-skills, which has 716 GitHub stars. The repository holds 68 skills in this directory. The repository was last updated on October 8, 2026.
Source: product-on-purpose/pm-skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.