US-24 — Process hygiene UI:
- New .claude/agents/design-reviewer.md (model: opus, read-only) — visual + design-system reviewer that runs after frontend-builder and before code-reviewer. Audits alignment, DESIGN.md tokens, light/dark consistency, typo hierarchy, whitespace rhythm, responsive sanity at 1280x720, button convention, V1 a11y. Output format mirrors code-reviewer.
- Updated .claude/agents/frontend-builder.md DoD: screenshots are MANDATORY (one per feature/state introduced or modified, light+dark when theming is in scope). Hard block on "Dev server not started" — must be flagged explicitly. Screenshots feed the design-reviewer step.
US-25 — PR helper:
- scripts/open-pr.sh wraps `POST /api/v1/repos/{owner}/{repo}/pulls`. Detects host/owner/repo from `git remote get-url origin`, reads basic-auth credentials from `~/.git-credentials` (same source as `git push`, no token in env), uses jq to compose the multiline-safe payload. Validates args, prints PR URL on success, exits non-zero with the server message on failure.
- Makefile target `open-pr TITLE="..." BODY=path/to/body.md [BASE=main]` wraps the script with the same arg validation.
- README.md "Make targets" table extended.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
75 lines
2.4 KiB
Makefile
75 lines
2.4 KiB
Makefile
PORT ?= 5000
|
|
IMAGE ?= mimic:latest
|
|
CONTAINER ?= mimic
|
|
VOLUME ?= mimic-data
|
|
|
|
# Container engine: auto-detect docker first, fall back to podman.
|
|
# Override explicitly with `make <target> CONTAINER_CMD=podman` or `export CONTAINER_CMD=podman`.
|
|
CONTAINER_CMD ?= $(shell if command -v docker >/dev/null 2>&1; then echo docker; else echo podman; fi)
|
|
|
|
.PHONY: build start stop restart update logs create-admin update-mitre test-backend test-frontend test-e2e clean open-pr
|
|
|
|
build:
|
|
$(CONTAINER_CMD) build -f docker/Dockerfile -t $(IMAGE) .
|
|
|
|
start:
|
|
$(CONTAINER_CMD) run -d --name $(CONTAINER) -p $(PORT):5000 -v $(VOLUME):/data --env-file .env $(IMAGE)
|
|
|
|
stop:
|
|
$(CONTAINER_CMD) stop $(CONTAINER) && $(CONTAINER_CMD) rm $(CONTAINER)
|
|
|
|
restart:
|
|
$(MAKE) stop && $(MAKE) start
|
|
|
|
update:
|
|
git pull && $(MAKE) build && $(MAKE) restart
|
|
|
|
logs:
|
|
$(CONTAINER_CMD) logs -f $(CONTAINER)
|
|
|
|
create-admin:
|
|
ifndef USER
|
|
$(error USER is required: make create-admin USER=alice PASS=p4ssw0rd)
|
|
endif
|
|
ifndef PASS
|
|
$(error PASS is required: make create-admin USER=alice PASS=p4ssw0rd)
|
|
endif
|
|
$(CONTAINER_CMD) exec $(CONTAINER) flask create-admin $(USER) $(PASS)
|
|
|
|
MITRE_URL ?= https://raw.githubusercontent.com/mitre/cti/master/enterprise-attack/enterprise-attack.json
|
|
|
|
update-mitre:
|
|
@mkdir -p backend/data/mitre
|
|
@curl -fsSL "$(MITRE_URL)" -o backend/data/mitre/enterprise-attack.json
|
|
@echo "MITRE bundle updated"
|
|
@if $(CONTAINER_CMD) ps --format '{{.Names}}' | grep -q "^$(CONTAINER)$$"; then \
|
|
echo "Restarting $(CONTAINER) to reload MITRE bundle..."; \
|
|
$(CONTAINER_CMD) restart $(CONTAINER); \
|
|
fi
|
|
|
|
test-backend:
|
|
$(CONTAINER_CMD) exec $(CONTAINER) pytest -q backend/tests/
|
|
|
|
test-frontend:
|
|
cd frontend && npm run test -- --run
|
|
|
|
test-e2e:
|
|
cd e2e && npx playwright test
|
|
|
|
clean:
|
|
-$(CONTAINER_CMD) rm -f $(CONTAINER) 2>/dev/null
|
|
-$(CONTAINER_CMD) volume rm $(VOLUME) 2>/dev/null
|
|
rm -rf backend/__pycache__ frontend/node_modules frontend/dist
|
|
|
|
# Open a PR on the Gitea repo for the current branch.
|
|
# make open-pr TITLE="feat: sprint 4 — ..." BODY=path/to/body.md [BASE=main]
|
|
# Uses scripts/open-pr.sh, which reads ~/.git-credentials (no token in env).
|
|
open-pr:
|
|
ifndef TITLE
|
|
$(error TITLE is required: make open-pr TITLE="feat: ..." BODY=path/to/body.md)
|
|
endif
|
|
ifndef BODY
|
|
$(error BODY is required: make open-pr TITLE="feat: ..." BODY=path/to/body.md)
|
|
endif
|
|
./scripts/open-pr.sh --title "$(TITLE)" --body "$(BODY)" --base "$(if $(BASE),$(BASE),main)"
|