-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMakefile
More file actions
198 lines (161 loc) · 7.29 KB
/
Copy pathMakefile
File metadata and controls
198 lines (161 loc) · 7.29 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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
.PHONY: help setup config-check config-check-production dev-init dev-start dev-ready dev-stop dev-clean dev-status dev-api-start dev-api-stop dev-api-logs dev-api-status dev-worker-start dev-worker-stop dev-worker-logs dev-worker-status dev-web-start dev-web-stop dev-web-logs dev-web-status dev-db-connect db-check db-create db-migrate sync-once rules-once metrics-once drift-once notify-once format format-check check test ci
API_PID := api_server.pid
API_LOG := api_server.log
WORKER_PID := worker.pid
WORKER_LOG := worker.log
WEB_PID := web_server.pid
WEB_LOG := web_server.log
START_BG := node scripts/run-background.mjs
STOP_BG := node scripts/stop-background.mjs
WAIT_URL := node scripts/wait-for-url.mjs
WAIT_WORKER := node scripts/wait-for-worker-heartbeat.mjs
ASSERT_PORT_FREE := node scripts/assert-port-free.mjs
ASSERT_DB_READY := node scripts/assert-db-ready.mjs
ENSURE_TOKEN_KEY := node scripts/ensure-token-encryption-key.mjs
ENSURE_WEBHOOK_SECRET := node scripts/ensure-github-webhook-secret.mjs
CONFIG_CHECK := node scripts/config-check.mjs
help:
@echo "mo-devflow Development Commands"
@echo "================================"
@echo " make setup - Create .env, local secrets, and install dependencies"
@echo " make config-check - Validate local configuration without printing secrets"
@echo " make config-check-production - Validate production-required configuration"
@echo " make dev-init - setup + db-create + db-migrate"
@echo " make dev-start - Start API, worker, and web UI"
@echo " make dev-ready - Wait for local API, worker, and web readiness"
@echo " make dev-stop - Stop API, worker, and web UI"
@echo " make dev-clean - Stop services and remove local runtime artifacts"
@echo " make dev-status - Show service status"
@echo " make db-check - Verify MatrixOne connection configuration"
@echo " make db-create - Create dedicated MatrixOne database"
@echo " make db-migrate - Run schema migrations"
@echo " make sync-once - Run one GitHub sync pass"
@echo " make rules-once - Recompute derived rules from cached data"
@echo " make metrics-once - Recompute analytics metrics from cached data"
@echo " make drift-once - Recompute AI drift signals from cached data"
@echo " make notify-once - Process notification candidates"
@echo " make format - Format source files"
@echo " make format-check - Check source formatting"
@echo " make check - Typecheck and test"
@echo " make ci - check + build"
setup:
@if [ ! -f .env ]; then cp .env.example .env; echo "Created .env"; else echo ".env already exists"; fi
@$(ENSURE_TOKEN_KEY) .env
@$(ENSURE_WEBHOOK_SECRET) .env
@npm install
config-check:
@$(CONFIG_CHECK) .env
config-check-production:
@$(CONFIG_CHECK) --production .env
dev-init: setup db-create db-migrate
db-create:
@set -a; [ -f .env ] && . ./.env; set +a; \
mysql --protocol=TCP -h"$${MO_DEVFLOW_DB_HOST:-127.0.0.1}" -P"$${MO_DEVFLOW_DB_PORT:-6001}" -u"$${MO_DEVFLOW_DB_USER:-root}" --password="$${MO_DEVFLOW_DB_PASSWORD:-}" -e "CREATE DATABASE IF NOT EXISTS \`$${MO_DEVFLOW_DB_NAME:-mo_devflow}\`;"
db-check:
@set -a; [ -f .env ] && . ./.env; set +a; \
$(ASSERT_DB_READY)
db-migrate:
@npm run db:migrate
sync-once:
@npm run sync:once
rules-once:
@npm run rules:once
metrics-once:
@npm run metrics:once
drift-once:
@npm run drift:once
notify-once:
@npm run notify:once
dev-api-start:
@set -a; [ -f .env ] && . ./.env; set +a; \
started=0; \
if [ -f $(API_PID) ] && kill -0 $$(cat $(API_PID)) 2>/dev/null; then \
echo "API already running (PID $$(cat $(API_PID)))"; \
else \
$(ASSERT_DB_READY) || exit 1; \
$(ASSERT_PORT_FREE) 127.0.0.1 "$${MO_DEVFLOW_API_PORT:-18081}" API; \
$(START_BG) $(API_PID) $(API_LOG) -- npm run dev:api; \
started=1; \
echo "API starting (PID $$(cat $(API_PID)), log $(API_LOG))"; \
fi; \
if ! $(WAIT_URL) "http://127.0.0.1:$${MO_DEVFLOW_API_PORT:-18081}/health" API 30000; then \
if [ "$$started" = "1" ]; then $(STOP_BG) $(API_PID) API; fi; \
exit 1; \
fi
dev-api-stop:
@$(STOP_BG) $(API_PID) API
dev-api-logs:
@tail -f $(API_LOG)
dev-api-status:
@if [ -f $(API_PID) ] && kill -0 $$(cat $(API_PID)) 2>/dev/null; then echo "API running (PID $$(cat $(API_PID)))"; else echo "API not running"; fi
dev-worker-start:
@set -a; [ -f .env ] && . ./.env; set +a; \
started=0; \
if [ -f $(WORKER_PID) ] && kill -0 $$(cat $(WORKER_PID)) 2>/dev/null; then \
echo "Worker already running (PID $$(cat $(WORKER_PID)))"; \
else \
$(ASSERT_DB_READY) || exit 1; \
$(START_BG) $(WORKER_PID) $(WORKER_LOG) -- npm run dev:worker; \
started=1; \
echo "Worker starting (PID $$(cat $(WORKER_PID)), log $(WORKER_LOG))"; \
fi; \
if ! $(WAIT_WORKER) $(WORKER_PID) Worker 30000; then \
if [ "$$started" = "1" ]; then $(STOP_BG) $(WORKER_PID) Worker; fi; \
exit 1; \
fi
dev-worker-stop:
@$(STOP_BG) $(WORKER_PID) Worker
dev-worker-logs:
@tail -f $(WORKER_LOG)
dev-worker-status:
@if [ -f $(WORKER_PID) ] && kill -0 $$(cat $(WORKER_PID)) 2>/dev/null; then echo "Worker running (PID $$(cat $(WORKER_PID)))"; else echo "Worker not running"; fi
dev-web-start:
@set -a; [ -f .env ] && . ./.env; set +a; \
started=0; \
if [ -f $(WEB_PID) ] && kill -0 $$(cat $(WEB_PID)) 2>/dev/null; then \
echo "Web already running (PID $$(cat $(WEB_PID)))"; \
else \
$(ASSERT_PORT_FREE) 127.0.0.1 "$${MO_DEVFLOW_WEB_PORT:-5173}" Web; \
$(START_BG) $(WEB_PID) $(WEB_LOG) -- npm --workspace @mo-devflow/web run dev -- --host 0.0.0.0; \
started=1; \
echo "Web starting (PID $$(cat $(WEB_PID)), log $(WEB_LOG))"; \
fi; \
if ! $(WAIT_URL) "http://127.0.0.1:$${MO_DEVFLOW_WEB_PORT:-5173}/" Web 30000; then \
if [ "$$started" = "1" ]; then $(STOP_BG) $(WEB_PID) Web; fi; \
exit 1; \
fi
dev-web-stop:
@$(STOP_BG) $(WEB_PID) Web
dev-web-logs:
@tail -f $(WEB_LOG)
dev-web-status:
@if [ -f $(WEB_PID) ] && kill -0 $$(cat $(WEB_PID)) 2>/dev/null; then echo "Web running (PID $$(cat $(WEB_PID)))"; else echo "Web not running"; fi
dev-start: dev-api-start dev-worker-start dev-web-start
@$(MAKE) --no-print-directory dev-ready
@set -a; [ -f .env ] && . ./.env; set +a; \
echo "API: http://localhost:$${MO_DEVFLOW_API_PORT:-18081}"; \
echo "Web: http://localhost:$${MO_DEVFLOW_WEB_PORT:-5173}"
dev-ready:
@set -a; [ -f .env ] && . ./.env; set +a; \
$(WAIT_URL) "http://127.0.0.1:$${MO_DEVFLOW_API_PORT:-18081}/health" API 30000; \
$(WAIT_URL) "http://127.0.0.1:$${MO_DEVFLOW_API_PORT:-18081}/health" "Worker heartbeat" 30000 worker.status active; \
$(WAIT_URL) "http://127.0.0.1:$${MO_DEVFLOW_WEB_PORT:-5173}/" Web 30000
dev-stop: dev-web-stop dev-worker-stop dev-api-stop
dev-clean: dev-stop
@rm -f $(API_PID) $(WORKER_PID) $(WEB_PID) $(API_LOG) $(WORKER_LOG) $(WEB_LOG)
@rm -rf apps/web/dist
@echo "Removed local pid files, logs, and web build output"
dev-status: dev-api-status dev-worker-status dev-web-status
dev-db-connect:
@set -a; [ -f .env ] && . ./.env; set +a; \
mysql --protocol=TCP -h"$${MO_DEVFLOW_DB_HOST:-127.0.0.1}" -P"$${MO_DEVFLOW_DB_PORT:-6001}" -u"$${MO_DEVFLOW_DB_USER:-root}" --password="$${MO_DEVFLOW_DB_PASSWORD:-}" "$${MO_DEVFLOW_DB_NAME:-mo_devflow}"
test:
@npm run test
format:
@npm run format
format-check:
@npm run format:check
check:
@npm run check
ci:
@npm run ci