@nairon-ai/aegis 0.4.3 → 0.4.5

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/README.md CHANGED
@@ -68,11 +68,13 @@ If you see `No ready bugs found`, check `MONITORED_REPO`, exact label names, iss
68
68
 
69
69
  During `setup`, choose one:
70
70
 
71
- - `One-click GitHub App`: recommended. Aegis opens a browser page, creates the app, asks you to install it on the repo, then saves the credentials.
71
+ - `One-click GitHub App`: recommended. Aegis opens a browser page, creates the app, asks you to install it on the repo, then saves the credentials. If you rerun setup later, Aegis reuses the existing app instead of creating another one.
72
72
  - `GitHub token`: quick local test if you already know how to create fine-grained GitHub tokens.
73
73
  - `Paste existing GitHub App credentials`: only if you already made an app manually.
74
74
 
75
- Aegis auto-detects `git remote origin` when you run setup inside your product repo, so it normally will not ask which repo to monitor. If no GitHub origin exists, it asks for `owner/repo` or a full GitHub URL like `https://github.com/KeyLead-Team/keylead`.
75
+ Aegis auto-detects `git remote origin` and origin's default branch when you run setup inside your product repo, so it normally will not ask which repo or base branch to use. If no GitHub origin exists, it asks for `owner/repo` or a full GitHub URL like `https://github.com/KeyLead-Team/keylead`.
76
+
77
+ If you connect Linear, Aegis fetches your Linear teams after you paste the API key and lets you choose by name, for example `Engineering (ENG)`. You do not need to hunt for Linear UUIDs manually.
76
78
 
77
79
  ### Deployed AFK Mode
78
80
 
@@ -1 +1 @@
1
- {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,YAAY,qDAKvB,CAAC;AAEH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAoCpD"}
1
+ {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAyBA,eAAO,MAAM,YAAY,qDAKvB,CAAC;AAEH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAoCpD"}
@@ -44,8 +44,8 @@ export async function runSetupWizard() {
44
44
  }
45
45
  catch (error) {
46
46
  if (error instanceof SetupCancelledError) {
47
- consola.log("\nSetup cancelled. No config changes were saved.");
48
- consola.log("If you already installed a GitHub App in the browser, uninstall it from GitHub if you do not want Aegis connected.");
47
+ consola.log("\nSetup cancelled before the final save.");
48
+ consola.log("If GitHub App credentials were created in the browser, Aegis saved them immediately so rerun setup can reuse them.");
49
49
  process.exitCode = 130;
50
50
  return;
51
51
  }
@@ -75,11 +75,27 @@ async function setupRepo(config) {
75
75
  ]);
76
76
  config.monitoredRepo = normalizeGitHubRepo(await promptText("Repo to monitor:", undefined));
77
77
  }
78
- printStep("Step 2: choose the base branch", [
79
- "This is the branch Aegis will open PRs against.",
80
- "Most repos use main. If your repo uses master, develop, or staging, enter that.",
81
- ]);
82
- config.baseBranch = await promptText("Base branch:", config.baseBranch ?? detectCurrentBranch());
78
+ const detectedBaseBranch = detectOriginDefaultBranch();
79
+ if (detectedBaseBranch) {
80
+ config.baseBranch = detectedBaseBranch;
81
+ printStep("Step 2: base branch Aegis will target", [
82
+ `Using ${detectedBaseBranch} from origin's default branch.`,
83
+ "Aegis will open PRs against this branch.",
84
+ ]);
85
+ }
86
+ else if (config.baseBranch) {
87
+ printStep("Step 2: base branch Aegis will target", [
88
+ `Using ${config.baseBranch} from existing .aegis config.`,
89
+ "Aegis will open PRs against this branch.",
90
+ ]);
91
+ }
92
+ else {
93
+ config.baseBranch = "main";
94
+ printStep("Step 2: base branch Aegis will target", [
95
+ "Could not detect origin's default branch.",
96
+ "Using main. If your repo uses a different default branch, edit BASE_BRANCH in .aegis/.env after setup.",
97
+ ]);
98
+ }
83
99
  }
