@tarcisiopgs/lisa 1.20.1 → 1.20.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 +114 -338
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -15,258 +15,72 @@
|
|
|
15
15
|
<img src="assets/demo.gif" alt="Lisa demo" />
|
|
16
16
|
</p>
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
Lisa is an autonomous issue resolver that turns your backlog into pull requests — no babysitting required.
|
|
20
|
-
</p>
|
|
21
|
-
|
|
22
|
-
---
|
|
18
|
+
Lisa connects your issue tracker to an AI coding agent and delivers pull requests — autonomously. Tag an issue with a label, Lisa picks it up, implements it, opens a PR, and updates your board. No babysitting.
|
|
23
19
|
|
|
24
20
|
## Quickstart
|
|
25
21
|
|
|
26
22
|
```bash
|
|
27
23
|
npm install -g @tarcisiopgs/lisa
|
|
28
|
-
lisa init
|
|
24
|
+
lisa init # interactive setup wizard
|
|
29
25
|
lisa run
|
|
30
26
|
```
|
|
31
27
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
## Try it safely first
|
|
35
|
-
|
|
36
|
-
Before letting Lisa touch real issues, verify your configuration with `--dry-run`. No issues will be fetched, no code will be written, no PRs will be created.
|
|
37
|
-
|
|
38
|
-
```bash
|
|
39
|
-
lisa run --once --dry-run
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
Example output:
|
|
28
|
+
## How It Works
|
|
43
29
|
|
|
44
30
|
```
|
|
45
|
-
|
|
46
|
-
[dry-run] Workflow mode: worktree
|
|
47
|
-
[dry-run] Models priority: claude/claude-sonnet-4-6
|
|
48
|
-
[dry-run] Then implement, push, create PR, and update issue status
|
|
31
|
+
Fetch issue → Activate → Build context → Implement → Push → Open PR → Update board → Next
|
|
49
32
|
```
|
|
50
33
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
## What Lisa Does
|
|
34
|
+
Lisa picks the highest-priority labeled issue, moves it to "In Progress", sends a structured prompt to the AI agent, and monitors execution. The agent works in an isolated git worktree, implements the change, runs tests, and commits. Lisa pushes, opens a PR, moves the ticket to "In Review", and picks up the next one.
|
|
54
35
|
|
|
55
|
-
Lisa
|
|
36
|
+
If something fails — pre-push hooks, quota limits, stuck processes — Lisa handles it: retries with error context, falls back to the next model, or kills and moves on.
|
|
56
37
|
|
|
57
|
-
|
|
58
|
-
┌─────────┐ ┌──────────┐ ┌─────────┐ ┌───────────┐ ┌──────────┐ ┌────┐ ┌────────┐
|
|
59
|
-
│ Fetch │───▶│ Activate │───▶│ Context │───▶│ Implement │───▶│ Validate │───▶│ PR │───▶│ Update │
|
|
60
|
-
└─────────┘ └──────────┘ └─────────┘ └───────────┘ └──────────┘ └────┘ └────────┘
|
|
61
|
-
```
|
|
38
|
+
## Features
|
|
62
39
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
### What makes it different
|
|
73
|
-
|
|
74
|
-
- **Deterministic, not hopeful** — Each issue follows a structured pipeline with clear stages. No blind retries, no speculative loops.
|
|
75
|
-
- **Token efficiency** — Each issue gets one focused prompt. No wasted retries, no idle polling.
|
|
76
|
-
- **Multi-repo awareness** — Plans across multiple repos, executes in the correct order, creates one PR per repo.
|
|
77
|
-
- **Model fallback** — Configure a chain of models. Transient errors (429, quota, timeout) trigger the next model automatically.
|
|
78
|
-
- **Workflow integration** — Issues move through your board in real time. Your team always knows what's being worked on.
|
|
79
|
-
- **Self-healing** — Orphan issues stuck in "In Progress" are recovered on startup. Pre-push failures trigger the agent to fix and retry.
|
|
80
|
-
- **Guardrails** — Past failures are logged and injected into future prompts so the agent avoids repeating mistakes.
|
|
40
|
+
- **7 issue trackers** — Linear, GitHub Issues, GitLab Issues, Jira, Trello, Plane, Shortcut
|
|
41
|
+
- **8 AI agents** — Claude Code, Gemini CLI, GitHub Copilot CLI, Cursor Agent, Aider, Goose, OpenCode, Codex
|
|
42
|
+
- **Concurrent execution** — process multiple issues in parallel, each in its own worktree
|
|
43
|
+
- **Multi-repo** — plans across repos, creates one PR per repo in the correct order
|
|
44
|
+
- **Model fallback** — chain models; transient errors (429, quota, timeout) auto-switch to the next
|
|
45
|
+
- **Real-time TUI** — Kanban board with live provider output, keyboard controls, PR merge detection
|
|
46
|
+
- **Self-healing** — orphan recovery on startup, push failure retry, stuck process detection
|
|
47
|
+
- **Guardrails** — past failures are injected into future prompts to avoid repeating mistakes
|
|
48
|
+
- **Project context** — auto-generates `.lisa/context.md` with your stack, conventions, and constraints
|
|
81
49
|
|
|
82
50
|
## Providers
|
|
83
51
|
|
|
84
|
-
| Provider | Key |
|
|
85
|
-
|
|
86
|
-
| Claude Code | `claude` | `
|
|
87
|
-
| Gemini CLI | `gemini` | `
|
|
88
|
-
|
|
|
89
|
-
|
|
|
90
|
-
| Cursor Agent | `cursor` | `agent` / `cursor-agent` |
|
|
91
|
-
| Goose | `goose` | `goose` |
|
|
92
|
-
| Aider | `aider` | `aider` |
|
|
93
|
-
| OpenAI Codex | `codex` | `codex` |
|
|
52
|
+
| Provider | Key | Provider | Key |
|
|
53
|
+
|----------|-----|----------|-----|
|
|
54
|
+
| Claude Code | `claude` | Cursor Agent | `cursor` |
|
|
55
|
+
| Gemini CLI | `gemini` | Goose | `goose` |
|
|
56
|
+
| GitHub Copilot CLI | `copilot` | Aider | `aider` |
|
|
57
|
+
| OpenCode | `opencode` | OpenAI Codex | `codex` |
|
|
94
58
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
### Fallback Chain
|
|
98
|
-
|
|
99
|
-
Configure multiple models — Lisa tries each in order. Transient errors (429, quota, timeout, network) trigger the next model; non-transient errors stop the chain.
|
|
59
|
+
Configure a fallback chain:
|
|
100
60
|
|
|
101
61
|
```yaml
|
|
102
62
|
provider: claude
|
|
103
63
|
models:
|
|
104
64
|
- claude-sonnet-4-6 # primary
|
|
105
|
-
- claude-opus-4-6 # fallback
|
|
106
|
-
- claude-haiku-4-5 # fallback 2
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
When the TUI is active, the sidebar shows a **Model Queue** — the currently active model is highlighted with a bullet (●).
|
|
110
|
-
|
|
111
|
-
## Install
|
|
112
|
-
|
|
113
|
-
```bash
|
|
114
|
-
npm install -g @tarcisiopgs/lisa
|
|
115
|
-
```
|
|
116
|
-
|
|
117
|
-
## Environment Variables
|
|
118
|
-
|
|
119
|
-
```bash
|
|
120
|
-
# Required for PR creation (at least one)
|
|
121
|
-
export GITHUB_TOKEN="" # or have `gh` CLI authenticated
|
|
122
|
-
export GITLAB_TOKEN="" # platform: gitlab
|
|
123
|
-
export BITBUCKET_TOKEN="" # platform: bitbucket
|
|
124
|
-
export BITBUCKET_USERNAME=""
|
|
125
|
-
|
|
126
|
-
# Required when source = linear
|
|
127
|
-
export LINEAR_API_KEY=""
|
|
128
|
-
|
|
129
|
-
# Required when source = trello
|
|
130
|
-
export TRELLO_API_KEY=""
|
|
131
|
-
export TRELLO_TOKEN=""
|
|
132
|
-
|
|
133
|
-
# Required when source = plane
|
|
134
|
-
export PLANE_API_TOKEN=""
|
|
135
|
-
export PLANE_BASE_URL="" # optional; defaults to https://api.plane.so
|
|
136
|
-
|
|
137
|
-
# Required when source = shortcut
|
|
138
|
-
export SHORTCUT_API_TOKEN=""
|
|
139
|
-
|
|
140
|
-
# Required when source = gitlab-issues
|
|
141
|
-
export GITLAB_TOKEN=""
|
|
142
|
-
export GITLAB_BASE_URL="" # optional; defaults to https://gitlab.com
|
|
143
|
-
|
|
144
|
-
# Required when source = github-issues
|
|
145
|
-
export GITHUB_TOKEN="" # same token used for PR creation
|
|
146
|
-
|
|
147
|
-
# Required when source = jira
|
|
148
|
-
export JIRA_BASE_URL="" # e.g. https://yourcompany.atlassian.net
|
|
149
|
-
export JIRA_EMAIL="" # Atlassian account email
|
|
150
|
-
export JIRA_API_TOKEN="" # Atlassian API token
|
|
151
|
-
|
|
152
|
-
# Required when provider = aider (one of)
|
|
153
|
-
export GEMINI_API_KEY=""
|
|
154
|
-
export OPENAI_API_KEY=""
|
|
155
|
-
export ANTHROPIC_API_KEY=""
|
|
65
|
+
- claude-opus-4-6 # fallback
|
|
156
66
|
```
|
|
157
67
|
|
|
158
68
|
## Commands
|
|
159
69
|
|
|
160
|
-
| Command | Description |
|
|
161
|
-
|---------|-------------|
|
|
162
|
-
| `lisa run` | Run the agent loop |
|
|
163
|
-
| `lisa run --once` | Process a single issue |
|
|
164
|
-
| `lisa run --once --dry-run` | **Recommended first step** — preview config without executing |
|
|
165
|
-
| `lisa run --watch` | Keep running after queue empties — poll for new issues every 60s |
|
|
166
|
-
| `lisa run --issue ID` | Process a specific issue by identifier or URL |
|
|
167
|
-
| `lisa run --concurrency N` | Process N issues in parallel (each in its own worktree) |
|
|
168
|
-
| `lisa run --limit N` | Stop after processing N issues |
|
|
169
|
-
| `lisa run --provider NAME` | Override AI provider |
|
|
170
|
-
| `lisa run --source NAME` | Override issue source |
|
|
171
|
-
| `lisa run --label NAME` | Override label filter |
|
|
172
|
-
| `lisa run --platform NAME` | Override PR platform (`cli`, `token`, `gitlab`, `bitbucket`) |
|
|
173
|
-
| `lisa run --no-bell` | Disable terminal bell on completion/failure |
|
|
174
|
-
| `lisa run --demo` | Run an animated demo of the Kanban UI with fake issues |
|
|
175
|
-
| `lisa init` | Create `.lisa/config.yaml` interactively |
|
|
176
|
-
| `lisa config --show` | Print current config |
|
|
177
|
-
| `lisa status` | Show session stats and log file location |
|
|
178
|
-
| `lisa context` | Show the current `.lisa/context.md` for all repos |
|
|
179
|
-
| `lisa context refresh` | Regenerate `.lisa/context.md` |
|
|
180
|
-
| `lisa context refresh --repo NAME` | Regenerate context for a specific repo (multi-repo only) |
|
|
181
|
-
| `lisa feedback --pr URL` | Inject PR review feedback from a closed PR into guardrails |
|
|
182
|
-
|
|
183
|
-
## TUI
|
|
184
|
-
|
|
185
|
-
When running in an interactive terminal, `lisa run` renders a real-time Kanban board:
|
|
186
|
-
|
|
187
|
-
```
|
|
188
|
-
┌──────────────────────────┐ ┌───────────────────────────┐ ┌───────────────────────────┐
|
|
189
|
-
│ ▶ BACKLOG [3] │ │ ▶ IN PROGRESS [1] │ │ ▶ IN REVIEW [2] │
|
|
190
|
-
│ │ │ │ │ │
|
|
191
|
-
│ ┌────────────────────┐ │ │ ┌─────────────────────┐ │ │ ┌─────────────────────┐ │
|
|
192
|
-
│ │ ENG-42 │ │ │ │ ● ENG-38 │ │ │ │ ✓ ENG-35 │ │
|
|
193
|
-
│ │ Add dark mode │ │ │ │ Fix login redirect │ │ │ │ Update dependencies │ │
|
|
194
|
-
│ │ ready │ │ │ │ ~1m running │ │ │ │ PR created │ │
|
|
195
|
-
│ └────────────────────┘ │ │ └─────────────────────┘ │ │ └─────────────────────┘ │
|
|
196
|
-
└──────────────────────────┘ └───────────────────────────┘ └───────────────────────────┘
|
|
197
|
-
```
|
|
198
|
-
|
|
199
|
-
### Keyboard shortcuts
|
|
200
|
-
|
|
201
|
-
| Key | Action |
|
|
202
|
-
|-----|--------|
|
|
203
|
-
| `←` `→` | Switch columns |
|
|
204
|
-
| `↑` `↓` | Navigate cards within a column |
|
|
205
|
-
| `↵` | Open issue detail view (streams provider output) |
|
|
206
|
-
| `p` | Pause / resume (suspends the active provider process) |
|
|
207
|
-
| `k` | Kill the selected in-progress issue (marks it for retry) |
|
|
208
|
-
| `s` | Skip the selected in-progress issue (moves back to Backlog) |
|
|
209
|
-
| `q` | Quit |
|
|
210
|
-
| `Esc` | Return to board from detail view |
|
|
211
|
-
| `o` | Open PR URL in browser (detail view, when PR exists) |
|
|
212
|
-
|
|
213
|
-
The terminal tab title updates in real time: it shows a spinner with the active issue ID while work is in progress, and a checkmark when done.
|
|
214
|
-
|
|
215
|
-
### State Persistence
|
|
216
|
-
|
|
217
|
-
The Kanban board state is saved automatically to the OS cache directory and restored when you restart `lisa run`. Cards survive process restarts — issues that completed remain visible in "Done", and issues that were mid-flight are correctly re-queued as Backlog.
|
|
218
|
-
|
|
219
|
-
### PR Merge Detection
|
|
220
|
-
|
|
221
|
-
For GitHub and GitLab PRs, Lisa polls every 60 seconds and marks cards in the Done column as **merged** once the PR is merged — live, without restarting.
|
|
222
|
-
|
|
223
|
-
## Project Context
|
|
224
|
-
|
|
225
|
-
On first run, Lisa automatically analyzes your codebase and writes `.lisa/context.md` — a concise document covering your stack, exact tool commands, file conventions, and constraints. This file is injected into every agent prompt so the agent works correctly from the start without rediscovering project-specific patterns.
|
|
226
|
-
|
|
227
|
-
Context is generated once and reused on subsequent runs. To regenerate it (e.g. after switching stacks or adding tooling):
|
|
228
|
-
|
|
229
|
-
```bash
|
|
230
|
-
lisa context refresh
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
For multi-repo workspaces, Lisa generates a per-repo `context.md` for each repository plus a global workspace context describing cross-repo relationships and execution ordering rules.
|
|
234
|
-
|
|
235
70
|
```bash
|
|
236
|
-
lisa
|
|
71
|
+
lisa run # start the agent loop
|
|
72
|
+
lisa run --once # process a single issue
|
|
73
|
+
lisa run --once --dry-run # preview config without executing
|
|
74
|
+
lisa run --watch # poll for new issues after queue empties
|
|
75
|
+
lisa run --concurrency 3 # process 3 issues in parallel
|
|
76
|
+
lisa run --issue INT-42 # process a specific issue
|
|
77
|
+
lisa run --limit 5 # stop after 5 issues
|
|
78
|
+
lisa init # create .lisa/config.yaml interactively
|
|
79
|
+
lisa status # show session stats
|
|
80
|
+
lisa context refresh # regenerate project context
|
|
81
|
+
lisa feedback --pr URL # inject PR review feedback into guardrails
|
|
237
82
|
```
|
|
238
83
|
|
|
239
|
-
If context generation fails, Lisa logs a warning and continues — it is never a blocker.
|
|
240
|
-
|
|
241
|
-
## Writing Issues
|
|
242
|
-
|
|
243
|
-
Issue quality is the single biggest factor in PR quality. Lisa validates issues before accepting them — vague tickets without clear criteria are skipped and labelled `needs-spec`.
|
|
244
|
-
|
|
245
|
-
Issues must contain acceptance criteria: markdown checklists (`- [ ]`) or keywords like `acceptance criteria`, `expected`, `should`.
|
|
246
|
-
|
|
247
|
-
### Example
|
|
248
|
-
|
|
249
|
-
```markdown
|
|
250
|
-
Title: Add rate limiting to /api/users endpoint
|
|
251
|
-
|
|
252
|
-
Description:
|
|
253
|
-
Implement rate limiting on the `/api/users` endpoint to prevent abuse.
|
|
254
|
-
|
|
255
|
-
Relevant files:
|
|
256
|
-
- src/routes/users.ts
|
|
257
|
-
- src/middleware/auth.ts
|
|
258
|
-
|
|
259
|
-
Acceptance criteria:
|
|
260
|
-
- [ ] Requests exceeding 100/min per IP return HTTP 429
|
|
261
|
-
- [ ] Rate limit headers (X-RateLimit-Limit, X-RateLimit-Remaining) included in all responses
|
|
262
|
-
- [ ] Rate limit state stored in Redis (use existing connection from src/lib/redis.ts)
|
|
263
|
-
- [ ] Existing tests still pass
|
|
264
|
-
|
|
265
|
-
Stack: Express, Redis
|
|
266
|
-
```
|
|
267
|
-
|
|
268
|
-
Including **relevant files**, **technical constraints**, and **stack information** in the description leads to better results.
|
|
269
|
-
|
|
270
84
|
## Configuration
|
|
271
85
|
|
|
272
86
|
Config lives in `.lisa/config.yaml`. Run `lisa init` to create it interactively.
|
|
@@ -274,7 +88,7 @@ Config lives in `.lisa/config.yaml`. Run `lisa init` to create it interactively.
|
|
|
274
88
|
```yaml
|
|
275
89
|
provider: claude
|
|
276
90
|
source: linear
|
|
277
|
-
workflow: worktree
|
|
91
|
+
workflow: worktree # "worktree" (isolated) or "branch" (in-place)
|
|
278
92
|
|
|
279
93
|
source_config:
|
|
280
94
|
team: Engineering
|
|
@@ -284,156 +98,118 @@ source_config:
|
|
|
284
98
|
in_progress: In Progress
|
|
285
99
|
done: In Review
|
|
286
100
|
|
|
287
|
-
platform: cli
|
|
288
|
-
workspace: .
|
|
101
|
+
platform: cli # "cli" (gh), "token" (GITHUB_TOKEN), "gitlab", "bitbucket"
|
|
289
102
|
base_branch: main
|
|
103
|
+
```
|
|
290
104
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
path: ./api
|
|
294
|
-
base_branch: main
|
|
295
|
-
match: "[API]" # route issues whose title starts with "[API]" to this repo
|
|
296
|
-
- name: my-app
|
|
297
|
-
path: ./app
|
|
298
|
-
base_branch: main
|
|
299
|
-
|
|
300
|
-
loop:
|
|
301
|
-
cooldown: 10 # seconds between issues
|
|
302
|
-
max_sessions: 0 # 0 = unlimited
|
|
303
|
-
session_timeout: 0 # seconds per provider run (0 = disabled)
|
|
304
|
-
|
|
305
|
-
# Optional — kill stuck providers
|
|
306
|
-
overseer:
|
|
307
|
-
enabled: true
|
|
308
|
-
check_interval: 30 # seconds between git status checks
|
|
309
|
-
stuck_threshold: 300 # seconds without git changes before killing
|
|
105
|
+
<details>
|
|
106
|
+
<summary><strong>Environment variables</strong></summary>
|
|
310
107
|
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
108
|
+
```bash
|
|
109
|
+
# PR creation (at least one)
|
|
110
|
+
GITHUB_TOKEN="" # or use `gh` CLI
|
|
111
|
+
GITLAB_TOKEN="" # for platform: gitlab
|
|
112
|
+
BITBUCKET_TOKEN="" # for platform: bitbucket
|
|
113
|
+
BITBUCKET_USERNAME=""
|
|
315
114
|
|
|
316
|
-
#
|
|
317
|
-
|
|
318
|
-
|
|
115
|
+
# Issue tracker (set the one you use)
|
|
116
|
+
LINEAR_API_KEY=""
|
|
117
|
+
TRELLO_API_KEY="" && TRELLO_TOKEN=""
|
|
118
|
+
PLANE_API_TOKEN=""
|
|
119
|
+
SHORTCUT_API_TOKEN=""
|
|
120
|
+
GITLAB_TOKEN=""
|
|
121
|
+
GITHUB_TOKEN=""
|
|
122
|
+
JIRA_BASE_URL="" && JIRA_EMAIL="" && JIRA_API_TOKEN=""
|
|
319
123
|
```
|
|
320
124
|
|
|
321
|
-
|
|
125
|
+
</details>
|
|
126
|
+
|
|
127
|
+
<details>
|
|
128
|
+
<summary><strong>Source-specific configuration</strong></summary>
|
|
322
129
|
|
|
323
130
|
| Field | Linear | Trello | Plane | Shortcut | GitLab Issues | GitHub Issues | Jira |
|
|
324
131
|
|-------|--------|--------|-------|----------|---------------|---------------|------|
|
|
325
|
-
| `team` | Team name | Board name | Workspace slug | Group name
|
|
326
|
-
| `project` | Project name | — | Project
|
|
327
|
-
| `pick_from` | Status
|
|
328
|
-
| `label` | Label
|
|
329
|
-
| `in_progress` |
|
|
330
|
-
| `done` |
|
|
331
|
-
|
|
332
|
-
Plane example:
|
|
132
|
+
| `team` | Team name | Board name | Workspace slug | Group name | Project path | `owner/repo` | Project key |
|
|
133
|
+
| `project` | Project name | — | Project ID | — | — | — | — |
|
|
134
|
+
| `pick_from` | Status name | List name | State name | Workflow state | — | — | Status name |
|
|
135
|
+
| `label` | Label | Label | Label | Label | Label | Label | Label |
|
|
136
|
+
| `in_progress` | Status | Column | State | Workflow state | Label | Label | Status |
|
|
137
|
+
| `done` | Status | Column | State | Workflow state | Closes issue | Closes issue | Status |
|
|
333
138
|
|
|
334
|
-
|
|
335
|
-
source: plane
|
|
336
|
-
source_config:
|
|
337
|
-
team: my-workspace # workspace slug (or set PLANE_WORKSPACE env var)
|
|
338
|
-
project: DEV # project identifier or UUID
|
|
339
|
-
label: ready # issues with this label are picked up
|
|
340
|
-
pick_from: Todo # state to fetch issues from
|
|
341
|
-
in_progress: In Progress # state set when Lisa starts working
|
|
342
|
-
done: Done # state set after PR is created
|
|
343
|
-
```
|
|
139
|
+
</details>
|
|
344
140
|
|
|
345
|
-
|
|
141
|
+
<details>
|
|
142
|
+
<summary><strong>Multi-repo setup</strong></summary>
|
|
346
143
|
|
|
347
144
|
```yaml
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
145
|
+
repos:
|
|
146
|
+
- name: my-api
|
|
147
|
+
path: ./api
|
|
148
|
+
base_branch: main
|
|
149
|
+
match: "[API]" # route issues by title prefix
|
|
150
|
+
- name: my-app
|
|
151
|
+
path: ./app
|
|
152
|
+
base_branch: main
|
|
354
153
|
```
|
|
355
154
|
|
|
356
|
-
|
|
155
|
+
Lisa runs a planning phase, then executes steps sequentially — one worktree and one PR per repo.
|
|
357
156
|
|
|
358
|
-
|
|
359
|
-
source: gitlab-issues
|
|
360
|
-
source_config:
|
|
361
|
-
team: my-org/my-repo # namespace/project path or numeric project ID
|
|
362
|
-
label: ready # issues with this label are picked up
|
|
363
|
-
in_progress: in-progress # label applied when Lisa starts working
|
|
364
|
-
done: "" # issue is closed after PR (value unused)
|
|
365
|
-
```
|
|
157
|
+
</details>
|
|
366
158
|
|
|
367
|
-
|
|
159
|
+
<details>
|
|
160
|
+
<summary><strong>Advanced options</strong></summary>
|
|
368
161
|
|
|
369
162
|
```yaml
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
163
|
+
loop:
|
|
164
|
+
cooldown: 10 # seconds between issues
|
|
165
|
+
session_timeout: 0 # max seconds per provider run (0 = disabled)
|
|
166
|
+
|
|
167
|
+
overseer:
|
|
168
|
+
enabled: true
|
|
169
|
+
check_interval: 30 # seconds between git status checks
|
|
170
|
+
stuck_threshold: 300 # kill provider after this many seconds without changes
|
|
377
171
|
|
|
378
|
-
|
|
172
|
+
lifecycle:
|
|
173
|
+
mode: auto # "auto", "skip" (default), "validate-only"
|
|
174
|
+
timeout: 30
|
|
379
175
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
source_config:
|
|
383
|
-
team: ENG # Jira project key
|
|
384
|
-
label: lisa # label to filter issues
|
|
385
|
-
pick_from: Backlog # status to pick issues from
|
|
386
|
-
in_progress: In Progress # status applied when Lisa starts working
|
|
387
|
-
done: In Review # status applied after PR is created
|
|
176
|
+
validation:
|
|
177
|
+
require_acceptance_criteria: true
|
|
388
178
|
```
|
|
389
179
|
|
|
390
|
-
|
|
180
|
+
</details>
|
|
391
181
|
|
|
392
|
-
|
|
182
|
+
## Writing Good Issues
|
|
393
183
|
|
|
394
|
-
|
|
184
|
+
Issue quality = PR quality. Lisa validates issues and skips vague ones (labeling them `needs-spec`).
|
|
395
185
|
|
|
396
|
-
**
|
|
186
|
+
**Include:** acceptance criteria (`- [ ]` checklists), relevant file paths, technical constraints, stack info.
|
|
397
187
|
|
|
398
|
-
|
|
188
|
+
```markdown
|
|
189
|
+
Title: Add rate limiting to /api/users endpoint
|
|
399
190
|
|
|
400
|
-
|
|
191
|
+
Implement rate limiting on `/api/users` to prevent abuse.
|
|
401
192
|
|
|
402
|
-
|
|
193
|
+
Relevant files: src/routes/users.ts, src/middleware/auth.ts
|
|
403
194
|
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
lifecycle:
|
|
410
|
-
resources:
|
|
411
|
-
- name: postgres
|
|
412
|
-
check_port: 5432
|
|
413
|
-
up: "docker compose up -d postgres"
|
|
414
|
-
down: "docker compose down"
|
|
415
|
-
startup_timeout: 30
|
|
416
|
-
setup:
|
|
417
|
-
- "npx prisma generate"
|
|
418
|
-
- "npx prisma db push"
|
|
195
|
+
Acceptance criteria:
|
|
196
|
+
- [ ] Requests exceeding 100/min per IP return HTTP 429
|
|
197
|
+
- [ ] Rate limit headers included in responses
|
|
198
|
+
- [ ] Rate limit state stored in Redis (use src/lib/redis.ts)
|
|
199
|
+
- [ ] Existing tests still pass
|
|
419
200
|
```
|
|
420
201
|
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
### Recovery Mechanisms
|
|
424
|
-
|
|
425
|
-
- **Orphan recovery** — On startup, Lisa scans for issues stuck in `in_progress` from interrupted runs and reverts them to `pick_from`.
|
|
426
|
-
- **Push recovery** — If `git push` fails due to pre-push hooks (linter, typecheck, tests), Lisa re-invokes the agent with the error output and retries the push.
|
|
427
|
-
- **Signal handling** — SIGINT/SIGTERM gracefully revert the active issue to its previous status before exiting.
|
|
428
|
-
- **Guardrails** — Failed sessions are logged and injected into future prompts so the agent avoids repeating the same mistakes. Use `lisa feedback --pr URL` to manually inject review feedback from a closed PR.
|
|
429
|
-
|
|
430
|
-
### Overseer
|
|
431
|
-
|
|
432
|
-
When enabled, the overseer periodically checks `git status` in the working directory. If no changes are detected within `stuck_threshold` seconds, the provider process is killed and the error is eligible for fallback to the next model.
|
|
202
|
+
## TUI
|
|
433
203
|
|
|
434
|
-
|
|
204
|
+
The real-time Kanban board shows issue progress, streams provider output, and detects PR merges.
|
|
435
205
|
|
|
436
|
-
|
|
206
|
+
| Key | Action | Key | Action |
|
|
207
|
+
|-----|--------|-----|--------|
|
|
208
|
+
| `←` `→` | Switch columns | `p` | Pause / resume provider |
|
|
209
|
+
| `↑` `↓` | Navigate cards | `k` | Kill current issue |
|
|
210
|
+
| `↵` | Open detail view | `s` | Skip current issue |
|
|
211
|
+
| `Esc` | Back to board | `o` | Open PR in browser |
|
|
212
|
+
| `q` | Quit | | |
|
|
437
213
|
|
|
438
214
|
## License
|
|
439
215
|
|