Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .changeset/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Changesets

Warpforge ships as one product, so this directory versions a single package:
the root `package.json`. Every user-facing change should carry a changeset that
describes it in release-note language.

Add one before opening a pull request:

```bash
bun install # once, at the repository root
bun run changeset
```

Choose `patch`, `minor`, or `major`, then write the summary the release notes
should contain. The generated Markdown file is committed with the change.

The **Version release** workflow consumes every pending changeset: it bumps the
root `package.json`, rewrites `CHANGELOG.md`, propagates the new version to the
Rust, Tauri, and desktop manifests via `scripts/sync-version.mjs`, and pushes
the immutable `vX.Y.Z` tag that **Draft release** builds from. See
`docs/RELEASING.md`.
12 changes: 12 additions & 0 deletions .changeset/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"$schema": "https://unpkg.com/@changesets/config@3.1.1/schema.json",
"changelog": ["@changesets/changelog-github", { "repo": "ephor/warpforge" }],
"commit": false,
"fixed": [],
"linked": [],
"access": "restricted",
"baseBranch": "main",
"updateInternalDependencies": "patch",
"privatePackages": { "version": true, "tag": false },
"ignore": []
}
10 changes: 10 additions & 0 deletions .changeset/famous-bottles-carry.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
---
"warpforge": minor
---

Lets you clear a session out of the way without finishing it. Snooze it for an
hour, this evening, tomorrow morning, or until next Monday and it comes back
when the time is up, or settle it to acknowledge it now and keep it quiet until
something new happens. A running session cannot be settled, and a session
waiting on a permission request can be neither settled nor snoozed, so nothing
that needs an answer is silently dismissed.
7 changes: 7 additions & 0 deletions .changeset/olive-carrots-invite.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"warpforge": minor
---

Keeps an orchestration in the Active lane while any of its agents is still
running. A review-ready or blocked child no longer pulls the whole group out of
Active; it stays visible through the group summary and the attention filter.
9 changes: 9 additions & 0 deletions .changeset/plenty-donkeys-listen.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"warpforge": minor
---

Keeps the sessions rail beside your work instead of over it. On wide windows it
is a persistent sidebar that stays open when you enter a task, and it can be
dragged or keyboard-resized to a width that is remembered between launches. Its
filter bar is now a Working, Needs you, and All switch with sorting and grouping
tucked into icon buttons, and session cards show the agent running them.
7 changes: 7 additions & 0 deletions .changeset/rich-pianos-shave.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"warpforge": patch
---

Generates release versions and release notes from changesets, so every release
carries the notes its contributors wrote instead of hand-maintained version
metadata.
8 changes: 8 additions & 0 deletions .changeset/tidy-moons-repeat.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"warpforge": minor
---

Gives the rail and the board one shared view of what still needs you. A session
snoozed for later or settled lands in the same place in both, and the board
gains Needs attention, Later, and Handled filters with live counts beside each
group.
20 changes: 20 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,26 @@ concurrency:
cancel-in-progress: true

jobs:
changeset:
name: Changeset
if: github.event_name == 'pull_request'
runs-on: ubuntu-22.04
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.14
- run: bun install --frozen-lockfile
# Advisory: a pull request without a changeset ships no release note and
# no version bump. That is legitimate for chores, so this never blocks.
- name: Report pending release impact
continue-on-error: true
run: |
git fetch origin "${{ github.base_ref }}"
bun run changeset status --since "origin/${{ github.base_ref }}"

rust:
name: Rust daemon and protocol
runs-on: ubuntu-22.04
Expand Down
24 changes: 22 additions & 2 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ jobs:
exit 1
}
bun scripts/check-release-version.mjs "$RELEASE_TAG"
bun scripts/changelog-entry.mjs "$RELEASE_TAG" >/dev/null
- name: Install Tauri system dependencies
run: |
sudo apt-get update
Expand Down Expand Up @@ -169,12 +170,26 @@ jobs:
outputs:
release_id: ${{ steps.release.outputs.release_id }}
steps:
- uses: actions/checkout@v4
with:
ref: ${{ inputs.version }}
# The notes are the Changesets-generated CHANGELOG.md section for this
# version, so published notes match what contributors actually wrote.
- name: Render release notes from the changelog
id: notes
run: |
{
echo "body<<RELEASE_NOTES_EOF"
node scripts/changelog-entry.mjs "${{ inputs.version }}"
echo "RELEASE_NOTES_EOF"
} >> "$GITHUB_OUTPUT"
- name: Create or reset the exact draft release
id: release
env:
GH_TOKEN: ${{ github.token }}
GH_REPO: ${{ github.repository }}
RELEASE_TAG: ${{ inputs.version }}
RELEASE_NOTES: ${{ steps.notes.outputs.body }}
run: |
if release_id="$(gh release view "$RELEASE_TAG" --json databaseId --jq .databaseId 2>/dev/null)"; then
release_json="$(gh api "repos/$GH_REPO/releases/$release_id")"
Expand All @@ -186,13 +201,18 @@ jobs:
jq -r '.assets[].id' <<<"$release_json" | while IFS= read -r asset_id; do
gh api --method DELETE "repos/$GH_REPO/releases/assets/$asset_id"
done

