Skip to content
Closed
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
90 changes: 90 additions & 0 deletions .github/workflows/build-web-binaries.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
name: Build Web Binaries

on:
workflow_call:
workflow_dispatch:

jobs:
build:
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
name: linux-x64
- os: macos-latest
target: x86_64-apple-darwin
name: darwin-x64
- os: macos-latest
target: aarch64-apple-darwin
name: darwin-arm64
- os: windows-latest
target: x86_64-pc-windows-msvc
name: win32-x64

runs-on: ${{ matrix.os }}
name: Build ${{ matrix.name }}

steps:
- uses: actions/checkout@v4

- name: Install Linux dependencies
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get update
sudo apt-get install -y \
pkg-config \
libwebkit2gtk-4.1-dev \
libgtk-3-dev \
libssl-dev \
libayatana-appindicator3-dev \
librsvg2-dev

- name: Setup Bun
uses: oven-sh/setup-bun@v2

- name: Install frontend dependencies
run: bun install

- name: Build frontend
run: bun run build

- name: Build binary
uses: houseabsolute/actions-rust-cross@v1
with:
command: build
target: ${{ matrix.target }}
args: "--release --locked --bin gsd-ui-web"
strip: true
working-directory: src-tauri

- name: Prepare artifact (Unix)
if: matrix.os != 'windows-latest'
shell: bash
run: |
mkdir -p dist-bin
BINARY="src-tauri/target/${{ matrix.target }}/release/gsd-ui-web"
ARTIFACT="gsd-ui-web-${{ matrix.name }}"
cp "$BINARY" "dist-bin/$ARTIFACT"
cd dist-bin
sha256sum "$ARTIFACT" > "$ARTIFACT.sha256"

- name: Prepare artifact (Windows)
if: matrix.os == 'windows-latest'
shell: pwsh
run: |
New-Item -ItemType Directory -Force -Path dist-bin
$binary = "src-tauri/target/${{ matrix.target }}/release/gsd-ui-web.exe"
$artifact = "gsd-ui-web-${{ matrix.name }}.exe"
Copy-Item $binary "dist-bin/$artifact"
cd dist-bin
$hash = (Get-FileHash -Algorithm SHA256 $artifact).Hash.ToLower()
"$hash $artifact" | Out-File -Encoding utf8 "$artifact.sha256"

