@codyswann/lisa 2.61.0 → 2.62.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/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/agents/confluence-prd-intake.md +1 -1
- package/plugins/lisa/agents/github-agent.md +4 -5
- package/plugins/lisa/agents/github-build-intake.md +1 -1
- package/plugins/lisa/agents/github-prd-intake.md +1 -1
- package/plugins/lisa/agents/linear-prd-intake.md +1 -1
- package/plugins/lisa/agents/notion-prd-intake.md +1 -1
- package/plugins/lisa/commands/intake.md +1 -1
- package/plugins/lisa/commands/project-ideation.md +3 -3
- package/plugins/lisa/commands/repair-intake.md +6 -0
- package/plugins/lisa/commands/research.md +3 -3
- package/plugins/lisa/commands/setup-automations.md +6 -0
- package/plugins/lisa/commands/tear-down-automations.md +6 -0
- package/plugins/lisa/commands/verify-prd.md +2 -2
- package/plugins/lisa/rules/config-resolution.md +63 -4
- package/plugins/lisa/rules/intent-routing.md +4 -3
- package/plugins/lisa/rules/leaf-only-lifecycle.md +1 -1
- package/plugins/lisa/rules/prd-lifecycle-rollup.md +10 -2
- package/plugins/lisa/rules/repo-scope-split.md +18 -1
- package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +24 -14
- package/plugins/lisa/skills/confluence-prd-intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/confluence-write-prd/SKILL.md +103 -0
- package/plugins/lisa/skills/confluence-write-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/github-build-intake/SKILL.md +32 -21
- package/plugins/lisa/skills/github-evidence/SKILL.md +3 -26
- package/plugins/lisa/skills/github-evidence/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/github-journey/SKILL.md +2 -2
- package/plugins/lisa/skills/github-prd-intake/SKILL.md +25 -11
- package/plugins/lisa/skills/github-prd-intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/github-sync/SKILL.md +5 -5
- package/plugins/lisa/skills/github-write-issue/SKILL.md +15 -6
- package/plugins/lisa/skills/github-write-prd/SKILL.md +100 -0
- package/plugins/lisa/skills/github-write-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/implement/SKILL.md +13 -6
- package/plugins/lisa/skills/intake/SKILL.md +13 -12
- package/plugins/lisa/skills/intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/jira-build-intake/SKILL.md +24 -11
- package/plugins/lisa/skills/jira-write-ticket/SKILL.md +8 -0
- package/plugins/lisa/skills/linear-build-intake/SKILL.md +22 -9
- package/plugins/lisa/skills/linear-prd-intake/SKILL.md +23 -13
- package/plugins/lisa/skills/linear-prd-intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/linear-write-issue/SKILL.md +10 -2
- package/plugins/lisa/skills/linear-write-prd/SKILL.md +90 -0
- package/plugins/lisa/skills/linear-write-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/notion-access/SKILL.md +2 -0
- package/plugins/lisa/skills/notion-prd-intake/SKILL.md +22 -12
- package/plugins/lisa/skills/notion-prd-intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/notion-write-prd/SKILL.md +107 -0
- package/plugins/lisa/skills/notion-write-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/prd-source-write/SKILL.md +80 -0
- package/plugins/lisa/skills/prd-source-write/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/project-ideation/SKILL.md +183 -80
- package/plugins/lisa/skills/repair-intake/SKILL.md +403 -0
- package/plugins/lisa/skills/repair-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/research/SKILL.md +19 -3
- package/plugins/lisa/skills/research/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/setup-automations/SKILL.md +78 -0
- package/plugins/lisa/skills/setup-automations/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/setup-github/SKILL.md +0 -1
- package/plugins/lisa/skills/tear-down-automations/SKILL.md +34 -0
- package/plugins/lisa/skills/tear-down-automations/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/tracker-build-intake/SKILL.md +6 -2
- package/plugins/lisa/skills/tracker-build-intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/tracker-evidence/SKILL.md +2 -2
- package/plugins/lisa/skills/tracker-sync/SKILL.md +1 -1
- package/plugins/lisa/skills/verify-prd/SKILL.md +41 -38
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/commands/exploratory-qa.md +3 -3
- package/plugins/lisa-expo/skills/exploratory-qa/SKILL.md +48 -18
- package/plugins/lisa-expo/skills/exploratory-qa/agents/openai.yaml +2 -2
- 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/commands/exploratory-qa.md +3 -3
- package/plugins/lisa-harper-fabric/skills/exploratory-qa/SKILL.md +48 -18
- package/plugins/lisa-harper-fabric/skills/exploratory-qa/agents/openai.yaml +2 -2
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-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-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/commands/exploratory-qa.md +3 -3
- package/plugins/lisa-rails/skills/exploratory-qa/SKILL.md +48 -18
- package/plugins/lisa-rails/skills/exploratory-qa/agents/openai.yaml +2 -2
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-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/skills/lisa-wiki-ingest/SKILL.md +30 -1
- package/plugins/src/base/agents/confluence-prd-intake.md +1 -1
- package/plugins/src/base/agents/github-agent.md +4 -5
- package/plugins/src/base/agents/github-build-intake.md +1 -1
- package/plugins/src/base/agents/github-prd-intake.md +1 -1
- package/plugins/src/base/agents/linear-prd-intake.md +1 -1
- package/plugins/src/base/agents/notion-prd-intake.md +1 -1
- package/plugins/src/base/commands/intake.md +1 -1
- package/plugins/src/base/commands/project-ideation.md +3 -3
- package/plugins/src/base/commands/repair-intake.md +6 -0
- package/plugins/src/base/commands/research.md +3 -3
- package/plugins/src/base/commands/setup-automations.md +6 -0
- package/plugins/src/base/commands/tear-down-automations.md +6 -0
- package/plugins/src/base/commands/verify-prd.md +2 -2
- package/plugins/src/base/rules/config-resolution.md +63 -4
- package/plugins/src/base/rules/intent-routing.md +4 -3
- package/plugins/src/base/rules/leaf-only-lifecycle.md +1 -1
- package/plugins/src/base/rules/prd-lifecycle-rollup.md +10 -2
- package/plugins/src/base/rules/repo-scope-split.md +18 -1
- package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +24 -14
- package/plugins/src/base/skills/confluence-write-prd/SKILL.md +103 -0
- package/plugins/src/base/skills/github-build-intake/SKILL.md +32 -21
- package/plugins/src/base/skills/github-evidence/SKILL.md +3 -26
- package/plugins/src/base/skills/github-journey/SKILL.md +2 -2
- package/plugins/src/base/skills/github-prd-intake/SKILL.md +25 -11
- package/plugins/src/base/skills/github-sync/SKILL.md +5 -5
- package/plugins/src/base/skills/github-write-issue/SKILL.md +15 -6
- package/plugins/src/base/skills/github-write-prd/SKILL.md +100 -0
- package/plugins/src/base/skills/implement/SKILL.md +13 -6
- package/plugins/src/base/skills/intake/SKILL.md +13 -12
- package/plugins/src/base/skills/jira-build-intake/SKILL.md +24 -11
- package/plugins/src/base/skills/jira-write-ticket/SKILL.md +8 -0
- package/plugins/src/base/skills/linear-build-intake/SKILL.md +22 -9
- package/plugins/src/base/skills/linear-prd-intake/SKILL.md +23 -13
- package/plugins/src/base/skills/linear-write-issue/SKILL.md +10 -2
- package/plugins/src/base/skills/linear-write-prd/SKILL.md +90 -0
- package/plugins/src/base/skills/notion-access/SKILL.md +2 -0
- package/plugins/src/base/skills/notion-prd-intake/SKILL.md +22 -12
- package/plugins/src/base/skills/notion-write-prd/SKILL.md +107 -0
- package/plugins/src/base/skills/prd-source-write/SKILL.md +80 -0
- package/plugins/src/base/skills/project-ideation/SKILL.md +183 -80
- package/plugins/src/base/skills/repair-intake/SKILL.md +403 -0
- package/plugins/src/base/skills/research/SKILL.md +19 -3
- package/plugins/src/base/skills/setup-automations/SKILL.md +78 -0
- package/plugins/src/base/skills/setup-github/SKILL.md +0 -1
- package/plugins/src/base/skills/tear-down-automations/SKILL.md +34 -0
- package/plugins/src/base/skills/tracker-build-intake/SKILL.md +6 -2
- package/plugins/src/base/skills/tracker-evidence/SKILL.md +2 -2
- package/plugins/src/base/skills/tracker-sync/SKILL.md +1 -1
- package/plugins/src/base/skills/verify-prd/SKILL.md +41 -38
- package/plugins/src/expo/commands/exploratory-qa.md +3 -3
- package/plugins/src/expo/skills/exploratory-qa/SKILL.md +48 -18
- package/plugins/src/harper-fabric/commands/exploratory-qa.md +3 -3
- package/plugins/src/harper-fabric/skills/exploratory-qa/SKILL.md +48 -18
- package/plugins/src/rails/commands/exploratory-qa.md +3 -3
- package/plugins/src/rails/skills/exploratory-qa/SKILL.md +48 -18
- package/plugins/src/wiki/skills/lisa-wiki-ingest/SKILL.md +30 -1
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: repair-intake
|
|
3
|
+
description: "Vendor-agnostic repair scanner — the recovery counterpart to lisa:intake. Where intake claims `ready` work, repair-intake finds work that got stuck: items left in `blocked`, or stalled in an in-progress role (build `claimed`, PRD `in_review`) after a processing cycle died and nobody picked it back up. Scans the same queues lisa:intake serves (Notion / Confluence / Linear / GitHub PRD databases; JIRA / GitHub / Linear build queues), enumerates stuck candidates, and repairs the first materially actionable one per cycle: resumes stalled in-progress work IN PLACE (build → the vendor agent + the scanner's post-agent transition; PRD → the source `*-to-tracker` dry-run validate→route pipeline), re-validates blocked PRDs when new clarifying answers exist, and re-dispatches blocked build items whose `is blocked by` dependencies have since closed. One actionable repair per invocation, idempotent, loop-protected via a [lisa-repair-intake] marker + state fingerprint + backoff. Never mutates product-owned states (`draft`, `shipped`, `verified`) and never closes PRDs. Designed as a /schedule cron target running alongside lisa:intake."
|
|
4
|
+
allowed-tools: ["Skill", "Bash", "Read", "Write", "Edit", "mcp__linear-server__list_teams", "mcp__linear-server__list_projects", "mcp__linear-server__get_project", "mcp__linear-server__save_project", "mcp__linear-server__list_project_labels", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue", "mcp__linear-server__list_comments", "mcp__linear-server__save_comment", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Repair Intake: $ARGUMENTS
|
|
8
|
+
|
|
9
|
+
Run one batch-**repair** cycle against the queue identified by `$ARGUMENTS`. Where `lisa:intake`
|
|
10
|
+
scans the `ready` role and moves work *forward*, repair-intake scans the **stuck** roles and
|
|
11
|
+
moves work *unstuck*:
|
|
12
|
+
|
|
13
|
+
- **Stalled in-progress** — an item left in an in-progress role (build `claimed`, PRD
|
|
14
|
+
`in_review`) whose processing cycle died. It is technically "being worked" but nothing is
|
|
15
|
+
happening, so it sits ignored forever. (The vendor PRD intakes explicitly leave an errored PRD
|
|
16
|
+
in `in_review` "for the human to investigate from there" — that orphan is exactly what this
|
|
17
|
+
skill recovers.)
|
|
18
|
+
- **Recoverable blocked** — an item in `blocked` whose blocker may now be gone: an
|
|
19
|
+
`is blocked by` dependency has since closed, clarifying questions have been answered, or
|
|
20
|
+
research/waiting resolves the ambiguity that stopped it.
|
|
21
|
+
|
|
22
|
+
This skill is the symmetric counterpart to `lisa:intake`. It reuses the same queue-detection,
|
|
23
|
+
the same agent-team orchestration, the same "don't ask, just run" confirmation policy, and the
|
|
24
|
+
same per-item surfaces the vendor intakes use (`lisa:<source>-to-tracker` dry-run for PRDs;
|
|
25
|
+
`lisa:<tracker>-agent` + the scanner's lifecycle transitions for build) — it differs only in
|
|
26
|
+
*which roles it scans* and *that it skips the claim step* (the item is already claimed/blocked).
|
|
27
|
+
|
|
28
|
+
## Public contract
|
|
29
|
+
|
|
30
|
+
```text
|
|
31
|
+
/lisa:repair-intake <queue> [intake_mode=prd|build|both] [stale_after=24h] [max_candidates=100] [force=true]
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
| Token | Meaning | Default |
|
|
35
|
+
|-------|---------|---------|
|
|
36
|
+
| `<queue>` | Same queue identifier `lisa:intake` accepts (see Source dispatch). Required. | — |
|
|
37
|
+
| `intake_mode` | `prd` \| `build` \| `both`. Only meaningful for a GitHub `org/repo` (or bare `github`) that hosts both PRD and build label namespaces. `both` is unique to repair — a repair sweep usefully covers both lifecycles in one schedule. Absent → prefer PRD when both namespaces exist, else whichever exists (matches `lisa:intake`). | (infer) |
|
|
38
|
+
| `stale_after` | How long with no observable activity before an in-progress item counts as stalled. Accepts `24h`, `90m`, `2d`, or `0` (treat any in-progress item as stalled — manual recovery, also the only way to resume work on a provider that exposes no reliable timestamp). Overrides config. | `24h` |
|
|
39
|
+
| `max_candidates` | Cap on how many stuck items to enumerate while looking for the first actionable one. Bounds scan cost. Overrides config. | `100` |
|
|
40
|
+
| `force` | `true` bypasses the loop-prevention backoff window (so a manual re-run re-attempts items even if their fingerprint is unchanged). It does **not** change the staleness rule — use `stale_after=0` for that. | `false` |
|
|
41
|
+
|
|
42
|
+
## Confirmation policy
|
|
43
|
+
|
|
44
|
+
Do NOT ask the caller whether to proceed. Once invoked with a queue, run the cycle to
|
|
45
|
+
completion. The caller (a human at the CLI or a scheduled cron) has already authorized the run
|
|
46
|
+
by invoking the skill; re-prompting defeats the purpose of a background repair sweep.
|
|
47
|
+
|
|
48
|
+
Specifically forbidden:
|
|
49
|
+
|
|
50
|
+
- Previewing projected scope (number of stuck items, projected re-dispatch count, write counts)
|
|
51
|
+
and asking whether to continue.
|
|
52
|
+
- Offering A/B/C-style choices like "repair / skip / report-only" — the documented behavior IS
|
|
53
|
+
the default.
|
|
54
|
+
- Pausing because many items are stuck, an item looks complex, or a repair is likely to land
|
|
55
|
+
the item back in `blocked`. Returning an item to `blocked` with a current, accurate note is a
|
|
56
|
+
valid outcome of the repair lifecycle, not a failure.
|
|
57
|
+
- Pausing because a re-dispatch looks expensive. The cost of one cycle is bounded (one
|
|
58
|
+
actionable repair); the cost of stalling a scheduled cron waiting on a human is unbounded.
|
|
59
|
+
|
|
60
|
+
The only legitimate reasons to stop early:
|
|
61
|
+
|
|
62
|
+
- Missing required input (no queue argument, missing project configuration). Surface the
|
|
63
|
+
missing value and exit.
|
|
64
|
+
- The queue itself is misconfigured (Status property missing expected values, JIRA workflow
|
|
65
|
+
can't reach required transitions). Surface and exit.
|
|
66
|
+
- No stuck items, or none actionable this cycle. Exit cleanly with the idle-case summary.
|
|
67
|
+
|
|
68
|
+
## Orchestration: agent team
|
|
69
|
+
|
|
70
|
+
If you are NOT already operating inside an agent team (no prior successful team-creation or
|
|
71
|
+
subagent-delegation tool call in this session, not spawned into a team context), the very first
|
|
72
|
+
thing you do is establish team orchestration.
|
|
73
|
+
|
|
74
|
+
Use the team tool for the current runtime:
|
|
75
|
+
|
|
76
|
+
- Claude: use `TeamCreate`. If `TeamCreate` has not been loaded yet, first use `ToolSearch` with
|
|
77
|
+
`query: "select:TeamCreate"` to load its schema.
|
|
78
|
+
- Codex: do not call `TeamCreate`; Codex does not expose that Claude tool. Use `tool_search`
|
|
79
|
+
with a query like `multi-agent tools` to load `multi_agent_v1`, then use
|
|
80
|
+
`multi_agent_v1.spawn_agent` for teammate delegation. Treat the first successful `spawn_agent`
|
|
81
|
+
call as establishing team orchestration.
|
|
82
|
+
- Other runtimes: use the current runtime's tool-discovery mechanism to discover and call the
|
|
83
|
+
appropriate multi-agent/team tool.
|
|
84
|
+
|
|
85
|
+
If no team creation or subagent delegation tool is available, explicitly state that team
|
|
86
|
+
orchestration is unavailable in this runtime, continue as the lead agent, and preserve the
|
|
87
|
+
workflow's review, verification, and task-tracking obligations locally.
|
|
88
|
+
|
|
89
|
+
Until the team is established, the first Codex teammate has been spawned, or the no-team
|
|
90
|
+
fallback has been declared, do NOT call any of: `Agent`, `TaskCreate`, `Skill`, MCP tools
|
|
91
|
+
(Atlassian / Linear / GitHub / Notion), `Read`, `Write`, `Edit`, `Bash`, `Grep`, `Glob`.
|
|
92
|
+
Scanning the queue, evaluating staleness, and dispatching per-item repairs — all of those are
|
|
93
|
+
tasks for the team you are about to create, not for the lead session before orchestration
|
|
94
|
+
exists.
|
|
95
|
+
|
|
96
|
+
If you ARE already inside an agent team (e.g., a teammate invoked this skill via the Skill
|
|
97
|
+
tool), do NOT create a second team — many harnesses reject double-creates. Continue within the
|
|
98
|
+
existing team. The cycle's outer team is created by repair-intake. Each per-item repair it runs
|
|
99
|
+
(`lisa:<source>-to-tracker` for a PRD, `lisa:<tracker>-agent` for a build item) executes within
|
|
100
|
+
the same team — those skills' orchestration preambles detect the existing team and skip creating
|
|
101
|
+
a second one. One team per cron cycle.
|
|
102
|
+
|
|
103
|
+
## Source dispatch
|
|
104
|
+
|
|
105
|
+
Detect the queue type from `$ARGUMENTS` using the **exact same detection and disambiguation
|
|
106
|
+
rules as `lisa:intake`** — read that skill's "Source dispatch" section for the authoritative
|
|
107
|
+
table; the detection is identical and only the per-item action changes (repair instead of
|
|
108
|
+
claim-and-advance). The essentials, inlined here so this skill is self-complete:
|
|
109
|
+
|
|
110
|
+
| If `$ARGUMENTS` is... | Queue / lifecycle | Source/tracker key | Stuck roles repaired |
|
|
111
|
+
|------------------------|-------------------|--------------------|----------------------|
|
|
112
|
+
| Notion **database** URL/ID | PRD (Notion) | source=notion | `in_review`, `blocked` |
|
|
113
|
+
| Confluence **space** URL/key | PRD (Confluence) | source=confluence | `in_review`, `blocked` (parent-page roles) |
|
|
114
|
+
| Confluence **parent page** URL/ID | PRD (Confluence, narrowed) | source=confluence | `in_review`, `blocked` |
|
|
115
|
+
| Linear **workspace** URL, **team** URL/key, or literal `linear` | PRD (Linear) | source=linear | `in_review`, `blocked` (project labels) |
|
|
116
|
+
| GitHub **repo** URL / `org/repo` (PRD namespace) | PRD (GitHub) | source=github | `in_review`, `blocked` (PRD labels) |
|
|
117
|
+
| GitHub **repo** URL / `org/repo` with `tracker = github` (build namespace) | Build (GitHub) | tracker=github | `claimed`, `blocked` (build labels) |
|
|
118
|
+
| Literal `github` | GitHub; route by `intake_mode` (`prd` / `build` / `both`) | per lifecycle | per lifecycle above |
|
|
119
|
+
| JIRA project key or full JQL | Build (JIRA) | tracker=jira | `claimed`, `blocked` (statuses) |
|
|
120
|
+
|
|
121
|
+
Disambiguation (same as `lisa:intake`): a `notion.so`/`notion.site` URL → Notion; an Atlassian
|
|
122
|
+
`/wiki/spaces/<KEY>` URL → Confluence (with `/pages/<id>` → parent-page narrowing); a
|
|
123
|
+
`linear.app` workspace/team URL or literal `linear` → Linear; a `github.com` URL / `<org>/<repo>`
|
|
124
|
+
token / literal `github` → GitHub; a bare token matching the JIRA project-key regex → JIRA
|
|
125
|
+
(else try Confluence space, then Linear team); a string with JQL operators → JQL. **A single-item
|
|
126
|
+
URL is out of scope** — this skill is batch-only; repair one item by hand via `lisa:implement`
|
|
127
|
+
(build) or by re-running `lisa:<source>-to-tracker` (PRD).
|
|
128
|
+
|
|
129
|
+
Role names for every vendor are resolved from `.lisa.config.json` per the `config-resolution`
|
|
130
|
+
rule — never hardcode status/label strings. The relevant stuck roles:
|
|
131
|
+
|
|
132
|
+
| Lifecycle | Vendor | In-progress role key | Blocked role key |
|
|
133
|
+
|-----------|--------|----------------------|------------------|
|
|
134
|
+
| Build | JIRA | `jira.workflow.claimed` (`In Progress`) | `jira.workflow.blocked` (`Blocked`) |
|
|
135
|
+
| Build | GitHub | `github.labels.build.claimed` (`status:in-progress`) | `github.labels.build.blocked` (`status:blocked`) |
|
|
136
|
+
| Build | Linear | `linear.labels.build.claimed` (`status:in-progress`) | `linear.labels.build.blocked` (`status:blocked`) |
|
|
137
|
+
| PRD | Notion | `notion.values.in_review` (`In Review`) | `notion.values.blocked` (`Blocked`) |
|
|
138
|
+
| PRD | GitHub | `github.labels.prd.in_review` (`prd-in-review`) | `github.labels.prd.blocked` (`prd-blocked`) |
|
|
139
|
+
| PRD | Linear | `linear.labels.prd.in_review` (`prd-in-review`) | `linear.labels.prd.blocked` (`prd-blocked`) |
|
|
140
|
+
| PRD | Confluence | `confluence.parents.in_review` (page id) | `confluence.parents.blocked` (page id) |
|
|
141
|
+
|
|
142
|
+
Resolve with the standard role-read pattern (local overrides global, default fallback):
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
read_role() {
|
|
146
|
+
local path="$1" default="$2"
|
|
147
|
+
local local_v global_v
|
|
148
|
+
local_v=$(jq -r "${path} // empty" .lisa.config.local.json 2>/dev/null)
|
|
149
|
+
global_v=$(jq -r "${path} // empty" .lisa.config.json 2>/dev/null)
|
|
150
|
+
echo "${local_v:-${global_v:-$default}}"
|
|
151
|
+
}
|
|
152
|
+
# e.g. build/github:
|
|
153
|
+
CLAIMED=$(read_role '.github.labels.build.claimed' 'status:in-progress')
|
|
154
|
+
BLOCKED=$(read_role '.github.labels.build.blocked' 'status:blocked')
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
## Access layer (which surface does each write)
|
|
158
|
+
|
|
159
|
+
repair-intake stays vendor-neutral; concrete reads/writes go through the same layers the vendor
|
|
160
|
+
intakes use. Never call Atlassian MCP or `acli` directly — go through `lisa:atlassian-access`.
|
|
161
|
+
|
|
162
|
+
| Vendor | Reads (scan / comments / links) | Writes (transition / comment) | Re-dispatch / re-validate |
|
|
163
|
+
|--------|---------------------------------|-------------------------------|---------------------------|
|
|
164
|
+
| JIRA (build) | `lisa:atlassian-access` `search-issues` / `lisa:jira-read-ticket` | `lisa:atlassian-access` `transition` / `comment` | `lisa:jira-agent` |
|
|
165
|
+
| GitHub (build) | `gh issue list` / `gh issue view --json` / `gh pr list` | `gh issue edit` (labels) / `gh issue comment` | `lisa:github-agent` |
|
|
166
|
+
| Linear (build) | Linear MCP `list_issues` / `get_issue` / `list_comments` | Linear MCP `save_issue` (labels) / `save_comment` | `lisa:linear-agent` |
|
|
167
|
+
| Notion (PRD) | `lisa:notion-access` (`query`, page comments) | `lisa:notion-access` `write-page` (status) / page comment | `lisa:notion-to-tracker` (dry-run) |
|
|
168
|
+
| GitHub (PRD) | `gh issue list/view` (PRD labels) | `gh issue edit` / `gh issue comment` | `lisa:github-to-tracker` (dry-run) |
|
|
169
|
+
| Linear (PRD) | Linear MCP `list_projects` / `get_project` (+ sentinel feedback issue) | Linear MCP `save_project` (labels) / `save_comment` | `lisa:linear-to-tracker` (dry-run) |
|
|
170
|
+
| Confluence (PRD) | `lisa:atlassian-access` CQL | `lisa:atlassian-access` page `parentId` update / comment | `lisa:confluence-to-tracker` (dry-run) |
|
|
171
|
+
|
|
172
|
+
## Staleness model
|
|
173
|
+
|
|
174
|
+
An in-progress item (build `claimed`, PRD `in_review`) is **stalled** only if it shows no
|
|
175
|
+
observable activity newer than the `stale_after` threshold. `blocked` items are NOT gated on
|
|
176
|
+
staleness — their repairability is judged on current blocker/answer state, not elapsed time.
|
|
177
|
+
|
|
178
|
+
### Threshold resolution
|
|
179
|
+
|
|
180
|
+
1. `$ARGUMENTS` `stale_after=<dur>` (one-off override) — always wins. Parse `Nh` / `Nm` / `Nd` /
|
|
181
|
+
`0` into hours.
|
|
182
|
+
2. `.lisa.config.json` `intake.repair.staleAfterHours` (durable project default).
|
|
183
|
+
3. Built-in default: **24 hours**.
|
|
184
|
+
|
|
185
|
+
`stale_after=0` means "treat any in-progress item as stalled" — a manual full-recovery lever,
|
|
186
|
+
and the only way to resume work on a provider that exposes no reliable activity timestamp.
|
|
187
|
+
|
|
188
|
+
### Activity signal (most-recent-wins, portable across vendors)
|
|
189
|
+
|
|
190
|
+
Compute the item's newest activity timestamp from the highest-priority signal the vendor
|
|
191
|
+
exposes, and compare it to `now - stale_after`:
|
|
192
|
+
|
|
193
|
+
1. Provider-native item `updatedAt` / `last_edited_time` / `updated`.
|
|
194
|
+
2. Latest lifecycle/progress **comment** on the item (and, for Linear PRDs, the sentinel
|
|
195
|
+
feedback issue).
|
|
196
|
+
3. For build items, latest **PR activity** on the linked PR: newest commit, review, check-run,
|
|
197
|
+
or PR comment.
|
|
198
|
+
4. Status/label **transition** time, when the provider exposes it cleanly.
|
|
199
|
+
|
|
200
|
+
If ANY of these is newer than the threshold, the item is **active** → record it as `active` and
|
|
201
|
+
skip it (read-only). For build `claimed`, an open PR with recent commits/checks is active. For
|
|
202
|
+
PRD `in_review`, a recent comment or page edit is active.
|
|
203
|
+
|
|
204
|
+
If a provider cannot expose any reliable timestamp, do **not** auto-resume its in-progress
|
|
205
|
+
items unless the caller passed `stale_after=0`. (Dependency-cleared `blocked` repair still
|
|
206
|
+
proceeds — it is judged on blocker state, not time.)
|
|
207
|
+
|
|
208
|
+
## Repair decision tree
|
|
209
|
+
|
|
210
|
+
Apply per candidate. Stop the cycle after the **first** candidate that triggers a write
|
|
211
|
+
(lifecycle transition, re-dispatch, or refreshed note). Everything examined before it is
|
|
212
|
+
recorded read-only.
|
|
213
|
+
|
|
214
|
+
### Build `claimed` (stalled in-progress) → resume in place
|
|
215
|
+
|
|
216
|
+
After the staleness gate passes, run the **same per-item sequence the vendor build-intake runs**,
|
|
217
|
+
skipping the claim transition (the item is already `claimed`):
|
|
218
|
+
|
|
219
|
+
1. Dispatch the item to the vendor agent — `lisa:jira-agent` / `lisa:github-agent` /
|
|
220
|
+
`lisa:linear-agent` (matching the queue's tracker) — with the item ref. This resumes the work
|
|
221
|
+
in place, preserving its existing branch/PR and prior comments.
|
|
222
|
+
2. **On agent success**, apply the scanner's post-agent transition yourself: `claimed → done`,
|
|
223
|
+
where `done` is **env-resolved** exactly as `lisa:<tracker>-build-intake` resolves it (per
|
|
224
|
+
`config-resolution` env-keyed `done`: explicit `target_env` arg wins; else reverse-lookup the
|
|
225
|
+
env from the resulting PR's base branch via `deploy.branches`; if `done` is a map and env is
|
|
226
|
+
unresolvable, fail loudly — never guess). repair-intake owns this transition because it is
|
|
227
|
+
standing in for the scanner that never got to finish it.
|
|
228
|
+
3. **On a surfaced blocker** (agent reports it cannot proceed), leave/move the item to `blocked`
|
|
229
|
+
with a `[lisa-repair-intake]` note (see Loop prevention).
|
|
230
|
+
|
|
231
|
+
> Do **not** reset stalled in-progress items to `ready`. Reset throws away state, makes a
|
|
232
|
+
> partially-built item look freshly human-approved to the next `lisa:intake` claim, and forces a
|
|
233
|
+
> two-cycle recovery. Resume in place.
|
|
234
|
+
|
|
235
|
+
### Build `blocked` → re-evaluate, unblock if cleared
|
|
236
|
+
|
|
237
|
+
1. Read the block reason and dependencies (see Dependency clearing).
|
|
238
|
+
2. If every parsed blocker is **cleared** → move `blocked → claimed`, then run the same
|
|
239
|
+
agent-dispatch + post-agent `claimed → done` sequence as the stalled-`claimed` path above
|
|
240
|
+
(one-cycle recovery). If the agent re-blocks, move back to `blocked` — a valid outcome.
|
|
241
|
+
3. If the block was an **ambiguity** research can settle and no dependency remains → run the
|
|
242
|
+
research needed (`lisa:codebase-research` / `lisa:product-walkthrough`); if resolved, proceed
|
|
243
|
+
as in (2).
|
|
244
|
+
4. Else → still blocked. Refresh the note with the current reason (Loop prevention) and leave it
|
|
245
|
+
`blocked`.
|
|
246
|
+
|
|
247
|
+
### PRD `in_review` (stalled in-progress) → re-run validate→route
|
|
248
|
+
|
|
249
|
+
After the staleness gate passes, run the **same dry-run validate→route pipeline the vendor PRD
|
|
250
|
+
intake runs per item**, targeted at this single PRD and **skipping the claim** (it is already
|
|
251
|
+
`in_review`):
|
|
252
|
+
|
|
253
|
+
1. Invoke `lisa:<source>-to-tracker` with `dry_run: true` and the PRD's URL (source = the queue's
|
|
254
|
+
PRD vendor: `notion-to-tracker` / `confluence-to-tracker` / `linear-to-tracker` /
|
|
255
|
+
`github-to-tracker`). This indirectly runs `lisa:tracker-source-artifacts`,
|
|
256
|
+
`lisa:product-walkthrough`, and the `lisa:tracker-validate` gate, returning a structured
|
|
257
|
+
PASS/FAIL report with `prd_anchor` snippets — the same report the PRD intake consumes.
|
|
258
|
+
2. **On PASS** → re-invoke `lisa:<source>-to-tracker` with `dry_run: false` to write the tickets
|
|
259
|
+
(its full run already writes the PRD back-link via `lisa:prd-backlink`), run the
|
|
260
|
+
`lisa:prd-ticket-coverage` audit as the PRD intake does, then transition the PRD to its
|
|
261
|
+
`ticketed` role via the access layer.
|
|
262
|
+
3. **On FAIL** → post the clarifying-question comments grouped by `prd_anchor` (page-level for
|
|
263
|
+
`prd_anchor: null`), tagged `[lisa-repair-intake]` (Loop prevention), and transition to
|
|
264
|
+
`blocked`.
|
|
265
|
+
|
|
266
|
+
### PRD `blocked` → re-validate if new answers exist
|
|
267
|
+
|
|
268
|
+
1. Determine whether **new clarifying answers** exist: any comment/update on the PRD newer than
|
|
269
|
+
the last `[lisa-repair-intake]` note or the original `blocked` note. For Linear include the
|
|
270
|
+
sentinel feedback issue and anchored sub-issue comments; for Confluence include inline/footer
|
|
271
|
+
comments where the access layer exposes them; for Notion include page comments and
|
|
272
|
+
`last_edited_time`.
|
|
273
|
+
2. If new answers exist → run the `lisa:<source>-to-tracker` dry-run validate→route pipeline as
|
|
274
|
+
in PRD `in_review` above (skipping claim). PASS → `ticketed`; FAIL → refresh note, stay
|
|
275
|
+
`blocked`.
|
|
276
|
+
3. If no new answers and no dependency change → leave `blocked` untouched (subject to the
|
|
277
|
+
backoff window — do not re-post an identical note).
|
|
278
|
+
|
|
279
|
+
## Dependency clearing (conservative, vendor-specific extraction)
|
|
280
|
+
|
|
281
|
+
`lisa:tracker-read` is a thin dispatcher that returns each vendor's bundle **verbatim** — there
|
|
282
|
+
is no normalized `is blocked by` field. Read the bundle, then extract blockers per vendor:
|
|
283
|
+
|
|
284
|
+
- **GitHub**: parse the durable forms `lisa:github-build-intake` documents — `Blocked by: #123`,
|
|
285
|
+
qualified cross-repo refs (`owner/repo#123`), issue URLs in the body/comments — plus timeline
|
|
286
|
+
cross-reference events.
|
|
287
|
+
- **JIRA**: inspect the native issue-link records `lisa:jira-read-ticket` returns and select the
|
|
288
|
+
`is blocked by` link type.
|
|
289
|
+
- **Linear**: inspect the native issue **relations** from Linear MCP `get_issue` and select
|
|
290
|
+
blocker relations.
|
|
291
|
+
|
|
292
|
+
Then classify each blocker:
|
|
293
|
+
|
|
294
|
+
- **Closed / Done** (its true terminal role) → **cleared**.
|
|
295
|
+
- **Open** in any non-terminal role (`ready` / `claimed` / `review` / unknown) → **still
|
|
296
|
+
blocking**.
|
|
297
|
+
- **Inaccessible** (deleted, cross-org, permission denied) → **still blocking**, unless the item
|
|
298
|
+
body or a newer human comment explicitly states the dependency is resolved.
|
|
299
|
+
|
|
300
|
+
Only re-dispatch when **every** parsed blocker is cleared. When in doubt, stay blocked — a
|
|
301
|
+
false-negative (left blocked) is cheap; a false-positive (re-dispatched into a real blocker)
|
|
302
|
+
wastes a build cycle.
|
|
303
|
+
|
|
304
|
+
## Loop prevention
|
|
305
|
+
|
|
306
|
+
A `blocked` item with a permanently unresolved problem must not be "repaired" and re-noted every
|
|
307
|
+
cron tick.
|
|
308
|
+
|
|
309
|
+
- Every note this skill writes is prefixed `[lisa-repair-intake]` and carries a compact **state
|
|
310
|
+
fingerprint**: the lifecycle role, the set of blocker refs + their observed states, the
|
|
311
|
+
validation verdict (PASS/FAIL), and a timestamp.
|
|
312
|
+
- Before writing a note or re-attempting a `blocked` item, compute the current fingerprint. If
|
|
313
|
+
an identical fingerprint was already posted within the **backoff window**, skip the item
|
|
314
|
+
silently (record as `still_blocked` / `active`, no write).
|
|
315
|
+
- Backoff window default = `stale_after` (24h). `force=true` bypasses backoff for a manual run.
|
|
316
|
+
- A *changed* fingerprint (new blocker state, new answers, new verdict) always warrants a fresh
|
|
317
|
+
note + re-attempt — backoff suppresses only no-op repeats.
|
|
318
|
+
|
|
319
|
+
## Lifecycle ownership guard
|
|
320
|
+
|
|
321
|
+
repair-intake owns ONLY the four stuck roles: build `claimed` / `blocked` and PRD `in_review` /
|
|
322
|
+
`blocked`, plus the transitions a stuck item legitimately moves through during recovery. It MAY:
|
|
323
|
+
|
|
324
|
+
- Apply the build scanner's post-agent `claimed → done` on a successful resume (it is finishing
|
|
325
|
+
the scanner's interrupted job), and move a dependency-cleared build item `blocked → claimed`.
|
|
326
|
+
- Move a re-validated PRD `in_review`/`blocked → ticketed` (PASS) or `→ blocked` (FAIL), exactly
|
|
327
|
+
as the PRD intake does.
|
|
328
|
+
|
|
329
|
+
It MUST NOT:
|
|
330
|
+
|
|
331
|
+
- Move a PRD out of `draft`, `shipped`, or `verified`, or close/archive any PRD (those are
|
|
332
|
+
product- and rollup-owned — see `prd-lifecycle-rollup`).
|
|
333
|
+
- Apply a build `done` value other than via the env-resolution rules, or close a native item at
|
|
334
|
+
any value other than the true terminal `done` (see `leaf-only-lifecycle`).
|
|
335
|
+
- Touch `ready` items (that is `lisa:intake`'s lane).
|
|
336
|
+
|
|
337
|
+
## Cycle behavior
|
|
338
|
+
|
|
339
|
+
1. **Resolve the queue** — detect vendor/lifecycle (Source dispatch); resolve stuck role names
|
|
340
|
+
from config. For JIRA, confirm the needed transitions are reachable; stop on misconfig.
|
|
341
|
+
2. **Enumerate stuck candidates** — query the in-progress role(s) and the `blocked` role for the
|
|
342
|
+
detected lifecycle(s), up to `max_candidates`, via the Access layer reads.
|
|
343
|
+
3. **Order deterministically**, highest repair-confidence first:
|
|
344
|
+
1. `blocked` items whose dependencies are now **cleared** (safe, high-value, one-cycle wins),
|
|
345
|
+
2. `blocked` items with **new clarifying answers**,
|
|
346
|
+
3. **stalled** in-progress items, oldest activity first.
|
|
347
|
+
4. **Walk the ordered list**, evaluating each read-only (staleness, dependency, answer checks),
|
|
348
|
+
and **repair the first candidate that is actionable** per the decision tree. Stop after that
|
|
349
|
+
one write-producing repair.
|
|
350
|
+
5. **Empty / nothing actionable** → exit cleanly:
|
|
351
|
+
`"No stuck items actionable this cycle (examined N, all active or in backoff)."`
|
|
352
|
+
6. **Failure isolation** — if evaluating one candidate errors, record it under Errors and
|
|
353
|
+
continue to the next; one bad item never aborts the cycle.
|
|
354
|
+
|
|
355
|
+
Process **at most one materially actionable repair per invocation** — scan many, repair one,
|
|
356
|
+
exit. This matches `lisa:intake`'s one-item-per-cycle contract: bounded cost, low race risk, no
|
|
357
|
+
surprise burst of PRs. Throughput is the scheduler's job, not one invocation's.
|
|
358
|
+
|
|
359
|
+
## Summary report
|
|
360
|
+
|
|
361
|
+
Report outcomes in these buckets:
|
|
362
|
+
|
|
363
|
+
- `resumed` — stalled in-progress work re-dispatched in place.
|
|
364
|
+
- `unblocked` — blocker cleared (or answers resolved); re-dispatched or transitioned to
|
|
365
|
+
`ticketed`.
|
|
366
|
+
- `still_blocked` — examined and intentionally left `blocked`, with the active reason.
|
|
367
|
+
- `active` — skipped because current work is not stale (or within backoff).
|
|
368
|
+
- `errors` — items that failed evaluation, with the error.
|
|
369
|
+
|
|
370
|
+
State the single item repaired this cycle (if any) and what action was taken.
|
|
371
|
+
|
|
372
|
+
## Schedule examples
|
|
373
|
+
|
|
374
|
+
```text
|
|
375
|
+
/schedule "every 2 hours" /lisa:repair-intake https://www.notion.so/<workspace>/<database-id>
|
|
376
|
+
/schedule "every 2 hours" /lisa:repair-intake https://linear.app/acme
|
|
377
|
+
/schedule "every 2 hours" /lisa:repair-intake acme/product-prds
|
|
378
|
+
/schedule "every 2 hours" /lisa:repair-intake acme/frontend-v2 intake_mode=build
|
|
379
|
+
/schedule "every 2 hours" /lisa:repair-intake github intake_mode=both
|
|
380
|
+
/schedule "every 4 hours" /lisa:repair-intake SE stale_after=12h
|
|
381
|
+
/lisa:repair-intake SE stale_after=0 force=true # manual: treat all in-progress as stalled, ignore backoff
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
Run repair-intake **less frequently than** `lisa:intake` (the ready queue moves faster than
|
|
385
|
+
stuck work accumulates), or interleaved on a longer cadence.
|
|
386
|
+
|
|
387
|
+
## Rules
|
|
388
|
+
|
|
389
|
+
- Never run a cycle without an explicit queue. Side effects too high to default.
|
|
390
|
+
- Never reset stalled in-progress items to `ready` — resume in place (decision tree).
|
|
391
|
+
- Never mutate product-owned states (`draft`, `shipped`, `verified`) or close PRDs (Lifecycle
|
|
392
|
+
ownership guard).
|
|
393
|
+
- Apply build `done` ONLY via the env-resolution rules, and trigger native closure only at the
|
|
394
|
+
true terminal `done` value (`leaf-only-lifecycle`).
|
|
395
|
+
- Never re-dispatch a `blocked` build item unless every parsed blocker is cleared (conservative
|
|
396
|
+
dependency clearing).
|
|
397
|
+
- One materially actionable repair per cycle. Stop after the first write-producing repair.
|
|
398
|
+
- Honor the backoff window — never re-post an identical `[lisa-repair-intake]` note within it
|
|
399
|
+
(unless `force=true`).
|
|
400
|
+
- Never run two repair cycles concurrently against overlapping queues, and never run
|
|
401
|
+
repair-intake against a queue `lisa:intake` is concurrently draining — the scheduling layer is
|
|
402
|
+
responsible for serialization.
|
|
403
|
+
- Stop and surface failures rather than retry-loop.
|
|
@@ -1,12 +1,21 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: research
|
|
3
|
-
description: "Research a problem space and
|
|
3
|
+
description: "Research a problem space and create a PRD in the configured PRD source. Investigates the codebase, defines user flows, assesses technical feasibility, synthesizes the spec, then creates it in the source (Notion / Confluence / GitHub / Linear per .lisa.config.json `source`) via lisa:prd-source-write — there is no loose document artifact. Vendor-agnostic. Accepts an optional `prd_ready` flag (default false → the PRD is created in the `draft` role; true → created `ready` so lisa:intake auto-claims it) and an optional dedupe `marker`/`dedupe_key` (used when invoked by lisa:project-ideation) so re-runs reference the existing PRD instead of duplicating it."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "Read", "Glob", "Grep"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Research
|
|
8
8
|
|
|
9
|
-
Produce a PRD for the problem in `$ARGUMENTS
|
|
9
|
+
Produce a PRD for the problem in `$ARGUMENTS`, then create it in the configured PRD source.
|
|
10
|
+
|
|
11
|
+
## Inputs
|
|
12
|
+
|
|
13
|
+
- The problem statement / feature idea (required) — free text, a feasibility card, or a URL.
|
|
14
|
+
- `prd_ready` (optional, default `false`) — `false` creates the PRD in the source's `draft` role for
|
|
15
|
+
human review; `true` creates it in the `ready` role so `lisa:intake` (PRD side) auto-claims it.
|
|
16
|
+
- `dedupe_key` / `marker` (optional) — a stable dedupe marker (e.g. supplied by
|
|
17
|
+
`lisa:project-ideation`) embedded in the created PRD so re-runs reference the existing PRD rather
|
|
18
|
+
than creating a duplicate.
|
|
10
19
|
|
|
11
20
|
## Orchestration: agent team
|
|
12
21
|
|
|
@@ -30,4 +39,11 @@ Execute the **Research** flow as defined in the `intent-routing` rule (loaded vi
|
|
|
30
39
|
|
|
31
40
|
## Output
|
|
32
41
|
|
|
33
|
-
A PRD
|
|
42
|
+
A PRD **created in the configured PRD source** (per the intent-routing rule's Research flow
|
|
43
|
+
definition) containing: context, problem statement, user flows, acceptance criteria, technical
|
|
44
|
+
feasibility notes, open questions, and the "Recommended Tooling for Plan Phase" section. The final
|
|
45
|
+
flow step invokes `lisa:prd-source-write`, which creates the PRD in the configured `source` (Notion
|
|
46
|
+
page in the PRD database, Confluence page under the lifecycle parent, GitHub issue, or Linear
|
|
47
|
+
project) in the `draft` role by default or `ready` when `prd_ready=true`. **The PRD lives in the
|
|
48
|
+
source — there is no loose document artifact.** A `source` must be configured; if it is not, stop and
|
|
49
|
+
report it rather than emitting a document. The Plan flow consumes the created PRD next.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
display_name: "Research"
|
|
2
|
-
short_description: "Research a problem space and
|
|
2
|
+
short_description: "Research a problem space and create a PRD in the configured PRD source"
|
|
3
3
|
default_prompt:
|
|
4
|
-
- "Use $research: Research a problem space and
|
|
4
|
+
- "Use $research: Research a problem space and create a PRD in the configured PRD source."
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: setup-automations
|
|
3
|
+
description: "Set up the recurring Lisa automations on the local workstation using the CURRENT runtime's native scheduler — Codex automations (the native automations / automation_update mechanism) or, on Claude, /schedule. This skill is a declarative specification: it states WHICH automations to create, how often, and with which parameters; it does not template schedule files or run scheduling code itself — the runtime's native automation mechanism does the creating. Creates five automations: intake-repair (every 60 min), intake PRD (every 60 min), intake tickets (every 10 min), exploratory-bugs (once a day), exploratory-prds (once a day). Two flags — auto-start-prds and auto-start-tickets — control whether the ideated PRDs / filed bug tickets are created auto-pickup-ready (prd_ready / ready) or left for human review (default false). Tear down with /tear-down-automations."
|
|
4
|
+
allowed-tools: ["Skill", "Bash", "Read"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Set up Lisa automations: $ARGUMENTS
|
|
8
|
+
|
|
9
|
+
This skill is a **specification, not a script.** It tells the current runtime which recurring Lisa
|
|
10
|
+
automations to create, on what cadence, and with which parameters — and the runtime creates them
|
|
11
|
+
with its **native** scheduling mechanism. Do **not** hand-template schedule files or write shell to
|
|
12
|
+
create them; invoke the runtime's automation tool with the spec below.
|
|
13
|
+
|
|
14
|
+
## Runtime scheduler (branch on the current runtime)
|
|
15
|
+
|
|
16
|
+
- **Codex** → create Codex **automations** via the native automations mechanism (prefer the
|
|
17
|
+
`automation_update` tool over hand-writing `~/.codex/automations/<id>/automation.toml`; the TOML is
|
|
18
|
+
only its backing store). Set the execution environment to **local** so they run on this
|
|
19
|
+
workstation, scoped to this project's working directory.
|
|
20
|
+
- **Claude** → use **`/schedule`** to create local recurring routines, one per automation below.
|
|
21
|
+
- **Other runtimes** → use the runtime's native recurring-task mechanism. If the runtime has none,
|
|
22
|
+
state that scheduling is unavailable and stop.
|
|
23
|
+
|
|
24
|
+
## Parameters
|
|
25
|
+
|
|
26
|
+
- `auto-start-prds` (default **false**) — passed as `prd_ready` to the **exploratory-prds**
|
|
27
|
+
automation. `true` → ideated PRDs are created `prd-ready` (auto-picked-up by PRD intake); `false` →
|
|
28
|
+
created as drafts for human review.
|
|
29
|
+
- `auto-start-tickets` (default **false**) — passed as `ready` to the **exploratory-bugs**
|
|
30
|
+
automation. `true` → filed bug/usability tickets are created build-ready (auto-picked-up by ticket
|
|
31
|
+
intake); `false` → created in the backlog for human triage.
|
|
32
|
+
|
|
33
|
+
Defaults match the underlying skills — nothing auto-starts unless explicitly opted in. The two flags
|
|
34
|
+
affect **only** the two exploratory automations.
|
|
35
|
+
|
|
36
|
+
## The automations to create
|
|
37
|
+
|
|
38
|
+
Each automation runs **one cycle** of a Lisa command and respects that command's confirmation policy
|
|
39
|
+
(never ask before running; exit cleanly when the queue is idle; report the cycle summary).
|
|
40
|
+
|
|
41
|
+
| Automation | Command it runs | Cadence |
|
|
42
|
+
|---|---|---|
|
|
43
|
+
| **intake-repair** | `/lisa:repair-intake <queue>` | every **60 minutes** |
|
|
44
|
+
| **intake-prd** | `/lisa:intake <PRD queue>` (e.g. `github intake_mode=prd`) | every **60 minutes** |
|
|
45
|
+
| **intake-tickets** | `/lisa:intake <build queue>` (e.g. `github intake_mode=build`) | every **10 minutes** |
|
|
46
|
+
| **exploratory-bugs** | `/lisa-<stack>:exploratory-qa ready=<auto-start-tickets>` | **once a day** |
|
|
47
|
+
| **exploratory-prds** | `/lisa:project-ideation prd_ready=<auto-start-prds>` | **once a day** |
|
|
48
|
+
|
|
49
|
+
For a Codex `rrule`: every 60 min → `FREQ=HOURLY;INTERVAL=1`; every 10 min →
|
|
50
|
+
`FREQ=MINUTELY;INTERVAL=10`; once a day → `FREQ=DAILY;INTERVAL=1`.
|
|
51
|
+
|
|
52
|
+
**Queue resolution.** Resolve the intake/repair queue from `.lisa.config.json` — `source` for the
|
|
53
|
+
PRD queue, `tracker` for the build queue (for the common GitHub case these are `github
|
|
54
|
+
intake_mode=prd` and `github intake_mode=build`, matching how the existing Lisa intake automations
|
|
55
|
+
are written).
|
|
56
|
+
|
|
57
|
+
**Naming + scope (so teardown is precise).** Name each automation with the stable prefix
|
|
58
|
+
`lisa-auto-<project>-` (e.g. `lisa-auto-<project>-intake-tickets`), where `<project>` identifies this
|
|
59
|
+
repo, and scope each to this project's working directory. This lets `/tear-down-automations` find and
|
|
60
|
+
remove exactly this set and never touch other projects' automations or non-Lisa ones. Use a project
|
|
61
|
+
identifier stable across runs and distinct from other repos (don't rely on a bare repo basename when
|
|
62
|
+
it could collide; qualify it, e.g. with the owner).
|
|
63
|
+
|
|
64
|
+
**Idempotent.** Re-running this skill updates the existing `lisa-auto-<project>-*` automations in
|
|
65
|
+
place (same names) rather than creating duplicates.
|
|
66
|
+
|
|
67
|
+
## Conditions / guards
|
|
68
|
+
|
|
69
|
+
- **exploratory-bugs** is created only when the project ships an `exploratory-qa` command (the
|
|
70
|
+
`expo` / `rails` / `harper-fabric` stacks). If the project has no `exploratory-qa`, skip that
|
|
71
|
+
automation and note it — do not invent a command that doesn't exist.
|
|
72
|
+
- If the runtime has no native scheduler, or the intake queues can't be resolved from config, stop
|
|
73
|
+
and report what's missing rather than guessing.
|
|
74
|
+
|
|
75
|
+
## Report
|
|
76
|
+
|
|
77
|
+
List each automation created or updated (name, the command it runs, cadence, and the resolved
|
|
78
|
+
`auto-start-prds` / `auto-start-tickets` values), plus any automation skipped and why.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
display_name: "Setup Automations"
|
|
2
|
+
short_description: "Set up the recurring Lisa automations on the local workstation using the CURRENT runtime's native scheduler — Codex automations (the native…"
|
|
3
|
+
default_prompt:
|
|
4
|
+
- "Use $setup-automations: Set up the recurring Lisa automations on the local workstation using the CURRENT runtime's native scheduler — Codex automations (the native…."
|
|
@@ -110,7 +110,6 @@ Defaults from `config-resolution`. The `done` role is **env-keyed** — create a
|
|
|
110
110
|
```bash
|
|
111
111
|
ensure_label "$(read_role build ready status:ready)" FBCA04 "Ready for build (human signal)"
|
|
112
112
|
ensure_label "$(read_role build claimed status:in-progress)" 0E8A16 "Build in progress (agent owns)"
|
|
113
|
-
ensure_label "$(read_role build review status:code-review)" 5319E7 "PR open, awaiting review"
|
|
114
113
|
ensure_label "$(read_role build blocked status:blocked)" D93F0B "Blocked — human attention required"
|
|
115
114
|
ensure_label "$(read_role build done.dev status:on-dev)" 1D76DB "Deployed to dev"
|
|
116
115
|
ensure_label "$(read_role build done.staging status:on-stg)" 1D76DB "Deployed to staging"
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tear-down-automations
|
|
3
|
+
description: "Remove every recurring Lisa automation that /setup-automations created for this project (the lisa-auto-<project>-* set: intake-repair, intake-prd, intake-tickets, exploratory-bugs, exploratory-prds) using the CURRENT runtime's native scheduler — Codex automations or, on Claude, /schedule. This skill is a declarative specification: it identifies WHICH automations to remove; it does not run teardown scripts. Removes only this project's Lisa automations — never other projects' automations or non-Lisa ones. The inverse of /setup-automations."
|
|
4
|
+
allowed-tools: ["Skill", "Bash", "Read"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Tear down Lisa automations: $ARGUMENTS
|
|
8
|
+
|
|
9
|
+
This skill is a **specification, not a script.** It tells the current runtime which recurring Lisa
|
|
10
|
+
automations to remove — the ones `/setup-automations` created for THIS project — and the runtime
|
|
11
|
+
removes them with its **native** scheduling mechanism.
|
|
12
|
+
|
|
13
|
+
## Runtime scheduler (branch on the current runtime)
|
|
14
|
+
|
|
15
|
+
- **Codex** → list Codex automations and delete the `lisa-auto-<project>-*` set via the native
|
|
16
|
+
automations mechanism (prefer the native delete over hand-removing
|
|
17
|
+
`~/.codex/automations/<id>/`, which is only the backing store).
|
|
18
|
+
- **Claude** → use **`/schedule`** to list and remove the matching recurring routines.
|
|
19
|
+
- **Other runtimes** → use the runtime's native recurring-task mechanism. If it has none, state that
|
|
20
|
+
and stop.
|
|
21
|
+
|
|
22
|
+
## Scope (remove only what setup created)
|
|
23
|
+
|
|
24
|
+
- Remove the five automations `/setup-automations` creates for the current project, matched by the
|
|
25
|
+
stable `lisa-auto-<project>-` name prefix: `intake-repair`, `intake-prd`, `intake-tickets`,
|
|
26
|
+
`exploratory-bugs`, `exploratory-prds`.
|
|
27
|
+
- **Never** remove automations for a different project, or any non-Lisa automation (e.g. unrelated
|
|
28
|
+
crawlers/ingestors). Match strictly on the `lisa-auto-<project>-` prefix for THIS project; when in
|
|
29
|
+
doubt about an automation's ownership, leave it and report it rather than deleting it.
|
|
30
|
+
- **Idempotent** — an automation that is already absent is a no-op, not an error.
|
|
31
|
+
|
|
32
|
+
## Report
|
|
33
|
+
|
|
34
|
+
List each automation removed, and any in the expected set that were already absent.
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
display_name: "Tear Down Automations"
|
|
2
|
+
short_description: "Remove every recurring Lisa automation that /setup-automations created for this project (the lisa-auto-<project>-* set: intake-repair…"
|
|
3
|
+
default_prompt:
|
|
4
|
+
- "Use $tear-down-automations: Remove every recurring Lisa automation that /setup-automations created for this project (the lisa-auto-<project>-* set: intake-repair…."
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tracker-build-intake
|
|
3
|
-
description: "Vendor-neutral wrapper for the build-queue
|
|
3
|
+
description: "Vendor-neutral wrapper for the build-queue scanner. Reads `tracker` from .lisa.config.json (default: jira) and dispatches to lisa:jira-build-intake (JQL/project-key queue), lisa:github-build-intake (GitHub repo queue keyed off the `status:ready` label), or lisa:linear-build-intake (Linear team queue keyed off the `status:ready` label). Every vendor scanner processes at most one eligible item per cycle and enforces the claim-time arm of the `leaf-only-lifecycle` rule — dispatch leaf work units only; move or safe-block a container with open child work (or a childless Epic/Story/Spike) that carries a stale build-ready role according to the vendor's lifecycle semantics. Counterpart to lisa:intake's PRD-side dispatchers."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "Read"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -39,6 +39,10 @@ This is the claim-time arm of the rule. Its siblings are the write-time labeling
|
|
|
39
39
|
|
|
40
40
|
The shim never needs to inspect the item itself — it forwards `$ARGUMENTS` verbatim and the resolved vendor scanner runs its Phase 3a gate before any claim.
|
|
41
41
|
|
|
42
|
+
## Repo-scope claim contract (forwarded to every vendor)
|
|
43
|
+
|
|
44
|
+
Equally part of the build-intake API, and forwarded identically: when the tracker oversees multiple repos, each vendor scanner claims only tickets for the repo it is running in. Per the `repo-scope-split` rule's "Claim-time repo scoping" section, before the leaf-only gate each scanner (Phase 3a.0) resolves the current repo (`config-resolution` "Repo scoping": `repo` → `github.repo` → git remote basename), then for each ready candidate: skips a ticket labeled `repo:<other>`, determines + stamps `repo:<name>` on an unlabeled one, splits a multi-repo leaf into single-repo build-ready siblings, and claims only a single-repo leaf for the current repo. This shim does not re-implement the gate — it relies on the vendor scanner's Phase 3a.0 — but the contract is uniform across `jira`, `github`, and `linear` so behavior never drifts by tracker. It is the claim-time complement to the write-time S10 scope gate (`lisa:tracker-validate`) and `task-decomposition` step 1.5; all cite `repo-scope-split`.
|
|
45
|
+
|
|
42
46
|
## Terminal native-closure contract (forwarded to every vendor)
|
|
43
47
|
|
|
44
48
|
This shim also forwards the `leaf-only-lifecycle` terminal native-closure contract. It does not decide whether a `done` value is terminal; the vendor scanner resolves that from its own config and deployment topology after the per-item agent succeeds.
|
|
@@ -53,7 +57,7 @@ Intermediate env states are not native closure. A vendor scanner that resolves `
|
|
|
53
57
|
|
|
54
58
|
## Rules
|
|
55
59
|
|
|
56
|
-
- Single cycle per invocation — the vendor skill processes
|
|
60
|
+
- Single cycle per invocation — the vendor skill processes at most one eligible `Ready` item and exits. Scheduler repetition works the rest of the queue.
|
|
57
61
|
- The vendor skills run their own pre-flight checks (JIRA workflow transitions for the JIRA path; label namespace adoption for the GitHub and Linear paths) before processing items. Never bypass.
|
|
58
62
|
- **Leaf-only dispatch, every vendor.** Per the `leaf-only-lifecycle` rule, each vendor scanner dispatches leaf work units only and moves or safe-blocks a container (open child work, or a childless Epic/Story/Spike) carrying a stale build-ready role according to its lifecycle semantics. This shim does not re-implement the gate — it relies on the vendor scanner's Phase 3a — but the contract is uniform across `jira`, `github`, and `linear` so behavior never drifts by tracker.
|
|
59
63
|
- **Terminal native closure, every capable vendor.** Per the same rule, each vendor scanner finalizes native open/closed state only at the true terminal `done` value. This shim never performs native closure itself, but callers can rely on the dispatched vendor scanner to apply the contract.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
display_name: "Tracker Build Intake"
|
|
2
|
-
short_description: "Vendor-neutral wrapper for the build-queue
|
|
2
|
+
short_description: "Vendor-neutral wrapper for the build-queue scanner"
|
|
3
3
|
default_prompt:
|
|
4
|
-
- "Use $tracker-build-intake: Vendor-neutral wrapper for the build-queue
|
|
4
|
+
- "Use $tracker-build-intake: Vendor-neutral wrapper for the build-queue scanner."
|