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
11 changes: 11 additions & 0 deletions .claude/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,17 @@ Go and make are NOT installed locally. Use `scripts/dev.sh` (Docker-based):

Go module cache is persisted in a Docker volume (`aethel-gomod`) for fast repeated builds.

## Release Process

Two-workflow split in GitHub Actions:

1. **`release.yml`** — triggers on push to master. Analyzes conventional commits since last tag, computes version bump (major/minor/patch), updates `VERSION` + `CHANGELOG.md`, commits `chore(release): vX.Y.Z`, creates git tag, pushes. Does NOT build binaries or create GitHub Release.
2. **`goreleaser.yml`** — triggers on tag push (`v*`). Runs GoReleaser to cross-compile 5 platforms (linux/amd64, linux/arm64, darwin/amd64, darwin/arm64, windows/amd64), creates `.tar.gz` (Unix) / `.zip` (Windows) archives with both `aethel` + `aetheld`, publishes GitHub Release with SHA256 checksums.

GoReleaser config: `.goreleaser.yml` (version 2). Version injected via `-ldflags "-s -w -X main.version={{.Version}}"` on both binaries.

Install script: `scripts/install.sh` — POSIX shell, detects OS/arch, downloads from GitHub Releases, verifies checksum, installs to `~/.local/bin/`.

## Key Conventions

- Platform-specific code uses `//go:build` tags (not `// +build`)
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:

- uses: actions/setup-go@v5
with:
go-version: '1.24'
go-version: '1.25'

- run: go vet ./...
- run: go test ./...
Expand Down
40 changes: 40 additions & 0 deletions .github/workflows/goreleaser.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
name: GoReleaser

on:
push:
tags: ["v*"]

permissions:
contents: write

jobs:
goreleaser:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- uses: actions/setup-go@v5
with:
go-version: '1.25'

- name: Extract release notes from CHANGELOG.md
run: |
VERSION="${GITHUB_REF_NAME#v}"
echo "$VERSION" | grep -qE '^[0-9]+\.[0-9]+\.[0-9]+$' || {
echo "::error::Invalid version format: $VERSION"
exit 1
}
sed -n "/^## \[${VERSION}\]/,/^## \[/{ /^## \[${VERSION}\]/d; /^## \[/d; p; }" CHANGELOG.md \
| tr -d '\r' > /tmp/release-notes.md
echo "::notice::Release notes for v${VERSION}:"
cat /tmp/release-notes.md

- uses: goreleaser/goreleaser-action@v6
with:
distribution: goreleaser
version: "~> v2"
args: release --clean --release-notes /tmp/release-notes.md
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
68 changes: 14 additions & 54 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ on:
workflow_dispatch:
inputs:
dry_run:
description: 'Dry run — compute version & build binaries but skip commit, tag, and release'
description: 'Dry run — compute version but skip commit, tag, and release'
type: boolean
default: true

Expand All @@ -28,7 +28,7 @@ jobs:

- uses: actions/setup-go@v5
with:
go-version: '1.24'
go-version: '1.25'

- name: Determine version bump
id: bump
Expand Down Expand Up @@ -83,8 +83,9 @@ jobs:

- name: Update version files
if: steps.bump.outputs.skip != 'true'
env:
VERSION: ${{ steps.bump.outputs.version }}
run: |
VERSION=${{ steps.bump.outputs.version }}
echo "$VERSION" > VERSION

# Update CHANGELOG: insert versioned header after [Unreleased]
Expand All @@ -99,66 +100,25 @@ jobs:
go vet ./...
go test ./...

- name: Build binaries
if: steps.bump.outputs.skip != 'true'
run: |
VERSION=${{ steps.bump.outputs.version }}
LDFLAGS="-X main.version=${VERSION}"
mkdir -p dist

for PAIR in linux/amd64 linux/arm64 darwin/amd64 darwin/arm64; do
OS="${PAIR%%/*}"
ARCH="${PAIR##*/}"
echo "Building ${OS}/${ARCH}..."
GOOS=$OS GOARCH=$ARCH go build -ldflags "$LDFLAGS" -o dist/aethel ./cmd/aethel
GOOS=$OS GOARCH=$ARCH go build -ldflags "$LDFLAGS" -o dist/aetheld ./cmd/aetheld
tar -czf "dist/aethel-${OS}-${ARCH}.tar.gz" -C dist aethel aetheld
rm dist/aethel dist/aetheld
done

