@codyswann/lisa 2.127.0 → 2.128.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 +5 -1
- package/plugins/lisa/.codex-plugin/hooks.json +4 -0
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/commands/parity-code-review.md +6 -0
- package/plugins/lisa/commands/parity-code-simplifier.md +6 -0
- package/plugins/lisa/commands/parity-coderabbit.md +6 -0
- package/plugins/lisa/commands/parity-safety-net-rules.md +6 -0
- package/plugins/lisa/commands/parity-sentry-sdk-setup.md +6 -0
- package/plugins/lisa/commands/parity-sentry-seer.md +6 -0
- package/plugins/lisa/commands/parity-skill-creator.md +6 -0
- package/plugins/lisa/hooks/parity-safety-net.sh +102 -0
- package/plugins/lisa/rules/eager/base-rules.md +1 -1
- package/plugins/lisa/rules/eager/leaf-only-lifecycle.md +4 -4
- package/plugins/lisa/rules/eager/repo-scope-split.md +1 -1
- package/plugins/lisa/rules/reference/config-resolution.md +1 -1
- package/plugins/lisa/rules/reference/leaf-only-lifecycle.md +9 -9
- package/plugins/lisa/rules/reference/repo-scope-split.md +2 -2
- package/plugins/lisa/skills/github-build-intake/SKILL.md +7 -7
- package/plugins/lisa/skills/github-validate-issue/SKILL.md +10 -11
- package/plugins/lisa/skills/intake-explain/SKILL.md +3 -3
- package/plugins/lisa/skills/jira-build-intake/SKILL.md +7 -7
- package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +10 -11
- package/plugins/lisa/skills/linear-build-intake/SKILL.md +7 -7
- package/plugins/lisa/skills/linear-validate-issue/SKILL.md +10 -11
- package/plugins/lisa/skills/parity-code-review/SKILL.md +83 -0
- package/plugins/lisa/skills/parity-code-review/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/parity-code-simplifier/SKILL.md +76 -0
- package/plugins/lisa/skills/parity-code-simplifier/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/parity-coderabbit/SKILL.md +77 -0
- package/plugins/lisa/skills/parity-coderabbit/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/parity-safety-net-rules/SKILL.md +144 -0
- package/plugins/lisa/skills/parity-safety-net-rules/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/parity-sentry-sdk-setup/SKILL.md +211 -0
- package/plugins/lisa/skills/parity-sentry-sdk-setup/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/parity-sentry-seer/SKILL.md +135 -0
- package/plugins/lisa/skills/parity-sentry-seer/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/parity-skill-creator/SKILL.md +149 -0
- package/plugins/lisa/skills/parity-skill-creator/agents/openai.yaml +4 -0
- package/plugins/lisa/skills/repair-intake/SKILL.md +2 -2
- package/plugins/lisa/skills/tracker-build-intake/SKILL.md +4 -4
- package/plugins/lisa-agy/commands/parity-code-review.md +6 -0
- package/plugins/lisa-agy/commands/parity-code-simplifier.md +6 -0
- package/plugins/lisa-agy/commands/parity-coderabbit.md +6 -0
- package/plugins/lisa-agy/commands/parity-safety-net-rules.md +6 -0
- package/plugins/lisa-agy/commands/parity-sentry-sdk-setup.md +6 -0
- package/plugins/lisa-agy/commands/parity-sentry-seer.md +6 -0
- package/plugins/lisa-agy/commands/parity-skill-creator.md +6 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/github-build-intake/SKILL.md +7 -7
- package/plugins/lisa-agy/skills/github-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-agy/skills/intake-explain/SKILL.md +3 -3
- package/plugins/lisa-agy/skills/jira-build-intake/SKILL.md +7 -7
- package/plugins/lisa-agy/skills/jira-validate-ticket/SKILL.md +10 -11
- package/plugins/lisa-agy/skills/linear-build-intake/SKILL.md +7 -7
- package/plugins/lisa-agy/skills/linear-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-agy/skills/parity-code-review/SKILL.md +83 -0
- package/plugins/lisa-agy/skills/parity-code-simplifier/SKILL.md +76 -0
- package/plugins/lisa-agy/skills/parity-coderabbit/SKILL.md +77 -0
- package/plugins/lisa-agy/skills/parity-safety-net-rules/SKILL.md +144 -0
- package/plugins/lisa-agy/skills/parity-sentry-sdk-setup/SKILL.md +211 -0
- package/plugins/lisa-agy/skills/parity-sentry-seer/SKILL.md +135 -0
- package/plugins/lisa-agy/skills/parity-skill-creator/SKILL.md +149 -0
- package/plugins/lisa-agy/skills/repair-intake/SKILL.md +2 -2
- package/plugins/lisa-agy/skills/tracker-build-intake/SKILL.md +4 -4
- 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 +5 -1
- package/plugins/lisa-copilot/commands/parity-code-review.md +6 -0
- package/plugins/lisa-copilot/commands/parity-code-simplifier.md +6 -0
- package/plugins/lisa-copilot/commands/parity-coderabbit.md +6 -0
- package/plugins/lisa-copilot/commands/parity-safety-net-rules.md +6 -0
- package/plugins/lisa-copilot/commands/parity-sentry-sdk-setup.md +6 -0
- package/plugins/lisa-copilot/commands/parity-sentry-seer.md +6 -0
- package/plugins/lisa-copilot/commands/parity-skill-creator.md +6 -0
- package/plugins/lisa-copilot/hooks/parity-safety-net.sh +102 -0
- package/plugins/lisa-copilot/rules/eager/base-rules.md +1 -1
- package/plugins/lisa-copilot/rules/eager/leaf-only-lifecycle.md +4 -4
- package/plugins/lisa-copilot/rules/eager/repo-scope-split.md +1 -1
- package/plugins/lisa-copilot/rules/reference/config-resolution.md +1 -1
- package/plugins/lisa-copilot/rules/reference/leaf-only-lifecycle.md +9 -9
- package/plugins/lisa-copilot/rules/reference/repo-scope-split.md +2 -2
- package/plugins/lisa-copilot/skills/github-build-intake/SKILL.md +7 -7
- package/plugins/lisa-copilot/skills/github-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-copilot/skills/intake-explain/SKILL.md +3 -3
- package/plugins/lisa-copilot/skills/jira-build-intake/SKILL.md +7 -7
- package/plugins/lisa-copilot/skills/jira-validate-ticket/SKILL.md +10 -11
- package/plugins/lisa-copilot/skills/linear-build-intake/SKILL.md +7 -7
- package/plugins/lisa-copilot/skills/linear-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-copilot/skills/parity-code-review/SKILL.md +83 -0
- package/plugins/lisa-copilot/skills/parity-code-simplifier/SKILL.md +76 -0
- package/plugins/lisa-copilot/skills/parity-coderabbit/SKILL.md +77 -0
- package/plugins/lisa-copilot/skills/parity-safety-net-rules/SKILL.md +144 -0
- package/plugins/lisa-copilot/skills/parity-sentry-sdk-setup/SKILL.md +211 -0
- package/plugins/lisa-copilot/skills/parity-sentry-seer/SKILL.md +135 -0
- package/plugins/lisa-copilot/skills/parity-skill-creator/SKILL.md +149 -0
- package/plugins/lisa-copilot/skills/repair-intake/SKILL.md +2 -2
- package/plugins/lisa-copilot/skills/tracker-build-intake/SKILL.md +4 -4
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/commands/parity-code-review.md +6 -0
- package/plugins/lisa-cursor/commands/parity-code-simplifier.md +6 -0
- package/plugins/lisa-cursor/commands/parity-coderabbit.md +6 -0
- package/plugins/lisa-cursor/commands/parity-safety-net-rules.md +6 -0
- package/plugins/lisa-cursor/commands/parity-sentry-sdk-setup.md +6 -0
- package/plugins/lisa-cursor/commands/parity-sentry-seer.md +6 -0
- package/plugins/lisa-cursor/commands/parity-skill-creator.md +6 -0
- package/plugins/lisa-cursor/hooks/hooks.json +4 -0
- package/plugins/lisa-cursor/hooks/parity-safety-net.sh +102 -0
- package/plugins/lisa-cursor/rules/base-rules.mdc +1 -1
- package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +1 -1
- package/plugins/lisa-cursor/rules/leaf-only-lifecycle-reference.mdc +9 -9
- package/plugins/lisa-cursor/rules/leaf-only-lifecycle.mdc +4 -4
- package/plugins/lisa-cursor/rules/repo-scope-split-reference.mdc +2 -2
- package/plugins/lisa-cursor/rules/repo-scope-split.mdc +1 -1
- package/plugins/lisa-cursor/skills/github-build-intake/SKILL.md +7 -7
- package/plugins/lisa-cursor/skills/github-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-cursor/skills/intake-explain/SKILL.md +3 -3
- package/plugins/lisa-cursor/skills/jira-build-intake/SKILL.md +7 -7
- package/plugins/lisa-cursor/skills/jira-validate-ticket/SKILL.md +10 -11
- package/plugins/lisa-cursor/skills/linear-build-intake/SKILL.md +7 -7
- package/plugins/lisa-cursor/skills/linear-validate-issue/SKILL.md +10 -11
- package/plugins/lisa-cursor/skills/parity-code-review/SKILL.md +83 -0
- package/plugins/lisa-cursor/skills/parity-code-simplifier/SKILL.md +76 -0
- package/plugins/lisa-cursor/skills/parity-coderabbit/SKILL.md +77 -0
- package/plugins/lisa-cursor/skills/parity-safety-net-rules/SKILL.md +144 -0
- package/plugins/lisa-cursor/skills/parity-sentry-sdk-setup/SKILL.md +211 -0
- package/plugins/lisa-cursor/skills/parity-sentry-seer/SKILL.md +135 -0
- package/plugins/lisa-cursor/skills/parity-skill-creator/SKILL.md +149 -0
- package/plugins/lisa-cursor/skills/repair-intake/SKILL.md +2 -2
- package/plugins/lisa-cursor/skills/tracker-build-intake/SKILL.md +4 -4
- 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-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/.claude-plugin/plugin.json +2 -1
- package/plugins/src/base/commands/parity-code-review.md +6 -0
- package/plugins/src/base/commands/parity-code-simplifier.md +6 -0
- package/plugins/src/base/commands/parity-coderabbit.md +6 -0
- package/plugins/src/base/commands/parity-safety-net-rules.md +6 -0
- package/plugins/src/base/commands/parity-sentry-sdk-setup.md +6 -0
- package/plugins/src/base/commands/parity-sentry-seer.md +6 -0
- package/plugins/src/base/commands/parity-skill-creator.md +6 -0
- package/plugins/src/base/hooks/parity-safety-net.sh +102 -0
- package/plugins/src/base/rules/eager/base-rules.md +1 -1
- package/plugins/src/base/rules/eager/leaf-only-lifecycle.md +4 -4
- package/plugins/src/base/rules/eager/repo-scope-split.md +1 -1
- package/plugins/src/base/rules/reference/config-resolution.md +1 -1
- package/plugins/src/base/rules/reference/leaf-only-lifecycle.md +9 -9
- package/plugins/src/base/rules/reference/repo-scope-split.md +2 -2
- package/plugins/src/base/skills/github-build-intake/SKILL.md +7 -7
- package/plugins/src/base/skills/github-validate-issue/SKILL.md +10 -11
- package/plugins/src/base/skills/intake-explain/SKILL.md +3 -3
- package/plugins/src/base/skills/jira-build-intake/SKILL.md +7 -7
- package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +10 -11
- package/plugins/src/base/skills/linear-build-intake/SKILL.md +7 -7
- package/plugins/src/base/skills/linear-validate-issue/SKILL.md +10 -11
- package/plugins/src/base/skills/parity-code-review/SKILL.md +83 -0
- package/plugins/src/base/skills/parity-code-simplifier/SKILL.md +76 -0
- package/plugins/src/base/skills/parity-coderabbit/SKILL.md +77 -0
- package/plugins/src/base/skills/parity-safety-net-rules/SKILL.md +144 -0
- package/plugins/src/base/skills/parity-sentry-sdk-setup/SKILL.md +211 -0
- package/plugins/src/base/skills/parity-sentry-seer/SKILL.md +135 -0
- package/plugins/src/base/skills/parity-skill-creator/SKILL.md +149 -0
- package/plugins/src/base/skills/repair-intake/SKILL.md +2 -2
- package/plugins/src/base/skills/tracker-build-intake/SKILL.md +4 -4
- package/scripts/plugin-parity-drift.mjs +9 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.128.0",
|
|
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.
|
|
3
|
+
"version": "2.128.0",
|
|
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"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.128.0",
|
|
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.
|
|
3
|
+
"version": "2.128.0",
|
|
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.
|
|
3
|
+
"version": "2.128.0",
|
|
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"
|
|
@@ -51,7 +51,8 @@
|
|
|
51
51
|
{
|
|
52
52
|
"matcher": "Bash",
|
|
53
53
|
"hooks": [
|
|
54
|
-
{ "type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/hooks/block-no-verify.sh" }
|
|
54
|
+
{ "type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/hooks/block-no-verify.sh" },
|
|
55
|
+
{ "type": "command", "command": "${CLAUDE_PLUGIN_ROOT}/hooks/parity-safety-net.sh" }
|
|
55
56
|
]
|
|
56
57
|
},
|
|
57
58
|
{
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Lisa-native code review of the current git diff — correctness bugs, security issues, and obvious defects, reported as severity-ranked findings with file:line references. Vendor-neutral cross-agent equivalent of the upstream code-review command."
|
|
3
|
+
argument-hint: "[optional: path or scope hint]"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use the /lisa:parity-code-review skill to review the current branch and working-tree diff for correctness bugs, security issues, and obvious defects, and report findings ranked by severity with file:line references. $ARGUMENTS
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Behavior-preserving simplification of recently-changed code — dedup, reuse, readability, and dead-code removal, quality only (never a bug hunt). Vendor-neutral cross-agent equivalent of the upstream code-simplifier agent."
|
|
3
|
+
argument-hint: "[optional: path or scope hint]"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use the /lisa:parity-code-simplifier skill to simplify the recently-changed code — removing duplication and dead code, reusing existing utilities, and improving readability — without altering behavior, then verify tests still pass. $ARGUMENTS
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Thorough PR-style review of the full diff — bugs, security, performance, and maintainability — with concrete fixes and a structured summary. An independent Lisa-native review (does NOT call CodeRabbit's service); vendor-neutral cross-agent equivalent of the upstream coderabbit plugin."
|
|
3
|
+
argument-hint: "[optional: PR number, path, or scope hint]"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use the /lisa:parity-coderabbit skill to run a thorough PR-style review of the full diff — flagging bugs, security, performance, and maintainability issues with concrete suggested fixes — and produce a structured summary with a verdict. $ARGUMENTS
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "View, set, and verify the custom guard rules enforced by Lisa's safety-net PreToolUse Bash hook — the cross-agent equivalent of the upstream safety-net plugin's set/verify-custom-rules skills."
|
|
3
|
+
argument-hint: "[view | set <regex> | verify]"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use the /lisa:parity-safety-net-rules skill to view, set, or verify the project-local custom guard rules enforced by Lisa's safety-net Bash hook (`parity-safety-net.sh`). $ARGUMENTS
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Install and configure the Sentry SDK for a project — detect the framework, add the right @sentry/<framework> package, init the client, wire the DSN via env, enable error + performance monitoring, and set up source maps. One consolidated skill covering react, nextjs, node, nestjs, python, react-native, and more."
|
|
3
|
+
argument-hint: "[framework override, e.g. nextjs | node | python] (auto-detected if omitted)"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use the /lisa:parity-sentry-sdk-setup skill to detect the framework and install + configure the correct Sentry SDK with error and performance monitoring and source maps. $ARGUMENTS
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "AI debugging — given an error, stack trace, or failing test, analyze it, form ranked hypotheses, locate the root cause in the codebase with file:line evidence, and propose a minimal fix. Lisa-native reimplementation of Sentry's seer workflow."
|
|
3
|
+
argument-hint: "<error message | stack trace | failing test | Sentry issue URL>"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use the /lisa:parity-sentry-seer skill to root-cause the failure and propose an evidence-backed fix. $ARGUMENTS
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: "Author a new Lisa skill end-to-end — scaffold the SKILL.md frontmatter, write the pass-through command, follow hyphen naming and placement under plugins/src, and rebuild plugins. Lisa-native equivalent of the upstream skill-creator plugin."
|
|
3
|
+
argument-hint: "<skill-name and a one-line description of what it should do>"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use the /lisa:parity-skill-creator skill to scaffold a new Lisa skill and its pass-through command, following frontmatter, naming, placement, and build conventions. $ARGUMENTS
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# PreToolUse hook for Bash: a safety net that blocks destructive shell commands
|
|
3
|
+
# before they run. Lisa-native reimplementation of the upstream
|
|
4
|
+
# `safety-net@cc-marketplace` plugin's PreToolUse Bash-guard (parity work, issue
|
|
5
|
+
# #1059). It does NOT port upstream code — it re-expresses the behavior in Lisa's
|
|
6
|
+
# hook conventions, modeled on block-no-verify.sh.
|
|
7
|
+
#
|
|
8
|
+
# It reads the hook stdin JSON, inspects the proposed Bash command, and EXITS
|
|
9
|
+
# NON-ZERO (2) to BLOCK when a known-destructive pattern matches:
|
|
10
|
+
# - `rm -rf /` (recursive forced delete of a root / home / wildcard path)
|
|
11
|
+
# - force-pushing a protected branch (main/master/production/release)
|
|
12
|
+
# - `git reset --hard` while the working tree is dirty (would discard work)
|
|
13
|
+
# - dropping or truncating a database/schema/table
|
|
14
|
+
# Otherwise it exits 0 and the command proceeds.
|
|
15
|
+
#
|
|
16
|
+
# Operators extend the built-in rules with a project-local rule file — one
|
|
17
|
+
# extended-regex (ERE) per line, blank lines and `#` comments ignored — managed
|
|
18
|
+
# by the parity-safety-net-rules skill. Default location (overridable via
|
|
19
|
+
# SAFETY_NET_RULES_FILE):
|
|
20
|
+
# ${CLAUDE_PROJECT_DIR:-$PWD}/.claude/safety-net-rules.txt
|
|
21
|
+
set -euo pipefail
|
|
22
|
+
|
|
23
|
+
input="$(cat)"
|
|
24
|
+
|
|
25
|
+
tool_name="$(printf '%s' "$input" | jq -r '.tool_name // empty')"
|
|
26
|
+
if [ "$tool_name" != "Bash" ]; then
|
|
27
|
+
exit 0
|
|
28
|
+
fi
|
|
29
|
+
|
|
30
|
+
command_str="$(printf '%s' "$input" | jq -r '.tool_input.command // empty')"
|
|
31
|
+
if [ -z "$command_str" ]; then
|
|
32
|
+
exit 0
|
|
33
|
+
fi
|
|
34
|
+
|
|
35
|
+
# block() prints the reason to stderr (surfaced to the model) and exits 2 so the
|
|
36
|
+
# Bash tool call is denied. $1 = human-readable reason for the block.
|
|
37
|
+
block() {
|
|
38
|
+
cat >&2 <<EOF
|
|
39
|
+
Blocked by safety-net: $1
|
|
40
|
+
|
|
41
|
+
This command matched a destructive-operation guard. If it is genuinely safe and
|
|
42
|
+
intentional, ask the user to confirm, then run it manually outside the agent, or
|
|
43
|
+
narrow the command so it no longer matches the guard.
|
|
44
|
+
EOF
|
|
45
|
+
exit 2
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
# 1. Recursive forced delete (`rm -rf`) of a filesystem root, home, or top-level
|
|
49
|
+
# wildcard. Two gates ANDed: the command must invoke `rm` with BOTH a
|
|
50
|
+
# recursive and a force flag, AND name a catastrophic target. Splitting the
|
|
51
|
+
# flag check from the target check keeps each regex legible and testable.
|
|
52
|
+
if printf '%s' "$command_str" \
|
|
53
|
+
| grep -Eiq '(^|[^[:alnum:]_./-])rm([[:space:]]+-[[:alnum:]-]+)*[[:space:]]+(-[[:alnum:]]*r[[:alnum:]]*f|-[[:alnum:]]*f[[:alnum:]]*r)([[:space:]]|$)' \
|
|
54
|
+
|| printf '%s' "$command_str" \
|
|
55
|
+
| grep -Eiq '(^|[^[:alnum:]_./-])rm[[:space:]].*(-r\b.*[[:space:]]-f\b|-f\b.*[[:space:]]-r\b|--recursive\b.*--force\b|--force\b.*--recursive\b)'; then
|
|
56
|
+
if printf '%s' "$command_str" \
|
|
57
|
+
| grep -Eq '([[:space:]]|=)(/|/\*|/\.\*?|~|~/\*?|\$HOME\b|\$\{HOME\}|\*)([[:space:]]|/?\*?$)'; then
|
|
58
|
+
block "recursive forced delete of a root, home, or wildcard path (rm -rf)"
|
|
59
|
+
fi
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
# 2. Force-pushing a protected branch. `--force-with-lease` is the safe,
|
|
63
|
+
# non-clobbering alternative and is intentionally NOT blocked.
|
|
64
|
+
if printf '%s' "$command_str" | grep -Eiq '(^|[^[:alnum:]_-])git[[:space:]]+push\b'; then
|
|
65
|
+
if printf '%s' "$command_str" | grep -Eiq '(--force([[:space:]]|=|$)|[[:space:]]-f([[:space:]]|$))' \
|
|
66
|
+
&& ! printf '%s' "$command_str" | grep -Eiq -- '--force-with-lease'; then
|
|
67
|
+
if printf '%s' "$command_str" | grep -Eiq '(^|[^[:alnum:]_/-])(main|master|production|prod|release)([^[:alnum:]_/-]|$)'; then
|
|
68
|
+
block "force-pushing a protected branch (use --force-with-lease, or push a feature branch)"
|
|
69
|
+
fi
|
|
70
|
+
fi
|
|
71
|
+
fi
|
|
72
|
+
|
|
73
|
+
# 3. `git reset --hard` while the working tree has uncommitted changes — this
|
|
74
|
+
# silently discards them. Only blocks when the tree is actually dirty, so a
|
|
75
|
+
# clean-tree reset (a legitimate workflow) still passes.
|
|
76
|
+
if printf '%s' "$command_str" | grep -Eiq '(^|[^[:alnum:]_-])git[[:space:]]+reset\b.*--hard\b'; then
|
|
77
|
+
if git rev-parse --is-inside-work-tree >/dev/null 2>&1 \
|
|
78
|
+
&& [ -n "$(git status --porcelain 2>/dev/null)" ]; then
|
|
79
|
+
block "git reset --hard on a dirty working tree would discard uncommitted changes (stash or commit first)"
|
|
80
|
+
fi
|
|
81
|
+
fi
|
|
82
|
+
|
|
83
|
+
# 4. Dropping or truncating a database / schema / table.
|
|
84
|
+
if printf '%s' "$command_str" \
|
|
85
|
+
| grep -Eiq '\b(drop[[:space:]]+(database|schema|table)|truncate[[:space:]]+(table[[:space:]]+)?[[:alnum:]_."`]+)\b'; then
|
|
86
|
+
block "destructive SQL (DROP/TRUNCATE) detected"
|
|
87
|
+
fi
|
|
88
|
+
|
|
89
|
+
# 5. Project-local custom rules. Each non-comment line is an ERE; a match blocks.
|
|
90
|
+
rules_file="${SAFETY_NET_RULES_FILE:-${CLAUDE_PROJECT_DIR:-$PWD}/.claude/safety-net-rules.txt}"
|
|
91
|
+
if [ -f "$rules_file" ]; then
|
|
92
|
+
while IFS= read -r rule || [ -n "$rule" ]; do
|
|
93
|
+
case "$rule" in
|
|
94
|
+
'' | '#'*) continue ;;
|
|
95
|
+
esac
|
|
96
|
+
if printf '%s' "$command_str" | grep -Eiq -- "$rule"; then
|
|
97
|
+
block "matched a project custom safety rule (${rules_file##*/}): $rule"
|
|
98
|
+
fi
|
|
99
|
+
done <"$rules_file"
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
exit 0
|
|
@@ -43,7 +43,7 @@ Do not begin work if there are blockers, ambiguities, access requirements, or un
|
|
|
43
43
|
- Read **all** comments on a ticket, not just the description.
|
|
44
44
|
- When clarifying, comment via ADF and @mention the Reporter.
|
|
45
45
|
- Establish issue link relationships (`blocks`, `is blocked by`, `relates to`) — search git history AND Jira before declaring "no related work."
|
|
46
|
-
- Single-repo invariant: Bug/Task/Sub-task MUST be single-repo. Epic
|
|
46
|
+
- Single-repo invariant: Bug/Task/Sub-task/Improvement (and any childless Story/Spike — a leaf per `leaf-only-lifecycle`) MUST be single-repo. An Epic, or any Story/Spike that still holds child work, MAY span repos. Cross-repo leaves are split per the `repo-scope-split` rule.
|
|
47
47
|
- Pre-flight gate: BLOCK + reassign-to-Reporter if a ticket is missing target backend env, sign-in credentials, Gherkin acceptance criteria, epic parent (non-bug/non-epic), or relationship discovery evidence.
|
|
48
48
|
|
|
49
49
|
## Pace
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
**Build-ready means a directly implementable leaf work unit.** Containers never carry build-ready.
|
|
4
4
|
|
|
5
|
-
A leaf is structurally defined: **no
|
|
5
|
+
A leaf is structurally defined: **no open children** AND not an Epic — the by-design leaf types (Bug, Task, Sub-task, Improvement) plus a childless Story or Spike. A container is an **Epic**, or any item of any type that has acquired open child work.
|
|
6
6
|
|
|
7
7
|
## Invariant
|
|
8
8
|
|
|
@@ -12,10 +12,10 @@ A leaf is structurally defined: **no child work** AND a leaf-typed item (Bug, Ta
|
|
|
12
12
|
|
|
13
13
|
## Childless-parent exception
|
|
14
14
|
|
|
15
|
-
A
|
|
15
|
+
A childless item is structurally a leaf — and may be build-ready **unless its type is Epic**:
|
|
16
16
|
|
|
17
|
-
- **Task or
|
|
18
|
-
- **Epic
|
|
17
|
+
- **Task, Bug, Story, Spike, or Improvement with no children** → leaf → may be build-ready. A Story ships directly as one increment and a Spike *is* the investigation unit; neither needs sub-items to be implementable, so a childless one must not be stranded.
|
|
18
|
+
- **Epic with no children** → still NOT build-ready. An Epic is a pure rollup container by design — its body is a high-level summary, never directly implementable — so a childless build-ready Epic is an incomplete decomposition or a mis-applied role. Repair: decompose into leaves, or reclassify to a leaf type.
|
|
19
19
|
|
|
20
20
|
## Parent state rollup (priority order, first match wins)
|
|
21
21
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Repo Scope & Work-Time Splitting (load-bearing)
|
|
2
2
|
|
|
3
|
-
**Leaf work units are single-repo.** A leaf is an individually implementable ticket with no children — types **Bug, Task, Sub-task, Improvement
|
|
3
|
+
**Leaf work units are single-repo.** A leaf is an individually implementable ticket with no open children — the by-design leaf types **Bug, Task, Sub-task, Improvement**, plus a childless **Story** or **Spike** (structurally a leaf per `leaf-only-lifecycle`). Each names exactly one repo. An **Epic**, and any **Story/Spike that still holds child work**, are coordination containers and may span repos.
|
|
4
4
|
|
|
5
5
|
Enforced at four points: gate **S10** (`*-validate-*`, write time), `task-decomposition` step 1.5 (PRD-decomposition time), claim-time repo scoping (`*-build-intake`), and the work-time split procedure (an existing ticket about to be implemented).
|
|
6
6
|
|
|
@@ -647,7 +647,7 @@ A ticketing system can oversee **multiple repos** — e.g. one JIRA project (or
|
|
|
647
647
|
|
|
648
648
|
### The `repo:<name>` label (the repo marker)
|
|
649
649
|
|
|
650
|
-
A work item's target repo is recorded as a **label** `repo:<name>`, where `<name>` is the repo's short name (e.g. `repo:frontend`). The convention is uniform across trackers (JIRA / GitHub / Linear), consistent with the other namespaced labels (`status:`, `type:`, `component:`). On JIRA a **component** equal to the repo name is accepted as an alias (matches the legacy `component = "frontend"` JQL pattern). A leaf work unit carries **exactly one** `repo:<name>` (leaves are single-repo per `repo-scope-split`); a container (Epic
|
|
650
|
+
A work item's target repo is recorded as a **label** `repo:<name>`, where `<name>` is the repo's short name (e.g. `repo:frontend`). The convention is uniform across trackers (JIRA / GitHub / Linear), consistent with the other namespaced labels (`status:`, `type:`, `component:`). On JIRA a **component** equal to the repo name is accepted as an alias (matches the legacy `component = "frontend"` JQL pattern). A leaf work unit carries **exactly one** `repo:<name>` (leaves are single-repo per `repo-scope-split`); a container (an Epic, or any item with open child work) may carry several or none.
|
|
651
651
|
|
|
652
652
|
The label is not required to exist up front: build-intake **determines** the target repo from the ticket's content + code surfaces when the label is absent and **stamps** `repo:<name>` so later cycles filter cheaply (see `repo-scope-split` "claim-time repo scoping").
|
|
653
653
|
|
|
@@ -16,16 +16,16 @@ The fix is not vendor-specific. It belongs here, in a cross-vendor rule, and eve
|
|
|
16
16
|
|
|
17
17
|
## Container vs. leaf taxonomy
|
|
18
18
|
|
|
19
|
-
A **leaf work unit** is an individually implementable item with **no child work
|
|
19
|
+
A **leaf work unit** is an individually implementable item with **no open child work**. Structurally, that is *any work item with no open children except an Epic*: the by-design leaf types **Bug, Task, Sub-task, Improvement**, plus a **childless Story or Spike** (a Story is a directly shippable increment and a Spike is itself the investigation unit — neither needs sub-items to be implementable). These are what an agent claims and implements. A leaf work unit is also single-repo (the `repo-scope-split` rule).
|
|
20
20
|
|
|
21
21
|
A **container** organizes other work and is never directly implemented:
|
|
22
22
|
|
|
23
23
|
| Class | Examples by type | May carry build-ready? |
|
|
24
24
|
|---|---|---|
|
|
25
|
-
| **Leaf work unit** | Bug, Task, Sub-task, Improvement — with no children | **Yes** |
|
|
26
|
-
| **Container** | Epic
|
|
25
|
+
| **Leaf work unit** | Bug, Task, Sub-task, Improvement, or a childless Story / Spike — anything with no open children **except an Epic** | **Yes** |
|
|
26
|
+
| **Container** | An **Epic**, or *any* item (of any type) that has open child work | **No** — state rolls up from children |
|
|
27
27
|
|
|
28
|
-
The classification is **structural, not nominal**: an item is a container if it has child work, regardless of its declared type. A "Task" that has acquired sub-tasks is a container for rollup purposes. The
|
|
28
|
+
The classification is **structural, not nominal**: an item is a container if it has open child work, regardless of its declared type. A "Task" that has acquired sub-tasks is a container for rollup purposes. The single nominal exception is the **Epic**, which is a pure rollup container by design and is treated as a container even when childless; for every other type the presence of children is decisive. See the childless-parent exception below for the converse case.
|
|
29
29
|
|
|
30
30
|
### How each vendor encodes hierarchy
|
|
31
31
|
|
|
@@ -49,12 +49,12 @@ The permission boundary is the maintainer-applied build-ready role, not authorsh
|
|
|
49
49
|
|
|
50
50
|
## Childless-parent exception
|
|
51
51
|
|
|
52
|
-
A
|
|
52
|
+
A childless item is, structurally, a leaf — and may be build-ready **unless its issue type is Epic**.
|
|
53
53
|
|
|
54
|
-
- A **Task
|
|
55
|
-
- An **Epic
|
|
54
|
+
- A **Task, Bug, Story, Spike,** or **Improvement** with no children → leaf → may be build-ready. Many real tickets are flat Tasks with no sub-tasks; just as common, a **Story** is implemented directly as a single shippable increment and a **Spike** *is* the investigation work unit. None of these need to be decomposed to be claimable, and this rule must not strand them. (A childless Story/Spike promoted to a leaf this way is single-repo like any other leaf — see `repo-scope-split`.)
|
|
55
|
+
- An **Epic** with no children → still **not** build-ready. An Epic is a pure rollup container by design: its body is a high-level summary, never a directly implementable unit, so a childless Epic carrying the build-ready role is an incomplete decomposition or a mis-applied role — not work. The correct repair is to decompose it (add leaf children) or reclassify it to a leaf type — not to claim it.
|
|
56
56
|
|
|
57
|
-
So the exception is narrow: childlessness
|
|
57
|
+
So the exception is narrow only at the top: childlessness promotes every type **except Epic** to a build-ready leaf. A childless Epic is never directly implementable; everything else, when childless, is.
|
|
58
58
|
|
|
59
59
|
## Parent status rollup (the state machine)
|
|
60
60
|
|
|
@@ -112,7 +112,7 @@ This action is **terminal-only**:
|
|
|
112
112
|
Skills that enforce this invariant or perform rollup cite this rule by slug (the `leaf-only-lifecycle` rule) instead of restating it:
|
|
113
113
|
|
|
114
114
|
- **Decomposition / write** (`*-to-tracker`, `*-write-*`) — apply the `ready` role to leaves only; never to containers.
|
|
115
|
-
- **Validate** (`*-validate-*`) — FAIL a container carrying the build-ready role; FAIL a childless Epic
|
|
115
|
+
- **Validate** (`*-validate-*`) — FAIL a container carrying the build-ready role; FAIL a childless **Epic** marked build-ready (a childless Story/Spike is a valid leaf and passes).
|
|
116
116
|
- **Build intake** (`*-build-intake`, `tracker-build-intake`) — dispatch leaves only; move or safe-block containers with stale build-ready roles according to vendor lifecycle semantics.
|
|
117
117
|
- **Rollup** — derive parent state from children per the state machine above. `repair-intake`
|
|
118
118
|
also uses this rule to close out parent/container rollups that were left open after every
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Repo Scope & Work-Time Splitting
|
|
2
2
|
|
|
3
|
-
Leaf work units are single-repo. A **leaf work unit** is an individually implementable ticket with no child tickets —
|
|
3
|
+
Leaf work units are single-repo. A **leaf work unit** is an individually implementable ticket with no open child tickets — the by-design leaf types **Bug, Task, Sub-task, Improvement**, plus a childless **Story** or **Spike** (a childless Story/Spike is structurally a leaf — see `leaf-only-lifecycle`). Each must name exactly one repository. An **Epic**, and any **Story or Spike that still holds child work**, are coordination containers and may span repos.
|
|
4
4
|
|
|
5
5
|
This invariant is enforced at four points: gate **S10** in the `*-validate-*` skills (write time), `task-decomposition` step 1.5 (PRD-decomposition time), **claim-time repo scoping** in the build-intake skills (when intake decides whether to claim a ready ticket for the current repo — see below), and the work-time split procedure below (when an agent picks up an existing ticket to implement it).
|
|
6
6
|
|
|
@@ -47,7 +47,7 @@ Resolve the current repo per the `config-resolution` "Repo scoping" section (con
|
|
|
47
47
|
|
|
48
48
|
**Cost.** Only **unlabeled** candidates need content determination; once stamped, wrong-repo candidates are skipped by label alone. Prefer candidates already labeled `repo:<current>` first (cheap claim), falling through to unlabeled candidates (determine + stamp) only when no pre-labeled current-repo leaf is ready.
|
|
49
49
|
|
|
50
|
-
A container (Epic
|
|
50
|
+
A container (an Epic, or any item with open child work) is handled by the leaf-only gate, not here — containers may span repos, may keep multiple `repo:<name>` labels for visibility, and are never claimed/built directly. Only a leaf work unit — including a now-childless Story/Spike that the leaf-only gate treats as a leaf — is split or skipped by repo scope.
|
|
51
51
|
|
|
52
52
|
## Vendor mechanics
|
|
53
53
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: github-build-intake
|
|
3
|
-
description: "GitHub counterpart to lisa:jira-build-intake. Scans a GitHub repository for issues carrying the configured `ready` build label, processes the first eligible issue, runs leaf work via lisa:github-agent, relabels to the configured `done` label on completion, then exits. Enforces the claim-time arm of the `leaf-only-lifecycle` rule: a parent/container with open child work (or a childless Epic
|
|
3
|
+
description: "GitHub counterpart to lisa:jira-build-intake. Scans a GitHub repository for issues carrying the configured `ready` build label, processes the first eligible issue, runs leaf work via lisa:github-agent, relabels to the configured `done` label on completion, then exits. Enforces the claim-time arm of the `leaf-only-lifecycle` rule: a parent/container with open child work (or a childless Epic) that still carries a stale build-ready label is moved out of the ready pickup queue into the configured `claimed` label with a lifecycle-repair comment, never dispatched to lisa:github-agent. The `ready` label is the human-flipped signal that an issue is truly ready for direct development pickup — mirroring how Notion PRDs work product Draft → Ready → (us) In Review → Blocked|Ticketed."
|
|
4
4
|
allowed-tools: ["Skill", "Bash"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -209,16 +209,16 @@ Classify and act (first match wins). `type:` is read from the issue's labels (`t
|
|
|
209
209
|
| Condition | Class | Action |
|
|
210
210
|
|---|---|---|
|
|
211
211
|
| `OPEN_CHILDREN > 0` (open child work, any type) | **Container** | **Move to `$CLAIMED` as lifecycle repair — do NOT dispatch** |
|
|
212
|
-
| no open children AND `type
|
|
213
|
-
| no open children AND `type
|
|
212
|
+
| no open children AND `type = Epic` | **Childless Epic (pure rollup container)** | **Move to `$CLAIMED` as lifecycle repair — do NOT dispatch** |
|
|
213
|
+
| no open children AND `type ≠ Epic` (Bug, Task, Sub-task, Improvement, Story, Spike, or no `type:` label) | **Leaf work unit** | **Proceed to 3b claim** |
|
|
214
214
|
|
|
215
|
-
The childless-parent exception
|
|
215
|
+
The childless-parent exception promotes every childless type **except Epic** to a dispatchable leaf: a childless Story is a directly shippable increment and a childless Spike *is* the investigation unit, so neither is stranded. Only a childless **Epic** is held back — an Epic is a pure rollup container by design, and a childless one is an incomplete decomposition or a mis-applied role, moved out of the ready pickup queue for repair/rollup and never dispatched.
|
|
216
216
|
|
|
217
217
|
**Lifecycle repair (default action for a flagged container).** Move the issue out of the pickup queue by removing `$READY` and adding `$CLAIMED`, post a single lifecycle-repair comment, and record the issue under "Repaired (container)" in the summary. Do NOT invoke `lisa:github-agent`. Keep the comment idempotent — skip posting if an identical `[claude-build-intake]` lifecycle-repair comment already exists on the issue, so a re-entrant cycle doesn't spam it.
|
|
218
218
|
|
|
219
219
|
```bash
|
|
220
220
|
gh issue edit <number> --repo <org>/<repo> --remove-label "$READY" --add-label "$CLAIMED"
|
|
221
|
-
gh issue comment <number> --repo <org>/<repo> --body "[claude-build-intake] Lifecycle repair: this issue carried the build-ready role ($READY) but is a parent/container with open child work (or a childless Epic
|
|
221
|
+
gh issue comment <number> --repo <org>/<repo> --body "[claude-build-intake] Lifecycle repair: this issue carried the build-ready role ($READY) but is a parent/container with open child work (or a childless Epic). I moved it to $CLAIMED without invoking the build agent. For parent/container issues, $CLAIMED means rollup/build-lane progress through child/leaf work; direct implementation must happen on leaf issues. Build-ready is leaf-only per leaf-only-lifecycle — move $READY onto its leaf children, or decompose/reclassify a childless Epic."
|
|
222
222
|
```
|
|
223
223
|
|
|
224
224
|
This gate never blocks a legitimate flat Task/Bug: those have no open children and a leaf `type:`, so they fall straight through to the claim in 3b.
|
|
@@ -326,7 +326,7 @@ Total PRs opened: <n>
|
|
|
326
326
|
|
|
327
327
|
## Idempotency & safety
|
|
328
328
|
|
|
329
|
-
- **Leaf-only claim gate runs first**: Phase 3a classifies each candidate before any leaf claim; a container with open child work (or a childless Epic
|
|
329
|
+
- **Leaf-only claim gate runs first**: Phase 3a classifies each candidate before any leaf claim; a container with open child work (or a childless Epic) is moved `$READY` → `$CLAIMED` as lifecycle repair and never dispatched. The lifecycle-repair comment is idempotent — a re-entrant cycle does not re-post it.
|
|
330
330
|
- **Dependency hold runs before leaf claim**: explicit `Blocked by:` relationships are resolved after container repair is ruled out but before `$READY → $CLAIMED`; active blockers leave the leaf candidate in `$READY` and are reported as skipped, not blocked.
|
|
331
331
|
- **Claim-first ordering**: `$CLAIMED` set BEFORE `lisa:github-agent` invocation for leaves; containers are also moved to `$CLAIMED` to leave the ready pickup queue, but are not dispatched.
|
|
332
332
|
- **No writes outside the lifecycle**: this skill only relabels `$READY → $CLAIMED` and `$CLAIMED → $DONE`. For containers, `$READY → $CLAIMED` is a lifecycle repair, not a direct build claim. Every other label change is owned by `lisa:github-agent`.
|
|
@@ -351,7 +351,7 @@ If the repo has not adopted the `status:*` label namespace, this skill cannot ru
|
|
|
351
351
|
|
|
352
352
|
## Rules
|
|
353
353
|
|
|
354
|
-
- **Dispatch leaves only.** Per the `leaf-only-lifecycle` rule, never dispatch a container — an issue with open child work, or a childless Epic
|
|
354
|
+
- **Dispatch leaves only.** Per the `leaf-only-lifecycle` rule, never dispatch a container — an issue with open child work, or a childless Epic — even if it carries the build-ready role. Move it `$READY → $CLAIMED` as lifecycle repair (Phase 3a); never silently implement a container.
|
|
355
355
|
- Never relabel an issue outside the cycle's allowed transitions. The `$CLAIMED` label is the signature of cycle ownership for leaves, and the parent/container progress state for lifecycle repairs.
|
|
356
356
|
- Never bypass `lisa:github-agent` to do build work directly. `lisa:github-agent` owns the per-issue lifecycle.
|
|
357
357
|
- Never auto-transition past `$DONE`. Downstream labels (terminal `status:done`, etc.) are owned by QA / PM / merge automation.
|