84
100
  async function setupGitHub(config) {
85
101
  printStep("Step 3: give Aegis GitHub access", [
@@ -87,59 +103,29 @@ async function setupGitHub(config) {
87
103
  "If you are unsure, choose the one-click GitHub App. It opens GitHub in your browser and avoids manual tokens.",
88
104
  "Use a GitHub token only if you already know how to create fine-grained tokens.",
89
105
  ]);
90
- const method = await promptSelect("Auth method:", [
91
- { label: "One-click GitHub App (recommended)", value: "app-flow" },
92
- { label: "GitHub token (quick local test)", value: "token" },
93
- { label: "Paste existing GitHub App credentials", value: "app-manual" },
94
- ]);
95
- if (method === "token") {
96
- printStep("Create a fine-grained GitHub token", [
97
- "Open: https://github.com/settings/personal-access-tokens/new",
98
- "Token name: Aegis",
99
- "Repository access: Only select repositories, then choose the repo from Step 1.",
100
- "Repository permissions: Contents read/write, Issues read/write, Pull requests read/write.",
101
- "Metadata stays read-only automatically.",
102
- "Click Generate token, then paste the token here. It usually starts with github_pat_.",
103
- "Keep it secret. Aegis saves it to .aegis/.env, which should not be committed.",
106
+ if (hasGitHubAppConfig(config)) {
107
+ consola.info(`Using existing GitHub App installation ${config.githubInstallationId}. Rerun disconnect if you want to remove it.`);
108
+ config.githubToken = undefined;
109
+ }
110
+ else if (config.githubToken) {
111
+ consola.info("Using existing GitHub token from .aegis config.");
112
+ }
113
+ else {
114
+ const method = await promptSelect("Auth method:", [
115
+ { label: "One-click GitHub App (recommended)", value: "app-flow" },
116
+ { label: "GitHub token (quick local test)", value: "token" },
117
+ { label: "Paste existing GitHub App credentials", value: "app-manual" },
104
118
  ]);
105
- config.githubToken = await promptText("Paste GitHub token:", config.githubToken);
106
- config.githubAppId = undefined;
107
- config.githubAppPrivateKey = undefined;
108
- config.githubInstallationId = undefined;
109
- }
110
- else if (method === "app-flow") {
111
- if (!config.monitoredRepo) {
112
- consola.warn("Set the monitored repo first.");
113
- return;
119
+ if (method === "token") {
120
+ await setupGitHubToken(config);
114
121
  }
115
- printStep("Create the GitHub App in your browser", [
116
- "Aegis will open a local setup page.",
117
- "Click Create GitHub App.",
118
- "Then click Install and choose Only select repositories.",
119
- "Select the repo from Step 1, then approve the install.",
120
- "When GitHub sends you back, this CLI saves the credentials automatically.",
121
- ]);
122
- try {
123
- const app = await runGitHubAppFlow({
124
- monitoredRepo: config.monitoredRepo,
125
- workerUrl: config.workerUrl,
126
- });
127
- config.githubAppId = app.appId;
128
- config.githubAppPrivateKey = Buffer.from(app.privateKey, "utf-8").toString("base64");
129
- config.githubInstallationId = app.installationId;
130
- config.githubWebhookSecret = app.webhookSecret;
131
- config.githubToken = undefined;
132
- consola.success("Saved GitHub App credentials from GitHub.");
122
+ else if (method === "app-flow") {
123
+ await setupGitHubAppFlow(config);
133
124
  }
134
- catch (error) {
135
- consola.warn(error instanceof Error ? error.message : String(error));
136
- consola.info("Falling back to manual GitHub App credentials.");
125
+ else {
137
126
  await setupGitHubAppManual(config);
138
127
  }
139
128
  }
140
- else {
141
- await setupGitHubAppManual(config);
142
- }
143
129
  if (config.githubWebhookSecret) {
144
130
  consola.info("GitHub webhook secret is already configured.");
145
131
  return;
@@ -157,6 +143,52 @@ async function setupGitHub(config) {
157
143
  consola.info("Use this same value when you add the GitHub App or repo webhook.");
158
144
  }
159
145
  }
146
+ async function setupGitHubToken(config) {
147
+ printStep("Create a fine-grained GitHub token", [
148
+ "Open: https://github.com/settings/personal-access-tokens/new",
149
+ "Token name: Aegis",
150
+ "Repository access: Only select repositories, then choose the repo from Step 1.",
151
+ "Repository permissions: Contents read/write, Issues read/write, Pull requests read/write.",
152
+ "Metadata stays read-only automatically.",
153
+ "Click Generate token, then paste the token here. It usually starts with github_pat_.",
154
+ "Keep it secret. Aegis saves it to .aegis/.env, which should not be committed.",
155
+ ]);
156
+ config.githubToken = await promptText("Paste GitHub token:", config.githubToken);
157
+ config.githubAppId = undefined;
158
+ config.githubAppPrivateKey = undefined;
159
+ config.githubInstallationId = undefined;
160
+ }
161
+ async function setupGitHubAppFlow(config) {
162
+ if (!config.monitoredRepo) {
163
+ consola.warn("Set the monitored repo first.");
164
+ return;
165
+ }
166
+ printStep("Create the GitHub App in your browser", [
167
+ "Aegis will open a local setup page.",
168
+ "Click Create GitHub App.",
169
+ "Then click Install and choose Only select repositories.",
170
+ "Select the repo from Step 1, then approve the install.",
171
+ "When GitHub sends you back, this CLI saves the credentials automatically.",
172
+ ]);
173
+ try {
174
+ const app = await runGitHubAppFlow({
175
+ monitoredRepo: config.monitoredRepo,
176
+ workerUrl: config.workerUrl,
177
+ });
178
+ config.githubAppId = app.appId;
179
+ config.githubAppPrivateKey = Buffer.from(app.privateKey, "utf-8").toString("base64");
180
+ config.githubInstallationId = app.installationId;
181
+ config.githubWebhookSecret = app.webhookSecret;
182
+ config.githubToken = undefined;
183
+ saveConfig(config);
184
+ consola.success(`Saved GitHub App credentials to ${resolveEnvFileForWrite()}.`);
185
+ }
186
+ catch (error) {
187
+ consola.warn(error instanceof Error ? error.message : String(error));
188
+ consola.info("Falling back to manual GitHub App credentials.");
189
+ await setupGitHubAppManual(config);
190
+ }
191
+ }
160
192
  async function setupGitHubAppManual(config) {
161
193
  printStep("Paste existing GitHub App credentials", [
162
194
  "Use this only if you already created a GitHub App manually.",
@@ -181,6 +213,9 @@ async function setupGitHubAppManual(config) {
181
213
  config.githubInstallationId = await promptText("GitHub App installation ID:", config.githubInstallationId);
182
214
  config.githubToken = undefined;
183
215
  }
216
+ function hasGitHubAppConfig(config) {
217
+ return Boolean(config.githubAppId && config.githubAppPrivateKey && config.githubInstallationId);
218
+ }
184
219
  async function setupLinear(config) {
185
220
  printStep("Step 4: optional Linear connection", [
186
221
  "Use this only if your team tracks bugs in Linear.",
@@ -195,6 +230,7 @@ async function setupLinear(config) {
195
230
  "Aegis uses it to read ready bug tickets and comment with status updates.",
196
231
  ]);
197
232
  config.linearApiKey = await promptText("Linear API key:", config.linearApiKey);
233
+ await setupLinearTeam(config);
198
234
  printStep("Linear webhook secret", [
199
235
  "This protects Linear webhook calls after deploy.",
200
236
  "Choose yes and Aegis will generate one.",
@@ -203,12 +239,6 @@ async function setupLinear(config) {
203
239
  config.linearWebhookSecret = generateSecret
204
240
  ? crypto.randomUUID()
205
241
  : await promptText("Linear webhook signing secret:", config.linearWebhookSecret);
206
- printStep("Linear team/project", [
207
- "Team ID is required so Aegis knows which Linear team to watch.",
208
- "Project ID is optional. Leave it blank to watch the whole team.",
209
- ]);
210
- config.linearTeamId = await promptText("Linear team ID:", config.linearTeamId);
211
- config.linearProjectId = await promptText("Linear project ID (optional):", config.linearProjectId);
212
242
  printStep("Linear statuses and labels", [
213
243
  "These names must match your Linear workflow.",
214
244
  "If your team uses the default names, press Enter through these prompts.",
@@ -219,6 +249,66 @@ async function setupLinear(config) {
219
249
  config.linearBlockedStatus = await promptText("Linear blocked status name:", config.linearBlockedStatus ?? "Blocked");
220
250
  config.linearBugLabel = await promptText("Linear bug label:", config.linearBugLabel ?? "bug");
221
251
  }
252
+ async function setupLinearTeam(config) {
253
+ if (!config.linearApiKey)
254
+ return;
255
+ printStep("Linear team/project", [
256
+ "Aegis will fetch your Linear teams so you can pick one by name.",
257
+ "Project ID is optional. Leave it blank to watch the whole team.",
258
+ ]);
259
+ try {
260
+ const teams = await fetchLinearTeams(config.linearApiKey);
261
+ if (teams.length === 0) {
262
+ consola.warn("No Linear teams were returned for this API key.");
263
+ config.linearTeamId = await promptText("Linear team ID:", config.linearTeamId);
264
+ }
265
+ else if (teams.length === 1) {
266
+ const team = teams[0];
267
+ config.linearTeamId = team.id;
268
+ consola.info(`Using Linear team ${formatLinearTeam(team)}.`);
269
+ }
270
+ else {
271
+ config.linearTeamId = await promptSelect("Linear team:", teams.map((team) => ({
272
+ label: formatLinearTeam(team),
273
+ value: team.id,
274
+ })), config.linearTeamId);
275
+ }
276
+ }
277
+ catch (error) {
278
+ consola.warn(`Could not fetch Linear teams: ${error instanceof Error ? error.message : String(error)}`);
279
+ consola.info("Falling back to manual Linear team ID.");
280
+ config.linearTeamId = await promptText("Linear team ID:", config.linearTeamId);
281
+ }
282
+ config.linearProjectId = await promptText("Linear project ID (optional, blank = whole team):", config.linearProjectId);
283
+ }
284
+ async function fetchLinearTeams(apiKey) {
285
+ const result = await linearGraphql(apiKey, `query Teams {
286
+ teams {
287
+ nodes { id name key }
288
+ }
289
+ }`);
290
+ return result.teams.nodes.sort((a, b) => a.name.localeCompare(b.name));
291
+ }
292
+ async function linearGraphql(apiKey, query) {
293
+ const response = await fetch("https://api.linear.app/graphql", {
294
+ method: "POST",
295
+ headers: {
296
+ Authorization: apiKey,
297
+ "Content-Type": "application/json",
298
+ },
299
+ body: JSON.stringify({ query }),
300
+ });
301
+ const payload = (await response.json());
302
+ if (!response.ok || payload.errors?.length) {
303
+ throw new Error(`Linear API failed: ${response.status} ${payload.errors?.map((error) => error.message).join("; ") ?? ""}`);
304
+ }
305
+ if (!payload.data)
306
+ throw new Error("Linear API returned no data.");
307
+ return payload.data;
308
+ }
309
+ function formatLinearTeam(team) {
310
+ return `${team.name} (${team.key})`;
311
+ }
222
312
  async function setupAutomation(config) {
223
313
  printStep("Step 5: GitHub labels Aegis should watch", [
224
314
  "Aegis only picks up open issues with both labels.",
@@ -364,17 +454,44 @@ function detectOriginGitHubRepo() {
364
454
  return undefined;
365
455
  }
366
456
  }
367
- function detectCurrentBranch() {
457
+ function detectOriginDefaultBranch() {
458
+ const localRemoteHead = runGit([
459
+ "symbolic-ref",
460
+ "--quiet",
461
+ "--short",
462
+ "refs/remotes/origin/HEAD",
463
+ ]);
464
+ if (localRemoteHead?.startsWith("origin/")) {
465
+ return localRemoteHead.replace("origin/", "");
466
+ }
467
+ const remoteDetails = runGit(["remote", "show", "origin"]);
468
+ const remoteHead = remoteDetails?.match(/HEAD branch:\s*(.+)/)?.[1]?.trim();
469
+ if (remoteHead)
470
+ return remoteHead;
368
471
  try {
369
472
  const branch = readFileSync(".git/HEAD", "utf-8").trim();
370
473
  if (branch.startsWith("ref: refs/heads/")) {
371
- return branch.replace("ref: refs/heads/", "");
474
+ const currentBranch = branch.replace("ref: refs/heads/", "");
475
+ if (["main", "master", "develop", "development", "staging"].includes(currentBranch)) {
476
+ return currentBranch;
477
+ }
372
478
  }
373
479
  }
374
480
  catch {
375
- // Ignore and fall back to the normal default.
481
+ // Ignore and fall back below.
482
+ }
483
+ return undefined;
484
+ }
485
+ function runGit(args) {
486
+ try {
487
+ return execFileSync("git", args, {
488
+ encoding: "utf-8",
489
+ stdio: ["ignore", "pipe", "ignore"],
490
+ }).trim();
491
+ }
492
+ catch {
493
+ return undefined;
376
494
  }
377
- return "main";
378
495
  }
379
496
  function printStep(title, lines) {
380
497
  consola.log(`\n${title}`);
@@ -1 +1 @@
1
- {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAElC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAIvE,MAAM,mBAAoB,SAAQ,KAAK;IACtC;QACC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACnC,CAAC;CACD;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,aAAa,CAAC;IACzC,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,4BAA4B,EAAE;IAClE,KAAK,CAAC,GAAG;QACR,MAAM,cAAc,EAAE,CAAC;IACxB,CAAC;CACD,CAAC,CAAC;AAEH,MAAM,CAAC,KAAK,UAAU,cAAc;IACnC,IAAI,CAAC;QACJ,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,gBAAgB,EAAE,CAAC;QACjC,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QAE5B,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;QACxB,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAC1B,MAAM,eAAe,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAC5B,MAAM,WAAW,CAAC,MAAM,CAAC,CAAC;QAE1B,UAAU,CAAC,MAAM,CAAC,CAAC;QACnB,OAAO,CAAC,OAAO,CAAC,SAAS,sBAAsB,EAAE,EAAE,CAAC,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;QACjF,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAChE,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;QACvE,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CACV,oHAAoH,CACpH,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,GAAG,CAAC;YACvB,OAAO;QACR,CAAC;QACD,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,MAAsB;IAC9C,MAAM,YAAY,GAAG,sBAAsB,EAAE,CAAC;IAC9C,IAAI,YAAY,EAAE,CAAC;QAClB,MAAM,CAAC,aAAa,GAAG,YAAY,CAAC;QACpC,SAAS,CAAC,oCAAoC,EAAE;YAC/C,SAAS,YAAY,0BAA0B;YAC/C,wDAAwD;SACxD,CAAC,CAAC;IACJ,CAAC;SAAM,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;QACjC,SAAS,CAAC,oCAAoC,EAAE;YAC/C,SAAS,MAAM,CAAC,aAAa,+BAA+B;YAC5D,wDAAwD;SACxD,CAAC,CAAC;IACJ,CAAC;SAAM,CAAC;QACP,SAAS,CAAC,iDAAiD,EAAE;YAC5D,gDAAgD;YAChD,oFAAoF;YACpF,+BAA+B;SAC/B,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,GAAG,mBAAmB,CAAC,MAAM,UAAU,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC,CAAC;IAC7F,CAAC;IAED,SAAS,CAAC,gCAAgC,EAAE;QAC3C,iDAAiD;QACjD,iFAAiF;KACjF,CAAC,CAAC;IACH,MAAM,CAAC,UAAU,GAAG,MAAM,UAAU,CAAC,cAAc,EAAE,MAAM,CAAC,UAAU,IAAI,mBAAmB,EAAE,CAAC,CAAC;AAClG,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAsB;IAChD,SAAS,CAAC,kCAAkC,EAAE;QAC7C,mFAAmF;QACnF,+GAA+G;QAC/G,gFAAgF;KAChF,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,cAAc,EAAE;QACjD,EAAE,KAAK,EAAE,oCAAoC,EAAE,KAAK,EAAE,UAAU,EAAE;QAClE,EAAE,KAAK,EAAE,iCAAiC,EAAE,KAAK,EAAE,OAAO,EAAE;QAC5D,EAAE,KAAK,EAAE,uCAAuC,EAAE,KAAK,EAAE,YAAY,EAAE;KACvE,CAAC,CAAC;IAEH,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACxB,SAAS,CAAC,oCAAoC,EAAE;YAC/C,8DAA8D;YAC9D,mBAAmB;YACnB,gFAAgF;YAChF,2FAA2F;YAC3F,yCAAyC;YACzC,sFAAsF;YACtF,+EAA+E;SAC/E,CAAC,CAAC;QACH,MAAM,CAAC,WAAW,GAAG,MAAM,UAAU,CAAC,qBAAqB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;QACjF,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC;QAC/B,MAAM,CAAC,mBAAmB,GAAG,SAAS,CAAC;QACvC,MAAM,CAAC,oBAAoB,GAAG,SAAS,CAAC;IACzC,CAAC;SAAM,IAAI,MAAM,KAAK,UAAU,EAAE,CAAC;QAClC,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC;YAC3B,OAAO,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAC9C,OAAO;QACR,CAAC;QACD,SAAS,CAAC,uCAAuC,EAAE;YAClD,qCAAqC;YACrC,0BAA0B;YAC1B,yDAAyD;YACzD,wDAAwD;YACxD,2EAA2E;SAC3E,CAAC,CAAC;QACH,IAAI,CAAC;YACJ,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC;gBAClC,aAAa,EAAE,MAAM,CAAC,aAAa;gBACnC,SAAS,EAAE,MAAM,CAAC,SAAS;aAC3B,CAAC,CAAC;YACH,MAAM,CAAC,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC;YAC/B,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACrF,MAAM,CAAC,oBAAoB,GAAG,GAAG,CAAC,cAAc,CAAC;YACjD,MAAM,CAAC,mBAAmB,GAAG,GAAG,CAAC,aAAa,CAAC;YAC/C,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC;YAC/B,OAAO,CAAC,OAAO,CAAC,2CAA2C,CAAC,CAAC;QAC9D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACrE,OAAO,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;YAC/D,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;IACF,CAAC;SAAM,CAAC;QACP,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;QAC7D,OAAO;IACR,CAAC;IAED,SAAS,CAAC,uBAAuB,EAAE;QAClC,2DAA2D;QAC3D,6DAA6D;QAC7D,6DAA6D;KAC7D,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,MAAM,aAAa,CACzC,mCAAmC,EACnC,CAAC,MAAM,CAAC,mBAAmB,CAC3B,CAAC;IACF,MAAM,CAAC,mBAAmB,GAAG,cAAc;QAC1C,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE;QACrB,CAAC,CAAC,MAAM,UAAU,CAAC,wBAAwB,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAC1E,IAAI,MAAM,CAAC,mBAAmB,EAAE,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAClF,CAAC;AACF,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,MAAsB;IACzD,SAAS,CAAC,uCAAuC,EAAE;QAClD,6DAA6D;QAC7D,0EAA0E;QAC1E,yFAAyF;KACzF,CAAC,CAAC;IACH,MAAM,CAAC,WAAW,GAAG,MAAM,UAAU,CAAC,gBAAgB,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAC5E,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,sCAAsC,EAAE,SAAS,CAAC,CAAC;IACpF,IAAI,OAAO,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;QACzE,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC7F,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;QAC7C,CAAC;IACF,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,CAAC;QACjC,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,IAAI,CACvC,MAAM,UAAU,CAAC,mCAAmC,EAAE,MAAM,CAAC,mBAAmB,CAAC,CACjF,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACtB,CAAC;IACD,MAAM,CAAC,oBAAoB,GAAG,MAAM,UAAU,CAC7C,6BAA6B,EAC7B,MAAM,CAAC,oBAAoB,CAC3B,CAAC;IACF,MAAM,CAAC,WAAW,GAAG,SAAS,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAsB;IAChD,SAAS,CAAC,oCAAoC,EAAE;QAC/C,mDAAmD;QACnD,2CAA2C;QAC3C,0CAA0C;KAC1C,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,qBAAqB,EAAE,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC;IACxF,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,SAAS,CAAC,gBAAgB,EAAE;QAC3B,sEAAsE;QACtE,0EAA0E;KAC1E,CAAC,CAAC;IACH,MAAM,CAAC,YAAY,GAAG,MAAM,UAAU,CAAC,iBAAiB,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAC/E,SAAS,CAAC,uBAAuB,EAAE;QAClC,kDAAkD;QAClD,yCAAyC;KACzC,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,MAAM,aAAa,CACzC,2CAA2C,EAC3C,CAAC,MAAM,CAAC,mBAAmB,CAC3B,CAAC;IACF,MAAM,CAAC,mBAAmB,GAAG,cAAc;QAC1C,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE;QACrB,CAAC,CAAC,MAAM,UAAU,CAAC,gCAAgC,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC;IAClF,SAAS,CAAC,qBAAqB,EAAE;QAChC,gEAAgE;QAChE,iEAAiE;KACjE,CAAC,CAAC;IACH,MAAM,CAAC,YAAY,GAAG,MAAM,UAAU,CAAC,iBAAiB,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IAC/E,MAAM,CAAC,eAAe,GAAG,MAAM,UAAU,CACxC,+BAA+B,EAC/B,MAAM,CAAC,eAAe,CACtB,CAAC;IACF,SAAS,CAAC,4BAA4B,EAAE;QACvC,8CAA8C;QAC9C,yEAAyE;KACzE,CAAC,CAAC;IACH,MAAM,CAAC,iBAAiB,GAAG,MAAM,UAAU,CAC1C,2BAA2B,EAC3B,MAAM,CAAC,iBAAiB,IAAI,oBAAoB,CAChD,CAAC;IACF,MAAM,CAAC,sBAAsB,GAAG,MAAM,UAAU,CAC/C,iCAAiC,EACjC,MAAM,CAAC,sBAAsB,IAAI,aAAa,CAC9C,CAAC;IACF,MAAM,CAAC,qBAAqB,GAAG,MAAM,UAAU,CAC9C,gCAAgC,EAChC,MAAM,CAAC,qBAAqB,IAAI,YAAY,CAC5C,CAAC;IACF,MAAM,CAAC,mBAAmB,GAAG,MAAM,UAAU,CAC5C,6BAA6B,EAC7B,MAAM,CAAC,mBAAmB,IAAI,SAAS,CACvC,CAAC;IACF,MAAM,CAAC,cAAc,GAAG,MAAM,UAAU,CAAC,mBAAmB,EAAE,MAAM,CAAC,cAAc,IAAI,KAAK,CAAC,CAAC;AAC/F,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,MAAsB;IACpD,SAAS,CAAC,0CAA0C,EAAE;QACrD,mDAAmD;QACnD,gDAAgD;QAChD,qEAAqE;KACrE,CAAC,CAAC;IACH,MAAM,CAAC,UAAU,GAAG,MAAM,UAAU,CACnC,qBAAqB,EACrB,MAAM,CAAC,UAAU,IAAI,oBAAoB,CACzC,CAAC;IACF,MAAM,CAAC,QAAQ,GAAG,MAAM,UAAU,CAAC,mBAAmB,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK,CAAC,CAAC;IAClF,SAAS,CAAC,yBAAyB,EAAE;QACpC,2CAA2C;QAC3C,iFAAiF;QACjF,2DAA2D;KAC3D,CAAC,CAAC;IACH,MAAM,CAAC,cAAc,GAAG,MAAM,YAAY,CACzC,kBAAkB,EAClB;QACC,EAAE,KAAK,EAAE,0CAA0C,EAAE,KAAK,EAAE,YAAY,EAAE;QAC1E,EAAE,KAAK,EAAE,2CAA2C,EAAE,KAAK,EAAE,eAAe,EAAE;KAC9E,EACD,MAAM,CAAC,cAAc,IAAI,YAAY,CACrC,CAAC;IACF,SAAS,CAAC,kBAAkB,EAAE;QAC7B,4EAA4E;QAC5E,8CAA8C;KAC9C,CAAC,CAAC;IACH,MAAM,CAAC,UAAU,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,MAAM,CAAC,UAAU,IAAI,gBAAgB,CAAC,CAAC;IAC3F,SAAS,CAAC,gBAAgB,EAAE;QAC3B,yDAAyD;QACzD,mFAAmF;QACnF,yEAAyE;KACzE,CAAC,CAAC;IACH,MAAM,CAAC,YAAY,GAAG,MAAM,UAAU,CAAC,iBAAiB,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;AAChF,CAAC;AAED,KAAK,UAAU,sBAAsB,CAAC,MAAsB;IAC3D,SAAS,CAAC,4BAA4B,EAAE;QACvC,4DAA4D;QAC5D,gFAAgF;QAChF,yDAAyD;KACzD,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,YAAY,CACjC,kBAAkB,EAClB;QACC,EAAE,KAAK,EAAE,uBAAuB,EAAE,KAAK,EAAE,SAAS,EAAE;QACpD,EAAE,KAAK,EAAE,8CAA8C,EAAE,KAAK,EAAE,YAAY,EAAE;KAC9E,EACD,MAAM,CAAC,cAAc,IAAI,SAAS,CAClC,CAAC;IACF,MAAM,CAAC,cAAc,GAAG,OAAO,CAAC;IAChC,IAAI,OAAO,KAAK,YAAY;QAAE,OAAO;IAErC,SAAS,CAAC,4BAA4B,EAAE;QACvC,0EAA0E;QAC1E,2DAA2D;KAC3D,CAAC,CAAC;IACH,MAAM,CAAC,WAAW,GAAG,MAAM,UAAU,CAAC,oCAAoC,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAChG,MAAM,CAAC,WAAW,GAAG,MAAM,UAAU,CAAC,8BAA8B,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IAC1F,MAAM,CAAC,eAAe,GAAG,MAAM,UAAU,CACxC,+BAA+B,EAC/B,MAAM,CAAC,eAAe,CACtB,CAAC;IACF,MAAM,CAAC,YAAY,GAAG,MAAM,UAAU,CAAC,4BAA4B,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;AAC3F,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,MAAsB;IAClD,SAAS,CAAC,0CAA0C,EAAE;QACrD,mEAAmE;QACnE,yCAAyC;QACzC,4CAA4C;KAC5C,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,MAAM,aAAa,CACjC,iCAAiC,EACjC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAChC,CAAC;IACF,IAAI,CAAC,MAAM;QAAE,OAAO;IAEpB,SAAS,CAAC,cAAc,EAAE;QACzB,4EAA4E;QAC5E,wDAAwD;KACxD,CAAC,CAAC;IACH,MAAM,CAAC,gBAAgB,GAAG,MAAM,UAAU,CAAC,qBAAqB,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IAC3F,MAAM,CAAC,cAAc,GAAG,MAAM,UAAU,CAAC,mBAAmB,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IACrF,SAAS,CAAC,yBAAyB,EAAE;QACpC,oDAAoD;QACpD,yCAAyC;KACzC,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,MAAM,aAAa,CACzC,qCAAqC,EACrC,CAAC,MAAM,CAAC,qBAAqB,CAC7B,CAAC;IACF,MAAM,CAAC,qBAAqB,GAAG,cAAc;QAC5C,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE;QACrB,CAAC,CAAC,MAAM,UAAU,CAAC,0BAA0B,EAAE,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAC/E,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAsB;IAChD,SAAS,CAAC,qBAAqB,EAAE;QAChC,4CAA4C;QAC5C,yDAAyD;QACzD,0EAA0E;KAC1E,CAAC,CAAC;IACH,MAAM,CAAC,SAAS,GAAG,MAAM,UAAU,CAClC,oDAAoD,EACpD,MAAM,CAAC,SAAS,CAChB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,OAA2B;IACrE,MAAM,KAAK,GAAG,MAAM,WAAW,CAAS,OAAO,EAAE;QAChD,IAAI,EAAE,MAAM;QACZ,OAAO;KACP,CAAC,CAAC;IACH,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,OAAe,EAAE,OAAgB;IAC7D,OAAO,MAAM,WAAW,CAAU,OAAO,EAAE;QAC1C,IAAI,EAAE,SAAS;QACf,OAAO;KACP,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,YAAY,CAC1B,OAAe,EACf,OAA2C,EAC3C,OAAW;IAEX,OAAO,MAAM,WAAW,CAAI,OAAO,EAAE;QACpC,IAAI,EAAE,QAAQ;QACd,OAAO;QACP,OAAO;KACP,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CAAI,OAAe,EAAE,OAAsB;IACpE,IAAI,CAAC;QACJ,OAAO,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE;YACrC,GAAG,OAAO;YACV,MAAM,EAAE,QAAQ;SACC,CAAC,CAAM,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,iBAAiB,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,mBAAmB,EAAE,CAAC;QAC9D,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAc;IACxC,OAAO,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,6BAA6B,CAAC;AAC/E,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAa;IACzC,MAAM,KAAK,GAAG,KAAK;SACjB,IAAI,EAAE;SACN,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IACtE,IAAI,QAAQ;QAAE,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,MAAM,cAAc,GAAG,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC7D,IAAI,cAAc;QAAE,OAAO,GAAG,cAAc,CAAC,CAAC,CAAC,IAAI,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,OAAO,KAAK,CAAC;AACd,CAAC;AAED,SAAS,sBAAsB;IAC9B,IAAI,CAAC;QACJ,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE;YACtE,QAAQ,EAAE,OAAO;YACjB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACnC,CAAC,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;AACF,CAAC;AAED,SAAS,mBAAmB;IAC3B,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,IAAI,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC3C,OAAO,MAAM,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;QAC/C,CAAC;IACF,CAAC;IAAC,MAAM,CAAC;QACR,8CAA8C;IAC/C,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,KAAe;IAChD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../src/cli/commands/setup.ts"],"names":[],"mappings":"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"}
package/docs/SETUP.md CHANGED
@@ -152,8 +152,9 @@ npx @nairon-ai/aegis setup
152
152
  Important answers:
153
153
 
154
154
  - `Repo to monitor`: Aegis detects `git remote origin` when you run setup inside your product repo, so this is normally automatic. If no GitHub origin exists, paste `acme/web-app` / `https://github.com/acme/web-app`.
155
- - `Base branch`: usually `main`
156
- - GitHub auth: use `One-click GitHub App` unless you already know how to create a fine-grained GitHub token
155
+ - `Base branch`: Aegis detects origin's default branch automatically. If detection fails, it uses `main`; edit `BASE_BRANCH` in `.aegis/.env` only if your repo uses something else.
156
+ - GitHub auth: use `One-click GitHub App` unless you already know how to create a fine-grained GitHub token. If setup already saved a GitHub App, Aegis reuses it on reruns.
157
+ - Linear team: after you paste the Linear API key, Aegis fetches your teams and lets you choose by name. You do not need to copy the Linear team UUID manually.
157
158
  - `GitHub webhook secret`: generate one and keep it in `.aegis/.env`
158
159
  - `Automation mode`: start with `plan-first`
159
160
  - `Context profile`: start with `minimal`
@@ -326,7 +327,7 @@ Resource types: Issue, Comment
326
327
 
327
328
  Configure Linear to match the setup wizard:
328
329
 
329
- - Team ID
330
+ - Team selected in setup
330
331
  - Optional project ID
331
332
  - Ready status, default `Ready to Implement`
332
333
  - Bug label, default `bug`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nairon-ai/aegis",
3
- "version": "0.4.3",
3
+ "version": "0.4.5",
4
4
  "description": "Self-hosted AFK bug-fixing agent for GitHub Issues and Linear",
5
5
  "type": "module",
6
6
  "repository": {
@@ -10,6 +10,12 @@ import { detectSetupState, printState, saveConfig } from "../state.js";
10
10
 
11
11
  type PromptOptions = NonNullable<Parameters<typeof consola.prompt>[1]>;
12
12
 
13
+ type LinearTeam = {
14
+ id: string;
15
+ name: string;
16
+ key: string;
17
+ };
18
+
13
19
  class SetupCancelledError extends Error {
14
20
  constructor() {
15
21
  super("Setup cancelled.");
@@ -51,9 +57,9 @@ export async function runSetupWizard(): Promise<void> {
51
57
  consola.log("");
52
58
  } catch (error) {
53
59
  if (error instanceof SetupCancelledError) {
54
- consola.log("\nSetup cancelled. No config changes were saved.");
60
+ consola.log("\nSetup cancelled before the final save.");
55
61
  consola.log(
56
- "If you already installed a GitHub App in the browser, uninstall it from GitHub if you do not want Aegis connected.",
62
+ "If GitHub App credentials were created in the browser, Aegis saved them immediately so rerun setup can reuse them.",
57
63
  );
58
64
  process.exitCode = 130;
59
65
  return;
@@ -84,11 +90,25 @@ async function setupRepo(config: AegisCliConfig): Promise<void> {
84
90
  config.monitoredRepo = normalizeGitHubRepo(await promptText("Repo to monitor:", undefined));
85
91
  }
86
92
 
87
- printStep("Step 2: choose the base branch", [
88
- "This is the branch Aegis will open PRs against.",
89
- "Most repos use main. If your repo uses master, develop, or staging, enter that.",
90
- ]);
91
- config.baseBranch = await promptText("Base branch:", config.baseBranch ?? detectCurrentBranch());
93
+ const detectedBaseBranch = detectOriginDefaultBranch();
94
+ if (detectedBaseBranch) {
95
+ config.baseBranch = detectedBaseBranch;
96
+ printStep("Step 2: base branch Aegis will target", [
97
+ `Using ${detectedBaseBranch} from origin's default branch.`,
98
+ "Aegis will open PRs against this branch.",
99
+ ]);
100
+ } else if (config.baseBranch) {
101
+ printStep("Step 2: base branch Aegis will target", [
102
+ `Using ${config.baseBranch} from existing .aegis config.`,
103
+ "Aegis will open PRs against this branch.",
104
+ ]);
105
+ } else {
106
+ config.baseBranch = "main";
107
+ printStep("Step 2: base branch Aegis will target", [
108
+ "Could not detect origin's default branch.",
109
+ "Using main. If your repo uses a different default branch, edit BASE_BRANCH in .aegis/.env after setup.",
110
+ ]);
111
+ }
92
112
  }
93
113
 
94
114
  async function setupGitHub(config: AegisCliConfig): Promise<void> {
@@ -97,56 +117,28 @@ async function setupGitHub(config: AegisCliConfig): Promise<void> {
97
117
  "If you are unsure, choose the one-click GitHub App. It opens GitHub in your browser and avoids manual tokens.",
98
118
  "Use a GitHub token only if you already know how to create fine-grained tokens.",
99
119
  ]);
100
- const method = await promptSelect("Auth method:", [
101
- { label: "One-click GitHub App (recommended)", value: "app-flow" },
102
- { label: "GitHub token (quick local test)", value: "token" },
103
- { label: "Paste existing GitHub App credentials", value: "app-manual" },
104
- ]);
105
120
 
106
- if (method === "token") {
107
- printStep("Create a fine-grained GitHub token", [
108
- "Open: https://github.com/settings/personal-access-tokens/new",
109
- "Token name: Aegis",
110
- "Repository access: Only select repositories, then choose the repo from Step 1.",
111
- "Repository permissions: Contents read/write, Issues read/write, Pull requests read/write.",
112
- "Metadata stays read-only automatically.",
113
- "Click Generate token, then paste the token here. It usually starts with github_pat_.",
114
- "Keep it secret. Aegis saves it to .aegis/.env, which should not be committed.",
115
- ]);
116
- config.githubToken = await promptText("Paste GitHub token:", config.githubToken);
117
- config.githubAppId = undefined;
118
- config.githubAppPrivateKey = undefined;
119
- config.githubInstallationId = undefined;
120
- } else if (method === "app-flow") {
121
- if (!config.monitoredRepo) {
122
- consola.warn("Set the monitored repo first.");
123
- return;
124
- }
125
- printStep("Create the GitHub App in your browser", [
126
- "Aegis will open a local setup page.",
127
- "Click Create GitHub App.",
128
- "Then click Install and choose Only select repositories.",
129
- "Select the repo from Step 1, then approve the install.",
130
- "When GitHub sends you back, this CLI saves the credentials automatically.",
121
+ if (hasGitHubAppConfig(config)) {
122
+ consola.info(
123
+ `Using existing GitHub App installation ${config.githubInstallationId}. Rerun disconnect if you want to remove it.`,
124
+ );
125
+ config.githubToken = undefined;
126
+ } else if (config.githubToken) {
127
+ consola.info("Using existing GitHub token from .aegis config.");
128
+ } else {
129
+ const method = await promptSelect("Auth method:", [
130
+ { label: "One-click GitHub App (recommended)", value: "app-flow" },
131
+ { label: "GitHub token (quick local test)", value: "token" },
132
+ { label: "Paste existing GitHub App credentials", value: "app-manual" },
131
133
  ]);
132
- try {
133
- const app = await runGitHubAppFlow({
134
- monitoredRepo: config.monitoredRepo,
135
- workerUrl: config.workerUrl,
136
- });
137
- config.githubAppId = app.appId;
138
- config.githubAppPrivateKey = Buffer.from(app.privateKey, "utf-8").toString("base64");
139
- config.githubInstallationId = app.installationId;
140
- config.githubWebhookSecret = app.webhookSecret;
141
- config.githubToken = undefined;
142
- consola.success("Saved GitHub App credentials from GitHub.");
143
- } catch (error) {
144
- consola.warn(error instanceof Error ? error.message : String(error));
145
- consola.info("Falling back to manual GitHub App credentials.");
134
+
135
+ if (method === "token") {
136
+ await setupGitHubToken(config);
137
+ } else if (method === "app-flow") {
138
+ await setupGitHubAppFlow(config);
139
+ } else {
146
140
  await setupGitHubAppManual(config);
147
141
  }
148
- } else {
149
- await setupGitHubAppManual(config);
150
142
  }
151
143
 
152
144
  if (config.githubWebhookSecret) {
@@ -171,6 +163,53 @@ async function setupGitHub(config: AegisCliConfig): Promise<void> {
171
163
  }
172
164
  }
173
165
 
166
+ async function setupGitHubToken(config: AegisCliConfig): Promise<void> {
167
+ printStep("Create a fine-grained GitHub token", [
168
+ "Open: https://github.com/settings/personal-access-tokens/new",
169
+ "Token name: Aegis",
170
+ "Repository access: Only select repositories, then choose the repo from Step 1.",
171
+ "Repository permissions: Contents read/write, Issues read/write, Pull requests read/write.",
172
+ "Metadata stays read-only automatically.",
173
+ "Click Generate token, then paste the token here. It usually starts with github_pat_.",
174
+ "Keep it secret. Aegis saves it to .aegis/.env, which should not be committed.",
175
+ ]);
176
+ config.githubToken = await promptText("Paste GitHub token:", config.githubToken);
177
+ config.githubAppId = undefined;
178
+ config.githubAppPrivateKey = undefined;
179
+ config.githubInstallationId = undefined;
180
+ }
181
+
182
+ async function setupGitHubAppFlow(config: AegisCliConfig): Promise<void> {
183
+ if (!config.monitoredRepo) {
184
+ consola.warn("Set the monitored repo first.");
185
+ return;
186
+ }
187
+ printStep("Create the GitHub App in your browser", [
188
+ "Aegis will open a local setup page.",
189
+ "Click Create GitHub App.",
190
+ "Then click Install and choose Only select repositories.",
191
+ "Select the repo from Step 1, then approve the install.",
192
+ "When GitHub sends you back, this CLI saves the credentials automatically.",
193
+ ]);
194
+ try {
195
+ const app = await runGitHubAppFlow({
196
+ monitoredRepo: config.monitoredRepo,
197
+ workerUrl: config.workerUrl,
198
+ });
199
+ config.githubAppId = app.appId;
200
+ config.githubAppPrivateKey = Buffer.from(app.privateKey, "utf-8").toString("base64");
201
+ config.githubInstallationId = app.installationId;
202
+ config.githubWebhookSecret = app.webhookSecret;
203
+ config.githubToken = undefined;
204
+ saveConfig(config);
205
+ consola.success(`Saved GitHub App credentials to ${resolveEnvFileForWrite()}.`);
206
+ } catch (error) {
207
+ consola.warn(error instanceof Error ? error.message : String(error));
208
+ consola.info("Falling back to manual GitHub App credentials.");
209
+ await setupGitHubAppManual(config);
210
+ }
211
+ }
212
+
174
213
  async function setupGitHubAppManual(config: AegisCliConfig): Promise<void> {
175
214
  printStep("Paste existing GitHub App credentials", [
176
215
  "Use this only if you already created a GitHub App manually.",
@@ -200,6 +239,10 @@ async function setupGitHubAppManual(config: AegisCliConfig): Promise<void> {
200
239
  config.githubToken = undefined;
201
240
  }
202
241
 
242
+ function hasGitHubAppConfig(config: AegisCliConfig): boolean {
243
+ return Boolean(config.githubAppId && config.githubAppPrivateKey && config.githubInstallationId);
244
+ }
245
+
203
246
  async function setupLinear(config: AegisCliConfig): Promise<void> {
204
247
  printStep("Step 4: optional Linear connection", [
205
248
  "Use this only if your team tracks bugs in Linear.",
@@ -214,6 +257,8 @@ async function setupLinear(config: AegisCliConfig): Promise<void> {
214
257
  "Aegis uses it to read ready bug tickets and comment with status updates.",
215
258
  ]);
216
259
  config.linearApiKey = await promptText("Linear API key:", config.linearApiKey);
260
+ await setupLinearTeam(config);
261
+
217
262
  printStep("Linear webhook secret", [
218
263
  "This protects Linear webhook calls after deploy.",
219
264
  "Choose yes and Aegis will generate one.",
@@ -225,15 +270,6 @@ async function setupLinear(config: AegisCliConfig): Promise<void> {
225
270
  config.linearWebhookSecret = generateSecret
226
271
  ? crypto.randomUUID()
227
272
  : await promptText("Linear webhook signing secret:", config.linearWebhookSecret);
228
- printStep("Linear team/project", [
229
- "Team ID is required so Aegis knows which Linear team to watch.",
230
- "Project ID is optional. Leave it blank to watch the whole team.",
231
- ]);
232
- config.linearTeamId = await promptText("Linear team ID:", config.linearTeamId);
233
- config.linearProjectId = await promptText(
234
- "Linear project ID (optional):",
235
- config.linearProjectId,
236
- );
237
273
  printStep("Linear statuses and labels", [
238
274
  "These names must match your Linear workflow.",
239
275
  "If your team uses the default names, press Enter through these prompts.",
@@ -257,6 +293,84 @@ async function setupLinear(config: AegisCliConfig): Promise<void> {
257
293
  config.linearBugLabel = await promptText("Linear bug label:", config.linearBugLabel ?? "bug");
258
294
  }
259
295
 
296
+ async function setupLinearTeam(config: AegisCliConfig): Promise<void> {
297
+ if (!config.linearApiKey) return;
298
+
299
+ printStep("Linear team/project", [
300
+ "Aegis will fetch your Linear teams so you can pick one by name.",
301
+ "Project ID is optional. Leave it blank to watch the whole team.",
302
+ ]);
303
+
304
+ try {
305
+ const teams = await fetchLinearTeams(config.linearApiKey);
306
+ if (teams.length === 0) {
307
+ consola.warn("No Linear teams were returned for this API key.");
308
+ config.linearTeamId = await promptText("Linear team ID:", config.linearTeamId);
309
+ } else if (teams.length === 1) {
310
+ const team = teams[0];
311
+ config.linearTeamId = team.id;
312
+ consola.info(`Using Linear team ${formatLinearTeam(team)}.`);
313
+ } else {
314
+ config.linearTeamId = await promptSelect(
315
+ "Linear team:",
316
+ teams.map((team) => ({
317
+ label: formatLinearTeam(team),
318
+ value: team.id,
319
+ })),
320
+ config.linearTeamId,
321
+ );
322
+ }
323
+ } catch (error) {
324
+ consola.warn(
325
+ `Could not fetch Linear teams: ${error instanceof Error ? error.message : String(error)}`,
326
+ );
327
+ consola.info("Falling back to manual Linear team ID.");
328
+ config.linearTeamId = await promptText("Linear team ID:", config.linearTeamId);
329
+ }
330
+
331
+ config.linearProjectId = await promptText(
332
+ "Linear project ID (optional, blank = whole team):",
333
+ config.linearProjectId,
334
+ );
335
+ }
336
+
337
+ async function fetchLinearTeams(apiKey: string): Promise<LinearTeam[]> {
338
+ const result = await linearGraphql<{ teams: { nodes: LinearTeam[] } }>(
339
+ apiKey,
340
+ `query Teams {
341
+ teams {
342
+ nodes { id name key }
343
+ }
344
+ }`,
345
+ );
346
+ return result.teams.nodes.sort((a, b) => a.name.localeCompare(b.name));
347
+ }
348
+
349
+ async function linearGraphql<T>(apiKey: string, query: string): Promise<T> {
350
+ const response = await fetch("https://api.linear.app/graphql", {
351
+ method: "POST",
352
+ headers: {
353
+ Authorization: apiKey,
354
+ "Content-Type": "application/json",
355
+ },
356
+ body: JSON.stringify({ query }),
357
+ });
358
+ const payload = (await response.json()) as { data?: T; errors?: Array<{ message: string }> };
359
+ if (!response.ok || payload.errors?.length) {
360
+ throw new Error(
361
+ `Linear API failed: ${response.status} ${
362
+ payload.errors?.map((error) => error.message).join("; ") ?? ""
363
+ }`,
364
+ );
365
+ }
366
+ if (!payload.data) throw new Error("Linear API returned no data.");
367
+ return payload.data;
368
+ }
369
+
370
+ function formatLinearTeam(team: LinearTeam): string {
371
+ return `${team.name} (${team.key})`;
372
+ }
373
+
260
374
  async function setupAutomation(config: AegisCliConfig): Promise<void> {
261
375
  printStep("Step 5: GitHub labels Aegis should watch", [
262
376
  "Aegis only picks up open issues with both labels.",
@@ -435,16 +549,44 @@ function detectOriginGitHubRepo(): string | undefined {
435
549
  }
436
550
  }
437
551
 
438
- function detectCurrentBranch(): string {
552
+ function detectOriginDefaultBranch(): string | undefined {
553
+ const localRemoteHead = runGit([
554
+ "symbolic-ref",
555
+ "--quiet",
556
+ "--short",
557
+ "refs/remotes/origin/HEAD",
558
+ ]);
559
+ if (localRemoteHead?.startsWith("origin/")) {
560
+ return localRemoteHead.replace("origin/", "");
561
+ }
562
+
563
+ const remoteDetails = runGit(["remote", "show", "origin"]);
564
+ const remoteHead = remoteDetails?.match(/HEAD branch:\s*(.+)/)?.[1]?.trim();
565
+ if (remoteHead) return remoteHead;
566
+
439
567
  try {
440
568
  const branch = readFileSync(".git/HEAD", "utf-8").trim();
441
569
  if (branch.startsWith("ref: refs/heads/")) {
442
- return branch.replace("ref: refs/heads/", "");
570
+ const currentBranch = branch.replace("ref: refs/heads/", "");
571
+ if (["main", "master", "develop", "development", "staging"].includes(currentBranch)) {
572
+ return currentBranch;
573
+ }
443
574
  }
444
575
  } catch {
445
- // Ignore and fall back to the normal default.
576
+ // Ignore and fall back below.
577
+ }
578
+ return undefined;
579
+ }
580
+
581
+ function runGit(args: string[]): string | undefined {
582
+ try {
583
+ return execFileSync("git", args, {
584
+ encoding: "utf-8",
585
+ stdio: ["ignore", "pipe", "ignore"],
586
+ }).trim();
587
+ } catch {
588
+ return undefined;
446
589
  }
447
- return "main";
448
590
  }
449
591
 
450
592
  function printStep(title: string, lines: string[]): void {