@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.
Files changed (2) hide show
  1. package/dist/index.js +66 -43
  2. 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: "Config already exists. Overwrite?"
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 compatible AI providers found.");
4362
+ clack.log.error("No AI provider found on your system.");
4362
4363
  clack.log.info(
4363
- `Install at least one of the following providers to continue:
4364
+ `Install at least one of the following and re-run ${pc2.cyan("lisa init")}:
4364
4365
 
4365
- ${pc2.bold("Claude Code")} ${pc2.dim("npm i -g @anthropic-ai/claude-code")}
4366
- ${pc2.bold("Gemini CLI")} ${pc2.dim("npm i -g @anthropic-ai/gemini-cli")}
4367
- ${pc2.bold("OpenCode")} ${pc2.dim("npm i -g opencode")}
4368
-
4369
- After installing, run ${pc2.cyan("lisa init")} again.`
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(`Found provider: ${pc2.bold(providerLabels[providerName])}`);
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 do you want to use?",
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. Using 'auto' model only.");
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 to use? Select in order: primary first, then fallbacks",
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 live?",
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
- `Missing environment variables:
4430
+ `The following environment variables are missing:
4431
+
4424
4432
  ${missing.map((v) => ` ${pc2.bold(v)}`).join("\n")}
4425
4433
 
4426
- Add them to your environment variables:
4427
- ${missing.map((v) => ` export ${v}="your-key-here"`).join("\n")}
4434
+ Add them to ${pc2.cyan(shell)}:
4435
+ ${missing.map((v) => ` export ${v}="your-value-here"`).join("\n")}
4428
4436
 
4429
- Then run: ${pc2.cyan(`source ${shell}`)}`
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" ? "Team?" : "Board?"
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: "Label to pick up?",
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 column while working?",
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 column after PR?",
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: "Project?"
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 from which status?",
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 work on issues?",
4506
+ message: "How should Lisa check out code for each issue?",
4495
4507
  options: [
4496
- { value: "branch", label: "Branch", hint: "creates branches in the current checkout" },
4497
- { value: "worktree", label: "Worktree", hint: "creates isolated worktrees per issue" }
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: "Base branch?",
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(pc2.green("Config saved to .lisa/config.yaml"));
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: "Both GitHub CLI and GITHUB_TOKEN detected. Which do you want to use?",
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("Using GitHub CLI for pull requests.");
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("Using GITHUB_TOKEN for pull requests.");
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(`Detected git repository in current directory.`);
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: "Select the repos to include in the workspace:",
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);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tarcisiopgs/lisa",
3
- "version": "1.7.1",
3
+ "version": "1.7.2",
4
4
  "description": "Deterministic autonomous issue resolver — structured AI agent loop for Linear/Trello",
5
5
  "license": "MIT",
6
6
  "type": "module",