create-urateam 0.1.45 → 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.
- package/dist/__tests__/scaffold.test.js +8 -8
- package/dist/__tests__/scaffold.test.js.map +1 -1
- package/dist/index.d.ts +3 -141
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +19 -822
- package/dist/index.js.map +1 -1
- package/dist/scaffold.d.ts +197 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +492 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/wizard.d.ts +18 -0
- package/dist/wizard.d.ts.map +1 -0
- package/dist/wizard.js +346 -0
- package/dist/wizard.js.map +1 -0
- package/package.json +1 -1
package/dist/scaffold.js
ADDED
|
@@ -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":"AAAA;;;;GAIG;AACH,OAAO,EACL,SAAS,EACT,aAAa,EACb,MAAM,EACN,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,UAAU,EACV,cAAc,GACf,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AAErC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AA4HtC;;;;;;GAMG;AACH,MAAM,YAAY,GAAG;IACnB,iBAAiB;IACjB,oBAAoB;IACpB,aAAa;IACb,oBAAoB;IACpB,YAAY;IACZ,cAAc;IACd,oBAAoB;CACrB,CAAC;AACF,MAAM,mBAAmB,GAAG;IAC1B,GAAG,YAAY;IACf,KAAK;IACL,WAAW;IACX,YAAY;IACZ,MAAM;IACN,gBAAgB;IAChB,UAAU;IACV,YAAY;IACZ,qBAAqB;CACtB,CAAC;AAEF;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,aAAa,CAAC,GAA8B;IAC1D,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAC7B,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;YAC/C,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAChD,QAAQ,CACT,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACpB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAKrC,CAAC;QACF,MAAM,IAAI,GACR,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;QAEjF,8EAA8E;QAC9E,6EAA6E;QAC7E,IAAI,QAAkB,CAAC;QACvB,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACnE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAC9B,CAAC;aAAM,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1B,QAAQ,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC;QAC/B,CAAC;aAAM,IAAI,IAAI,KAAK,YAAY,EAAE,CAAC;YACjC,QAAQ,GAAG,CAAC,GAAG,mBAAmB,CAAC,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,EAAE,CAAC;QAChB,CAAC;QAED,OAAO;YACL,IAAI;YACJ,QAAQ;YACR,UAAU,EAAE,OAAO,CAAC,GAAG;YACvB,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAClE,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,QAAQ,CACtB,OAyBC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEnC,IAAI,CAAC,6BAA6B,CAAC,CAAC;IACpC,IAAI,CAAC,kBAAkB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC/C,yEAAyE;IACzE,4EAA4E;IAC5E,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAChC,IAAI,CAAC,yBAAyB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,mEAAmE,CAAC,CAAC;IAC5E,CAAC;IACD,IAAI,CAAC,kBAAkB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC/C,KAAK,EAAE,CAAC;IAER,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACxC,IAAI,CAAC,YAAY,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IACpC,IAAI,CAAC,uBAAuB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACrD,qEAAqE;IACrE,0EAA0E;IAC1E,wEAAwE;IACxE,uDAAuD;IACvD,IAAI,CAAC,gBAAgB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7C,KAAK,EAAE,CAAC;IAER,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACjC,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,IAAI,CAAC,qBAAqB,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,2FAA2F,CAAC,CAAC;IACpG,CAAC;IACD,KAAK,EAAE,CAAC;IAER,IAAI,CAAC,0CAA0C,CAAC,CAAC;IACjD,IAAI,CAAC,uBAAuB,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAClD,KAAK,EAAE,CAAC;IAER,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACzD,IAAI,CAAC,sEAAsE,CAAC,CAAC;IAC7E,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAC5C,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACzB,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAClD,IAAI,CAAC,2BAA2B,CAAC,CAAC;IAClC,4EAA4E;IAC5E,sEAAsE;IACtE,sEAAsE;IACtE,IAAI,OAAO,CAAC,mBAAmB,EAAE,CAAC;QAChC,IAAI,CAAC,yBAAyB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;IAC/D,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,oGAAoG,CAAC,CAAC;IAC7G,CAAC;IACD,KAAK,EAAE,CAAC;IAER,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC3B,IAAI,CAAC,qBAAqB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;IACtD,KAAK,EAAE,CAAC;IAER,IAAI,OAAO,CAAC,UAAU,KAAK,YAAY,EAAE,CAAC;QACxC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QAC7C,IAAI,CAAC,UAAU,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACjC,IAAI,CAAC,eAAe,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;QAC1C,KAAK,EAAE,CAAC;IACV,CAAC;IAED,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACjC,IAAI,CAAC,kBAAkB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAChD,IAAI,CAAC,sBAAsB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC9B,IAAI,CAAC,uBAAuB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,0FAA0F,CAAC,CAAC;IACnG,CAAC;IACD,KAAK,EAAE,CAAC;IAER,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAC9B,IAAI,CAAC,uBAAuB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACzD,KAAK,EAAE,CAAC;IAER,2EAA2E;IAC3E,sDAAsD;IACtD,4EAA4E;IAC5E,gFAAgF;IAChF,4DAA4D;IAC5D,2EAA2E;IAC3E,2EAA2E;IAC3E,4EAA4E;IAC5E,mCAAmC;IACnC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAClD,IAAI,OAAO,CAAC,UAAU,KAAK,OAAO,EAAE,CAAC;QACnC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IACxC,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,gHAAgH,CAAC,CAAC;IACzH,CAAC;IACD,KAAK,EAAE,CAAC;IAER,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAClD,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAC9B,IAAI,CAAC,qBAAqB,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;QACrD,IAAI,CAAC,6BAA6B,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,+BAA+B,OAAO,CAAC,OAAO,CAAC,gBAAgB,IAAI,SAAS,EAAE,CAAC,CAAC;QACrF,IAAI,CAAC,0BAA0B,CAAC,CAAC;QACjC,IAAI,CAAC,mBAAmB,OAAO,CAAC,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;QACzD,IAAI,CAAC,wBAAwB,OAAO,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACnE,KAAK,EAAE,CAAC;IACV,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,+DAA+D,CAAC,CAAC;QACtE,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAChC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QAC7B,IAAI,CAAC,8BAA8B,CAAC,CAAC;QACrC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QAC9C,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACnC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QAC3B,IAAI,CAAC,yBAAyB,CAAC,CAAC;QAChC,KAAK,EAAE,CAAC;IACV,CAAC;IAED,IAAI,CAAC,yFAAyF,CAAC,CAAC;IAChG,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,IAAI,OAAO,CAAC,cAAc,CAAC,WAAW,KAAK,KAAK,EAAE,CAAC;YACjD,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAC7C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,wFAAwF,CAAC,CAAC;QACjG,CAAC;QACD,IAAI,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC;YAC1C,IAAI,CAAC,mCAAmC,OAAO,CAAC,cAAc,CAAC,cAAc,EAAE,CAAC,CAAC;QACnF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,mFAAmF,CAAC,CAAC;QAC5F,CAAC;QACD,IAAI,OAAO,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;YAC5C,IAAI,CAAC,qCAAqC,OAAO,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACvF,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,0EAA0E,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC;YACrC,IAAI,CAAC,8BAA8B,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,uFAAuF,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,wFAAwF,CAAC,CAAC;QAC/F,IAAI,CAAC,mFAAmF,CAAC,CAAC;QAC1F,IAAI,CAAC,0EAA0E,CAAC,CAAC;QACjF,IAAI,CAAC,uFAAuF,CAAC,CAAC;IAChG,CAAC;IACD,KAAK,EAAE,CAAC;IAER,IAAI,CAAC,0DAA0D,CAAC,CAAC;IACjE,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,IAAI,CAAC,qBAAqB,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,yEAAyE,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;QAC9B,IAAI,CAAC,uBAAuB,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC3D,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,oEAAoE,CAAC,CAAC;IAC7E,CAAC;IACD,KAAK,EAAE,CAAC;IAER,IAAI,CAAC,yDAAyD,CAAC,CAAC;IAChE,IAAI,OAAO,CAAC,aAAa,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3E,yEAAyE;QACzE,wEAAwE;QACxE,yEAAyE;QACzE,mEAAmE;QACnE,IAAI,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,0EAA0E,CAAC,CAAC;IACnF,CAAC;IACD,KAAK,EAAE,CAAC;IAER,IAAI,OAAO,CAAC,gBAAgB,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxF,IAAI,CAAC,EAAE,CAAC,CAAC;QACT,IAAI,CAAC,kDAAkD,CAAC,CAAC;QACzD,IAAI,CAAC,sBAAsB,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,iBAAiB,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,CAAC,oBAAoB,CAAC,CAAC;IAC3B,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACzB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,IAAI,CAAC,2EAA2E,CAAC,CAAC;IAClF,IAAI,CAAC,uEAAuE,CAAC,CAAC;IAC9E,IAAI,CAAC,6DAA6D,CAAC,CAAC;IACpE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAwB;IAMrD,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,IAAI,IAAI,CAAC;IAC/C,MAAM,SAAS,GAAuC,EAAE,CAAC;IAEzD,IAAI,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,IAAI,EAAE,CAAC;IACxD,IAAI,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC;IACtD,IAAI,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,EAAE,CAAC;IAE5D,IAAI,OAAO,EAAE,CAAC;QACZ,wEAAwE;QACxE,yCAAyC;QACzC,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,iBAAiB,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAC1D,SAAS,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;QAClD,CAAC;QACD,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACtB,gBAAgB,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YACzD,SAAS,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QAChD,CAAC;QACD,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,sEAAsE;YACtE,sEAAsE;YACtE,0DAA0D;YAC1D,mBAAmB,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACtD,SAAS,CAAC,mBAAmB,GAAG,mBAAmB,CAAC;QACtD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC;AACjF,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,QAAQ,CAAC,OAAwB;IAC/C,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,GAAG,OAAO,CAAC;IAEhG,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,IAAI,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC;QACrE,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;IACxD,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IAChD,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,MAAM,kBAAkB,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;IACzD,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,kBAAkB,CAAC,EAAE,CAAC;QACpD,IAAI,KAAK,KAAK,MAAM;YAAE,SAAS;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;IACjD,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG;YACV,IAAI,EAAE,GAAG,WAAW,UAAU;YAC9B,OAAO,EAAE,IAAI;YACb,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE;gBACP,GAAG,EAAE,SAAS;gBACd,KAAK,EAAE,WAAW;aACnB;YACD,YAAY,EAAE;gBACZ,cAAc,EAAE,QAAQ;aACzB;SACF,CAAC;QACF,aAAa,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAClD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,SAAS,EAAE,GAC3E,cAAc,CAAC,OAAO,CAAC,CAAC;IAE1B,sDAAsD;IACtD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACzC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,MAAM,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,EAAE,CAAC;QAC9D,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CACR,gEAAgE;gBAC9D,wCAAwC,CAC3C,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CACR,6EAA6E;gBAC3E,sDAAsD,CACzD,CAAC;QACJ,CAAC;QACD,IACE,OAAO,EAAE,IAAI;YACb,OAAO,CAAC,IAAI,KAAK,KAAK;YACtB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,iBAAiB,CAAC;YAC5C,CAAC,OAAO,CAAC,OAAO,EAChB,CAAC;YACD,KAAK,CAAC,IAAI,CACR,oEAAoE;gBAClE,kDAAkD,CACrD,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CACR,sFAAsF;gBACpF,2DAA2D,CAC9D,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CACR,oFAAoF;YAClF,4DAA4D,CAC/D,CAAC;QACF,IAAI,OAAO,CAAC,UAAU,KAAK,YAAY,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;YAC3D,KAAK,CAAC,IAAI,CAAC,0DAA0D,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,OAAO,CAAC,UAAU,KAAK,YAAY,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC/D,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAC5B,IAAI,CAAC,OAAO,CAAC,iBAAiB;gBAAE,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;YACjF,IAAI,CAAC,OAAO,CAAC,gBAAgB;gBAAE,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACjF,CAAC;QACD,0EAA0E;QAC1E,4EAA4E;QAC5E,yEAAyE;QACzE,uCAAuC;QACvC,IAAI,OAAO,CAAC,cAAc,IAAI,CAAC,mBAAmB,EAAE,CAAC;YACnD,KAAK,CAAC,IAAI,CACR,yEAAyE;gBACvE,qEAAqE,CACxE,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC;YAC1B,YAAY;YACZ,YAAY;YACZ,OAAO;YACP,aAAa;YACb,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,OAAO;YACzC,mBAAmB;YACnB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,EAAE;YAC5B,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;YACpC,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,EAAE;YAC9C,UAAU,EAAE,OAAO,CAAC,UAAU,IAAI,EAAE;YACpC,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,OAAO;YAC/C,iBAAiB;YACjB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,EAAE;YAClD,gBAAgB;YAChB,mBAAmB;YACnB,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,CAAC;YACjD,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,EAAE;YAC9C,iBAAiB,EAAE,OAAO,CAAC,iBAAiB,IAAI,EAAE;YAClD,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,gBAAgB,EAAE,OAAO,CAAC,gBAAgB,IAAI,EAAE;YAChD,YAAY,EAAE,OAAO,CAAC,YAAY,IAAI,EAAE;SACzC,CAAC,CAAC;QACH,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACrC,CAAC;IAED,kDAAkD;IAClD,MAAM,wBAAwB,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC5D,KAAK,MAAM,IAAI,IAAI,wBAAwB,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,UAAU,CAAC,IAAI,CAAC;YAAE,SAAS;QAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/B,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC3C,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,uBAAuB,EAAE,WAAW,CAAC,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACrD,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;QAC/B,aAAa,CAAC,aAAa,EAAE,iBAAiB,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,MAAM,QAAQ,GAAG,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,YAAY,GAAG,QAAQ;aAC1B,KAAK,CAAC,OAAO,CAAC;aACd,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,eAAe,CAAC,CAAC;QACnD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;YAC1D,cAAc,CAAC,aAAa,EAAE,SAAS,GAAG,iBAAiB,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACrE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAgC;IAChE,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAC/B,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACpD,IAAI,CAAC,eAAe;QAAE,OAAO,SAAS,CAAC,CAAC,mCAAmC;IAC3E,OAAO,eAAe,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,eAAe,EAAE,CAAC;AACnF,CAAC;AAED,MAAM,iBAAiB,GAAG;;;;;;;CAOzB,CAAC"}
|
package/dist/wizard.d.ts
ADDED
|
@@ -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"}
|