@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
|
|
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(
|
|
370
|
-
|
|
371
|
-
console.log(pc.
|
|
372
|
-
console.log(pc.
|
|
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
|
|
1561
|
+
async function getAllProvidersWithAvailability() {
|
|
1589
1562
|
const all = Object.values(providers).map((f) => f());
|
|
1590
|
-
|
|
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-
|
|
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
|
|
4292
|
+
var CURSOR_MODELS_FALLBACK = [
|
|
4323
4293
|
"auto",
|
|
4324
4294
|
"composer-1.5",
|
|
4325
|
-
"
|
|
4326
|
-
"
|
|
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
|
-
"
|
|
4333
|
-
"
|
|
4334
|
-
"
|
|
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
|
-
|
|
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-
|
|
4358
|
-
gemini: ["gemini-2.5-pro", "gemini-2.
|
|
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
|
|
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:
|
|
4383
|
-
value:
|
|
4384
|
-
label: providerLabels[
|
|
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 =
|
|
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",
|
|
4417
|
-
{
|
|
4418
|
-
|
|
4419
|
-
|
|
4420
|
-
|
|
4421
|
-
|
|
4422
|
-
|
|
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: "
|
|
367
|
-
/* @__PURE__ */ jsx5(Text5, { color: "yellow", children: "\
|
|
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
|
] }),
|