{"id":45224463,"url":"https://github.com/tarcisiopgs/lisa","last_synced_at":"2026-04-01T18:37:37.530Z","repository":{"id":339417273,"uuid":"1161767139","full_name":"tarcisiopgs/lisa","owner":"tarcisiopgs","description":"Autonomous issue resolver","archived":false,"fork":false,"pushed_at":"2026-03-28T14:34:30.000Z","size":8748,"stargazers_count":11,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-28T17:00:48.551Z","etag":null,"topics":["ai-agent","aider","autonomous","claude","cli","codex","gemini","github","gitlab","goose","issue-resolver","jira","linear","loop","plane","ralph","ralph-loop","shortcut","trello","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tarcisiopgs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-19T13:51:05.000Z","updated_at":"2026-03-28T14:34:32.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tarcisiopgs/lisa","commit_stats":null,"previous_names":["tarcisiopgs/lisa-loop"],"tags_count":79,"template":false,"template_full_name":null,"purl":"pkg:github/tarcisiopgs/lisa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tarcisiopgs%2Flisa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tarcisiopgs%2Flisa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tarcisiopgs%2Flisa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tarcisiopgs%2Flisa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tarcisiopgs","download_url":"https://codeload.github.com/tarcisiopgs/lisa/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tarcisiopgs%2Flisa/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31126673,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-28T20:32:38.821Z","status":"ssl_error","status_checked_at":"2026-03-28T20:24:19.814Z","response_time":79,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-agent","aider","autonomous","claude","cli","codex","gemini","github","gitlab","goose","issue-resolver","jira","linear","loop","plane","ralph","ralph-loop","shortcut","trello","typescript"],"created_at":"2026-02-20T19:07:55.179Z","updated_at":"2026-04-01T18:37:37.519Z","avatar_url":"https://github.com/tarcisiopgs.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Lisa\n\n\u003cp align=\"center\"\u003e\n  \u003cstrong\u003ePlan issues. Run agents. Get PRs.\u003c/strong\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@tarcisiopgs/lisa\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/@tarcisiopgs/lisa.svg\" alt=\"npm version\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://www.npmjs.com/package/@tarcisiopgs/lisa\"\u003e\u003cimg src=\"https://img.shields.io/npm/dm/@tarcisiopgs/lisa.svg\" alt=\"npm downloads\" /\u003e\u003c/a\u003e\n  \u003ca href=\"LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/badge/license-MIT-blue.svg\" alt=\"License: MIT\" /\u003e\u003c/a\u003e\n  \u003cimg src=\"https://img.shields.io/node/v/%40tarcisiopgs%2Flisa\" alt=\"Node.js version\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"assets/demo.gif\" alt=\"Lisa demo\" /\u003e\n\u003c/p\u003e\n\nLisa connects your issue tracker to an AI coding agent and delivers pull requests — autonomously. Describe a goal, Lisa decomposes it into issues, picks them up, implements each one, opens PRs, and updates your board. No babysitting.\n\n## Quickstart\n\n```bash\nnpm install -g @tarcisiopgs/lisa\nlisa init    # interactive setup wizard\nlisa         # start the agent loop\n```\n\n## How It Works\n\n```\n  Plan → Create issues → Fetch → Implement → Push → Open PR → CI Monitor → Review Monitor → Update board → Next\n```\n\nLisa starts and shows a Kanban board. If the queue is empty, press `n` to plan — describe a goal and the AI brainstorms with you (asking clarifying questions), presents its understanding for your confirmation, then decomposes the goal into atomic issues created directly in your tracker. You can review, edit, reorder, delete, or regenerate the plan with feedback before approving. Press `r` to start processing. 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.\n\nIf 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.\n\n## Features\n\n- **7 issue trackers** — Linear, GitHub Issues, GitLab Issues, Jira, Trello, Plane, Shortcut\n- **8 AI agents** — Claude Code, Gemini CLI, GitHub Copilot CLI, Cursor Agent, Aider, Goose, OpenCode, Codex\n- **AI planning** — describe a goal, the AI brainstorms with you, decomposes it into issues with dependencies, created in your tracker\n- **Language-aware** — responds in the same language you write your goal in\n- **Spec compliance** — LLM-verified acceptance criteria check before PR creation, with auto-retry\n- **Concurrent execution** — process multiple issues in parallel, each in its own worktree\n- **Multi-repo** — plans across repos, creates one PR per repo in the correct order\n- **Model fallback** — chain models; transient errors (429, quota, timeout) auto-switch to the next\n- **Real-time TUI** — Kanban board with live provider output, plan mode, merge PRs with `m`\n- **CI monitoring** — polls CI after PR creation, re-invokes the agent to fix failures automatically\n- **Review monitoring** — polls PR reviews after CI, auto-addresses reviewer feedback (GitHub)\n- **Reaction engine** — configurable actions for CI failures, review changes, stuck agents\n- **Session state tracking** — real-time visibility into agent pipeline phase (implementing → validating → CI → review)\n- **Smart activity detection** — reads agent session logs to prevent false stuck kills during analysis phases\n- **Progress comments** — posts real-time status updates on issues as Lisa works through stages\n- **Context enrichment** — greps for issue-related files and surfaces them in the agent prompt\n- **PR reviewers \u0026 assignees** — auto-request reviews and assign PRs via config; `self` keyword resolves to the authenticated user\n- **Self-healing** — orphan recovery on startup, push failure retry, stuck process detection\n- **Guardrails** — past failures are injected into future prompts to avoid repeating mistakes\n- **Lineage context** — plan-decomposed issues get sibling task awareness, preventing duplicate work in concurrent mode\n- **Project context** — auto-generates `.lisa/context.md` with your stack, conventions, and constraints\n\n## Providers\n\n| Provider | Key | Provider | Key |\n|----------|-----|----------|-----|\n| Claude Code | `claude` | Cursor Agent | `cursor` |\n| Gemini CLI | `gemini` | Goose | `goose` |\n| GitHub Copilot CLI | `copilot` | Aider | `aider` |\n| OpenCode | `opencode` | OpenAI Codex | `codex` |\n\nConfigure models and provider-specific options:\n\n```yaml\nprovider: claude\nprovider_options:\n  claude:\n    models:\n      - claude-sonnet-4-6   # primary\n      - claude-opus-4-6     # fallback\n    effort: high             # optional: low, medium, high, max\n```\n\nGoose requires a backend selection:\n\n```yaml\nprovider: goose\nprovider_options:\n  goose:\n    goose_provider: gemini-cli   # gemini-cli, anthropic, openai, google, ollama\n    models:\n      - gemini-2.5-pro\n```\n\n## Commands\n\n```bash\nlisa                        # start the agent loop (Kanban TUI)\nlisa --once                 # process a single issue\nlisa --once --dry-run       # preview config without executing\nlisa --watch                # poll for new issues after queue empties\nlisa -c 3                   # process 3 issues in parallel\nlisa --issue INT-42         # process a specific issue\nlisa --limit 5              # stop after 5 issues\nlisa plan \"Add rate limiting\" # brainstorm + decompose goal into issues via AI\nlisa plan --issue EPIC-123  # decompose existing issue into sub-issues\nlisa plan --continue        # resume interrupted plan\nlisa plan --no-brainstorm \"goal\" # skip brainstorming, decompose directly\nlisa plan --yes \"goal\"      # skip confirmations (CI/scripts)\nlisa init                   # create .lisa/config.yaml interactively\nlisa status                 # show session stats\nlisa config --show           # print current config\nlisa config --get loop.cooldown  # query a specific value\nlisa config --set loop.cooldown=5  # set nested config values\nlisa doctor                 # diagnose setup issues (config, provider, env, git)\nlisa context refresh        # regenerate project context\nlisa feedback --pr URL      # inject PR review feedback into guardrails\nlisa sessions               # list active session states (supports --json)\n```\n\nAppend `--json` to any command for machine-readable output. Use `--verbose` / `--quiet` to control log verbosity.\n\n## Configuration\n\nConfig lives in `.lisa/config.yaml`. Run `lisa init` to create it interactively.\n\n```yaml\nprovider: claude\nsource: linear\nworkflow: worktree       # \"worktree\" (isolated) or \"branch\" (in-place)\n\nsource_config:\n  scope: Engineering\n  project: Web App\n  label: ready              # or array: [ready, urgent]\n  remove_label: ready       # label to remove on completion (defaults to label)\n  pick_from: Backlog\n  in_progress: In Progress\n  done: In Review\n\nbell: true                  # terminal bell on issue completion\n\nplatform: cli            # \"cli\" (gh), \"token\" (GITHUB_TOKEN), \"gitlab\", \"bitbucket\"\nbase_branch: main\n```\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eEnvironment variables\u003c/strong\u003e\u003c/summary\u003e\n\n```bash\n# PR creation (at least one)\nGITHUB_TOKEN=\"\"           # or use `gh` CLI\nGITLAB_TOKEN=\"\"           # for platform: gitlab\nBITBUCKET_TOKEN=\"\"        # for platform: bitbucket\nBITBUCKET_USERNAME=\"\"\n\n# Issue tracker (set the one you use)\nLINEAR_API_KEY=\"\"\nTRELLO_API_KEY=\"\" \u0026\u0026 TRELLO_TOKEN=\"\"\nPLANE_API_TOKEN=\"\"\nSHORTCUT_API_TOKEN=\"\"\nGITLAB_TOKEN=\"\"\nGITHUB_TOKEN=\"\"\nJIRA_BASE_URL=\"\" \u0026\u0026 JIRA_EMAIL=\"\" \u0026\u0026 JIRA_API_TOKEN=\"\"\n\n# Self-hosted instances (optional)\nPLANE_BASE_URL=\"\"         # default: https://api.plane.so\nGITLAB_BASE_URL=\"\"        # default: https://gitlab.com\nPLANE_WORKSPACE=\"\"        # fallback for source_config.scope\n\n# Goose backend (required when provider: goose)\nGOOSE_PROVIDER=\"\"         # gemini-cli, anthropic, openai, google, ollama\nGOOSE_MODEL=\"\"            # model name for the selected backend\n\n# AI provider API keys (used by Aider / Goose / wizard auto-detection)\nANTHROPIC_API_KEY=\"\"\nOPENAI_API_KEY=\"\"\nGEMINI_API_KEY=\"\"\nGOOGLE_API_KEY=\"\"         # for Goose with goose_provider: google\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eSource-specific configuration\u003c/strong\u003e\u003c/summary\u003e\n\n| Field | Linear | Trello | Plane | Shortcut | GitLab Issues | GitHub Issues | Jira |\n|-------|--------|--------|-------|----------|---------------|---------------|------|\n| `scope` | Team name | Board name | Workspace slug | — | Project path | `owner/repo` | Project key |\n| `project` | Project name | — | Project ID | — | — | — | — |\n| `pick_from` | Status name | List name | State name | Workflow state | — | — | Status name |\n| `label` | Label | Label | Label | Label | Label | Label | Label |\n| `remove_label` | Label | Label | Label | Label | — | — | — |\n| `in_progress` | Status | Column | State | Workflow state | Label | Label | Status |\n| `done` | Status | Column | State | Workflow state | Closes issue | Closes issue | Status |\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eMulti-repo setup\u003c/strong\u003e\u003c/summary\u003e\n\n```yaml\nrepos:\n  - name: my-api\n    path: ./api\n    base_branch: main\n    match: \"[API]\"        # route issues by title prefix\n  - name: my-app\n    path: ./app\n    base_branch: main\n```\n\nLisa runs a planning phase, then executes steps sequentially — one worktree and one PR per repo.\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cstrong\u003eAdvanced options\u003c/strong\u003e\u003c/summary\u003e\n\n```yaml\nloop:\n  cooldown: 10             # seconds between issues\n  session_timeout: 0       # max seconds per provider run (0 = disabled)\n  output_stall_timeout: 120  # seconds without stdout before killing provider (0 = disabled)\n\noverseer:\n  enabled: true\n  check_interval: 30       # seconds between git status checks\n  stuck_threshold: 300     # kill provider after this many seconds without changes\n\nlifecycle:\n  mode: auto               # \"auto\", \"skip\" (default), \"validate-only\"\n  timeout: 30\n\nproof_of_work:\n  enabled: true\n  block_on_failure: true   # skip PR when validation fails (default: false)\n  max_retries: 2           # retry agent on validation failure\n  commands:\n    - name: lint\n      run: pnpm run lint\n    - name: typecheck\n      run: pnpm run typecheck\n    - name: test\n      run: pnpm run test\n\nvalidation:\n  require_acceptance_criteria: true\n\nspec_compliance:\n  enabled: true\n  max_retries: 1             # retry agent to fix unmet criteria (default: 1)\n  block_on_failure: true     # skip PR when criteria aren't met (default: false)\n\nci_monitor:\n  enabled: true\n  max_retries: 3             # fix attempts on CI failure\n  poll_interval: 30          # seconds between CI status checks\n  poll_timeout: 600          # max seconds to wait for CI\n  block_on_failure: false    # revert issue if CI never passes\n\n# Post-PR review monitoring (GitHub only)\nreview_monitor:\n  enabled: true\n  max_retries: 2             # fix attempts on review changes (default: 2)\n  poll_interval: 60          # seconds between review checks (default: 60)\n  poll_timeout: 3600         # max seconds to wait for review (default: 3600)\n\n# Configurable reactions (override defaults)\nreactions:\n  ci_failed:\n    action: reinvoke         # reinvoke | notify | skip\n    max_retries: 3\n    escalate_after: 30m\n  changes_requested:\n    action: reinvoke\n    max_retries: 2\n    escalate_after: 1h\n  approved:\n    action: notify\n  agent_stuck:\n    action: notify\n  validation_failed:\n    action: reinvoke\n    max_retries: 2\n\nprogress_comments:\n  enabled: true              # post real-time status on issues\n\npr:\n  reviewers:                   # auto-request reviews on every PR\n    - octocat\n    - hubot\n  assignees:                   # auto-assign PRs (\"self\" = authenticated user)\n    - self\n\nhooks:\n  before_run: \"./scripts/setup.sh\"\n  after_run: \"./scripts/cleanup.sh\"\n  timeout: 60000             # ms, default 60000\n```\n\n\u003c/details\u003e\n\n## Validation Pipeline\n\nAfter the agent implements an issue, Lisa runs a multi-stage validation pipeline before creating a PR:\n\n```\nAgent implements → Proof of Work (lint/test/typecheck) → Spec Compliance → PR → CI Monitor → Review Monitor\n```\n\n**Proof of Work** runs configured shell commands (lint, typecheck, test). If any fail, the agent is re-invoked with the error output to fix the issue.\n\n**Spec Compliance** extracts acceptance criteria from the issue description (`- [ ]` checklists) and asks the LLM to verify each one against the git diff. The result is a structured JSON with met/not-met verdicts and evidence. If criteria are unmet, the agent is re-invoked to fix them. Results are appended to the PR body as a Markdown table:\n\n| Criterion | Status | Evidence |\n|-----------|--------|----------|\n| Returns 429 on rate limit | Met | Rate limit middleware returns 429 |\n| Headers include X-RateLimit | Not Met | No header injection found |\n\nBoth stages support `max_retries` and `block_on_failure` — when blocking is enabled, the PR is skipped entirely on failure.\n\n## Writing Good Issues\n\nIssue quality = PR quality. Lisa validates issues and skips vague ones (labeling them `needs-spec`).\n\n**Include:** acceptance criteria (`- [ ]` checklists), relevant file paths, technical constraints, stack info.\n\n```markdown\nTitle: Add rate limiting to /api/users endpoint\n\nImplement rate limiting on `/api/users` to prevent abuse.\n\nRelevant files: src/routes/users.ts, src/middleware/auth.ts\n\nAcceptance criteria:\n- [ ] Requests exceeding 100/min per IP return HTTP 429\n- [ ] Rate limit headers included in responses\n- [ ] Rate limit state stored in Redis (use src/lib/redis.ts)\n- [ ] Existing tests still pass\n```\n\n## TUI\n\nThe real-time Kanban board shows issue progress, streams provider output, and detects PR merges. When the queue is empty, Lisa enters idle mode — plan new issues with `n`, then start processing with `r`.\n\n**Board view**\n\n| Key | Action | Key | Action |\n|-----|--------|-----|--------|\n| `←` `→` | Switch columns | `k` | Kill current issue |\n| `↑` `↓` | Navigate cards | `s` | Skip current issue |\n| `↵` | Open detail view | `n` | Open plan mode |\n| `p` | Pause / resume | `r` | Run (from idle) |\n| `m` | Merge PR (opens detail + triggers merge) | `q` | Quit |\n\n**Detail view**\n\n| Key | Action |\n|-----|--------|\n| `↑` `↓` | Scroll output log |\n| `o` | Open PR in browser |\n| `m` | Merge PR (warns if CI not passed) |\n| `Esc` | Back to board |\n\n**Plan chat**\n\n| Key | Action |\n|-----|--------|\n| `↵` | Send message |\n| `↑` `↓` | Scroll chat history |\n| `Esc` | Cancel |\n\n**Plan review**\n\n| Key | Action |\n|-----|--------|\n| `↵` | View issue detail |\n| `e` | Edit issue in $EDITOR |\n| `d` | Delete issue |\n| `a` | Approve and create issues |\n| `Esc` | Back |\n\nIn CLI mode, the plan wizard also offers **Regenerate with feedback** — describe what to change and the AI regenerates the entire plan incorporating your feedback.\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftarcisiopgs%2Flisa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftarcisiopgs%2Flisa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftarcisiopgs%2Flisa/lists"}