@codyswann/lisa 2.289.0 → 2.289.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/dist/core/lisa.d.ts +15 -2
- package/dist/core/lisa.d.ts.map +1 -1
- package/dist/core/lisa.js +41 -5
- package/dist/core/lisa.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +7 -5
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/linked-worktree.d.ts +18 -0
- package/dist/utils/linked-worktree.d.ts.map +1 -0
- package/dist/utils/linked-worktree.js +42 -0
- package/dist/utils/linked-worktree.js.map +1 -0
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-implement/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-sync/SKILL.md +4 -2
- package/plugins/lisa/agents/jira-agent.md +1 -1
- package/plugins/lisa/rules/eager/config-resolution.md +10 -0
- package/plugins/lisa/skills/lisa-implement/SKILL.md +2 -0
- package/plugins/lisa/skills/lisa-jira-sync/SKILL.md +4 -2
- package/plugins/lisa-agy/agents/jira-agent.md +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-implement/SKILL.md +2 -0
- package/plugins/lisa-agy/skills/lisa-jira-sync/SKILL.md +4 -2
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/agents/jira-agent.agent.md +1 -1
- package/plugins/lisa-copilot/rules/eager/config-resolution.md +10 -0
- package/plugins/lisa-copilot/skills/lisa-implement/SKILL.md +2 -0
- package/plugins/lisa-copilot/skills/lisa-jira-sync/SKILL.md +4 -2
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/agents/jira-agent.md +1 -1
- package/plugins/lisa-cursor/rules/config-resolution.mdc +10 -0
- package/plugins/lisa-cursor/skills/lisa-implement/SKILL.md +2 -0
- package/plugins/lisa-cursor/skills/lisa-jira-sync/SKILL.md +4 -2
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/jira-agent.md +1 -1
- package/plugins/src/base/rules/eager/config-resolution.md +10 -0
- package/plugins/src/base/skills/lisa-implement/SKILL.md +2 -0
- package/plugins/src/base/skills/lisa-jira-sync/SKILL.md +4 -2
- package/scripts/install-claude-plugins.sh +61 -2
package/dist/utils/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from "./fibonacci.js";
|
|
2
2
|
export * from "./file-operations.js";
|
|
3
3
|
export * from "./json-utils.js";
|
|
4
|
+
export * from "./linked-worktree.js";
|
|
4
5
|
export * from "./path-utils.js";
|
|
5
6
|
export * from "./usage-accounting.js";
|
|
6
7
|
export { isRunningAsLifecycleScript, isRunningAsTrampoline, shouldSchedulePostinstallReconciliation, } from "./postinstall-trampoline.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AAKtC,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,uCAAuC,GACxC,MAAM,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AAKtC,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,uCAAuC,GACxC,MAAM,6BAA6B,CAAC"}
|
package/dist/utils/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from "./fibonacci.js";
|
|
2
2
|
export * from "./file-operations.js";
|
|
3
3
|
export * from "./json-utils.js";
|
|
4
|
+
export * from "./linked-worktree.js";
|
|
4
5
|
export * from "./path-utils.js";
|
|
5
6
|
export * from "./usage-accounting.js";
|
|
6
7
|
// Intentionally narrow: the reconciliation trampoline's dist-path resolver and
|
package/dist/utils/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,+EAA+E;AAC/E,mFAAmF;AACnF,gFAAgF;AAChF,8CAA8C;AAC9C,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,uCAAuC,GACxC,MAAM,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,+EAA+E;AAC/E,mFAAmF;AACnF,gFAAgF;AAChF,8CAA8C;AAC9C,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,uCAAuC,GACxC,MAAM,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the primary checkout root when a directory is a linked git
|
|
3
|
+
* worktree.
|
|
4
|
+
*
|
|
5
|
+
* A linked worktree has a `.git` FILE containing
|
|
6
|
+
* `gitdir: <primary>/.git/worktrees/<name>`; a primary checkout has a `.git`
|
|
7
|
+
* directory. Parsing the file avoids spawning git — this runs inside
|
|
8
|
+
* package-manager lifecycle scripts where every child process is a
|
|
9
|
+
* measurable cost. Submodule `.git` files point at `.git/modules/<name>` and
|
|
10
|
+
* deliberately do not match. The primary is only returned when its `.claude`
|
|
11
|
+
* directory exists, mirroring install-claude-plugins.sh and the
|
|
12
|
+
* install-pkgs.sh node_modules link (add08b409).
|
|
13
|
+
* @param dir - Directory to inspect (typically the Lisa destDir)
|
|
14
|
+
* @returns Primary checkout root, or null when dir is not a linked worktree
|
|
15
|
+
* of a reachable primary checkout
|
|
16
|
+
*/
|
|
17
|
+
export declare function resolvePrimaryWorktreeRoot(dir: string): Promise<string | null>;
|
|
18
|
+
//# sourceMappingURL=linked-worktree.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linked-worktree.d.ts","sourceRoot":"","sources":["../../src/utils/linked-worktree.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,0BAA0B,CAC9C,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CA0BxB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import * as path from "node:path";
|
|
4
|
+
/**
|
|
5
|
+
* Resolve the primary checkout root when a directory is a linked git
|
|
6
|
+
* worktree.
|
|
7
|
+
*
|
|
8
|
+
* A linked worktree has a `.git` FILE containing
|
|
9
|
+
* `gitdir: <primary>/.git/worktrees/<name>`; a primary checkout has a `.git`
|
|
10
|
+
* directory. Parsing the file avoids spawning git — this runs inside
|
|
11
|
+
* package-manager lifecycle scripts where every child process is a
|
|
12
|
+
* measurable cost. Submodule `.git` files point at `.git/modules/<name>` and
|
|
13
|
+
* deliberately do not match. The primary is only returned when its `.claude`
|
|
14
|
+
* directory exists, mirroring install-claude-plugins.sh and the
|
|
15
|
+
* install-pkgs.sh node_modules link (add08b409).
|
|
16
|
+
* @param dir - Directory to inspect (typically the Lisa destDir)
|
|
17
|
+
* @returns Primary checkout root, or null when dir is not a linked worktree
|
|
18
|
+
* of a reachable primary checkout
|
|
19
|
+
*/
|
|
20
|
+
export async function resolvePrimaryWorktreeRoot(dir) {
|
|
21
|
+
const resolvedDir = path.resolve(dir);
|
|
22
|
+
const gitdirContent = await readFile(path.join(resolvedDir, ".git"), "utf-8").catch(() => null);
|
|
23
|
+
if (gitdirContent === null) {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
const gitdirMatch = /^gitdir:(.*)$/m.exec(gitdirContent);
|
|
27
|
+
const gitdirTarget = gitdirMatch?.[1]?.trim();
|
|
28
|
+
if (gitdirTarget === undefined || gitdirTarget === "") {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const gitdir = path.resolve(resolvedDir, gitdirTarget);
|
|
32
|
+
const worktreesMatch = /^(.*)[/\\]\.git[/\\]worktrees[/\\][^/\\]+$/.exec(gitdir);
|
|
33
|
+
if (!worktreesMatch?.[1]) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const primaryRoot = worktreesMatch[1];
|
|
37
|
+
if (primaryRoot === resolvedDir) {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
return existsSync(path.join(primaryRoot, ".claude")) ? primaryRoot : null;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=linked-worktree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linked-worktree.js","sourceRoot":"","sources":["../../src/utils/linked-worktree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,GAAW;IAEX,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,aAAa,GAAG,MAAM,QAAQ,CAClC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EAC9B,OAAO,CACR,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IACpB,IAAI,aAAa,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,WAAW,GAAG,gBAAgB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACzD,MAAM,YAAY,GAAG,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAC9C,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,KAAK,EAAE,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACvD,MAAM,cAAc,GAAG,4CAA4C,CAAC,IAAI,CACtE,MAAM,CACP,CAAC;IACF,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,WAAW,GAAG,cAAc,CAAC,CAAC,CAAC,CAAC;IACtC,IAAI,WAAW,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5E,CAAC"}
|
package/package.json
CHANGED
|
@@ -113,7 +113,7 @@
|
|
|
113
113
|
"brace-expansion": ">=5.0.6"
|
|
114
114
|
},
|
|
115
115
|
"name": "@codyswann/lisa",
|
|
116
|
-
"version": "2.289.
|
|
116
|
+
"version": "2.289.2",
|
|
117
117
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
118
118
|
"main": "dist/index.js",
|
|
119
119
|
"exports": {
|
|
@@ -314,3 +314,5 @@ Before shutting down the team, execute the Verify flow:
|
|
|
314
314
|
13. `ops-specialist`: post-deploy health check, monitor for errors in first minutes
|
|
315
315
|
14. If remote verification fails, create a task for the agent team to find out why it failed, fix it and return to step 5. **Bound this loop**: after a small number of full fix→deploy→reverify cycles without reaching a passing remote verdict (treat ~3 as the ceiling unless the work item states otherwise), stop retrying — file a build-ready fix ticket, write the verdict with `status: "blocked"` and the diagnosis, and move the work item to blocked rather than looping indefinitely. The completion gate releases on a `blocked` verdict, so the flow ends with a recorded outcome instead of a silent spin or a self-declared success.
|
|
316
316
|
15. After true terminal completion — required merge/deploy/verification passed, usage/evidence and two-way PR linkage are recorded, and the work item is terminal — run `node scripts/lisa-work-item.mjs clear` and verify the worktree has no current binding. Do not clear on an interruption or blocked outcome; preserving the binding is what keeps resumed work attributable.
|
|
317
|
+
|
|
318
|
+
**Ticket status transitions throughout this flow are config-bound** per the **Tracker status vocabulary** section of the `config-resolution` rule: whoever performs the tracker write — the lead included, in runtimes where the tracker MCP is lead-only — may only target statuses named in the configured workflow map (`claimed`, `blocked`, env-keyed `done`, and `review`/`qa` when configured). Never adopt a status discovered from the tracker's live workflow; a lifecycle stage with no configured status gets a comment, not a transition.
|
|
@@ -66,9 +66,11 @@ Based on the milestone, suggest (but don't automatically perform) a status trans
|
|
|
66
66
|
|
|
67
67
|
| Milestone | Suggested Status |
|
|
68
68
|
|-----------|-----------------|
|
|
69
|
-
| Plan created |
|
|
69
|
+
| Plan created | configured `jira.workflow.claimed` status |
|
|
70
70
|
| PR ready | configured `jira.workflow.review` status, or no transition when unconfigured |
|
|
71
|
-
| PR merged |
|
|
71
|
+
| PR merged | configured `jira.workflow.done` status for the PR's target environment (env-keyed `done` resolved via `deploy.branches`), or no transition when unconfigured |
|
|
72
|
+
|
|
73
|
+
Every suggested or performed transition is bound by the **Tracker status vocabulary** section of the `config-resolution` rule: only statuses named in the configured workflow map, never statuses discovered from the tracker's live workflow (transition lists, board columns, other tickets) — and this binds the lead performing tracker writes exactly as it binds a subagent. A milestone with no configured status gets a comment, not a transition.
|
|
72
74
|
|
|
73
75
|
### Step 5: Parent Status Rollup (`--rollup`)
|
|
74
76
|
|
|
@@ -127,7 +127,7 @@ Note: `done` may be a string or an env-keyed map (`{ dev, staging, production }`
|
|
|
127
127
|
## Rules
|
|
128
128
|
|
|
129
129
|
- Never auto-transition ticket status, with one explicit exception: when `jira-verify` returns `FAIL` for the pre-flight gate (Step 2), first run the `pre-flight-autofill` draft-then-block procedure (draft the authorable missing sections into the ticket as labeled assumptions), then transition to the configured `blocked` status, add the configured `human_needed` marker label (`jira.labels.human_needed`, default `Human Needed`), and reassign to the Reporter with a confirmation comment. Every other status change remains a suggestion the human confirms.
|
|
130
|
-
- Any transition is config-bound: never invent transitions; a transition may target only a status named in `config.jira.workflow`. Don't guess from the live workflow. The evidence-time review hop (Step 7) follows this rule too — it is config-bound, optional, and skipped when `jira.workflow.review` is absent (the ticket stays in `claimed`).
|
|
130
|
+
- Any transition is config-bound per the **Tracker status vocabulary** section of the `config-resolution` rule: never invent transitions; a transition may target only a status named in `config.jira.workflow`. Don't guess from the live workflow. The evidence-time review hop (Step 7) follows this rule too — it is config-bound, optional, and skipped when `jira.workflow.review` is absent (the ticket stays in `claimed`).
|
|
131
131
|
- Always read the full ticket graph via `jira-read-ticket` before determining intent — don't rely on ticket type alone
|
|
132
132
|
- Never create or materially edit a ticket by calling MCP write tools directly — always delegate to `jira-write-ticket` so relationships, Gherkin criteria, and metadata gates are enforced
|
|
133
133
|
- If sign-in credentials are in the ticket, extract and pass them to the flow. If the ticket touches an authenticated surface and credentials are missing, that is a Step 2 failure — block and reassign rather than guessing.
|
|
@@ -21,6 +21,16 @@ This applies before declaring connection state, before running any `acli jira *`
|
|
|
21
21
|
|
|
22
22
|
Project tracker (`jira` / `github` / `linear`) is read from `.lisa.config.json` `tracker`. Vendor-neutral skills MUST dispatch through the configured tracker, never infer it from arguments. Missing `tracker` → stop and instruct the user to run the matching `/lisa:setup:*` skill.
|
|
23
23
|
|
|
24
|
+
## Tracker status vocabulary
|
|
25
|
+
|
|
26
|
+
**A status transition may target only a status named in the project's configured workflow map** (`jira.workflow.*` for JIRA; the equivalent label/state map for GitHub and Linear). The configured map is the COMPLETE authorized vocabulary — not a starting point.
|
|
27
|
+
|
|
28
|
+
- **Never adopt statuses discovered from the tracker's live workflow metadata** — transition lists (`getTransitionsForJiraIssue` targets), board columns, status descriptions, or statuses seen on other tickets. A tracker workflow usually contains more statuses than the config names; those extra statuses are not lisa's to use. The live workflow is consulted only to find the transition *id* that reaches a config-named status.
|
|
29
|
+
- **A lifecycle stage with no configured status gets no transition.** If the flow reaches a stage the map does not name (e.g. "PR open awaiting review" when `jira.workflow.review` is unset, or a QA-ready stage with no `qa` mapping), leave the status where it is and record the stage in a comment. Do not pick the nearest-sounding tracker status.
|
|
30
|
+
- **This binds every actor that writes to the tracker** — the lead as much as any subagent. In runtimes where interactively-authenticated MCPs are lead-only, the lead performs the tracker writes for the whole flow; loading an implement/sync skill without the agent definition does not relax this rule.
|
|
31
|
+
|
|
32
|
+
This is the shared slug for the config-bound-transitions policy (the `leaf-only-lifecycle` precedent: one slug, never divergent per-surface prose). Skills and agent definitions cite it rather than restating it.
|
|
33
|
+
|
|
24
34
|
## Repo identity
|
|
25
35
|
|
|
26
36
|
`repo:<name>` is the canonical label for which repo a work item belongs to. Resolve current-repo identity in this priority order: `.lisa.config.local.json` `repo` → `.lisa.config.json` `repo` → `.lisa.config.json` `github.repo` → `basename -s .git "$(git remote get-url origin)"`. If none resolve, stop with a clear error.
|
|
@@ -314,3 +314,5 @@ Before shutting down the team, execute the Verify flow:
|
|
|
314
314
|
13. `ops-specialist`: post-deploy health check, monitor for errors in first minutes
|
|
315
315
|
14. If remote verification fails, create a task for the agent team to find out why it failed, fix it and return to step 5. **Bound this loop**: after a small number of full fix→deploy→reverify cycles without reaching a passing remote verdict (treat ~3 as the ceiling unless the work item states otherwise), stop retrying — file a build-ready fix ticket, write the verdict with `status: "blocked"` and the diagnosis, and move the work item to blocked rather than looping indefinitely. The completion gate releases on a `blocked` verdict, so the flow ends with a recorded outcome instead of a silent spin or a self-declared success.
|
|
316
316
|
15. After true terminal completion — required merge/deploy/verification passed, usage/evidence and two-way PR linkage are recorded, and the work item is terminal — run `node scripts/lisa-work-item.mjs clear` and verify the worktree has no current binding. Do not clear on an interruption or blocked outcome; preserving the binding is what keeps resumed work attributable.
|
|
317
|
+
|
|
318
|
+
**Ticket status transitions throughout this flow are config-bound** per the **Tracker status vocabulary** section of the `config-resolution` rule: whoever performs the tracker write — the lead included, in runtimes where the tracker MCP is lead-only — may only target statuses named in the configured workflow map (`claimed`, `blocked`, env-keyed `done`, and `review`/`qa` when configured). Never adopt a status discovered from the tracker's live workflow; a lifecycle stage with no configured status gets a comment, not a transition.
|
|
@@ -66,9 +66,11 @@ Based on the milestone, suggest (but don't automatically perform) a status trans
|
|
|
66
66
|
|
|
67
67
|
| Milestone | Suggested Status |
|
|
68
68
|
|-----------|-----------------|
|
|
69
|
-
| Plan created |
|
|
69
|
+
| Plan created | configured `jira.workflow.claimed` status |
|
|
70
70
|
| PR ready | configured `jira.workflow.review` status, or no transition when unconfigured |
|
|
71
|
-
| PR merged |
|
|
71
|
+
| PR merged | configured `jira.workflow.done` status for the PR's target environment (env-keyed `done` resolved via `deploy.branches`), or no transition when unconfigured |
|
|
72
|
+
|
|
73
|
+
Every suggested or performed transition is bound by the **Tracker status vocabulary** section of the `config-resolution` rule: only statuses named in the configured workflow map, never statuses discovered from the tracker's live workflow (transition lists, board columns, other tickets) — and this binds the lead performing tracker writes exactly as it binds a subagent. A milestone with no configured status gets a comment, not a transition.
|
|
72
74
|
|
|
73
75
|
### Step 5: Parent Status Rollup (`--rollup`)
|
|
74
76
|
|
|
@@ -127,7 +127,7 @@ Note: `done` may be a string or an env-keyed map (`{ dev, staging, production }`
|
|
|
127
127
|
## Rules
|
|
128
128
|
|
|
129
129
|
- Never auto-transition ticket status, with one explicit exception: when `jira-verify` returns `FAIL` for the pre-flight gate (Step 2), first run the `pre-flight-autofill` draft-then-block procedure (draft the authorable missing sections into the ticket as labeled assumptions), then transition to the configured `blocked` status, add the configured `human_needed` marker label (`jira.labels.human_needed`, default `Human Needed`), and reassign to the Reporter with a confirmation comment. Every other status change remains a suggestion the human confirms.
|
|
130
|
-
- Any transition is config-bound: never invent transitions; a transition may target only a status named in `config.jira.workflow`. Don't guess from the live workflow. The evidence-time review hop (Step 7) follows this rule too — it is config-bound, optional, and skipped when `jira.workflow.review` is absent (the ticket stays in `claimed`).
|
|
130
|
+
- Any transition is config-bound per the **Tracker status vocabulary** section of the `config-resolution` rule: never invent transitions; a transition may target only a status named in `config.jira.workflow`. Don't guess from the live workflow. The evidence-time review hop (Step 7) follows this rule too — it is config-bound, optional, and skipped when `jira.workflow.review` is absent (the ticket stays in `claimed`).
|
|
131
131
|
- Always read the full ticket graph via `jira-read-ticket` before determining intent — don't rely on ticket type alone
|
|
132
132
|
- Never create or materially edit a ticket by calling MCP write tools directly — always delegate to `jira-write-ticket` so relationships, Gherkin criteria, and metadata gates are enforced
|
|
133
133
|
- If sign-in credentials are in the ticket, extract and pass them to the flow. If the ticket touches an authenticated surface and credentials are missing, that is a Step 2 failure — block and reassign rather than guessing.
|
|
@@ -314,3 +314,5 @@ Before shutting down the team, execute the Verify flow:
|
|
|
314
314
|
13. `ops-specialist`: post-deploy health check, monitor for errors in first minutes
|
|
315
315
|
14. If remote verification fails, create a task for the agent team to find out why it failed, fix it and return to step 5. **Bound this loop**: after a small number of full fix→deploy→reverify cycles without reaching a passing remote verdict (treat ~3 as the ceiling unless the work item states otherwise), stop retrying — file a build-ready fix ticket, write the verdict with `status: "blocked"` and the diagnosis, and move the work item to blocked rather than looping indefinitely. The completion gate releases on a `blocked` verdict, so the flow ends with a recorded outcome instead of a silent spin or a self-declared success.
|
|
316
316
|
15. After true terminal completion — required merge/deploy/verification passed, usage/evidence and two-way PR linkage are recorded, and the work item is terminal — run `node scripts/lisa-work-item.mjs clear` and verify the worktree has no current binding. Do not clear on an interruption or blocked outcome; preserving the binding is what keeps resumed work attributable.
|
|
317
|
+
|
|
318
|
+
**Ticket status transitions throughout this flow are config-bound** per the **Tracker status vocabulary** section of the `config-resolution` rule: whoever performs the tracker write — the lead included, in runtimes where the tracker MCP is lead-only — may only target statuses named in the configured workflow map (`claimed`, `blocked`, env-keyed `done`, and `review`/`qa` when configured). Never adopt a status discovered from the tracker's live workflow; a lifecycle stage with no configured status gets a comment, not a transition.
|
|
@@ -66,9 +66,11 @@ Based on the milestone, suggest (but don't automatically perform) a status trans
|
|
|
66
66
|
|
|
67
67
|
| Milestone | Suggested Status |
|
|
68
68
|
|-----------|-----------------|
|
|
69
|
-
| Plan created |
|
|
69
|
+
| Plan created | configured `jira.workflow.claimed` status |
|
|
70
70
|
| PR ready | configured `jira.workflow.review` status, or no transition when unconfigured |
|
|
71
|
-
| PR merged |
|
|
71
|
+
| PR merged | configured `jira.workflow.done` status for the PR's target environment (env-keyed `done` resolved via `deploy.branches`), or no transition when unconfigured |
|
|
72
|
+
|
|
73
|
+
Every suggested or performed transition is bound by the **Tracker status vocabulary** section of the `config-resolution` rule: only statuses named in the configured workflow map, never statuses discovered from the tracker's live workflow (transition lists, board columns, other tickets) — and this binds the lead performing tracker writes exactly as it binds a subagent. A milestone with no configured status gets a comment, not a transition.
|
|
72
74
|
|
|
73
75
|
### Step 5: Parent Status Rollup (`--rollup`)
|
|
74
76
|
|
|
@@ -127,7 +127,7 @@ Note: `done` may be a string or an env-keyed map (`{ dev, staging, production }`
|
|
|
127
127
|
## Rules
|
|
128
128
|
|
|
129
129
|
- Never auto-transition ticket status, with one explicit exception: when `jira-verify` returns `FAIL` for the pre-flight gate (Step 2), first run the `pre-flight-autofill` draft-then-block procedure (draft the authorable missing sections into the ticket as labeled assumptions), then transition to the configured `blocked` status, add the configured `human_needed` marker label (`jira.labels.human_needed`, default `Human Needed`), and reassign to the Reporter with a confirmation comment. Every other status change remains a suggestion the human confirms.
|
|
130
|
-
- Any transition is config-bound: never invent transitions; a transition may target only a status named in `config.jira.workflow`. Don't guess from the live workflow. The evidence-time review hop (Step 7) follows this rule too — it is config-bound, optional, and skipped when `jira.workflow.review` is absent (the ticket stays in `claimed`).
|
|
130
|
+
- Any transition is config-bound per the **Tracker status vocabulary** section of the `config-resolution` rule: never invent transitions; a transition may target only a status named in `config.jira.workflow`. Don't guess from the live workflow. The evidence-time review hop (Step 7) follows this rule too — it is config-bound, optional, and skipped when `jira.workflow.review` is absent (the ticket stays in `claimed`).
|
|
131
131
|
- Always read the full ticket graph via `jira-read-ticket` before determining intent — don't rely on ticket type alone
|
|
132
132
|
- Never create or materially edit a ticket by calling MCP write tools directly — always delegate to `jira-write-ticket` so relationships, Gherkin criteria, and metadata gates are enforced
|
|
133
133
|
- If sign-in credentials are in the ticket, extract and pass them to the flow. If the ticket touches an authenticated surface and credentials are missing, that is a Step 2 failure — block and reassign rather than guessing.
|
|
@@ -21,6 +21,16 @@ This applies before declaring connection state, before running any `acli jira *`
|
|
|
21
21
|
|
|
22
22
|
Project tracker (`jira` / `github` / `linear`) is read from `.lisa.config.json` `tracker`. Vendor-neutral skills MUST dispatch through the configured tracker, never infer it from arguments. Missing `tracker` → stop and instruct the user to run the matching `/lisa:setup:*` skill.
|
|
23
23
|
|
|
24
|
+
## Tracker status vocabulary
|
|
25
|
+
|
|
26
|
+
**A status transition may target only a status named in the project's configured workflow map** (`jira.workflow.*` for JIRA; the equivalent label/state map for GitHub and Linear). The configured map is the COMPLETE authorized vocabulary — not a starting point.
|
|
27
|
+
|
|
28
|
+
- **Never adopt statuses discovered from the tracker's live workflow metadata** — transition lists (`getTransitionsForJiraIssue` targets), board columns, status descriptions, or statuses seen on other tickets. A tracker workflow usually contains more statuses than the config names; those extra statuses are not lisa's to use. The live workflow is consulted only to find the transition *id* that reaches a config-named status.
|
|
29
|
+
- **A lifecycle stage with no configured status gets no transition.** If the flow reaches a stage the map does not name (e.g. "PR open awaiting review" when `jira.workflow.review` is unset, or a QA-ready stage with no `qa` mapping), leave the status where it is and record the stage in a comment. Do not pick the nearest-sounding tracker status.
|
|
30
|
+
- **This binds every actor that writes to the tracker** — the lead as much as any subagent. In runtimes where interactively-authenticated MCPs are lead-only, the lead performs the tracker writes for the whole flow; loading an implement/sync skill without the agent definition does not relax this rule.
|
|
31
|
+
|
|
32
|
+
This is the shared slug for the config-bound-transitions policy (the `leaf-only-lifecycle` precedent: one slug, never divergent per-surface prose). Skills and agent definitions cite it rather than restating it.
|
|
33
|
+
|
|
24
34
|
## Repo identity
|
|
25
35
|
|
|
26
36
|
`repo:<name>` is the canonical label for which repo a work item belongs to. Resolve current-repo identity in this priority order: `.lisa.config.local.json` `repo` → `.lisa.config.json` `repo` → `.lisa.config.json` `github.repo` → `basename -s .git "$(git remote get-url origin)"`. If none resolve, stop with a clear error.
|
|
@@ -314,3 +314,5 @@ Before shutting down the team, execute the Verify flow:
|
|
|
314
314
|
13. `ops-specialist`: post-deploy health check, monitor for errors in first minutes
|
|
315
315
|
14. If remote verification fails, create a task for the agent team to find out why it failed, fix it and return to step 5. **Bound this loop**: after a small number of full fix→deploy→reverify cycles without reaching a passing remote verdict (treat ~3 as the ceiling unless the work item states otherwise), stop retrying — file a build-ready fix ticket, write the verdict with `status: "blocked"` and the diagnosis, and move the work item to blocked rather than looping indefinitely. The completion gate releases on a `blocked` verdict, so the flow ends with a recorded outcome instead of a silent spin or a self-declared success.
|
|
316
316
|
15. After true terminal completion — required merge/deploy/verification passed, usage/evidence and two-way PR linkage are recorded, and the work item is terminal — run `node scripts/lisa-work-item.mjs clear` and verify the worktree has no current binding. Do not clear on an interruption or blocked outcome; preserving the binding is what keeps resumed work attributable.
|
|
317
|
+
|
|
318
|
+
**Ticket status transitions throughout this flow are config-bound** per the **Tracker status vocabulary** section of the `config-resolution` rule: whoever performs the tracker write — the lead included, in runtimes where the tracker MCP is lead-only — may only target statuses named in the configured workflow map (`claimed`, `blocked`, env-keyed `done`, and `review`/`qa` when configured). Never adopt a status discovered from the tracker's live workflow; a lifecycle stage with no configured status gets a comment, not a transition.
|
|
@@ -66,9 +66,11 @@ Based on the milestone, suggest (but don't automatically perform) a status trans
|
|
|
66
66
|
|
|
67
67
|
| Milestone | Suggested Status |
|
|
68
68
|
|-----------|-----------------|
|
|
69
|
-
| Plan created |
|
|
69
|
+
| Plan created | configured `jira.workflow.claimed` status |
|
|
70
70
|
| PR ready | configured `jira.workflow.review` status, or no transition when unconfigured |
|
|
71
|
-
| PR merged |
|
|
71
|
+
| PR merged | configured `jira.workflow.done` status for the PR's target environment (env-keyed `done` resolved via `deploy.branches`), or no transition when unconfigured |
|
|
72
|
+
|
|
73
|
+
Every suggested or performed transition is bound by the **Tracker status vocabulary** section of the `config-resolution` rule: only statuses named in the configured workflow map, never statuses discovered from the tracker's live workflow (transition lists, board columns, other tickets) — and this binds the lead performing tracker writes exactly as it binds a subagent. A milestone with no configured status gets a comment, not a transition.
|
|
72
74
|
|
|
73
75
|
### Step 5: Parent Status Rollup (`--rollup`)
|
|
74
76
|
|
|
@@ -127,7 +127,7 @@ Note: `done` may be a string or an env-keyed map (`{ dev, staging, production }`
|
|
|
127
127
|
## Rules
|
|
128
128
|
|
|
129
129
|
- Never auto-transition ticket status, with one explicit exception: when `jira-verify` returns `FAIL` for the pre-flight gate (Step 2), first run the `pre-flight-autofill` draft-then-block procedure (draft the authorable missing sections into the ticket as labeled assumptions), then transition to the configured `blocked` status, add the configured `human_needed` marker label (`jira.labels.human_needed`, default `Human Needed`), and reassign to the Reporter with a confirmation comment. Every other status change remains a suggestion the human confirms.
|
|
130
|
-
- Any transition is config-bound: never invent transitions; a transition may target only a status named in `config.jira.workflow`. Don't guess from the live workflow. The evidence-time review hop (Step 7) follows this rule too — it is config-bound, optional, and skipped when `jira.workflow.review` is absent (the ticket stays in `claimed`).
|
|
130
|
+
- Any transition is config-bound per the **Tracker status vocabulary** section of the `config-resolution` rule: never invent transitions; a transition may target only a status named in `config.jira.workflow`. Don't guess from the live workflow. The evidence-time review hop (Step 7) follows this rule too — it is config-bound, optional, and skipped when `jira.workflow.review` is absent (the ticket stays in `claimed`).
|
|
131
131
|
- Always read the full ticket graph via `jira-read-ticket` before determining intent — don't rely on ticket type alone
|
|
132
132
|
- Never create or materially edit a ticket by calling MCP write tools directly — always delegate to `jira-write-ticket` so relationships, Gherkin criteria, and metadata gates are enforced
|
|
133
133
|
- If sign-in credentials are in the ticket, extract and pass them to the flow. If the ticket touches an authenticated surface and credentials are missing, that is a Step 2 failure — block and reassign rather than guessing.
|
|
@@ -26,6 +26,16 @@ This applies before declaring connection state, before running any `acli jira *`
|
|
|
26
26
|
|
|
27
27
|
Project tracker (`jira` / `github` / `linear`) is read from `.lisa.config.json` `tracker`. Vendor-neutral skills MUST dispatch through the configured tracker, never infer it from arguments. Missing `tracker` → stop and instruct the user to run the matching `/lisa:setup:*` skill.
|
|
28
28
|
|
|
29
|
+
## Tracker status vocabulary
|
|
30
|
+
|
|
31
|
+
**A status transition may target only a status named in the project's configured workflow map** (`jira.workflow.*` for JIRA; the equivalent label/state map for GitHub and Linear). The configured map is the COMPLETE authorized vocabulary — not a starting point.
|
|
32
|
+
|
|
33
|
+
- **Never adopt statuses discovered from the tracker's live workflow metadata** — transition lists (`getTransitionsForJiraIssue` targets), board columns, status descriptions, or statuses seen on other tickets. A tracker workflow usually contains more statuses than the config names; those extra statuses are not lisa's to use. The live workflow is consulted only to find the transition *id* that reaches a config-named status.
|
|
34
|
+
- **A lifecycle stage with no configured status gets no transition.** If the flow reaches a stage the map does not name (e.g. "PR open awaiting review" when `jira.workflow.review` is unset, or a QA-ready stage with no `qa` mapping), leave the status where it is and record the stage in a comment. Do not pick the nearest-sounding tracker status.
|
|
35
|
+
- **This binds every actor that writes to the tracker** — the lead as much as any subagent. In runtimes where interactively-authenticated MCPs are lead-only, the lead performs the tracker writes for the whole flow; loading an implement/sync skill without the agent definition does not relax this rule.
|
|
36
|
+
|
|
37
|
+
This is the shared slug for the config-bound-transitions policy (the `leaf-only-lifecycle` precedent: one slug, never divergent per-surface prose). Skills and agent definitions cite it rather than restating it.
|
|
38
|
+
|
|
29
39
|
## Repo identity
|
|
30
40
|
|
|
31
41
|
`repo:<name>` is the canonical label for which repo a work item belongs to. Resolve current-repo identity in this priority order: `.lisa.config.local.json` `repo` → `.lisa.config.json` `repo` → `.lisa.config.json` `github.repo` → `basename -s .git "$(git remote get-url origin)"`. If none resolve, stop with a clear error.
|
|
@@ -314,3 +314,5 @@ Before shutting down the team, execute the Verify flow:
|
|
|
314
314
|
13. `ops-specialist`: post-deploy health check, monitor for errors in first minutes
|
|
315
315
|
14. If remote verification fails, create a task for the agent team to find out why it failed, fix it and return to step 5. **Bound this loop**: after a small number of full fix→deploy→reverify cycles without reaching a passing remote verdict (treat ~3 as the ceiling unless the work item states otherwise), stop retrying — file a build-ready fix ticket, write the verdict with `status: "blocked"` and the diagnosis, and move the work item to blocked rather than looping indefinitely. The completion gate releases on a `blocked` verdict, so the flow ends with a recorded outcome instead of a silent spin or a self-declared success.
|
|
316
316
|
15. After true terminal completion — required merge/deploy/verification passed, usage/evidence and two-way PR linkage are recorded, and the work item is terminal — run `node scripts/lisa-work-item.mjs clear` and verify the worktree has no current binding. Do not clear on an interruption or blocked outcome; preserving the binding is what keeps resumed work attributable.
|
|
317
|
+
|
|
318
|
+
**Ticket status transitions throughout this flow are config-bound** per the **Tracker status vocabulary** section of the `config-resolution` rule: whoever performs the tracker write — the lead included, in runtimes where the tracker MCP is lead-only — may only target statuses named in the configured workflow map (`claimed`, `blocked`, env-keyed `done`, and `review`/`qa` when configured). Never adopt a status discovered from the tracker's live workflow; a lifecycle stage with no configured status gets a comment, not a transition.
|
|
@@ -66,9 +66,11 @@ Based on the milestone, suggest (but don't automatically perform) a status trans
|
|
|
66
66
|
|
|
67
67
|
| Milestone | Suggested Status |
|
|
68
68
|
|-----------|-----------------|
|
|
69
|
-
| Plan created |
|
|
69
|
+
| Plan created | configured `jira.workflow.claimed` status |
|
|
70
70
|
| PR ready | configured `jira.workflow.review` status, or no transition when unconfigured |
|
|
71
|
-
| PR merged |
|
|
71
|
+
| PR merged | configured `jira.workflow.done` status for the PR's target environment (env-keyed `done` resolved via `deploy.branches`), or no transition when unconfigured |
|
|
72
|
+
|
|
73
|
+
Every suggested or performed transition is bound by the **Tracker status vocabulary** section of the `config-resolution` rule: only statuses named in the configured workflow map, never statuses discovered from the tracker's live workflow (transition lists, board columns, other tickets) — and this binds the lead performing tracker writes exactly as it binds a subagent. A milestone with no configured status gets a comment, not a transition.
|
|
72
74
|
|
|
73
75
|
### Step 5: Parent Status Rollup (`--rollup`)
|
|
74
76
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.289.
|
|
3
|
+
"version": "2.289.2",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.289.
|
|
3
|
+
"version": "2.289.2",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|