Files
2026-07-13 12:08:46 +08:00

187 lines
8.4 KiB
Makefile

FRONTEND := frontend
API := backend/core_api
AGENT := backend/core_agent
VAULT := backend/data-vault
_NPM_STAMP := $(FRONTEND)/node_modules/.package-lock.json
_API_STAMP := $(API)/.venv
_AGENT_STAMP := $(AGENT)/.venv
# ── Feature-branch selection ─────────────────────────────────────────────
# Per-developer ref choice lives in `dev.env` (gitignored — never committed),
# so each dev works on their own module branches without touching shared
# files or CI. Example dev.env:
# REF=feat/my-thing # all modules…
# API_REF=feat/server-thing # …or override per module
-include dev.env
REF ?= main
API_REF ?= $(REF)
AGENT_REF ?= $(REF)
FRONTEND_REF ?= $(REF)
# Both run paths follow the same refs:
# • `make dev`/`dev-web` run the LOCAL submodule source, so they follow
# whatever branch is checked out (use `make use` to switch).
# • the Electron desktop server is a uv-tool install keyed by these env
# vars (frontend/src/main/server-source.ts) — exported here so `make app`
# / `make server` install the matching branch.
export COWORK_SERVER_REF := $(API_REF)
export ANTON_REF := $(AGENT_REF)
# Only inject a non-default anton override (uv rejects a redundant --with).
_ANTON_WITH := $(if $(filter-out main,$(AGENT_REF)),--with "anton-agent @ git+https://github.com/mindsdb/anton.git@$(AGENT_REF)",)
.PHONY: help setup dev dev-web build dist-mac dist-win docker-build docker-up docker-down flush use pin baseline server server-local app app-local pack-local watch refs
.DEFAULT_GOAL := help
help: ## list available targets
@echo "Minds Platform — make targets:"
@grep -hE '^[a-zA-Z_-]+:.*?## ' $(MAKEFILE_LIST) \
| sort \
| awk 'BEGIN{FS=":.*?## "}{printf " \033[36m%-10s\033[0m %s\n", $$1, $$2}'
@echo ""
@echo "Module branches: set refs in dev.env (see dev.env.example), then 'make use'."
@echo "Current refs → frontend=$(FRONTEND_REF) core_api=$(API_REF) core_agent=$(AGENT_REF)"
$(_NPM_STAMP): $(FRONTEND)/package-lock.json
npm --prefix $(FRONTEND) ci
$(_API_STAMP): $(API)/uv.lock
uv sync --directory $(API)
$(_AGENT_STAMP): $(AGENT)/uv.lock
uv sync --directory $(AGENT)
setup: $(_NPM_STAMP) $(_API_STAMP) $(_AGENT_STAMP) ## install all module dependencies (npm + uv venvs)
dev: $(_NPM_STAMP) $(_API_STAMP) $(_AGENT_STAMP) ## run desktop dev from local module source (hot reload)
@trap 'kill 0' SIGINT SIGTERM EXIT; \
uv run --directory $(API) uvicorn cowork.server:app --reload \
--reload-dir $(CURDIR)/$(API)/cowork \
--reload-dir $(CURDIR)/$(AGENT)/anton & \
npm --prefix $(FRONTEND) run dev
dev-web: $(_NPM_STAMP) $(_API_STAMP) $(_AGENT_STAMP) ## run web dev in the browser from local module source
@trap 'kill 0' SIGINT SIGTERM EXIT; \
uv run --directory $(API) uvicorn cowork.server:app --reload \
--reload-dir $(CURDIR)/$(API)/cowork \
--reload-dir $(CURDIR)/$(AGENT)/anton & \
cd $(FRONTEND) && BUILD_TARGET=web npm run dev:renderer -- --open
build: $(_NPM_STAMP) ## production renderer build
npm --prefix $(FRONTEND) run build
dist-mac: $(_NPM_STAMP) ## package the macOS desktop app
npm --prefix $(FRONTEND) run dist:mac
dist-win: $(_NPM_STAMP) ## package the Windows desktop app
npm --prefix $(FRONTEND) run dist:win
docker-build: ## build the docker images
docker compose build
docker-up: ## start the docker stack
docker compose up
docker-down: ## stop the docker stack
docker compose down
# Wipe every local install + all app state, returning the machine to a
# pre-install state. Covers BOTH runtime models (the Makefile dev venvs
# AND the Electron app's `uv tool install cowork-server`) plus user data.
# Removes:
# • cowork-server uv tool (and the legacy anton-agent tool)
# • submodule venvs: $(API)/.venv, $(AGENT)/.venv
# • ~/.anton — provider keys / .env
# • ~/.cowork — database, hermes, projects
# The next `make setup` (or app launch) reinstalls from scratch.
# Set FORCE=1 to skip the confirmation prompt (CI / scripts).
flush: ## wipe all local installs + app state (fresh start; FORCE=1 to skip prompt)
@echo "This will PERMANENTLY remove:"
@echo " • cowork-server uv tool (+ legacy anton-agent)"
@echo " • $(API)/.venv and $(AGENT)/.venv"
@echo " • ~/.anton (provider keys / .env)"
@echo " • ~/.cowork (database, hermes, projects)"
@if [ "$(FORCE)" != "1" ]; then \
read -p "Proceed? [y/N] " ans; [ "$$ans" = y ] || [ "$$ans" = Y ] || { echo "Aborted."; exit 1; }; \
fi
-uv tool uninstall cowork-server
-uv tool uninstall anton-agent
rm -rf $(API)/.venv $(AGENT)/.venv
rm -rf $$HOME/.anton $$HOME/.cowork
@echo "✓ Flushed. Run 'make setup' (or relaunch the app) for a fresh install."
# ── Module-branch workflow ───────────────────────────────────────────────
# The superproject pins each submodule to a commit; `.gitmodules` sets
# `ignore = all` so day-to-day branch work never shows up as superproject
# changes (git stays clean). Pins move ONLY via `make pin` — a deliberate,
# reviewable commit. See CLAUDE.md for the full workflow.
refs: ## print the refs the next make/run will use
@echo "frontend : $(FRONTEND_REF)"
@echo "core_api : $(API_REF)"
@echo "core_agent: $(AGENT_REF)"
use: ## check out the configured refs across submodules (REF=… or dev.env)
-git -C $(FRONTEND) fetch -q origin $(FRONTEND_REF)
-git -C $(FRONTEND) checkout $(FRONTEND_REF)
-git -C $(API) fetch -q origin $(API_REF)
-git -C $(API) checkout $(API_REF)
-git -C $(AGENT) fetch -q origin $(AGENT_REF)
-git -C $(AGENT) checkout $(AGENT_REF)
@echo "✓ on: frontend=$(FRONTEND_REF) core_api=$(API_REF) core_agent=$(AGENT_REF)"
baseline: ## snap every submodule back to the superproject's pinned commits
git submodule update --init --recursive
@echo "✓ submodules reset to pinned baseline."
pin: ## record the submodules' CURRENT commits as the superproject pins
git add $(FRONTEND) $(API) $(AGENT) $(VAULT)
@git diff --cached --quiet -- $(FRONTEND) $(API) $(AGENT) $(VAULT) \
&& echo "Nothing to pin — submodule commits already match." \
|| git commit -m "chore: bump submodule pins"
@echo "→ push the superproject to share the new pins."
server: ## (re)install the Electron desktop server from the configured API_REF/AGENT_REF
UV_PYTHON_PREFERENCE=only-managed uv tool install \
"git+https://github.com/mindsdb/cowork-server.git@$(API_REF)" $(_ANTON_WITH) \
--force --reinstall --python '>=3.12,<3.14'
@echo "✓ desktop server installed from core_api@$(API_REF)."
server-local: ## install Electron desktop server from LOCAL uncommitted source (no push needed)
UV_PYTHON_PREFERENCE=only-managed uv tool install \
"$(CURDIR)/$(API)" \
--force --reinstall --python '>=3.12,<3.14'
@echo "✓ desktop server installed from local source: $(CURDIR)/$(API)"
@echo " anton resolved from core_api/pyproject.toml [tool.uv.sources]"
@echo " To also use local core_agent, set:"
@echo " [tool.uv.sources] anton-agent = { path = \"../../core_agent\" }"
@echo " in backend/core_api/pyproject.toml, then re-run server-local."
app: $(_NPM_STAMP) ## run the Electron desktop app against the configured branch (no auto-update)
cd $(FRONTEND) && COWORK_SERVER_DISABLE_AUTOUPDATE=1 npm run dev
app-local: $(_NPM_STAMP) ## run the Electron desktop app using LOCAL source (implies server-local)
$(MAKE) server-local
cd $(FRONTEND) && COWORK_SERVER_DISABLE_AUTOUPDATE=1 \
COWORK_SERVER_PACKAGE="$(CURDIR)/$(API)" npm run dev
pack-local: $(_NPM_STAMP) ## build macOS .app from LOCAL uncommitted source, iCloud-safe (no DMG)
$(MAKE) server-local
cd $(FRONTEND) && PATH="/opt/homebrew/opt/node@20/bin:$$PATH" \
npm run build && \
npx electron-builder --mac --arm64 --dir \
--config.directories.output=/tmp/minds-build
rm -rf $(FRONTEND)/release/mac-arm64
cp -R /tmp/minds-build/mac-arm64 $(FRONTEND)/release/
@echo "✓ Built: $(FRONTEND)/release/mac-arm64/MindsHub Cowork.app"
@echo " Launch: COWORK_SERVER_DISABLE_AUTOUPDATE=1 '$(CURDIR)/$(FRONTEND)/release/mac-arm64/MindsHub Cowork.app/Contents/MacOS/MindsHub Cowork' &"
watch: $(_NPM_STAMP) $(_API_STAMP) $(_AGENT_STAMP) ## live reload — Electron app + Python hot-reload (alias for dev)
@trap 'kill 0' SIGINT SIGTERM EXIT; \
uv run --directory $(API) uvicorn cowork.server:app --reload \
--reload-dir $(CURDIR)/$(API)/cowork \
--reload-dir $(CURDIR)/$(AGENT)/anton & \
npm --prefix $(FRONTEND) run dev