@tarcisiopgs/lisa 1.37.0 → 1.38.0

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 CHANGED
@@ -38,7 +38,7 @@ If something fails — pre-push hooks, quota limits, stuck processes — Lisa ha
38
38
  ## Features
39
39
 
40
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
41
+ - **9 AI agents** — Claude Code, Gemini CLI, GitHub Copilot CLI, Cursor Agent, Aider, Goose, OpenCode, Codex, Kilo Code
42
42
  - **AI planning** — describe a goal, the AI brainstorms with you, decomposes it into issues with dependencies, created in your tracker
43
43
  - **Language-aware** — responds in the same language you write your goal in
44
44
  - **Spec compliance** — LLM-verified acceptance criteria check before PR creation, with auto-retry
@@ -53,7 +53,7 @@ If something fails — pre-push hooks, quota limits, stuck processes — Lisa ha
53
53
  - **Smart activity detection** — reads agent session logs to prevent false stuck kills during analysis phases
54
54
  - **Progress comments** — posts real-time status updates on issues as Lisa works through stages
55
55
  - **Context enrichment** — greps for issue-related files and surfaces them in the agent prompt
56
- - **PR reviewers & assignees** — auto-request reviews and assign PRs via config; `self` keyword resolves to the authenticated user
56
+ - **PR reviewers & assignees** — auto-request reviews and assign PRs via config; `self` keyword resolves to the authenticated user. Manage reviewers interactively from the TUI detail view (`r`)
57
57
  - **Self-healing** — orphan recovery on startup, push failure retry, stuck process detection
58
58
  - **Guardrails** — past failures are injected into future prompts to avoid repeating mistakes
59
59
  - **Lineage context** — plan-decomposed issues get sibling task awareness, preventing duplicate work in concurrent mode
@@ -67,6 +67,7 @@ If something fails — pre-push hooks, quota limits, stuck processes — Lisa ha
67
67
  | Gemini CLI | `gemini` | Goose | `goose` |
68
68
  | GitHub Copilot CLI | `copilot` | Aider | `aider` |
69
69
  | OpenCode | `opencode` | OpenAI Codex | `codex` |
70
+ | Kilo Code | `kilo` | | |
70
71
 
71
72
  Configure models and provider-specific options:
72
73
 
@@ -360,6 +361,7 @@ The real-time Kanban board shows issue progress, streams provider output, and de
360
361
  |-----|--------|
361
362
  | `↑` `↓` | Scroll output log |
362
363
  | `o` | Open PR in browser |
364
+ | `r` | Toggle reviewer picker (add/remove reviewers on the PR) |
363
365
  | `m` | Merge PR (warns if CI not passed) |
364
366
  | `Esc` | Back to board |
365
367
 
@@ -21,6 +21,8 @@ var SourceError = class extends LisaError {
21
21
  this.statusCode = statusCode;
22
22
  this.name = "SourceError";
23
23
  }
24
+ source;
25
+ statusCode;
24
26
  };
25
27
 
