@monster-orange/den 0.0.0 → 0.1.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 (231) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/LICENSE +21 -0
  3. package/README.md +165 -1
  4. package/bin/den +61 -0
  5. package/docs/distributions.md +256 -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 +99 -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 +406 -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 +108 -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 +729 -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/applications.ts +138 -0
  91. package/src/shared/auth/api-token.ts +416 -0
  92. package/src/shared/auth/auth0-helper.ts +284 -0
  93. package/src/shared/auth/headless-login.ts +265 -0
  94. package/src/shared/auth/jwt-helper.ts +186 -0
  95. package/src/shared/auth/sudo-vault.ts +69 -0
  96. package/src/shared/auth/test-accounts.ts +98 -0
  97. package/src/shared/auth/token-injection.ts +184 -0
  98. package/src/shared/auth/token-providers/auth0.ts +80 -0
  99. package/src/shared/auth/token-providers/index.ts +182 -0
  100. package/src/shared/auth/token-refresh.ts +273 -0
  101. package/src/shared/banner.ts +15 -0
  102. package/src/shared/brand.ts +79 -0
  103. package/src/shared/cli-tabs.ts +131 -0
  104. package/src/shared/constants.ts +128 -0
  105. package/src/shared/den-config.ts +566 -0
  106. package/src/shared/dev-metrics/emit.ts +354 -0
  107. package/src/shared/edge/config.ts +229 -0
  108. package/src/shared/edge/render.ts +221 -0
  109. package/src/shared/edge/runtime.ts +268 -0
  110. package/src/shared/edge/types.ts +62 -0
  111. package/src/shared/engine.ts +67 -0
  112. package/src/shared/environment/aws-profiles.ts +49 -0
  113. package/src/shared/environment/env-selector.ts +161 -0
  114. package/src/shared/environment/playwright-env.ts +82 -0
  115. package/src/shared/environment-manager/catalog.ts +77 -0
  116. package/src/shared/environment-manager/clone-guard.ts +163 -0
  117. package/src/shared/environment-manager/dag.ts +286 -0
  118. package/src/shared/environment-manager/default-workspace.ts +182 -0
  119. package/src/shared/environment-manager/derivation/alias.ts +90 -0
  120. package/src/shared/environment-manager/derivation/cache.ts +97 -0
  121. package/src/shared/environment-manager/derivation/derive-graph.ts +421 -0
  122. package/src/shared/environment-manager/derivation/derived-up.ts +354 -0
  123. package/src/shared/environment-manager/derivation/load-alias.ts +11 -0
  124. package/src/shared/environment-manager/derivation/rules-compose.ts +42 -0
  125. package/src/shared/environment-manager/derivation/rules-events.ts +50 -0
  126. package/src/shared/environment-manager/derivation/rules-http.ts +247 -0
  127. package/src/shared/environment-manager/derivation/rules-infra.ts +64 -0
  128. package/src/shared/environment-manager/derivation/rules-readiness.ts +96 -0
  129. package/src/shared/environment-manager/derivation/scan.ts +160 -0
  130. package/src/shared/environment-manager/derivation/text.ts +40 -0
  131. package/src/shared/environment-manager/derivation/types.ts +69 -0
  132. package/src/shared/environment-manager/health.ts +589 -0
  133. package/src/shared/environment-manager/index.ts +6 -0
  134. package/src/shared/environment-manager/load-applications.ts +78 -0
  135. package/src/shared/environment-manager/log-tail.ts +212 -0
  136. package/src/shared/environment-manager/make-targets.ts +78 -0
  137. package/src/shared/environment-manager/opctl.ts +334 -0
  138. package/src/shared/environment-manager/readiness.ts +93 -0
  139. package/src/shared/environment-manager/register-local.ts +72 -0
  140. package/src/shared/environment-manager/secrets-check.ts +260 -0
  141. package/src/shared/environment-manager/service-env.ts +110 -0
  142. package/src/shared/environment-manager/service-runner.ts +1588 -0
  143. package/src/shared/environment-manager/up-plan.ts +302 -0
  144. package/src/shared/environment-manager/workspace-manager.ts +905 -0
  145. package/src/shared/environment-manager/workspaces.ts +860 -0
  146. package/src/shared/manifest/deps.ts +27 -0
  147. package/src/shared/manifest/migrate-manifest.ts +101 -0
  148. package/src/shared/manifest/read-manifest.ts +160 -0
  149. package/src/shared/manifest/schema.ts +299 -0
  150. package/src/shared/manifest/service-links.ts +93 -0
  151. package/src/shared/manifest/validate-manifest.ts +140 -0
  152. package/src/shared/manifest/workspace-manifests.ts +92 -0
  153. package/src/shared/open-url.ts +122 -0
  154. package/src/shared/org.ts +44 -0
  155. package/src/shared/paths.ts +178 -0
  156. package/src/shared/perf/optional-fields.ts +105 -0
  157. package/src/shared/perf/report-normalizer.ts +404 -0
  158. package/src/shared/perf/report-paths.ts +19 -0
  159. package/src/shared/perf/report-store.ts +110 -0
  160. package/src/shared/perf/report-types.ts +70 -0
  161. package/src/shared/perf/test-paths.ts +25 -0
  162. package/src/shared/process/log-rotation.ts +147 -0
  163. package/src/shared/process/spawn-streaming.ts +229 -0
  164. package/src/shared/product.ts +92 -0
  165. package/src/shared/profile.ts +141 -0
  166. package/src/shared/repo-kind.ts +32 -0
  167. package/src/shared/reporting/jsonl-reporter.ts +131 -0
  168. package/src/shared/reporting/slack-reporter.ts +340 -0
  169. package/src/shared/results/result-reader.ts +266 -0
  170. package/src/shared/results/result-writer.ts +168 -0
  171. package/src/shared/secrets/doppler.ts +126 -0
  172. package/src/shared/secrets/env.ts +48 -0
  173. package/src/shared/secrets/index.ts +197 -0
  174. package/src/shared/secrets/keys.ts +33 -0
  175. package/src/shared/secrets/onepassword.ts +75 -0
  176. package/src/shared/secrets/types.ts +52 -0
  177. package/src/shared/service-url.ts +119 -0
  178. package/src/shared/smoke/branch-resolver.ts +141 -0
  179. package/src/shared/smoke/git-remote.ts +70 -0
  180. package/src/shared/smoke/repo-cloner.ts +151 -0
  181. package/src/shared/stacks/config.ts +137 -0
  182. package/src/shared/stacks/manifest-commands.ts +88 -0
  183. package/src/shared/stacks/render.ts +253 -0
  184. package/src/shared/stacks/runtime.ts +334 -0
  185. package/src/shared/stacks/types.ts +53 -0
  186. package/src/shared/terminal/tabs.ts +212 -0
  187. package/src/shared/test-discovery/module-scanner.ts +569 -0
  188. package/src/shared/types/index.ts +678 -0
  189. package/src/shared/ui-marker.ts +19 -0
  190. package/src/ui/cli/applications-command.ts +116 -0
  191. package/src/ui/cli/config-command.ts +68 -0
  192. package/src/ui/cli/create-main.ts +9 -0
  193. package/src/ui/cli/create.ts +360 -0
  194. package/src/ui/cli/edge-command.ts +91 -0
  195. package/src/ui/cli/flag-parser.ts +246 -0
  196. package/src/ui/cli/graph-command.ts +524 -0
  197. package/src/ui/cli/health-display.ts +63 -0
  198. package/src/ui/cli/index.ts +3656 -0
  199. package/src/ui/cli/init.ts +855 -0
  200. package/src/ui/cli/invocation-target.ts +175 -0
  201. package/src/ui/cli/logs-command.ts +104 -0
  202. package/src/ui/cli/module-selection.ts +31 -0
  203. package/src/ui/cli/prompts.ts +767 -0
  204. package/src/ui/cli/results-viewer.ts +436 -0
  205. package/src/ui/cli/secrets-preflight.ts +91 -0
  206. package/src/ui/cli/stack-command.ts +144 -0
  207. package/src/ui/cli/stalled-setup-recovery.ts +129 -0
  208. package/src/ui/cli/test-runner.ts +1312 -0
  209. package/src/ui/cli/web-command.ts +1073 -0
  210. package/src/ui/server/changelog-parser.ts +94 -0
  211. package/src/ui/server/daemon-reaper.ts +129 -0
  212. package/src/ui/server/editor-manager.ts +301 -0
  213. package/src/ui/server/github-service.ts +223 -0
  214. package/src/ui/server/http-helpers.ts +98 -0
  215. package/src/ui/server/index.ts +3236 -0
  216. package/src/ui/server/log-history.ts +452 -0
  217. package/src/ui/server/perf-report.ts +42 -0
  218. package/src/ui/server/public/environments.html +494 -0
  219. package/src/ui/server/public/favicon.ico +0 -0
  220. package/src/ui/server/public/header.js +1371 -0
  221. package/src/ui/server/public/index.html +2595 -0
  222. package/src/ui/server/public/local-dev.html +7405 -0
  223. package/src/ui/server/public/logs.html +1489 -0
  224. package/src/ui/server/public/perf-report.js +359 -0
  225. package/src/ui/server/public/release.html +2111 -0
  226. package/src/ui/server/public/services.html +1098 -0
  227. package/src/ui/server/public/workspace-picker.js +69 -0
  228. package/src/ui/server/release-deploy-session.ts +246 -0
  229. package/src/ui/server/release-service.ts +1125 -0
  230. package/src/ui/server/sudo-store.ts +111 -0
  231. package/src/ui/server/workspace-routes.ts +2154 -0
