diff --git a/.github/workflows/build-web-binaries.yml b/.github/workflows/build-web-binaries.yml new file mode 100644 index 000000000..51940800c --- /dev/null +++ b/.github/workflows/build-web-binaries.yml @@ -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 diff --git a/.github/workflows/publish-npm.yml b/.github/workflows/publish-npm.yml new file mode 100644 index 000000000..3089bdf70 --- /dev/null +++ b/.github/workflows/publish-npm.yml @@ -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 }} diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 278c13aee..feb9bc52a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -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: | @@ -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: | -
{command}
+ /gsd:plan-phase 3
+ {command}
+ {input.question || input.prompt || JSON.stringify(input)}
+Response:
+{typeof toolResult.content === 'string' ? toolResult.content : JSON.stringify(toolResult.content)}
++ {summary} +
+ + {/* Expand indicator */} +State tree coming in Phase 9
+No files open
++ Click a file in the State tree to view it +
+
+ {tab.content}
+
+ ) : (
+
+ {children}
+
+ );
+ },
+
+ // Custom link handling
+ a({ href, children, ...props }: any) {
+ // Internal .md links open in viewer
+ if (href?.endsWith('.md')) {
+ const resolvedPath = resolvePath(href);
+ return (
+ {
+ e.preventDefault();
+ openFile(resolvedPath);
+ }}
+ className="text-primary hover:underline cursor-pointer"
+ {...props}
+ >
+ {children}
+
+ );
+ }
+
+ // External links open in new tab
+ return (
+
+ {children}
+
+ );
+ },
+
+ // Table styling
+ table({ children, ...props }: any) {
+ return (
+ + {children} ++ ); + }, + + // Task list items (read-only) + li({ children, ...props }: any) { + // Check if this is a task list item + const firstChild = Array.isArray(children) ? children[0] : children; + if ( + typeof firstChild === 'object' && + firstChild?.props?.type === 'checkbox' + ) { + return ( +
Loading file...
+Failed to load file
+{error}
++ {tab.filepath} +
+
+ {children}
+
+ );
+ },
+ // Custom link handling for internal .md files
+ a(props) {
+ const { href, children, ...rest } = props;
+ if (href?.endsWith('.md')) {
+ return (
+ {
+ e.preventDefault();
+ // Open in new tab in viewer
+ // Implementation in planning phase
+ }}
+ {...rest}
+ >
+ {children}
+
+ );
+ }
+ // External links open in browser
+ return {children};
+ }
+ }}
+ >
+ {content}
+ No project data found.
++ Initialize GSD to see your project tree. +
+No milestones found.
+ +{command}
+ {errors.fieldName?.message}
` + +6. Update label.tsx to export Label component if not already exported (check existing file) + +7. Remove advancedFlags text input - flags will be toggle switches in Plan 03 + +8. Keep handleSubmit/execute logic but wire to form handleSubmit: +```typescript +{flag.description}
+A powerful GUI app and Toolkit for Claude Code
Create custom agents, manage interactive Claude Code sessions, run secure background agents, and more.
- +
@@ -36,9 +36,9 @@ https://github.com/user-attachments/assets/6bceea0f-60b6-4c3e-a745-b891de00b8d0
## 🌟 Overview
-**opcode** is a powerful desktop application that transforms how you interact with Claude Code. Built with Tauri 2, it provides a beautiful GUI for managing your Claude Code sessions, creating custom agents, tracking usage, and much more.
+**GSD-UI** is a powerful desktop application that transforms how you interact with Claude Code. Built with Tauri 2, it provides a beautiful GUI for managing your Claude Code sessions, creating custom agents, tracking usage, and much more.
-Think of opcode as your command center for Claude Code - bridging the gap between the command-line tool and a visual experience that makes AI-assisted development more intuitive and productive.
+Think of GSD-UI as your command center for Claude Code - bridging the gap between the command-line tool and a visual experience that makes AI-assisted development more intuitive and productive.
## 📋 Table of Contents
@@ -46,7 +46,7 @@ Think of opcode as your command center for Claude Code - bridging the gap betwee
- [✨ Features](#-features)
- [🗂️ Project & Session Management](#️-project--session-management)
- [🤖 CC Agents](#-cc-agents)
-
+
- [📊 Usage Analytics Dashboard](#-usage-analytics-dashboard)
- [🔌 MCP Server Management](#-mcp-server-management)
- [⏰ Timeline & Checkpoints](#-timeline--checkpoints)
@@ -110,9 +110,9 @@ Think of opcode as your command center for Claude Code - bridging the gap betwee
### Getting Started
-1. **Launch opcode**: Open the application after installation
+1. **Launch GSD-UI**: Open the application after installation
2. **Welcome Screen**: Choose between CC Agents or Projects
-3. **First Time Setup**: opcode will automatically detect your `~/.claude` directory
+3. **First Time Setup**: GSD-UI will automatically detect your `~/.claude` directory
### Managing Projects
@@ -157,17 +157,35 @@ Menu → MCP Manager → Add Server → Configure
## 🚀 Installation
+### Quick Start with npx
+
+Run instantly with npx (no Rust required):
+
+```bash
+npx get-shit-done-cc-ui
+```
+
+The first run downloads the binary for your platform (~15MB). Subsequent runs start immediately.
+
+#### Supported Platforms
+
+| Platform | Architecture | Status |
+|----------|--------------|--------|
+| Linux | x64 | Supported |
+| macOS | x64 (Intel) | Supported |
+| macOS | arm64 (Apple Silicon) | Supported |
+| Windows | x64 | Supported |
+
### Prerequisites
+- **Node.js**: 16 or later (for npx)
- **Claude Code CLI**: Install from [Claude's official site](https://claude.ai/code)
-### Release Executables Will Be Published Soon
-
## 🔨 Build from Source
### Prerequisites
-Before building opcode from source, ensure you have the following installed:
+Before building GSD-UI from source, ensure you have the following installed:
#### System Requirements
@@ -240,8 +258,8 @@ brew install pkg-config
1. **Clone the Repository**
```bash
- git clone https://github.com/getAsterisk/opcode.git
- cd opcode
+ git clone https://github.com/glenninn/gsd-ui.git
+ cd gsd-ui
```
2. **Install Frontend Dependencies**
@@ -250,17 +268,17 @@ brew install pkg-config
```
3. **Build the Application**
-
+
**For Development (with hot reload)**
```bash
bun run tauri dev
```
-
+
**For Production Build**
```bash
# Build the application
bun run tauri build
-
+
# The built executable will be in:
# - Linux: src-tauri/target/release/
# - macOS: src-tauri/target/release/
@@ -268,12 +286,12 @@ brew install pkg-config
```
4. **Platform-Specific Build Options**
-
+
**Debug Build (faster compilation, larger binary)**
```bash
bun run tauri build --debug
```
-
+
**Universal Binary for macOS (Intel + Apple Silicon)**
```bash
bun run tauri build --target universal-apple-darwin
@@ -310,17 +328,17 @@ After building, you can verify the application works:
```bash
# Run the built executable directly
# Linux/macOS
-./src-tauri/target/release/opcode
+./src-tauri/target/release/gsd-ui
# Windows
-./src-tauri/target/release/opcode.exe
+./src-tauri/target/release/gsd-ui.exe
```
### Build Artifacts
The build process creates several artifacts:
-- **Executable**: The main opcode application
+- **Executable**: The main GSD-UI application
- **Installers** (when using `tauri build`):
- `.deb` package (Linux)
- `.AppImage` (Linux)
@@ -343,7 +361,7 @@ All artifacts are located in `src-tauri/target/release/`.
### Project Structure
```
-opcode/
+gsd-ui/
├── src/ # React frontend
│ ├── components/ # UI components
│ ├── lib/ # API client & utilities
@@ -378,7 +396,7 @@ cd src-tauri && cargo fmt
## 🔒 Security
-opcode prioritizes your privacy and security:
+GSD-UI prioritizes your privacy and security:
1. **Process Isolation**: Agents run in separate processes
2. **Permission Control**: Configure file and network access per agent
@@ -405,6 +423,7 @@ This project is licensed under the AGPL License - see the [LICENSE](LICENSE) fil
## 🙏 Acknowledgments
+- Built on [OPCode](https://github.com/winfunc/opcode) by Asterisk - the original Claude Code GUI toolkit
- Built with [Tauri](https://tauri.app/) - The secure framework for building desktop apps
- [Claude](https://claude.ai) by Anthropic
@@ -415,13 +434,8 @@ This project is licensed under the AGPL License - see the [LICENSE](LICENSE) fil
Made with ❤️ by the Asterisk
- Report Bug + Report Bug · - Request Feature + Request Feature
Help improve opcode
+Help improve GSD-UI
We collect anonymous usage data to improve your experience. No personal data is collected.
diff --git a/src/components/Attribution.tsx b/src/components/Attribution.tsx new file mode 100644 index 000000000..200a47303 --- /dev/null +++ b/src/components/Attribution.tsx @@ -0,0 +1,23 @@ +import { open } from '@tauri-apps/plugin-shell'; + +export function Attribution() { + const handleClick = async () => { + try { + await open('https://github.com/winfunc/opcode'); + } catch (error) { + console.error('Failed to open OPCode repository:', error); + } + }; + + return ( +- Help improve opcode by sharing anonymous usage data + Help improve GSD-UI by sharing anonymous usage data