echo "::notice::Built archives:"
ls -lh dist/*.tar.gz

- name: Extract changelog
if: steps.bump.outputs.skip != 'true'
run: |
VERSION=${{ steps.bump.outputs.version }}
# Extract content between ## [VERSION] and the next ## [
BODY=$(sed -n "/^## \[${VERSION}\]/,/^## \[/{ /^## \[${VERSION}\]/d; /^## \[/d; p; }" CHANGELOG.md)
echo "$BODY" > dist/release-notes.md
echo "::notice::Release notes:"
cat dist/release-notes.md

- name: Dry run summary
if: steps.bump.outputs.skip != 'true' && env.DRY_RUN == 'true'
env:
VERSION: ${{ steps.bump.outputs.version }}
BUMP: ${{ steps.bump.outputs.bump }}
run: |
echo "::warning::DRY RUN — skipping commit, tag, and release creation"
echo "Would have released: v${{ steps.bump.outputs.version }}"
echo "Bump type: ${{ steps.bump.outputs.bump }}"
echo "Archives built:"
ls -lh dist/*.tar.gz
echo "::warning::DRY RUN — skipping commit, tag, and release"
echo "Would have released: v${VERSION}"
echo "Bump type: ${BUMP}"

- name: Commit version bump
- name: Commit version bump and tag
if: steps.bump.outputs.skip != 'true' && env.DRY_RUN != 'true'
env:
VERSION: ${{ steps.bump.outputs.version }}
run: |
VERSION=${{ steps.bump.outputs.version }}
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add VERSION CHANGELOG.md
git commit -m "chore(release): v${VERSION}"
git tag "v${VERSION}"
git push origin master --tags

- name: Create GitHub Release
if: steps.bump.outputs.skip != 'true' && env.DRY_RUN != 'true'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
VERSION=${{ steps.bump.outputs.version }}
gh release create "v${VERSION}" \
--title "v${VERSION}" \
--notes-file dist/release-notes.md \
dist/aethel-linux-amd64.tar.gz \
dist/aethel-linux-arm64.tar.gz \
dist/aethel-darwin-amd64.tar.gz \
dist/aethel-darwin-arm64.tar.gz
echo "::notice::Tagged v${VERSION} — GoReleaser workflow will build and publish the release"
68 changes: 68 additions & 0 deletions .goreleaser.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
version: 2

before:
hooks:
- go mod tidy -diff
- go vet ./...

builds:
- id: aethel
main: ./cmd/aethel
binary: aethel
env:
- CGO_ENABLED=0
goos:
- linux
- darwin
- windows
goarch:
- amd64
- arm64
ignore:
- goos: windows
goarch: arm64
ldflags:
- -s -w -X main.version={{.Version}}

- id: aetheld
main: ./cmd/aetheld
binary: aetheld
env:
- CGO_ENABLED=0
goos:
- linux
- darwin
- windows
goarch:
- amd64
- arm64
ignore:
- goos: windows
goarch: arm64
ldflags:
- -s -w -X main.version={{.Version}}

archives:
- id: default
builds:
- aethel
- aetheld
name_template: "aethel_{{ .Version }}_{{ .Os }}_{{ .Arch }}"
format_overrides:
- goos: windows
format: zip

checksum:
name_template: checksums.txt
algorithm: sha256

changelog:
disable: true

release:
github:
owner: artyomsv
name: aethel
draft: false
prerelease: auto
name_template: "v{{.Version}}"
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- **Roadmap PRDs** — 11 detailed Product Requirements Documents in `docs/roadmap/`: workspace files, MCP server, command palette, notification center, pre-built binaries, demo GIF, community plugins, process health, tmux migration, cross-pane events, session sharing
- **Restructured ROADMAP.md** — organized into Core/Growth/Advanced categories with priority matrix, strategic pain-layer analysis, and feature synergy notes
- **Notification center concept (M12)** — centralized event sidebar with pane navigation and history stack; PRD covers process exit detection, plugin notification handlers, and incremental integration path
- **Pre-built binaries & release infrastructure** — GoReleaser config for 5 platforms (linux/amd64, linux/arm64, darwin/amd64, darwin/arm64, windows/amd64); two-workflow CI split: `release.yml` handles version bump + tag, `goreleaser.yml` builds + publishes GitHub Release with `.tar.gz`/`.zip` archives and SHA256 checksums
- **One-line install script** — `scripts/install.sh` detects OS/arch, fetches latest release from GitHub API, verifies SHA256 checksum, installs to `~/.local/bin/`; supports `AETHEL_VERSION` for pinned installs and `GITHUB_TOKEN` for API auth
- **Daemon version reporting** — `aetheld version` subcommand, version logged at startup; consistent `-ldflags` injection across all build paths (GoReleaser, dev.sh, dev.ps1, rebuild.ps1, Makefile)

### Fixed

- CI Go version mismatch — updated from 1.24 to 1.25 in `ci.yml` and `release.yml` to match `go.mod`

## [0.9.0] - 2026-03-23

Expand Down
27 changes: 15 additions & 12 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
.PHONY: build test test-race vet cross clean

VERSION := $(shell cat VERSION)
LDFLAGS := -X main.version=$(VERSION)

build:
go build -o aethel ./cmd/aethel
go build -o aetheld ./cmd/aetheld
go build -ldflags "$(LDFLAGS)" -o aethel ./cmd/aethel
go build -ldflags "$(LDFLAGS)" -o aetheld ./cmd/aetheld

test:
go test ./...
Expand All @@ -14,16 +17,16 @@ vet:
go vet ./...

cross:
GOOS=linux GOARCH=amd64 go build -o dist/aethel-linux-amd64 ./cmd/aethel
GOOS=linux GOARCH=amd64 go build -o dist/aetheld-linux-amd64 ./cmd/aetheld
GOOS=linux GOARCH=arm64 go build -o dist/aethel-linux-arm64 ./cmd/aethel
GOOS=linux GOARCH=arm64 go build -o dist/aetheld-linux-arm64 ./cmd/aetheld
GOOS=darwin GOARCH=amd64 go build -o dist/aethel-darwin-amd64 ./cmd/aethel
GOOS=darwin GOARCH=amd64 go build -o dist/aetheld-darwin-amd64 ./cmd/aetheld
GOOS=darwin GOARCH=arm64 go build -o dist/aethel-darwin-arm64 ./cmd/aethel
GOOS=darwin GOARCH=arm64 go build -o dist/aetheld-darwin-arm64 ./cmd/aetheld
GOOS=windows GOARCH=amd64 go build -o dist/aethel-windows-amd64.exe ./cmd/aethel
GOOS=windows GOARCH=amd64 go build -o dist/aetheld-windows-amd64.exe ./cmd/aetheld
GOOS=linux GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o dist/aethel-linux-amd64 ./cmd/aethel
GOOS=linux GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o dist/aetheld-linux-amd64 ./cmd/aetheld
GOOS=linux GOARCH=arm64 go build -ldflags "$(LDFLAGS)" -o dist/aethel-linux-arm64 ./cmd/aethel
GOOS=linux GOARCH=arm64 go build -ldflags "$(LDFLAGS)" -o dist/aetheld-linux-arm64 ./cmd/aetheld
GOOS=darwin GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o dist/aethel-darwin-amd64 ./cmd/aethel
GOOS=darwin GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o dist/aetheld-darwin-amd64 ./cmd/aetheld
GOOS=darwin GOARCH=arm64 go build -ldflags "$(LDFLAGS)" -o dist/aethel-darwin-arm64 ./cmd/aethel
GOOS=darwin GOARCH=arm64 go build -ldflags "$(LDFLAGS)" -o dist/aetheld-darwin-arm64 ./cmd/aetheld
GOOS=windows GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o dist/aethel-windows-amd64.exe ./cmd/aethel
GOOS=windows GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o dist/aetheld-windows-amd64.exe ./cmd/aetheld

clean:
rm -f aethel aetheld aethel.exe aetheld.exe
Expand Down
37 changes: 22 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,31 +94,38 @@ See [ARCHITECTURE.md](ARCHITECTURE.md) for detailed design decisions.

## Quick Start

### Prerequisites

- Docker **or** Go 1.25+

### Build
### Install

```bash
# With Docker (no local Go required)
./scripts/dev.ps1 build # PowerShell (Windows)
./scripts/dev.sh build # Bash (Linux/macOS)
# Linux / macOS — one-line install
curl -sSfL https://raw.githubusercontent.com/artyomsv/aethel/master/scripts/install.sh | sh

# With local Go
make build
# Go users
go install github.com/artyomsv/aethel/cmd/aethel@latest
go install github.com/artyomsv/aethel/cmd/aetheld@latest

# Windows — download .zip from GitHub Releases
# https://github.com/artyomsv/aethel/releases/latest
```

### Run

```bash
# Start the daemon
aethel daemon start

# Launch the TUI (auto-starts daemon if needed)
aethel
```

### Build from Source

```bash
# With Docker (no local Go required)
./scripts/dev.ps1 build # PowerShell (Windows)
./scripts/dev.sh build # Bash (Linux/macOS)

# With local Go
make build
```

### Key Bindings

| Key | Action |
Expand Down Expand Up @@ -221,10 +228,10 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for development guidelines.
| **M2: Persistence** | Done | Workspace snapshots, ghost buffer persistence, shell respawn, reboot-proof sessions |
| **M3: Resume Engine** | Done | Regex scrapers, token extraction, AI session resume via pre-assigned UUIDs |
| **M4: Plugin System** | Done | TOML plugins, typed panes, pane creation dialog, error handlers, window size persistence |
| **M5: Polish** | Planned | JSON transformer, observability, encrypted tokens, OS service integration |
| **M5: Polish** | In Progress | JSON transformer, observability, encrypted tokens, OS service integration |
| **M6: Pane Focus** | Done | Ctrl+E toggles active pane full-screen, other panes keep running |
| **M7: Pane Notes** | Planned | Side-by-side note-taking linked to panes |
| **M8: Bubble Tea v2** | Done | Bubble Tea v2/Lipgloss v2 migration, text selection, clipboard, editor enhancements |
| **Pre-built Binaries** | In Progress | GoReleaser, GitHub Releases, install script, cross-platform archives |

See [ROADMAP.md](ROADMAP.md) for detailed progress and feature descriptions.

Expand Down
6 changes: 3 additions & 3 deletions ROADMAP.md
Original file line number Diff line number Diff line change
Expand Up @@ -145,9 +145,9 @@ Processes emit events when they finish or need attention. A non-modal sidebar sh

### Pre-Built Binaries & One-Line Install — [PRD](docs/roadmap/pre-built-binaries.md)

> `curl -sSfL https://get.aethel.dev | sh` — zero friction install.
> `curl -sSfL .../install.sh | sh` — zero friction install.

goreleaser for GitHub Releases, Homebrew tap, winget/scoop manifests, install script. **Priority 1** — prerequisite for everything else. Every extra step between "I want to try this" and "it's running" loses users.
GoReleaser cross-compiles 5 platform pairs (linux/amd64, linux/arm64, darwin/amd64, darwin/arm64, windows/amd64) with SHA256 checksums. Two-workflow split: `release.yml` handles version bump + tag, `goreleaser.yml` builds + publishes GitHub Release. Install script for Linux/macOS. **Homebrew tap, Scoop, Winget deferred** (need external repos).

### The "Holy Shit" Demo — [PRD](docs/roadmap/demo-gif.md)

Expand Down Expand Up @@ -195,7 +195,7 @@ Remote workspace viewing and collaboration over TCP+TLS. Read-only by default, c

| Priority | Feature | Effort | Impact | Category |
|----------|---------|--------|--------|----------|
| 1 | Pre-built binaries + one-line install | Small | Critical | Growth |
| 1 | Pre-built binaries + one-line install (in progress) | Small | Critical | Growth |
| 2 | "Holy Shit" demo GIF/video | Small | Critical | Growth |
| 3 | Project workspace files (`.aethel.toml`) | Medium | Very High | Core |
| 4 | Command palette (`Ctrl+Shift+P`) | Medium | High | Core |
Expand Down
Loading
Loading