percher 0.2.10 → 0.3.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 (54) hide show
  1. package/dist/bin/percher.js +6803 -2955
  2. package/dist/package.json +45 -0
  3. package/dist/src/ci-env.d.ts +6 -0
  4. package/dist/src/ci-env.d.ts.map +1 -0
  5. package/dist/src/ci-env.js +35 -0
  6. package/dist/src/ci-env.js.map +1 -0
  7. package/dist/src/cli-utils.d.ts +44 -0
  8. package/dist/src/cli-utils.d.ts.map +1 -0
  9. package/dist/src/cli-utils.js +129 -0
  10. package/dist/src/cli-utils.js.map +1 -0
  11. package/dist/src/commands/account.d.ts +4 -0
  12. package/dist/src/commands/account.d.ts.map +1 -0
  13. package/dist/src/commands/account.js +280 -0
  14. package/dist/src/commands/account.js.map +1 -0
  15. package/dist/src/commands/apps.d.ts +13 -0
  16. package/dist/src/commands/apps.d.ts.map +1 -0
  17. package/dist/src/commands/apps.js +467 -0
  18. package/dist/src/commands/apps.js.map +1 -0
  19. package/dist/src/commands/auth.d.ts +4 -0
  20. package/dist/src/commands/auth.d.ts.map +1 -0
  21. package/dist/src/commands/auth.js +21 -0
  22. package/dist/src/commands/auth.js.map +1 -0
  23. package/dist/src/commands/data.d.ts +4 -0
  24. package/dist/src/commands/data.d.ts.map +1 -0
  25. package/dist/src/commands/data.js +148 -0
  26. package/dist/src/commands/data.js.map +1 -0
  27. package/dist/src/commands/deploys.d.ts +4 -0
  28. package/dist/src/commands/deploys.d.ts.map +1 -0
  29. package/dist/src/commands/deploys.js +197 -0
  30. package/dist/src/commands/deploys.js.map +1 -0
  31. package/dist/src/commands/env.d.ts +4 -0
  32. package/dist/src/commands/env.d.ts.map +1 -0
  33. package/dist/src/commands/env.js +66 -0
  34. package/dist/src/commands/env.js.map +1 -0
  35. package/dist/src/commands/github.d.ts +4 -0
  36. package/dist/src/commands/github.d.ts.map +1 -0
  37. package/dist/src/commands/github.js +93 -0
  38. package/dist/src/commands/github.js.map +1 -0
  39. package/dist/src/env-set-input.d.ts +13 -0
  40. package/dist/src/env-set-input.d.ts.map +1 -0
  41. package/dist/src/env-set-input.js +59 -0
  42. package/dist/src/env-set-input.js.map +1 -0
  43. package/dist/src/index.d.ts.map +1 -1
  44. package/dist/src/index.js +17 -761
  45. package/dist/src/index.js.map +1 -1
  46. package/dist/src/prompt-hidden.d.ts +15 -0
  47. package/dist/src/prompt-hidden.d.ts.map +1 -0
  48. package/dist/src/prompt-hidden.js +104 -0
  49. package/dist/src/prompt-hidden.js.map +1 -0
  50. package/dist/src/telemetry.d.ts +1 -1
  51. package/dist/src/telemetry.d.ts.map +1 -1
  52. package/dist/src/telemetry.js +8 -1
  53. package/dist/src/telemetry.js.map +1 -1
  54. package/package.json +7 -6
