Keep working. Merge when ready.
Simple Changes is an open-source, agent-neutral skill that turns ready work in a Git repository into focused, verified change proposals while preserving paused and concurrent work. Its first release provides a credential-free vertical slice: inspect a repository, classify stable and changing work, propose focused units, and validate the result without mutating Git or contacting a provider.
Requires Bun 1.2 or later and Git. The CLI is a Bun TypeScript entry point; Node alone cannot run it.
Development happens on GitLab at
https://gitlab.com/soundsystems/simple-changes, and a read-only mirror is
kept in sync at https://github.com/soundsystems/simple-changes. Install from
the mirror: older Skills CLI releases, and lock entries without a recorded
source URL, re-resolve a stored source as GitHub shorthand, so a GitLab install
may not update in place, while an install from the mirror records
sourceType: github and skills update works with every release. The
commands below therefore use the mirror; the installed tree is byte-identical
either way.
Clone this repository, then from its root:
git clone https://github.com/soundsystems/simple-changes.git
cd simple-changes
bun install
bun run simple-changes initialize --mode sync
bun run simple-changes initialize --mode queue
bun run simple-changes preview
bun run simple-changes preview --json
bun run simple-changes release-notes
bun run simple-changes release-notes --check --repo .Install it once globally with the Skills CLI:
bunx skills add https://github.com/soundsystems/simple-changes --skill simple-changes -gOr copy it from the clone into the portable global Skills directory (a copy is not tracked by the Skills CLI, so update it the same way):
mkdir -p ~/.agents/skills
cp -R skills/simple-changes ~/.agents/skills/simple-changesAgents with their own global skill directory can point to that one installation instead of keeping another copy. For example:
mkdir -p ~/.codex/skills ~/.claude/skills
ln -s ~/.agents/skills/simple-changes ~/.codex/skills/simple-changes
ln -s ~/.agents/skills/simple-changes ~/.claude/skills/simple-changesKeep repository-local installations only for repository-specific forks. A
repository can still commit .simple-changes.json; repository policy is
independent of where the skill is installed and overrides global personal
preferences. Before creating a symlink, move or remove any existing copy at its
destination so an older installation is not left nested beneath it.
A compatible changelog provider declares itself with a machine-readable
changelog-provider.json beside its SKILL.md (distribution, guidance
version, and protocol capabilities); discovery falls back to installation-name
inference only when no marker is present.
The installed directory is self-contained. Its release-note surface is
read-only: release-notes displays Simple Changes' packaged public history. It
does not author changelogs or provide release-writing guidance to users'
agents, and does not contain the repository's release harness or model
adapters. When simple-changelogs is available, Simple Changes can delegate a
focused changelog unit and validate its handoff receipt; the changelog skill
still owns classification and writing.
Install Simple Changes globally once. Configure each repository first; create a fork only when its behavior cannot be expressed through settings or repository instructions.
| What you want to change | Use | Why |
|---|---|---|
| Review, merge, deploy, question, or migration preferences | Repository .simple-changes.json |
The shared skill already supports these choices. |
| Local commands, providers, deployment targets, or project conventions | Repository instructions and supported config | Project context does not require copying the skill. |
| Additional gates or workflow behavior that settings cannot express | A repository-specific fork | The skill's instructions or runtime need to change. |
| The same custom workflow across several projects | A maintained shared fork | Keep one customized source and update its consumers. |
| Refresh an existing fork while preserving its customizations | update-local-forks |
Reconcile the fork with its pinned base and the updated global install. |
From the target repository, create a fork with a distinct skill name and a short description of the behavior you intend to customize:
bun ~/.agents/skills/simple-changes/scripts/simple-changes.ts fork create \
--name product-simple-changes \
--deltas "Product-specific release gates and verification"The command copies the complete installed skill to
.agents/skills/product-simple-changes, renames its skill identity, and records
the exact upstream commit after verifying every source file's bytes (a
mismatch names the differing files; Finder .DS_Store files are ignored). The
fork's description starts with its name and tells agents to use it instead of
the global simple-changes skill in that repository (product here, taken
from a <project>-simple-changes name), and its Codex metadata names and
invokes the fork, so an agent that sees both skills loads the fork. It
always writes inside the Git repository that contains the working directory or
--repo, refuses an existing destination or a name that matches an installed
skill, and leaves the global installation untouched. Pass
--destination skills/product-simple-changes for a different repository-local
location, --repo /path/to/repository to select a repository, or --json for
machine-readable output. Upstream verification needs GitLab connectivity;
--upstream /path/to/simple-changes uses a complete source checkout offline.
An altered or incomplete global install must be refreshed before it can be
forked with a verified pin.
The new copy starts with the same behavior as upstream. Edit its SKILL.md and
runtime to implement the stated deltas, verify those changes, and commit the
fork in its owning repository. The fork's own runtime checks that skill
discovery can still load it (strict frontmatter, a name matching its
directory, Claude Code and Codex invocation parity, and relative links that
resolve):
bun .agents/skills/product-simple-changes/scripts/simple-changes.ts skill checkUse the fork by its distinct skill name; if you choose a location outside
.agents/skills, point repository instructions to its SKILL.md. Claude Code
loads project skills from .claude/skills, so for Claude Code create the fork
with --destination .claude/skills/<name> or link that path to the fork. The
provenance line below its title lets the updater find it:
Forked from `simple-changes` @ `<sha>`. Fork-specific deltas: ...Then keep the fork current with the update-local-forks skill, which ships
in this package and is meant for anyone who forked, not only maintainers:
bunx skills add https://github.com/soundsystems/simple-changes --skill update-local-forks -gAsk an agent to update your local forks, or run the helper directly. It scans
global skill roots and conventional project folders (Developer, Projects,
Code, and src); pass --root for forks elsewhere. It plans one fork at a
time against the fork's pinned upstream base and the global install, applies portable upstream
changes, keeps every fork-specific edit and file, three-way merges files both
sides changed, and reports conflicts for review instead of overwriting them.
An upstream reference added or changed since the pin that the fork neither
carries nor lists under ## Intentional omissions in its
references/fork-maintenance.md holds the pin until the fork carries or
records it, so new guidance cannot be skipped silently. It also advances the
provenance pin only to the exact release commit the global install matches,
and rewrites the pin, guidance version, and upstream version literals the
fork's own checks pin. It never commits or pushes; the fork repository's own
Simple Changes policy ships the update. Guidance updates therefore reach a
fork's users the same way they reach everyone else: through the next
write-capable run's one-time notice.
bun ~/.agents/skills/update-local-forks/scripts/update-local-forks.ts discover
bun ~/.agents/skills/update-local-forks/scripts/update-local-forks.ts plan \
--fork path/to/fork --json > plan.json
bun ~/.agents/skills/update-local-forks/scripts/update-local-forks.ts apply --plan plan.jsonIn a source checkout, the maintainer drift checker still works for a quick pin comparison:
tooling/simple-changes/check-fork-sync.sh \
path/to/fork/SKILL.md /path/to/simple-changes origin/main- Resolves the canonical primary checkout across linked worktrees.
- Treats
sync,pull latest, andget us in line with mainas a guarded local-only mode: exact-target fetch, fast-forward-only target updates, and conflict-preflighted feature-branch integration without push or history rewrite. - Detects first write-capable use and requires onboarding when neither repository nor personal preferences exist.
- Detects changelog relevance separately from skill availability, negotiates
exact protocol/schema capabilities, and coordinates delegation through
closed
classify,prepare, and final read-onlyverifytransactions. - Treats every Web production deployment as a product release, requires a digest-bound version decision and verified full revision lineage, and emits a composite receipt binding that release to the observed deployment revision.
- Recognizes run-only Emergency Ship intent: urgency selects an expedited path that preserves pre-deploy review, while only explicit deploy-before-review direction enables break-glass. Both retain durable reconciliation debt and avoid a second deployment only when the final canonical result is already live or immutable artifact equivalence is proven.
- Inventories branches, stashes, local changes, worktrees, policy, and Git capabilities using argument-array subprocess calls.
- Takes two read-only snapshots and preserves work that appeared or changed between them.
- Holds one atomic active-loop lease for write-capable integration runs, persists a content-sensitive opening worktree manifest, runs local mutations under the lock from preflight through post-verification, awaits asynchronous callbacks, tracks guarded command process groups, terminates and rejects background descendants before normal lease release, and recovers only locks whose recorded processes are proven dead. Each new authoring agent receives one branch-bound, resumable isolated worktree from a pinned clean revision.
- Records a lease heartbeat on every operation that already writes lease state,
reports
live,stale, orunknownliveness inloop status, and clears only a provably stale lease through an approvedloop recover --stale-leasethat preserves every worktree, branch, claim, and receipt. - Prunes proven-obsolete local checkouts, stale worktree metadata, and merged
local branches without a lease through
prune, so cleanup no longer depends on a run reachingloop finalize. It requires an approver and reason, supports--dry-run, names the containment method for each removal, and refuses to touch anything a lease that is not provably stale registers. - Builds a deterministic preview plan for stable work and validates path conservation, authority, and closed JSON schemas.
- Classifies database and data-system changes without prescribing a provider, ORM, query language, or migration tool.
- Audits proposal Markdown, including accidentally escaped newlines outside
code, and with
proposal auditchecks a stored description against the Summary, Evidence, and Merge danger body shape (or a repository template's headings), its one-way, two-way, or unknown door and blast radius, and a signature block that ends the body. - Displays Simple Changes' packaged public release notes without exposing private HTML comments, unreleased notes, or developer history.
- Checks that the latest public and developer release headings agree with the root package version in source-repository maintainer mode.
- Normalizes forge and deployment evidence without assuming a numeric PR/MR ID or a particular delivery model.
- Requires production receipts to cover the complete configured canonical-target inventory, then uses a bounded promote/recheck/provider-managed-target recovery sequence for verified artifacts instead of creating duplicate deployments.
- Records explicit parity dispositions for repository-defined counterpart surfaces without forcing platform-identical interfaces or inferring separate release authority.
- Treats requests for all proposals as complete-corpus operations that must paginate every relevant provider state.
- Starts Ship runs with a concise proceed-without-waiting scope brief when authority already exists, then closes with exact shipped receipts and any review-driven changes made after the original proposal head.
- Emits human-readable or JSON reports with stable exit codes.
The deterministic CLI creates only explicitly requested, lease-registered,
branch-bound authoring worktrees for agents assigned to the same integration
unit. Independent agents claim their own distinct worktrees and may keep editing
and committing concurrently by default; only shared integration actions remain
single-controller. Interrupted registration resumes only from a clean checkout
on the recorded branch and revision. loop exec can run one
explicitly supplied local argument-array command while the lease lock is held,
but it does not
decide to commit, push, merge, deploy, apply migrations, change secrets, update
DNS, or clean branches. Those decisions remain capability- and authority-gated
extensions followed by agents and provider adapters.
simple-changes fork create --name NAME --deltas TEXT
[--destination PATH] [--upstream PATH] [--json] [--repo PATH]
simple-changes initialize --mode MODE
[--ready] [--handoff ask|automatic|user-signaled]
[--instruction-pointer add|leave] [--instruction-file PATH]
[--ui-artifacts]
[--ui-versioning repository|number-and-date|date-only|number-only]
[--changelog delegate-if-available|preserve-and-report|ask]
[--changelog-install now|after-shipment|later|decline]
[--concurrent-work allow-claimed|strict]
[--production ask|allow|deny]
[--shipping-mode standard|expedited]
[--proposal-scheduling balanced|consecutive|parallel]
[--questions blocking-only|always|never]
[--scope user|repository|run] [--yes] [--json] [--repo PATH]
simple-changes setup [--finish review|integrate|ship]
[--handoff ask|automatic|user-signaled]
[--instruction-pointer add|leave] [--instruction-file PATH]
[--ui-artifacts]
[--ui-versioning repository|number-and-date|date-only|number-only]
[--changelog delegate-if-available|preserve-and-report|ask]
[--changelog-install now|after-shipment|later|decline]
[--concurrent-work allow-claimed|strict]
[--production ask|allow|deny]
[--shipping-mode standard|expedited]
[--proposal-scheduling balanced|consecutive|parallel]
[--questions blocking-only|always|never]
[--scope user|repository|run] [--yes] [--json] [--repo PATH]
simple-changes acknowledge-update --guidance-decision accepted|reviewed|deferred
[--agent-id ID] [--json] [--repo PATH]
simple-changes inventory [--json] [--repo PATH]
simple-changes status [--all [--root DIR ...]] [--json] [--repo PATH]
simple-changes preview [--json] [--repo PATH] [--settle-ms N]
simple-changes remote-inventory build --pages PAGES_FILE
[--opening-remote-inventory FILE [--decisions FILE]] [--output FILE] [--json]
simple-changes loop start --mode MODE --agent-id ID [--changelog-required]
[--opening-remote-inventory FILE] [--json] [--repo PATH]
simple-changes loop status [--json] [--repo PATH]
simple-changes loop verify --run-id ID [--json] [--repo PATH]
simple-changes loop guard --run-id ID --agent-id ID [--json] [--repo PATH]
simple-changes loop record-scope --run-id ID --agent-id ID
--receipt FILE [--json] [--repo PATH]
simple-changes loop refresh-scope --run-id ID --agent-id ID
--receipt FILE [--json] [--repo PATH]
simple-changes loop draft-outcome --run-id ID [--changelog-receipt FILE]
[--output FILE] [--json] [--repo PATH]
simple-changes loop record-outcome --run-id ID --agent-id ID
--receipt FILE [--approved-by USER --approval-reference REFERENCE]
[--json] [--repo PATH]
simple-changes loop exec --run-id ID --agent-id ID [--json] [--repo PATH]
-- COMMAND [ARG ...]
simple-changes loop recover --agent-id ID [--json] [--repo PATH]
simple-changes loop recover --stale-lease --run-id ID --agent-id ID
--approved-by ID --reason TEXT [--json] [--repo PATH]
simple-changes loop takeover --run-id ID --agent-id ID
--manifest-digest SHA256 --approved-by ID --reason TEXT [--json] [--repo PATH]
simple-changes loop allow --run-id ID --agent-id ID --worktree PATH
--status-digest SHA256 --approved-by ID --reason TEXT [--json] [--repo PATH]
simple-changes loop dispose-worktree --run-id ID --agent-id ID --worktree PATH
--status-digest SHA256 --approved-by ID --reason TEXT [--json] [--repo PATH]
simple-changes loop retain-worktree --run-id ID --agent-id ID --worktree PATH
--status-digest SHA256 --approved-by ID --reason TEXT [--json] [--repo PATH]
simple-changes loop retire-absent-worktree --run-id ID --agent-id ID
--worktree PATH --approved-by ID --reason TEXT [--json] [--repo PATH]
simple-changes loop adopt-worktree --run-id ID --agent-id ID
--pause-receipt ID [--json] [--repo PATH]
simple-changes loop accept-paused-change --run-id ID --agent-id ID
--pause-receipt ID [--json] [--repo PATH]
simple-changes loop reconcile-remote-branches --run-id ID --agent-id ID
--receipt FILE [--json] [--repo PATH]
simple-changes loop recover-post-cleanup --run-id ID --agent-id ID
--receipt FILE [--json] [--repo PATH]
simple-changes loop close-equivalent --run-id ID --agent-id ID
--approved-by ID --reason TEXT [--evidence FILE ...] [--json] [--repo PATH]
simple-changes loop replan-status [--json] [--repo PATH]
simple-changes loop replan --run-id ID --agent-id ID
--manifest-digest SHA256 --status-digest SHA256
--approved-by ID --reason TEXT [--json] [--repo PATH]
simple-changes loop archive-recorded --run-id ID --agent-id ID
--manifest-digest SHA256 --status-digest SHA256
--approved-by ID --reason TEXT [--json] [--repo PATH]
simple-changes loop end --run-id ID --agent-id ID [--reason TEXT]
[--json] [--repo PATH]
simple-changes loop finalize --run-id ID --agent-id ID --reason TEXT
[--json] [--repo PATH]
simple-changes worktree status [--json] [--repo PATH]
simple-changes worktree observe [--json] [--repo PATH]
simple-changes worktree request --claim-id ID --run-id ID
--request-action request-pause|request-detach|notify-resume
[--json] [--repo PATH]
simple-changes worktree claim --agent-id ID --worktree PATH --adapter ID
[--owner-ref REF] [--json] [--repo PATH]
simple-changes worktree pause --agent-id ID --worktree PATH --run-id ID
--disposition preserve-in-place|detach-clean-checkout --reason TEXT
[--json] [--repo PATH]
simple-changes worktree detach --agent-id ID --worktree PATH
--pause-receipt ID [--json] [--repo PATH]
simple-changes worktree attach --agent-id ID --claim-id ID [--json] [--repo PATH]
simple-changes worktree resume-ready --run-id ID --agent-id ID --claim-id ID
[--json] [--repo PATH]
simple-changes worktree release --agent-id ID --claim-id ID [--json] [--repo PATH]
simple-changes worktree takeover --claim-id ID --agent-id NEW_OWNER
--status-digest SHA256 --approved-by ID --reason TEXT [--release]
[--json] [--repo PATH]
simple-changes worktree equivalence --worktree PATH [--target REF]
[--json] [--repo PATH]
simple-changes branch audit --head REF --target REF [--json] [--repo PATH]
simple-changes prune --approved-by ID --reason TEXT [--target REF]
[--dry-run] [--json] [--repo PATH]
simple-changes prepare-agent --run-id ID --agent-id ID --purpose SLUG
[--json] [--repo PATH]
simple-changes release-notes [--check] [--json] [--repo PATH] [--version VERSION]
simple-changes negotiate-changelog CAPABILITIES_FILE [--json]
simple-changes validate-changelog-transaction REQUEST_FILE RECEIPT_FILE [--prior-receipt FILE] [--json]
simple-changes validate-changelog-release-set RECEIPT_FILE RECEIPT_FILE... [--json]
simple-changes release-gate --request FILE --receipt FILE [--prior-receipt FILE]
--production ask|allow|deny [--already-live] [--production-authorized]
[--version-authorized] [--json]
simple-changes release-delivery --changelog-receipt FILE --provider-receipt FILE
[--request FILE] [--json]
simple-changes release-tag --run-id ID --agent-id ID --request FILE
--receipt FILE [--prior-receipt FILE] --production ask|allow|deny
[--production-authorized] [--already-live] [--tag-automation-authorized]
[--dry-run] [--json] [--repo PATH]
simple-changes proposal-signatures --agent NAME --role authored|reviewed|merged
[--base REF --head REF] [--changelog-receipt FILE] [--json] [--repo PATH]
simple-changes proposal audit --file FILE [--template FILE] [--json]
simple-changes skill check [--skill-dir PATH] [--json]
simple-changes validate KIND FILE [--json]
simple-changes verify-markdown FILE [--json]
simple-changes help
KIND is one of repo-policy, changelog-capabilities, changelog-request,
changelog-receipt, emergency-shipping, initialization, inventory,
change-plan, run-state, permission-bundle, provider-receipt,
release-delivery-receipt, release-tag-receipt,
remote-branch-reconciliation,
remote-branch-ancestry, remote-branch-supersession,
remote-inventory-pages, remote-inventory-decisions,
release-consistency, release-notes, release-notes-pointer,
proposal-audit,
ready-work-receipt, ship-holds, loop-lease, loop-close-equivalent,
migration-review, migration-pending, migration-apply-plan,
post-cleanup-recovery, shipment-outcome, stale-lease-recovery,
worktree-cleanup, worktree-coordination, worktree-takeover,
worktree-equivalence, or branch-audit (the schema filenames under
skills/simple-changes/evals/schemas/).
Before reapplying an old branch, use branch audit from the primary checkout
to discover possible rebased or squashed replacements already reachable from
the target. Full Original-Commit trailers provide explicit lineage; legacy
discovery looks for matching subjects and shared paths. Results are advisory,
bounded, and require independent review—not cleanup permission. See
replacement lineage
for preserving provenance and handling incomplete evidence.
Worktree claims and pause receipts are local, mode-0600 coordination evidence
stored beneath the repository's common Git directory. A claim records only an
opaque provider-neutral owner reference; it never stores prompts, message
bodies, credentials, or provider tokens. loop adopt-worktree converts an
exact owner-paused concurrent worktree into immutable preserved state.
loop accept-paused-change refreshes an opening preserved baseline only from an
exact receipt. worktree detach is deliberately separate from disposal: it
allows a clean non-primary checkout with unique commits to be removed without
force while retaining its branch at the exact HEAD, and worktree attach
recreates only that recorded branch and path.
Host integrations must probe their capabilities before automating owner
contact. worktree request returns the portable bounded request, a capability
profile listing the exact conditions the host layer must verify before
automating, and any structured manual blocker, without changing coordination or
Git state. Codex desktop task tooling and qualifying same-host Claude Code
installations (cross-session messaging enabled on macOS or Linux) can support
exact discovery, delivery, and waiting once every probe condition is verified;
native-Windows and cross-machine Claude Code sessions return a manual blocker.
Cursor Cloud/SDK, Hermes TUI gateway, and controller-owned Grok Build sessions
are supported only within their proven scopes. Every other mode returns a
structured manual coordination blocker and leaves Git and the active lease
unchanged.
Exit codes are stable: 0 success, 2 usage, 3 invalid input or contract,
4 inventory failure, 5 unsafe repository state, and 6 release notes
older than the installed window (a link was printed instead; not an error).
release-notes renders the latest released section of the packaged Simple
Changes CHANGELOG.md and omits pending Unreleased content and HTML comments.
Use --version VERSION for an older published release or --json for
automation. The installed copy carries the releases of the last six guidance
versions; for an older release, --version prints a link to it in the full
CHANGELOG.md with the notices of the guidance versions it
introduced and exits 6. Maintainers regenerate the installed window at
release with bun tooling/simple-changes/package-changelog.ts. An explicit --repo PATH may read another checkout without writing
it. The source-maintainer-only --check mode requires --repo PATH and
validates the latest public changelog, developer changelog, root package
version, and the packaged SKILL.md metadata.version without changing
them.
Write-capable Simple Changes tasks automatically initialize onboarding when no repository or personal policy exists, except Sync: it uses fixed local-only guardrails and never starts workflow-preference onboarding. Run the same checkpoint directly:
bun run simple-changes initialize --mode queueOr establish global personal defaults explicitly, including outside a Git repository:
bun run simple-changes setup --scope userOn first use, it explains why onboarding appeared, shows the exact recommended workflow, and makes clear that nothing has been pushed, merged, deployed, or saved yet. The first choice is:
- Use recommended setup: Apply the safe, request-aware defaults and show a receipt before saving them.
- Customize: Explain and ask only unresolved preferences, one at a time.
- Use recommended setup for this run only: Continue without a preference file and ask again next time.
Customized setup uses small workflow and storage diagrams where they make a boundary clearer. It then asks:
- How far should I usually take ready work? Stop with a checked proposal, merge after approval, or also deploy and verify.
- For shipping, What should happen with production? Confirm first, deploy automatically when repository rules permit it, or stop before production.
- When relevant, How should changelog work be handled? Delegate when a compatible skill exists, preserve and report the work, or ask first.
- When saving multiple UI artifact iterations, How should their version names be chosen? Follow the repository convention (recommended), use a number and ISO date, use an ISO date only, or use a number only.
- When should I ask for permission or help? Only when blocked, before major steps, or skip unauthorized work without interrupting.
- Where should these preferences live? Visible repository policy, private personal fallback defaults, or this run without writing a preference file.
- When that scope has an existing instruction file, whether to add a short, managed Simple Changes pointer to the exact file.
- When adding the pointer, whether to ask if completed work is ready (recommended), hand it off automatically after implementation and checks, or wait until the user says it is ready.
Personal preferences are saved under the platform configuration directory and
apply only when the repository has no policy. Teams may commit
.simple-changes.json:
{
"schemaVersion": 1,
"guidance": {
"disposition": "accepted",
"version": 3
},
"changelogHandling": "delegate-if-available",
"defaultFinish": "open-change-request",
"handoffTiming": "confirm-ready",
"proposalSignatures": "agent-and-version",
"uiArtifactVersioning": "repository-convention",
"questions": "blocking-only",
"review": "repository-policy",
"productionDeploy": "ask",
"concurrentWork": "allow-claimed"
}Meaningful installed-skill updates pause the next write-capable run once and explain the practical Simple Changes behavior or setting changes. Users can review the affected settings, keep their current choices, defer the update for that guidance version, or view detailed Simple Changes release notes. The decision is remembered so the same version does not prompt again.
When Simple Changelogs is also present, Simple Changes may offer a separate handoff for that skill to review its own settings or existing release notes. Simple Changes never performs that historical review itself, and no changelog action appears when the companion skill is absent.
allow-claimed is the default: independent agents may keep editing and
committing on distinct, non-primary claimed worktrees while one integration
controller handles push, proposal, merge, deployment, and cleanup operations.
Create the claim immediately after git worktree add and before any project
inspection, setup, generation, formatting, or editing in the new checkout. If a
lease recorded the worktree as preserved before the claim appeared, its next
guarded observation promotes the valid active claim to concurrent-author;
ordinary claimed concurrency never requires loop allow or user approval.
Set concurrentWork to strict to require repository-wide pauses. The legacy
preserve value remains accepted and now follows the safe concurrent default.
A committed policy may also declare execGuard, an argv array such as
["bun", "scripts/exec-guard.ts"] that runs with the exec command appended
before every loop exec child; a nonzero exit refuses the command before it
starts. Use it, for example, to refuse a merge until hosted CI passes. It is
repository code that runs with the agent's permissions, and personal
preferences never supply one.
The active request overrides repository policy, repository policy overrides
personal preferences, and personal preferences override the safe defaults.
Run-only setup writes no file. Policy stores decisions, never credentials or
transient run state. Resumable state for future mutation adapters belongs under
.git/simple-changes/.
Instruction setup edits only an existing exact AGENTS.md, CLAUDE.md, or
runtime-established global instruction file after confirmation. It never
creates a missing file or duplicates its managed block. The recommended pointer
asks whether implementation and checks are complete before Simple Changes takes
over. A completed-work agent can inspect the saved behavior with
initialize --mode handoff --agent-id <owner>; after confirmation, --ready
resolves the normal queue, integrate, ship, or preview boundary. The exact
claim owner identity lets a completed handoff release its own worktree claim.
UI iteration naming is conditional and applies only to deliberately preserved screenshots, design exports, static previews, or similar artifacts. Repository conventions always win. It does not rename UI source files or set Git, deployment, package, or release versions.
For non-interactive setup:
bun run simple-changes setup \
--finish ship \
--changelog delegate-if-available \
--production ask \
--questions blocking-only \
--scope user \
--instruction-file /exact/existing/AGENTS.md \
--instruction-pointer add \
--handoff ask \
--yesFor a task that will preserve multiple UI iterations, add --ui-artifacts and
--ui-versioning repository|number-and-date|date-only|number-only.
Even an automatic ship preference does not authorize remote migrations, backfills, secrets or environment changes, DNS changes, store releases, or history rewrites. Those operations still require explicit, exact-target permission.
Before an authorized Ship run mutates repository or provider state, the agent summarizes the ready scope, planned checks/merge/release/deploy path, separate authority boundaries, and preserved work. This update is delivered while the run proceeds; it does not add a redundant permission prompt. The final response reports what actually shipped and identifies every material change made during review, including the new exact head and re-verification.
bun run typecheck
bun run lint
bun run test
bun run evalCheck the bundled release-note fork against its Simple Changelogs source:
sh tooling/simple-changes/check-release-notes-fork-sync.sh \
/path/to/simple-changelogs origin/mainbun run eval is deterministic and credential-free. The optional authenticated
behavior harness runs the five release-note fixtures through a selected agent:
bun run behavior --adapter tooling/simple-changes/adapters/codex-eval.ts
bun run behavior --adapter tooling/simple-changes/adapters/claude-eval.ts
bun run behavior --adapter tooling/simple-changes/adapters/hermes-eval.ts
bun run behavior --adapter tooling/simple-changes/adapters/cursor-eval.ts
bun run behavior --adapter tooling/simple-changes/adapters/grok-eval.tsSee tooling/simple-changes/EVAL.md for isolation, authentication, model selection, and case-filtering details.
This repository is the production, open-source Simple Changes package. The
portable skill, CLI, schemas, and references are tracked under
skills/simple-changes. Fixtures, release-writing guidance, fork maintenance,
and Codex, Claude Code, Hermes, Cursor, and Grok Build adapters are tracked under
tooling/simple-changes for this repository's maintainers only. They are not
packaged or installed with the public skill. Only interrupted adapter scratch
files are ignored. The Simple Changelogs provenance pin and drift check provide
a deliberate upstream mirror boundary without importing its app-specific
surfaces.
Core contracts remain forge-, database-, and hosting-provider agnostic. Provider references translate those contracts into discoverable capabilities; they do not make any named provider, domain, branch convention, database, deployment command, or release channel mandatory.
Releases are numbered 0.<guidance>.<patch>. A release that advances the
guidance checkpoint takes it as the minor version (0.27.0 introduces guidance
27), a fix that leaves guidance unchanged is a patch release, and each release
is tagged v<version> on its merge commit.
See CONTRIBUTING.md for contribution guidance.
The proposal body shape
(a smallest-view summary, before-and-after evidence, and a one-way or two-way
door with its blast radius) adapts the pr skill from Matt Pocock's
skills (v1.3.0, MIT), whose menu of
summary views comes from Dex Horthy's
show-me.
The wording here is original, and the door is derived from this workflow's own
migration, compatibility, and rollback evidence rather than judged from the
diff. The separate Standards and Spec axes of an
agent review
adapt the same repository's code-review skill.