Commit Changes
foldkit/foldkit
Create a git commit in the Foldkit monorepo with changeset enforcement and formatting.
How to write commit messages in the Portable Text Editor monorepo.
$ npx skills add portabletext/editor --skill commits -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install portabletext/editor commits --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/portabletext/editor.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/commits .claude/skills/commits && 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 "commits" agent skill from https://github.com/portabletext/editor/tree/main/.agents/skills/commits into .claude/skills/commits/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commits", 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/portabletext/editor/tree/main/.agents/skills/commitsType 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 portabletext/editor --skill commits -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install portabletext/editor commits --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/portabletext/editor.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/commits .agents/skills/commits && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "commits" agent skill from https://github.com/portabletext/editor/tree/main/.agents/skills/commits into .agents/skills/commits/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commits", 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 portabletext/editor --skill commits -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install portabletext/editor commits --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/portabletext/editor.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/commits .cursor/skills/commits && 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 "commits" agent skill from https://github.com/portabletext/editor/tree/main/.agents/skills/commits into .cursor/skills/commits/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commits", 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/portabletext/editor.git --path .agents/skills/commits--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 portabletext/editor --skill commits -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install portabletext/editor commits --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/portabletext/editor.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/commits .gemini/skills/commits && 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 "commits" agent skill from https://github.com/portabletext/editor/tree/main/.agents/skills/commits into .gemini/skills/commits/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commits", 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 portabletext/editor commitsInstalls 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 portabletext/editor --skill commits -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/portabletext/editor.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/commits .github/skills/commits && 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 "commits" agent skill from https://github.com/portabletext/editor/tree/main/.agents/skills/commits into .github/skills/commits/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commits", 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 portabletext/editor --skill commits -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install portabletext/editor commits --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/portabletext/editor.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/commits .opencode/skills/commits && 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 "commits" agent skill from https://github.com/portabletext/editor/tree/main/.agents/skills/commits into .opencode/skills/commits/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "commits", 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.
commitsHow to write commit messages in the Portable Text Editor monorepo.
Commits is an agent skill from portabletext/editor. How to write commit messages in the Portable Text Editor monorepo. Use whenever committing here. Covers subject conventions, the dense mechanism-first body shape, commit-type selection (including the changeset⇒fix/feat rule), splitting, and fixup discipline, with real exemplars from the repo history.
Its SKILL.md is about 1.9k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Development, covering Commit messages and Monorepo tooling. The repository describes itself as: The Standalone Portable Text Editor. The licence is MIT.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 60a494b. 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:
gitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, 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.
Commits loads about 1.9k tokens when it runs. Until then it costs about 77 tokens; SKILL.md has 650 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 portabletext/editor at commit 60a494b, republished under its MIT licence (© portabletext). 650 words, ~1,947 tokens.
.claude/skills/commits/SKILL.md (or your agent's skills folder).fix:, feat:, refactor:, test:, chore:, docs:.fix(sanity-bridge):, chore(deps):), but: when the commit ships a changeset, the changeset frontmatter already names the package, so the scope is redundant, use bare fix: / feat:.fix: return a path that identifies the node from getNodefix: only rewrite the DOM selection when it disagrees with the modelfix: getNode path bug, ❌ fix: improve selection handlingfix-inline-object-drag-selection), not the ticket.fix: or feat:, never refactor:/chore:. The changeset is the tell: releasable change ⇒ fix/feat.fix:/feat: must ship (or amend) a changeset. No changeset means it is not a fix/feat; retype it (refactor: for code changes with no releasable behavior change, even ones that alter internal behavior, chore:/test:/docs: otherwise). The two exemptions are scoped commits to unpublished targets (fix(playground):) and fix(deps):, where the changeset bot ships the release.chore(deps): for dependency/config work with no published-code change (no changeset).fix(deps) cuts a patch release via the changeset bot; don't hand it to tooling-only bumps.Dense technical prose, wrapped at ~72 columns, structured as:
unset([]) between the removals and the inserts.").Trivial commits get no body. One logical change per commit: tests pinning a contract get their own test: commit; refactors are split from fixes.
Once a PR is in review, follow-ups are fixup! commits (git commit --fixup <sha>), squashed with git rebase -i --autosquash before merge. Before review, fold changes into the logical commit they belong to. Merge-time history is clean logical commits, never a trail of "address review feedback".
The check-commits CI job exists only to enforce the last step: it fails
while any fixup!/squash!/amend! subject is on the PR, so fixup
commits cannot reach main unsquashed. A red check-commits on a PR
mid-review is the expected state, not a problem to fix: do not reword
fixups to appease it, and do not autosquash early (that folds review
follow-ups before the reviewer has seen them). It goes green at the
pre-merge autosquash.
24996df6b)fix: return a path that identifies the node from `getNode`
`getNode(snapshot, path)` follows a path through the editor value and
returns the deepest node it reaches. When the input path ended on a
field-name string — e.g. `[{_key: 'image1'}, 'caption']` pointing
into a block object's primitive field — the walker still resolved to
the block but returned the input path verbatim, including the
trailing field name. The contract was lying: `entry.path` didn't
identify `entry.node`, and downstream composition (`isBlock(entry.path)`,
`getEnclosingBlock(entry.path)`) misclassified the entry because it
saw the field-suffixed path instead of the node's path.
Strip trailing field-name segments from the returned path. `getNode`
now returns a path that identifies the node it found: feeding
`entry.path` back into `getNode` resolves to the same node.
Includes test coverage for block-object, span, and inline-object
paths with trailing primitive fields, and a round-trip assertion.Why it's good: names the function and its contract, gives a concrete input, states the downstream blast radius, then the fix as an invariant ("feeding entry.path back...").
46593d537)fix: write a `text`-named field on an inline object during value sync
When the editor received an updated value, `updateBlock`'s child
reconcile stripped `text` from every changed child before
`setNodeProperties`, then re-applied it only for spans via an
`insert.text` operation. On an inline object `text` is an ordinary
field, so it was stripped but never written back: the field's new
value silently never reached the editor, even though the incoming
value carried it. A field by any other name (`caption`, etc.) synced
fine because only `text` was special-cased.
Strip `text` only when the child is a span (spans own their text via
text operations); on a non-span child `text` flows through
`setNodeProperties` like any other property.
Net behavior unchanged for spans and for inline objects without a
`text` field.Why it's good: the failure sequence is step-by-step (stripped → re-applied only for spans → never written back), includes the discriminating observation ("a field by any other name synced fine"), and closes with the exact blast-radius scoping.
f2420072a)fix: only rewrite the DOM selection when it disagrees with the model
`validateSelection` compared the model's canonical DOM range against the
live DOM range by `startOffset`/`endOffset` alone, ignoring the
containers. A browser representing the same selection with element-level
endpoints (as browsers do when a selection sweeps across table cells) was
misread as out of sync, and the "fix" (`removeAllRanges` + `addRange`)
reset the in-progress native drag, collapsing the selection, and
destroyed backwardness (a `Range` carries no direction).
The validator now maps the live DOM selection back through
`toEditorSelection` and compares editor selections: equivalent
representations are left alone, and the DOM is only rewritten when the
two genuinely disagree about meaning. Passing the `DOMSelection` (not
`getRangeAt(0)`) also routes Firefox's multi-range table selections
through the engine's existing compat. Pinned by a test expressing the
same selection with element-level endpoints and asserting it survives
validation (red on the old comparison), plus one pinning that genuine
desyncs are still rewritten.Why it's good: explains why the naive comparison was wrong (equivalent representations), names each consequence of the false positive, and points at both tests, the one that falsifies the old behavior and the one pinning the still-wanted behavior.
refactor:/chore: on a commit that carries a changeset.© portabletext, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/commits of portabletext/editor.
Open the folder on GitHubat commit 60a494b
Commits 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 |
|---|---|---|---|---|---|---|
| Commits this skillportabletext/editor | 280 | — | ~1.9k | Automated safety check: Pass | MIT | |
| Commit Changesfoldkit/foldkit | 912 | — | ~1.2k | Automated safety check: Pass | MIT | |
| Nx Importnrwl/nx | 29k | 5 repos | ~3.5k | Automated safety check: Pass | MIT | |
| Nx Workspacenomcopter/react-mosaic | 4.8k | 7 repos | ~1.9k | Automated safety check: Pass | Custom licence | |
| Electron Multi-Process ArchitectureiOfficeAI/AionUi | 33k | 1 repos | ~1.8k | Automated safety check: Pass | Apache-2.0 | |
| Nx Run Tasksnomcopter/react-mosaic | 4.8k | 7 repos | ~613 | Automated safety check: Pass | Custom licence |
foldkit/foldkit
Create a git commit in the Foldkit monorepo with changeset enforcement and formatting.
nrwl/nx
Import, merge, or combine repositories into an Nx workspace using nx import.
nomcopter/react-mosaic
Explore and understand Nx workspaces. An agent skill from nomcopter/react-mosaic.
iOfficeAI/AionUi
Tells the agent where new code belongs in an Electron multi-process project and which APIs each process may use, with rules for new bridges, services, agents and workers.
nomcopter/react-mosaic
Helps with running tasks in an Nx workspace. An agent skill from nomcopter/react-mosaic.
withastro/astro
Comprehensive guide for developing in the Astro monorepo. An agent skill from withastro/astro.
portabletext/editor
Write clear, concise, accessible product copy for interfaces, docs, and system messages.
portabletext/editor
How to write changesets in the Portable Text Editor monorepo.
portabletext/editor
How the next prerelease branch for the upcoming editor major works in the Portable Text Editor monorepo.
portabletext/editor
How to backport a fix from main to a maintenance branch (editor-v6.x, editor-v7.x) in the Portable Text Editor monorepo.
portabletext/editor
How to write and review code comments in the Portable Text Editor monorepo.
portabletext/editor
Work with Portable Text, a JSON-based specification for structured block content.
Categories
How to write commit messages in the Portable Text Editor monorepo. Commits is an agent skill from portabletext/editor. How to write commit messages in the Portable Text Editor monorepo.
Commits fits situations like: committing here; tasks that involve Commit messages; tasks that involve Monorepo tooling.
Run `npx skills add portabletext/editor --skill commits -a claude-code`. Or copy the skill folder (.agents/skills/commits in portabletext/editor) into .claude/skills/commits in your project. Claude Code loads it when a task matches its description.
Run `npx skills add portabletext/editor --skill commits -a codex`. Or copy the skill folder (.agents/skills/commits in portabletext/editor) into .agents/skills/commits 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 portabletext/editor --skill commits -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/commits, .gemini/skills/commits, .github/skills/commits and .opencode/skills/commits in your project.
Going by SKILL.md and its folder, Commits needs the command-line tools its instructions call (git).
SKILL.md contains no URLs. Its commands use git, 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.
Commits is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 1.9k tokens (SKILL.md is roughly 7.8k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Commits: Commit Changes (foldkit/foldkit, 912 stars), Nx Import (nrwl/nx, 29k stars), Nx Workspace (nomcopter/react-mosaic, 4.8k stars) and Electron Multi-Process Architecture (iOfficeAI/AionUi, 33k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
portabletext (a GitHub organization) maintains it in portabletext/editor, which has 280 GitHub stars. The repository holds 10 skills in this directory. The repository was last updated on October 6, 2026.
Source: portabletext/editor on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.