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
1 change: 0 additions & 1 deletion .github/CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ All PR titles must follow conventional commits with a **package scope**:
| Scope | Meaning |
| ---------------------- | ---------------------------------------------------------------- |
| `[pi-package-name]` | Changes to `packages/[pi-package-name]` |
| `session-deck-desktop` | Changes to `apps/session-deck-desktop` |
| `root` | Root-level changes (CI, workflows, configs, shared tooling) |
| _omit scope_ | Changes affecting all packages equally |

Expand Down
5 changes: 1 addition & 4 deletions .github/release-please-config.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,7 @@
"$schema": "https://raw.githubusercontent.com/googleapis/release-please/main/schemas/config.json",
"packages": {
"packages/pi-merge-ready": {},
"packages/pi-session-deck": {
"draft": true,
"force-tag-creation": true
},
"packages/pi-session-deck": {},
"packages/pi-openrouter": {},
"packages/pi-session-hygiene": {},
"packages/pi-spinner-verbs": {},
Expand Down
197 changes: 1 addition & 196 deletions .github/workflows/release-please.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@ jobs:
runs-on: ubuntu-latest
outputs:
paths_released: ${{ steps.release.outputs.paths_released }}
pi_session_deck_released: ${{ steps.release.outputs['packages/pi-session-deck--release_created'] }}
pi_session_deck_tag_name: ${{ steps.release.outputs['packages/pi-session-deck--tag_name'] }}
pi_session_deck_version: ${{ steps.release.outputs['packages/pi-session-deck--version'] }}
steps:
- uses: googleapis/release-please-action@v4
id: release
Expand Down Expand Up @@ -56,203 +53,11 @@ jobs:
if: steps.release.outputs.releases_created == 'true'
run: pnpm -r --filter './packages/*' --if-present build

- name: Publish changed packages except pi-session-deck
- name: Publish changed packages
if: steps.release.outputs.releases_created == 'true'
run: |
echo "Released packages: ${{ steps.release.outputs.paths_released }}"
echo '${{ steps.release.outputs.paths_released }}' | jq -r '.[]' | while read -r pkg; do
if [ "$pkg" = "packages/pi-session-deck" ]; then
echo "Deferring $pkg until its desktop release is public"
continue
fi
echo "Publishing $pkg"
(cd "$pkg" && npm publish)
done

session-deck-desktop-build:
needs: release
if: needs.release.outputs.pi_session_deck_released == 'true'
name: Session Deck desktop (${{ matrix.arch }})
strategy:
fail-fast: true
matrix:
include:
- runner: macos-15
target: aarch64-apple-darwin
arch: arm64
- runner: macos-15-intel
target: x86_64-apple-darwin
arch: x64
runs-on: ${{ matrix.runner }}
permissions:
contents: read
steps:
- name: Checkout pi-session-deck release tag
uses: actions/checkout@v4
with:
ref: ${{ needs.release.outputs.pi_session_deck_tag_name }}

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
cache: 'pnpm'

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Install native Rust target
run: rustup target add "${{ matrix.target }}"

- name: Build and verify desktop app ZIP
run: |
pnpm --filter ./apps/session-deck-desktop artifact:macos \
--version "${{ needs.release.outputs.pi_session_deck_version }}" \
--target "${{ matrix.target }}" \
--artifact-dir "dist/artifacts-${{ matrix.arch }}"

- name: Stage architecture artifacts
uses: actions/upload-artifact@v4
with:
name: session-deck-desktop-${{ matrix.arch }}
path: |
apps/session-deck-desktop/dist/artifacts-${{ matrix.arch }}/session-deck-desktop-v${{ needs.release.outputs.pi_session_deck_version }}-macos-${{ matrix.arch }}.zip
apps/session-deck-desktop/dist/artifacts-${{ matrix.arch }}/session-deck-desktop-v${{ needs.release.outputs.pi_session_deck_version }}-macos-${{ matrix.arch }}.zip.sha256
if-no-files-found: error
retention-days: 7

session-deck-publish:
needs: [release, session-deck-desktop-build]
if: needs.release.outputs.pi_session_deck_released == 'true'
runs-on: ubuntu-latest
permissions:
actions: read
contents: write
id-token: write
steps:
- name: Checkout pi-session-deck release tag
uses: actions/checkout@v4
with:
ref: ${{ needs.release.outputs.pi_session_deck_tag_name }}

- name: Setup pnpm
uses: pnpm/action-setup@v4
with:
version: 10

- name: Setup Node.js and npm trusted publishing
uses: actions/setup-node@v4
with:
node-version: '22.14'
cache: 'pnpm'
registry-url: 'https://registry.npmjs.org'

- name: Install npm 11
run: npm install -g npm@11

- name: Install dependencies
run: pnpm install --frozen-lockfile

- name: Merge native architecture artifacts
uses: actions/download-artifact@v4
with:
pattern: session-deck-desktop-*
path: apps/session-deck-desktop/dist/release-artifacts
merge-multiple: true

- name: Validate four desktop release files
env:
SESSION_DECK_RELEASE_TAG: ${{ needs.release.outputs.pi_session_deck_tag_name }}
SESSION_DECK_VERSION: ${{ needs.release.outputs.pi_session_deck_version }}
run: |
set -euo pipefail
artifact_dir="apps/session-deck-desktop/dist/release-artifacts"
stem="session-deck-desktop-v${SESSION_DECK_VERSION}-macos"
expected_tag="pi-session-deck-v${SESSION_DECK_VERSION}"

test "$SESSION_DECK_RELEASE_TAG" = "$expected_tag" || {
echo "Release tag $SESSION_DECK_RELEASE_TAG does not match version $SESSION_DECK_VERSION" >&2
exit 1
}
test "$(node -p "require('./packages/pi-session-deck/package.json').version")" = "$SESSION_DECK_VERSION" || {
echo "Package version does not match release version $SESSION_DECK_VERSION" >&2
exit 1
}

printf '%s\n' \
"${stem}-arm64.zip" \
"${stem}-arm64.zip.sha256" \
"${stem}-x64.zip" \
"${stem}-x64.zip.sha256" \
| LC_ALL=C sort > "$RUNNER_TEMP/expected-assets.txt"
find "$artifact_dir" -mindepth 1 -maxdepth 1 -exec basename {} \; \
| LC_ALL=C sort > "$RUNNER_TEMP/actual-assets.txt"
diff -u "$RUNNER_TEMP/expected-assets.txt" "$RUNNER_TEMP/actual-assets.txt"

while IFS= read -r name; do
test -f "$artifact_dir/$name" && test ! -L "$artifact_dir/$name" && test -s "$artifact_dir/$name" || {
echo "Expected a non-empty regular file: $name" >&2
exit 1
}
done < "$RUNNER_TEMP/expected-assets.txt"

(
cd "$artifact_dir"
sha256sum "${stem}-arm64.zip" | cmp - "${stem}-arm64.zip.sha256"
sha256sum "${stem}-x64.zip" | cmp - "${stem}-x64.zip.sha256"
)

- name: Require an empty draft and prepare release notes
env:
GH_TOKEN: ${{ github.token }}
SESSION_DECK_RELEASE_TAG: ${{ needs.release.outputs.pi_session_deck_tag_name }}
run: |
set -euo pipefail
gh release view "$SESSION_DECK_RELEASE_TAG" --json isDraft,assets,body \
> "$RUNNER_TEMP/release-before.json"
test "$(jq -r '.isDraft' "$RUNNER_TEMP/release-before.json")" = true || {
echo "Session Deck release must still be a draft" >&2
exit 1
}
test "$(jq '.assets | length' "$RUNNER_TEMP/release-before.json")" = 0 || {
echo "Refusing to overwrite preexisting release assets" >&2
exit 1
}

jq -r '.body // ""' "$RUNNER_TEMP/release-before.json" \
> "$RUNNER_TEMP/release-notes.md"
cat >> "$RUNNER_TEMP/release-notes.md" <<'EOF'

## macOS desktop build notice

The macOS desktop ZIPs are ad-hoc signed. They are not Developer ID signed and are not notarized. macOS may block the first launch. First try to open the app, then, only if you trust this release, use **System Settings → Privacy & Security → Open Anyway** and confirm **Open**. The ad-hoc signature does not verify the publisher.
EOF

- name: Upload four desktop assets to draft release
env:
GH_TOKEN: ${{ github.token }}
SESSION_DECK_RELEASE_TAG: ${{ needs.release.outputs.pi_session_deck_tag_name }}
SESSION_DECK_VERSION: ${{ needs.release.outputs.pi_session_deck_version }}
run: |
set -euo pipefail
artifact_dir="apps/session-deck-desktop/dist/release-artifacts"
stem="session-deck-desktop-v${SESSION_DECK_VERSION}-macos"
gh release upload "$SESSION_DECK_RELEASE_TAG" \
"$artifact_dir/${stem}-arm64.zip" \
"$artifact_dir/${stem}-arm64.zip.sha256" \
"$artifact_dir/${stem}-x64.zip" \
"$artifact_dir/${stem}-x64.zip.sha256"

- name: Publish GitHub release
env:
GH_TOKEN: ${{ github.token }}
SESSION_DECK_RELEASE_TAG: ${{ needs.release.outputs.pi_session_deck_tag_name }}
run: gh release edit "$SESSION_DECK_RELEASE_TAG" --notes-file "$RUNNER_TEMP/release-notes.md" --draft=false

- name: Publish pi-session-deck after public release
run: cd packages/pi-session-deck && npm publish
120 changes: 0 additions & 120 deletions .github/workflows/session-deck-desktop.yml

This file was deleted.

1 change: 0 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,6 @@ benchmarks/test-runners/dotnet/obj/
# Rust / Cargo
benchmarks/test-runners/cargo/target/
benchmarks/test-runners/cargo-build/target/
apps/session-deck-desktop/src-tauri/target/

# PHPUnit / Pest
benchmarks/test-runners/phpunit/vendor/
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Small, focused packages to augment your Pi environment without adding unnecessar

| Package | Description |
| ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
| [`pi-session-deck`](packages/pi-session-deck/README.md) | The full Pi session lifecycle in one place: create and organize sessions across repos and worktrees, see what each agent is doing or waiting on, and reopen or end them from a TUI, desktop app, or iTerm2 Toolbelt. |
| [`pi-session-deck`](packages/pi-session-deck/README.md) | The full Pi session lifecycle in one place: create and organize sessions across repos and worktrees, see what each agent is doing or waiting on, and reopen or end them from a TUI or iTerm2 Toolbelt. |
| [`pi-merge-ready`](packages/pi-merge-ready/README.md) | Pull requests that explain and repair their own blockers. Give your agents the context they need to take your PR all the way to green. |
| [`pi-openrouter`](packages/pi-openrouter/README.md) | OpenRouter usage/account overlays, model sync, api key management, and session tagging for Pi. |
| [`pi-session-hygiene`](packages/pi-session-hygiene/README.md) | Status bar indicator for session cost, context, and cache rate to track session health |
Expand Down
Loading
Loading