@monster-orange/den 0.0.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (255) hide show
  1. package/CHANGELOG.md +204 -0
  2. package/LICENSE +21 -0
  3. package/README.md +165 -1
  4. package/bin/den +68 -0
  5. package/docs/distributions.md +499 -0
  6. package/make/demo.mk +82 -0
  7. package/make/den.mk +80 -0
  8. package/make/journeys.mk +57 -0
  9. package/make/local_dev.mk +154 -0
  10. package/make/security.mk +59 -0
  11. package/make/test.mk +405 -0
  12. package/package.json +101 -4
  13. package/scripts/auth-configure.ts +415 -0
  14. package/scripts/heal-config.ts +92 -0
  15. package/scripts/jsonl-playwright-reporter.js +70 -0
  16. package/scripts/manifest-read.cjs +91 -0
  17. package/scripts/setup-1password.ts +570 -0
  18. package/scripts/setup-secrets.ts +149 -0
  19. package/scripts/view-results.js +156 -0
  20. package/service/install.sh +112 -0
  21. package/src/pillars/api/fixtures/index.ts +128 -0
  22. package/src/pillars/api/fixtures/openapi-validator.ts +111 -0
  23. package/src/pillars/api/global-setup.ts +103 -0
  24. package/src/pillars/api/playwright.config.ts +105 -0
  25. package/src/pillars/api/schemas/example-api.json +110 -0
  26. package/src/pillars/api/tests/health/health.spec.ts +19 -0
  27. package/src/pillars/api/tests/health/manifest.yml +6 -0
  28. package/src/pillars/browser/fixtures/index.ts +232 -0
  29. package/src/pillars/browser/fixtures/package.json +10 -0
  30. package/src/pillars/browser/global-setup.ts +140 -0
  31. package/src/pillars/browser/global-teardown.ts +48 -0
  32. package/src/pillars/browser/playwright.config.ts +212 -0
  33. package/src/pillars/browser/setup.ts +219 -0
  34. package/src/pillars/journeys/app-config.ts +237 -0
  35. package/src/pillars/journeys/discover.ts +160 -0
  36. package/src/pillars/journeys/hooks/deny-shell.cjs +44 -0
  37. package/src/pillars/journeys/observability/events.ts +288 -0
  38. package/src/pillars/journeys/observability/sdk-mapper.ts +306 -0
  39. package/src/pillars/journeys/report/friction.ts +304 -0
  40. package/src/pillars/journeys/report/junit.ts +105 -0
  41. package/src/pillars/journeys/report/render.ts +273 -0
  42. package/src/pillars/journeys/report/results.ts +323 -0
  43. package/src/pillars/journeys/run.ts +673 -0
  44. package/src/pillars/journeys/runner.ts +1025 -0
  45. package/src/pillars/journeys/sandbox.ts +403 -0
  46. package/src/pillars/journeys/spec/loader.ts +152 -0
  47. package/src/pillars/journeys/spec/schema.ts +208 -0
  48. package/src/pillars/journeys/teardown.ts +98 -0
  49. package/src/pillars/journeys/tools/browser-session.ts +219 -0
  50. package/src/pillars/journeys/tools/browser-tool.ts +914 -0
  51. package/src/pillars/journeys/tools/http-tool.ts +564 -0
  52. package/src/pillars/journeys/tools/ledger.ts +278 -0
  53. package/src/pillars/journeys/tools/snapshot-store.ts +117 -0
  54. package/src/pillars/journeys/verify/assertions.ts +502 -0
  55. package/src/pillars/journeys/verify/verdict.ts +71 -0
  56. package/src/pillars/perf/build-report.ts +36 -0
  57. package/src/pillars/perf/k6.config.js +112 -0
  58. package/src/pillars/perf/run.ts +345 -0
  59. package/src/pillars/perf/scenarios/load-profile.js +97 -0
  60. package/src/pillars/perf/staging.ts +73 -0
  61. package/src/pillars/security/discover.ts +124 -0
  62. package/src/pillars/security/findings.ts +151 -0
  63. package/src/pillars/security/plan.ts +355 -0
  64. package/src/pillars/security/run.ts +757 -0
  65. package/src/pillars/smoke/admin-probe.ts +68 -0
  66. package/src/pillars/smoke/base-url.ts +56 -0
  67. package/src/pillars/smoke/cleanup.ts +8 -0
  68. package/src/pillars/smoke/discover.ts +237 -0
  69. package/src/pillars/smoke/ensure-smoke-teardown.ts +40 -0
  70. package/src/pillars/smoke/fixture-manager.ts +217 -0
  71. package/src/pillars/smoke/fixtures.ts +468 -0
  72. package/src/pillars/smoke/global-setup-all.ts +262 -0
  73. package/src/pillars/smoke/global-setup-global.ts +262 -0
  74. package/src/pillars/smoke/global-setup.ts +273 -0
  75. package/src/pillars/smoke/global-teardown-all.ts +8 -0
  76. package/src/pillars/smoke/global-teardown-global.ts +8 -0
  77. package/src/pillars/smoke/global-teardown.ts +139 -0
  78. package/src/pillars/smoke/playwright-all.config.ts +147 -0
  79. package/src/pillars/smoke/playwright-global.config.ts +141 -0
  80. package/src/pillars/smoke/playwright.config.ts +162 -0
  81. package/src/pillars/smoke/setup-env.ts +132 -0
  82. package/src/pillars/smoke/setup-global.ts +126 -0
  83. package/src/pillars/smoke/setup.ts +115 -0
  84. package/src/pillars/smoke/smoke-repo.ts +16 -0
  85. package/src/pillars/smoke/staging.ts +49 -0
  86. package/src/pillars/suites/run.ts +147 -0
  87. package/src/scripts/configure-aws-profiles.ts +114 -0
  88. package/src/scripts/register-repos.ts +307 -0
  89. package/src/scripts/setup-default-workspace.ts +203 -0
  90. package/src/shared/agent-actor.ts +77 -0
  91. package/src/shared/applications.ts +138 -0
  92. package/src/shared/auth/api-token.ts +416 -0
  93. package/src/shared/auth/auth0-helper.ts +284 -0
  94. package/src/shared/auth/headless-login.ts +265 -0
  95. package/src/shared/auth/jwt-helper.ts +186 -0
  96. package/src/shared/auth/sudo-vault.ts +69 -0
  97. package/src/shared/auth/test-accounts.ts +98 -0
  98. package/src/shared/auth/token-injection.ts +184 -0
  99. package/src/shared/auth/token-providers/auth0.ts +80 -0
  100. package/src/shared/auth/token-providers/index.ts +182 -0
  101. package/src/shared/auth/token-refresh.ts +273 -0
  102. package/src/shared/banner.ts +15 -0
  103. package/src/shared/brand.ts +79 -0
  104. package/src/shared/cli-tabs.ts +131 -0
  105. package/src/shared/constants.ts +128 -0
  106. package/src/shared/den-config.ts +688 -0
  107. package/src/shared/dev-metrics/emit.ts +354 -0
  108. package/src/shared/edge/config.ts +229 -0
  109. package/src/shared/edge/render.ts +221 -0
  110. package/src/shared/edge/runtime.ts +268 -0
  111. package/src/shared/edge/status.ts +74 -0
  112. package/src/shared/edge/types.ts +62 -0
  113. package/src/shared/engine.ts +67 -0
  114. package/src/shared/environment/aws-profiles.ts +49 -0
  115. package/src/shared/environment/env-selector.ts +161 -0
  116. package/src/shared/environment/playwright-env.ts +82 -0
  117. package/src/shared/environment-manager/catalog.ts +77 -0
  118. package/src/shared/environment-manager/clone-guard.ts +163 -0
  119. package/src/shared/environment-manager/dag.ts +286 -0
  120. package/src/shared/environment-manager/default-workspace.ts +182 -0
  121. package/src/shared/environment-manager/derivation/alias.ts +90 -0
  122. package/src/shared/environment-manager/derivation/cache.ts +97 -0
  123. package/src/shared/environment-manager/derivation/derive-graph.ts +421 -0
  124. package/src/shared/environment-manager/derivation/derived-up.ts +354 -0
  125. package/src/shared/environment-manager/derivation/load-alias.ts +11 -0
  126. package/src/shared/environment-manager/derivation/rules-compose.ts +42 -0
  127. package/src/shared/environment-manager/derivation/rules-events.ts +50 -0
  128. package/src/shared/environment-manager/derivation/rules-http.ts +247 -0
  129. package/src/shared/environment-manager/derivation/rules-infra.ts +64 -0
  130. package/src/shared/environment-manager/derivation/rules-readiness.ts +96 -0
  131. package/src/shared/environment-manager/derivation/scan.ts +160 -0
  132. package/src/shared/environment-manager/derivation/text.ts +40 -0
  133. package/src/shared/environment-manager/derivation/types.ts +69 -0
  134. package/src/shared/environment-manager/health.ts +635 -0
  135. package/src/shared/environment-manager/index.ts +6 -0
  136. package/src/shared/environment-manager/load-applications.ts +108 -0
  137. package/src/shared/environment-manager/log-tail.ts +213 -0
  138. package/src/shared/environment-manager/make-targets.ts +78 -0
  139. package/src/shared/environment-manager/opctl.ts +335 -0
  140. package/src/shared/environment-manager/readiness.ts +93 -0
  141. package/src/shared/environment-manager/register-local.ts +72 -0
  142. package/src/shared/environment-manager/secrets-check.ts +260 -0
  143. package/src/shared/environment-manager/service-container.ts +47 -0
  144. package/src/shared/environment-manager/service-env.ts +110 -0
  145. package/src/shared/environment-manager/service-runner.ts +1603 -0
  146. package/src/shared/environment-manager/sync-targets.ts +66 -0
  147. package/src/shared/environment-manager/up-plan.ts +326 -0
  148. package/src/shared/environment-manager/workspace-manager.ts +905 -0
  149. package/src/shared/environment-manager/workspaces.ts +860 -0
  150. package/src/shared/manifest/deps.ts +27 -0
  151. package/src/shared/manifest/merge-override.ts +75 -0
  152. package/src/shared/manifest/migrate-manifest.ts +101 -0
  153. package/src/shared/manifest/placement.ts +321 -0
  154. package/src/shared/manifest/read-manifest.ts +278 -0
  155. package/src/shared/manifest/schema.ts +313 -0
  156. package/src/shared/manifest/service-links.ts +93 -0
  157. package/src/shared/manifest/validate-layers.ts +229 -0
  158. package/src/shared/manifest/validate-manifest.ts +200 -0
  159. package/src/shared/manifest/workspace-manifests.ts +92 -0
  160. package/src/shared/open-url.ts +122 -0
  161. package/src/shared/org.ts +44 -0
  162. package/src/shared/paths.ts +190 -0
  163. package/src/shared/perf/optional-fields.ts +105 -0
  164. package/src/shared/perf/report-normalizer.ts +404 -0
  165. package/src/shared/perf/report-paths.ts +19 -0
  166. package/src/shared/perf/report-store.ts +110 -0
  167. package/src/shared/perf/report-types.ts +70 -0
  168. package/src/shared/perf/test-paths.ts +25 -0
  169. package/src/shared/process/log-rotation.ts +147 -0
  170. package/src/shared/process/spawn-streaming.ts +229 -0
  171. package/src/shared/product.ts +92 -0
  172. package/src/shared/profile.ts +141 -0
  173. package/src/shared/redact.ts +107 -0
  174. package/src/shared/repo-kind.ts +32 -0
  175. package/src/shared/reporting/jsonl-reporter.ts +131 -0
  176. package/src/shared/reporting/slack-reporter.ts +340 -0
  177. package/src/shared/results/result-reader.ts +266 -0
  178. package/src/shared/results/result-writer.ts +168 -0
  179. package/src/shared/secrets/doppler.ts +126 -0
  180. package/src/shared/secrets/env.ts +48 -0
  181. package/src/shared/secrets/index.ts +197 -0
  182. package/src/shared/secrets/keys.ts +33 -0
  183. package/src/shared/secrets/onepassword.ts +75 -0
  184. package/src/shared/secrets/types.ts +52 -0
  185. package/src/shared/service-url.ts +119 -0
  186. package/src/shared/smoke/branch-resolver.ts +141 -0
  187. package/src/shared/smoke/git-remote.ts +70 -0
  188. package/src/shared/smoke/repo-cloner.ts +151 -0
  189. package/src/shared/stacks/config.ts +137 -0
  190. package/src/shared/stacks/manifest-commands.ts +118 -0
  191. package/src/shared/stacks/render.ts +253 -0
  192. package/src/shared/stacks/runtime.ts +334 -0
  193. package/src/shared/stacks/status.ts +99 -0
  194. package/src/shared/stacks/types.ts +53 -0
  195. package/src/shared/terminal/tabs.ts +212 -0
  196. package/src/shared/test-discovery/module-scanner.ts +569 -0
  197. package/src/shared/types/index.ts +701 -0
  198. package/src/shared/ui-marker.ts +19 -0
  199. package/src/ui/cli/applications-command.ts +148 -0
  200. package/src/ui/cli/config-command.ts +68 -0
  201. package/src/ui/cli/create-main.ts +9 -0
  202. package/src/ui/cli/create.ts +360 -0
  203. package/src/ui/cli/edge-command.ts +81 -0
  204. package/src/ui/cli/flag-parser.ts +246 -0
  205. package/src/ui/cli/graph-command.ts +570 -0
  206. package/src/ui/cli/health-display.ts +63 -0
  207. package/src/ui/cli/index.ts +3742 -0
  208. package/src/ui/cli/init.ts +855 -0
  209. package/src/ui/cli/invocation-target.ts +175 -0
  210. package/src/ui/cli/logs-command.ts +104 -0
  211. package/src/ui/cli/mcp-main.ts +13 -0
  212. package/src/ui/cli/mcp-stdout-guard.ts +10 -0
  213. package/src/ui/cli/module-selection.ts +31 -0
  214. package/src/ui/cli/prompts.ts +767 -0
  215. package/src/ui/cli/results-viewer.ts +436 -0
  216. package/src/ui/cli/secrets-preflight.ts +91 -0
  217. package/src/ui/cli/stack-command.ts +117 -0
  218. package/src/ui/cli/stalled-setup-recovery.ts +129 -0
  219. package/src/ui/cli/test-runner.ts +1319 -0
  220. package/src/ui/cli/web-command.ts +1073 -0
  221. package/src/ui/mcp/api.ts +284 -0
  222. package/src/ui/mcp/guards.ts +141 -0
  223. package/src/ui/mcp/server.ts +147 -0
  224. package/src/ui/mcp/tools.ts +565 -0
  225. package/src/ui/server/audit.ts +71 -0
  226. package/src/ui/server/changelog-parser.ts +105 -0
  227. package/src/ui/server/daemon-reaper.ts +129 -0
  228. package/src/ui/server/editor-manager.ts +301 -0
  229. package/src/ui/server/github-service.ts +223 -0
  230. package/src/ui/server/graph-prefs.ts +89 -0
  231. package/src/ui/server/health-row.ts +15 -0
  232. package/src/ui/server/http-helpers.ts +98 -0
  233. package/src/ui/server/index.ts +3350 -0
  234. package/src/ui/server/log-history.ts +453 -0
  235. package/src/ui/server/perf-report.ts +42 -0
  236. package/src/ui/server/public/environments.html +496 -0
  237. package/src/ui/server/public/favicon.ico +0 -0
  238. package/src/ui/server/public/graph-model.js +416 -0
  239. package/src/ui/server/public/graph.css +976 -0
  240. package/src/ui/server/public/graph.js +986 -0
  241. package/src/ui/server/public/header.js +1373 -0
  242. package/src/ui/server/public/index.html +2595 -0
  243. package/src/ui/server/public/local-dev.html +5344 -0
  244. package/src/ui/server/public/logs.html +1496 -0
  245. package/src/ui/server/public/panel.js +787 -0
  246. package/src/ui/server/public/perf-report.js +359 -0
  247. package/src/ui/server/public/release.html +2111 -0
  248. package/src/ui/server/public/services.html +1103 -0
  249. package/src/ui/server/public/workspace-picker.js +69 -0
  250. package/src/ui/server/readonly-routes.ts +200 -0
  251. package/src/ui/server/release-deploy-session.ts +246 -0
  252. package/src/ui/server/release-service.ts +1125 -0
  253. package/src/ui/server/sudo-store.ts +111 -0
  254. package/src/ui/server/ui-assets.ts +73 -0
  255. package/src/ui/server/workspace-routes.ts +2185 -0
