@tarcisiopgs/lisa 1.7.1 → 1.7.2
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/index.js +66 -43
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -4172,7 +4172,7 @@ var init = defineCommand({
|
|
|
4172
4172
|
}
|
|
4173
4173
|
if (configExists()) {
|
|
4174
4174
|
const overwrite = await clack.confirm({
|
|
4175
|
-
message: "
|
|
4175
|
+
message: "A config already exists at .lisa/config.yaml. Overwrite it?"
|
|
4176
4176
|
});
|
|
4177
4177
|
if (clack.isCancel(overwrite) || !overwrite) {
|
|
4178
4178
|
log("Cancelled.");
|
|
@@ -4343,6 +4343,7 @@ var main = defineCommand({
|
|
|
4343
4343
|
});
|
|
4344
4344
|
async function runConfigWizard() {
|
|
4345
4345
|
banner();
|
|
4346
|
+
clack.intro(pc2.cyan(" lisa \u2014 autonomous issue resolver "));
|
|
4346
4347
|
const providerLabels = {
|
|
4347
4348
|
claude: "Claude Code",
|
|
4348
4349
|
gemini: "Gemini CLI",
|
|
@@ -4358,25 +4359,26 @@ async function runConfigWizard() {
|
|
|
4358
4359
|
};
|
|
4359
4360
|
const available = await getAvailableProviders();
|
|
4360
4361
|
if (available.length === 0) {
|
|
4361
|
-
clack.log.error("No
|
|
4362
|
+
clack.log.error("No AI provider found on your system.");
|
|
4362
4363
|
clack.log.info(
|
|
4363
|
-
`Install at least one of the following
|
|
4364
|
+
`Install at least one of the following and re-run ${pc2.cyan("lisa init")}:
|
|
4364
4365
|
|
|
4365
|
-
${pc2.bold("Claude Code")}
|
|
4366
|
-
${pc2.bold("Gemini CLI")}
|
|
4367
|
-
${pc2.bold("OpenCode")}
|
|
4368
|
-
|
|
4369
|
-
|
|
4366
|
+
${pc2.bold("Claude Code")} ${pc2.dim("npm i -g @anthropic-ai/claude-code")}
|
|
4367
|
+
${pc2.bold("Gemini CLI")} ${pc2.dim("npm i -g @google/gemini-cli")}
|
|
4368
|
+
${pc2.bold("OpenCode")} ${pc2.dim("npm i -g opencode")}
|
|
4369
|
+
${pc2.bold("GitHub Copilot CLI")} ${pc2.dim("npm i -g @github/copilot-cli")}
|
|
4370
|
+
${pc2.bold("Goose")} ${pc2.dim("https://block.github.io/goose")}
|
|
4371
|
+
${pc2.bold("Aider")} ${pc2.dim("pip install aider-chat")}`
|
|
4370
4372
|
);
|
|
4371
4373
|
return process.exit(1);
|
|
4372
4374
|
}
|
|
4373
4375
|
let providerName;
|
|
4374
4376
|
if (available.length === 1 && available[0]) {
|
|
4375
4377
|
providerName = available[0].name;
|
|
4376
|
-
clack.log.info(`
|
|
4378
|
+
clack.log.info(`Auto-detected ${pc2.bold(providerLabels[providerName])} as your AI provider.`);
|
|
4377
4379
|
} else {
|
|
4378
4380
|
const selected = await clack.select({
|
|
4379
|
-
message: "Which AI provider
|
|
4381
|
+
message: "Which AI provider should resolve your issues?",
|
|
4380
4382
|
options: available.map((p) => ({
|
|
4381
4383
|
value: p.name,
|
|
4382
4384
|
label: providerLabels[p.name]
|
|
@@ -4391,14 +4393,14 @@ After installing, run ${pc2.cyan("lisa init")} again.`
|
|
|
4391
4393
|
const isFree = await isCursorFreePlan();
|
|
4392
4394
|
if (isFree) {
|
|
4393
4395
|
availableModels = ["auto"];
|
|
4394
|
-
clack.log.info("Cursor Free plan detected
|
|
4396
|
+
clack.log.info("Cursor Free plan detected \u2014 only the 'auto' model is available.");
|
|
4395
4397
|
} else {
|
|
4396
4398
|
availableModels = CURSOR_MODELS;
|
|
4397
4399
|
}
|
|
4398
4400
|
}
|
|
4399
4401
|
if (availableModels && availableModels.length > 0) {
|
|
4400
4402
|
const modelSelection = await clack.multiselect({
|
|
4401
|
-
message: "Which models
|
|
4403
|
+
message: "Which models should Lisa use? Select in order \u2014 first = primary, rest = fallbacks",
|
|
4402
4404
|
options: availableModels.map((m) => ({
|
|
4403
4405
|
value: m,
|
|
4404
4406
|
label: m
|
|
@@ -4409,10 +4411,15 @@ After installing, run ${pc2.cyan("lisa init")} again.`
|
|
|
4409
4411
|
selectedModels = modelSelection ?? [];
|
|
4410
4412
|
}
|
|
4411
4413
|
const source = await clack.select({
|
|
4412
|
-
message: "Where do your issues
|
|
4414
|
+
message: "Where do your issues come from?",
|
|
4413
4415
|
options: [
|
|
4414
|
-
{ value: "linear", label: "Linear" },
|
|
4415
|
-
{ value: "trello", label: "Trello" }
|
|
4416
|
+
{ value: "linear", label: "Linear", hint: "GraphQL API" },
|
|
4417
|
+
{ value: "trello", label: "Trello", hint: "REST API" },
|
|
4418
|
+
{ value: "github", label: "GitHub Issues", hint: "REST API" },
|
|
4419
|
+
{ value: "gitlab", label: "GitLab Issues", hint: "REST API" },
|
|
4420
|
+
{ value: "plane", label: "Plane", hint: "REST API" },
|
|
4421
|
+
{ value: "shortcut", label: "Shortcut", hint: "REST API" },
|
|
4422
|
+
{ value: "jira", label: "Jira", hint: "REST API" }
|
|
4416
4423
|
]
|
|
4417
4424
|
});
|
|
4418
4425
|
if (clack.isCancel(source)) return process.exit(0);
|
|
@@ -4420,24 +4427,27 @@ After installing, run ${pc2.cyan("lisa init")} again.`
|
|
|
4420
4427
|
if (missing.length > 0) {
|
|
4421
4428
|
const shell = process.env.SHELL?.includes("zsh") ? "~/.zshrc" : "~/.bashrc";
|
|
4422
4429
|
clack.log.warning(
|
|
4423
|
-
`
|
|
4430
|
+
`The following environment variables are missing:
|
|
4431
|
+
|
|
4424
4432
|
${missing.map((v) => ` ${pc2.bold(v)}`).join("\n")}
|
|
4425
4433
|
|
|
4426
|
-
Add them to
|
|
4427
|
-
${missing.map((v) => ` export ${v}="your-
|
|
4434
|
+
Add them to ${pc2.cyan(shell)}:
|
|
4435
|
+
${missing.map((v) => ` export ${v}="your-value-here"`).join("\n")}
|
|
4428
4436
|
|
|
4429
|
-
Then
|
|
4437
|
+
Then reload: ${pc2.cyan(`source ${shell}`)}`
|
|
4430
4438
|
);
|
|
4431
4439
|
}
|
|
4432
4440
|
const githubMethod = await detectGitHubMethod();
|
|
4433
4441
|
const teamAnswer = await clack.text({
|
|
4434
|
-
message: source === "linear" ? "
|
|
4442
|
+
message: source === "linear" ? "What is your Linear team name?" : source === "trello" ? "What is your Trello board name?" : source === "jira" ? "What is your Jira project key?" : "What is your team or project name?",
|
|
4443
|
+
placeholder: source === "linear" ? "e.g. Engineering" : void 0
|
|
4435
4444
|
});
|
|
4436
4445
|
if (clack.isCancel(teamAnswer)) return process.exit(0);
|
|
4437
4446
|
const team = teamAnswer;
|
|
4438
4447
|
const labelAnswer = await clack.text({
|
|
4439
|
-
message: "
|
|
4440
|
-
initialValue: "ready"
|
|
4448
|
+
message: "Which label marks issues as ready for the agent to pick up?",
|
|
4449
|
+
initialValue: "ready",
|
|
4450
|
+
placeholder: "e.g. ready, ai, lisa"
|
|
4441
4451
|
});
|
|
4442
4452
|
if (clack.isCancel(labelAnswer)) return process.exit(0);
|
|
4443
4453
|
const label = labelAnswer;
|
|
@@ -4454,47 +4464,57 @@ Then run: ${pc2.cyan(`source ${shell}`)}`
|
|
|
4454
4464
|
pickFrom = pickFromAnswer;
|
|
4455
4465
|
project = pickFrom;
|
|
4456
4466
|
const inProgressAnswer = await clack.text({
|
|
4457
|
-
message: "Move to which
|
|
4467
|
+
message: "Move the card to which list while the agent is working?",
|
|
4458
4468
|
initialValue: "In Progress"
|
|
4459
4469
|
});
|
|
4460
4470
|
if (clack.isCancel(inProgressAnswer)) return process.exit(0);
|
|
4461
4471
|
inProgress = inProgressAnswer;
|
|
4462
4472
|
const doneAnswer = await clack.text({
|
|
4463
|
-
message: "Move to which
|
|
4473
|
+
message: "Move the card to which list after the PR is created?",
|
|
4464
4474
|
initialValue: "Code Review"
|
|
4465
4475
|
});
|
|
4466
4476
|
if (clack.isCancel(doneAnswer)) return process.exit(0);
|
|
4467
4477
|
done = doneAnswer;
|
|
4468
4478
|
} else {
|
|
4469
4479
|
const projectAnswer = await clack.text({
|
|
4470
|
-
message: "
|
|
4480
|
+
message: source === "linear" ? "Which Linear project should Lisa work on? (leave empty for all team issues)" : "Which project should Lisa work on?",
|
|
4481
|
+
placeholder: source === "linear" ? "e.g. Q1 Roadmap (optional)" : void 0
|
|
4471
4482
|
});
|
|
4472
4483
|
if (clack.isCancel(projectAnswer)) return process.exit(0);
|
|
4473
4484
|
project = projectAnswer;
|
|
4474
4485
|
const pickFromAnswer = await clack.text({
|
|
4475
|
-
message: "Pick up issues
|
|
4476
|
-
initialValue: "Backlog"
|
|
4486
|
+
message: "Pick up issues in which status?",
|
|
4487
|
+
initialValue: "Backlog",
|
|
4488
|
+
placeholder: "e.g. Backlog, Todo"
|
|
4477
4489
|
});
|
|
4478
4490
|
if (clack.isCancel(pickFromAnswer)) return process.exit(0);
|
|
4479
4491
|
pickFrom = pickFromAnswer;
|
|
4480
4492
|
const inProgressAnswer = await clack.text({
|
|
4481
|
-
message: "Move to which status while working?",
|
|
4493
|
+
message: "Move to which status while the agent is working?",
|
|
4482
4494
|
initialValue: "In Progress"
|
|
4483
4495
|
});
|
|
4484
4496
|
if (clack.isCancel(inProgressAnswer)) return process.exit(0);
|
|
4485
4497
|
inProgress = inProgressAnswer;
|
|
4486
4498
|
const doneAnswer = await clack.text({
|
|
4487
|
-
message: "Move to which status after PR?",
|
|
4499
|
+
message: "Move to which status after the PR is created?",
|
|
4488
4500
|
initialValue: "In Review"
|
|
4489
4501
|
});
|
|
4490
4502
|
if (clack.isCancel(doneAnswer)) return process.exit(0);
|
|
4491
4503
|
done = doneAnswer;
|
|
4492
4504
|
}
|
|
4493
4505
|
const workflowAnswer = await clack.select({
|
|
4494
|
-
message: "How should Lisa
|
|
4506
|
+
message: "How should Lisa check out code for each issue?",
|
|
4495
4507
|
options: [
|
|
4496
|
-
{
|
|
4497
|
-
|
|
4508
|
+
{
|
|
4509
|
+
value: "worktree",
|
|
4510
|
+
label: "Worktree",
|
|
4511
|
+
hint: "isolated git worktree per issue \u2014 recommended"
|
|
4512
|
+
},
|
|
4513
|
+
{
|
|
4514
|
+
value: "branch",
|
|
4515
|
+
label: "Branch",
|
|
4516
|
+
hint: "new branch in the current checkout"
|
|
4517
|
+
}
|
|
4498
4518
|
]
|
|
4499
4519
|
});
|
|
4500
4520
|
if (clack.isCancel(workflowAnswer)) return process.exit(0);
|
|
@@ -4505,7 +4525,7 @@ Then run: ${pc2.cyan(`source ${shell}`)}`
|
|
|
4505
4525
|
if (repos.length === 0) {
|
|
4506
4526
|
const detected = detectDefaultBranch(cwd);
|
|
4507
4527
|
const branchAnswer = await clack.text({
|
|
4508
|
-
message: "
|
|
4528
|
+
message: "What is the base branch to branch off from?",
|
|
4509
4529
|
initialValue: detected
|
|
4510
4530
|
});
|
|
4511
4531
|
if (clack.isCancel(branchAnswer)) return process.exit(0);
|
|
@@ -4515,7 +4535,7 @@ Then run: ${pc2.cyan(`source ${shell}`)}`
|
|
|
4515
4535
|
const repoPath = resolvePath(cwd, repo.path);
|
|
4516
4536
|
const detected = detectDefaultBranch(repoPath);
|
|
4517
4537
|
const branchAnswer = await clack.text({
|
|
4518
|
-
message: `Base branch for ${repo.name}?`,
|
|
4538
|
+
message: `Base branch for ${pc2.bold(repo.name)}?`,
|
|
4519
4539
|
initialValue: detected
|
|
4520
4540
|
});
|
|
4521
4541
|
if (clack.isCancel(branchAnswer)) return process.exit(0);
|
|
@@ -4530,7 +4550,7 @@ Then run: ${pc2.cyan(`source ${shell}`)}`
|
|
|
4530
4550
|
ensureWorktreeGitignore(resolvePath(cwd, repo.path));
|
|
4531
4551
|
}
|
|
4532
4552
|
}
|
|
4533
|
-
clack.log.info("Added .worktrees to .gitignore");
|
|
4553
|
+
clack.log.info("Added .worktrees/ to .gitignore");
|
|
4534
4554
|
}
|
|
4535
4555
|
const cfg = {
|
|
4536
4556
|
provider: providerName,
|
|
@@ -4553,28 +4573,31 @@ Then run: ${pc2.cyan(`source ${shell}`)}`
|
|
|
4553
4573
|
logs: { dir: ".lisa/logs", format: "text" }
|
|
4554
4574
|
};
|
|
4555
4575
|
saveConfig(cfg);
|
|
4556
|
-
clack.outro(
|
|
4576
|
+
clack.outro(
|
|
4577
|
+
`${pc2.green("All set!")} Config saved to ${pc2.cyan(".lisa/config.yaml")}
|
|
4578
|
+
Run ${pc2.bold(pc2.cyan("lisa run"))} to start resolving issues.`
|
|
4579
|
+
);
|
|
4557
4580
|
}
|
|
4558
4581
|
async function detectGitHubMethod() {
|
|
4559
4582
|
const hasToken = !!process.env.GITHUB_TOKEN;
|
|
4560
4583
|
const hasCli = await isGhCliAvailable();
|
|
4561
4584
|
if (hasToken && hasCli) {
|
|
4562
4585
|
const selected = await clack.select({
|
|
4563
|
-
message: "
|
|
4586
|
+
message: "How should Lisa create pull requests?",
|
|
4564
4587
|
options: [
|
|
4565
|
-
{ value: "cli", label: "GitHub CLI", hint: "gh" },
|
|
4566
|
-
{ value: "token", label: "GitHub API", hint: "GITHUB_TOKEN" }
|
|
4588
|
+
{ value: "cli", label: "GitHub CLI", hint: "uses `gh pr create` \u2014 recommended" },
|
|
4589
|
+
{ value: "token", label: "GitHub API", hint: "uses GITHUB_TOKEN directly" }
|
|
4567
4590
|
]
|
|
4568
4591
|
});
|
|
4569
4592
|
if (clack.isCancel(selected)) return process.exit(0);
|
|
4570
4593
|
return selected;
|
|
4571
4594
|
}
|
|
4572
4595
|
if (hasCli) {
|
|
4573
|
-
clack.log.info("
|
|
4596
|
+
clack.log.info("Pull requests will be created using the GitHub CLI.");
|
|
4574
4597
|
return "cli";
|
|
4575
4598
|
}
|
|
4576
4599
|
if (hasToken) {
|
|
4577
|
-
clack.log.info("
|
|
4600
|
+
clack.log.info("Pull requests will be created using GITHUB_TOKEN.");
|
|
4578
4601
|
return "token";
|
|
4579
4602
|
}
|
|
4580
4603
|
return "token";
|
|
@@ -4582,7 +4605,7 @@ async function detectGitHubMethod() {
|
|
|
4582
4605
|
async function detectGitRepos() {
|
|
4583
4606
|
const cwd = process.cwd();
|
|
4584
4607
|
if (existsSync7(join12(cwd, ".git"))) {
|
|
4585
|
-
clack.log.info(
|
|
4608
|
+
clack.log.info("Found a git repository in the current directory.");
|
|
4586
4609
|
return [];
|
|
4587
4610
|
}
|
|
4588
4611
|
const entries = readdirSync(cwd, { withFileTypes: true });
|
|
@@ -4591,7 +4614,7 @@ async function detectGitRepos() {
|
|
|
4591
4614
|
return [];
|
|
4592
4615
|
}
|
|
4593
4616
|
const selected = await clack.multiselect({
|
|
4594
|
-
message: "
|
|
4617
|
+
message: "Multiple git repositories found \u2014 which ones should Lisa work on?",
|
|
4595
4618
|
options: gitDirs.map((dir) => ({ value: dir, label: dir }))
|
|
4596
4619
|
});
|
|
4597
4620
|
if (clack.isCancel(selected)) return process.exit(0);
|