26
28
  export {
@@ -2,40 +2,42 @@
2
2
  import {
3
3
  WATCH_POLL_INTERVAL_MS,
4
4
  analyzeProject,
5
- appendPlatformAttribution,
6
- appendPlatformProofOfWork,
7
- appendPlatformSpecCompliance,
8
- applyPrReviewersAndAssignees,
9
- buildCompliancePrompt,
10
- buildComplianceRecoveryPrompt,
11
5
  buildContinuationPrompt,
12
6
  buildImplementPrompt,
13
7
  buildLineagePromptBlock,
14
8
  buildNativeWorktreePrompt,
15
9
  buildPlanningPrompt,
16
10
  buildScopedImplementPrompt,
17
- buildValidationRecoveryPrompt,
18
11
  contextExists,
19
12
  createProvider,
20
13
  createSource,
21
14
  detectPackageManager,
22
15
  detectTestRunner,
23
- extractAcceptanceCriteria,
24
16
  getContextPath,
25
- getFullDiff,
26
17
  isCompleteProviderExhaustion,
27
- isProofOfWorkEnabled,
28
- isSpecComplianceEnabled,
29
18
  loadLineageForIssue,
30
- parseComplianceResponse,
31
19
  readContext,
32
20
  resolveModels,
33
- runValidationCommands,
34
21
  runWithFallback
35
- } from "./chunk-XXVTKBC5.js";
22
+ } from "./chunk-MQG6ANVU.js";
36
23
  import {
37
24
  kanbanEmitter
38
- } from "./chunk-VS6R5KBO.js";
25
+ } from "./chunk-LR2GREZS.js";
26
+ import {
27
+ appendPlatformAttribution,
28
+ appendPlatformProofOfWork,
29
+ appendPlatformSpecCompliance,
30
+ applyPrReviewersAndAssignees,
31
+ buildCompliancePrompt,
32
+ buildComplianceRecoveryPrompt,
33
+ buildValidationRecoveryPrompt,
34
+ extractAcceptanceCriteria,
35
+ getFullDiff,
36
+ isProofOfWorkEnabled,
37
+ isSpecComplianceEnabled,
38
+ parseComplianceResponse,
39
+ runValidationCommands
40
+ } from "./chunk-ZOVVFU7B.js";
39
41
  import {
40
42
  appendRawEntry,
41
43
  migrateGuardrails
@@ -66,7 +68,7 @@ import {
66
68
  import {
67
69
  LisaError,
68
70
  formatError
69
- } from "./chunk-CTMZ666K.js";
71
+ } from "./chunk-4MZ2565Y.js";
70
72
  import {
71
73
  fetchPrFeedback,
72
74
  formatPrFeedbackEntry
@@ -88,7 +90,8 @@ var VALID_PROVIDERS = [
88
90
  "cursor",
89
91
  "goose",
90
92
  "aider",
91
- "codex"
93
+ "codex",
94
+ "kilo"
92
95
  ];
93
96
  var VALID_SOURCES = [
94
97
  "linear",
@@ -2219,6 +2222,9 @@ var ProgressReporter = class {
2219
2222
  this.issueId = issueId;
2220
2223
  this.enabled = enabled;
2221
2224
  }
2225
+ source;
2226
+ issueId;
2227
+ enabled;
2222
2228
  commentId = null;
2223
2229
  stages = [];
2224
2230
  lastUpdate = 0;
@@ -2952,6 +2958,10 @@ ${contResult.output}
2952
2958
  await cleanupWorktree(repoPath, worktreePath);
2953
2959
  await appendPlatformAttribution(prUrl, result.providerUsed, config.platform);
2954
2960
  await applyPrReviewersAndAssignees(prUrl, config.pr, config.platform);
2961
+ if (config.pr?.reviewers?.length) {
2962
+ const applied = config.pr.reviewers.filter((r) => r !== "self");
2963
+ kanbanEmitter.emit("issue:reviewers-updated", issue.id, applied);
2964
+ }
2955
2965
  ok(`Step ${stepNum} complete: ${repoPath} \u2014 PR: ${prUrl}`);
2956
2966
  return {
2957
2967
  success: true,
@@ -3122,6 +3132,10 @@ async function runNativeWorktreeSession(config, issue, logFile, session, models,
3122
3132
  ok(`PR created by provider: ${prUrl}`);
3123
3133
  await appendPlatformAttribution(prUrl, result.providerUsed, config.platform);
3124
3134
  await applyPrReviewersAndAssignees(prUrl, config.pr, config.platform);
3135
+ if (config.pr?.reviewers?.length) {
3136
+ const applied = config.pr.reviewers.filter((r) => r !== "self");
3137
+ kanbanEmitter.emit("issue:reviewers-updated", issue.id, applied);
3138
+ }
3125
3139
  if (isCiMonitorEnabled(config.ci_monitor)) {
3126
3140
  const manifestBranch = manifest?.branch;
3127
3141
  if (manifestBranch) {
@@ -3364,6 +3378,10 @@ async function runManualWorktreeSession(config, issue, logFile, session, models,
3364
3378
  kanbanEmitter.emit("issue:substatus", issue.id, "PR created");
3365
3379
  await appendPlatformAttribution(prUrl, result.providerUsed, config.platform);
3366
3380
  await applyPrReviewersAndAssignees(prUrl, config.pr, config.platform);
3381
+ if (config.pr?.reviewers?.length) {
3382
+ const applied = config.pr.reviewers.filter((r) => r !== "self");
3383
+ kanbanEmitter.emit("issue:reviewers-updated", issue.id, applied);
3384
+ }
3367
3385
  if (validationResults) {
3368
3386
  await appendPlatformProofOfWork(prUrl, validationResults, config.platform);
3369
3387
  }
@@ -3912,6 +3930,10 @@ async function runBranchSession(config, issue, logFile, session, models, source,
3912
3930
  ok(`PR created by provider: ${prUrl}`);
3913
3931
  await appendPlatformAttribution(prUrl, result.providerUsed, config.platform);
3914
3932
  await applyPrReviewersAndAssignees(prUrl, config.pr, config.platform);
3933
+ if (config.pr?.reviewers?.length) {
3934
+ const applied = config.pr.reviewers.filter((r) => r !== "self");
3935
+ kanbanEmitter.emit("issue:reviewers-updated", issue.id, applied);
3936
+ }
3915
3937
  if (validationResults) {
3916
3938
  await appendPlatformProofOfWork(prUrl, validationResults, config.platform);
3917
3939
  }
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-HPWL5JRW.js";
8
8
  import {
9
9
  SourceError
10
- } from "./chunk-CTMZ666K.js";
10
+ } from "./chunk-4MZ2565Y.js";
11
11
 
12
12
  // src/ui/state.ts
13
13
  import { EventEmitter } from "events";
@@ -891,6 +891,14 @@ function useKanbanState(bellEnabled, initialCards = []) {
891
891
  const onSubstatus = (issueId, substatus) => {
892
892
  setCards((prev) => prev.map((c) => c.id === issueId ? { ...c, substatus } : c));
893
893
  };
894
+ const onReviewersUpdated = (issueId, reviewers) => {
895
+ setCards((prev) => prev.map((c) => c.id === issueId ? { ...c, reviewers } : c));
896
+ };
897
+ const onAvailableReviewers = (issueId, available) => {
898
+ setCards(
899
+ (prev) => prev.map((c) => c.id === issueId ? { ...c, availableReviewers: available } : c)
900
+ );
901
+ };
894
902
  const MAX_OUTPUT_SIZE = 2e5;
895
903
  const outputBuffer = /* @__PURE__ */ new Map();
896
904
  let flushTimer = null;
@@ -939,6 +947,8 @@ function useKanbanState(bellEnabled, initialCards = []) {
939
947
  kanbanEmitter.on("provider:resumed", onProviderResumed);
940
948
  kanbanEmitter.on("issue:log-file", onLogFile);
941
949
  kanbanEmitter.on("issue:substatus", onSubstatus);
950
+ kanbanEmitter.on("issue:reviewers-updated", onReviewersUpdated);
951
+ kanbanEmitter.on("issue:available-reviewers", onAvailableReviewers);
942
952
  kanbanEmitter.on("issue:output", onOutput);
943
953
  const onModelChanged = (model) => setModelInUse(model);
944
954
  kanbanEmitter.on("provider:model-changed", onModelChanged);
@@ -985,6 +995,8 @@ function useKanbanState(bellEnabled, initialCards = []) {
985
995
  kanbanEmitter.off("provider:resumed", onProviderResumed);
986
996
  kanbanEmitter.off("issue:log-file", onLogFile);
987
997
  kanbanEmitter.off("issue:substatus", onSubstatus);
998
+ kanbanEmitter.off("issue:reviewers-updated", onReviewersUpdated);
999
+ kanbanEmitter.off("issue:available-reviewers", onAvailableReviewers);
988
1000
  kanbanEmitter.off("issue:output", onOutput);
989
1001
  kanbanEmitter.off("provider:model-changed", onModelChanged);
990
1002
  kanbanEmitter.off("work:empty", onEmpty);
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  isGhCliAvailable
4
- } from "./chunk-YMV4CBQE.js";
4
+ } from "./chunk-YBM6JNRO.js";
5
5
  import {
6
6
  verbose
7
7
  } from "./chunk-HPWL5JRW.js";
8
8
  import {
9
9
  formatError
10
- } from "./chunk-CTMZ666K.js";
10
+ } from "./chunk-4MZ2565Y.js";
11
11
 
12
12
  // src/cli/detection.ts
13
13
  import { execSync } from "child_process";