@tarcisiopgs/lisa 1.13.0 → 1.13.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/README.md +13 -9
- 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>
|
|
@@ -146,14 +150,14 @@ Lisa delivers pull requests and merge requests to **4 platforms**:
|
|
|
146
150
|
| GitLab | `gitlab` | `GITLAB_TOKEN` | Merge Request |
|
|
147
151
|
| Bitbucket | `bitbucket` | `BITBUCKET_TOKEN` + `BITBUCKET_USERNAME` | Pull Request |
|
|
148
152
|
|
|
149
|
-
Set `
|
|
153
|
+
Set `platform` in your config (or pass `--platform` at runtime) to select the delivery method:
|
|
150
154
|
|
|
151
155
|
```yaml
|
|
152
|
-
|
|
156
|
+
platform: gitlab # or: cli, token, bitbucket
|
|
153
157
|
```
|
|
154
158
|
|
|
155
159
|
```bash
|
|
156
|
-
lisa run --
|
|
160
|
+
lisa run --platform bitbucket # override at runtime
|
|
157
161
|
```
|
|
158
162
|
|
|
159
163
|
Each platform appends a `🤖 Resolved by lisa` attribution comment to the PR/MR after creation.
|
|
@@ -170,9 +174,9 @@ npm install -g @tarcisiopgs/lisa
|
|
|
170
174
|
|
|
171
175
|
```bash
|
|
172
176
|
# PR/MR delivery — set one based on your platform
|
|
173
|
-
export GITHUB_TOKEN="" # GitHub — or have `gh` CLI authenticated (
|
|
174
|
-
export GITLAB_TOKEN="" # GitLab MR creation (
|
|
175
|
-
export BITBUCKET_TOKEN="" # Bitbucket PR creation (
|
|
177
|
+
export GITHUB_TOKEN="" # GitHub — or have `gh` CLI authenticated (platform: cli or token)
|
|
178
|
+
export GITLAB_TOKEN="" # GitLab MR creation (platform: gitlab)
|
|
179
|
+
export BITBUCKET_TOKEN="" # Bitbucket PR creation (platform: bitbucket)
|
|
176
180
|
export BITBUCKET_USERNAME="" # Bitbucket username (required with BITBUCKET_TOKEN)
|
|
177
181
|
|
|
178
182
|
# Required when source = linear
|
|
@@ -222,7 +226,7 @@ export LISA_NO_TELEMETRY=1 # disable reporting (overrides LISA_TELEMETRY and
|
|
|
222
226
|
| `lisa run --provider NAME` | Override AI provider |
|
|
223
227
|
| `lisa run --source NAME` | Override issue source |
|
|
224
228
|
| `lisa run --label NAME` | Override label filter |
|
|
225
|
-
| `lisa run --
|
|
229
|
+
| `lisa run --platform METHOD` | Override PR platform (`cli`, `token`, `gitlab`, or `bitbucket`) |
|
|
226
230
|
| `lisa run --no-bell` | Disable terminal bell on issue completion/failure |
|
|
227
231
|
| `lisa init` | Create `.lisa/config.yaml` interactively (offers pre-defined templates) |
|
|
228
232
|
| `lisa config` | Edit config interactively |
|
|
@@ -285,7 +289,7 @@ source_config:
|
|
|
285
289
|
in_progress: In Progress
|
|
286
290
|
done: In Review
|
|
287
291
|
|
|
288
|
-
|
|
292
|
+
platform: cli # "cli" (gh), "token" (GITHUB_TOKEN), "gitlab" (GITLAB_TOKEN), or "bitbucket" (BITBUCKET_TOKEN)
|
|
289
293
|
workspace: .
|
|
290
294
|
base_branch: main
|
|
291
295
|
|
|
@@ -459,7 +463,7 @@ validation:
|
|
|
459
463
|
require_acceptance_criteria: false
|
|
460
464
|
```
|
|
461
465
|
|
|
462
|
-
> **Note:**
|
|
466
|
+
> **Note:** For Linear, Lisa auto-creates the `needs-spec` label if it does not exist. For other trackers, the label must exist before Lisa can apply it — Lisa will log a warning if it is missing.
|
|
463
467
|
|
|
464
468
|
### Infrastructure Auto-Discovery
|
|
465
469
|
|
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
|
] }) });
|