@devdogsuga/devtools 0.1.32 → 0.1.34

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.
@@ -1,10 +1,10 @@
1
1
  import { a as cliName } from "./failure-log-BBPGejQv.js";
2
- import { C as catalog, E as renderHelp, S as unwrap, T as renderCommandList, a as recordResolved, b as explain, c as probeEnvironment, d as nonEmpty, f as resolveDbConnection, i as recordEnteredTier, l as flagValue, m as sessionLabel, n as runMenu, o as reproducibleCommand, p as sessionIsLocal, r as beginInvocation, s as describeEnvironment, t as bareGroupStartPath, u as positionals, v as bail, w as helpPath, x as explainError, y as errorMessage } from "./menu-CQBsQRgH.js";
2
+ import { C as catalog, E as renderHelp, S as unwrap, T as renderCommandList, a as recordResolved, b as explain, c as probeEnvironment, d as nonEmpty, f as resolveDbConnection, i as recordEnteredTier, l as flagValue, m as sessionLabel, n as runMenu, o as reproducibleCommand, p as sessionIsLocal, r as beginInvocation, s as describeEnvironment, t as bareGroupStartPath, u as positionals, v as bail, w as helpPath, x as explainError, y as errorMessage } from "./menu-DnqlX22U.js";
3
3
  import { _ as dryRunKind, c as reportRuns, f as supabase, g as runInGroup, h as reportRan, l as run$1, s as dbPush, u as runWithStderr, v as isDryRun, x as wouldRunLine } from "./supabase-project-0knM0mqd.js";
4
4
  import { a as ownVersion, n as discoverRepoRoot, r as findRepoRoot } from "./root-C2OmZDwD.js";
5
5
  import { i as loadEnvSession, n as loadEnv, r as loadEnvLoad, t as getEnvSync } from "./peers-RBplwovA.js";
6
- import { d as hasYes, f as isNonInteractive, n as captureDevtoolsError, o as initDevtoolsTelemetry, r as devtoolsEnvironment, t as captureDevtoolsDeprecation } from "./telemetry-C4foD8MD.js";
7
- import { a as loadRegistry, i as assertRegistryLoaded, r as scopedProcessEnv, t as createTemporaryWranglerEnv } from "./local-env-D8HC2JK_.js";
6
+ import { d as hasYes, f as isNonInteractive, n as captureDevtoolsError, o as initDevtoolsTelemetry, r as devtoolsEnvironment, t as captureDevtoolsDeprecation } from "./telemetry-El7OainP.js";
7
+ import { n as assertRegistryLoaded, r as loadRegistry, t as scopedProcessEnv } from "./local-env-hH4encfD.js";
8
8
  import { t as runStackCommand } from "./stack-BynCgRVS.js";
9
9
  import { cancel, confirm, intro, isCancel, log, multiselect, note, outro, password, select, spinner, text } from "@clack/prompts";
10
10
  import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, writeFileSync } from "node:fs";
@@ -53,15 +53,6 @@ const DONE = "Done.";
53
53
  * entry re-routes a credential behind a reviewer gate, so the reviewer of that
54
54
  * change should have to touch this file and say so out loud.
55
55
  */
56
- /** `sandbox`'s runtime manifest declares exactly these four; none may be
57
- * storable, or `deploy secrets-file` would upload a long-lived secret to the
58
- * internet-facing proxy Worker. */
59
- const SANDBOX_RUNTIME_KEYS = [
60
- "DEPLOY_ENV",
61
- "PLATFORM_REST_URL",
62
- "SANDBOX_PROXY_TOKEN",
63
- "SANDBOX_SENTRY_DSN"
64
- ];
65
56
  /** Public per-environment values the local stack also supplies. `localStack`
66
57
  * describes development only; staging and production have no stack to supply
67
58
  * these, so they must still reach a deploy. */
