create-urateam 0.1.44 → 0.1.46

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.
@@ -0,0 +1,492 @@
1
+ /**
2
+ * Config resolution and file generation for urateam sidecar scaffolding.
3
+ * Handles license decoding, .env composition, secret generation, and creating
4
+ * the .urateam/ directory structure.
5
+ */
6
+ import { mkdirSync, writeFileSync, cpSync, readFileSync, readdirSync, statSync, existsSync, appendFileSync, } from "fs";
7
+ import { join, dirname } from "path";
8
+ import { fileURLToPath } from "url";
9
+ import { randomBytes } from "crypto";
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = dirname(__filename);
12
+ /**
13
+ * Tier → implicit feature set, mirroring packages/core/src/license.ts.
14
+ * The runtime grants Pro tier ALL Pro features regardless of whether the
15
+ * JWT carries an explicit `features` array — so the scaffolder must do
16
+ * the same expansion or it'll skip tier-gated prompts for licenses
17
+ * issued without `--features`.
18
+ */
19
+ const PRO_FEATURES = [
20
+ "slack-interface",
21
+ "conflict-detection",
22
+ "deep-review",
23
+ "approval-workflows",
24
+ "multi-repo",
25
+ "stage-models",
26
+ "advanced-automerge",
27
+ ];
28
+ const ENTERPRISE_FEATURES = [
29
+ ...PRO_FEATURES,
30
+ "sso",
31
+ "audit-log",
32
+ "spend-caps",
33
+ "rbac",
34
+ "cost-dashboard",
35
+ "cost-roi",
36
+ "org-policy",
37
+ "pm-agent-governance",
38
+ ];
39
+ /**
40
+ * Decode a urateam license JWT payload WITHOUT verifying the signature.
41
+ *
42
+ * The scaffolder doesn't ship the public key (would bloat the package and
43
+ * couple it to a specific signing-key generation), and a malformed JWT here
44
+ * just produces a wrong prompt flow which is recoverable by editing .env
45
+ * after the fact. Production verification happens at runtime in the agent
46
+ * via packages/core/src/license.ts against the embedded public key.
47
+ *
48
+ * If the JWT has no explicit `features` array, this expands by tier to
49
+ * match runtime semantics. An explicit (possibly trimmed) array in the
50
+ * JWT takes precedence — operators can ship Pro licenses with a subset
51
+ * of features and the scaffolder honors that.
52
+ *
53
+ * Returns null on any parse failure.
54
+ */
55
+ export function decodeLicense(jwt) {
56
+ if (!jwt)
57
+ return null;
58
+ const segments = jwt.split(".");
59
+ if (segments.length !== 3)
60
+ return null;
61
+ try {
62
+ const payloadJson = Buffer.from(segments[1].replace(/-/g, "+").replace(/_/g, "/") +
63
+ "=".repeat((4 - (segments[1].length % 4)) % 4), "base64").toString("utf-8");
64
+ const payload = JSON.parse(payloadJson);
65
+ const tier = payload.tier === "pro" || payload.tier === "enterprise" ? payload.tier : "oss";
66
+ // Honor an explicit features array (operators can issue restricted licenses).
67
+ // Otherwise expand by tier to match the runtime's tier-implicit feature set.
68
+ let features;
69
+ if (Array.isArray(payload.features) && payload.features.length > 0) {
70
+ features = payload.features;
71
+ }
72
+ else if (tier === "pro") {
73
+ features = [...PRO_FEATURES];
74
+ }
75
+ else if (tier === "enterprise") {
76
+ features = [...ENTERPRISE_FEATURES];
77
+ }
78
+ else {
79
+ features = [];
80
+ }
81
+ return {
82
+ tier,
83
+ features,
84
+ customerId: payload.sub,
85
+ expiresAt: payload.exp ? new Date(payload.exp * 1000) : undefined,
86
+ };
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ }
92
+ /**
93
+ * Build the `.env` content for a scaffolded urateam sidecar.
94
+ *
95
+ * Pure function: takes already-resolved values, returns the file string.
96
+ * Auto-generation of missing secrets is the caller's responsibility (see
97
+ * resolveSecrets below) so this stays trivially testable.
98
+ */
99
+ export function buildEnv(options) {
100
+ const lines = [];
101
+ const push = (line) => lines.push(line);
102
+ const blank = () => lines.push("");
103
+ push("# === Linear (REQUIRED) ===");
104
+ push(`LINEAR_API_KEY=${options.linearApiKey}`);
105
+ // Comment out when blank so the runtime's "is required" check fails fast
106
+ // with the right message instead of silently treating "" as a valid secret.
107
+ if (options.linearWebhookSecret) {
108
+ push(`LINEAR_WEBHOOK_SECRET=${options.linearWebhookSecret}`);
109
+ }
110
+ else {
111
+ push("# LINEAR_WEBHOOK_SECRET= # paste from Linear's webhook config UI");
112
+ }
113
+ push(`LINEAR_TEAM_ID=${options.linearTeamId}`);
114
+ blank();
115
+ push("# === Repository (REQUIRED) ===");
116
+ push(`REPO_URL=${options.repoUrl}`);
117
+ push(`REPO_DEFAULT_BRANCH=${options.defaultBranch}`);
118
+ // REPO_TEAM_ID is the map key for repoConfigs[teamId] — defaulted to
119
+ // LINEAR_TEAM_ID for single-team / single-repo setups (the env-var path).
120
+ // Multi-repo Pro deployments use repos.config.ts instead and can ignore
121
+ // this var. See packages/cli/src/commands/start.ts:50.
122
+ push(`REPO_TEAM_ID=${options.linearTeamId}`);
123
+ blank();
124
+ push("# === Anthropic auth ===");
125
+ if (options.anthropicApiKey) {
126
+ push(`ANTHROPIC_API_KEY=${options.anthropicApiKey}`);
127
+ }
128
+ else {
129
+ push("# ANTHROPIC_API_KEY= # blank → run `docker compose exec agent claude login` after deploy");
130
+ }
131
+ blank();
132
+ push("# === Pro license (blank = OSS tier) ===");
133
+ push(`URATEAM_LICENSE_KEY=${options.licenseKey}`);
134
+ blank();
135
+ push("# === GitHub auth (REQUIRED for PR creation) ===");
136
+ push("# Either run `docker compose exec agent gh auth login` after deploy,");
137
+ push("# or set the GitHub App trio below:");
138
+ push("# GITHUB_APP_ID=");
139
+ push("# GITHUB_PRIVATE_KEY_PATH=/run/gh-app.pem");
140
+ push("# GITHUB_INSTALLATION_ID=");
141
+ // GITHUB_WEBHOOK_SECRET is shared with GitHub's webhook config. Auto-genned
142
+ // by default (operator pastes the value INTO GitHub when creating the
143
+ // webhook). Blank means PR-comment re-trigger feature stays disabled.
144
+ if (options.githubWebhookSecret) {
145
+ push(`GITHUB_WEBHOOK_SECRET=${options.githubWebhookSecret}`);
146
+ }
147
+ else {
148
+ push("# GITHUB_WEBHOOK_SECRET= # paste here AND into GitHub webhook config to enable PR-comment re-runs");
149
+ }
150
+ blank();
151
+ push("# === Database ===");
152
+ push(`POSTGRES_PASSWORD=${options.postgresPassword}`);
153
+ blank();
154
+ if (options.deployMode === "production") {
155
+ push("# === Domain (production deploy) ===");
156
+ push(`DOMAIN=${options.domain}`);
157
+ push(`CADDY_EMAIL=${options.caddyEmail}`);
158
+ blank();
159
+ }
160
+ push("# === Dashboard auth ===");
161
+ push(`DASHBOARD_USER=${options.dashboardUser}`);
162
+ push(`DASHBOARD_PASSWORD=${options.dashboardPassword}`);
163
+ if (options.dashboardBasePath) {
164
+ push(`DASHBOARD_BASE_PATH=${options.dashboardBasePath}`);
165
+ }
166
+ else {
167
+ push("# DASHBOARD_BASE_PATH= # set with leading slash, no trailing, when behind a path prefix");
168
+ }
169
+ blank();
170
+ push("# === Concurrency ===");
171
+ push(`MAX_CONCURRENT_RUNS=${options.maxConcurrentRuns}`);
172
+ blank();
173
+ // AGENT_BYPASS_PERMISSIONS — Claude Code permission-mode override. Runtime
174
+ // logic at packages/core/src/executor/permissions.ts:
175
+ // - root user (UID 0): all permission flags ignored (Claude Code refuses)
176
+ // - else, env var unset: implement/reproduce=acceptEdits, test/review=default
177
+ // - else, env var =true: bypassPermissions for all stages
178
+ // The hardened compose template runs the container as root, so this var is
179
+ // a no-op for production VPS deploys. For local `pnpm dev` (non-root), the
180
+ // test/review stages would hang on interactive prompts without this — local
181
+ // mode therefore defaults to true.
182
+ push("# === Agent permissions (Claude Code) ===");
183
+ if (options.deployMode === "local") {
184
+ push("AGENT_BYPASS_PERMISSIONS=true");
185
+ }
186
+ else {
187
+ push("# AGENT_BYPASS_PERMISSIONS=true # no-op in root containers; uncomment if running container as a non-root user");
188
+ }
189
+ blank();
190
+ if (options.pmAgent) {
191
+ push("# === PM Agent (Pro: slack-interface) ===");
192
+ push("PM_AGENT_ENABLED=true");
193
+ push(`PM_AGENT_TEAM_IDS=${options.pmAgent.teamIds}`);
194
+ push(`PM_AGENT_SLACK_CHANNEL_ID=${options.pmAgent.slackChannelId}`);
195
+ push(`PM_AGENT_DAILY_TOKEN_BUDGET=${options.pmAgent.dailyTokenBudget ?? 5_000_000}`);
196
+ push(`PM_AGENT_MAX_IN_FLIGHT=3`);
197
+ push(`SLACK_BOT_TOKEN=${options.pmAgent.slackBotToken}`);
198
+ push(`SLACK_SIGNING_SECRET=${options.pmAgent.slackSigningSecret}`);
199
+ blank();
200
+ }
201
+ else {
202
+ push("# === PM Agent (Pro: slack-interface) — fill in to enable ===");
203
+ push("# PM_AGENT_ENABLED=true");
204
+ push("# PM_AGENT_TEAM_IDS=");
205
+ push("# PM_AGENT_SLACK_CHANNEL_ID=");
206
+ push("# PM_AGENT_DAILY_TOKEN_BUDGET=5000000");
207
+ push("# PM_AGENT_MAX_IN_FLIGHT=3");
208
+ push("# SLACK_BOT_TOKEN=");
209
+ push("# SLACK_SIGNING_SECRET=");
210
+ blank();
211
+ }
212
+ push("# === GitHub PR-comment re-trigger (optional, gated by GITHUB_WEBHOOK_SECRET above) ===");
213
+ if (options.githubFeedback) {
214
+ if (options.githubFeedback.autoTrigger === false) {
215
+ push("GITHUB_FEEDBACK_AUTO_TRIGGER=false");
216
+ }
217
+ else {
218
+ push("# GITHUB_FEEDBACK_AUTO_TRIGGER=true # default — fire on any qualifying review/comment");
219
+ }
220
+ if (options.githubFeedback.triggerKeyword) {
221
+ push(`GITHUB_FEEDBACK_TRIGGER_KEYWORD=${options.githubFeedback.triggerKeyword}`);
222
+ }
223
+ else {
224
+ push("# GITHUB_FEEDBACK_TRIGGER_KEYWORD= # require this keyword in the comment to fire");
225
+ }
226
+ if (options.githubFeedback.allowedReviewers) {
227
+ push(`GITHUB_FEEDBACK_ALLOWED_REVIEWERS=${options.githubFeedback.allowedReviewers}`);
228
+ }
229
+ else {
230
+ push("# GITHUB_FEEDBACK_ALLOWED_REVIEWERS= # comma-separated GitHub usernames");
231
+ }
232
+ if (options.githubFeedback.botLogins) {
233
+ push(`GITHUB_FEEDBACK_BOT_LOGINS=${options.githubFeedback.botLogins}`);
234
+ }
235
+ else {
236
+ push("# GITHUB_FEEDBACK_BOT_LOGINS= # comma-separated bot logins, e.g. github-actions[bot]");
237
+ }
238
+ }
239
+ else {
240
+ push("# GITHUB_FEEDBACK_AUTO_TRIGGER=true # default — fire on any qualifying review/comment");
241
+ push("# GITHUB_FEEDBACK_TRIGGER_KEYWORD= # require this keyword in the comment to fire");
242
+ push("# GITHUB_FEEDBACK_ALLOWED_REVIEWERS= # comma-separated GitHub usernames");
243
+ push("# GITHUB_FEEDBACK_BOT_LOGINS= # comma-separated bot logins, e.g. github-actions[bot]");
244
+ }
245
+ blank();
246
+ push("# === Pipeline notifications (no Pro license needed) ===");
247
+ if (options.slackWebhookUrl) {
248
+ push(`SLACK_WEBHOOK_URL=${options.slackWebhookUrl}`);
249
+ }
250
+ else {
251
+ push("# SLACK_WEBHOOK_URL= # Slack incoming-webhook for pipeline event posts");
252
+ }
253
+ if (options.discordWebhookUrl) {
254
+ push(`DISCORD_WEBHOOK_URL=${options.discordWebhookUrl}`);
255
+ }
256
+ else {
257
+ push("# DISCORD_WEBHOOK_URL= # Discord webhook for pipeline event posts");
258
+ }
259
+ blank();
260
+ push("# === Per-stage agent budget overrides (urateam#38) ===");
261
+ if (options.agentProfiles && Object.keys(options.agentProfiles).length > 0) {
262
+ // Bare (unquoted) JSON. Surrounding single-quotes break Docker Compose's
263
+ // env_file parser — same gotcha as the env_file no-interpolation issue.
264
+ // Both Compose and Node 22 process.loadEnvFile read everything after `=`
265
+ // to EOL and JSON has no whitespace / `=` outside string literals.
266
+ push(`URATEAM_AGENT_PROFILES=${JSON.stringify(options.agentProfiles)}`);
267
+ }
268
+ else {
269
+ push('# URATEAM_AGENT_PROFILES={"test":{"maxTurns":50,"maxInputTokens":80000}}');
270
+ }
271
+ blank();
272
+ if (options.openrouterApiKey && options.reviewModels && options.reviewModels.length > 0) {
273
+ push("");
274
+ push("# OpenRouter multi-model review fanout (BEC-134)");
275
+ push(`OPENROUTER_API_KEY=${options.openrouterApiKey}`);
276
+ push(`REVIEW_MODELS=${options.reviewModels.join(",")}`);
277
+ }
278
+ push("# === Optional ===");
279
+ push("# LOG_LEVEL=info");
280
+ push("");
281
+ push("# Additional tunables (worktree TTL, repo clone dir, agent run dir, etc.)");
282
+ push("# documented in .env.example next to this file. Keep that file as the");
283
+ push("# canonical reference; this .env is generated from prompts.");
284
+ return lines.join("\n") + "\n";
285
+ }
286
+ export function resolveSecrets(options) {
287
+ const autoGen = options.autoGenSecrets ?? true;
288
+ const generated = {};
289
+ let dashboardPassword = options.dashboardPassword ?? "";
290
+ let postgresPassword = options.postgresPassword ?? "";
291
+ let githubWebhookSecret = options.githubWebhookSecret ?? "";
292
+ if (autoGen) {
293
+ // base64url avoids `+`, `/`, `=` which can trip strict env-file parsers
294
+ // and a few HMAC validators in the wild.
295
+ if (!dashboardPassword) {
296
+ dashboardPassword = randomBytes(18).toString("base64url");
297
+ generated.dashboardPassword = dashboardPassword;
298
+ }
299
+ if (!postgresPassword) {
300
+ postgresPassword = randomBytes(24).toString("base64url");
301
+ generated.postgresPassword = postgresPassword;
302
+ }
303
+ if (!githubWebhookSecret) {
304
+ // hex (not base64url) for compatibility with the broadest set of HMAC
305
+ // validators that operators paste this into. Operator pastes the same
306
+ // value into GitHub's webhook config so signatures match.
307
+ githubWebhookSecret = randomBytes(32).toString("hex");
308
+ generated.githubWebhookSecret = githubWebhookSecret;
309
+ }
310
+ }
311
+ return { dashboardPassword, postgresPassword, githubWebhookSecret, generated };
312
+ }
313
+ /**
314
+ * Scaffold a urateam sidecar into a project directory.
315
+ *
316
+ * Creates:
317
+ * - <projectDir>/.urateam/ — isolated urateam config + deps
318
+ * - package.json — depends on @urateam/cli
319
+ * - .env — Linear keys, webhook secret, etc.
320
+ * - .env.example
321
+ * - Dockerfile
322
+ * - docker-compose.yml
323
+ * - Caddyfile — reverse proxy + auto-HTTPS
324
+ * - README.md — how to run the sidecar
325
+ * - <projectDir>/CLAUDE.md — project conventions (only if absent)
326
+ * - <projectDir>/README.md — project readme (only if absent)
327
+ * - <projectDir>/.gitignore — ensures .urateam/.env is ignored
328
+ *
329
+ * The project root `package.json` is NOT touched. Existing `.env` and
330
+ * `package.json` inside `.urateam/` are preserved on re-run.
331
+ */
332
+ export function scaffold(options) {
333
+ const { projectDir, projectName, linearApiKey, linearTeamId, repoUrl, defaultBranch } = options;
334
+ mkdirSync(projectDir, { recursive: true });
335
+ let templateDir = join(__dirname, "..", "template");
336
+ if (!statSync(templateDir, { throwIfNoEntry: false })?.isDirectory()) {
337
+ templateDir = join(__dirname, "..", "..", "template");
338
+ }
339
+ const urateamDir = join(projectDir, ".urateam");
340
+ mkdirSync(urateamDir, { recursive: true });
341
+ const urateamTemplateDir = join(templateDir, ".urateam");
342
+ for (const entry of readdirSync(urateamTemplateDir)) {
343
+ if (entry === ".env")
344
+ continue;
345
+ const src = join(urateamTemplateDir, entry);
346
+ const dest = join(urateamDir, entry);
347
+ cpSync(src, dest, { recursive: true, force: true });
348
+ }
349
+ const pkgPath = join(urateamDir, "package.json");
350
+ if (!existsSync(pkgPath)) {
351
+ const pkg = {
352
+ name: `${projectName}-urateam`,
353
+ private: true,
354
+ type: "module",
355
+ scripts: {
356
+ dev: "ura dev",
357
+ start: "ura start",
358
+ },
359
+ dependencies: {
360
+ "@urateam/cli": "^0.1.4",
361
+ },
362
+ };
363
+ writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + "\n");
364
+ }
365
+ const license = decodeLicense(options.licenseKey);
366
+ const todos = [];
367
+ const { dashboardPassword, postgresPassword, githubWebhookSecret, generated } = resolveSecrets(options);
368
+ // --- Compose .env from inputs + resolved secrets ---
369
+ const envPath = join(urateamDir, ".env");
370
+ if (!existsSync(envPath)) {
371
+ const linearWebhookSecret = options.linearWebhookSecret ?? "";
372
+ if (!linearWebhookSecret) {
373
+ todos.push("LINEAR_WEBHOOK_SECRET — paste from Linear's webhook config UI " +
374
+ "(Workspace settings → API → Webhooks).");
375
+ }
376
+ if (!options.licenseKey) {
377
+ todos.push("URATEAM_LICENSE_KEY — Pro features (PM agent, Slack interface, multi-repo, " +
378
+ "deep-review, etc.) stay disabled until you set this.");
379
+ }
380
+ if (license?.tier &&
381
+ license.tier !== "oss" &&
382
+ license.features.includes("slack-interface") &&
383
+ !options.pmAgent) {
384
+ todos.push("PM_AGENT_* — your license includes `slack-interface`. Fill in the " +
385
+ "PM_AGENT_* + SLACK_* lines in .env to enable it.");
386
+ }
387
+ if (!options.anthropicApiKey) {
388
+ todos.push("Anthropic auth — run `docker compose exec agent claude login` after the stack is up " +
389
+ "(or set ANTHROPIC_API_KEY in .env for headless API auth).");
390
+ }
391
+ todos.push("GitHub auth — run `docker compose exec agent gh auth login` after the stack is up " +
392
+ "(or set the GITHUB_APP_* trio in .env for app-based auth).");
393
+ if (options.deployMode === "production" && !options.domain) {
394
+ todos.push("DOMAIN — set in .env before running `docker compose up`.");
395
+ }
396
+ if (options.deployMode === "production" && !options.caddyEmail) {
397
+ todos.push("CADDY_EMAIL — recommended for Let's Encrypt expiry warnings.");
398
+ }
399
+ if (!options.autoGenSecrets) {
400
+ if (!options.dashboardPassword)
401
+ todos.push("DASHBOARD_PASSWORD — fill in .env.");
402
+ if (!options.postgresPassword)
403
+ todos.push("POSTGRES_PASSWORD — fill in .env.");
404
+ }
405
+ // GITHUB_WEBHOOK_SECRET is optional (only needed for PR-comment re-runs).
406
+ // No TODO when blank — operator who didn't paste it in Stage 6 doesn't want
407
+ // the feature. But if they DID set GITHUB_FEEDBACK_*, the missing secret
408
+ // makes those values dead — flag that.
409
+ if (options.githubFeedback && !githubWebhookSecret) {
410
+ todos.push("GITHUB_WEBHOOK_SECRET — required for GITHUB_FEEDBACK_* to take effect; " +
411
+ "feedback values without the secret are silently ignored at runtime.");
412
+ }
413
+ const envContent = buildEnv({
414
+ linearApiKey,
415
+ linearTeamId,
416
+ repoUrl,
417
+ defaultBranch,
418
+ deployMode: options.deployMode ?? "local",
419
+ linearWebhookSecret,
420
+ domain: options.domain ?? "",
421
+ caddyEmail: options.caddyEmail ?? "",
422
+ anthropicApiKey: options.anthropicApiKey ?? "",
423
+ licenseKey: options.licenseKey ?? "",
424
+ dashboardUser: options.dashboardUser ?? "admin",
425
+ dashboardPassword,
426
+ dashboardBasePath: options.dashboardBasePath ?? "",
427
+ postgresPassword,
428
+ githubWebhookSecret,
429
+ maxConcurrentRuns: options.maxConcurrentRuns ?? 3,
430
+ pmAgent: options.pmAgent,
431
+ githubFeedback: options.githubFeedback,
432
+ slackWebhookUrl: options.slackWebhookUrl ?? "",
433
+ discordWebhookUrl: options.discordWebhookUrl ?? "",
434
+ agentProfiles: options.agentProfiles,
435
+ openrouterApiKey: options.openrouterApiKey ?? "",
436
+ reviewModels: options.reviewModels ?? [],
437
+ });
438
+ writeFileSync(envPath, envContent);
439
+ }
440
+ // --- Project root files: copy only if absent ---
441
+ const rootFilesWithPlaceholder = ["CLAUDE.md", "README.md"];
442
+ for (const file of rootFilesWithPlaceholder) {
443
+ const dest = join(projectDir, file);
444
+ if (existsSync(dest))
445
+ continue;
446
+ const src = join(templateDir, file);
447
+ if (!existsSync(src))
448
+ continue;
449
+ const content = readFileSync(src, "utf-8");
450
+ writeFileSync(dest, content.replace(/\{\{PROJECT_NAME\}\}/g, projectName));
451
+ }
452
+ const gitignorePath = join(projectDir, ".gitignore");
453
+ if (!existsSync(gitignorePath)) {
454
+ writeFileSync(gitignorePath, URATEAM_GITIGNORE);
455
+ }
456
+ else {
457
+ const existing = readFileSync(gitignorePath, "utf-8");
458
+ const hasBareEntry = existing
459
+ .split(/\r?\n/)
460
+ .some((line) => line.trim() === ".urateam/.env");
461
+ if (!hasBareEntry) {
462
+ const separator = existing.endsWith("\n") ? "\n" : "\n\n";
463
+ appendFileSync(gitignorePath, separator + URATEAM_GITIGNORE);
464
+ }
465
+ }
466
+ return { urateamDir, license, generatedSecrets: generated, todos };
467
+ }
468
+ /**
469
+ * Normalize a user-typed dashboard base path: strip trailing slashes, ensure
470
+ * leading slash, treat blank as undefined. Eliminates the "I typed /ateam/
471
+ * and now the dashboard 404s" footgun.
472
+ */
473
+ export function normalizeBasePath(input) {
474
+ if (!input)
475
+ return undefined;
476
+ const trimmed = input.trim();
477
+ if (!trimmed)
478
+ return undefined;
479
+ const noTrailingSlash = trimmed.replace(/\/+$/, "");
480
+ if (!noTrailingSlash)
481
+ return undefined; // operator typed only `/` or `///`
482
+ return noTrailingSlash.startsWith("/") ? noTrailingSlash : `/${noTrailingSlash}`;
483
+ }
484
+ const URATEAM_GITIGNORE = `# urateam sidecar
485
+ .urateam/.env
486
+ .urateam/.env.*
487
+ !.urateam/.env.example
488
+ .urateam/node_modules/
489
+ .urateam/dist/
490
+ .urateam/pnpm-lock.yaml
491
+ `;
492
+ //# sourceMappingURL=scaffold.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { type ScaffoldOptions } from "./scaffold.js";
2
+ export interface WizardResult {
3
+ projectDir: string;
4
+ projectName: string;
5
+ scaffoldOptions: ScaffoldOptions;
6
+ /** The deploy mode selected by the user — "local" or "production". */
7
+ deployMode: string;
8
+ domain: string | undefined;
9
+ dashboardBasePath: string | undefined;
10
+ anthropicAuth: string;
11
+ }
12
+ /**
13
+ * Run the interactive 9-stage wizard. Returns a WizardResult for the main
14
+ * flow, or null when the early-exit path was handled internally (e.g. an
15
+ * existing .env was detected and template files were refreshed).
16
+ */
17
+ export declare function runWizard(arg: string): Promise<WizardResult | null>;
18
+ //# sourceMappingURL=wizard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wizard.d.ts","sourceRoot":"","sources":["../src/wizard.ts"],"names":[],"mappings":"AAOA,OAAO,EAIL,KAAK,eAAe,EAGrB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,eAAe,CAAC;IACjC,sEAAsE;IACtE,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,iBAAiB,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,aAAa,EAAE,MAAM,CAAC;CACvB;AAED;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAyWzE"}