@@ -0,0 +1,467 @@
1
+ import * as core from "@percher/core";
2
+ import pc from "picocolors";
3
+ import { SilentExitError, writeLine } from "../cli-utils";
4
+ /**
5
+ * FUTURE12 Phase 8 — exhaustiveness tripwire for the publish-handler
6
+ * switch. Adding a new value to `PublishStatus` without a matching
7
+ * `case` here turns into a TypeScript error at the `assertNever(...)`
8
+ * call site (the discriminator narrows to `never` only when every
9
+ * union member is handled), and a runtime "Unhandled publish status"
10
+ * throw if a non-union value somehow reaches this default. Both are
11
+ * load-bearing — the runtime throw is what `handlePublishResult` relies
12
+ * on so tests can synthesise an out-of-union status via `unknown` cast.
13
+ *
14
+ * `PublishResult.status` is a union of strings, but `PublishResult`
15
+ * itself isn't a discriminated union (other fields aren't keyed off
16
+ * status), so we narrow on `result.status` directly rather than passing
17
+ * the whole result. The runtime message still echoes status + summary
18
+ * so a sentry alert pinpoints the offending value without spelunking.
19
+ */
20
+ function assertNever(status, summary) {
21
+ throw new Error(`Unhandled publish status: ${JSON.stringify(status)}${summary ? ` (${summary})` : ""}`);
22
+ }
23
+ /**
24
+ * Render a `PublishResult` to the CLI. Extracted so a unit test can
25
+ * exercise the exhaustive switch with a synthesised out-of-union status
26
+ * (cast through `unknown`) without needing to mock the entire publish
27
+ * pipeline.
28
+ */
29
+ export async function handlePublishResult(ctx, result, options = {}) {
30
+ switch (result.status) {
31
+ case "dry_run": {
32
+ await writeLine(ctx, `Dry run: ${result.fileCount} files, ${(result.bytes / 1024).toFixed(1)} KB`);
33
+ return;
34
+ }
35
+ case "needs_login": {
36
+ if (result.loginUrl) {
37
+ await writeLine(ctx, `${pc.yellow("!")} Not logged in. Authorize here:`);
38
+ await writeLine(ctx, ` ${result.loginUrl}`);
39
+ }
40
+ else {
41
+ await writeLine(ctx, `${pc.red("✗")} Not logged in. Run: percher login`);
42
+ }
43
+ throw new SilentExitError();
44
+ }
45
+ case "queued": {
46
+ // FUTURE11 async path — caller passed waitForLive: false (currently
47
+ // only reachable via the MCP/programmatic path, but PublishStatus
48
+ // includes it so the CLI must handle it explicitly rather than
49
+ // falling into the live-success block and printing "Published to
50
+ // undefined" for a row that isn't live yet).
51
+ await writeLine(ctx, `${pc.yellow("!")} ${result.summary}`);
52
+ const deployId = result.deployment?.id;
53
+ const appName = result.app?.name;
54
+ if (deployId && appName) {
55
+ await writeLine(ctx, pc.dim(` Next: percher wait-for-deploy ${deployId} --app ${appName}`));
56
+ }
57
+ else if (deployId) {
58
+ await writeLine(ctx, pc.dim(` Next: percher wait-for-deploy ${deployId}`));
59
+ }
60
+ return;
61
+ }
62
+ case "already_in_progress": {
63
+ // FUTURE12 Phase 6d — server short-circuited the publish because a
64
+ // deploy is already in flight for this app. Print the existing
65
+ // deployId + the recommended next command so a human or agent has a
66
+ // clear path forward.
67
+ await writeLine(ctx, `${pc.yellow("!")} ${result.summary}`);
68
+ if (result.recovery.nextAction === "wait_deploy") {
69
+ const args = result.recovery.args;
70
+ if (args.app && args.deployId) {
71
+ await writeLine(ctx, pc.dim(` Next: percher wait-for-deploy ${args.deployId} --app ${args.app}`));
72
+ }
73
+ }
74
+ return;
75
+ }
76
+ case "replaced": {
77
+ // FUTURE11 review round 5 + FUTURE12 Phase 8: don't fall through to
78
+ // the live-success block (would print "Published to undefined" when
79
+ // resolver couldn't find a current live URL). The resolver populates
80
+ // `result.url` when there's a newer live deploy, a wait_deploy
81
+ // recovery when a newer deploy is in flight, and ask_user when it
82
+ // can't determine current state — surface the right hint per branch.
83
+ await writeLine(ctx, `${pc.yellow("!")} ${result.summary}`);
84
+ if (result.url) {
85
+ await writeLine(ctx, pc.dim(` Live URL: ${result.url}`));
86
+ }
87
+ if (result.recovery.nextAction === "wait_deploy") {
88
+ const args = result.recovery.args;
89
+ if (args.app && args.deployId) {
90
+ await writeLine(ctx, pc.dim(` Next: percher deploys inspect ${args.deployId} --app ${args.app}`));
91
+ }
92
+ }
93
+ else if (result.recovery.nextAction === "ask_user" ||
94
+ result.recovery.nextAction === "run_doctor") {
95
+ // FUTURE12 Phase 8 — resolver couldn't determine current state
96
+ // (latest deploy also failed/replaced, or listDeploys errored).
97
+ // Hand off to doctor as the spec's locked fallback line.
98
+ const appName = result.app?.name;
99
+ if (appName) {
100
+ await writeLine(ctx, pc.dim(` Next: percher doctor --app ${appName}`));
101
+ }
102
+ else {
103
+ await writeLine(ctx, pc.dim(" Next: percher doctor"));
104
+ }
105
+ }
106
+ return;
107
+ }
108
+ case "failed": {
109
+ await writeLine(ctx, `${pc.red("✗")} ${result.error?.title ?? "Deployment failed"}`);
110
+ if (result.error?.explanation) {
111
+ await writeLine(ctx, ` ${result.error.explanation}`);
112
+ }
113
+ if (result.error?.rawErrorMessage) {
114
+ // The classifier turns "Worker /deployer/run failed (502): upstream
115
+ // timeout after 30s" into a friendly explanation; keep the raw
116
+ // string visible too because it carries the load-bearing details
117
+ // (status code, hostname) support will ask for.
118
+ await writeLine(ctx, ` ${pc.dim(`Details: ${result.error.rawErrorMessage}`)}`);
119
+ }
120
+ if (result.error?.suggestion) {
121
+ await writeLine(ctx, ` ${pc.dim(result.error.suggestion)}`);
122
+ }
123
+ if (result.error?.missingEnvVars && result.error.missingEnvVars.length > 0) {
124
+ await writeLine(ctx, "");
125
+ await writeLine(ctx, pc.bold("Missing env vars:"));
126
+ for (const k of result.error.missingEnvVars) {
127
+ await writeLine(ctx, ` ${k}`);
128
+ }
129
+ await writeLine(ctx, pc.dim(` Set with: percher env set ${result.error.missingEnvVars[0]}=...`));
130
+ }
131
+ if (result.error?.relevantFiles && result.error.relevantFiles.length > 0) {
132
+ await writeLine(ctx, "");
133
+ await writeLine(ctx, pc.bold("Check these files:"));
134
+ for (const f of result.error.relevantFiles) {
135
+ await writeLine(ctx, ` ${f}`);
136
+ }
137
+ }
138
+ if (result.error?.buildLogTail) {
139
+ await writeLine(ctx, "");
140
+ const lines = result.error.buildLogTail.split("\n");
141
+ await writeLine(ctx, `${pc.bold("Build log")} ${pc.dim(`(last ${lines.length} lines)`)}`);
142
+ for (const line of lines) {
143
+ await writeLine(ctx, ` ${line}`);
144
+ }
145
+ if (result.app?.id && result.deployment?.id) {
146
+ await writeLine(ctx, "");
147
+ await writeLine(ctx, pc.dim(`Full log: percher deploys inspect ${result.deployment.id} --app ${result.app.name}`));
148
+ }
149
+ }
150
+ throw new SilentExitError();
151
+ }
152
+ case "live": {
153
+ const timing = result.timing ? ` (${result.timing.totalSeconds}s)` : "";
154
+ await writeLine(ctx, `${pc.green("✓")} Published to ${result.url}${timing}`);
155
+ // Build-cache state. We surface this on every successful publish
156
+ // because hiding it caused a stale-image bug to go undiagnosed
157
+ // for three deploys in a row (kvittakvitto, 2026-05-01). When
158
+ // hit=true and the user expected new behavior, this single line
159
+ // points them at `--no-cache` directly.
160
+ if (result.cacheHit === true) {
161
+ await writeLine(ctx, pc.dim(" Build cache: hit (reused image — re-run with --no-cache if your changes aren't reflected)"));
162
+ }
163
+ else if (result.cacheHit === false) {
164
+ await writeLine(ctx, pc.dim(" Build cache: miss (fresh build)"));
165
+ }
166
+ if (result.replacedPreview) {
167
+ await writeLine(ctx, pc.dim(" (replaced previous preview — free plan keeps 1 preview slot per app)"));
168
+ }
169
+ // Show QR code for preview deploys
170
+ if (options.preview && result.url) {
171
+ try {
172
+ const qr = await core.qrToTerminal(result.url);
173
+ await writeLine(ctx, "");
174
+ await writeLine(ctx, pc.dim("Scan to preview on mobile:"));
175
+ await writeLine(ctx, qr);
176
+ }
177
+ catch {
178
+ /* QR generation is nice-to-have */
179
+ }
180
+ }
181
+ if (result.firstDeploy) {
182
+ await writeLine(ctx, "");
183
+ await writeLine(ctx, pc.bold("First deploy — next steps:"));
184
+ await writeLine(ctx, ` ${pc.cyan("percher dev")} watch for changes and re-deploy`);
185
+ await writeLine(ctx, ` ${pc.cyan("percher env set KEY")} add environment variables`);
186
+ await writeLine(ctx, ` ${pc.cyan("percher logs")} stream live logs`);
187
+ }
188
+ return;
189
+ }
190
+ default:
191
+ return assertNever(result.status, result.summary);
192
+ }
193
+ }
194
+ export function registerAppsCommands(cli, ctx) {
195
+ cli
196
+ .command("init", "Generate percher.toml for this project")
197
+ .option("--force", "Overwrite existing percher.toml")
198
+ .option("--name <name>", "Override detected app name")
199
+ .action(async (options) => {
200
+ const result = await core.init(ctx, { force: options.force, name: options.name });
201
+ await writeLine(ctx, `${pc.green("✓")} wrote ${result.path}`);
202
+ });
203
+ cli
204
+ .command("publish", "Publish this project to Percher (recommended deploy command)")
205
+ .option("--force", "Skip size warnings")
206
+ .option("--preview", "Deploy as preview (does not replace the live version)")
207
+ .option("-m, --message <msg>", "Deploy note (visible in deploy history)")
208
+ .option("--dry-run", "Show what would be deployed (file count, bytes) without uploading")
209
+ .option("--no-cache", "Skip image-cache lookup and force a fresh build (use when you suspect cached image is stale)")
210
+ .action(async (options) => {
211
+ const { detectCiBranchMessage } = await import("../ci-env");
212
+ let messageOverride = options.message;
213
+ if (options.preview && !options.message) {
214
+ const ci = detectCiBranchMessage(process.env);
215
+ if (ci) {
216
+ messageOverride = ci.message;
217
+ await writeLine(ctx, pc.dim(`Auto-detected ${ci.source} branch — using deploy note "${ci.message}"`));
218
+ }
219
+ }
220
+ const result = await core.publish(ctx, {
221
+ force: options.force,
222
+ preview: options.preview,
223
+ message: messageOverride,
224
+ dryRun: options.dryRun,
225
+ noCache: options.cache === false,
226
+ });
227
+ // FUTURE12 Phase 8 — exhaustive switch over PublishStatus lives
228
+ // in handlePublishResult so a future status addition fails type-
229
+ // check at the assertNever default rather than silently falling
230
+ // through to a misleading "Published to undefined" message.
231
+ await handlePublishResult(ctx, result, { preview: options.preview });
232
+ });
233
+ cli
234
+ .command("redeploy [deployId]", "Re-run an existing deploy without re-uploading source")
235
+ .option("--app <name>", "App name (defaults to percher.toml app.name)")
236
+ .action(async (deployId, options) => {
237
+ const result = await core.redeploy(ctx, {
238
+ app: options.app,
239
+ deployId,
240
+ });
241
+ if (result.status === "needs_login") {
242
+ await writeLine(ctx, `${pc.red("✗")} Not logged in. Run: percher login`);
243
+ throw new SilentExitError();
244
+ }
245
+ if (result.status === "failed") {
246
+ await writeLine(ctx, `${pc.red("✗")} ${result.error?.title ?? "Redeploy failed"}`);
247
+ if (result.error?.explanation) {
248
+ await writeLine(ctx, ` ${result.error.explanation}`);
249
+ }
250
+ if (result.error?.suggestion) {
251
+ await writeLine(ctx, ` ${pc.dim(result.error.suggestion)}`);
252
+ }
253
+ if (result.error?.problems && result.error.problems.length > 0) {
254
+ await writeLine(ctx, "");
255
+ await writeLine(ctx, pc.bold("Build problems:"));
256
+ for (const p of result.error.problems) {
257
+ const loc = p.file
258
+ ? ` ${pc.dim(`${p.file}${p.line ? `:${p.line}` : ""}${p.column ? `:${p.column}` : ""}`)}`
259
+ : "";
260
+ await writeLine(ctx, ` ${pc.red(p.code)}${loc} ${p.message}`);
261
+ if (p.hint)
262
+ await writeLine(ctx, ` ${pc.dim(`→ ${p.hint}`)}`);
263
+ }
264
+ }
265
+ throw new SilentExitError();
266
+ }
267
+ const timing = result.timing ? ` (${result.timing.totalSeconds.toFixed(0)}s)` : "";
268
+ await writeLine(ctx, `${pc.green("✓")} Redeployed to ${result.url}${timing}`);
269
+ });
270
+ cli
271
+ .command("push", "Package and deploy this project")
272
+ .option("--dry-run", "Show what would be deployed, don't upload")
273
+ .option("--force", "Skip size warnings")
274
+ .option("--preview", "Deploy as preview (does not replace the live version)")
275
+ .option("--no-cache", "Skip image-cache lookup and force a fresh build (use when you suspect cached image is stale)")
276
+ .action(async (options) => {
277
+ const result = await core.push(ctx, {
278
+ dryRun: options.dryRun,
279
+ force: options.force,
280
+ preview: options.preview,
281
+ noCache: options.cache === false,
282
+ });
283
+ if (result.dryRun) {
284
+ await writeLine(ctx, `Dry run: ${result.fileCount} files, ${(result.bytes / 1024).toFixed(1)} KB`);
285
+ }
286
+ else {
287
+ const url = result.deployment?.previewUrl ?? result.deployment?.url ?? result.app.url;
288
+ const label = result.deployment?.previewUrl ? "preview live at" : "deployed to";
289
+ await writeLine(ctx, `${pc.green("✓")} ${label} ${url}`);
290
+ // Mirror the publish output: every successful deploy shows
291
+ // whether the image came from cache or was freshly built. Same
292
+ // wording as publish so users learn one signal across both
293
+ // commands. Codex P3 follow-up on 9e5ceee — push was blind to
294
+ // the exact stale-cache scenario --no-cache was added to fix.
295
+ if (result.deployment?.cacheHit === true) {
296
+ await writeLine(ctx, pc.dim(" Build cache: hit (reused image — re-run with --no-cache if your changes aren't reflected)"));
297
+ }
298
+ else if (result.deployment?.cacheHit === false) {
299
+ await writeLine(ctx, pc.dim(" Build cache: miss (fresh build)"));
300
+ }
301
+ }
302
+ });
303
+ cli
304
+ .command("rename <name> [app]", "Rename an app (changes its subdomain)")
305
+ .action(async (name, app) => {
306
+ const result = await core.rename(ctx, { app, name });
307
+ await writeLine(ctx, `${pc.green("✓")} Renamed to ${result.name} — now live at ${result.url}`);
308
+ await writeLine(ctx, ` Previous name: ${result.previousName} (reserved for 60 days)`);
309
+ await writeLine(ctx, ` ${pc.dim(`Next rename available in ${result.cooldownDays} days`)}`);
310
+ });
311
+ cli
312
+ .command("open [app]", "Open the app URL in your browser")
313
+ .action(async (app) => {
314
+ const url = await core.open(ctx, { app });
315
+ await writeLine(ctx, url);
316
+ });
317
+ cli
318
+ .command("dashboard [tab]", "Open the dashboard for this app (optionally on a specific tab)")
319
+ .option("--app <name>", "App name (overrides percher.toml)")
320
+ .action(async (tab, options) => {
321
+ const url = await core.dashboard(ctx, { app: options.app, tab });
322
+ await writeLine(ctx, url);
323
+ });
324
+ cli
325
+ .command("create [name]", "Create a new app from a template")
326
+ .option("--template <template>", "Template to use (node, python, static, nextjs, hono, express)")
327
+ .option("--force", "Overwrite existing files in target directory")
328
+ .option("--list-templates", "List available templates")
329
+ .action(async (name, options) => {
330
+ if (options.listTemplates) {
331
+ const templates = core.listTemplates();
332
+ await writeLine(ctx, pc.bold("Available templates:"));
333
+ for (const t of templates) {
334
+ await writeLine(ctx, ` ${t}`);
335
+ }
336
+ return;
337
+ }
338
+ if (!name) {
339
+ throw new Error("App name is required. Usage: percher create <name> --template <template>");
340
+ }
341
+ if (!options.template) {
342
+ const templates = core.listTemplates();
343
+ await writeLine(ctx, `${pc.red("✗")} --template is required. Available: ${templates.join(", ")}`);
344
+ return;
345
+ }
346
+ const result = await core.create(ctx, {
347
+ name,
348
+ template: options.template,
349
+ force: options.force,
350
+ });
351
+ await writeLine(ctx, `${pc.green("✓")} created ${result.name} from ${result.template}`);
352
+ for (const f of result.files) {
353
+ await writeLine(ctx, ` ${pc.dim(f)}`);
354
+ }
355
+ await writeLine(ctx, "");
356
+ await writeLine(ctx, "Next steps:");
357
+ await writeLine(ctx, ` cd ${result.name}`);
358
+ await writeLine(ctx, " bunx percher publish");
359
+ });
360
+ cli
361
+ .command("delete [app]", "Delete an app permanently")
362
+ .option("--yes", "Skip confirmation prompt")
363
+ .action(async (app, options) => {
364
+ const name = app ?? core.readPercherTomlAppName(ctx.cwd);
365
+ if (!name) {
366
+ await writeLine(ctx, `${pc.red("✗")} No app specified and no percher.toml found.`);
367
+ throw new SilentExitError();
368
+ }
369
+ if (!options.yes) {
370
+ const answer = await ctx.prompt(`${pc.red("!")} This will permanently delete ${pc.bold(name)} and all its data. Type the app name to confirm:`);
371
+ if (answer.trim() !== name) {
372
+ await writeLine(ctx, "Cancelled.");
373
+ return;
374
+ }
375
+ }
376
+ await core.deleteApp(ctx, { app: name, confirm: true });
377
+ await writeLine(ctx, `${pc.green("✓")} Deleted ${name}`);
378
+ });
379
+ cli
380
+ .command("resume [app]", "Resume an app suspended for inactivity")
381
+ .action(async (app) => {
382
+ const result = await core.resume(ctx, { app });
383
+ await writeLine(ctx, `${pc.green("✓")} ${result.message}`);
384
+ });
385
+ cli
386
+ .command("doctor [app]", "Check app health and connectivity")
387
+ .option("--json", "Output as JSON")
388
+ .action(async (app, options) => {
389
+ const result = await core.doctor(ctx, { app, json: options.json });
390
+ if (options.json) {
391
+ await writeLine(ctx, JSON.stringify(result, null, 2));
392
+ }
393
+ else {
394
+ await writeLine(ctx, `${pc.bold("Percher Doctor")}`);
395
+ await writeLine(ctx, "──────────────");
396
+ await writeLine(ctx, "");
397
+ for (const check of result.checks) {
398
+ const icon = check.status === "pass"
399
+ ? pc.green("✓")
400
+ : check.status === "fail"
401
+ ? pc.red("✗")
402
+ : check.status === "warn"
403
+ ? pc.yellow("!")
404
+ : pc.dim("—");
405
+ await writeLine(ctx, `${icon} ${pc.bold(check.name.padEnd(20))} ${check.message}`);
406
+ }
407
+ await writeLine(ctx, "");
408
+ // Per-check counter — still raw, reflects what's in `checks[]`.
409
+ // Color/exit driven by `result.status` (the verdict) below, not
410
+ // by raw failed-count: a `fail` cwd-toml row with --app passed
411
+ // is informational, not blocking, and we don't want to red-flag
412
+ // the run when doctor's verdict is `ok` or `in_progress`.
413
+ const counter = `${result.passed}/${result.total} checks passed`;
414
+ const counterColor = result.status === "ok" ? pc.green : result.status === "in_progress" ? pc.yellow : pc.red;
415
+ await writeLine(ctx, counterColor(counter));
416
+ // Verdict line — the actionable summary doctor produces. This
417
+ // is what humans should read when there's any divergence
418
+ // between the per-check fails and the overall verdict.
419
+ await writeLine(ctx, result.summary);
420
+ }
421
+ // Signal non-zero exit for CI/agent use. Codex round 2 fix on
422
+ // Phase 2a: the previous `result.failed > 0` gate caused
423
+ // `doctor --app foo` against a healthy app to exit 1 just
424
+ // because the cwd toml happened to be invalid. Drive exit off
425
+ // the verdict instead — `ok` and `in_progress` are not failures
426
+ // a CI step should fail on; `blocked`/`needs_action` are.
427
+ if (result.status === "blocked" || result.status === "needs_action") {
428
+ throw new SilentExitError();
429
+ }
430
+ });
431
+ cli
432
+ .command("dev [app]", "Watch files and deploy on changes")
433
+ .option("--confirm", "Prompt before each push (default: auto-push)")
434
+ .action(async (app, options) => {
435
+ const controller = new AbortController();
436
+ // Handle Ctrl+C gracefully
437
+ const onSignal = () => controller.abort();
438
+ process.on("SIGINT", onSignal);
439
+ process.on("SIGTERM", onSignal);
440
+ await writeLine(ctx, pc.bold("Percher Dev"));
441
+ await writeLine(ctx, "───────────");
442
+ await writeLine(ctx, "");
443
+ try {
444
+ await core.dev(ctx, { app }, {
445
+ signal: controller.signal,
446
+ async writeLine(line) {
447
+ const timestamp = new Date().toLocaleTimeString("sv-SE", { hour12: false });
448
+ await writeLine(ctx, `${pc.dim(`[${timestamp}]`)} ${line}`);
449
+ },
450
+ async onFilesChanged(_files) {
451
+ if (options.confirm) {
452
+ const answer = await ctx.prompt("Push changes? [Y/n]", { default: "y" });
453
+ return /^y(es)?$|^$/i.test(answer.trim());
454
+ }
455
+ return true; // auto-push by default
456
+ },
457
+ });
458
+ }
459
+ finally {
460
+ process.removeListener("SIGINT", onSignal);
461
+ process.removeListener("SIGTERM", onSignal);
462
+ }
463
+ await writeLine(ctx, "");
464
+ await writeLine(ctx, pc.dim("Dev session ended."));
465
+ });
466
+ }
467
+ //# sourceMappingURL=apps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"apps.js","sourceRoot":"","sources":["../../../src/commands/apps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Context } from "@percher/core";
2
+ import type { CAC } from "cac";
3
+ export declare function registerAuthCommands(cli: CAC, ctx: Context): void;
4
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAI/B,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,GAAG,IAAI,CAiBjE"}
@@ -0,0 +1,21 @@
1
+ import * as core from "@percher/core";
2
+ import pc from "picocolors";
3
+ import { SilentExitError, writeLine } from "../cli-utils";
4
+ export function registerAuthCommands(cli, ctx) {
5
+ cli
6
+ .command("login", "Authenticate with Percher")
7
+ .option("--token <token>", "Dev: skip browser, use a token")
8
+ .option("--api-url <url>", "Override API URL")
9
+ .action(async (options) => {
10
+ await core.login(ctx, { token: options.token, apiUrl: options.apiUrl });
11
+ });
12
+ cli.command("whoami", "Show the signed-in user").action(async () => {
13
+ if (!ctx.client.token) {
14
+ await writeLine(ctx, `${pc.red("✗")} Not logged in. Run: percher login`);
15
+ throw new SilentExitError();
16
+ }
17
+ const me = await core.whoami(ctx);
18
+ await writeLine(ctx, `Signed in as ${me.email} (${me.userId})`);
19
+ });
20
+ }
21
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../../src/commands/auth.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,IAAI,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE1D,MAAM,UAAU,oBAAoB,CAAC,GAAQ,EAAE,GAAY;IACzD,GAAG;SACA,OAAO,CAAC,OAAO,EAAE,2BAA2B,CAAC;SAC7C,MAAM,CAAC,iBAAiB,EAAE,gCAAgC,CAAC;SAC3D,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;SAC7C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEL,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE;QACjE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YACtB,MAAM,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;YACzE,MAAM,IAAI,eAAe,EAAE,CAAC;QAC9B,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,SAAS,CAAC,GAAG,EAAE,gBAAgB,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAClE,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { Context } from "@percher/core";
2
+ import type { CAC } from "cac";
3
+ export declare function registerDataCommands(cli: CAC, ctx: Context, argv: string[]): void;
4
+ //# sourceMappingURL=data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../src/commands/data.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAI/B,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CA4LjF"}