@@ -0,0 +1,246 @@
1
+ import { product } from "../../shared/product.js";
2
+ export type CommandName =
3
+ | "run"
4
+ | "menu"
5
+ | "view-results"
6
+ | "web"
7
+ | "up"
8
+ | "down"
9
+ | "restart"
10
+ | "status"
11
+ | "logs"
12
+ | "services"
13
+ | "graph"
14
+ | "register"
15
+ | "use-local"
16
+ | "use-managed"
17
+ | "setup"
18
+ | "workspace"
19
+ | "sync"
20
+ | "init"
21
+ | "validate"
22
+ | "create"
23
+ | "local-dev"
24
+ | "config"
25
+ | "--help"
26
+ | "-h"
27
+ | "--version"
28
+ | "-v";
29
+
30
+ export interface ParsedCliArgs {
31
+ command?: string;
32
+ args: string[];
33
+ flags: {
34
+ workspace?: string;
35
+ forceTabs?: boolean;
36
+ skipSecrets?: boolean;
37
+ };
38
+ }
39
+
40
+ /**
41
+ * Commands that CHANGE what is running, so `-w` must name an active workspace:
42
+ * ownership refcounts, conflict blocks and shared-instance decisions are all
43
+ * defined over the active set (design decision 6).
44
+ */
45
+ const WORKSPACE_MUTATION_COMMANDS = new Set(["up", "down", "restart"]);
46
+
47
+ /**
48
+ * Read-only commands that are workspace-relative but require no activation —
49
+ * inspecting a workspace is not operating on it. `/api/graph` has always
50
+ * allowed this ("any workspace may be graphed"); requiring activation here
51
+ * would also regress the pre-multi-active `-w` ("use this workspace for this
52
+ * command only").
53
+ */
54
+ const WORKSPACE_READ_COMMANDS = new Set([
55
+ "status",
56
+ "logs",
57
+ "services",
58
+ // A repo name resolves per workspace, so the graph is workspace-relative too.
59
+ "graph",
60
+ // Compose stacks run per workspace (project `<stack>-<workspace>`).
61
+ "stack",
62
+ ]);
63
+
64
+ const WORKSPACE_COMMANDS = new Set([
65
+ ...WORKSPACE_MUTATION_COMMANDS,
66
+ ...WORKSPACE_READ_COMMANDS,
67
+ ]);
68
+
69
+ /** Whether `-w <name>` on this command requires `<name>` to be active. */
70
+ export function workspaceFlagRequiresActive(command: string): boolean {
71
+ return WORKSPACE_MUTATION_COMMANDS.has(command);
72
+ }
73
+ const TAB_COMMANDS = new Set(["up", "restart"]);
74
+ const SKIP_SECRETS_COMMANDS = new Set(["up", "restart", "logs"]);
75
+
76
+ function consumeFlagValue(raw: string[], index: number, flag: string): string {
77
+ const value = raw[index + 1];
78
+ if (!value || value.startsWith("-")) {
79
+ throw new Error(`${flag} requires a value`);
80
+ }
81
+ return value;
82
+ }
83
+
84
+ function applyFlag(
85
+ raw: string[],
86
+ index: number,
87
+ flags: ParsedCliArgs["flags"],
88
+ ): number | null {
89
+ const token = raw[index];
90
+ // `--flag=value` form for value-taking flags (-w/--workspace).
91
+ const eq = token.indexOf("=");
92
+ const name = eq === -1 ? token : token.slice(0, eq);
93
+ if (name === "-w" || name === "--workspace") {
94
+ if (eq !== -1) {
95
+ const value = token.slice(eq + 1);
96
+ if (!value) {
97
+ throw new Error(`${name} requires a value`);
98
+ }
99
+ flags.workspace = value;
100
+ return index + 1;
101
+ }
102
+ flags.workspace = consumeFlagValue(raw, index, token);
103
+ return index + 2;
104
+ }
105
+ if (token === "-t" || token === "--tabs") {
106
+ flags.forceTabs = true;
107
+ return index + 1;
108
+ }
109
+ if (token === "--no-tabs") {
110
+ flags.forceTabs = false;
111
+ return index + 1;
112
+ }
113
+ if (token === "--skip-secrets") {
114
+ flags.skipSecrets = true;
115
+ return index + 1;
116
+ }
117
+ return null;
118
+ }
119
+
120
+ function validateFlagScopes(parsed: ParsedCliArgs): void {
121
+ const command = parsed.command;
122
+ if (!command) {
123
+ if (
124
+ parsed.flags.workspace ||
125
+ parsed.flags.forceTabs !== undefined ||
126
+ parsed.flags.skipSecrets
127
+ ) {
128
+ throw new Error("Global flags require a command");
129
+ }
130
+ return;
131
+ }
132
+
133
+ if (parsed.flags.workspace && !WORKSPACE_COMMANDS.has(command)) {
134
+ if (command === "workspace") {
135
+ throw new Error(
136
+ `-w/--workspace is not valid with workspace mutations; use \`${product().cli} workspace use <name>\` instead`,
137
+ );
138
+ }
139
+ throw new Error(`-w/--workspace is not valid with ${command}`);
140
+ }
141
+ if (parsed.flags.forceTabs !== undefined && !TAB_COMMANDS.has(command)) {
142
+ throw new Error(`--tabs/--no-tabs is not valid with ${command}`);
143
+ }
144
+ if (parsed.flags.skipSecrets && !SKIP_SECRETS_COMMANDS.has(command)) {
145
+ throw new Error(`--skip-secrets is not valid with ${command}`);
146
+ }
147
+ }
148
+
149
+ // Dash-flags each mutation subcommand accepts (global flags — -w/--workspace,
150
+ // -t/--tabs/--no-tabs, --skip-secrets — are consumed by parseCliArgs before
151
+ // dispatch, and -h/--help is handled by the dispatcher). Commands not listed
152
+ // here are not checked.
153
+ const COMMAND_FLAGS: Record<string, readonly string[]> = {
154
+ up: [
155
+ "--manifest",
156
+ "--no-derive",
157
+ "-x",
158
+ "--exclude",
159
+ "-a",
160
+ "--all",
161
+ "-n",
162
+ "--dry-run",
163
+ "--plan",
164
+ "--pull",
165
+ "-A",
166
+ "--app",
167
+ ],
168
+ down: [
169
+ "--manifest",
170
+ "--no-derive",
171
+ "-a",
172
+ "--all",
173
+ "-n",
174
+ "--dry-run",
175
+ "-f",
176
+ "--force",
177
+ "-A",
178
+ "--app",
179
+ ],
180
+ restart: ["-A", "--app"],
181
+ logs: [],
182
+ setup: ["-f", "--force"],
183
+ sync: [],
184
+ };
185
+
186
+ /**
187
+ * Unrecognized dash-args for `command` among `args`, stopping at the first
188
+ * `--` terminator (everything after it belongs to a child command). Returns
189
+ * [] when the command isn't flag-checked or every flag is known — mutation
190
+ * commands must NOT run when this is non-empty (a typo'd --dry-run would
191
+ * otherwise silently perform a real bring-up).
192
+ */
193
+ export function unknownCommandFlags(command: string, args: string[]): string[] {
194
+ const allowed = COMMAND_FLAGS[command];
195
+ if (!allowed) return [];
196
+ const end = args.indexOf("--");
197
+ const own = end === -1 ? args : args.slice(0, end);
198
+ return own.filter(
199
+ (a) =>
200
+ a.startsWith("-") &&
201
+ !allowed.includes(a) &&
202
+ // `--app=<name>` is the one flag that also takes the = form.
203
+ !(allowed.includes("--app") && a.startsWith("--app=")),
204
+ );
205
+ }
206
+
207
+ export function parseCliArgs(raw: string[]): ParsedCliArgs {
208
+ const parsed: ParsedCliArgs = { args: [], flags: {} };
209
+ let i = 0;
210
+ let passthrough = false;
211
+
212
+ while (i < raw.length) {
213
+ const token = raw[i];
214
+
215
+ if (passthrough) {
216
+ parsed.args.push(token);
217
+ i += 1;
218
+ continue;
219
+ }
220
+
221
+ if (token === "--") {
222
+ // Keep the terminator so downstream dispatch can tell den's own
223
+ // args from passthrough args intended for a child command.
224
+ passthrough = true;
225
+ parsed.args.push(token);
226
+ i += 1;
227
+ continue;
228
+ }
229
+
230
+ const nextIndex = applyFlag(raw, i, parsed.flags);
231
+ if (nextIndex !== null) {
232
+ i = nextIndex;
233
+ continue;
234
+ }
235
+
236
+ if (!parsed.command) {
237
+ parsed.command = token;
238
+ } else {
239
+ parsed.args.push(token);
240
+ }
241
+ i += 1;
242
+ }
243
+
244
+ validateFlagScopes(parsed);
245
+ return parsed;
246
+ }