- name: Upload artifact
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.name }}
path: dist-bin/*
retention-days: 7
29 changes: 29 additions & 0 deletions .github/workflows/publish-npm.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Publish npm

on:
workflow_call:
workflow_dispatch:

jobs:
publish:
name: Publish to npm
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
registry-url: 'https://registry.npmjs.org'

- name: Install npm dependencies
working-directory: npm
run: npm install

- name: Publish to npm
working-directory: npm
run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
101 changes: 39 additions & 62 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,20 @@ permissions:
contents: write

jobs:
# Build jobs for each platform
build-linux:
uses: ./.github/workflows/build-linux.yml
# Build web binaries only (desktop builds temporarily disabled)
build-web-binaries:
uses: ./.github/workflows/build-web-binaries.yml
secrets: inherit

build-macos:
uses: ./.github/workflows/build-macos.yml
secrets: inherit


# Create release after all builds complete
# Create release after build completes
create-release:
name: Create Release
needs: [build-linux, build-macos]
needs: [build-web-binaries]
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Determine version
id: version
run: |
Expand All @@ -44,77 +39,59 @@ jobs:
fi
echo "version=$VERSION" >> $GITHUB_OUTPUT
echo "Version: $VERSION"

- name: Download all artifacts
uses: actions/download-artifact@v4
with:
path: artifacts

- name: Prepare release assets
run: |
mkdir -p release-assets

# Linux artifacts
if [ -d "artifacts/linux-x86_64" ]; then
cp artifacts/linux-x86_64/*.deb release-assets/opcode_${{ steps.version.outputs.version }}_linux_x86_64.deb || true
cp artifacts/linux-x86_64/*.AppImage release-assets/opcode_${{ steps.version.outputs.version }}_linux_x86_64.AppImage || true
fi

# macOS artifacts
if [ -d "artifacts/macos-universal" ]; then
cp artifacts/macos-universal/opcode.dmg release-assets/opcode_${{ steps.version.outputs.version }}_macos_universal.dmg || true
cp artifacts/macos-universal/opcode.app.zip release-assets/opcode_${{ steps.version.outputs.version }}_macos_universal.app.tar.gz || true
fi

# Create source code archives
# Clean version without 'v' prefix for archive names
CLEAN_VERSION="${{ steps.version.outputs.version }}"
CLEAN_VERSION="${CLEAN_VERSION#v}"

# Create source code archives (excluding .git and other unnecessary files)
echo "Creating source code archives..."

# Create a clean export of the repository
git archive --format=tar.gz --prefix=opcode-${CLEAN_VERSION}/ -o release-assets/opcode-${CLEAN_VERSION}.tar.gz HEAD
git archive --format=zip --prefix=opcode-${CLEAN_VERSION}/ -o release-assets/opcode-${CLEAN_VERSION}.zip HEAD

# Generate signatures for all files
cd release-assets
for file in *; do
if [ -f "$file" ]; then
sha256sum "$file" > "$file.sha256"

# Web binaries for npx distribution
for platform in linux-x64 darwin-x64 darwin-arm64 win32-x64; do
if [ -d "artifacts/$platform" ]; then
cp artifacts/$platform/gsd-ui-web-* release-assets/ || true
fi
done
cd ..


# List what we have
echo "Release assets:"
ls -la release-assets/

- name: Create Release
uses: softprops/action-gh-release@v1
with:
tag_name: ${{ steps.version.outputs.version }}
name: opcode ${{ steps.version.outputs.version }}
draft: true
name: GSD-UI ${{ steps.version.outputs.version }}
draft: false
prerelease: false
generate_release_notes: true
files: release-assets/*
body: |
<div align="center">
<img src="https://raw.githubusercontent.com/${{ github.repository }}/${{ steps.version.outputs.version }}/src-tauri/icons/icon.png" alt="opcode Logo" width="128" height="128">
</div>
## GSD-UI ${{ steps.version.outputs.version }}

## opcode ${{ steps.version.outputs.version }}
### Quick Start

This release was built and signed by CI. Artifacts for macOS and Linux are attached below.
Run instantly with npx (no Rust required):

- Auto-generated release notes are included below (commits, PRs, and contributors).
- Checksums (`.sha256`) are provided for all assets.
```bash
npx get-shit-done-cc-ui
```

### Downloads
The first run downloads the binary for your platform. Subsequent runs start immediately.

- macOS: `.dmg`, `.app.tar.gz` (Universal: Apple Silicon + Intel)
- Linux: `.AppImage`, `.deb`
### Supported Platforms

### Installation
- Linux x64
- macOS x64 (Intel)
- macOS arm64 (Apple Silicon)
- Windows x64

- macOS: Open the `.dmg` and drag opcode to Applications.
- Linux: `chmod +x` the `.AppImage` and run it, or install the `.deb` on Debian/Ubuntu.

# Publish npm package AFTER binaries are on GitHub Releases
publish-npm:
name: Publish npm
needs: [create-release]
uses: ./.github/workflows/publish-npm.yml
secrets: inherit
29 changes: 29 additions & 0 deletions .planning/MILESTONES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Project Milestones: GSD-UI

## v1.0 MVP (Shipped: 2026-01-25)

**Delivered:** Visual GSD panel for Claude Code terminal with tree view, command execution, three-pane layout, and WhatsApp-style conversation view.

**Phases completed:** 1-6 (18 plans total)

**Key accomplishments:**

- Zustand store with markdown parsers and auto-refresh file watcher for GSD data
- Hierarchical tree view with expand/collapse, status indicators, and progress bars
- Command execution via Next Up button and interactive tree nodes
- Three-pane layout with command panel, terminal, and status panel
- Complete rebrand from OPCode to GSD-UI with cyan color scheme
- WhatsApp-style conversation view with collapsible tool messages

**Stats:**

- ~42,750 lines of TypeScript
- 6 phases, 18 plans, 41 decisions logged
- 2 days from project start to ship (2026-01-24 → 2026-01-25)
- ~2h 37min total execution time

**Git range:** `feat(01-01)` → `feat(06-04)`

**What's next:** Plugin system architecture, multi-panel support, settings UI

---
Loading