Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
186 commits
Select commit Hold shift + click to select a range
342ed43
feat: add Kimi CLI skills-only support (#1003)
Miss-you Apr 30, 2026
cb9641a
docs: add workspace reimplementation proposal slices (#1025)
TabishB Apr 30, 2026
347f027
docs: sync tool ID lists with AI_TOOLS source of truth (#1027)
Miss-you Apr 30, 2026
485c97e
[codex] Include sync in core workflow defaults (#1030)
TabishB May 1, 2026
a974c67
docs: clarify Bun install still requires Node (#1032)
TabishB May 1, 2026
44e4bee
fix omz completion compinit setup (#1033)
TabishB May 1, 2026
2d189ce
fix: make requirement header parsing case-insensitive (#1031)
davseby May 1, 2026
e6d81ba
[codex] Complete workspace foundation and setup specs (#1029)
TabishB May 1, 2026
0ca7476
fix windows workspace data dir paths (#1038)
TabishB May 1, 2026
76c80f8
docs: add Community Schemas section + README entry (#1043)
JiangWay May 4, 2026
435458b
archive workspace foundation (#1045)
TabishB May 4, 2026
7c3accc
[codex] Add workspace setup commands (#1046)
TabishB May 4, 2026
f510581
Fix Windows workspace path aliases (#1050)
TabishB May 5, 2026
849ae2a
Fix Windows workspace path test expectations (#1055)
TabishB May 6, 2026
d5c824d
archive workspace create and register repos (#1052)
TabishB May 6, 2026
1cdf041
[codex] Propose workspace open agent context (#1054)
TabishB May 6, 2026
ff506c3
Fix Windows workspace CI tests (#1056)
TabishB May 6, 2026
b642398
Fix Windows workspace launch arg expectation (#1057)
TabishB May 6, 2026
053d8a5
docs(migration-guide): fix inconsistent /opsx:sync description (#1059)
HowardYan888 May 7, 2026
8498042
[codex] Add workspace change planning workflow (#1089)
TabishB May 14, 2026
79303b5
Update recommended high-reasoning models (#1107)
TabishB May 20, 2026
7fdb177
[codex] Fix Windows workspace path CI failure (#1111)
TabishB May 23, 2026
e441287
test: normalize workspace change path assertion (#1117)
TabishB May 23, 2026
fd92ccc
[codex] Add context stores and initiative views (#1127)
TabishB May 27, 2026
11b2690
test: split slow workspace open CI case (#1134)
TabishB May 28, 2026
21c1805
[codex] Polish beta context workspace flow (#1136)
TabishB May 28, 2026
0c5f0c6
Improve context-store setup and cleanup UX (#1137)
TabishB May 28, 2026
9aded17
fix(validator): hint when SHALL/MUST appears only in requirement head…
Pluviobyte May 31, 2026
e364630
[codex] Add Mistral Vibe support with CI fix (#1144)
TabishB May 31, 2026
9e78bca
[codex] Document cross-platform path assertions (#1116)
TabishB Jun 1, 2026
055957f
clarify changeset release tracking (#1148)
TabishB Jun 1, 2026
aa16080
Add changeset for Mistral Vibe support and validator/completion fixes…
TabishB Jun 1, 2026
bc7ab26
Version Packages (#1023)
openspec-release-bot[bot] Jun 1, 2026
0a01146
[codex] Fix workspace.yaml collision detection (#1165)
TabishB Jun 3, 2026
1b06fdd
Version Packages (#1166)
openspec-release-bot[bot] Jun 3, 2026
a0decbe
feat(stores)!: replace workspaces and initiatives with stores (#1190)
TabishB Jun 23, 2026
41ceebe
fix(ci+installers): harden permission checks and guard completion/pro…
TabishB Jun 24, 2026
bb1f18c
docs: comprehensive overhaul — discoverability, explore-first, and cl…
clay-good Jun 24, 2026
cbf386b
fix(adapters): escape carriage returns in YAML frontmatter and dedupe…
zied-jlassi Jun 24, 2026
f987cf3
Parse config JSON containers (#1216) (#1244)
zhangsan582 Jun 24, 2026
737518b
[codex] Refresh security dependency locks (#1249)
TabishB Jun 24, 2026
96f6cac
chore: add changeset for stores beta and config JSON parsing (#1267)
TabishB Jun 28, 2026
546224e
Version Packages (#1248)
openspec-release-bot[bot] Jun 28, 2026
a325305
fix(resolution): converge validate, view, and archive onto canonical …
clay-good Jul 3, 2026
65a7233
docs: add cloudflare documentation deployment website (#1285)
clay-good Jul 3, 2026
5956a8e
Fix `archive` exit code on validation failure (#1311)
danilopopeye Jul 6, 2026
a70dacc
feat(skills): propose /opsx:update planning-artifact update skill (#1…
clay-good Jul 7, 2026
9a0dfb5
refactor: unify requirement reader and surface #498 (#1281)
clay-good Jul 7, 2026
a5bfeda
feat(skills): auto-approve the openspec CLI in generated skills and c…
clay-good Jul 7, 2026
7e21cc5
fix archive scenario drift for #1246 (#1252)
zhangsan582 Jul 7, 2026
4ef0761
docs: clarify change name format (#1261)
ercanerdogan Jul 7, 2026
8ac624b
chore: remove stale npm lockfile (#1319)
TabishB Jul 7, 2026
3f0ca3f
feat: add Trae command adapter (#1090)
jjxyxsjr Jul 7, 2026
8886e3a
feat: add Oh My Pi (OMP) tool support (#1276)
xianzheTM Jul 7, 2026
871dece
chore: remove scheduled docs workflow (#1324)
TabishB Jul 8, 2026
296ecbc
Fix Windows CI flake hardening (#1325)
TabishB Jul 8, 2026
8e9e457
ci(release): add beta prerelease workflow (#1327)
clay-good Jul 8, 2026
93e27a7
fix empty store registration (#1328)
TabishB Jul 8, 2026
1552731
chore: add missing v1.6.0 changeset (#1340)
TabishB Jul 10, 2026
e1b51d1
Version Packages (#1295)
openspec-release-bot[bot] Jul 10, 2026
3f02c68
chore: add OpenSpec release skill (#1341)
TabishB Jul 10, 2026
0a99f41
Deploy docs through Cloudflare Pages (#1342)
TabishB Jul 10, 2026
924354b
docs(readme): show what a spec actually looks like in "See it in acti…
clay-good Jul 17, 2026
da3907b
fix(completion): stop emitting empty switch blocks that break the Pow…
clay-good Jul 17, 2026
f58b445
fix(completion): install the right completions for fish users (#1364)
clay-good Jul 17, 2026
52a8bce
fix(cli): let --change find change names that exist on disk (#1375)
clay-good Jul 17, 2026
285dfd7
fix(config): stop warning about rules keys that belong to another sch…
clay-good Jul 17, 2026
18cbf5d
fix(parser): ignore fenced code blocks when parsing delta specs (#1151)
javigomez Jul 17, 2026
4fdb2a5
fix(schemas): include spec content guidance from concepts docs in spe…
clay-good Jul 17, 2026
a313bf1
fix(schemas): resolve blocking open questions instead of deferring th…
clay-good Jul 17, 2026
15ef3bc
fix(templates): use store-aware root for main specs in sync/archive (…
clay-good Jul 17, 2026
de78c31
fix(templates): re-read dependency artifacts from disk before creatin…
clay-good Jul 17, 2026
3fdd2f2
fix(specs): discover nested spec paths recursively across parse, appl…
clay-good Jul 17, 2026
7958924
fix(archive): stop failing on specs that were already synced before a…
clay-good Jul 17, 2026
5199f41
feat(stores): set one default store for every repo on your machine (#…
clay-good Jul 17, 2026
d423a59
fix(update): warn when a custom profile is missing core workflows (#1…
clay-good Jul 17, 2026
e60ff53
update Kimi CLI to Kimi Code (#1208)
akeyz Jul 17, 2026
4a0f15d
feat: add Hermes Agent support (#1292)
xiaoquisme Jul 17, 2026
57a88a3
feat(zcode): add ZCode as supported tool (#1209)
fyeeme Jul 17, 2026
7704702
fix(qwen): generate Markdown commands instead of deprecated TOML form…
mc856 Jul 17, 2026
ac656c9
feat: add CodeArts Agent skills support (#1266)
CodeArtsAgent Jul 17, 2026
46a4d78
feat(skills): publish workflow skills to skills.sh (#1357)
clay-good Jul 17, 2026
79f1dac
feat(codex): make Codex skills-only and retire managed custom prompts…
showms Jul 18, 2026
9acddcd
fix: use local dates for CLI date-only values (#1361)
showms Jul 18, 2026
b7c85c7
fix: use skill references in SKILL.md for skills-only delivery (#1194)
mc856 Jul 18, 2026
b419e96
fix(archive): treat already-synced RENAMED deltas as no-ops (#1386)
mc856 Jul 18, 2026
9b70481
fix(archive): keep an existing date prefix instead of stacking a new …
mc856 Jul 18, 2026
520aa8c
fix(doctor): note when a store checkout is behind its upstream ref (#…
mc856 Jul 18, 2026
a0eb70e
fix: avoid npx when applying profile changes (#1351)
showms Jul 18, 2026
596d6ba
fix(ui): preserve Windows input after welcome screen (#1175)
showms Jul 18, 2026
470f572
fix(archive): make scenario-drift check multiplicity-aware (#1246) (#…
vishnujayvel Jul 20, 2026
5e365b9
feat(schema): resolve symlinked schema directories (#1299)
benjymoses Jul 20, 2026
a13abea
fix(validate): reject a delta spec at the change's specs/ root (#1392)
clay-good Jul 20, 2026
d2082d1
docs: align cli-update OpenCode spec with commands/ and opsx-* paths …
HowardYan888 Jul 20, 2026
b474f81
fix(templates): don't archive a change before its spec sync finishes …
clay-good Jul 20, 2026
a824aae
docs: add nanopm to community schemas catalog (#1109)
nmrtn Jul 20, 2026
fdf3d12
docs: add e2e-runbooks to Community Schemas table (#1255)
Lukk17 Jul 20, 2026
60f720c
fix(feedback): submit feedback when the repo has no feedback label (#…
clay-good Jul 20, 2026
34d2d67
test(completion): isolate ZshInstaller tests from a real Oh My Zsh in…
clay-good Jul 22, 2026
b33b15d
fix(schemas): stop design.md from restating the proposal (#1401)
clay-good Jul 22, 2026
9d40ae9
fix(nix): build with Node.js 22 now that nixpkgs marks Node 20 insecu…
clay-good Jul 22, 2026
d3a9982
ci: clear Node 20 deprecation warnings by bumping action runtimes (#1…
clay-good Jul 22, 2026
c439a4e
fix(parser): stop delta section dividers from becoming phantom requir…
clay-good Jul 22, 2026
a84ae70
fix(init): use skill references for tools without a command adapter (…
clay-good Jul 22, 2026
9b5d2cd
fix(templates): stop instructing a second date prefix on dated archiv…
mc856 Jul 22, 2026
97d441a
fix(templates): stop the bulk archive when the user picks Cancel (#1398)
clay-good Jul 22, 2026
b3b05e1
fix(init): only advertise slash commands the profile installs (#1410)
clay-good Jul 22, 2026
0da5f98
fix(templates): show the main spec format in the sync-specs skill (#1…
clay-good Jul 22, 2026
378d468
fix(templates): give explore the project's context and rules (#1408)
clay-good Jul 22, 2026
2d6c447
fix(templates): replace Claude-only TodoWrite instruction with a gene…
clay-good Jul 22, 2026
5dfef4b
fix(templates): make the schema instruction field authoritative for a…
clay-good Jul 22, 2026
1dc670d
fix(templates): stop propose from skipping the specs artifact (#1412)
clay-good Jul 22, 2026
27b22ab
feat(validate): accept zero-delta changes that declare skip_specs (#1…
clay-good Jul 22, 2026
ffe27de
chore(scripts): add a parity-hash regeneration helper (#1416)
clay-good Jul 22, 2026
e2f748c
chore(security): add security policy, dependabot config, and config k…
clay-good Jul 22, 2026
040a869
fix(config): compare prototype key guards literally so analysis can s…
clay-good Jul 22, 2026
cac44ec
test(cli): invoke the CLI without a shell (#1426)
clay-good Jul 22, 2026
6832cc4
ci: bump the github-actions group with 6 updates (#1419)
dependabot[bot] Jul 22, 2026
11a301d
chore(deps): bump next in /website in the website-dependencies group …
dependabot[bot] Jul 22, 2026
5406c8b
chore(deps): consolidate dependabot bumps with flake hash update (#1427)
clay-good Jul 22, 2026
81d5109
docs: switch Roo Code references to Zoo Code (#1428)
taltas Jul 22, 2026
2b50338
chore(deps): bump next from 16.2.10 to 16.2.11 in /website (#1429)
dependabot[bot] Jul 23, 2026
6a4f0d7
fix(archive): keep the delta spec's Purpose in a new main spec (#1431)
clay-good Jul 23, 2026
a874d1d
chore(security): create test temp dirs with mkdtemp and override two …
clay-good Jul 23, 2026
26f009d
fix(change): resolve changes by directory instead of requiring propos…
clay-good Jul 23, 2026
b976fc0
fix(website): show openspec init in the homepage getting-started box …
clay-good Jul 23, 2026
6a5171e
fix(validate): allow numeric-prefixed change names (#1435)
clay-good Jul 23, 2026
19d4171
fix(archive): treat early-synced REMOVED deltas as no-ops, plus audit…
clay-good Jul 23, 2026
c33fcb3
chore: route reviews to maintainer team (#1441)
TabishB Jul 27, 2026
5348da9
fix(schema): validate artifacts before forced init (#1446)
showms Jul 27, 2026
3e3cbd3
ci: bump actions/checkout in the github-actions group (#1449)
dependabot[bot] Jul 27, 2026
eac2973
feat(instructions): add runtime context and operation guidance (#1062)
showms Jul 27, 2026
abb422a
chore(deps): consolidate dependabot bumps with flake hash update (#1457)
clay-good Jul 27, 2026
05c7019
chore(security): override brace-expansion to fix the failing audit (#…
clay-good Jul 27, 2026
ebf66c7
fix(init): skip the welcome animation for reduced-motion users (#1462)
clay-good Jul 27, 2026
caed05e
fix(cli): render multi-select prompts with checkbox markers (#1463)
clay-good Jul 27, 2026
5bcf057
fix(templates): replace Claude-only AskUserQuestion instruction with …
clay-good Jul 27, 2026
6b3623a
fix(cli): resolve store pointer for view command (#1455)
c4patino Jul 27, 2026
f917b8b
fix(status): order artifacts by the schema, not the alphabet (#1465)
clay-good Jul 28, 2026
9a61f3f
docs(installation): add an AI-assistant setup prompt (#1466)
clay-good Jul 28, 2026
d32d49f
chore(openspec): archive schema init force validation change (#1467)
alfred-openspec Jul 28, 2026
fb19699
fix(adapters): escape YAML frontmatter values consistently across all…
hsusul Jul 28, 2026
fc886af
fix(templates): auto-select the only active change instead of always …
clay-good Jul 28, 2026
ec6cbb4
docs: add anvil to Community Schemas table (#1469)
jikkujoyce Jul 28, 2026
6295515
feat(update): offer to upgrade a stale CLI during openspec update (#1…
clay-good Jul 28, 2026
10fa39b
fix(update): refresh command files for tools configured without skill…
hsusul Jul 28, 2026
9a937cb
fix(adapters): reference slash commands by the names each tool regist…
clay-good Jul 28, 2026
1637856
feat(adapters): follow the Windsurf rename to Devin Desktop (#1167)
mehdishahdoost Jul 28, 2026
17af60c
fix(archive): make the scenario-drift check fence-aware, plus release…
clay-good Jul 28, 2026
8731290
fix(telemetry): send the usage event directly instead of via posthog-…
clay-good Jul 29, 2026
4e16790
Version Packages (#1380)
openspec-release-bot[bot] Jul 29, 2026
1014c59
docs: catalog intent-driven community schema (#1487)
SuhaibAslam Jul 29, 2026
1aa0f2a
feat(init): add shared agents skills target (#1303)
solanab Jul 29, 2026
84ebc57
fix(validate): report scenarios a MODIFIED requirement would drop (#1…
clay-good Jul 29, 2026
427abf4
fix(tasks): count indented sub-tasks in task progress (#1486)
clay-good Jul 29, 2026
2b3d368
fix(archive): tell the caller which flag to pass when archive can't a…
clay-good Jul 30, 2026
1da6dfa
Docs: add deno install instructions (#1079)
Ardakilic Jul 30, 2026
45cca5d
fix(specs): warn before archiving deletes a note next to a requiremen…
clay-good Jul 31, 2026
690a27e
fix(adapters): stop deleting the CoStrict and Junie commands on every…
mc856 Aug 4, 2026
23c2787
chore(deps-dev): bump eslint from 10.7.0 to 10.8.0 in the development…
dependabot[bot] Aug 4, 2026
80ad1fb
chore(deps): bump the website-dependencies group (#1496)
dependabot[bot] Aug 4, 2026
4e4c9e1
docs(workflows): visualize the OpenSpec lifecycle (#1507)
clay-good Aug 4, 2026
9cd845f
fix(security): keep paths on a short leash (#1499)
clay-good Aug 4, 2026
521ee33
feat(archive): let a change retire a capability it empties (#1484)
clay-good Aug 4, 2026
ece8660
fix(validate): allow non-English requirements (#1502)
clay-good Aug 4, 2026
26bd1d4
fix(templates): correct generated workflow guidance (#1500)
clay-good Aug 4, 2026
0b20ae3
fix(propose): wait for explicit implementation request (#1501)
clay-good Aug 4, 2026
f43fe0e
fix(propose): use the requested workflow schema (#1504)
clay-good Aug 4, 2026
afea111
fix(status): clarify planning completion (#1505)
clay-good Aug 4, 2026
8a3850d
fix(explore): scaffold changes before capturing artifacts (#1503)
clay-good Aug 4, 2026
3d0701f
fix(workflows): preserve nested spec paths (#1508)
clay-good Aug 4, 2026
02b124e
fix(security): patch fast-uri, postcss, and brace-expansion advisorie…
clay-good Aug 4, 2026
3e50944
fix(build): allow esbuild install scripts (#1196)
ismet Aug 5, 2026
7a4a745
feat: generate Copilot coding agent files on `openspec init` (github-…
NicoAvanzDev Aug 5, 2026
0b233ef
fix(templates): deduplicate apply skill and command instructions (#1153)
Shashank200345 Aug 5, 2026
161f945
feat: add MiniMax Code skills support (#1214)
showms Aug 5, 2026
59bfb27
fix(codex): install skills in canonical agents directory (#1511)
clay-good Aug 5, 2026
06b310b
fix(templates): restore intentional apply skill/command separation (#…
clay-good Aug 5, 2026
622c509
fix(telemetry): honor telemetry.enabled in global config (#1513)
FasterPHP Aug 5, 2026
d9bcc18
docs(stores): add multi-repo implementation flow (#1491)
alectimison-maker Aug 5, 2026
96a6548
refactor(templates): share one apply instruction body across skill an…
clay-good Aug 5, 2026
13e213e
feat(tools): add Atlassian Rovo Dev CLI as a first-class tool (#1516)
clay-good Aug 5, 2026
73207a6
feat(copilot): make cloud coding-agent files opt-in (#1517)
clay-good Aug 5, 2026
568e56c
chore(release): add catch-up changeset for Rovo, Codex dir, status (#…
clay-good Aug 5, 2026
d578896
Version Packages (#1488)
openspec-release-bot[bot] Aug 5, 2026
e50bd09
fix(validate): warn on ambiguous task numbering (#1523)
alectimison-maker Aug 7, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
180 changes: 180 additions & 0 deletions .agents/skills/release-openspec/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,180 @@
---
name: release-openspec
description: >-
Use this skill when releasing OpenSpec: audit merged work and changeset
coverage, decide whether a catch-up changeset PR is needed, prepare or resume
the Changesets Version Packages PR, cut a beta or stable release, verify
publishing, and polish GitHub release notes. Also use when asked whether an
open release PR is complete, what the next release step is, or to continue a
release paused for human approval.
---

# Release OpenSpec

Run the OpenSpec release workflow as a resumable state machine. Inspect live GitHub state on every invocation and take only the next safe action. Do not assume an earlier invocation completed.

## Principles

- Treat `Fission-AI/OpenSpec` and `origin/main` as the release source of truth.
- Default to a read-only audit when the user asks for status, readiness, or advice.
- Treat a request to release, prepare a release, continue, or resume as authorization to perform the applicable release actions.
- Preserve the user's checkout. Never discard unrelated changes or switch their current branch just to prepare a changeset.
- Use a temporary worktree from current `origin/main` for release-authored commits when the checkout is dirty or not on `main`.
- Never approve your own PR. Human review is a deliberate gate.
- Treat merge-queue entry as an intermediate state, not a merge. Advance only after GitHub reports `mergedAt` and the commit is present on `main`.
- Never create the automated Version Packages PR manually. The Changesets action owns it.
- Never push an empty commit merely to retrigger CI. Diagnose the failed or missing run first.
- Report URLs, the state reached, and the exact human action needed whenever pausing.

## Know the two PR types

Keep these distinct in output and decisions:

- **Changeset PR**: A normal human-authored PR that adds one or more `.changeset/*.md` files. Prefer adding a changeset to the feature/fix PR; create a catch-up changeset PR only for already-merged work that should be included.
- **Version Packages PR**: The automated `changeset-release/main` PR titled `chore(release): version packages`. Merging or adding changesets to `main` updates this same PR. Merging it publishes the stable release.

An open Version Packages PR does not prohibit a catch-up changeset PR. It means a catch-up PR is useful only when the audit finds missing release-worthy work. Once that PR merges, wait for the existing Version Packages PR to update.

## Start with a release audit

1. Verify the repository and tools:
- Resolve the GitHub repository with `gh repo view --json nameWithOwner,url`.
- Require authenticated `gh`, `git`, and `pnpm` before write actions.
- Stop before release mutations if the canonical repository is not `Fission-AI/OpenSpec`.
2. Refresh without modifying the worktree:

```bash
git fetch origin main
```

Do not fetch every tag indiscriminately. This repository may contain a conflicting historical local tag, which can make `git fetch --tags` fail even though `origin/main` fetched successfully.

3. Find the latest stable GitHub release. Exclude drafts and prereleases; do not use `git describe`, because a beta tag may be newer than the stable baseline.

```bash
gh release list --repo Fission-AI/OpenSpec \
--exclude-drafts --exclude-pre-releases --limit 100 \
--json tagName,publishedAt \
--jq 'max_by(.publishedAt) | {tagName, publishedAt}'
```

Ensure that exact stable tag resolves locally before using it as a `git log` boundary. Fetch only that tag if it is missing. If a same-named local tag disagrees with the canonical remote, report the mismatch and use a separately resolved canonical commit; never force-rewrite the user's tag as part of an audit.

4. Find open release-related PRs:

```bash
gh pr list --repo Fission-AI/OpenSpec --state open \
--head changeset-release/main \
--json number,title,headRefName,baseRefName,url,reviewDecision,statusCheckRollup
```

Identify the Version Packages PR by `headRefName == "changeset-release/main"`, not title alone. Separately list likely changeset PRs and inspect their files; require positive additions to `.changeset/*.md`. Do not mistake the Version Packages PR's changeset deletions for authored changesets, and do not rely on titles because a feature/fix PR may add release tracking.
5. Read the live release policy in `.changeset/README.md`, pending `.changeset/*.md` files on `origin/main`, and the Version Packages PR body/files when it exists.
6. List first-parent commits since the latest stable tag:

```bash
git log --first-parent --date=short \
--pretty=format:'%h%x09%ad%x09%s' <stable-tag>..origin/main
```

7. Map release-worthy merged PRs to existing changesets. Use PR files and changeset history; do not infer coverage from similar wording alone.
8. Classify the audit as:
- `missing-tracking`: user-facing work intended for this release lacks a changeset;
- `awaiting-changeset-review`: a suitable changeset PR already exists;
- `awaiting-merge-queue`: an approved changeset or Version Packages PR is queued but has not landed on `main`;
- `awaiting-version-update`: required changesets are on `main`, but the Version Packages PR has not incorporated them;
- `awaiting-version-review`: the Version Packages PR is current but lacks approval;
- `ready-to-publish`: the Version Packages PR is current, approved, and green;
- `publishing`: the Version Packages PR merged but artifacts are incomplete;
- `needs-finalization`: npm, tag, and GitHub Release exist but notes are still raw;
- `complete`: package, tag, GitHub Release, and polished notes agree.

Present a compact audit with the stable baseline, proposed version, covered changes, possible omissions, intentionally skipped internal/docs work, open PRs, and next action.

## Decide changeset coverage

Follow `.changeset/README.md` rather than assuming every merged PR needs a changeset.

Include work selected for release tracking, especially:

- new user-facing features or commands;
- notable fixes or hotfixes;
- breaking changes or deprecations;
- user-visible performance improvements.

Normally skip documentation-only work, tests, CI/tooling, and internal refactors. Flag ambiguous user-visible changes instead of silently excluding them. Ask the user only when the ambiguity materially changes release scope or the semantic version; otherwise use best judgment and let PR review be the approval gate.

## Create or continue a changeset PR

Do this only for `missing-tracking`.

1. If an open changeset PR already covers the missing work, reuse it. Inspect its `headRefName`, head repository, and `maintainerCanModify`; fetch that exact head branch from its owning repository into a temporary worktree, make the update there, and push back to the same PR head. Stop if the branch is not writable. Do not create a duplicate PR or replacement branch.
2. Read `.changeset/README.md` immediately before authoring.
3. Only when no suitable PR exists, create a short `changeset-<scope>` branch from current `origin/main`. Use a temporary worktree so the operator's checkout remains untouched.
4. Prefer one changeset per coherent release unit. A single catch-up changeset may summarize several small items selected for the same release.
5. Use the exact package name `"@fission-ai/openspec"`, the highest required semantic bump, only relevant headings, and user-focused descriptions.
6. Validate before pushing:

```bash
pnpm exec changeset status
```

7. Commit, push, and open a PR whose body lists the covered merged PRs and explains why the catch-up is needed.
8. Stop after returning the PR URL and request human approval. Do not approve it yourself.

On a later invocation, if the PR is approved and checks are green, merge or enqueue it only when the user asked to continue or complete the release. If GitHub uses a merge queue, inspect `mergeQueueEntry`, queue checks, and `mergedAt`; remain in `awaiting-merge-queue` until the PR actually lands on `main`. Then wait for the Changesets action on `main` to update the existing Version Packages PR. Poll with concise progress updates; do not push an empty commit or another branch update, because that can dismiss approval and restart the queue.

## Validate the Version Packages PR

Before calling it ready:

1. Confirm it targets `main` from `changeset-release/main` and is generated by the expected automation.
2. Enumerate every pending `.changeset/*.md` file on current `main`, excluding `.changeset/README.md`. Verify the PR consumes every one and contains the corresponding changelog content. If any pending changeset should be deferred, stop: remove or revise it through a separately reviewed change and wait for automation to regenerate the Version Packages PR before continuing.
3. Fetch `baseRefOid` and `headRefOid` with `gh pr view`, require `baseRefOid` to equal current `origin/main`, and create clean detached temporary worktrees for both revisions. If the head object is missing locally, fetch the immutable `pull/<number>/head` ref first. Never validate from the operator's current worktree.
4. In the base worktree, run `pnpm exec changeset status --output changeset-status.json` and read the expected package/version from that file. Install locked dependencies in the temporary worktree first if the Changesets CLI is unavailable.
5. Compare the base status and complete pending-changeset set against the head worktree: `package.json`, `CHANGELOG.md`, removed changeset files, PR body, and proposed version must all agree. This is a base-to-head comparison because the head has already consumed the changesets and cannot calculate the pending release itself.
6. Remove the temporary worktrees after validation, then inspect all required checks and review state with `gh pr view` / `gh pr checks`.

If current but unapproved, return the URL and pause for human approval. If approved and green, merge or enqueue only when the user asked to release or continue. With merge queue enabled, do not treat approval, auto-merge enablement, or queue entry as the stable publish trigger; wait for `mergedAt` and confirmation that the merge reached `main`.

## Verify stable publishing

After the Version Packages PR merges:

1. Find the release workflow run for the merge commit and wait for completion.
2. Verify all three artifacts independently:
- `npm view @fission-ai/openspec@<version> version`
- remote tag `v<version>` points at the expected commit;
- `gh release view v<version>` exists and is not a prerelease.
3. If only some artifacts exist, report partial state and resume verification before retrying any publish action. Never republish a version already on npm.
4. Once all artifacts exist, read [references/release-notes.md](references/release-notes.md), polish the GitHub Release, and verify the saved title/body.

## Cut a beta

Only enter this path when the user explicitly asks for a beta or prerelease.

1. Run the same audit and confirm pending changesets produce a next stable version.
2. Explain that beta publishing does not consume changesets or replace the stable Version Packages PR.
3. Trigger the existing `release-prepare.yml` workflow on `main`; do not calculate or set the beta version locally.
4. Verify the workflow-selected version, npm `beta` dist-tag, remote tag, and prerelease GitHub Release.
5. Do not merge the stable Version Packages PR as part of a beta request.

## Handle failures

- For failed CI, inspect the failing check and logs before proposing a rerun or code change.
- For a stale Version Packages PR, first confirm a successful `push` run of `release-prepare.yml` occurred after the latest changeset reached `main`.
- For branch divergence, let the Changesets action update its branch. Do not force-push `changeset-release/main`.
- For a queued PR, inspect merge-group checks and queue state. Do not re-enqueue, update the branch, or rerun unrelated checks while it is progressing normally.
- For a version that already exists on npm, stop and reconcile the tag/GitHub Release rather than incrementing or republishing implicitly.
- For missing GitHub permissions or required review, report the exact gate and URL; preserve the detected state so the next invocation can resume by inspection.

## Completion report

Report:

- released version and stable/beta channel;
- changeset PR and Version Packages PR URLs, when applicable;
- release workflow result;
- npm package, tag, and GitHub Release verification;
- release-notes finalization status;
- any intentionally deferred changes.
4 changes: 4 additions & 0 deletions .agents/skills/release-openspec/agents/openai.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
interface:
display_name: "Release OpenSpec"
short_description: "Audit, prepare, publish, and finalize releases"
default_prompt: "Use $release-openspec to audit the current release state and take the next safe release step."
89 changes: 89 additions & 0 deletions .agents/skills/release-openspec/references/release-notes.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# GitHub release notes

Read this file only after the npm package, tag, and GitHub Release exist, or when the user explicitly asks to preview or polish release notes.

## Gather source material

1. Bind the release values once and fetch the current release. Replace the example values, but keep every expansion quoted:

```bash
tag="vX.Y.Z"
previous_tag="vA.B.C"
gh release view "$tag" --repo Fission-AI/OpenSpec \
--json body,name,isPrerelease,url
```

2. For a stable release, find the preceding stable release by excluding drafts and prereleases. For a beta, compare against the preceding tag in the same beta series when one exists; otherwise compare against the latest stable release.
3. Fetch GitHub-generated notes to recover first-time contributor attribution and the full changelog link:

```bash
gh api repos/Fission-AI/OpenSpec/releases/generate-notes \
-f "tag_name=$tag" -f "previous_tag_name=$previous_tag" -q '.body'
```

4. Cross-check the final content against the released `CHANGELOG.md` section and the merged Version Packages PR. Never invent an item from commit titles alone.

## Title

Use:

```text
<tag> - <one-to-four-word theme>
```

Lead with the most notable user-facing addition. For two similarly important additions, comma-separate them. For a fix-only release, name the primary fixed area.

## Body

Use only the sections that contain content:

```markdown
## What's New in <tag>

<One direct sentence describing the release theme.>

### New

- **Feature** - What users can now do and when it helps.

### Improved

- **Area** - What became easier, safer, faster, or more consistent.

### Fixed

- **Area** - What now behaves correctly.

## New Contributors

* @username made their first contribution in #PR

**Full Changelog**: <compare-link>
```

## Voice and cleanup

- Write for developers using OpenSpec with AI coding assistants.
- Be direct and practical; avoid marketing language.
- Lead with user capability or impact, not implementation.
- Keep each item to one or two sentences.
- Remove commit hashes, changeset wrappers, raw semantic-bump headings, and inline `Thanks @user` boilerplate.
- Omit internal CI, test, and refactor details unless users experience the result.
- Keep contribution credit in `New Contributors`, not inside feature bullets.
- Preserve GitHub's first-contribution wording and PR link.
- Exclude core maintainer `@TabishB` from `New Contributors`. If no external first-time contributors remain, omit that section.
- Always retain the full changelog compare link.

## Apply and verify

Create a temporary file, write the body to it with the available file-editing tool, bind the final title, then update:

```bash
notes_file="$(mktemp)"
title="$tag - Release Theme"
# Write the polished Markdown body to "$notes_file" before continuing.
gh release edit "$tag" --repo Fission-AI/OpenSpec \
--title "$title" --notes-file "$notes_file"
```

When the user asked only for a preview or audit, show the proposed title/body without editing. When the user asked to run, continue, or complete the release, apply the polished notes without an extra confirmation pause, then fetch the release again and verify the saved title/body.
24 changes: 13 additions & 11 deletions .changeset/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,12 @@ Follow the prompts to select version bump type and describe your changes.

## Workflow

1. **Add a changeset** — Run `pnpm changeset` locally before or after your PR
2. **Version PR** — CI opens/updates a "Version Packages" PR when changesets merge to main
3. **Release** — Merging the Version PR triggers npm publish and GitHub Release
1. **Choose the release path**: Maintainers decide whether a PR follows the normal release cadence or gets dedicated release tracking.
2. **Add dedicated release tracking**: When a maintainer asks for a changeset, run `pnpm changeset` locally before or after your PR.
3. **Version PR**: CI opens/updates a "Version Packages" PR when changesets merge to main.
4. **Release**: Merging the Version PR triggers npm publish and GitHub Release.

> **Note:** Contributors only need to run `pnpm changeset`. Versioning (`changeset version`) and publishing happen automatically in CI.
> **Note:** The default path is the normal release cadence. Add a changeset when a maintainer or release owner wants dedicated release notes and version tracking for the PR. Versioning (`changeset version`) and publishing happen automatically in CI.

## Template

Expand Down Expand Up @@ -54,22 +55,23 @@ Include only the sections relevant to your change.

| Type | When to use | Example |
|------|-------------|---------|
| `patch` | Bug fixes, small improvements | Fixed crash when config missing |
| `patch` | Release-tracked bug fixes, small improvements | Fixed crash when config missing |
| `minor` | New features, non-breaking additions | Added `--verbose` flag |
| `major` | Breaking changes, removed features | Renamed `init` to `setup` |

## When to Create a Changeset

**Create one for:**
- New features or commands
- Bug fixes that affect users
**Use dedicated release tracking for:**
- New features or commands selected for release
- Notable bug fixes or hotfixes requested by a maintainer/release owner
- Breaking changes or deprecations
- Performance improvements users would notice
- Performance improvements users would notice and that are planned for release

**Skip for:**
**Use the normal release cadence for:**
- Routine bug fixes that fit the normal release cadence
- Documentation-only changes
- Test additions/fixes
- Internal refactoring with no user impact
- Internal refactoring that preserves user behavior
- CI/tooling changes

## Writing Good Descriptions
Expand Down
2 changes: 1 addition & 1 deletion .devcontainer/devcontainer.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "OpenSpec Development",
"image": "mcr.microsoft.com/devcontainers/typescript-node:1-20-bookworm",
"image": "mcr.microsoft.com/devcontainers/typescript-node:1-22-bookworm",

// Additional tools and features
"features": {
Expand Down
4 changes: 4 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
# The skills.sh distribution files are generated LF-only and compared
# byte-for-byte by test/core/templates/skillssh-parity.test.ts. Force LF on
# checkout so Windows autocrlf doesn't turn them into CRLF and fail parity.
skills/** text eol=lf
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# Default code ownership
* @TabishB
* @Fission-AI/openspec-maintainers
Loading