-
Notifications
You must be signed in to change notification settings - Fork 5
Expand file tree
/
Copy pathMakefile
More file actions
116 lines (100 loc) · 4.95 KB
/
Copy pathMakefile
File metadata and controls
116 lines (100 loc) · 4.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
.PHONY: help build install collect clean fmt test lint init baseline gate setup-hooks
# Переменные
BIN_DIR := bin
BINARY := $(BIN_DIR)/archlint
GRAPH_DIR := arch
OUTPUT_ARCH := architecture.yaml
GITHUB_REPO := mshogin/archlint
BASELINE := .archlint-baseline.json
# dogfood-гейт: блокируем ERROR-РЕГРЕССИЮ (НОВЫЕ ERROR-паттерны vs baseline), а НЕ абсолютный
# объём WARNING/INFO. Большой threshold отключает абсолютный count-порог -> остаётся только
# delta-ERROR-гейт (blocking==0). Так 9 baseline ISP-долгов не валят собственный CI.
GATE_THRESHOLD := 100000
help: ## Показать справку
@echo "Доступные команды:"
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}'
build: ## Собрать проект
@echo "=== Сборка archlint ==="
@mkdir -p $(BIN_DIR)
go build -o $(BINARY) ./cmd/archlint
@echo "✓ Бинарник создан: $(BINARY)"
install: build ## Установить archlint в $GOPATH/bin
@echo "=== Установка archlint ==="
go install ./cmd/archlint
@echo "✓ archlint установлен в GOPATH/bin"
collect: build ## Построить структурный граф для archlint
@echo "=== Построение структурного графа ==="
@mkdir -p $(GRAPH_DIR)
$(BINARY) collect . -o $(GRAPH_DIR)/$(OUTPUT_ARCH)
@echo "✓ Структурный граф сохранён: $(GRAPH_DIR)/$(OUTPUT_ARCH)"
baseline: build ## Снять baseline ERROR-паттернов (для delta-гейта)
@echo "=== Снятие baseline ERROR-паттернов ==="
$(BINARY) baseline . -o $(BASELINE)
@echo "✓ baseline: $(BASELINE)"
gate: build ## Архитектурный self-gate (dogfood): блок НОВЫХ ERROR vs baseline (exit 1 при регрессии)
@echo "=== Архитектурный self-gate (delta ERROR-регрессия) ==="
$(BINARY) scan . --baseline $(BASELINE) --threshold $(GATE_THRESHOLD)
@echo "✓ Гейт пройден: новых ERROR-нарушений нет"
setup-hooks: ## Включить РЕПО-ЛОКАЛЬНЫЕ git-hooks (архитектурный pre-commit гейт едет с репо)
git config core.hooksPath .githooks
@echo "✓ core.hooksPath -> .githooks (pre-commit архитектурный self-gate активен, ~1.7s/коммит)"
fmt: ## Форматирование кода
@echo "=== Форматирование кода ==="
go fmt ./...
@echo "✓ Готово"
test: ## Запустить тесты
@echo "=== Запуск тестов ==="
go test -v ./...
lint: ## Проверить код с помощью golangci-lint
@echo "=== Проверка кода ==="
@golangci-lint run ./...
clean: ## Очистить сгенерированные файлы
@echo "=== Очистка ==="
rm -rf $(BIN_DIR)
rm -rf $(GRAPH_DIR)
@echo "✓ Готово"
implement: ## Реализовать спецификацию с помощью Claude Code
claude "$(cat .claude/contribution.md)"
init: ## Скачать archlint из GitHub Releases для текущей платформы
@echo "=== Загрузка archlint ==="
@mkdir -p $(BIN_DIR)
@OS=$$(uname -s | tr '[:upper:]' '[:lower:]'); \
ARCH=$$(uname -m); \
case "$$ARCH" in \
x86_64) ARCH="amd64" ;; \
aarch64) ARCH="arm64" ;; \
arm64) ARCH="arm64" ;; \
*) echo "Unsupported architecture: $$ARCH"; exit 1 ;; \
esac; \
ASSET="archlint-$${OS}-$${ARCH}"; \
echo "Platform: $${OS}-$${ARCH}"; \
echo "Downloading: $${ASSET}"; \
DOWNLOAD_URL=$$(curl -s "https://api.github.com/repos/$(GITHUB_REPO)/releases/latest" \
| grep "browser_download_url.*$${ASSET}\"" \
| cut -d '"' -f 4); \
if [ -z "$$DOWNLOAD_URL" ]; then \
echo "ERROR: Binary not found for $${OS}-$${ARCH}"; \
echo "Available at: https://github.com/$(GITHUB_REPO)/releases"; \
exit 1; \
fi; \
curl -sL "$$DOWNLOAD_URL" -o $(BINARY); \
chmod +x $(BINARY); \
echo "Verifying checksum..."; \
CHECKSUMS_URL=$$(curl -s "https://api.github.com/repos/$(GITHUB_REPO)/releases/latest" \
| grep "browser_download_url.*checksums-sha256.txt\"" \
| cut -d '"' -f 4); \
if [ -n "$$CHECKSUMS_URL" ]; then \
EXPECTED=$$(curl -sL "$$CHECKSUMS_URL" | grep "$$ASSET" | awk '{print $$1}'); \
ACTUAL=$$(sha256sum $(BINARY) 2>/dev/null || shasum -a 256 $(BINARY) 2>/dev/null); \
ACTUAL=$$(echo "$$ACTUAL" | awk '{print $$1}'); \
if [ "$$EXPECTED" = "$$ACTUAL" ]; then \
echo "Checksum OK"; \
else \
echo "WARNING: Checksum mismatch!"; \
echo " Expected: $$EXPECTED"; \
echo " Actual: $$ACTUAL"; \
fi; \
fi; \
echo "Installed: $(BINARY) ($$(./$(BINARY) --version 2>/dev/null || echo 'unknown version'))"
all: fmt build collect ## Выполнить всё (форматирование, сборка, построение графа)
.DEFAULT_GOAL := help