@tarcisiopgs/lisa 1.14.0 → 1.14.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 +90 -485
- package/dist/index.js +46 -22
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -9,11 +9,7 @@
|
|
|
9
9
|
</p>
|
|
10
10
|
|
|
11
11
|
<p align="center">
|
|
12
|
-
<img src="assets/demo.gif" alt="Lisa demo" width="800" />
|
|
13
|
-
</p>
|
|
14
|
-
|
|
15
|
-
<p align="center">
|
|
16
|
-
Lisa is an autonomous issue resolver that turns your backlog into pull requests — no babysitting required.
|
|
12
|
+
<img src="assets/demo.gif?v=2" alt="Lisa demo" width="800" />
|
|
17
13
|
</p>
|
|
18
14
|
|
|
19
15
|
<p align="center">
|
|
@@ -29,36 +25,17 @@
|
|
|
29
25
|
|
|
30
26
|
```bash
|
|
31
27
|
npm install -g @tarcisiopgs/lisa
|
|
32
|
-
lisa init
|
|
33
|
-
lisa run
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
That's it. Lisa picks up the next labeled issue, implements it, pushes a branch, opens a pull request, and moves the ticket to "In Review" — all without you touching it.
|
|
37
|
-
|
|
38
|
-
`lisa init` offers pre-defined templates for the most common source + provider combinations (GitHub Issues + Claude, Linear + Claude, Jira + Claude, and more). Select a template to pre-fill sensible defaults, or choose "Configure manually" for full control.
|
|
39
|
-
|
|
40
|
-
## Try it safely first
|
|
41
|
-
|
|
42
|
-
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.
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
lisa run --once --dry-run
|
|
28
|
+
lisa init # interactive setup — picks your source + provider
|
|
29
|
+
lisa run # start resolving issues
|
|
46
30
|
```
|
|
47
31
|
|
|
48
|
-
|
|
32
|
+
Verify your setup first with `lisa run --once --dry-run` — no issues will be fetched, no code written, no PRs created.
|
|
49
33
|
|
|
50
|
-
|
|
51
|
-
[dry-run] Would fetch issue from linear (Engineering/Web App)
|
|
52
|
-
[dry-run] Workflow mode: worktree
|
|
53
|
-
[dry-run] Models priority: claude/claude-sonnet-4-6
|
|
54
|
-
[dry-run] Then implement, push, create PR, and update issue status
|
|
55
|
-
```
|
|
34
|
+
Lisa picks up the next labeled issue, implements it, pushes a branch, opens a pull request, and moves the ticket to "In Review" — all without you touching it.
|
|
56
35
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
## What Lisa Does
|
|
36
|
+
---
|
|
60
37
|
|
|
61
|
-
|
|
38
|
+
## How It Works
|
|
62
39
|
|
|
63
40
|
```
|
|
64
41
|
┌─────────┐ ┌──────────┐ ┌───────────┐ ┌──────────┐ ┌────┐ ┌────────┐
|
|
@@ -66,140 +43,29 @@ Lisa follows a deterministic pipeline:
|
|
|
66
43
|
└─────────┘ └──────────┘ └───────────┘ └──────────┘ └────┘ └────────┘
|
|
67
44
|
```
|
|
68
45
|
|
|
69
|
-
1. **Fetch** — Pulls the next issue
|
|
70
|
-
2. **
|
|
71
|
-
3. **
|
|
72
|
-
4. **
|
|
73
|
-
5. **PR** — Pushes the branch and creates a pull request (or merge request) referencing the original issue.
|
|
74
|
-
6. **Update** — Moves the issue to the `done` status and removes the pickup label.
|
|
75
|
-
7. **Next** — Picks the next issue. When there are no more matching issues, Lisa stops.
|
|
76
|
-
|
|
77
|
-
### What makes it different
|
|
78
|
-
|
|
79
|
-
- **Deterministic, not hopeful** — Each issue follows a structured pipeline with clear stages. No blind retries, no speculative loops.
|
|
80
|
-
- **Token efficiency** — Each issue gets one focused prompt. No wasted retries, no idle polling.
|
|
81
|
-
- **Multi-repo awareness** — Plans across multiple repos, executes in the correct order, creates one PR per repo.
|
|
82
|
-
- **Model fallback** — Configure a chain of models. Transient errors (429, quota, timeout) trigger the next model automatically.
|
|
83
|
-
- **Workflow integration** — Issues move through your board in real time. Your team always knows what's being worked on.
|
|
84
|
-
- **Self-healing** — Orphan issues stuck in "In Progress" are recovered on startup. Pre-push failures trigger the agent to fix and retry.
|
|
85
|
-
- **Guardrails** — Past failures are logged and injected into future prompts so the agent avoids repeating mistakes.
|
|
86
|
-
|
|
87
|
-
---
|
|
88
|
-
|
|
89
|
-
## Writing Issues
|
|
90
|
-
|
|
91
|
-
Issue quality is the single biggest factor in PR quality. Lisa validates issues before accepting them — vague tickets without clear criteria are skipped automatically (labelled `needs-spec`). A well-structured issue gives the AI agent everything it needs to deliver a clean implementation on the first try.
|
|
92
|
-
|
|
93
|
-
### What Lisa looks for
|
|
94
|
-
|
|
95
|
-
At minimum, the issue description must contain **acceptance criteria**. Lisa detects them by looking for:
|
|
96
|
-
|
|
97
|
-
- Markdown checklists (`- [ ]`)
|
|
98
|
-
- Keywords: `acceptance criteria`, `expected`, `should`, `deve`, `critérios`
|
|
99
|
-
|
|
100
|
-
Issues without these are rejected. Beyond validation, the agent also consumes **relevant files**, **technical constraints**, and **stack information** when present in the description — so including them leads to better results.
|
|
101
|
-
|
|
102
|
-
### Feature
|
|
103
|
-
|
|
104
|
-
```markdown
|
|
105
|
-
Title: Add rate limiting to /api/users endpoint
|
|
106
|
-
|
|
107
|
-
Description:
|
|
108
|
-
Implement rate limiting on the `/api/users` endpoint to prevent abuse.
|
|
109
|
-
|
|
110
|
-
Relevant files:
|
|
111
|
-
- src/routes/users.ts
|
|
112
|
-
- src/middleware/auth.ts
|
|
113
|
-
|
|
114
|
-
Acceptance criteria:
|
|
115
|
-
- [ ] Requests exceeding 100/min per IP return HTTP 429
|
|
116
|
-
- [ ] Rate limit headers (X-RateLimit-Limit, X-RateLimit-Remaining) included in all responses
|
|
117
|
-
- [ ] Rate limit state stored in Redis (use existing connection from src/lib/redis.ts)
|
|
118
|
-
- [ ] Existing tests still pass
|
|
119
|
-
|
|
120
|
-
Stack: Express, Redis
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
### Bug fix
|
|
124
|
-
|
|
125
|
-
```markdown
|
|
126
|
-
Title: Login redirect loop when session expires
|
|
127
|
-
|
|
128
|
-
Description:
|
|
129
|
-
Users report being stuck in an infinite redirect loop after their session expires.
|
|
130
|
-
The issue is in the session middleware — it redirects to /login, but /login also
|
|
131
|
-
checks for a valid session and redirects back.
|
|
132
|
-
|
|
133
|
-
Steps to reproduce:
|
|
134
|
-
1. Log in
|
|
135
|
-
2. Wait for session to expire (or manually clear the session cookie)
|
|
136
|
-
3. Navigate to any protected route
|
|
137
|
-
|
|
138
|
-
Relevant files:
|
|
139
|
-
- src/middleware/session.ts
|
|
140
|
-
- src/routes/auth.ts
|
|
141
|
-
|
|
142
|
-
Expected behavior:
|
|
143
|
-
- [ ] Expired sessions redirect to /login without a loop
|
|
144
|
-
- [ ] /login route should not require an active session
|
|
145
|
-
- [ ] After login, user is redirected back to the originally requested page
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
### Refactor
|
|
149
|
-
|
|
150
|
-
```markdown
|
|
151
|
-
Title: Extract email sending into a dedicated service
|
|
152
|
-
|
|
153
|
-
Description:
|
|
154
|
-
Email sending logic is duplicated across 3 controllers. Extract it into a
|
|
155
|
-
shared service.
|
|
156
|
-
|
|
157
|
-
Relevant files:
|
|
158
|
-
- src/controllers/auth.ts (lines 45-67: welcome email)
|
|
159
|
-
- src/controllers/orders.ts (lines 120-145: order confirmation)
|
|
160
|
-
- src/controllers/support.ts (lines 30-55: ticket confirmation)
|
|
161
|
-
|
|
162
|
-
Acceptance criteria:
|
|
163
|
-
- [ ] New EmailService class in src/services/email.ts
|
|
164
|
-
- [ ] All 3 controllers use the shared service instead of inline email logic
|
|
165
|
-
- [ ] Existing tests still pass
|
|
166
|
-
- [ ] No new dependencies added
|
|
167
|
-
```
|
|
168
|
-
|
|
169
|
-
### What makes a good issue
|
|
170
|
-
|
|
171
|
-
| Do | Don't |
|
|
172
|
-
|---|---|
|
|
173
|
-
| List specific files the agent should read | Say "fix the bug" with no context |
|
|
174
|
-
| Include acceptance criteria as a checklist | Describe the desired outcome vaguely |
|
|
175
|
-
| Mention the stack or libraries to use | Assume the agent knows your preferences |
|
|
176
|
-
| Describe expected behavior for bug fixes | Provide only steps to reproduce |
|
|
177
|
-
| Scope to a single deliverable | Bundle multiple unrelated changes |
|
|
46
|
+
1. **Fetch and activate** — Pulls the next priority-sorted issue matching your configured label and moves it to `in_progress`.
|
|
47
|
+
2. **Implement** — Builds a structured prompt with full issue context and sends it to the AI agent. The agent works in a worktree or branch, implements the change, runs tests, and commits.
|
|
48
|
+
3. **Push and PR** — Pushes the branch, creates a pull request referencing the original issue. If pre-push hooks fail, re-invokes the agent with the error output and retries.
|
|
49
|
+
4. **Update and loop** — Moves the issue to `done`, removes the pickup label, and picks the next issue. Stops when the queue is empty.
|
|
178
50
|
|
|
179
51
|
---
|
|
180
52
|
|
|
181
53
|
## Issue Sources
|
|
182
54
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
|
186
|
-
|
|
187
|
-
|
|
|
188
|
-
|
|
|
189
|
-
|
|
|
190
|
-
|
|
|
191
|
-
|
|
|
192
|
-
| Plane | `plane` | Open-source project management (cloud and self-hosted) |
|
|
193
|
-
| Shortcut | `shortcut` | Story-based tracking (formerly Clubhouse) |
|
|
194
|
-
|
|
195
|
-
Each source supports label filtering, priority ordering, and status transitions out of the box. See [Source-Specific Fields](#source-specific-fields) for configuration details.
|
|
55
|
+
| Source | Key |
|
|
56
|
+
|--------|-----|
|
|
57
|
+
| Linear | `linear` |
|
|
58
|
+
| GitHub Issues | `github-issues` |
|
|
59
|
+
| Jira | `jira` |
|
|
60
|
+
| GitLab Issues | `gitlab-issues` |
|
|
61
|
+
| Trello | `trello` |
|
|
62
|
+
| Plane | `plane` |
|
|
63
|
+
| Shortcut | `shortcut` |
|
|
196
64
|
|
|
197
65
|
---
|
|
198
66
|
|
|
199
67
|
## AI Providers
|
|
200
68
|
|
|
201
|
-
Lisa supports **8 AI coding agents** as implementation backends:
|
|
202
|
-
|
|
203
69
|
| Provider | Key | Command |
|
|
204
70
|
|----------|-----|---------|
|
|
205
71
|
| Claude Code | `claude` | `claude` |
|
|
@@ -213,13 +79,9 @@ Lisa supports **8 AI coding agents** as implementation backends:
|
|
|
213
79
|
|
|
214
80
|
At least one provider must be installed and available in your PATH.
|
|
215
81
|
|
|
216
|
-
> **Cursor Free plan** — `lisa init` automatically detects Free accounts and restricts model selection to `auto` only. On paid plans, available models are fetched live from `cursor --list-models` and filtered to a curated top-tier list (`composer-1.5`, `opus-4.6`, `sonnet-4.6`, `gpt-5.3-codex`, etc.).
|
|
217
|
-
|
|
218
|
-
> **OpenCode** — `lisa init` fetches available models from `opencode models` and filters them based on which API keys are present in your environment (`ANTHROPIC_API_KEY`, `GEMINI_API_KEY`, `OPENAI_API_KEY`, `GITHUB_TOKEN`, `GROQ_API_KEY`, `MISTRAL_API_KEY`, `DEEPSEEK_API_KEY`). Only models from providers you have credentials for are shown.
|
|
219
|
-
|
|
220
82
|
### Fallback Chain
|
|
221
83
|
|
|
222
|
-
Configure multiple models — Lisa tries each in order. Transient errors (429, quota, timeout, network) trigger the next model
|
|
84
|
+
Configure multiple models — Lisa tries each in order. Transient errors (429, quota, timeout, network) trigger the next model automatically.
|
|
223
85
|
|
|
224
86
|
```yaml
|
|
225
87
|
provider: claude
|
|
@@ -231,137 +93,62 @@ models:
|
|
|
231
93
|
|
|
232
94
|
---
|
|
233
95
|
|
|
234
|
-
## PR
|
|
96
|
+
## PR Platforms
|
|
235
97
|
|
|
236
|
-
|
|
98
|
+
| Platform | Key | Auth |
|
|
99
|
+
|----------|-----|------|
|
|
100
|
+
| GitHub CLI | `cli` | `gh auth login` |
|
|
101
|
+
| GitHub API | `token` | `GITHUB_TOKEN` |
|
|
102
|
+
| GitLab | `gitlab` | `GITLAB_TOKEN` |
|
|
103
|
+
| Bitbucket | `bitbucket` | `BITBUCKET_TOKEN` + `BITBUCKET_USERNAME` |
|
|
237
104
|
|
|
238
|
-
|
|
239
|
-
|----------|-----|------|--------|
|
|
240
|
-
| GitHub CLI | `cli` | `gh auth login` | Pull Request |
|
|
241
|
-
| GitHub API | `token` | `GITHUB_TOKEN` | Pull Request |
|
|
242
|
-
| GitLab | `gitlab` | `GITLAB_TOKEN` | Merge Request |
|
|
243
|
-
| Bitbucket | `bitbucket` | `BITBUCKET_TOKEN` + `BITBUCKET_USERNAME` | Pull Request |
|
|
105
|
+
---
|
|
244
106
|
|
|
245
|
-
|
|
107
|
+
## Environment Variables
|
|
246
108
|
|
|
247
|
-
|
|
248
|
-
platform: gitlab # or: cli, token, bitbucket
|
|
249
|
-
```
|
|
109
|
+
Set the tokens for your chosen source and PR platform:
|
|
250
110
|
|
|
251
111
|
```bash
|
|
252
|
-
|
|
112
|
+
# PR platform
|
|
113
|
+
GITHUB_TOKEN # GitHub (platform: cli or token)
|
|
114
|
+
GITLAB_TOKEN # GitLab (platform: gitlab)
|
|
115
|
+
BITBUCKET_TOKEN # Bitbucket (platform: bitbucket)
|
|
116
|
+
BITBUCKET_USERNAME # Bitbucket username
|
|
117
|
+
|
|
118
|
+
# Issue sources
|
|
119
|
+
LINEAR_API_KEY # source: linear
|
|
120
|
+
TRELLO_API_KEY # source: trello
|
|
121
|
+
TRELLO_TOKEN
|
|
122
|
+
SHORTCUT_API_TOKEN # source: shortcut
|
|
123
|
+
PLANE_API_TOKEN # source: plane
|
|
124
|
+
PLANE_BASE_URL # optional, defaults to https://api.plane.so
|
|
125
|
+
GITLAB_TOKEN # source: gitlab-issues
|
|
126
|
+
GITLAB_BASE_URL # optional, defaults to https://gitlab.com
|
|
127
|
+
GITHUB_TOKEN # source: github-issues
|
|
128
|
+
JIRA_BASE_URL # source: jira
|
|
129
|
+
JIRA_EMAIL
|
|
130
|
+
JIRA_API_TOKEN
|
|
253
131
|
```
|
|
254
132
|
|
|
255
|
-
Each platform appends a `🤖 Resolved by lisa` attribution comment to the PR/MR after creation.
|
|
256
|
-
|
|
257
133
|
---
|
|
258
134
|
|
|
259
|
-
## Install
|
|
260
|
-
|
|
261
|
-
```bash
|
|
262
|
-
npm install -g @tarcisiopgs/lisa
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
## Environment Variables
|
|
266
|
-
|
|
267
|
-
```bash
|
|
268
|
-
# PR/MR delivery — set one based on your platform
|
|
269
|
-
export GITHUB_TOKEN="" # GitHub — or have `gh` CLI authenticated (platform: cli or token)
|
|
270
|
-
export GITLAB_TOKEN="" # GitLab MR creation (platform: gitlab)
|
|
271
|
-
export BITBUCKET_TOKEN="" # Bitbucket PR creation (platform: bitbucket)
|
|
272
|
-
export BITBUCKET_USERNAME="" # Bitbucket username (required with BITBUCKET_TOKEN)
|
|
273
|
-
|
|
274
|
-
# Required when source = linear
|
|
275
|
-
export LINEAR_API_KEY=""
|
|
276
|
-
|
|
277
|
-
# Required when source = trello
|
|
278
|
-
export TRELLO_API_KEY=""
|
|
279
|
-
export TRELLO_TOKEN=""
|
|
280
|
-
|
|
281
|
-
# Required when source = plane
|
|
282
|
-
export PLANE_API_TOKEN=""
|
|
283
|
-
export PLANE_BASE_URL="" # optional; defaults to https://api.plane.so
|
|
284
|
-
export PLANE_WORKSPACE="" # optional; fallback when team is not set in config
|
|
285
|
-
|
|
286
|
-
# Required when source = shortcut
|
|
287
|
-
export SHORTCUT_API_TOKEN=""
|
|
288
|
-
|
|
289
|
-
# Required when source = gitlab-issues or github = gitlab
|
|
290
|
-
export GITLAB_TOKEN=""
|
|
291
|
-
export GITLAB_BASE_URL="" # optional; defaults to https://gitlab.com
|
|
292
|
-
|
|
293
|
-
# Required when source = github-issues
|
|
294
|
-
export GITHUB_TOKEN="" # same token used for PR creation
|
|
295
|
-
|
|
296
|
-
# Required when source = jira
|
|
297
|
-
export JIRA_BASE_URL="" # e.g. https://yourcompany.atlassian.net
|
|
298
|
-
export JIRA_EMAIL="" # Atlassian account email
|
|
299
|
-
export JIRA_API_TOKEN="" # Atlassian API token
|
|
300
|
-
```
|
|
301
|
-
|
|
302
135
|
## Commands
|
|
303
136
|
|
|
304
137
|
| Command | Description |
|
|
305
138
|
|---------|-------------|
|
|
306
139
|
| `lisa run` | Run the agent loop |
|
|
307
140
|
| `lisa run --once` | Process a single issue |
|
|
308
|
-
| `lisa run --once --dry-run` |
|
|
309
|
-
| `lisa run --watch`
|
|
141
|
+
| `lisa run --once --dry-run` | Preview config without executing |
|
|
142
|
+
| `lisa run --watch` | Poll for new issues every 60s after queue empties |
|
|
310
143
|
| `lisa run --issue ID` | Process a specific issue by identifier or URL |
|
|
311
|
-
| `lisa run --
|
|
312
|
-
| `lisa
|
|
313
|
-
| `lisa
|
|
314
|
-
| `lisa run --provider NAME` | Override AI provider |
|
|
315
|
-
| `lisa run --source NAME` | Override issue source |
|
|
316
|
-
| `lisa run --label NAME` | Override label filter |
|
|
317
|
-
| `lisa run --platform METHOD` | Override PR platform (`cli`, `token`, `gitlab`, or `bitbucket`) |
|
|
318
|
-
| `lisa run --no-bell` | Disable terminal bell on issue completion/failure |
|
|
319
|
-
| `lisa run --lifecycle MODE` | Lifecycle mode: `auto` (default), `skip`, or `validate-only` |
|
|
320
|
-
| `lisa run --lifecycle-timeout N` | Startup timeout per resource in seconds (default: 30) |
|
|
321
|
-
| `lisa run --demo` | Run animated demo with fake issues to preview the TUI |
|
|
322
|
-
| `lisa init` | Create `.lisa/config.yaml` interactively (offers pre-defined templates) |
|
|
323
|
-
| `lisa config` | Edit config interactively |
|
|
324
|
-
| `lisa config --show` | Print current config as JSON |
|
|
325
|
-
| `lisa config --set key=value` | Set a single config value |
|
|
144
|
+
| `lisa run --concurrency N` | Process N issues in parallel (each in its own worktree) |
|
|
145
|
+
| `lisa init` | Create `.lisa/config.yaml` interactively |
|
|
146
|
+
| `lisa config --show` | Print current config |
|
|
326
147
|
| `lisa status` | Show session stats |
|
|
327
|
-
| `lisa issue get <id>` | Fetch full issue details as JSON (for use inside worktrees) |
|
|
328
|
-
| `lisa issue done <id> --pr-url <url>` | Complete issue, attach PR, update status, remove label |
|
|
329
|
-
| `lisa feedback --pr <url> --issue <id>` | Inject PR review comments from a closed-without-merge PR into guardrails |
|
|
330
|
-
|
|
331
|
-
## TUI
|
|
332
|
-
|
|
333
|
-
When running in an interactive terminal, `lisa run` renders a real-time Kanban board:
|
|
334
148
|
|
|
335
|
-
|
|
336
|
-
┌──────────────────────────┐ ┌───────────────────────────┐ ┌───────────────────────────┐
|
|
337
|
-
│ ▶ BACKLOG [3] │ │ ▶ IN PROGRESS [1] │ │ ▶ IN REVIEW [2] │
|
|
338
|
-
│ │ │ │ │ │
|
|
339
|
-
│ ┌────────────────────┐ │ │ ┌─────────────────────┐ │ │ ┌─────────────────────┐ │
|
|
340
|
-
│ │ ENG-42 │ │ │ │ ● ENG-38 │ │ │ │ ✓ ENG-35 │ │
|
|
341
|
-
│ │ Add dark mode │ │ │ │ Fix login redirect │ │ │ │ Update dependencies │ │
|
|
342
|
-
│ │ ready │ │ │ │ ~1 running │ │ │ │ PR created │ │
|
|
343
|
-
│ └────────────────────┘ │ │ └─────────────────────┘ │ │ └─────────────────────┘ │
|
|
344
|
-
└──────────────────────────┘ └───────────────────────────┘ └───────────────────────────┘
|
|
345
|
-
```
|
|
149
|
+
Run `lisa run --help` for all available flags.
|
|
346
150
|
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
### Keyboard shortcuts
|
|
350
|
-
|
|
351
|
-
| Key | Action |
|
|
352
|
-
|-----|--------|
|
|
353
|
-
| `←` / `→` | Move between columns |
|
|
354
|
-
| `Tab` / `Shift+Tab` | Move between columns (alternative) |
|
|
355
|
-
| `↑` / `↓` | Navigate cards / scroll output |
|
|
356
|
-
| `Enter` | Open issue detail view (streams provider output) |
|
|
357
|
-
| `o` | Open PR in browser (when viewing a completed card with a PR) |
|
|
358
|
-
| `Esc` | Close detail view, return to board |
|
|
359
|
-
| `k` | Kill the selected in-progress issue |
|
|
360
|
-
| `s` | Skip the selected in-progress issue |
|
|
361
|
-
| `p` | Pause / resume all active providers |
|
|
362
|
-
| `q` | Quit |
|
|
363
|
-
|
|
364
|
-
The sidebar legend updates contextually: board shortcuts when browsing the Kanban, scroll and back hints when viewing issue detail. The terminal tab title also updates in real time: it shows a spinner with the active issue ID while work is in progress, and a checkmark when done.
|
|
151
|
+
---
|
|
365
152
|
|
|
366
153
|
## Configuration
|
|
367
154
|
|
|
@@ -370,7 +157,7 @@ Config lives in `.lisa/config.yaml`. Run `lisa init` to create it interactively.
|
|
|
370
157
|
```yaml
|
|
371
158
|
provider: claude
|
|
372
159
|
source: linear
|
|
373
|
-
workflow: worktree
|
|
160
|
+
workflow: worktree # "worktree" (isolated) or "branch" (in-place)
|
|
374
161
|
|
|
375
162
|
source_config:
|
|
376
163
|
team: Engineering
|
|
@@ -380,257 +167,75 @@ source_config:
|
|
|
380
167
|
in_progress: In Progress
|
|
381
168
|
done: In Review
|
|
382
169
|
|
|
383
|
-
platform: cli
|
|
170
|
+
platform: cli # "cli", "token", "gitlab", or "bitbucket"
|
|
384
171
|
workspace: .
|
|
385
172
|
base_branch: main
|
|
386
173
|
|
|
174
|
+
# Multi-repo (optional)
|
|
387
175
|
repos:
|
|
388
176
|
- name: my-api
|
|
389
177
|
path: ./api
|
|
390
178
|
base_branch: main
|
|
391
|
-
match: "[API]"
|
|
179
|
+
match: "[API]" # route issues by title prefix
|
|
392
180
|
- name: my-app
|
|
393
181
|
path: ./app
|
|
394
182
|
base_branch: main
|
|
395
183
|
|
|
396
184
|
loop:
|
|
397
|
-
cooldown: 10
|
|
398
|
-
max_sessions: 0
|
|
399
|
-
concurrency: 1 # issues processed in parallel (default: 1; >1 forces worktree mode)
|
|
400
|
-
|
|
401
|
-
logs:
|
|
402
|
-
dir: .lisa/logs
|
|
185
|
+
cooldown: 10 # seconds between issues
|
|
186
|
+
max_sessions: 0 # 0 = unlimited
|
|
403
187
|
|
|
404
188
|
# Optional — kill stuck providers
|
|
405
189
|
overseer:
|
|
406
190
|
enabled: true
|
|
407
|
-
check_interval: 30
|
|
408
|
-
stuck_threshold: 300
|
|
191
|
+
check_interval: 30 # seconds between git status checks
|
|
192
|
+
stuck_threshold: 300 # seconds without changes before killing
|
|
409
193
|
|
|
410
|
-
# Optional —
|
|
194
|
+
# Optional — skip issues without acceptance criteria
|
|
411
195
|
validation:
|
|
412
|
-
require_acceptance_criteria: true
|
|
413
|
-
|
|
414
|
-
# Optional — control infrastructure lifecycle
|
|
415
|
-
lifecycle:
|
|
416
|
-
mode: auto # "auto" (default), "skip", or "validate-only"
|
|
417
|
-
timeout: 30 # seconds to wait per resource (default: 30)
|
|
418
|
-
```
|
|
419
|
-
|
|
420
|
-
### Source-Specific Fields
|
|
421
|
-
|
|
422
|
-
| Field | Linear | Trello | Plane | Shortcut | GitLab Issues | GitHub Issues | Jira |
|
|
423
|
-
|-------|--------|--------|-------|----------|---------------|---------------|------|
|
|
424
|
-
| `team` | Team name | Board name | Workspace slug | Group name (optional) | Project path (`namespace/project`) or numeric ID | `owner/repo` | Project key (e.g. `ENG`) |
|
|
425
|
-
| `project` | Project name | — | Project identifier or UUID | — | — | — | — |
|
|
426
|
-
| `pick_from` | Status to pick issues from | List to pick cards from | State name to pick issues from | Workflow state to pick stories from | — | — | Status to pick issues from |
|
|
427
|
-
| `label` | Label to filter issues | Label to filter cards | Label to filter issues | Label to filter stories | Label to filter issues | Label to filter issues | Label to filter issues |
|
|
428
|
-
| `remove_label` | Label removed after pickup (optional; defaults to `label`) | Same | Same | Same | Same | Same | Same |
|
|
429
|
-
| `in_progress` | In-progress status | In-progress column | In-progress state name | In-progress workflow state | Label to apply on activate | Label to apply on activate | In-progress status name |
|
|
430
|
-
| `done` | Destination status after PR | Destination column after PR | Done state name | Done workflow state | Closes the issue | Closes the issue | Destination status after PR |
|
|
431
|
-
|
|
432
|
-
`label` can also be a list — Lisa picks any issue that has **all** of the specified labels. `remove_label` controls which label is removed after pickup, useful when you want to keep some labels intact. Example:
|
|
433
|
-
|
|
434
|
-
```yaml
|
|
435
|
-
source_config:
|
|
436
|
-
label: [ready, api] # pick issues labelled both "ready" and "api"
|
|
437
|
-
remove_label: ready # only remove "ready" after pickup; "api" is preserved
|
|
438
|
-
```
|
|
439
|
-
|
|
440
|
-
Plane example:
|
|
441
|
-
|
|
442
|
-
```yaml
|
|
443
|
-
source: plane
|
|
444
|
-
source_config:
|
|
445
|
-
team: my-workspace # workspace slug (or set PLANE_WORKSPACE env var)
|
|
446
|
-
project: DEV # project identifier or UUID
|
|
447
|
-
label: ready # issues with this label are picked up
|
|
448
|
-
pick_from: Todo # state to fetch issues from
|
|
449
|
-
in_progress: In Progress # state set when Lisa starts working
|
|
450
|
-
done: Done # state set after PR is created
|
|
451
|
-
```
|
|
452
|
-
|
|
453
|
-
Shortcut example:
|
|
454
|
-
|
|
455
|
-
```yaml
|
|
456
|
-
source: shortcut
|
|
457
|
-
source_config:
|
|
458
|
-
label: ready # stories with this label are picked up
|
|
459
|
-
pick_from: Ready for Development # workflow state to fetch stories from
|
|
460
|
-
in_progress: In Progress # state set when Lisa starts working
|
|
461
|
-
done: Done # state set after PR is created
|
|
462
|
-
```
|
|
463
|
-
|
|
464
|
-
GitLab Issues example:
|
|
465
|
-
|
|
466
|
-
```yaml
|
|
467
|
-
source: gitlab-issues
|
|
468
|
-
source_config:
|
|
469
|
-
team: my-org/my-repo # namespace/project path or numeric project ID
|
|
470
|
-
label: ready # issues with this label are picked up
|
|
471
|
-
in_progress: in-progress # label applied when Lisa starts working
|
|
472
|
-
done: "" # issue is closed after PR (value unused)
|
|
473
|
-
```
|
|
474
|
-
|
|
475
|
-
GitHub Issues example:
|
|
476
|
-
|
|
477
|
-
```yaml
|
|
478
|
-
source: github-issues
|
|
479
|
-
source_config:
|
|
480
|
-
team: my-org/my-repo # owner/repo
|
|
481
|
-
label: ready # issues with this label are picked up
|
|
482
|
-
in_progress: in-progress # label applied when Lisa starts working
|
|
483
|
-
done: "" # issue is closed after PR (value unused)
|
|
484
|
-
```
|
|
485
|
-
|
|
486
|
-
Jira example:
|
|
487
|
-
|
|
488
|
-
```yaml
|
|
489
|
-
source: jira
|
|
490
|
-
source_config:
|
|
491
|
-
team: ENG # Jira project key
|
|
492
|
-
label: lisa # label to filter issues
|
|
493
|
-
pick_from: Backlog # status to pick issues from
|
|
494
|
-
in_progress: In Progress # status applied when Lisa starts working
|
|
495
|
-
done: In Review # status applied after PR is created
|
|
196
|
+
require_acceptance_criteria: true
|
|
496
197
|
```
|
|
497
198
|
|
|
498
199
|
### Workflow Modes
|
|
499
200
|
|
|
500
|
-
**Branch** — The
|
|
501
|
-
|
|
502
|
-
**Worktree** — Lisa creates an isolated [git worktree](https://git-scm.com/docs/git-worktree) for each issue under `.worktrees/`. The agent works in the worktree without touching your main checkout. After the PR is created, the worktree is cleaned up automatically. Ideal when you want to keep working in the repo while Lisa resolves issues in the background.
|
|
503
|
-
|
|
504
|
-
**Multi-repo worktree** — When multiple repos are configured, Lisa runs a two-phase flow: a planning agent produces a `.lisa-plan.json` with ordered steps, then Lisa executes each step sequentially — one worktree and one PR per repo. Cross-repo context (branch names, PR URLs) is passed to each subsequent step.
|
|
505
|
-
|
|
506
|
-
### Concurrent Execution
|
|
507
|
-
|
|
508
|
-
Process multiple issues in parallel with `--concurrency`:
|
|
509
|
-
|
|
510
|
-
```bash
|
|
511
|
-
lisa run --concurrency 3 # or -c 3
|
|
512
|
-
```
|
|
513
|
-
|
|
514
|
-
Each issue runs in its own isolated worktree with an independent provider process. When `--concurrency` is greater than 1, worktree mode is enforced automatically. The default is 1 (sequential, backward-compatible).
|
|
201
|
+
**Branch** — The agent creates a branch in your current checkout. Simple setup, works everywhere.
|
|
515
202
|
|
|
516
|
-
|
|
517
|
-
- **Shared infrastructure** — Docker containers and lifecycle resources are started once and shared across worktrees.
|
|
518
|
-
- **Guardrails** — Writes to the guardrails file are serialized to prevent concurrent corruption.
|
|
519
|
-
- **TUI** — Multiple cards appear in the In Progress column simultaneously. `[k]` and `[s]` target the selected card; `[p]` pauses all active providers.
|
|
520
|
-
- **Fallback** — Each issue has its own independent fallback chain.
|
|
521
|
-
- **Slot filling** — When an issue completes, the freed slot is immediately filled with the next available issue.
|
|
203
|
+
**Worktree** — Lisa creates an isolated git worktree per issue under `.worktrees/`. Your main checkout stays untouched. Cleaned up automatically after the PR is created.
|
|
522
204
|
|
|
523
|
-
|
|
205
|
+
When `--concurrency` is greater than 1, worktree mode is enforced automatically.
|
|
524
206
|
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
Lisa detects blocked issues using the `completedBlockerIds` from your issue tracker (Linear blockers, GitHub milestone links, etc.) and skips issues whose blockers are not yet completed. Once a blocker is resolved, the dependent issue becomes eligible and will be picked up in a future loop.
|
|
528
|
-
|
|
529
|
-
### Recovery Mechanisms
|
|
530
|
-
|
|
531
|
-
- **Orphan recovery** — On startup, Lisa scans for issues stuck in `in_progress` from interrupted runs and reverts them to `pick_from`.
|
|
532
|
-
- **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.
|
|
533
|
-
- **Signal handling** — SIGINT/SIGTERM gracefully revert the active issue to its previous status before exiting.
|
|
534
|
-
- **Guardrails** — Failed sessions and rejected PR reviews are logged and injected into future prompts so the agent avoids repeating the same mistakes.
|
|
535
|
-
- **PR feedback injection** — When a PR created by Lisa is closed without merge, review comments are automatically captured and injected as guardrails for the next run of the same issue. Use `lisa feedback --pr <url> --issue <id>` to inject feedback manually.
|
|
536
|
-
|
|
537
|
-
### Overseer
|
|
538
|
-
|
|
539
|
-
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.
|
|
540
|
-
|
|
541
|
-
### Issue Spec Validation
|
|
542
|
-
|
|
543
|
-
Before starting work on an issue, Lisa validates that it has a minimum spec. Issues that fail validation are skipped, labelled `needs-spec`, and have their `ready` label removed — so they never block the queue.
|
|
544
|
-
|
|
545
|
-
An issue passes validation if its description is non-empty and contains at least one of:
|
|
546
|
-
|
|
547
|
-
- A Markdown checklist item (`- [ ]`)
|
|
548
|
-
- The phrase `acceptance criteria` or `critérios`
|
|
549
|
-
- The words `expected`, `should`, or `deve`
|
|
550
|
-
|
|
551
|
-
To disable spec validation (e.g. for quick one-off issues):
|
|
552
|
-
|
|
553
|
-
```yaml
|
|
554
|
-
validation:
|
|
555
|
-
require_acceptance_criteria: false
|
|
556
|
-
```
|
|
207
|
+
---
|
|
557
208
|
|
|
558
|
-
|
|
209
|
+
## Writing Issues
|
|
559
210
|
|
|
560
|
-
|
|
211
|
+
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`.
|
|
561
212
|
|
|
562
|
-
|
|
213
|
+
Issues must contain acceptance criteria: markdown checklists (`- [ ]`) or keywords like `acceptance criteria`, `expected`, `should`.
|
|
563
214
|
|
|
564
|
-
|
|
215
|
+
### Example
|
|
565
216
|
|
|
566
|
-
|
|
217
|
+
```markdown
|
|
218
|
+
Title: Add rate limiting to /api/users endpoint
|
|
567
219
|
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
| Prisma | `npx prisma generate`, `npx prisma db push` |
|
|
571
|
-
| Drizzle | `npx drizzle-kit push` |
|
|
572
|
-
| TypeORM | `npx typeorm migration:run` |
|
|
573
|
-
| Sequelize | `npx sequelize-cli db:migrate` |
|
|
220
|
+
Description:
|
|
221
|
+
Implement rate limiting on the `/api/users` endpoint to prevent abuse.
|
|
574
222
|
|
|
575
|
-
|
|
223
|
+
Relevant files:
|
|
224
|
+
- src/routes/users.ts
|
|
225
|
+
- src/middleware/auth.ts
|
|
576
226
|
|
|
577
|
-
|
|
227
|
+
Acceptance criteria:
|
|
228
|
+
- [ ] Requests exceeding 100/min per IP return HTTP 429
|
|
229
|
+
- [ ] Rate limit headers (X-RateLimit-Limit, X-RateLimit-Remaining) included in all responses
|
|
230
|
+
- [ ] Rate limit state stored in Redis (use existing connection from src/lib/redis.ts)
|
|
231
|
+
- [ ] Existing tests still pass
|
|
578
232
|
|
|
579
|
-
|
|
580
|
-
repos:
|
|
581
|
-
- path: api
|
|
582
|
-
# lifecycle config is resolved by auto-discovery (docker-compose.yml)
|
|
583
|
-
# port_range and port_env_var can be set via manual config override
|
|
233
|
+
Stack: Express, Redis
|
|
584
234
|
```
|
|
585
235
|
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
| Field | Type | Description |
|
|
589
|
-
|---|---|---|
|
|
590
|
-
| `check_port` | `number` | Preferred (base) port |
|
|
591
|
-
| `port_range` | `number` (optional) | How many ports to scan from `check_port` |
|
|
592
|
-
| `port_env_var` | `string` (optional) | Env var name to inject the allocated port (e.g. `DATABASE_PORT`) |
|
|
593
|
-
|
|
594
|
-
If no free port is found within the range, Lisa logs a clear error and aborts the session.
|
|
595
|
-
|
|
596
|
-
**Lifecycle modes** control how Lisa handles infrastructure:
|
|
236
|
+
Including **relevant files**, **technical constraints**, and **stack information** in the description leads to better results.
|
|
597
237
|
|
|
598
|
-
|
|
599
|
-
|------|----------|
|
|
600
|
-
| `auto` (default) | Discover, start, and tear down infrastructure automatically |
|
|
601
|
-
| `skip` | Skip all infrastructure management — assume services are already running |
|
|
602
|
-
| `validate-only` | Check that required ports are available but don't start or stop services |
|
|
603
|
-
|
|
604
|
-
### Auto-Detection
|
|
605
|
-
|
|
606
|
-
Lisa auto-detects `vitest` or `jest` from `package.json` dependencies and injects the correct test command into the agent prompt. It also detects the package manager from lockfiles (`bun.lockb`/`bun.lock` → `bun`, `pnpm-lock.yaml` → `pnpm`, `yarn.lock` → `yarn`, otherwise `npm`).
|
|
607
|
-
|
|
608
|
-
### Project Context Analysis
|
|
609
|
-
|
|
610
|
-
Before building the prompt for the AI agent, Lisa automatically analyzes the project and injects rich context into the prompt:
|
|
611
|
-
|
|
612
|
-
- **Quality scripts** — detects `lint`, `typecheck`, `check`, `format`, `test`, `build`, `ci` scripts from `package.json`
|
|
613
|
-
- **Test patterns** — discovers test file location (colocated vs separate directory), style (describe/it vs top-level test), mocking libraries (`vi.mock`, `jest.mock`, fixtures), and includes example code from the first test file found
|
|
614
|
-
- **Code tools** — reads configuration from Biome (`biome.json`), ESLint (`.eslintrc.*`, `eslint.config.*`), and Prettier (`.prettierrc.*`, `prettier.config.*`)
|
|
615
|
-
- **Project structure** — generates a tree view of immediate subdirectories and their children
|
|
616
|
-
- **Environment type** — classifies the project as CLI, Mobile (React Native/Flutter), Web, Server, Library, or Unknown
|
|
617
|
-
|
|
618
|
-
This context is formatted as a `## Project Context` section in the implementation prompt, giving the agent immediate understanding of the codebase conventions without exploration.
|
|
619
|
-
|
|
620
|
-
### API Client Generator Detection
|
|
621
|
-
|
|
622
|
-
Lisa detects API client generators in the project and enriches the agent prompt with generation details — input spec location, output directory, and the command to regenerate clients:
|
|
623
|
-
|
|
624
|
-
| Generator | Config Files |
|
|
625
|
-
|-----------|-------------|
|
|
626
|
-
| Orval | `orval.config.ts/js`, `.orvalrc`, `.orvalrc.json/js/ts` |
|
|
627
|
-
| Kubb | `kubb.config.ts/js/mjs` |
|
|
628
|
-
| hey-api | `openapi-ts.config.ts/js/mjs` |
|
|
629
|
-
| openapi-generator | `openapitools.json`, `.openapi-generator/` |
|
|
630
|
-
| swagger-codegen | `swagger-codegen-config.json` |
|
|
631
|
-
| openapi-typescript | detected from `package.json` dependencies |
|
|
632
|
-
|
|
633
|
-
When a generator is detected, the agent receives the config file path, whether the spec is a live URL or local file, the output directory, and the `package.json` script (or `npx` command) to run the generator.
|
|
238
|
+
---
|
|
634
239
|
|
|
635
240
|
## License
|
|
636
241
|
|
package/dist/index.js
CHANGED
|
@@ -6740,40 +6740,44 @@ function installSignalHandlers() {
|
|
|
6740
6740
|
// src/loop/demo.ts
|
|
6741
6741
|
async function runDemoLoop() {
|
|
6742
6742
|
const demoIssues = [
|
|
6743
|
-
{ id: "INT-
|
|
6744
|
-
{ id: "INT-513", title: "WebSocket leak" },
|
|
6745
|
-
{ id: "INT-
|
|
6743
|
+
{ id: "INT-514", title: "Dark mode UI" },
|
|
6744
|
+
{ id: "INT-513", title: "WebSocket leak fix" },
|
|
6745
|
+
{ id: "INT-512", title: "Rate limiter middleware" },
|
|
6746
|
+
{ id: "INT-511", title: "Sidebar navigation icons" },
|
|
6747
|
+
{ id: "INT-510", title: "Blog post CRUD" },
|
|
6748
|
+
{ id: "INT-509", title: "Admin FAQ management" },
|
|
6749
|
+
{ id: "INT-508", title: "Changelog CRUD" }
|
|
6746
6750
|
];
|
|
6747
6751
|
await sleep2(3e3);
|
|
6748
6752
|
kanbanEmitter.emit("provider:model-changed", "claude-sonnet-4-6");
|
|
6749
6753
|
await sleep2(400);
|
|
6750
|
-
for (const
|
|
6754
|
+
for (const issue4 of demoIssues) {
|
|
6751
6755
|
kanbanEmitter.emit("issue:queued", {
|
|
6752
|
-
id:
|
|
6753
|
-
title:
|
|
6756
|
+
id: issue4.id,
|
|
6757
|
+
title: issue4.title,
|
|
6754
6758
|
description: "",
|
|
6755
6759
|
url: ""
|
|
6756
6760
|
});
|
|
6757
|
-
await sleep2(
|
|
6761
|
+
await sleep2(200);
|
|
6758
6762
|
}
|
|
6759
|
-
await sleep2(
|
|
6763
|
+
await sleep2(1e3);
|
|
6760
6764
|
const issue1 = demoIssues[0];
|
|
6761
6765
|
kanbanEmitter.emit("issue:started", issue1.id);
|
|
6762
6766
|
const outputs1 = [
|
|
6763
6767
|
"Reading issue description...\n",
|
|
6764
6768
|
"Analyzing codebase structure...\n",
|
|
6765
|
-
"Creating src/
|
|
6766
|
-
"
|
|
6767
|
-
"Adding
|
|
6769
|
+
"Creating src/theme/dark-mode.ts...\n",
|
|
6770
|
+
"Updating CSS variables for dark palette...\n",
|
|
6771
|
+
"Adding toggle component...\n",
|
|
6768
6772
|
"Running tests... all passing \u2713\n",
|
|
6769
|
-
"Pushing branch int-
|
|
6773
|
+
"Pushing branch int-514-dark-mode-ui...\n"
|
|
6770
6774
|
];
|
|
6771
6775
|
for (const line of outputs1) {
|
|
6772
6776
|
kanbanEmitter.emit("issue:output", issue1.id, line);
|
|
6773
|
-
await sleep2(
|
|
6777
|
+
await sleep2(500);
|
|
6774
6778
|
}
|
|
6775
|
-
kanbanEmitter.emit("issue:done", issue1.id, ["https://github.com/acme/webapp/pull/
|
|
6776
|
-
await sleep2(
|
|
6779
|
+
kanbanEmitter.emit("issue:done", issue1.id, ["https://github.com/acme/webapp/pull/91"]);
|
|
6780
|
+
await sleep2(1e3);
|
|
6777
6781
|
const issue2 = demoIssues[1];
|
|
6778
6782
|
kanbanEmitter.emit("issue:started", issue2.id);
|
|
6779
6783
|
const outputs2 = [
|
|
@@ -6781,16 +6785,33 @@ async function runDemoLoop() {
|
|
|
6781
6785
|
"Locating WebSocket connection handler...\n",
|
|
6782
6786
|
"Patching connection lifecycle in src/ws/handler.ts...\n",
|
|
6783
6787
|
"Adding cleanup in disconnect callback...\n",
|
|
6784
|
-
"
|
|
6788
|
+
"Running tests... all passing \u2713\n",
|
|
6789
|
+
"Pushing branch int-513-fix-ws-leak...\n"
|
|
6785
6790
|
];
|
|
6786
6791
|
for (const line of outputs2) {
|
|
6787
6792
|
kanbanEmitter.emit("issue:output", issue2.id, line);
|
|
6788
|
-
await sleep2(
|
|
6793
|
+
await sleep2(500);
|
|
6789
6794
|
}
|
|
6790
|
-
kanbanEmitter.emit("issue:done", issue2.id, ["https://github.com/acme/webapp/pull/
|
|
6791
|
-
await sleep2(
|
|
6792
|
-
|
|
6793
|
-
|
|
6795
|
+
kanbanEmitter.emit("issue:done", issue2.id, ["https://github.com/acme/webapp/pull/92"]);
|
|
6796
|
+
await sleep2(1e3);
|
|
6797
|
+
const issue3 = demoIssues[2];
|
|
6798
|
+
kanbanEmitter.emit("issue:started", issue3.id);
|
|
6799
|
+
const outputs3 = [
|
|
6800
|
+
"Reading issue description...\n",
|
|
6801
|
+
"Creating src/middleware/rateLimiter.ts...\n",
|
|
6802
|
+
"Writing sliding window rate limiter...\n",
|
|
6803
|
+
"Adding tests in rateLimiter.test.ts...\n",
|
|
6804
|
+
"Running tests... all passing \u2713\n",
|
|
6805
|
+
"Pushing branch int-512-rate-limiting...\n"
|
|
6806
|
+
];
|
|
6807
|
+
for (const line of outputs3) {
|
|
6808
|
+
kanbanEmitter.emit("issue:output", issue3.id, line);
|
|
6809
|
+
await sleep2(500);
|
|
6810
|
+
}
|
|
6811
|
+
kanbanEmitter.emit("issue:done", issue3.id, ["https://github.com/acme/webapp/pull/93"]);
|
|
6812
|
+
await sleep2(1e3);
|
|
6813
|
+
kanbanEmitter.emit("work:complete", { total: 3, duration: 127e3 });
|
|
6814
|
+
await sleep2(4e3);
|
|
6794
6815
|
kanbanEmitter.emit("tui:exit");
|
|
6795
6816
|
}
|
|
6796
6817
|
|
|
@@ -6892,10 +6913,13 @@ var run = defineCommand5({
|
|
|
6892
6913
|
team: "Engineering",
|
|
6893
6914
|
project: "Web App",
|
|
6894
6915
|
label: "ready",
|
|
6895
|
-
pick_from: "
|
|
6916
|
+
pick_from: "Backlog",
|
|
6896
6917
|
in_progress: "In Progress",
|
|
6897
6918
|
done: "Done"
|
|
6898
6919
|
},
|
|
6920
|
+
provider_options: {
|
|
6921
|
+
claude: { models: ["claude-sonnet-4-6"] }
|
|
6922
|
+
},
|
|
6899
6923
|
loop: { cooldown: 30 },
|
|
6900
6924
|
bell: false
|
|
6901
6925
|
};
|