@tarcisiopgs/lisa 1.13.0 → 1.13.1
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 +4 -0
- package/dist/index.js +87 -1
- package/dist/{kanban-MJCCS3ZP.js → kanban-KE4QMDQM.js} +4 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,6 +8,10 @@
|
|
|
8
8
|
<strong>Label an issue. Walk away. Come back to a PR.</strong>
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
|
+
<p align="center">
|
|
12
|
+
<img src="assets/demo.gif" alt="Lisa demo" width="800" />
|
|
13
|
+
</p>
|
|
14
|
+
|
|
11
15
|
<p align="center">
|
|
12
16
|
Lisa is an autonomous issue resolver that turns your backlog into pull requests — no babysitting required.
|
|
13
17
|
</p>
|
package/dist/index.js
CHANGED
|
@@ -5576,6 +5576,61 @@ async function waitIfPaused() {
|
|
|
5576
5576
|
await sleep(500);
|
|
5577
5577
|
}
|
|
5578
5578
|
}
|
|
5579
|
+
async function runDemoLoop() {
|
|
5580
|
+
const demoIssues = [
|
|
5581
|
+
{ id: "INT-512", title: "Rate limiter" },
|
|
5582
|
+
{ id: "INT-513", title: "WebSocket leak" },
|
|
5583
|
+
{ id: "INT-514", title: "Dark mode UI" }
|
|
5584
|
+
];
|
|
5585
|
+
await sleep(3e3);
|
|
5586
|
+
kanbanEmitter.emit("provider:model-changed", "claude-sonnet-4-6");
|
|
5587
|
+
await sleep(400);
|
|
5588
|
+
for (const issue3 of demoIssues) {
|
|
5589
|
+
kanbanEmitter.emit("issue:queued", {
|
|
5590
|
+
id: issue3.id,
|
|
5591
|
+
title: issue3.title,
|
|
5592
|
+
description: "",
|
|
5593
|
+
url: ""
|
|
5594
|
+
});
|
|
5595
|
+
await sleep(300);
|
|
5596
|
+
}
|
|
5597
|
+
await sleep(600);
|
|
5598
|
+
const issue1 = demoIssues[0];
|
|
5599
|
+
kanbanEmitter.emit("issue:started", issue1.id);
|
|
5600
|
+
const outputs1 = [
|
|
5601
|
+
"Reading issue description...\n",
|
|
5602
|
+
"Analyzing codebase structure...\n",
|
|
5603
|
+
"Creating src/middleware/rateLimiter.ts...\n",
|
|
5604
|
+
"Writing rate limiter logic...\n",
|
|
5605
|
+
"Adding tests in src/middleware/rateLimiter.test.ts...\n",
|
|
5606
|
+
"Running tests... all passing \u2713\n",
|
|
5607
|
+
"Pushing branch int-512-rate-limiting...\n"
|
|
5608
|
+
];
|
|
5609
|
+
for (const line of outputs1) {
|
|
5610
|
+
kanbanEmitter.emit("issue:output", issue1.id, line);
|
|
5611
|
+
await sleep(400);
|
|
5612
|
+
}
|
|
5613
|
+
kanbanEmitter.emit("issue:done", issue1.id, "https://github.com/acme/webapp/pull/89");
|
|
5614
|
+
await sleep(800);
|
|
5615
|
+
const issue2 = demoIssues[1];
|
|
5616
|
+
kanbanEmitter.emit("issue:started", issue2.id);
|
|
5617
|
+
const outputs2 = [
|
|
5618
|
+
"Reading issue description...\n",
|
|
5619
|
+
"Locating WebSocket connection handler...\n",
|
|
5620
|
+
"Patching connection lifecycle in src/ws/handler.ts...\n",
|
|
5621
|
+
"Adding cleanup in disconnect callback...\n",
|
|
5622
|
+
"Pushing branch int-513-fix-ws-memory-leak...\n"
|
|
5623
|
+
];
|
|
5624
|
+
for (const line of outputs2) {
|
|
5625
|
+
kanbanEmitter.emit("issue:output", issue2.id, line);
|
|
5626
|
+
await sleep(400);
|
|
5627
|
+
}
|
|
5628
|
+
kanbanEmitter.emit("issue:done", issue2.id, "https://github.com/acme/webapp/pull/90");
|
|
5629
|
+
await sleep(800);
|
|
5630
|
+
kanbanEmitter.emit("work:complete", { total: 2, duration: 14e3 });
|
|
5631
|
+
await sleep(3e3);
|
|
5632
|
+
kanbanEmitter.emit("tui:exit");
|
|
5633
|
+
}
|
|
5579
5634
|
|
|
5580
5635
|
// src/templates.ts
|
|
5581
5636
|
var CONFIG_TEMPLATES = [
|
|
@@ -5721,12 +5776,43 @@ var run = defineCommand({
|
|
|
5721
5776
|
"lifecycle-timeout": {
|
|
5722
5777
|
type: "string",
|
|
5723
5778
|
description: "Startup timeout per resource in seconds (default: 30)"
|
|
5779
|
+
},
|
|
5780
|
+
demo: {
|
|
5781
|
+
type: "boolean",
|
|
5782
|
+
description: "Run an animated demo of the kanban UI with fake issues",
|
|
5783
|
+
default: false
|
|
5724
5784
|
}
|
|
5725
5785
|
},
|
|
5726
5786
|
async run({ args }) {
|
|
5727
5787
|
const isTTY = !!process.stdout.isTTY;
|
|
5728
5788
|
setOutputMode(isTTY ? "tui" : "default");
|
|
5729
5789
|
banner();
|
|
5790
|
+
if (args.demo) {
|
|
5791
|
+
if (isTTY) {
|
|
5792
|
+
const { render } = await import("ink");
|
|
5793
|
+
const { createElement } = await import("react");
|
|
5794
|
+
const { KanbanApp } = await import("./kanban-KE4QMDQM.js");
|
|
5795
|
+
const demoConfig = {
|
|
5796
|
+
provider: "claude",
|
|
5797
|
+
source: "linear",
|
|
5798
|
+
workflow: "worktree",
|
|
5799
|
+
platform: "cli",
|
|
5800
|
+
source_config: {
|
|
5801
|
+
team: "Engineering",
|
|
5802
|
+
project: "Web App",
|
|
5803
|
+
label: "ready",
|
|
5804
|
+
pick_from: "Ready",
|
|
5805
|
+
in_progress: "In Progress",
|
|
5806
|
+
done: "Done"
|
|
5807
|
+
},
|
|
5808
|
+
loop: { cooldown: 30 },
|
|
5809
|
+
bell: false
|
|
5810
|
+
};
|
|
5811
|
+
render(createElement(KanbanApp, { config: demoConfig }), { exitOnCtrlC: false });
|
|
5812
|
+
}
|
|
5813
|
+
await runDemoLoop();
|
|
5814
|
+
return;
|
|
5815
|
+
}
|
|
5730
5816
|
if (!configExists()) {
|
|
5731
5817
|
console.error(pc.red("No configuration found. Run `lisa init` first."));
|
|
5732
5818
|
process.exit(1);
|
|
@@ -5771,7 +5857,7 @@ Add them to your ${shell} and run: source ${shell}`));
|
|
|
5771
5857
|
if (isTTY) {
|
|
5772
5858
|
const { render } = await import("ink");
|
|
5773
5859
|
const { createElement } = await import("react");
|
|
5774
|
-
const { KanbanApp } = await import("./kanban-
|
|
5860
|
+
const { KanbanApp } = await import("./kanban-KE4QMDQM.js");
|
|
5775
5861
|
render(createElement(KanbanApp, { config: merged }), { exitOnCtrlC: false });
|
|
5776
5862
|
}
|
|
5777
5863
|
await runLoop(merged, {
|
|
@@ -184,7 +184,7 @@ var HEADER_ROWS = 8;
|
|
|
184
184
|
var SIDEBAR_WIDTH = 28;
|
|
185
185
|
var COLUMN_OVERHEAD = 4;
|
|
186
186
|
var CARD_OVERHEAD = 5;
|
|
187
|
-
var MIN_CARD_WIDTH =
|
|
187
|
+
var MIN_CARD_WIDTH = 1;
|
|
188
188
|
function calcVisibleCount(terminalRows) {
|
|
189
189
|
return Math.max(1, Math.floor((terminalRows - HEADER_ROWS) / CARD_HEIGHT));
|
|
190
190
|
}
|
|
@@ -288,16 +288,15 @@ function ProgressHeader({
|
|
|
288
288
|
}
|
|
289
289
|
const progress = done / total * 100;
|
|
290
290
|
const pct = Math.round(progress);
|
|
291
|
-
const progressBarLength = 100;
|
|
292
|
-
const completedBars = Math.round(progress / 100 * progressBarLength);
|
|
293
|
-
const remainingBars = progressBarLength - completedBars;
|
|
294
291
|
const barColor = workComplete ? "green" : watching ? "cyan" : paused ? "yellow" : "cyan";
|
|
295
292
|
const borderColor = workComplete ? "green" : watching ? "cyan" : paused ? "yellow" : "gray";
|
|
296
293
|
const statsText = `${done}/${total} (${pct}%)${running > 0 ? ` (${running} running)` : ""}`;
|
|
297
294
|
const statsLength = statsText.length;
|
|
298
295
|
const terminalWidth = availableWidth ?? stdout?.columns ?? 80;
|
|
299
296
|
const barWidth = Math.max(10, terminalWidth - statsLength - OVERHEAD);
|
|
300
|
-
const
|
|
297
|
+
const completedBars = Math.round(progress / 100 * barWidth);
|
|
298
|
+
const remainingBars = barWidth - completedBars;
|
|
299
|
+
const progressBar = /* @__PURE__ */ jsx3(Box3, { width: barWidth, children: /* @__PURE__ */ jsxs3(Text3, { color: barColor, children: [
|
|
301
300
|
"\u2588".repeat(completedBars),
|
|
302
301
|
"\u2591".repeat(remainingBars)
|
|
303
302
|
] }) });
|