release_json="$(
gh api --method PATCH "repos/$GH_REPO/releases/$release_id" \
-f body="$RELEASE_NOTES"
)"
else
release_json="$(
gh api --method POST "repos/$GH_REPO/releases" \
-f tag_name="$RELEASE_TAG" \
-f name="Warpforge ${RELEASE_TAG#v}" \
-F draft=true \
-F generate_release_notes=true
-f body="$RELEASE_NOTES" \
-F draft=true
)"
fi
echo "release_id=$(jq -r .id <<<"$release_json")" >> "$GITHUB_OUTPUT"
Expand Down
107 changes: 107 additions & 0 deletions .github/workflows/version.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
name: Version release

# Consumes the changesets merged into main: bumps the root package.json,
# regenerates CHANGELOG.md, propagates the version to every Rust, Tauri, and
# desktop manifest, and pushes the immutable vX.Y.Z tag that the "Draft
# release" workflow builds from. It never builds, signs, or publishes anything.

on:
workflow_dispatch:

permissions:
contents: read

concurrency:
group: version-release
cancel-in-progress: false

jobs:
version:
name: Bump version and tag
runs-on: ubuntu-22.04
permissions:
contents: write
steps:
- uses: actions/checkout@v4
with:
ref: main
fetch-depth: 0
- uses: oven-sh/setup-bun@v2
with:
bun-version: 1.3.14
# check-release-version.mjs reads the manifests through `cargo metadata`.
- uses: dtolnay/rust-toolchain@stable
- run: bun install --frozen-lockfile
- name: Refuse to version a dirty or diverged checkout
run: |
test -z "$(git status --porcelain)" || {
echo "checkout is not clean before versioning" >&2
git status --porcelain >&2
exit 1
}
git fetch origin main
test "$(git rev-parse HEAD)" = "$(git rev-parse origin/main)" || {
echo "main moved while this run started; rerun the workflow" >&2
exit 1
}
- name: Record the version being released from
id: before
run: echo "version=$(node -p "require('./package.json').version")" >> "$GITHUB_OUTPUT"
# The fork applies `changeset version` directly on main instead of the
# upstream "Version Packages" pull request. `tag` and `github-release`
# are disabled because Warpforge releases from a single product-wide
# vX.Y.Z tag, not per-package or date-based tags.
- name: Apply changesets
id: changesets
uses: edenlabllc/changesets-action@a065d25c2b5411d0c10a9fb238686ca94926b29e # v1
with:
mode: stable
prepare-script: node scripts/sync-version.mjs
commit: true
tag: false
github-release: false
comment: false
env:
GITHUB_TOKEN: ${{ github.token }}
- name: Report that there was nothing to release
if: steps.changesets.outputs.upgraded != 'true'
run: |
{
echo "### No release"
echo
echo "No pending changesets, so the version was left at" \
"\`${{ steps.before.outputs.version }}\`."
} >> "$GITHUB_STEP_SUMMARY"
- name: Verify the versioned commit
if: steps.changesets.outputs.upgraded == 'true'
id: release
env:
PREVIOUS_VERSION: ${{ steps.before.outputs.version }}
run: |
version="$(node -p "require('./package.json').version")"
test "$version" != "$PREVIOUS_VERSION" || {
echo "changesets reported an upgrade but the version did not change" >&2
exit 1
}
bun scripts/check-release-version.mjs "v$version"
echo "version=$version" >> "$GITHUB_OUTPUT"
- name: Push the immutable release tag
if: steps.changesets.outputs.upgraded == 'true'
env:
GH_TOKEN: ${{ github.token }}
RELEASE_TAG: v${{ steps.release.outputs.version }}
run: |
git fetch origin --tags
if git rev-parse -q --verify "refs/tags/$RELEASE_TAG" >/dev/null; then
echo "tag already exists: $RELEASE_TAG" >&2
exit 1
fi
git tag -a "$RELEASE_TAG" -m "Warpforge $RELEASE_TAG"
git push origin "refs/tags/$RELEASE_TAG"
{
echo "### Tagged \`$RELEASE_TAG\`"
echo
echo "Run **Draft release** with \`$RELEASE_TAG\` to build," \
"sign, and stage the assets, then smoke-test the draft before" \
"publishing it."
} >> "$GITHUB_STEP_SUMMARY"
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,11 @@
# Rust build artifacts
target/

# Node tooling (changesets lives at the repository root)
node_modules/

# Working state written by the changesets release action
.changeset/prerelease.json
desktop/src-tauri/binaries/*
!desktop/src-tauri/binaries/.gitkeep

Expand Down
4 changes: 4 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -169,3 +169,7 @@ Run the fast CI checks locally — CI rejects on these and it's avoidable:
A pre-commit hook (`.githooks/pre-commit`, enabled via
`git config core.hooksPath .githooks`) runs these; do not rely on it — run them
yourself before committing, and never `--no-verify` to dodge a real failure.

User-facing changes also need a changeset (`bun run changeset` at the repo
root). Never hand-edit versions or `CHANGELOG.md` — the **Version release**
workflow owns both. See `docs/RELEASING.md`.
Loading
Loading