Files
clide/Makefile
T
jpmschweitzerandClaude 1f23ba40f2
test / unit + widget + golden + a11y (push) Failing after 40s
test / integration_test (xvfb) (push) Has been skipped
test / bundle smoke (xvfb 5s) (push) Has been skipped
test / daemon subprocess + web WASM smoke (push) Has been skipped
fix make run — use PID file, add make stop
PID file at /tmp/clide-daemon-<uid>.pid replaces pkill pattern
matching. make run depends on stop so stale daemons are killed
before build. Flutter exit via ctrl-C no longer aborts Make.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-04-22 16:54:18 +02:00

217 lines
6.5 KiB
Makefile

# clide — local dev targets. CI scripts in ci/ shell out to these.
#
# One toolchain: Flutter + Dart. Native supporter tools (`ptyc`, future
# peers) live in their own directories with their own build targets and
# compose in under `make build`.
INSTALL_DIR ?= $(HOME)/.local/bin
# Version stamping. Source of truth: project.yaml `version:` field. Local
# builds augment with git short SHA + dirty marker (semver build metadata).
VERSION_BASE ?= $(shell awk -F': *' '/^version:/ {gsub(/[" ]/,"",$$2); print $$2; exit}' project.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)
DATE ?= $(shell date -u +%Y-%m-%dT%H:%M:%SZ)
.PHONY: help
help: ## Show this help.
@awk 'BEGIN {FS = ":.*##"} /^[a-zA-Z0-9_-]+:.*##/ {printf " \033[36m%-22s\033[0m %s\n", $$1, $$2}' $(MAKEFILE_LIST)
# -- app + core (Flutter / Dart) ----------------------------------------
# App and core targets gracefully noop if the Dart package isn't
# scaffolded yet (pre-Tier-0 state) or if flutter isn't installed
# locally.
APP_PRESENT := $(shell test -f pubspec.yaml && echo yes || echo no)
HAS_FLUTTER := $(shell command -v flutter >/dev/null && echo yes || echo no)
.PHONY: build
build: ## Build the Dart AOT `clide` binary (CLI + --daemon modes in one binary).
ifeq ($(APP_PRESENT),yes)
dart compile exe bin/clide.dart -o bin/clide \
--define=clideVersion=$(VERSION) \
--define=clideCommit=$(COMMIT) \
--define=clideDate=$(DATE)
else
@echo "(pubspec.yaml not scaffolded yet; skipping)"
endif
DAEMON_PID_FILE := /tmp/clide-daemon-$(shell id -u).pid
.PHONY: run
run: stop build ## Build the daemon + launch the Flutter desktop app.
ifeq ($(APP_PRESENT),yes)
@echo "Starting daemon…"
@bin/clide --daemon & echo $$! > $(DAEMON_PID_FILE)
@echo "Daemon PID $$(cat $(DAEMON_PID_FILE))"
@echo "Launching Flutter app…"
-cd app && flutter run -d linux
@$(MAKE) --no-print-directory stop
else
@echo "(pubspec.yaml not scaffolded yet; skipping)"
endif
.PHONY: stop
stop: ## Kill any running clide daemon.
@if [ -f $(DAEMON_PID_FILE) ]; then \
kill $$(cat $(DAEMON_PID_FILE)) 2>/dev/null && echo "daemon stopped" || true; \
rm -f $(DAEMON_PID_FILE); \
fi
.PHONY: install
install: build ## Install bin/clide into $(INSTALL_DIR).
ifeq ($(APP_PRESENT),yes)
install -m 0755 bin/clide $(INSTALL_DIR)/clide
else
@echo "(pubspec.yaml not scaffolded yet; skipping)"
endif
.PHONY: pubget
pubget: ## flutter pub get (hydrate the pub cache).
ifeq ($(APP_PRESENT),yes)
flutter pub get
else
@echo "(pubspec.yaml not scaffolded yet; skipping)"
endif
.PHONY: analyze
analyze: ## dart analyze / flutter analyze.
ifeq ($(APP_PRESENT),yes)
flutter analyze
else
@echo "(pubspec.yaml not scaffolded yet; skipping)"
endif
.PHONY: format
format: ## dart format --set-exit-if-changed.
ifeq ($(APP_PRESENT),yes)
dart format --set-exit-if-changed .
else
@echo "(pubspec.yaml not scaffolded yet; skipping)"
endif
.PHONY: test
test: ## Fast: analyze + format + unit + widget + golden (<60s).
ci/test.sh
.PHONY: test-core
test-core: ## Flutter-free core tests (IPC, daemon, PTY) with hard timeout.
ci/test_core.sh
.PHONY: test-a11y
test-a11y: ## A11y contract (semantic coverage + keyboard + contrast + i18n).
ci/test_a11y.sh
.PHONY: test-integration
test-integration: ## Integration tests (real app boot; xvfb on headless Linux).
ci/test_integration.sh
.PHONY: test-e2e
test-e2e: build ## Daemon subprocess + web WASM Playwright smoke.
ci/test_e2e.sh
.PHONY: test-all
test-all: test-core test test-a11y test-integration test-e2e ## Everything, sequentially.
.PHONY: coverage
coverage: ## flutter test --coverage + lcov summary.
ci/test_coverage.sh
.PHONY: smoke-bundle
smoke-bundle: ## Build Linux release bundle and run it under xvfb for 5s.
ci/smoke_bundle.sh
# -- web UI harness (for Claude Code to drive the app) -----------------
.PHONY: ui-dev
ui-dev: ## Build web WASM + start localhost:4280 in the background.
tools/ui/build.sh
tools/ui/serve.sh
.PHONY: ui-stop
ui-stop: ## Stop the background web server.
tools/ui/stop.sh
.PHONY: ui-smoke
ui-smoke: ## Build + serve + run Playwright smoke + stop.
tools/ui/build.sh
tools/ui/serve.sh
@sh -c 'trap "tools/ui/stop.sh >/dev/null 2>&1" EXIT; cd tools/ui && npx playwright test smoke.spec.ts'
.PHONY: build-linux
build-linux: ## flutter build linux (desktop bundle).
ifeq ($(APP_PRESENT),yes)
flutter build linux
else
@echo "(pubspec.yaml not scaffolded yet; skipping)"
endif
.PHONY: build-macos
build-macos: ## flutter build macos (desktop bundle).
ifeq ($(APP_PRESENT),yes)
flutter build macos
else
@echo "(pubspec.yaml not scaffolded yet; skipping)"
endif
# -- ptyc (C supporter tool) --------------------------------------------
# Compiled alongside the main binary. Tiny, no deps beyond libc.
PTYC_PRESENT := $(shell test -f ptyc/Makefile && echo yes || echo no)
.PHONY: ptyc-build
ptyc-build: ## Build the ptyc PTY-spawn helper.
ifeq ($(PTYC_PRESENT),yes)
$(MAKE) -C ptyc
else
@echo "(ptyc/ not scaffolded yet; skipping)"
endif
.PHONY: ptyc-test
ptyc-test: ## Run ptyc smoke tests (SCM_RIGHTS round-trip).
ifeq ($(PTYC_PRESENT),yes)
$(MAKE) -C ptyc test
else
@echo "(ptyc/ not scaffolded yet; skipping)"
endif
.PHONY: ptyc-clean
ptyc-clean: ## Clean ptyc build artefacts.
ifeq ($(PTYC_PRESENT),yes)
$(MAKE) -C ptyc clean
else
@echo "(ptyc/ not scaffolded yet; skipping)"
endif
# -- security ------------------------------------------------------------
.PHONY: security
security: ## Dart advisory review + ptyc source review (manual — no floating deps).
@echo "security: Dart advisories reviewed manually before pubspec.yaml bumps;"
@echo " ptyc is reviewed by reading it (tiny libc-only C)."
@echo " Automated Dart CVE tooling lands here when a reliable option exists."
# -- pre-push gate -------------------------------------------------------
.PHONY: decisions-validate
decisions-validate: ## Parser dry-run over decisions/*.md (cheap pre-push gate).
pql decisions validate
.PHONY: push-check
push-check: decisions-validate test-core test test-a11y ## Pre-push gate: decisions + core + fast unit + widget + golden + a11y (<90s).
.PHONY: hooks
hooks: ## Install the repo's git hooks (points core.hooksPath at .githooks/).
git config core.hooksPath .githooks
@echo "hooks installed (core.hooksPath = .githooks)"
# -- housekeeping --------------------------------------------------------
.PHONY: clean
clean: ## Remove build artefacts.
rm -rf bin build .dart_tool
$(MAKE) ptyc-clean
.DEFAULT_GOAL := help