diff --git a/.pql/pql-plan.json b/.pql/pql-plan.json index 955d7f3a..935b789f 100644 --- a/.pql/pql-plan.json +++ b/.pql/pql-plan.json @@ -1,5 +1,5 @@ { - "exported_at": "2026-05-03T19:52:53Z", + "exported_at": "2026-05-03T20:06:31Z", "decisions": [ { "id": "D-1", diff --git a/CHANGELOG.md b/CHANGELOG.md index 271ade9f..7b59418a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ heading, and (b) bumping `pubspec.yaml` `version:` in the same commit. ## [Unreleased] +## [2.0.0] — 2026-05-03 + ### Fixed - PTY FFI constants now platform-dispatched: `TIOCSWINSZ` (`0x80087467` @@ -51,6 +53,11 @@ heading, and (b) bumping `pubspec.yaml` `version:` in the same commit. ### Added +- `make install` / `make uninstall` — builds the release bundle and + installs it to `~/.local/` with XDG desktop entry, icon registration + at seven sizes, and icon cache refresh. macOS installs to + `~/Applications/clide.app`. + - Backend isolate — all subprocess and file I/O runs in a dedicated isolate, keeping the merged UI/platform thread on macOS free for rendering. Communicates via SendPort using the existing IPC protocol. diff --git a/Makefile b/Makefile index 536cdeba..9438f094 100644 --- a/Makefile +++ b/Makefile @@ -18,10 +18,7 @@ else FLUTTER_OS := windows endif -VERSION_BASE ?= $(shell awk -F': *' '/^version:/ {gsub(/[" ]/,"",$$2); print $$2; exit}' pubspec.yaml) -COMMIT ?= $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown) -DIRTY := $(shell git diff --quiet HEAD 2>/dev/null || echo .dirty) -VERSION ?= $(VERSION_BASE)+$(COMMIT)$(DIRTY) +VERSION ?= $(shell awk -F': *' '/^version:/ {gsub(/[" ]/,"",$$2); print $$2; exit}' pubspec.yaml) DATE ?= $(shell date -u +%Y-%m-%dT%H:%M:%SZ) .PHONY: help @@ -142,6 +139,68 @@ build-linux: ## flutter build linux (desktop bundle). build-macos: ## flutter build macos (desktop bundle). flutter build macos +# -- install / uninstall ----------------------------------------------------- + +# Install prefix. Bundle lands at $(INSTALL_PREFIX)/clide/ with a +# symlink at $(INSTALL_DIR)/clide pointing into it. +INSTALL_PREFIX ?= $(HOME)/.local/lib + +ifeq ($(FLUTTER_OS),linux) + BUNDLE_DIR := build/linux/x64/release/bundle +else ifeq ($(FLUTTER_OS),macos) + BUNDLE_DIR := build/macos/Build/Products/Release/clide.app +endif + +ICON_SIZES := 16 32 48 128 192 256 512 + +.PHONY: install +install: build ## Build + install clide to ~/.local (INSTALL_PREFIX, INSTALL_DIR). +ifeq ($(FLUTTER_OS),linux) + @mkdir -p $(INSTALL_PREFIX) $(INSTALL_DIR) + rm -rf $(INSTALL_PREFIX)/clide + cp -a $(BUNDLE_DIR) $(INSTALL_PREFIX)/clide + ln -sf $(INSTALL_PREFIX)/clide/clide $(INSTALL_DIR)/clide + @for size in $(ICON_SIZES); do \ + dir=$(HOME)/.local/share/icons/hicolor/$${size}x$${size}/apps; \ + mkdir -p $$dir; \ + cp assets/logo/appicon-$${size}.png $$dir/clide.png; \ + done + @mkdir -p $(HOME)/.local/share/applications + @sed 's|Exec=clide|Exec=$(INSTALL_PREFIX)/clide/clide|' linux/clide.desktop \ + > $(HOME)/.local/share/applications/clide.desktop + @gtk-update-icon-cache -f -t $(HOME)/.local/share/icons/hicolor 2>/dev/null || true + @update-desktop-database $(HOME)/.local/share/applications 2>/dev/null || true + @echo "installed: $(INSTALL_DIR)/clide -> $(INSTALL_PREFIX)/clide/clide" + @echo "desktop: ~/.local/share/applications/clide.desktop" + @echo "version: $(VERSION)" +else ifeq ($(FLUTTER_OS),macos) + @mkdir -p $(HOME)/Applications + rm -rf $(HOME)/Applications/clide.app + cp -a $(BUNDLE_DIR) $(HOME)/Applications/clide.app + @echo "installed: ~/Applications/clide.app" + @echo "version: $(VERSION)" +else + @echo "install not yet supported on $(FLUTTER_OS)" + @exit 1 +endif + +.PHONY: uninstall +uninstall: ## Remove installed clide. +ifeq ($(FLUTTER_OS),linux) + rm -f $(INSTALL_DIR)/clide + rm -rf $(INSTALL_PREFIX)/clide + rm -f $(HOME)/.local/share/applications/clide.desktop + @for size in $(ICON_SIZES); do \ + rm -f $(HOME)/.local/share/icons/hicolor/$${size}x$${size}/apps/clide.png; \ + done + @gtk-update-icon-cache -f -t $(HOME)/.local/share/icons/hicolor 2>/dev/null || true + @update-desktop-database $(HOME)/.local/share/applications 2>/dev/null || true + @echo "uninstalled" +else ifeq ($(FLUTTER_OS),macos) + rm -rf $(HOME)/Applications/clide.app + @echo "uninstalled" +endif + # -- dugite-native (bundled git) ------------------------------------------ DUGITE_VERSION := v2.53.0-3 diff --git a/linux/clide.desktop b/linux/clide.desktop new file mode 100644 index 00000000..f84cd919 --- /dev/null +++ b/linux/clide.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Type=Application +Name=clide +Comment=Flutter desktop IDE for Claude Code +Exec=clide %U +Icon=clide +Terminal=false +Categories=Development;IDE;TextEditor; +Keywords=code;editor;ide;claude;terminal; +StartupWMClass=clide +MimeType=inode/directory; diff --git a/pubspec.yaml b/pubspec.yaml index 6d4461b2..bd4fbb74 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -13,7 +13,7 @@ description: >- UI, subsystem handlers (pane, files, editor, git, pql), and the extension framework. publish_to: none -version: 2.0.0-dev +version: 2.0.0 repository: https://github.com/postmeridiem/clide # Project metadata (was project.yaml, folded in per D-056).