@@ -0,0 +1,57 @@
1
+ # make/journeys.mk — Agent-driven E2E journeys (journeys pillar)
2
+ #
3
+ # Journey specs live in registered service repos (e.g. shop-web) and are
4
+ # discovered through their .den.yml `journeys:` block; the runner drives
5
+ # a sandboxed @cursor/sdk agent per journey. See src/pillars/journeys/.
6
+ #
7
+ # Usage:
8
+ # make test-jrn-all env=<env> All journeys allowing <env>
9
+ # make test-jrn-<name> env=<env> Single journey by spec name
10
+ # make test-jrn-<name> env=<env> repo=<repo> Disambiguate a spec name
11
+ # duplicated across repos
12
+ # (passes --journey=<repo>/<name>)
13
+ #
14
+ # The root Makefile declares a global `repo` for the smoke pillar.
15
+ # Journeys deliberately ignore that inherited default — only a `repo=` stated
16
+ # on the command line ($(origin repo) == "command line") qualifies the spec
17
+ # name; otherwise the bare name is resolved across all registered repos.
18
+ #
19
+ # EXPLICIT-ENV GUARD: the root Makefile sets `env ?= local`, which would
20
+ # silently point journeys at local. Journeys are agent-driven runs with
21
+ # real side effects, so the env MUST be stated on the command line —
22
+ # $(origin env) is "command line" only then; "file" (the ?= default) and
23
+ # "environment" (an inherited shell var) are both rejected.
24
+ #
25
+ # MODEL: each journey spec may declare its own default (`model:` field);
26
+ # the JOURNEYS_MODEL env var, when set, overrides every spec (operator
27
+ # control, e.g. CI cost pinning). A journey with neither is refused by the
28
+ # runner — no default model is ever invented. CURSOR_API_KEY needs no
29
+ # export — the runner falls back to a 1Password `op read` when unset.
30
+
31
+ .PHONY: test-jrn-all .journeys-check-env
32
+
33
+ .journeys-check-env:
34
+ ifeq ($(origin env),command line)
35
+ @true
36
+ else
37
+ @echo "❌ Journeys require an explicit env=<name> on the command line."
38
+ @echo " The Makefile default (env ?= local) is deliberately rejected for"
39
+ @echo " agent-driven runs. Usage: make test-jrn-all env=local"
40
+ @exit 1
41
+ endif
42
+
43
+ # All journeys whose environments allowlist includes $(env)
44
+ test-jrn-all: .journeys-check-env .check-auth
45
+ @echo "🧭 Running ALL journeys..."
46
+ @echo "🌍 Environment: $(env)"
47
+ @echo ""
48
+ @$(DEN_TSX) $(DEN_ENGINE)/src/pillars/journeys/run.ts --env=$(env)
49
+
50
+ # make test-jrn-<journey-name> env=<env>
51
+ test-jrn-%: .journeys-check-env .check-auth
52
+ @JOURNEY_NAME=$(subst test-jrn-,,$@); \
53
+ $(if $(filter command line,$(origin repo)),JOURNEY_NAME="$(repo)/$$JOURNEY_NAME";) \
54
+ echo "🧭 Running journey $$JOURNEY_NAME..."; \
55
+ echo "🌍 Environment: $(env)"; \
56
+ echo ""; \
57
+ $(DEN_TSX) $(DEN_ENGINE)/src/pillars/journeys/run.ts --env=$(env) --journey=$$JOURNEY_NAME
@@ -0,0 +1,154 @@
1
+ # make/local_dev.mk — Local Dev environment manager
2
+ #
3
+ # Manages the Local Dev experience: service clones, workspaces, web UI,
4
+ # secrets setup, repo registration, auth configuration, and AWS profiles.
5
+
6
+ .PHONY: down $(DEN_TARGET_PREFIX)-up $(DEN_TARGET_PREFIX)-down $(DEN_TARGET_PREFIX)-restart $(DEN_TARGET_PREFIX)-status $(DEN_TARGET_PREFIX)-services \
7
+ $(DEN_TARGET_PREFIX)-graph $(DEN_TARGET_PREFIX)-logs \
8
+ $(DEN_TARGET_PREFIX)-register $(DEN_TARGET_PREFIX)-setup $(DEN_TARGET_PREFIX)-sync $(DEN_TARGET_PREFIX)-workspace \
9
+ $(DEN_TARGET_PREFIX)-init $(DEN_TARGET_PREFIX)-validate $(DEN_TARGET_PREFIX)-local-dev $(DEN_TARGET_PREFIX)-setup-secrets $(DEN_TARGET_PREFIX)-setup-1password \
10
+ register-repos aws-configure auth-configure \
11
+ web dev-dns
12
+
13
+ # ── Service management ────────────────────────────────────────────────────────
14
+
15
+ # Start always_on services in the active workspace.
16
+ # Usage: make $(DEN_TARGET_PREFIX)-up OR make $(DEN_TARGET_PREFIX)-up args="shop/api tasks-runner"
17
+ $(DEN_TARGET_PREFIX)-up:
18
+ @if ! $(DEN_TSX) $(DEN_ENGINE)/scripts/setup-secrets.ts --gate; then \
19
+ echo ""; \
20
+ echo "🔑 secrets.required is set and the secrets backend is not ready."; \
21
+ echo ""; \
22
+ $(MAKE) $(DEN_TARGET_PREFIX)-setup-secrets || exit 1; \
23
+ fi
24
+ @$(DEN_BIN) up $(args)
25
+
26
+ # Stop services in the active workspace. `make down` is the short form most
27
+ # people reach for, so it stops SERVICES; use `make test-down` for Playwright/k6.
28
+ # Usage: make down OR make down args="files-api -w files-api"
29
+ down $(DEN_TARGET_PREFIX)-down:
30
+ @$(DEN_BIN) down $(args)
31
+
32
+ $(DEN_TARGET_PREFIX)-restart:
33
+ @$(DEN_BIN) restart $(args)
34
+
35
+ $(DEN_TARGET_PREFIX)-status:
36
+ @$(DEN_BIN) status
37
+
38
+ # Tail live local logs for a repo's service (offers to start it when down).
39
+ # Usage: make $(DEN_TARGET_PREFIX)-logs OR make $(DEN_TARGET_PREFIX)-logs args="shop"
40
+ $(DEN_TARGET_PREFIX)-logs:
41
+ @$(DEN_BIN) logs $(args)
42
+
43
+ $(DEN_TARGET_PREFIX)-services:
44
+ @$(DEN_BIN) services
45
+
46
+ # Derive and show the system dependency graph.
47
+ # Usage: make $(DEN_TARGET_PREFIX)-graph OR make $(DEN_TARGET_PREFIX)-graph args="--all --diff"
48
+ $(DEN_TARGET_PREFIX)-graph:
49
+ @$(DEN_BIN) graph $(args)
50
+
51
+ # Check for updates and pull managed repos.
52
+ $(DEN_TARGET_PREFIX)-sync:
53
+ @$(DEN_BIN) sync $(args)
54
+
55
+ # ── Workspaces ────────────────────────────────────────────────────────────────
56
+
57
+ # Usage: make $(DEN_TARGET_PREFIX)-workspace args="list"
58
+ # make $(DEN_TARGET_PREFIX)-workspace args="use feat-streaming"
59
+ # make $(DEN_TARGET_PREFIX)-workspace args="create feat-streaming"
60
+ $(DEN_TARGET_PREFIX)-workspace:
61
+ @$(DEN_BIN) workspace $(args)
62
+
63
+ # ── Catalog & repo setup ──────────────────────────────────────────────────────
64
+
65
+ # Register a repo in the service catalog (interactive).
66
+ # Usage: make $(DEN_TARGET_PREFIX)-register OR make $(DEN_TARGET_PREFIX)-register args=/path/to/repo
67
+ $(DEN_TARGET_PREFIX)-register:
68
+ @$(DEN_BIN) register $(args)
69
+
70
+ # Run setup for registered services.
71
+ # Usage: make $(DEN_TARGET_PREFIX)-setup OR make $(DEN_TARGET_PREFIX)-setup args="shop tasks-runner"
72
+ $(DEN_TARGET_PREFIX)-setup:
73
+ @$(DEN_BIN) setup $(args)
74
+
75
+ # Scaffold a new .den.yml in a target directory (interactive).
76
+ # Usage: make $(DEN_TARGET_PREFIX)-init OR make $(DEN_TARGET_PREFIX)-init args=/path/to/repo
77
+ $(DEN_TARGET_PREFIX)-init:
78
+ @$(DEN_BIN) init $(args)
79
+
80
+ # Heal config/den.yml — fills missing required keys (currently github_org).
81
+ # Idempotent. Safe for existing users whose den.yml pre-dates github_org.
82
+ $(DEN_TARGET_PREFIX)-heal-config:
83
+ @$(DEN_TSX) $(DEN_ENGINE)/scripts/heal-config.ts
84
+
85
+ # Validate a .den.yml file or URL.
86
+ # Usage: make $(DEN_TARGET_PREFIX)-validate args=/path/to/repo
87
+ # make $(DEN_TARGET_PREFIX)-validate args=/path/to/repo/.den.yml
88
+ $(DEN_TARGET_PREFIX)-validate:
89
+ @$(DEN_BIN) validate $(args)
90
+
91
+ # Toggle the local dev experience on or off (per-engineer, gitignored).
92
+ # Usage: make $(DEN_TARGET_PREFIX)-local-dev args=on|off
93
+ $(DEN_TARGET_PREFIX)-local-dev:
94
+ @$(DEN_BIN) local-dev $(args)
95
+
96
+ # Set up developer secrets with the configured backend (secrets.provider).
97
+ $(DEN_TARGET_PREFIX)-setup-secrets:
98
+ @$(DEN_TSX) $(DEN_ENGINE)/scripts/setup-secrets.ts
99
+
100
+ # 1Password strategy only: populate the "Developer API Keys" item.
101
+ $(DEN_TARGET_PREFIX)-setup-1password:
102
+ @$(DEN_TSX) $(DEN_ENGINE)/scripts/setup-1password.ts
103
+
104
+ # Show where test discovery gets its repos. With Local Dev enabled (default)
105
+ # it follows the workspace — nothing to register. Hosted / no-local setups get
106
+ # the legacy sibling scan (also forceable with args=--legacy), which writes
107
+ # config/local/registered-repos.json (gitignored).
108
+ register-repos:
109
+ @$(DEN_TSX) $(DEN_ENGINE)/src/scripts/register-repos.ts $(args)
110
+
111
+ # Map den environments → AWS CLI profiles for CloudWatch logs and re-auth.
112
+ # Writes to config/local/aws-profiles.json (gitignored).
113
+ aws-configure:
114
+ @$(DEN_TSX) $(DEN_ENGINE)/src/scripts/configure-aws-profiles.ts
115
+
116
+ # Per-engineer admin 1Password setup — staging/production only.
117
+ # Saves config/local/admin-auth-{env}.json (gitignored, no password stored).
118
+ auth-configure:
119
+ @E2E_ENVIRONMENT=$(env) $(DEN_TSX) $(DEN_ENGINE)/scripts/auth-configure.ts
120
+ @$(MAKE) int-jwt-clear env=$(env)
121
+
122
+ # ── Web UI ────────────────────────────────────────────────────────────────────
123
+
124
+ # Browser-based runner + Local Dev dashboard at http://localhost:<web.port> (default 7777),
125
+ # and https://<brand>.<edge.domain> once `edge up` has run. Never opens a browser:
126
+ # it prints the address instead.
127
+ # PORT=8080 make web — run on a different port.
128
+ # make web silent=true — suppress request logs (banner still shown).
129
+ web:
130
+ @if ! $(DEN_TSX) $(DEN_ENGINE)/scripts/setup-secrets.ts --gate; then \
131
+ echo ""; \
132
+ echo "🔑 secrets.required is set and the secrets backend is not ready."; \
133
+ echo ""; \
134
+ $(MAKE) $(DEN_TARGET_PREFIX)-setup-secrets || exit 1; \
135
+ fi
136
+ @echo "🌐 Starting the web UI..."
137
+ @_PORT=$${PORT:-$$($(DEN_TSX) -e 'import("$(DEN_ENGINE)/src/shared/edge/config.ts").then(m=>console.log(m.readWebPort()))' 2>/dev/null || echo 7777)}; \
138
+ _HOST=$$(grep -q "127.0.0.1 den" /etc/hosts 2>/dev/null && echo "den" || echo "localhost"); \
139
+ _SILENT_FLAG=$$([ "$(silent)" = "true" ] && echo "--silent" || echo ""); \
140
+ echo " http://$$_HOST:$$_PORT"; \
141
+ $(DEN_TSX) $(DEN_ENGINE)/src/ui/server/index.ts $$_SILENT_FLAG
142
+
143
+ # OPTIONAL, legacy: add a bare 'den' alias to /etc/hosts (needs sudo) so
144
+ # http://den:7777 resolves. Not needed — http://den.localhost:7777
145
+ # already resolves in Chromium/Firefox, and http://localhost:7777 everywhere.
146
+ # Requires sudo.
147
+ dev-dns:
148
+ @if grep -q "127.0.0.1 den" /etc/hosts 2>/dev/null; then \
149
+ echo "✅ /etc/hosts already has '127.0.0.1 den'"; \
150
+ else \
151
+ echo "Adding '127.0.0.1 den' to /etc/hosts (requires sudo)..."; \
152
+ echo '127.0.0.1 den' | sudo tee -a /etc/hosts > /dev/null; \
153
+ echo "✅ Done. You can now use http://den:7777"; \
154
+ fi
@@ -0,0 +1,59 @@
1
+ # make/security.mk — OWASP ZAP scanning of our own services (security pillar)
2
+ #
3
+ # Scan targets are declared in each workspace repo's .den.yml (or the
4
+ # den-held manifests/<repo>.den.yml) under `security:`; the runner
5
+ # drives ZAP in docker. Every target host must be on the owned-host allowlist
6
+ # (config/den.yml `security.owned_hosts`). See src/pillars/security/.
7
+ #
8
+ # Usage:
9
+ # make test-sec-all env=<env> Every target, baseline mode
10
+ # make test-sec-<service> env=<env> One service (bare name)
11
+ # make test-sec-<service> env=<env> repo=<repo> Repo-qualified (--service=<repo>/<service>)
12
+ # make test-sec-all env=<env> mode=<m> m = baseline | api | full | all
13
+ # make test-sec-all env=<env> dry_run=1 Print the docker commands only
14
+ #
15
+ # Production is passive-only (baseline) and additionally needs
16
+ # DEN_ALLOW_PROD=1; the runner enforces both — this file only guards env.
17
+ #
18
+ # The root Makefile sets a global `repo ?= shop` default for the smoke
19
+ # pillar. Security deliberately ignores that inherited default — only a
20
+ # `repo=` stated on the command line ($(origin repo) == "command line")
21
+ # qualifies the service name.
22
+ #
23
+ # EXPLICIT-ENV GUARD: the root Makefile sets `env ?= local`, which would
24
+ # silently point scans at local. Scans send attack traffic, so the env MUST
25
+ # be stated on the command line — $(origin env) is "command line" only then;
26
+ # "file" (the ?= default) and "environment" (an inherited shell var) are
27
+ # both rejected.
28
+
29
+ .PHONY: test-sec-all .security-check-env
30
+
31
+ # Optional pass-through flags (only when stated on the command line)
32
+ SEC_FLAGS := $(if $(filter command line,$(origin mode)),--mode=$(mode)) \
33
+ $(if $(filter command line,$(origin dry_run)),--dry-run)
34
+
35
+ .security-check-env:
36
+ ifeq ($(origin env),command line)
37
+ @true
38
+ else
39
+ @echo "❌ Security scans require an explicit env=<name> on the command line."
40
+ @echo " The Makefile default (env ?= local) is deliberately rejected for"
41
+ @echo " scans that send attack traffic. Usage: make test-sec-all env=local"
42
+ @exit 1
43
+ endif
44
+
45
+ # Every discovered target allowed in $(env)
46
+ test-sec-all: .security-check-env
47
+ @echo "🛡️ Running ALL security scans..."
48
+ @echo "🌍 Environment: $(env)"
49
+ @echo ""
50
+ @$(DEN_TSX) $(DEN_ENGINE)/src/pillars/security/run.ts --env=$(env) $(SEC_FLAGS)
51
+
52
+ # make test-sec-<service> env=<env> [repo=<repo>]
53
+ test-sec-%: .security-check-env
54
+ @SERVICE_NAME=$(subst test-sec-,,$@); \
55
+ $(if $(filter command line,$(origin repo)),SERVICE_NAME="$(repo)/$$SERVICE_NAME";) \
56
+ echo "🛡️ Running security scan for $$SERVICE_NAME..."; \
57
+ echo "🌍 Environment: $(env)"; \
58
+ echo ""; \
59
+ $(DEN_TSX) $(DEN_ENGINE)/src/pillars/security/run.ts --env=$(env) --service=$$SERVICE_NAME $(SEC_FLAGS)