@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
package/make/test.mk ADDED
@@ -0,0 +1,405 @@
1
+ # make/test.mk โ€” Test execution
2
+ #
3
+ # Synthetic (browser/Playwright), integration (API), performance (k6),
4
+ # and smoke tests (service-repo owned files, den harness).
5
+ # Results, reporting, JWT token cache, and process cleanup also live here.
6
+
7
+ .PHONY: test test-syn-all test-int-all test-perf-all test-perf \
8
+ test-smk test-smk- test-smk-all test-smk-global \
9
+ smoke-link smoke-status smoke-clone smoke-clone-status \
10
+ synth-link synth-status test-framework \
11
+ int-jwt-clear int-jwt-status \
12
+ results results-flaky results-api results-perf \
13
+ report clean-reports test-down _open-report .check-auth
14
+
15
+ # Sessions are created fresh by global-setup on every run โ€” nothing to check.
16
+ .check-auth:
17
+ @true
18
+
19
+ # Interactive test runner
20
+ test: .check-auth
21
+ @echo "Starting interactive test runner..."
22
+ @$(DEN_CLI_TS) menu
23
+
24
+ # โ”€โ”€ Synthetic tests (browser, Playwright) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
25
+
26
+ test-syn-all: .check-auth
27
+ @echo "๐Ÿงช Running ALL synthetic tests (headless)..."
28
+ @echo "๐ŸŒ Environment: $(env)"
29
+ @echo ""
30
+ @SYNTH_REPO=$(repo) $(DEN_TSX) $(DEN_ENGINE)/src/pillars/browser/setup.ts && \
31
+ SYNTH_REPO=$(repo) $(DEN_PLAYWRIGHT) test --config=$(DEN_ENGINE)/src/pillars/browser/playwright.config.ts
32
+ @[ ! "$$CI" = "true" ] && [ -d "playwright-report" ] && $(MAKE) --no-print-directory _open-report || true
33
+
34
+ # make test-syn-<module>
35
+ test-syn-%: .check-auth
36
+ @MODULE_NAME=$(subst test-syn-,,$@); \
37
+ STAGING_DIR=".synth-run/$(repo)/$$MODULE_NAME"; \
38
+ echo "๐Ÿงช Staging synthetic tests for repo=$(repo)..."; \
39
+ SYNTH_REPO=$(repo) $(DEN_TSX) $(DEN_ENGINE)/src/pillars/browser/setup.ts || exit 1; \
40
+ if [ -d "$$STAGING_DIR" ]; then \
41
+ echo "๐Ÿงช Running synthetic/$$MODULE_NAME tests..."; \
42
+ echo "๐ŸŒ Environment: $(env)"; \
43
+ echo ""; \
44
+ SYNTH_REPO=$(repo) $(DEN_PLAYWRIGHT) test --config=$(DEN_ENGINE)/src/pillars/browser/playwright.config.ts "$$STAGING_DIR/"; \
45
+ else \
46
+ echo "โŒ Module '$$MODULE_NAME' not found in .synth-run/$(repo)/"; \
47
+ echo ""; \
48
+ echo "Available modules:"; \
49
+ find ".synth-run/$(repo)" -maxdepth 1 -type d ! -path ".synth-run/$(repo)" ! -name "node_modules" -exec basename {} \; 2>/dev/null | sort | sed 's/^/ - test-syn-/' || true; \
50
+ exit 1; \
51
+ fi
52
+ @[ ! "$$CI" = "true" ] && [ -d "playwright-report" ] && $(MAKE) --no-print-directory _open-report || true
53
+
54
+ # โ”€โ”€ Integration tests (API, Playwright) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
55
+
56
+ test-int-all: .check-auth
57
+ @echo "๐Ÿงช Running ALL integration tests (headless)..."
58
+ @echo "๐ŸŒ Environment: $(env)"
59
+ @echo ""
60
+ @$(DEN_PLAYWRIGHT) test --config=$(DEN_ENGINE)/src/pillars/api/playwright.config.ts
61
+ @[ ! "$$CI" = "true" ] && [ -d "playwright-report" ] && $(MAKE) --no-print-directory _open-report || true
62
+
63
+ # make test-int-<module>
64
+ test-int-%: .check-auth
65
+ @MODULE_NAME=$(subst test-int-,,$@); \
66
+ if [ -d "$(DEN_ENGINE)/src/pillars/api/tests/$$MODULE_NAME" ]; then \
67
+ echo "๐Ÿงช Running integration/$$MODULE_NAME API tests..."; \
68
+ echo "๐ŸŒ Environment: $(env)"; \
69
+ echo ""; \
70
+ $(DEN_PLAYWRIGHT) test --config=$(DEN_ENGINE)/src/pillars/api/playwright.config.ts $(DEN_ENGINE)/src/pillars/api/tests/$$MODULE_NAME/; \
71
+ else \
72
+ echo "โŒ Module 'src/pillars/api/tests/$$MODULE_NAME' not found"; \
73
+ echo ""; \
74
+ echo "Available modules:"; \
75
+ find $(DEN_ENGINE)/src/pillars/api/tests/ -maxdepth 1 -type d ! -name "tests" ! -name "_*" -exec basename {} \; | sort | sed 's/^/ - test-int-/'; \
76
+ exit 1; \
77
+ fi
78
+ @[ ! "$$CI" = "true" ] && [ -d "playwright-report" ] && $(MAKE) --no-print-directory _open-report || true
79
+
80
+ # โ”€โ”€ Performance tests (k6) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
81
+
82
+ test-perf-all: .check-auth
83
+ @echo "๐Ÿงช Running ALL performance tests..."
84
+ @echo "๐ŸŒ Environment: $(env)"
85
+ @echo ""
86
+ @if ! which k6 > /dev/null 2>&1; then echo "โŒ k6 not installed. Run: brew install k6"; exit 1; fi
87
+ @$(DEN_TSX) $(DEN_ENGINE)/src/ui/cli/index.ts run --pillar=performance --environment=$(env) $(if $(repo),--repo=$(repo),)
88
+
89
+ # make test-perf module=<name> env=<env>
90
+ test-perf: .check-auth
91
+ @if [ -z "$(module)" ]; then echo "โŒ Usage: make test-perf module=<name|repo/name> env=<env>"; exit 1; fi
92
+ @echo "๐Ÿงช Running performance module $(module)..."
93
+ @echo "๐ŸŒ Environment: $(env)"
94
+ @echo ""
95
+ @if ! which k6 > /dev/null 2>&1; then echo "โŒ k6 not installed. Run: brew install k6"; exit 1; fi
96
+ @$(DEN_TSX) $(DEN_ENGINE)/src/ui/cli/index.ts run --pillar=performance --environment=$(env) --module=$(module)
97
+
98
+ # make test-perf-<module> โ€” shorthand for `make test-perf module=<module>`.
99
+ # Suites come from the distribution (<dist root>/tests/pillars/perf/<module>/
100
+ # test.js) or a registered repo's manifest; the engine ships none, so the CLI
101
+ # resolves the module rather than a path under this checkout.
102
+ test-perf-%: .check-auth
103
+ @MODULE_NAME=$(subst test-perf-,,$@); \
104
+ echo "๐Ÿงช Running performance module $$MODULE_NAME..."; \
105
+ echo "๐ŸŒ Environment: $(env)"; \
106
+ echo ""; \
107
+ if ! which k6 > /dev/null 2>&1; then echo "โŒ k6 not installed. Run: brew install k6"; exit 1; fi; \
108
+ $(DEN_TSX) $(DEN_ENGINE)/src/ui/cli/index.ts run --pillar=performance --environment=$(env) --module=$$MODULE_NAME
109
+
110
+ # โ”€โ”€ Smoke tests โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
111
+ # Test files live in service repos (e.g. ../<repo>/). den provides the harness.
112
+ #
113
+ # Usage:
114
+ # make smoke-link repo=shop Link sibling repo into .den/
115
+ # make test-smk-all repo=<repo> All smoke tests for one repo
116
+ # make test-smk-api-all env=sandbox All api suites against sandbox
117
+ # make test-smk-api-items Dev iteration: just the items suite
118
+ # make test-smk-global All repos, one combined report (CI)
119
+
120
+ # synth-link is an alias for smoke-link โ€” both share the .den/<repo>/ directory.
121
+ synth-link: smoke-link
122
+
123
+ synth-status:
124
+ @echo "๐Ÿ” Linked Repo Synthetics Config"
125
+ @echo "โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”"
126
+ @if [ ! -d ".den" ] || [ -z "$$(ls -A .den 2>/dev/null)" ]; then \
127
+ echo " (none โ€” run: make synth-link repo=<repo>)"; \
128
+ else \
129
+ for entry in .den/*/; do \
130
+ name=$$(basename "$$entry"); \
131
+ if [ -f "$$entry/.den.yml" ] || [ -f "$$entry/.den.json" ]; then \
132
+ synth=$$(node $(DEN_ENGINE)/scripts/manifest-read.cjs "$$entry" synth-testdir 2>/dev/null || echo "?"); \
133
+ echo " โœ… $$name (synthetics.testDir: $$synth)"; \
134
+ else \
135
+ echo " โš  $$name (no .den.yml)"; \
136
+ fi; \
137
+ done; \
138
+ fi
139
+ @echo ""
140
+
141
+ smoke-link:
142
+ @mkdir -p .den
143
+ @if [ -d ".den/$(repo)" ]; then \
144
+ echo "โ„น๏ธ .den/$(repo) already exists (remove it first to re-link)"; \
145
+ elif [ -d "../$(repo)" ]; then \
146
+ ln -sf "../../$(repo)" ".den/$(repo)"; \
147
+ echo "โœ… Linked .den/$(repo) โ†’ ../$(repo)"; \
148
+ if [ -f ".den/$(repo)/.den.yml" ] || [ -f ".den/$(repo)/.den.json" ]; then \
149
+ echo " Manifest found โ€” services available:"; \
150
+ node $(DEN_ENGINE)/scripts/manifest-read.cjs ".den/$(repo)" smoke-keys 2>/dev/null | tr ' ' '\n' | sed "s/^/ โ€ข /" || true; \
151
+ else \
152
+ echo " โš  No .den.yml found in $(repo) root"; \
153
+ fi; \
154
+ else \
155
+ echo "โŒ Repo '../$(repo)' not found as a sibling directory."; \
156
+ exit 1; \
157
+ fi
158
+
159
+ # Clone repos at their deployed SHA for non-local smoke tests.
160
+ # Usage: make smoke-clone env=staging [repo=shop]
161
+ smoke-clone:
162
+ @if [ "$(env)" = "local" ]; then \
163
+ echo "โ„น smoke-clone is not needed for env=local (uses sibling symlink)"; \
164
+ else \
165
+ echo "๐Ÿ“ฆ Cloning repos at deployed SHA for env=$(env)..."; \
166
+ if [ -n "$(repo)" ]; then \
167
+ $(DEN_TSX) $(DEN_ENGINE)/src/pillars/smoke/setup-env.ts --env $(env) --repo $(repo); \
168
+ else \
169
+ $(DEN_TSX) $(DEN_ENGINE)/src/pillars/smoke/setup-env.ts --env $(env); \
170
+ fi; \
171
+ fi
172
+
173
+ # Show what's currently cloned in .smoke-clones/ and at which SHA.
174
+ smoke-clone-status:
175
+ @echo "๐Ÿ” Smoke Clones (.smoke-clones/)"
176
+ @echo "โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”"
177
+ @if [ ! -d ".smoke-clones" ] || [ -z "$$(ls -A .smoke-clones 2>/dev/null)" ]; then \
178
+ echo " (none โ€” run: make smoke-clone env=<env>)"; \
179
+ else \
180
+ for repo_dir in .smoke-clones/*/; do \
181
+ repo_name=$$(basename "$$repo_dir"); \
182
+ for env_dir in "$$repo_dir"*/; do \
183
+ [ -d "$$env_dir" ] || continue; \
184
+ env_name=$$(basename "$$env_dir"); \
185
+ sha_file="$$env_dir.deployed-sha"; \
186
+ if [ -f "$$sha_file" ]; then \
187
+ sha=$$(cat "$$sha_file"); \
188
+ echo " โœ… $$repo_name @ $$env_name โ†’ $${sha:0:8}"; \
189
+ else \
190
+ echo " โš  $$repo_name @ $$env_name (no .deployed-sha โ€” incomplete clone?)"; \
191
+ fi; \
192
+ done; \
193
+ done; \
194
+ fi
195
+ @echo ""
196
+
197
+ smoke-status:
198
+ @echo "๐Ÿ” Linked Smoke Test Repos"
199
+ @echo "โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”"
200
+ @if [ ! -d ".den" ] || [ -z "$$(ls -A .den 2>/dev/null)" ]; then \
201
+ echo " (none โ€” run: make smoke-link repo=<repo>)"; \
202
+ else \
203
+ for entry in .den/*/; do \
204
+ name=$$(basename "$$entry"); \
205
+ if [ -f "$$entry/.den.yml" ] || [ -f "$$entry/.den.json" ]; then \
206
+ services=$$(node $(DEN_ENGINE)/scripts/manifest-read.cjs "$$entry" smoke-keys 2>/dev/null | tr ' ' ', ' || echo "?"); \
207
+ echo " โœ… $$name (services: $$services)"; \
208
+ else \
209
+ echo " โš  $$name (no .den.yml)"; \
210
+ fi; \
211
+ done; \
212
+ fi
213
+ @echo ""
214
+
215
+ # List available services โ€” make test-smk or make test-smk-
216
+ test-smk test-smk-:
217
+ @echo "๐Ÿ’จ Smoke Tests (repo=$(repo))"
218
+ @echo ""
219
+ @echo "Available services:"
220
+ @node $(DEN_ENGINE)/scripts/manifest-read.cjs ".den/$(repo)" smoke-keys 2>/dev/null \
221
+ | tr ' ' '\n' | grep . | sed "s/.*/ make test-smk-&-<suite> (dev iteration โ€” partial)/" \
222
+ || echo " (none โ€” run: make smoke-link repo=$(repo))"
223
+ @echo ""
224
+ @echo " make test-smk-all (all services, one combined report) โ† use this"
225
+ @echo " make test-smk-global (all repos, one combined report) โ† use this in CI"
226
+ @echo ""
227
+ @echo "To list suites within a service:"
228
+ @echo " make test-smk-<service>- (e.g. make test-smk-api-)"
229
+
230
+ # All smoke tests for all services in the linked repo โ€” one combined report
231
+ test-smk-all:
232
+ @echo "๐Ÿ’จ Running ALL smoke tests (repo=$(repo), env=$(env))..."
233
+ @echo ""
234
+ @if [ "$(env)" != "local" ] && [ "$${USE_LOCAL_CHECKOUT:-0}" != "1" ]; then \
235
+ $(DEN_TSX) $(DEN_ENGINE)/src/pillars/smoke/setup-env.ts --env $(env) --repo $(repo) || exit 1; \
236
+ fi
237
+ @SERVICES=$$(node $(DEN_ENGINE)/scripts/manifest-read.cjs ".den/$(repo)" smoke-keys 2>/dev/null) \
238
+ || (echo "โŒ Cannot read manifest for repo=$(repo). Run: make smoke-link repo=$(repo)"; exit 1); \
239
+ for svc in $$SERVICES; do \
240
+ SMOKE_SERVICE=$$svc SMOKE_REPO=$(repo) $(DEN_TSX) $(DEN_ENGINE)/src/pillars/smoke/setup.ts || exit 1; \
241
+ done && \
242
+ SMOKE_REPO=$(repo) \
243
+ $(DEN_PLAYWRIGHT) test --config=$(DEN_ENGINE)/src/pillars/smoke/playwright-all.config.ts && \
244
+ $(DEN_TSX) $(DEN_ENGINE)/src/pillars/smoke/ensure-smoke-teardown.ts
245
+ @[ ! "$$CI" = "true" ] && [ "$$OPEN_REPORT" = "1" ] && [ -d "playwright-report" ] && $(MAKE) --no-print-directory _open-report || true
246
+
247
+ # All smoke tests across ALL registered repos โ€” one combined report (use in CI)
248
+ test-smk-global:
249
+ @echo "๐Ÿ’จ Running ALL smoke tests across ALL registered repos (env=$(env))..."
250
+ @echo ""
251
+ @if [ "$(env)" != "local" ] && [ "$${USE_LOCAL_CHECKOUT:-0}" != "1" ]; then \
252
+ $(DEN_TSX) $(DEN_ENGINE)/src/pillars/smoke/setup-env.ts --env $(env) || exit 1; \
253
+ fi
254
+ @$(DEN_TSX) $(DEN_ENGINE)/src/pillars/smoke/setup-global.ts && \
255
+ $(DEN_PLAYWRIGHT) test --config=$(DEN_ENGINE)/src/pillars/smoke/playwright-global.config.ts && \
256
+ $(DEN_TSX) $(DEN_ENGINE)/src/pillars/smoke/ensure-smoke-teardown.ts
257
+ @[ ! "$$CI" = "true" ] && [ "$$OPEN_REPORT" = "1" ] && [ -d "playwright-report" ] && $(MAKE) --no-print-directory _open-report || true
258
+
259
+ # All suites for a specific service โ€” make test-smk-api-all
260
+ test-smk-%-all:
261
+ @SERVICE=$(subst test-smk-,,$(subst -all,,$@)); \
262
+ echo "๐Ÿ’จ Running ALL $$SERVICE smoke tests (repo=$(repo), env=$(env))..."; \
263
+ echo ""; \
264
+ if [ "$(env)" != "local" ] && [ "$${USE_LOCAL_CHECKOUT:-0}" != "1" ]; then \
265
+ $(DEN_TSX) $(DEN_ENGINE)/src/pillars/smoke/setup-env.ts --env $(env) --repo $(repo) || exit 1; \
266
+ fi; \
267
+ SMOKE_SERVICE=$$SERVICE SMOKE_REPO=$(repo) $(DEN_TSX) $(DEN_ENGINE)/src/pillars/smoke/setup.ts && \
268
+ SMOKE_SERVICE=$$SERVICE SMOKE_REPO=$(repo) \
269
+ $(DEN_PLAYWRIGHT) test --config=$(DEN_ENGINE)/src/pillars/smoke/playwright.config.ts && \
270
+ $(DEN_TSX) $(DEN_ENGINE)/src/pillars/smoke/ensure-smoke-teardown.ts
271
+ @[ ! "$$CI" = "true" ] && [ "$$OPEN_REPORT" = "1" ] && [ -d "playwright-report" ] && $(MAKE) --no-print-directory _open-report || true
272
+
273
+ # Specific suite โ€” make test-smk-api-items
274
+ test-smk-%:
275
+ @FULL="$(subst test-smk-,,$@)"; \
276
+ SERVICE="$${FULL%%-*}"; \
277
+ SUITE="$${FULL#*-}"; \
278
+ if [ -z "$$SUITE" ] || [ "$$SUITE" = "$$SERVICE" ]; then \
279
+ echo "โŒ No suite specified for service '$$SERVICE'"; \
280
+ echo ""; \
281
+ echo "Available suites:"; \
282
+ TEST_DIR=$$(node $(DEN_ENGINE)/scripts/manifest-read.cjs ".den/$(repo)" smoke-testdir "$$SERVICE" 2>/dev/null); \
283
+ if [ -n "$$TEST_DIR" ]; then \
284
+ find ".den/$(repo)/$$TEST_DIR" -maxdepth 1 -type d \
285
+ ! -path ".den/$(repo)/$$TEST_DIR" \
286
+ ! -name "__*" ! -name "_*" \
287
+ -exec basename {} \; 2>/dev/null | sort | sed "s/^/ make test-smk-$$SERVICE-/"; \
288
+ fi; \
289
+ echo ""; \
290
+ echo " make test-smk-$$SERVICE-all (run all suites)"; \
291
+ exit 1; \
292
+ fi; \
293
+ SUITE_DIR=".smoke-run/$(repo)-$$SERVICE/$$SUITE"; \
294
+ echo "๐Ÿ’จ Running $$SERVICE/$$SUITE smoke tests (repo=$(repo), env=$(env))..."; \
295
+ echo ""; \
296
+ if [ "$(env)" != "local" ] && [ "$${USE_LOCAL_CHECKOUT:-0}" != "1" ]; then \
297
+ $(DEN_TSX) $(DEN_ENGINE)/src/pillars/smoke/setup-env.ts --env $(env) --repo $(repo) || exit 1; \
298
+ fi; \
299
+ SMOKE_SERVICE=$$SERVICE SMOKE_REPO=$(repo) $(DEN_TSX) $(DEN_ENGINE)/src/pillars/smoke/setup.ts && \
300
+ if [ ! -d "$$SUITE_DIR" ]; then \
301
+ echo "โŒ Suite '$$SUITE' not found: $$SUITE_DIR"; \
302
+ echo ""; \
303
+ echo "Available suites:"; \
304
+ find ".smoke-run/$(repo)-$$SERVICE" -maxdepth 1 -type d \
305
+ ! -path ".smoke-run/$(repo)-$$SERVICE" ! -name "node_modules" \
306
+ -exec basename {} \; 2>/dev/null | sort | sed "s/^/ make test-smk-$$SERVICE-/"; \
307
+ exit 1; \
308
+ fi; \
309
+ SMOKE_SERVICE=$$SERVICE SMOKE_REPO=$(repo) \
310
+ $(DEN_PLAYWRIGHT) test --config=$(DEN_ENGINE)/src/pillars/smoke/playwright.config.ts "$$SUITE_DIR" && \
311
+ $(DEN_TSX) $(DEN_ENGINE)/src/pillars/smoke/ensure-smoke-teardown.ts
312
+ @[ ! "$$CI" = "true" ] && [ "$$OPEN_REPORT" = "1" ] && [ -d "playwright-report" ] && $(MAKE) --no-print-directory _open-report || true
313
+
314
+ # โ”€โ”€ JWT token cache โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
315
+
316
+ int-jwt-clear:
317
+ @echo "๐Ÿ—‘๏ธ Clearing integration JWT token cache for env=$(env)..."
318
+ @rm -f "playwright/.auth/api-token-admin-$(env).json"
319
+ @rm -f "playwright/.auth/api-token-user-$(env).json"
320
+ @rm -f "playwright/.auth/api-token-beta-$(env).json"
321
+ @echo "โœ… Token cache cleared for $(env). Tokens will be re-fetched on next test run."
322
+
323
+ int-jwt-status:
324
+ @echo "๐Ÿ” Integration JWT Token Cache Status"
325
+ @echo "โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”"
326
+ @for e in local dev sandbox staging production; do \
327
+ echo ""; \
328
+ echo " $$e:"; \
329
+ for role in admin user beta; do \
330
+ f="playwright/.auth/api-token-$$role-$$e.json"; \
331
+ if [ -f "$$f" ]; then \
332
+ expires=$$(node -e "try{var d=JSON.parse(require('fs').readFileSync('$$f','utf8'));var m=Math.round((d.expiresAt-Date.now())/60000);console.log(m>0?'\u2705 '+d.email+' ('+m+'m remaining)':'\u26a0\ufe0f '+d.email+' (EXPIRED)')}catch(e){console.log('\u274c (unreadable)')}" 2>/dev/null || echo "โŒ (error)"); \
333
+ echo " $$role: $$expires"; \
334
+ else \
335
+ echo " $$role: โŒ NOT CACHED"; \
336
+ fi; \
337
+ done; \
338
+ done
339
+ @echo ""
340
+ @echo " Run: make int-jwt-clear [env=<env>] to force re-fetch"
341
+ @echo " Credentials: 1Password (eval \$$(op signin)) or CI ENV vars"
342
+
343
+ # โ”€โ”€ Results & reports โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
344
+
345
+ results:
346
+ @node $(DEN_ENGINE)/scripts/view-results.js summary synthetic local
347
+
348
+ results-flaky:
349
+ @node $(DEN_ENGINE)/scripts/view-results.js flaky synthetic local
350
+
351
+ results-api:
352
+ @node $(DEN_ENGINE)/scripts/view-results.js summary integration local
353
+
354
+ results-perf:
355
+ @node $(DEN_ENGINE)/scripts/view-results.js summary performance local
356
+
357
+ # Internal: open playwright-report, handling port conflicts gracefully.
358
+ # Skipped when PLAYWRIGHT_HTML_OPEN=never (set by the web UI server).
359
+ _open-report:
360
+ @[ "$$PLAYWRIGHT_HTML_OPEN" = "never" ] && exit 0 || true; \
361
+ REPORT_PORT=9323; \
362
+ EXISTING_PID=$$(lsof -ti:$$REPORT_PORT 2>/dev/null); \
363
+ if [ -n "$$EXISTING_PID" ]; then \
364
+ echo "โš ๏ธ Port $$REPORT_PORT is already in use (PID $$EXISTING_PID)."; \
365
+ printf " Kill it and open the report? [y/N] "; \
366
+ read ANSWER; \
367
+ if [ "$$ANSWER" = "y" ] || [ "$$ANSWER" = "Y" ]; then \
368
+ kill $$EXISTING_PID 2>/dev/null && sleep 0.5; \
369
+ echo "โœ… Process killed."; \
370
+ else \
371
+ echo "Aborted."; \
372
+ exit 0; \
373
+ fi; \
374
+ fi; \
375
+ echo "๐Ÿ“Š Opening test report..."; \
376
+ $(DEN_PLAYWRIGHT) show-report playwright-report
377
+
378
+ report:
379
+ @if [ ! -d "playwright-report" ]; then \
380
+ echo "โŒ No report found. Run tests first:"; \
381
+ echo " โ€ข make test-syn-all (browser tests)"; \
382
+ echo " โ€ข make test-int-all (API tests)"; \
383
+ exit 1; \
384
+ fi
385
+ @$(MAKE) --no-print-directory _open-report
386
+
387
+ clean-reports:
388
+ @echo "๐Ÿงน Cleaning HTML reports..."
389
+ @rm -rf playwright-report
390
+ @echo "โœ… HTML reports cleaned (JSONL results preserved)"
391
+
392
+ # Stop running test processes. Named `test-down` because `make down` stops
393
+ # SERVICES (make/local_dev.mk) โ€” the old `make down` silently killed test
394
+ # processes while every service container kept running.
395
+ test-down:
396
+ @echo "๐Ÿ›‘ Stopping any running tests..."
397
+ @pkill -f "playwright" 2>/dev/null || true
398
+ @pkill -f "k6" 2>/dev/null || true
399
+ @pkill -f "node.*cli" 2>/dev/null || true
400
+ @echo "โœ… All tests stopped"
401
+
402
+ # Deprecated: use make preflight
403
+ test-framework:
404
+ @echo "โš ๏ธ 'make test-framework' is deprecated โ€” use 'make preflight' instead"
405
+ @$(MAKE) preflight
package/package.json CHANGED
@@ -1,11 +1,108 @@
1
1
  {
2
2
  "name": "@monster-orange/den",
3
- "version": "0.0.0",
4
- "description": "Den: a config-driven local development appliance. Placeholder; the first release is 0.1.0.",
3
+ "version": "0.2.0",
4
+ "description": "Den: a local multi-repo dev orchestrator, HTTPS edge and E2E harness",
5
+ "type": "module",
6
+ "bin": {
7
+ "den": "./bin/den"
8
+ },
9
+ "files": [
10
+ "bin/",
11
+ "src/",
12
+ "!src/**/*.test.ts",
13
+ "make/",
14
+ "service/",
15
+ "scripts/auth-configure.ts",
16
+ "scripts/heal-config.ts",
17
+ "scripts/jsonl-playwright-reporter.js",
18
+ "scripts/manifest-read.cjs",
19
+ "scripts/setup-1password.ts",
20
+ "scripts/setup-secrets.ts",
21
+ "scripts/view-results.js",
22
+ "LICENSE",
23
+ "README.md",
24
+ "CHANGELOG.md",
25
+ "docs/"
26
+ ],
27
+ "scripts": {
28
+ "cli": "tsx src/ui/cli/index.ts menu",
29
+ "build": "tsc -p tsconfig.build.json && node scripts/copy-web-assets.mjs",
30
+ "test:unit": "jest --coverage --forceExit",
31
+ "test:unit:watch": "jest --watch",
32
+ "test:framework": "npm run test:unit",
33
+ "lint": "eslint . --ext .ts",
34
+ "lint:fix": "eslint . --ext .ts --fix",
35
+ "format": "prettier --write \"**/*.{ts,js,json,md}\"",
36
+ "format:check": "prettier --check \"**/*.{ts,js,json,md}\"",
37
+ "preflight": "npm run format && npm run lint:fix && npm run test:unit",
38
+ "prepare": "husky install",
39
+ "typecheck": "tsc --noEmit -p tsconfig.typecheck.json && tsc --noEmit -p tsconfig.build.json",
40
+ "test": "jest --forceExit",
41
+ "gate:org-names": "node scripts/org-name-gate.mjs",
42
+ "example:regen": "rm -rf examples/distribution && ./bin/den create acme examples/distribution",
43
+ "dist-smoke": "bash scripts/dist-smoke.sh"
44
+ },
45
+ "keywords": [
46
+ "e2e",
47
+ "testing",
48
+ "playwright",
49
+ "k6",
50
+ "local-dev",
51
+ "localstack"
52
+ ],
53
+ "author": "Monster Orange",
54
+ "license": "MIT",
55
+ "dependencies": {
56
+ "@cursor/sdk": "1.0.40",
57
+ "@modelcontextprotocol/sdk": "1.32.1",
58
+ "@playwright/test": "^1.61.1",
59
+ "@slack/webhook": "^7.0.2",
60
+ "ajv": "^8.12.0",
61
+ "ajv-formats": "^2.1.1",
62
+ "auth0": "^4.3.1",
63
+ "chalk": "^5.3.0",
64
+ "cli-table3": "^0.6.3",
65
+ "dotenv": "^16.4.1",
66
+ "elkjs": "0.12.0",
67
+ "inquirer": "^9.2.14",
68
+ "jsonwebtoken": "^9.0.2",
69
+ "openapi-typescript": "^7.13.0",
70
+ "ora": "^8.0.1",
71
+ "tsx": "^4.23.1",
72
+ "yaml": "^2.8.2",
73
+ "zod": "^4.3.6"
74
+ },
75
+ "devDependencies": {
76
+ "@types/inquirer": "^9.0.7",
77
+ "@types/jest": "^29.5.11",
78
+ "@types/jsonwebtoken": "^9.0.5",
79
+ "@types/node": "^22.20.1",
80
+ "@typescript-eslint/eslint-plugin": "^7.18.0",
81
+ "@typescript-eslint/parser": "^7.18.0",
82
+ "eslint": "^8.56.0",
83
+ "husky": "^8.0.3",
84
+ "jest": "^29.7.0",
85
+ "lint-staged": "^15.2.0",
86
+ "prettier": "^3.2.4",
87
+ "ts-jest": "^29.4.9",
88
+ "ts-node": "^10.9.2",
89
+ "typescript": "^5.3.3"
90
+ },
91
+ "overrides": {
92
+ "flatted": "^3.4.2",
93
+ "picomatch": "^2.3.2",
94
+ "brace-expansion": "^2.0.3"
95
+ },
96
+ "engines": {
97
+ "node": ">=22.13",
98
+ "npm": ">=9.0.0"
99
+ },
5
100
  "repository": {
6
101
  "type": "git",
7
102
  "url": "git+https://github.com/Monster-Orange/den.git"
8
103
  },
9
- "publishConfig": { "access": "public" },
10
- "files": ["README.md"]
104
+ "homepage": "https://github.com/Monster-Orange/den",
105
+ "bugs": {
106
+ "url": "https://github.com/Monster-Orange/den/issues"
107
+ }
11
108
  }