@@ -83,8 +74,7 @@ async function checkEnv(root) {
83
74
  for (const other of rest) if (JSON.stringify(other.meta) !== JSON.stringify(first.meta)) problems.push(`${key} is declared by both "${first.source}" and "${other.source}" with diverging metadata. Duplicates must agree on every field, doc string included.`);
84
75
  for (const entry of entries) if (entry.meta.doc.trim().length === 0) problems.push(`${key} (declared by "${entry.source}") has an empty doc.`);
85
76
  }
86
- const everyEntry = [...registry.values()].flat();
87
- const shipped = everyEntry.filter((e) => e.source === "study-group-finder");
77
+ const shipped = [...registry.values()].flat().filter((e) => e.source === "study-group-finder");
88
78
  if (shipped.length === 0) problems.push("No variables are declared by \"study-group-finder\"; the no-secrets-in-the-binary check would be vacuous.");
89
79
  for (const entry of shipped) if (entry.meta.secrecy !== "public") problems.push(`${entry.key} is in the study-group-finder runtime manifest with secrecy "${entry.meta.secrecy}". Move it to the "study-group-finder:tooling" manifest or make it public.`);
90
80
  const storable = new Set(env.storableKeys());
@@ -92,9 +82,6 @@ async function checkEnv(root) {
92
82
  const never = env.neverStoreKeys();
93
83
  const minted = env.mintedKeys();
94
84
  const narrowed = env.narrowedKeys();
95
- const sandbox = everyEntry.filter((e) => e.source === "sandbox");
96
- if (JSON.stringify(sandbox.map((e) => e.key).sort()) !== JSON.stringify(SANDBOX_RUNTIME_KEYS)) problems.push(`The sandbox runtime manifest declares [${sandbox.map((e) => e.key).sort().join(", ")}], not [${SANDBOX_RUNTIME_KEYS.join(", ")}].`);
97
- for (const entry of sandbox) if (storable.has(entry.key)) problems.push(`${entry.key} is declared by the sandbox runtime manifest and is storable, so \`deploy secrets-file\` would upload it to the proxy Worker. Move it to the "sandbox:tooling" manifest if the deploy needs it rather than the Worker.`);
98
85
  for (const [key, entries] of registry) if (key.startsWith("GITHUB_") && entries.some((e) => e.meta.scope === "environment")) problems.push(`${key} is environment-scoped but starts with GITHUB_, which GitHub reserves. Rename it (the App credentials use GH_*).`);
99
86
  for (const key of never) {
100
87
  if (storable.has(key)) problems.push(`${key} is never-store yet appears in storableKeys().`);
@@ -116,7 +103,7 @@ async function checkEnv(root) {
116
103
  [
117
104
  "minted",
118
105
  minted,
119
- ["SANDBOX_PROXY_TOKEN"]
106
+ []
120
107
  ],
121
108
  [
122
109
  "narrowed",
@@ -308,9 +295,6 @@ function workerPaths() {
308
295
  * both call that reusable workflow), so exactly one `matrix.include` block is
309
296
  * expected.
310
297
  */
311
- /** Worker apps that ship a `wrangler.jsonc` but are deliberately left out of
312
- * the automated deploy matrix (see `deploy-app.yaml`'s own comment). */
313
- const NOT_IN_DEPLOY_MATRIX = ["sandbox"];
314
298
  /** The `packages:` glob list from `pnpm-workspace.yaml`, e.g. `["apps/*",
315
299
  * "packages/*", "docs"]`. Stops at the next top-level (column-0) key. */
316
300
  function workspaceGlobs(yamlText) {
@@ -392,8 +376,7 @@ function checkWorkers(root) {
392
376
  }
393
377
  const blocks = deployMatrixApps(readFileSync(deployApp, "utf8"));
394
378
  if (blocks.length !== 1) problems.push(`deploy-app.yaml should define its deploy matrix once; found ${blocks.length}.`);
395
- const deployed = apps.filter((app) => !NOT_IN_DEPLOY_MATRIX.includes(app));
396
- for (const block of blocks) if (!sameSet(block, deployed)) problems.push(`deploy-app.yaml's matrix is [${block.join(", ")}]; workers.json implies [${deployed.join(", ")}] (minus ${NOT_IN_DEPLOY_MATRIX.join(", ")}).`);
379
+ for (const block of blocks) if (!sameSet(block, apps)) problems.push(`deploy-app.yaml's matrix is [${block.join(", ")}]; workers.json lists [${apps.join(", ")}].`);
397
380
  return problems;
398
381
  }
399
382
  //#endregion
@@ -818,7 +801,7 @@ function discoverWranglerConfigs() {
818
801
  * Imports every app's `cloudflare/scheduled.ts` and returns the parsed
819
802
  * `CRON_ROUTES` for each app that has one.
820
803
  *
821
- * `apps/sandbox` has no scheduled.ts and no crons; absent is not an error.
804
+ * An app with no scheduled.ts has no crons; absent is not an error.
822
805
  */
823
806
  async function discoverCronMaps() {
824
807
  const results = [];
@@ -2228,7 +2211,6 @@ const SECTION_ORDER = [
2228
2211
  "platform",
2229
2212
  "schedule-builder",
2230
2213
  "study-group-finder",
2231
- "sandbox",
2232
2214
  "supabase",
2233
2215
  "devtools"
2234
2216
  ];
@@ -2236,7 +2218,6 @@ const SECTION_LABELS = {
2236
2218
  platform: "platform (apps/platform/src/env.ts)",
2237
2219
  "schedule-builder": "schedule-builder (apps/schedule-builder/src/env.ts)",
2238
2220
  "study-group-finder": "study-group-finder (apps/study-group-finder/env.ts)",
2239
- sandbox: "sandbox — a dormant Worker's bindings; nothing provisions or deploys it from the platform side any more (apps/sandbox/env.ts)",
2240
2221
  supabase: "supabase — read by config.toml and the Supabase CLI (supabase/env.ts)",
2241
2222
  devtools: "devtools — operator tooling, no app reads these (@devdogsuga/devtools)"
2242
2223
  };
@@ -2245,13 +2226,12 @@ function sectionOf(source) {
2245
2226
  return source.split(":")[0];
2246
2227
  }
2247
2228
  /**
2248
- * The sections a development init may narrow to: the four apps.
2229
+ * The sections a development init may narrow to: the three apps.
2249
2230
  *
2250
2231
  * Order is the PICKER's order, not the file's (that is `SECTION_ORDER`, fixed
2251
2232
  * so `.env.example` stays byte-stable). The two projects most contributors
2252
2233
  * join come first; `platform` follows as the shared auth infrastructure you
2253
- * depend on but rarely edit, and `sandbox` last as the dormant one almost
2254
- * nobody touches.
2234
+ * depend on but rarely edit.
2255
2235
  *
2256
2236
  * `supabase` is NOT here and NOT optional. It is the shared database and auth
2257
2237
  * layer every app runs against, so any selection implies it (the caller adds
@@ -2262,8 +2242,7 @@ function sectionOf(source) {
2262
2242
  const APP_SECTIONS = [
2263
2243
  "schedule-builder",
2264
2244
  "study-group-finder",
2265
- "platform",
2266
- "sandbox"
2245
+ "platform"
2267
2246
  ];
2268
2247
  /**
2269
2248
  * Every declared key belonging to one of the chosen sections.
@@ -2522,8 +2501,7 @@ async function resolveSections(apps) {
2522
2501
  const APP_HINTS = {
2523
2502
  "schedule-builder": "the DogDays course-schedule planner (Next.js)",
2524
2503
  "study-group-finder": "the Dog Pack study-group app (Flutter)",
2525
- platform: "shared auth server — needed only if you run it locally for sign-in; usually you don't edit it",
2526
- sandbox: "dormant Worker — no platform integration left; almost never touched"
2504
+ platform: "shared auth server — needed only if you run it locally for sign-in; usually you don't edit it"
2527
2505
  };
2528
2506
  const chosen = unwrap(await multiselect({
2529
2507
  message: "Which projects are you working on? (The shared Supabase stack is always included; re-run init later to add more.)",
@@ -5184,7 +5162,7 @@ async function runDev(plan, filters, rest, tierEnv) {
5184
5162
  "run",
5185
5163
  "build"
5186
5164
  ], tierEnv, { final: false });
5187
- const { scopedProcessEnv } = await import("./local-env-DrBCXqD8.js");
5165
+ const { scopedProcessEnv } = await import("./local-env-CR3McKHZ.js");
5188
5166
  const environment = {
5189
5167
  ...process.env,
5190
5168
  ...tierEnv
@@ -5632,8 +5610,7 @@ async function runSetup() {
5632
5610
  if (sections) chosenApps = [
5633
5611
  "schedule-builder",
5634
5612
  "study-group-finder",
5635
- "platform",
5636
- "sandbox"
5613
+ "platform"
5637
5614
  ].filter((app) => sections.has(app));
5638
5615
  writeFileSync(env, renderInit("development", (/* @__PURE__ */ new Date()).toISOString().slice(0, 10), sections), { flag: "wx" });
5639
5616
  log.success("Created .env (same as `pnpm devtools env init`)");
@@ -5819,11 +5796,6 @@ const handleSetup = async () => {
5819
5796
  * `dist/` output, so on a fresh clone `vinext build` fails to load
5820
5797
  * `next.config.ts` without them.
5821
5798
  */
5822
- /** Apps deployed without a framework build: Wrangler bundles `main` itself. */
5823
- const NO_FRAMEWORK_BUILD = /* @__PURE__ */ new Set(["sandbox"]);
5824
- function needsFrameworkBuild(app) {
5825
- return !NO_FRAMEWORK_BUILD.has(app);
5826
- }
5827
5799
  function workspaceDepsBuildCommand(app) {
5828
5800
  return [
5829
5801
  "-r",
@@ -5941,18 +5913,6 @@ async function waitForLocalWorkflow(workflowName, instanceId, port, options = {}
5941
5913
  process.stderr.write(`devtools workflows run: Workflow ${instanceId} did not finish within ${Math.round(timeoutMs / 6e4)} minutes.\n`);
5942
5914
  return 1;
5943
5915
  }
5944
- function wranglerDevArgs(app, port) {
5945
- return [
5946
- "--filter",
5947
- app,
5948
- "exec",
5949
- "wrangler",
5950
- "dev",
5951
- "--port",
5952
- port,
5953
- "--show-interactive-dev-session=false"
5954
- ];
5955
- }
5956
5916
  /** `vinext dev` bound to loopback, where `isWranglerDevRunning` probes. */
5957
5917
  function vinextDevArgs(app, port) {
5958
5918
  return [
@@ -6058,7 +6018,7 @@ async function startTemporaryWrangler(app, requestedPort) {
6058
6018
  process.stdout.write(`Port ${requestedPort} is in use; starting the temporary dev session on ${free} instead.\n`);
6059
6019
  port = String(free);
6060
6020
  }
6061
- const runtime = needsFrameworkBuild(app) ? "vinext dev" : "Wrangler";
6021
+ const runtime = "vinext dev";
6062
6022
  process.stdout.write(`Preparing and starting a temporary ${runtime} session for ${app} on port ${port}…\n`);
6063
6023
  let loaded;
6064
6024
  try {
@@ -6075,16 +6035,11 @@ async function startTemporaryWrangler(app, requestedPort) {
6075
6035
  process.stderr.write(`devtools workflows: building ${app}'s workspace dependencies failed (exit ${buildCode}); not starting ${runtime}.\n`);
6076
6036
  return null;
6077
6037
  }
6078
- const runtimeEnv = needsFrameworkBuild(app) ? void 0 : await createTemporaryWranglerEnv(app, loaded.env);
6079
- const child = spawn("pnpm", runtimeEnv ? [
6080
- ...wranglerDevArgs(app, port),
6081
- "--env-file",
6082
- runtimeEnv.path
6083
- ] : vinextDevArgs(app, port), {
6038
+ const child = spawn("pnpm", vinextDevArgs(app, port), {
6084
6039
  cwd: findRepoRoot(),
6085
6040
  stdio: "inherit",
6086
6041
  detached: process.platform !== "win32",
6087
- ...runtimeEnv ? {} : { env: await scopedProcessEnv(app, loaded.env, "development") }
6042
+ env: await scopedProcessEnv(app, loaded.env, "development")
6088
6043
  });
6089
6044
  let startupError;
6090
6045
  child.once("error", (error) => {
@@ -6096,19 +6051,16 @@ async function startTemporaryWrangler(app, requestedPort) {
6096
6051
  process.stdout.write(`${runtime} is ready.\n`);
6097
6052
  const stopOnParentExit = () => {
6098
6053
  signalProcessGroup(child, "SIGTERM");
6099
- runtimeEnv?.remove();
6100
6054
  };
6101
6055
  process.once("exit", stopOnParentExit);
6102
6056
  return {
6103
6057
  stop: async () => {
6104
6058
  process.off("exit", stopOnParentExit);
6105
6059
  await stopTemporaryWrangler(child);
6106
- runtimeEnv?.remove();
6107
6060
  },
6108
6061
  forceStop: () => {
6109
6062
  process.off("exit", stopOnParentExit);
6110
6063
  signalProcessGroup(child, "SIGKILL");
6111
- runtimeEnv?.remove();
6112
6064
  },
6113
6065
  port
6114
6066
  };
@@ -6116,13 +6068,11 @@ async function startTemporaryWrangler(app, requestedPort) {
6116
6068
  if (startupError || child.exitCode !== null || child.signalCode !== null) {
6117
6069
  const how = startupError ? `: ${startupError.message}` : child.signalCode !== null ? ` (killed by ${child.signalCode}).` : ` (exit ${child.exitCode}).`;
6118
6070
  process.stderr.write(`devtools workflows run: ${runtime} stopped before it became ready${how}\n`);
6119
- runtimeEnv?.remove();
6120
6071
  return null;
6121
6072
  }
6122
6073
  await setTimeout$1(250);
6123
6074
  }
6124
6075
  await stopTemporaryWrangler(child);
6125
- runtimeEnv?.remove();
6126
6076
  process.stderr.write(`devtools workflows run: ${runtime} did not become ready on port ${port} within ${WRANGLER_READY_TIMEOUT_MS / 6e4} minutes.\n`);
6127
6077
  return null;
6128
6078
  }
package/dist/launch.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import { a as cliName, t as installFailureLog } from "./failure-log-BBPGejQv.js";
2
- import { C as catalog, S as unwrap, _ as setMenuEnvHook, d as nonEmpty, g as realEnvEntryDeps, h as enterSessionEnvironment, t as bareGroupStartPath, w as helpPath, y as errorMessage } from "./menu-CQBsQRgH.js";
2
+ import { C as catalog, S as unwrap, _ as setMenuEnvHook, d as nonEmpty, g as realEnvEntryDeps, h as enterSessionEnvironment, t as bareGroupStartPath, w as helpPath, y as errorMessage } from "./menu-DnqlX22U.js";
3
3
  import { b as setDryRun, m as formatCommand, v as isDryRun, y as resolveDryRun } from "./supabase-project-0knM0mqd.js";
4
4
  import { n as discoverRepoRoot, r as findRepoRoot, t as RepoNotFoundError } from "./root-C2OmZDwD.js";
5
5
  import { i as loadEnvSession, r as loadEnvLoad } from "./peers-RBplwovA.js";
6
- import { d as hasYes, f as isNonInteractive, m as stripTierFlag, n as captureDevtoolsError, o as initDevtoolsTelemetry, p as stripNoEnvFlag, s as lastSentryEventId } from "./telemetry-C4foD8MD.js";
6
+ import { d as hasYes, f as isNonInteractive, m as stripTierFlag, n as captureDevtoolsError, o as initDevtoolsTelemetry, p as stripNoEnvFlag, s as lastSentryEventId } from "./telemetry-El7OainP.js";
7
7
  import { confirm, select } from "@clack/prompts";
8
8
  //#region ../cli-core/src/session.ts
9
9
  /**
@@ -166,7 +166,7 @@ async function startStack() {
166
166
  * post-tier-resolution path.
167
167
  */
168
168
  async function dispatch(argv) {
169
- const { main } = await import("./cli-CZKkNHK5.js");
169
+ const { main } = await import("./cli-Bb-Lzg-l.js");
170
170
  try {
171
171
  await main(argv);
172
172
  } catch (err) {
@@ -0,0 +1,2 @@
1
+ import { t as scopedProcessEnv } from "./local-env-hH4encfD.js";
2
+ export { scopedProcessEnv };
@@ -1,9 +1,8 @@
1
1
  import { i as ownPackageDir, r as findRepoRoot } from "./root-C2OmZDwD.js";
2
2
  import { a as repoPeerUrl, n as loadEnv, t as getEnvSync } from "./peers-RBplwovA.js";
3
3
  import { register } from "node:module";
4
- import { existsSync, mkdtempSync, readdirSync, rmSync, writeFileSync } from "node:fs";
4
+ import { existsSync, readdirSync } from "node:fs";
5
5
  import { join } from "node:path";
6
- import { tmpdir } from "node:os";
7
6
  import { pathToFileURL } from "node:url";
8
7
  //#region ../cli-core/src/repo/peer-redirect.ts
9
8
  /**
@@ -117,16 +116,12 @@ async function importRepoTs(absolutePath) {
117
116
  * Most workspace packages declare nothing, so "no env.ts found" means
118
117
  * not-a-manifest rather than an error.
119
118
  *
120
- * ⚠️ `apps/sandbox` was once listed here as having no manifest ON PURPOSE, on
121
- * the grounds that a Worker reads bindings that arrive as a function argument
122
- * rather than `process.env`. That premise is still true and the conclusion
123
- * drawn from it was still wrong: a manifest is also the only thing that routes
124
- * a credential to a deployed environment and the only thing that tells
125
- * `env audit` a Worker secret is supposed to be there. Without one,
126
- * `SANDBOX_PROXY_TOKEN`, minted at deploy time and therefore in no Bitwarden
127
- * project by design, was reported as an orphan, i.e. as safe for the §3.6 prune
128
- * path to delete. `apps/sandbox/env.ts` exists now, and states that reasoning
129
- * at length.
119
+ * ⚠️ A Worker still needs a manifest, even though its bindings arrive as a
120
+ * function argument rather than `process.env`: a manifest is the only thing
121
+ * that routes a credential to a deployed environment and the only thing that
122
+ * tells `env audit` a Worker secret is supposed to be there. Without one, a
123
+ * minted secret (in no Bitwarden project by design) is reported as an orphan,
124
+ * i.e. as safe for the §3.6 prune path to delete.
130
125
  */
131
126
  /**
132
127
  * The single in-flight (or settled) load.
@@ -245,12 +240,6 @@ function manifestIn(dir) {
245
240
  }
246
241
  //#endregion
247
242
  //#region src/cf/local-env.ts
248
- function renderWranglerEnvFile(keys, environment) {
249
- return keys.flatMap((key) => {
250
- const value = environment[key];
251
- return value === void 0 ? [] : [`${key}='${value}'`];
252
- }).join("\n") + "\n";
253
- }
254
243
  /** The app's declared keys, deduped and sorted, from the given entries or the
255
244
  * loaded registry.
256
245
  *
@@ -303,49 +292,5 @@ async function scopedProcessEnv(app, environment, tier, entries) {
303
292
  scoped.CLOUDFLARE_INCLUDE_PROCESS_ENV = "true";
304
293
  return scoped;
305
294
  }
306
- /** Writes the mode-0600 `.dev.vars` into a fresh private temp directory. */
307
- function materializeEnvFile(keys, environment) {
308
- const directory = mkdtempSync(join(tmpdir(), "devtools-wrangler-env-"));
309
- const path = join(directory, ".dev.vars");
310
- writeFileSync(path, renderWranglerEnvFile(keys, environment), {
311
- encoding: "utf8",
312
- mode: 384
313
- });
314
- return {
315
- directory,
316
- path
317
- };
318
- }
319
- /**
320
- * Create an app-scoped, mode-0600 env file for a local Worker runtime whose
321
- * lifetime a single bracket callback cannot express.
322
- *
323
- * ⚠️ KEPT DELIBERATELY, not an oversight: `workflows/commands.ts` holds this
324
- * file open across a long-lived `wrangler dev` child process, and in the
325
- * `workflows run` temporary-session path that span crosses a `finally` that
326
- * is unrelated to starting Wrangler at all — it also triggers a Workflow and
327
- * polls for its completion before the session stops. Squeezing that into a
328
- * single `withWranglerEnv` callback would mean merging two previously
329
- * independent concerns (spinning up a dev session; triggering-and-waiting)
330
- * into one control path, which is a real redesign of a 700-line orchestrator,
331
- * not a mechanical bracket swap — and duplicating this function's
332
- * retry/readiness loop across a bracket-shaped variant just to convert the
333
- * `workflows serve` half would fragment one shared, tested implementation
334
- * into two for no behavioural gain.
335
- *
336
- * `env` mirrors `withWranglerEnv`'s `options.env`: pass a tier's loaded map to
337
- * materialize a scoped file from THAT tier rather than the inherited process
338
- * environment; omit it to keep today's behavior.
339
- */
340
- async function createTemporaryWranglerEnv(app, env) {
341
- const { directory, path } = materializeEnvFile(await scopedKeys(app), env ?? process.env);
342
- return {
343
- path,
344
- remove: () => rmSync(directory, {
345
- recursive: true,
346
- force: true
347
- })
348
- };
349
- }
350
295
  //#endregion
351
- export { loadRegistry as a, assertRegistryLoaded as i, renderWranglerEnvFile as n, scopedProcessEnv as r, createTemporaryWranglerEnv as t };
296
+ export { assertRegistryLoaded as n, loadRegistry as r, scopedProcessEnv as t };
@@ -2,7 +2,7 @@ import { c as YES, i as suppressFailureLog, l as createCatalog, o as JSON_FLAG,
2
2
  import { a as listContainerNames, i as foreignStackProjectId, n as containerPrefix, o as readProjectId, p as supabaseCapture, r as foreignStackMessage, t as STACK_API_PORT } from "./supabase-project-0knM0mqd.js";
3
3
  import { r as findRepoRoot } from "./root-C2OmZDwD.js";
4
4
  import { n as loadEnv, r as loadEnvLoad } from "./peers-RBplwovA.js";
5
- import { c as reportDevtoolsError, f as isNonInteractive } from "./telemetry-C4foD8MD.js";
5
+ import { c as reportDevtoolsError, f as isNonInteractive } from "./telemetry-El7OainP.js";
6
6
  import { cancel, confirm, isCancel, log, note, select, text } from "@clack/prompts";
7
7
  import { existsSync } from "node:fs";
8
8
  import { writeFile } from "node:fs/promises";
@@ -78,8 +78,8 @@ function stripTierFlag(argv) {
78
78
  //#region ../cli-core/src/telemetry.ts
79
79
  /**
80
80
  * devtools' own Sentry wiring — the CLI is a consumer of
81
- * `@devdogsuga/telemetry` like `apps/platform`, `apps/schedule-builder`, and
82
- * `apps/sandbox`, but on `@sentry/node` rather than a framework SDK: a CLI
81
+ * `@devdogsuga/telemetry` like `apps/platform` and `apps/schedule-builder`,
82
+ * but on `@sentry/node` rather than a framework SDK: a CLI
83
83
  * process starts, runs one command, and exits, with none of a server's
84
84
  * request lifecycle for a framework integration to hook into.
85
85
  *
package/dist/telemetry.js CHANGED
@@ -1,2 +1,2 @@
1
- import { a as hasRealCaller, c as reportDevtoolsError, i as devtoolsTelemetryEnabled, l as reportDevtoolsFailure, n as captureDevtoolsError, o as initDevtoolsTelemetry, r as devtoolsEnvironment, s as lastSentryEventId, t as captureDevtoolsDeprecation, u as resolveDevtoolsDsn } from "./telemetry-C4foD8MD.js";
1
+ import { a as hasRealCaller, c as reportDevtoolsError, i as devtoolsTelemetryEnabled, l as reportDevtoolsFailure, n as captureDevtoolsError, o as initDevtoolsTelemetry, r as devtoolsEnvironment, s as lastSentryEventId, t as captureDevtoolsDeprecation, u as resolveDevtoolsDsn } from "./telemetry-El7OainP.js";
2
2
  export { captureDevtoolsDeprecation, captureDevtoolsError, devtoolsEnvironment, devtoolsTelemetryEnabled, hasRealCaller, initDevtoolsTelemetry, lastSentryEventId, reportDevtoolsError, reportDevtoolsFailure, resolveDevtoolsDsn };
package/env.ts CHANGED
@@ -96,7 +96,22 @@ declare({
96
96
  doc:
97
97
  "A Sentry organization auth token. Deploys use it to create each " +
98
98
  "release and upload its source maps, and the smoke test uses it to " +
99
- "read cron check-ins. One token serves every environment.",
99
+ "confirm the release landed. One token serves every environment.",
100
+ scope: "environment",
101
+ secrecy: "secret",
102
+ commented: true,
103
+ }),
104
+ // Read only by `deploy prune-monitors`, in its own step's `env:`: an
105
+ // organization token (above) can neither list nor delete Crons monitors,
106
+ // and one that can delete monitors and alert rules org-wide should not
107
+ // sit in every step of the deploy job. Without it, pruning is skipped
108
+ // with a notice.
109
+ SENTRY_MONITORS_TOKEN: define(z.string().min(1).optional(), {
110
+ doc:
111
+ "A Sentry internal integration token with Alerts: Read & Write and " +
112
+ "nothing else. The production deploy uses it to delete the Crons " +
113
+ "monitors an app no longer declares, which would otherwise alert " +
114
+ "on missed check-ins forever.",
100
115
  scope: "environment",
101
116
  secrecy: "secret",
102
117
  commented: true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devdogsuga/devtools",
3
- "version": "0.1.32",
3
+ "version": "0.1.34",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Contributor CLI for a DevDogsUGA checkout: the real tools with the session's tier filled in, a menu over them, and the checks CI runs. Ships built JS; run via `pnpm dlx @devdogsuga/devtools` (or the `devtools` bin once installed) from inside a DevDogsUGA clone.",
@@ -31,7 +31,7 @@
31
31
  "tsx": "^4.23.12",
32
32
  "typescript": "^6.0.3",
33
33
  "zod": "4.4.3",
34
- "@devdogsuga/telemetry": "0.1.3"
34
+ "@devdogsuga/telemetry": "0.1.4"
35
35
  },
36
36
  "peerDependencies": {
37
37
  "@devdogsuga/db": "*",
@@ -53,8 +53,8 @@
53
53
  "vitest": "^4.1.11",
54
54
  "@devdogsuga/cli-core": "0.0.0",
55
55
  "@devdogsuga/config": "0.1.2",
56
- "@devdogsuga/env": "0.1.5",
57
- "@devdogsuga/db": "0.1.3"
56
+ "@devdogsuga/db": "0.1.3",
57
+ "@devdogsuga/env": "0.1.5"
58
58
  },
59
59
  "scripts": {
60
60
  "build": "tsdown && node scripts/write-build-info.mjs && node ../../scripts/check-bundle-imports.mjs",
@@ -1,2 +0,0 @@
1
- import { r as scopedProcessEnv } from "./local-env-D8HC2JK_.js";
2
- export { scopedProcessEnv };