@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.
- package/CHANGELOG.md +67 -0
- package/LICENSE +21 -0
- package/README.md +165 -1
- package/bin/den +61 -0
- package/docs/distributions.md +256 -0
- package/make/demo.mk +82 -0
- package/make/den.mk +80 -0
- package/make/journeys.mk +57 -0
- package/make/local_dev.mk +154 -0
- package/make/security.mk +59 -0
- package/make/test.mk +405 -0
- package/package.json +99 -4
- package/scripts/auth-configure.ts +415 -0
- package/scripts/heal-config.ts +92 -0
- package/scripts/jsonl-playwright-reporter.js +70 -0
- package/scripts/manifest-read.cjs +91 -0
- package/scripts/setup-1password.ts +570 -0
- package/scripts/setup-secrets.ts +149 -0
- package/scripts/view-results.js +156 -0
- package/service/install.sh +112 -0
- package/src/pillars/api/fixtures/index.ts +128 -0
- package/src/pillars/api/fixtures/openapi-validator.ts +111 -0
- package/src/pillars/api/global-setup.ts +103 -0
- package/src/pillars/api/playwright.config.ts +105 -0
- package/src/pillars/api/schemas/example-api.json +110 -0
- package/src/pillars/api/tests/health/health.spec.ts +19 -0
- package/src/pillars/api/tests/health/manifest.yml +6 -0
- package/src/pillars/browser/fixtures/index.ts +232 -0
- package/src/pillars/browser/fixtures/package.json +10 -0
- package/src/pillars/browser/global-setup.ts +140 -0
- package/src/pillars/browser/global-teardown.ts +48 -0
- package/src/pillars/browser/playwright.config.ts +212 -0
- package/src/pillars/browser/setup.ts +219 -0
- package/src/pillars/journeys/app-config.ts +237 -0
- package/src/pillars/journeys/discover.ts +160 -0
- package/src/pillars/journeys/hooks/deny-shell.cjs +44 -0
- package/src/pillars/journeys/observability/events.ts +288 -0
- package/src/pillars/journeys/observability/sdk-mapper.ts +306 -0
- package/src/pillars/journeys/report/friction.ts +304 -0
- package/src/pillars/journeys/report/junit.ts +105 -0
- package/src/pillars/journeys/report/render.ts +273 -0
- package/src/pillars/journeys/report/results.ts +323 -0
- package/src/pillars/journeys/run.ts +673 -0
- package/src/pillars/journeys/runner.ts +1025 -0
- package/src/pillars/journeys/sandbox.ts +406 -0
- package/src/pillars/journeys/spec/loader.ts +152 -0
- package/src/pillars/journeys/spec/schema.ts +208 -0
- package/src/pillars/journeys/teardown.ts +98 -0
- package/src/pillars/journeys/tools/browser-session.ts +219 -0
- package/src/pillars/journeys/tools/browser-tool.ts +914 -0
- package/src/pillars/journeys/tools/http-tool.ts +564 -0
- package/src/pillars/journeys/tools/ledger.ts +278 -0
- package/src/pillars/journeys/tools/snapshot-store.ts +117 -0
- package/src/pillars/journeys/verify/assertions.ts +502 -0
- package/src/pillars/journeys/verify/verdict.ts +71 -0
- package/src/pillars/perf/build-report.ts +36 -0
- package/src/pillars/perf/k6.config.js +112 -0
- package/src/pillars/perf/run.ts +345 -0
- package/src/pillars/perf/scenarios/load-profile.js +97 -0
- package/src/pillars/perf/staging.ts +73 -0
- package/src/pillars/security/discover.ts +108 -0
- package/src/pillars/security/findings.ts +151 -0
- package/src/pillars/security/plan.ts +355 -0
- package/src/pillars/security/run.ts +729 -0
- package/src/pillars/smoke/admin-probe.ts +68 -0
- package/src/pillars/smoke/base-url.ts +56 -0
- package/src/pillars/smoke/cleanup.ts +8 -0
- package/src/pillars/smoke/discover.ts +237 -0
- package/src/pillars/smoke/ensure-smoke-teardown.ts +40 -0
- package/src/pillars/smoke/fixture-manager.ts +217 -0
- package/src/pillars/smoke/fixtures.ts +468 -0
- package/src/pillars/smoke/global-setup-all.ts +262 -0
- package/src/pillars/smoke/global-setup-global.ts +262 -0
- package/src/pillars/smoke/global-setup.ts +273 -0
- package/src/pillars/smoke/global-teardown-all.ts +8 -0
- package/src/pillars/smoke/global-teardown-global.ts +8 -0
- package/src/pillars/smoke/global-teardown.ts +139 -0
- package/src/pillars/smoke/playwright-all.config.ts +147 -0
- package/src/pillars/smoke/playwright-global.config.ts +141 -0
- package/src/pillars/smoke/playwright.config.ts +162 -0
- package/src/pillars/smoke/setup-env.ts +132 -0
- package/src/pillars/smoke/setup-global.ts +126 -0
- package/src/pillars/smoke/setup.ts +115 -0
- package/src/pillars/smoke/smoke-repo.ts +16 -0
- package/src/pillars/smoke/staging.ts +49 -0
- package/src/pillars/suites/run.ts +147 -0
- package/src/scripts/configure-aws-profiles.ts +114 -0
- package/src/scripts/register-repos.ts +307 -0
- package/src/scripts/setup-default-workspace.ts +203 -0
- package/src/shared/applications.ts +138 -0
- package/src/shared/auth/api-token.ts +416 -0
- package/src/shared/auth/auth0-helper.ts +284 -0
- package/src/shared/auth/headless-login.ts +265 -0
- package/src/shared/auth/jwt-helper.ts +186 -0
- package/src/shared/auth/sudo-vault.ts +69 -0
- package/src/shared/auth/test-accounts.ts +98 -0
- package/src/shared/auth/token-injection.ts +184 -0
- package/src/shared/auth/token-providers/auth0.ts +80 -0
- package/src/shared/auth/token-providers/index.ts +182 -0
- package/src/shared/auth/token-refresh.ts +273 -0
- package/src/shared/banner.ts +15 -0
- package/src/shared/brand.ts +79 -0
- package/src/shared/cli-tabs.ts +131 -0
- package/src/shared/constants.ts +128 -0
- package/src/shared/den-config.ts +566 -0
- package/src/shared/dev-metrics/emit.ts +354 -0
- package/src/shared/edge/config.ts +229 -0
- package/src/shared/edge/render.ts +221 -0
- package/src/shared/edge/runtime.ts +268 -0
- package/src/shared/edge/types.ts +62 -0
- package/src/shared/engine.ts +67 -0
- package/src/shared/environment/aws-profiles.ts +49 -0
- package/src/shared/environment/env-selector.ts +161 -0
- package/src/shared/environment/playwright-env.ts +82 -0
- package/src/shared/environment-manager/catalog.ts +77 -0
- package/src/shared/environment-manager/clone-guard.ts +163 -0
- package/src/shared/environment-manager/dag.ts +286 -0
- package/src/shared/environment-manager/default-workspace.ts +182 -0
- package/src/shared/environment-manager/derivation/alias.ts +90 -0
- package/src/shared/environment-manager/derivation/cache.ts +97 -0
- package/src/shared/environment-manager/derivation/derive-graph.ts +421 -0
- package/src/shared/environment-manager/derivation/derived-up.ts +354 -0
- package/src/shared/environment-manager/derivation/load-alias.ts +11 -0
- package/src/shared/environment-manager/derivation/rules-compose.ts +42 -0
- package/src/shared/environment-manager/derivation/rules-events.ts +50 -0
- package/src/shared/environment-manager/derivation/rules-http.ts +247 -0
- package/src/shared/environment-manager/derivation/rules-infra.ts +64 -0
- package/src/shared/environment-manager/derivation/rules-readiness.ts +96 -0
- package/src/shared/environment-manager/derivation/scan.ts +160 -0
- package/src/shared/environment-manager/derivation/text.ts +40 -0
- package/src/shared/environment-manager/derivation/types.ts +69 -0
- package/src/shared/environment-manager/health.ts +589 -0
- package/src/shared/environment-manager/index.ts +6 -0
- package/src/shared/environment-manager/load-applications.ts +78 -0
- package/src/shared/environment-manager/log-tail.ts +212 -0
- package/src/shared/environment-manager/make-targets.ts +78 -0
- package/src/shared/environment-manager/opctl.ts +334 -0
- package/src/shared/environment-manager/readiness.ts +93 -0
- package/src/shared/environment-manager/register-local.ts +72 -0
- package/src/shared/environment-manager/secrets-check.ts +260 -0
- package/src/shared/environment-manager/service-env.ts +110 -0
- package/src/shared/environment-manager/service-runner.ts +1588 -0
- package/src/shared/environment-manager/up-plan.ts +302 -0
- package/src/shared/environment-manager/workspace-manager.ts +905 -0
- package/src/shared/environment-manager/workspaces.ts +860 -0
- package/src/shared/manifest/deps.ts +27 -0
- package/src/shared/manifest/migrate-manifest.ts +101 -0
- package/src/shared/manifest/read-manifest.ts +160 -0
- package/src/shared/manifest/schema.ts +299 -0
- package/src/shared/manifest/service-links.ts +93 -0
- package/src/shared/manifest/validate-manifest.ts +140 -0
- package/src/shared/manifest/workspace-manifests.ts +92 -0
- package/src/shared/open-url.ts +122 -0
- package/src/shared/org.ts +44 -0
- package/src/shared/paths.ts +178 -0
- package/src/shared/perf/optional-fields.ts +105 -0
- package/src/shared/perf/report-normalizer.ts +404 -0
- package/src/shared/perf/report-paths.ts +19 -0
- package/src/shared/perf/report-store.ts +110 -0
- package/src/shared/perf/report-types.ts +70 -0
- package/src/shared/perf/test-paths.ts +25 -0
- package/src/shared/process/log-rotation.ts +147 -0
- package/src/shared/process/spawn-streaming.ts +229 -0
- package/src/shared/product.ts +92 -0
- package/src/shared/profile.ts +141 -0
- package/src/shared/repo-kind.ts +32 -0
- package/src/shared/reporting/jsonl-reporter.ts +131 -0
- package/src/shared/reporting/slack-reporter.ts +340 -0
- package/src/shared/results/result-reader.ts +266 -0
- package/src/shared/results/result-writer.ts +168 -0
- package/src/shared/secrets/doppler.ts +126 -0
- package/src/shared/secrets/env.ts +48 -0
- package/src/shared/secrets/index.ts +197 -0
- package/src/shared/secrets/keys.ts +33 -0
- package/src/shared/secrets/onepassword.ts +75 -0
- package/src/shared/secrets/types.ts +52 -0
- package/src/shared/service-url.ts +119 -0
- package/src/shared/smoke/branch-resolver.ts +141 -0
- package/src/shared/smoke/git-remote.ts +70 -0
- package/src/shared/smoke/repo-cloner.ts +151 -0
- package/src/shared/stacks/config.ts +137 -0
- package/src/shared/stacks/manifest-commands.ts +88 -0
- package/src/shared/stacks/render.ts +253 -0
- package/src/shared/stacks/runtime.ts +334 -0
- package/src/shared/stacks/types.ts +53 -0
- package/src/shared/terminal/tabs.ts +212 -0
- package/src/shared/test-discovery/module-scanner.ts +569 -0
- package/src/shared/types/index.ts +678 -0
- package/src/shared/ui-marker.ts +19 -0
- package/src/ui/cli/applications-command.ts +116 -0
- package/src/ui/cli/config-command.ts +68 -0
- package/src/ui/cli/create-main.ts +9 -0
- package/src/ui/cli/create.ts +360 -0
- package/src/ui/cli/edge-command.ts +91 -0
- package/src/ui/cli/flag-parser.ts +246 -0
- package/src/ui/cli/graph-command.ts +524 -0
- package/src/ui/cli/health-display.ts +63 -0
- package/src/ui/cli/index.ts +3656 -0
- package/src/ui/cli/init.ts +855 -0
- package/src/ui/cli/invocation-target.ts +175 -0
- package/src/ui/cli/logs-command.ts +104 -0
- package/src/ui/cli/module-selection.ts +31 -0
- package/src/ui/cli/prompts.ts +767 -0
- package/src/ui/cli/results-viewer.ts +436 -0
- package/src/ui/cli/secrets-preflight.ts +91 -0
- package/src/ui/cli/stack-command.ts +144 -0
- package/src/ui/cli/stalled-setup-recovery.ts +129 -0
- package/src/ui/cli/test-runner.ts +1312 -0
- package/src/ui/cli/web-command.ts +1073 -0
- package/src/ui/server/changelog-parser.ts +94 -0
- package/src/ui/server/daemon-reaper.ts +129 -0
- package/src/ui/server/editor-manager.ts +301 -0
- package/src/ui/server/github-service.ts +223 -0
- package/src/ui/server/http-helpers.ts +98 -0
- package/src/ui/server/index.ts +3236 -0
- package/src/ui/server/log-history.ts +452 -0
- package/src/ui/server/perf-report.ts +42 -0
- package/src/ui/server/public/environments.html +494 -0
- package/src/ui/server/public/favicon.ico +0 -0
- package/src/ui/server/public/header.js +1371 -0
- package/src/ui/server/public/index.html +2595 -0
- package/src/ui/server/public/local-dev.html +7405 -0
- package/src/ui/server/public/logs.html +1489 -0
- package/src/ui/server/public/perf-report.js +359 -0
- package/src/ui/server/public/release.html +2111 -0
- package/src/ui/server/public/services.html +1098 -0
- package/src/ui/server/public/workspace-picker.js +69 -0
- package/src/ui/server/release-deploy-session.ts +246 -0
- package/src/ui/server/release-service.ts +1125 -0
- package/src/ui/server/sudo-store.ts +111 -0
- package/src/ui/server/workspace-routes.ts +2154 -0
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recovery flow for a hidden `make setup` that stalled on an interactive
|
|
3
|
+
* prompt during `den up` (the stall guard killed it and reported the
|
|
4
|
+
* prompt line). Setups run one at a time in the foreground, so the terminal
|
|
5
|
+
* is free — offer to re-run right here instead of sending the user off to
|
|
6
|
+
* run it themselves and re-run `den up`.
|
|
7
|
+
*
|
|
8
|
+
* Extracted from DenCLI.ensureManagedClonesFor so the four routes
|
|
9
|
+
* (accept+success / accept+failure / decline-or-timeout / non-interactive)
|
|
10
|
+
* are unit-testable — index.ts self-executes at module scope.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import chalk from "chalk";
|
|
14
|
+
import inquirer from "inquirer";
|
|
15
|
+
|
|
16
|
+
import { product } from "../../shared/product.js";
|
|
17
|
+
/** Auto-decline the offer after this long: `up` must never hang unattended. */
|
|
18
|
+
export const STALLED_SETUP_CONFIRM_TIMEOUT_MS = 60_000;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Confirm with an auto-answer timeout. A TTY with nobody watching (ssh -t
|
|
22
|
+
* automation, tmux left running) must never hang the caller at a prompt —
|
|
23
|
+
* after `timeoutMs` the prompt is closed and `timeoutValue` returned.
|
|
24
|
+
*
|
|
25
|
+
* (Lives here rather than in CLIPrompts because prompts.ts uses
|
|
26
|
+
* import.meta.url and can't be loaded under jest's CJS transform.)
|
|
27
|
+
*/
|
|
28
|
+
export async function confirmWithTimeout(
|
|
29
|
+
message: string,
|
|
30
|
+
timeoutMs: number,
|
|
31
|
+
defaultValue: boolean = true,
|
|
32
|
+
timeoutValue: boolean = false,
|
|
33
|
+
): Promise<boolean> {
|
|
34
|
+
const prompt = inquirer.prompt<{ confirmed: boolean }>([
|
|
35
|
+
{
|
|
36
|
+
type: "confirm",
|
|
37
|
+
name: "confirmed",
|
|
38
|
+
message,
|
|
39
|
+
default: defaultValue,
|
|
40
|
+
},
|
|
41
|
+
]);
|
|
42
|
+
// A dead stdin (Ctrl+D, closed pipe) can REJECT the prompt — or leave it
|
|
43
|
+
// pending forever and make ui.close() throw ERR_USE_AFTER_CLOSE once the
|
|
44
|
+
// timer fires. Route every no-answer path to `timeoutValue`; never let a
|
|
45
|
+
// prompt failure crash the caller (`den up`).
|
|
46
|
+
const answered = prompt.then(
|
|
47
|
+
(a) => a,
|
|
48
|
+
() => null,
|
|
49
|
+
);
|
|
50
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
51
|
+
const timedOut = new Promise<null>((resolve) => {
|
|
52
|
+
timer = setTimeout(() => resolve(null), timeoutMs);
|
|
53
|
+
});
|
|
54
|
+
try {
|
|
55
|
+
const result = await Promise.race([answered, timedOut]);
|
|
56
|
+
if (result === null) {
|
|
57
|
+
try {
|
|
58
|
+
// release stdin — an unanswered prompt must not hold the process.
|
|
59
|
+
// `close` is typed protected on inquirer's UI class but is the
|
|
60
|
+
// documented way to abandon a pending prompt.
|
|
61
|
+
(prompt.ui as unknown as { close(): void }).close();
|
|
62
|
+
} catch {
|
|
63
|
+
/* readline already closed (EOF) */
|
|
64
|
+
}
|
|
65
|
+
return timeoutValue;
|
|
66
|
+
}
|
|
67
|
+
return result.confirmed;
|
|
68
|
+
} finally {
|
|
69
|
+
if (timer) clearTimeout(timer);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export interface StalledSetupDeps {
|
|
74
|
+
/** Is a human plausibly attached? (stdin AND stdout are TTYs) */
|
|
75
|
+
isInteractive: () => boolean;
|
|
76
|
+
/** Timeout-capable confirm — must resolve false when nobody answers. */
|
|
77
|
+
confirm: (message: string) => Promise<boolean>;
|
|
78
|
+
/** Re-run the repo's setup with inherited stdio; resolves its exit code. */
|
|
79
|
+
runSetupInteractive: (repoPath: string) => Promise<number>;
|
|
80
|
+
/** Record the setup-success marker so `den up` won't re-run it. */
|
|
81
|
+
markSetupSucceeded: (repoPath: string) => void;
|
|
82
|
+
log: (line: string) => void;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Show the stalled prompt and, when a human is attached, offer an in-terminal
|
|
87
|
+
* re-run. Returns true iff setup was recovered (re-run succeeded) — the
|
|
88
|
+
* caller must mark the repo failed otherwise.
|
|
89
|
+
*/
|
|
90
|
+
export async function recoverStalledSetup(
|
|
91
|
+
repoName: string,
|
|
92
|
+
repoPath: string,
|
|
93
|
+
stalledPrompt: string,
|
|
94
|
+
deps: StalledSetupDeps,
|
|
95
|
+
): Promise<boolean> {
|
|
96
|
+
deps.log(
|
|
97
|
+
chalk.yellow(`\n It stopped at a prompt ${product().cli} can't answer:`),
|
|
98
|
+
);
|
|
99
|
+
deps.log(chalk.gray(` │ ${stalledPrompt}`));
|
|
100
|
+
|
|
101
|
+
if (
|
|
102
|
+
deps.isInteractive() &&
|
|
103
|
+
(await deps.confirm(`Run setup for ${repoName} interactively now?`))
|
|
104
|
+
) {
|
|
105
|
+
deps.log(chalk.cyan(`\n ── setup ${repoName} (interactive) ──`));
|
|
106
|
+
const code = await deps.runSetupInteractive(repoPath);
|
|
107
|
+
if (code === 0) {
|
|
108
|
+
deps.markSetupSucceeded(repoPath);
|
|
109
|
+
deps.log(chalk.green(`\n ✓ setup ${chalk.bold(repoName)}\n`));
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
deps.log(chalk.red(`\n ✗ setup ${repoName} failed (exit ${code})`));
|
|
113
|
+
deps.log(
|
|
114
|
+
chalk.yellow(
|
|
115
|
+
` Fix setup in ${repoPath}, then re-run \`${product().cli} up\` ` +
|
|
116
|
+
`(or \`${product().cli} setup ${repoName}\`).\n`,
|
|
117
|
+
),
|
|
118
|
+
);
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
deps.log(
|
|
123
|
+
chalk.yellow(
|
|
124
|
+
` Run it yourself once — \`cd ${repoPath} && make setup\` ` +
|
|
125
|
+
`(or \`${product().cli} setup ${repoName}\`) — then re-run \`${product().cli} up\`.\n`,
|
|
126
|
+
),
|
|
127
|
+
);
|
|
128
|
+
return false;
|
|
129
|
+
}
|