@tarcisiopgs/lisa 1.7.2 → 1.7.4

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 CHANGED
@@ -337,39 +337,12 @@ function divider(session) {
337
337
  }
338
338
  function banner() {
339
339
  if (outputMode !== "default") return;
340
- const art = `
341
- @@%#@@
342
- @@%=--=%@ @@
343
- @@@@@@@@%@+------*@%%@%##*@
344
- @*=======---------===-----@@
345
- @=------------------------#@
346
- @=------------------------+@@
347
- @@=-------------------------+#%%%@@
348
- @@@#=--------------------------------%@
349
- @@*=------------------=---------------=@
350
- @%------=%--=%=--@==+@=--------------@@
351
- @@+-##+*%**#%=-+*+==+####*---------#@
352
- @%*%-::::::%#::::::::+@=---------#@
353
- @@@-:++::::@-::::=::::*%*=--------*@@
354
- @+:==::::%=::::#-:::%==----------=@@
355
- @@+:=%%%%*#+::::::+%=-----------=@@
356
- @%*@=-----=*******---*+=-----=%@
357
- @%=--+##**#=----------#++##----=@
358
- @-----------------#=---**+%-----%@
359
- @%*+=-----===++**#@#--%**#=-==++%@
360
- @@@%%@#*+++=---=--=%----%%%@@@
361
- @@@----------*@#**#@
362
- @@@=---------#@@
363
- @+*%*%%###%*%%=-@
364
- @%@+=#@==@#:+@##@
365
- @@@@%%@##%
366
- `;
367
- const title = " Lisa \u2014 deterministic autonomous issue resolver ";
340
+ const title = " lisa \u266A autonomous issue resolver ";
368
341
  const border = "\u2500".repeat(title.length);
369
- console.log(pc.yellow(art));
370
- console.log(pc.cyan(` \u250C${border}\u2510`));
371
- console.log(pc.cyan(` \u2502${title}\u2502`));
372
- console.log(pc.cyan(` \u2514${border}\u2518
342
+ console.log(pc.yellow(`
343
+ \u250C${border}\u2510`));
344
+ console.log(pc.yellow(` \u2502`) + pc.bold(pc.white(title)) + pc.yellow("\u2502"));
345
+ console.log(pc.yellow(` \u2514${border}\u2518
373
346
  `));
374
347
  }
375
348
 
@@ -1585,12 +1558,9 @@ var providers = {
1585
1558
  goose: () => new GooseProvider(),
1586
1559
  aider: () => new AiderProvider()
1587
1560
  };
1588
- async function getAvailableProviders() {
1561
+ async function getAllProvidersWithAvailability() {
1589
1562
  const all = Object.values(providers).map((f) => f());
1590
- const results = await Promise.all(
1591
- all.map(async (p) => ({ provider: p, available: await p.isAvailable() }))
1592
- );
1593
- return results.filter((r) => r.available).map((r) => r.provider);
1563
+ return Promise.all(all.map(async (p) => ({ provider: p, available: await p.isAvailable() })));
1594
1564
  }
1595
1565
  function createProvider(name) {
1596
1566
  const factory = providers[name];
@@ -4122,7 +4092,7 @@ Add them to your ${shell} and run: source ${shell}`));
4122
4092
  if (isTUI) {
4123
4093
  const { render } = await import("ink");
4124
4094
  const { createElement } = await import("react");
4125
- const { KanbanApp } = await import("./kanban-BY7QNVEE.js");
4095
+ const { KanbanApp } = await import("./kanban-KPIDX2SU.js");
4126
4096
  render(createElement(KanbanApp, { config: merged }), { exitOnCtrlC: false });
4127
4097
  }
4128
4098
  await runLoop(merged, {
@@ -4319,20 +4289,50 @@ var issue = defineCommand({
4319
4289
  meta: { name: "issue", description: "Issue tracker operations for use inside worktrees" },
4320
4290
  subCommands: { get: issueGet, done: issueDone }
4321
4291
  });
4322
- var CURSOR_MODELS = [
4292
+ var CURSOR_MODELS_FALLBACK = [
4323
4293
  "auto",
4324
4294
  "composer-1.5",
4325
- "composer-1",
4326
- "gpt-5.3-codex",
4327
- "gpt-5.3-codex-low",
4328
- "gpt-5.3-codex-high",
4329
- "gpt-5.3-codex-xhigh",
4330
- "gpt-5.3-codex-fast",
4295
+ "opus-4.6-thinking",
4296
+ "opus-4.6",
4331
4297
  "sonnet-4.6",
4332
- "sonnet-4.6-thinking",
4333
- "sonnet-4.5",
4334
- "sonnet-4.5-thinking"
4298
+ "gpt-5.3-codex",
4299
+ "gpt-5.2",
4300
+ "gemini-3.1-pro"
4335
4301
  ];
4302
+ function fetchCursorModels() {
4303
+ try {
4304
+ const bin = ["agent", "cursor-agent"].find((b) => {
4305
+ try {
4306
+ execSync8(`${b} --version`, { stdio: "ignore" });
4307
+ return true;
4308
+ } catch {
4309
+ return false;
4310
+ }
4311
+ });
4312
+ if (!bin) return CURSOR_MODELS_FALLBACK;
4313
+ const raw = execSync8(`${bin} --list-models`, { encoding: "utf-8", timeout: 1e4 });
4314
+ const clean = raw.replace(/\x1b\[[0-9;]*[mGKHFA-Z]/g, "");
4315
+ const models = clean.split("\n").map((l) => l.trim()).filter((l) => l.includes(" - ")).map((l) => (l.split(" - ")[0] ?? "").trim()).filter(Boolean);
4316
+ return models.length > 0 ? models : CURSOR_MODELS_FALLBACK;
4317
+ } catch {
4318
+ return CURSOR_MODELS_FALLBACK;
4319
+ }
4320
+ }
4321
+ function fetchOpenCodeModels() {
4322
+ try {
4323
+ const raw = execSync8("opencode models", { encoding: "utf-8", timeout: 1e4 });
4324
+ return raw.split("\n").map((l) => l.trim()).filter(
4325
+ (m) => (
4326
+ // Latest Anthropic Claude 4.x — exclude dated snapshots (contain 8-digit date suffix)
4327
+ /^anthropic\/claude-(opus|sonnet|haiku)-4-\d+$/.test(m) || // Google Gemini 2.5 stable (no preview/tts suffixes)
4328
+ /^google\/gemini-2\.5-(pro|flash|flash-lite)$/.test(m) || // OpenCode proprietary models
4329
+ /^opencode\//.test(m)
4330
+ )
4331
+ );
4332
+ } catch {
4333
+ return [];
4334
+ }
4335
+ }
4336
4336
  var main = defineCommand({
4337
4337
  meta: {
4338
4338
  name: "lisa",
@@ -4342,8 +4342,7 @@ var main = defineCommand({
4342
4342
  subCommands: { run, config, init, status, issue }
4343
4343
  });
4344
4344
  async function runConfigWizard() {
4345
- banner();
4346
- clack.intro(pc2.cyan(" lisa \u2014 autonomous issue resolver "));
4345
+ clack.intro(pc2.cyan(" lisa \u266A autonomous issue resolver "));
4347
4346
  const providerLabels = {
4348
4347
  claude: "Claude Code",
4349
4348
  gemini: "Gemini CLI",
@@ -4354,10 +4353,16 @@ async function runConfigWizard() {
4354
4353
  aider: "Aider"
4355
4354
  };
4356
4355
  const providerModels = {
4357
- claude: ["claude-sonnet-4-6", "claude-opus-4-6", "claude-haiku-4-5"],
4358
- gemini: ["gemini-2.5-pro", "gemini-2.0-flash", "gemini-1.5-pro"]
4356
+ claude: ["claude-opus-4-6", "claude-sonnet-4-6", "claude-haiku-4-5", "claude-sonnet-4-5"],
4357
+ gemini: ["gemini-2.5-pro", "gemini-2.5-flash", "gemini-2.5-flash-lite"],
4358
+ // opencode: populated dynamically below (fetchOpenCodeModels)
4359
+ copilot: ["claude-opus-4.6", "claude-sonnet-4.6", "claude-haiku-4.5", "gpt-5.2"],
4360
+ goose: ["claude-sonnet-4-5", "claude-opus-4-5", "claude-haiku-4-5"],
4361
+ aider: ["claude-opus-4-6", "claude-sonnet-4-5", "claude-haiku-4-5"]
4362
+ // cursor: populated dynamically below (fetchCursorModels)
4359
4363
  };
4360
- const available = await getAvailableProviders();
4364
+ const allProviders = await getAllProvidersWithAvailability();
4365
+ const available = allProviders.filter((r) => r.available).map((r) => r.provider);
4361
4366
  if (available.length === 0) {
4362
4367
  clack.log.error("No AI provider found on your system.");
4363
4368
  clack.log.info(
@@ -4379,9 +4384,11 @@ async function runConfigWizard() {
4379
4384
  } else {
4380
4385
  const selected = await clack.select({
4381
4386
  message: "Which AI provider should resolve your issues?",
4382
- options: available.map((p) => ({
4383
- value: p.name,
4384
- label: providerLabels[p.name]
4387
+ options: allProviders.map(({ provider, available: isAvailable }) => ({
4388
+ value: provider.name,
4389
+ label: providerLabels[provider.name],
4390
+ hint: isAvailable ? void 0 : "not installed",
4391
+ disabled: !isAvailable
4385
4392
  }))
4386
4393
  });
4387
4394
  if (clack.isCancel(selected)) return process.exit(0);
@@ -4395,8 +4402,17 @@ async function runConfigWizard() {
4395
4402
  availableModels = ["auto"];
4396
4403
  clack.log.info("Cursor Free plan detected \u2014 only the 'auto' model is available.");
4397
4404
  } else {
4398
- availableModels = CURSOR_MODELS;
4405
+ availableModels = fetchCursorModels();
4399
4406
  }
4407
+ } else if (providerName === "opencode") {
4408
+ const dynamic = fetchOpenCodeModels();
4409
+ availableModels = dynamic.length > 0 ? dynamic : [
4410
+ "anthropic/claude-opus-4-6",
4411
+ "anthropic/claude-sonnet-4-6",
4412
+ "anthropic/claude-haiku-4-5",
4413
+ "google/gemini-2.5-pro",
4414
+ "google/gemini-2.5-flash"
4415
+ ];
4400
4416
  }
4401
4417
  if (availableModels && availableModels.length > 0) {
4402
4418
  const modelSelection = await clack.multiselect({
@@ -4413,14 +4429,47 @@ async function runConfigWizard() {
4413
4429
  const source = await clack.select({
4414
4430
  message: "Where do your issues come from?",
4415
4431
  options: [
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" }
4423
- ]
4432
+ { value: "linear", label: "Linear", apiHint: "GraphQL API", envVars: ["LINEAR_API_KEY"] },
4433
+ {
4434
+ value: "trello",
4435
+ label: "Trello",
4436
+ apiHint: "REST API",
4437
+ envVars: ["TRELLO_API_KEY", "TRELLO_TOKEN"]
4438
+ },
4439
+ {
4440
+ value: "github-issues",
4441
+ label: "GitHub Issues",
4442
+ apiHint: "REST API",
4443
+ envVars: ["GITHUB_TOKEN"]
4444
+ },
4445
+ {
4446
+ value: "gitlab-issues",
4447
+ label: "GitLab Issues",
4448
+ apiHint: "REST API",
4449
+ envVars: ["GITLAB_TOKEN"]
4450
+ },
4451
+ { value: "plane", label: "Plane", apiHint: "REST API", envVars: ["PLANE_API_TOKEN"] },
4452
+ {
4453
+ value: "shortcut",
4454
+ label: "Shortcut",
4455
+ apiHint: "REST API",
4456
+ envVars: ["SHORTCUT_API_TOKEN"]
4457
+ },
4458
+ {
4459
+ value: "jira",
4460
+ label: "Jira",
4461
+ apiHint: "REST API",
4462
+ envVars: ["JIRA_BASE_URL", "JIRA_EMAIL", "JIRA_API_TOKEN"]
4463
+ }
4464
+ ].map(({ value, label: label2, apiHint, envVars }) => {
4465
+ const missing2 = envVars.filter((v) => !process.env[v]);
4466
+ return {
4467
+ value,
4468
+ label: label2,
4469
+ hint: missing2.length > 0 ? `missing: ${missing2.join(", ")}` : apiHint,
4470
+ disabled: missing2.length > 0
4471
+ };
4472
+ })
4424
4473
  });
4425
4474
  if (clack.isCancel(source)) return process.exit(0);
4426
4475
  const missing = await getMissingEnvVars(source);
@@ -4656,6 +4705,17 @@ async function getMissingEnvVars(source) {
4656
4705
  } else if (source === "trello") {
4657
4706
  if (!process.env.TRELLO_API_KEY) missing.push("TRELLO_API_KEY");
4658
4707
  if (!process.env.TRELLO_TOKEN) missing.push("TRELLO_TOKEN");
4708
+ } else if (source === "github-issues") {
4709
+ } else if (source === "gitlab-issues") {
4710
+ if (!process.env.GITLAB_TOKEN) missing.push("GITLAB_TOKEN");
4711
+ } else if (source === "plane") {
4712
+ if (!process.env.PLANE_API_TOKEN) missing.push("PLANE_API_TOKEN");
4713
+ } else if (source === "shortcut") {
4714
+ if (!process.env.SHORTCUT_API_TOKEN) missing.push("SHORTCUT_API_TOKEN");
4715
+ } else if (source === "jira") {
4716
+ if (!process.env.JIRA_BASE_URL) missing.push("JIRA_BASE_URL");
4717
+ if (!process.env.JIRA_EMAIL) missing.push("JIRA_EMAIL");
4718
+ if (!process.env.JIRA_API_TOKEN) missing.push("JIRA_API_TOKEN");
4659
4719
  }
4660
4720
  return missing;
4661
4721
  }
@@ -362,9 +362,11 @@ function Sidebar({ provider, source, cwd }) {
362
362
  /* @__PURE__ */ jsxs5(Box5, { flexDirection: "column", marginBottom: 1, children: [
363
363
  /* @__PURE__ */ jsx5(Text5, { color: "yellow", children: "\u2554\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2557" }),
364
364
  /* @__PURE__ */ jsxs5(Text5, { color: "yellow", children: [
365
- "\u2551",
366
- /* @__PURE__ */ jsx5(Text5, { color: "white", bold: true, children: " L I S A v 2 " }),
367
- /* @__PURE__ */ jsx5(Text5, { color: "yellow", children: "\u2551" })
365
+ "\u2551 ",
366
+ /* @__PURE__ */ jsx5(Text5, { color: "white", bold: true, children: "L I S A " }),
367
+ /* @__PURE__ */ jsx5(Text5, { color: "yellow", bold: true, children: "\u266A" }),
368
+ /* @__PURE__ */ jsx5(Text5, { color: "white", bold: true, children: " " }),
369
+ "\u2551"
368
370
  ] }),
369
371
  /* @__PURE__ */ jsx5(Text5, { color: "yellow", children: "\u255A\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u255D" })
370
372
  ] }),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tarcisiopgs/lisa",
3
- "version": "1.7.2",
3
+ "version": "1.7.4",
4
4
  "description": "Deterministic autonomous issue resolver — structured AI agent loop for Linear/Trello",
5
5
  "license": "MIT",
6
6
  "type": "module",