@codyswann/lisa 2.195.4 → 2.195.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -3
- package/all/copy-contents/gitignore +10 -4
- package/dist/cli/print-update-warning.d.ts +1 -1
- package/dist/cli/print-update-warning.js +2 -2
- package/dist/cli/print-update-warning.js.map +1 -1
- package/dist/cli/update-check.d.ts +6 -0
- package/dist/cli/update-check.d.ts.map +1 -1
- package/dist/cli/update-check.js +3 -3
- package/dist/cli/update-check.js.map +1 -1
- package/dist/cli/update-cmd.d.ts +1 -1
- package/dist/cli/update-cmd.d.ts.map +1 -1
- package/dist/cli/update-cmd.js +8 -7
- package/dist/cli/update-cmd.js.map +1 -1
- package/dist/codex/hooks-installer.d.ts +4 -1
- package/dist/codex/hooks-installer.d.ts.map +1 -1
- package/dist/codex/hooks-installer.js +109 -30
- package/dist/codex/hooks-installer.js.map +1 -1
- package/dist/codex/mcp-installer.d.ts +22 -0
- package/dist/codex/mcp-installer.d.ts.map +1 -0
- package/dist/codex/mcp-installer.js +135 -0
- package/dist/codex/mcp-installer.js.map +1 -0
- package/dist/codex/plugin-marketplace-installer.d.ts +19 -13
- package/dist/codex/plugin-marketplace-installer.d.ts.map +1 -1
- package/dist/codex/plugin-marketplace-installer.js +69 -72
- package/dist/codex/plugin-marketplace-installer.js.map +1 -1
- package/dist/codex/project-hooks-cleanup.d.ts +12 -0
- package/dist/codex/project-hooks-cleanup.d.ts.map +1 -0
- package/dist/codex/project-hooks-cleanup.js +31 -0
- package/dist/codex/project-hooks-cleanup.js.map +1 -0
- package/dist/codex/project-overlay.d.ts +23 -0
- package/dist/codex/project-overlay.d.ts.map +1 -0
- package/dist/codex/project-overlay.js +64 -0
- package/dist/codex/project-overlay.js.map +1 -0
- package/dist/codex/scripts/inject-rules.sh +4 -0
- package/dist/codex/scripts/install-pkgs.sh +4 -0
- package/dist/codex/scripts/setup-jira-cli.sh +5 -1
- package/dist/codex/settings-installer.d.ts.map +1 -1
- package/dist/codex/settings-installer.js +16 -3
- package/dist/codex/settings-installer.js.map +1 -1
- package/dist/codex/skills-installer.d.ts +15 -19
- package/dist/codex/skills-installer.d.ts.map +1 -1
- package/dist/codex/skills-installer.js +47 -140
- package/dist/codex/skills-installer.js.map +1 -1
- package/dist/core/lisa-plugin-selection.d.ts +16 -0
- package/dist/core/lisa-plugin-selection.d.ts.map +1 -0
- package/dist/core/lisa-plugin-selection.js +59 -0
- package/dist/core/lisa-plugin-selection.js.map +1 -0
- package/dist/core/lisa-rules-mirror.d.ts +2 -1
- package/dist/core/lisa-rules-mirror.d.ts.map +1 -1
- package/dist/core/lisa-rules-mirror.js +19 -3
- package/dist/core/lisa-rules-mirror.js.map +1 -1
- package/dist/core/lisa-skill-sources.d.ts.map +1 -1
- package/dist/core/lisa-skill-sources.js +16 -1
- package/dist/core/lisa-skill-sources.js.map +1 -1
- package/dist/core/lisa.d.ts +4 -6
- package/dist/core/lisa.d.ts.map +1 -1
- package/dist/core/lisa.js +12 -38
- package/dist/core/lisa.js.map +1 -1
- package/dist/migrations/ensure-lisa-postinstall.d.ts.map +1 -1
- package/dist/migrations/ensure-lisa-postinstall.js +4 -3
- package/dist/migrations/ensure-lisa-postinstall.js.map +1 -1
- package/dist/opencode/plugin-templates/lisa-session-bootstrap.ts +2 -3
- package/npm-package/create-only/.github/workflows/publish-to-npm.yml +2 -1
- package/package.json +2 -3
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +2 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-acceptance-criteria/SKILL.md +71 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-acceptance-criteria/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-agent-design-best-practices/SKILL.md +219 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-agent-design-best-practices/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-analyze-claude-remote/SKILL.md +429 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-analyze-claude-remote/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-atlassian-access/SKILL.md +361 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-atlassian-access/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs +214 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-automation-status/SKILL.md +111 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-automation-status/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-bug-triage/SKILL.md +23 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-bug-triage/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-codebase-research/SKILL.md +87 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-codebase-research/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-codify-verification/SKILL.md +162 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-codify-verification/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-confluence-prd-intake/SKILL.md +417 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-confluence-prd-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-confluence-to-tracker/SKILL.md +356 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-confluence-to-tracker/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-confluence-write-prd/SKILL.md +109 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-confluence-write-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-cross-pollinate/SKILL.md +175 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-cross-pollinate/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-debrief/SKILL.md +94 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-debrief/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-debrief-apply/SKILL.md +63 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-debrief-apply/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +336 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-doctor/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +179 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-epic-triage/SKILL.md +28 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-epic-triage/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-exploratory-qa/SKILL.md +91 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-exploratory-qa/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-fix-linter-error/SKILL.md +45 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-fix-linter-error/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-generate-claude-remote-build-script/SKILL.md +224 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-generate-claude-remote-build-script/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-git-commit/SKILL.md +48 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-git-commit/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-git-prune/SKILL.md +35 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-git-prune/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-git-submit-pr/SKILL.md +113 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-git-submit-pr/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-add-journey/SKILL.md +115 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-add-journey/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-build-intake/SKILL.md +446 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-build-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-create/SKILL.md +101 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-create/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-evidence/SKILL.md +110 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-evidence/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-journey/SKILL.md +121 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-journey/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-prd-intake/SKILL.md +432 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-prd-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-project-v2/SKILL.md +227 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-project-v2/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-read-issue/SKILL.md +248 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-read-issue/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-sync/SKILL.md +132 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-sync/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-to-tracker/SKILL.md +339 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-to-tracker/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +330 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-verify/SKILL.md +29 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-verify/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/SKILL.md +339 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-write-prd/SKILL.md +157 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-write-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-implement/SKILL.md +202 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-implement/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-code-complexity/SKILL.md +44 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-code-complexity/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-max-lines/SKILL.md +45 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-max-lines/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-max-lines-per-function/SKILL.md +46 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-max-lines-per-function/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-test-coverage/SKILL.md +44 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-test-coverage/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-tests/SKILL.md +47 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-tests/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-intake/SKILL.md +133 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-intake-explain/SKILL.md +279 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-intake-explain/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jam-access/SKILL.md +52 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jam-access/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-add-journey/SKILL.md +121 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-add-journey/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-build-intake/SKILL.md +368 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-build-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-create/SKILL.md +154 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-create/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-evidence/SKILL.md +90 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-evidence/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-evidence/scripts/post-evidence.sh +180 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/SKILL.md +127 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/scripts/generate-templates.py +233 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/scripts/parse-plan.py +368 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-read-ticket/SKILL.md +198 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-read-ticket/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-read-ticket/scripts/download-attachment.sh +110 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-sync/SKILL.md +108 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-sync/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +317 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-verify/SKILL.md +30 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-verify/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/SKILL.md +267 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jsdoc-best-practices/SKILL.md +432 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jsdoc-best-practices/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +90 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-add-journey/SKILL.md +105 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-add-journey/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +346 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-create/SKILL.md +146 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-create/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-evidence/SKILL.md +103 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-evidence/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-journey/SKILL.md +134 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-journey/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-prd-intake/SKILL.md +383 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-prd-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-read-issue/SKILL.md +200 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-read-issue/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-sync/SKILL.md +127 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-sync/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-to-tracker/SKILL.md +339 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-to-tracker/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +314 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-verify/SKILL.md +51 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-verify/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +292 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-prd/SKILL.md +96 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-monitor/SKILL.md +69 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-monitor/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-nightly-add-test-coverage/SKILL.md +40 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-nightly-add-test-coverage/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-nightly-improve-tests/SKILL.md +29 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-nightly-improve-tests/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-nightly-lower-code-complexity/SKILL.md +28 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-nightly-lower-code-complexity/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-access/SKILL.md +226 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-access/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-prd-intake/SKILL.md +360 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-prd-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-to-tracker/SKILL.md +353 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-to-tracker/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-write-prd/SKILL.md +109 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-write-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-code-review/SKILL.md +83 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-code-review/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-code-simplifier/SKILL.md +76 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-code-simplifier/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-coderabbit/SKILL.md +77 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-coderabbit/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-safety-net-rules/SKILL.md +144 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-safety-net-rules/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-sentry-sdk-setup/SKILL.md +211 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-sentry-sdk-setup/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-sentry-seer/SKILL.md +135 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-sentry-seer/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-skill-creator/SKILL.md +151 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-skill-creator/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-performance-review/SKILL.md +94 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-performance-review/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-plan/SKILL.md +60 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-plan/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-plugin-sync-explain/SKILL.md +53 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-plugin-sync-explain/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-posthog-access/SKILL.md +60 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-posthog-access/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-backlink/SKILL.md +265 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-backlink/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-source-write/SKILL.md +101 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-source-write/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-ticket-coverage/SKILL.md +170 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-ticket-coverage/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-product-walkthrough/SKILL.md +104 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-product-walkthrough/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/SKILL.md +315 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/examples/evidence-card-format.md +21 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/examples/host-project-only.md +22 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/examples/idempotency-verification-harness.md +57 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/examples/public-external-inspiration.md +22 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/examples/unavailable-data-rejection.md +22 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-pull-request-review/SKILL.md +84 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-pull-request-review/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-quality-review/SKILL.md +54 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-quality-review/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-queue-status/SKILL.md +133 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-queue-status/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +1030 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-reproduce-bug/SKILL.md +96 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-reproduce-bug/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-research/SKILL.md +68 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-research/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-review-implementation/SKILL.md +209 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-review-implementation/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-review-local/SKILL.md +88 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-review-local/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-root-cause-analysis/SKILL.md +155 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-root-cause-analysis/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-security-review/SKILL.md +57 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-security-review/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-security-zap-scan/SKILL.md +33 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-security-zap-scan/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sentry-access/SKILL.md +56 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sentry-access/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-atlassian/SKILL.md +347 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-atlassian/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-automations/SKILL.md +103 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-automations/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-confluence/SKILL.md +254 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-confluence/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-github/SKILL.md +268 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-github/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-jira/SKILL.md +198 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-jira/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +251 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-notion/SKILL.md +316 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-notion/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sonarcloud-access/SKILL.md +71 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sonarcloud-access/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-spec-conformance/SKILL.md +159 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-spec-conformance/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sync-down/SKILL.md +171 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sync-down/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-task-decomposition/SKILL.md +127 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-task-decomposition/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-task-triage/SKILL.md +23 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-task-triage/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tdd-implementation/SKILL.md +86 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tdd-implementation/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tear-down-automations/SKILL.md +34 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tear-down-automations/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-test-strategy/SKILL.md +63 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-test-strategy/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-ticket-triage/SKILL.md +186 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-ticket-triage/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-add-journey/SKILL.md +27 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-add-journey/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-build-intake/SKILL.md +86 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-build-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-create/SKILL.md +27 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-create/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-evidence/SKILL.md +53 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-evidence/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-journey/SKILL.md +27 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-journey/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-read/SKILL.md +28 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-read/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-source-artifacts/SKILL.md +107 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-source-artifacts/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-sync/SKILL.md +65 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-sync/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-validate/SKILL.md +37 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-validate/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-verify/SKILL.md +29 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-verify/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-write/SKILL.md +54 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-write/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-usage-accounting/SKILL.md +170 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-usage-accounting/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-use-the-product/SKILL.md +86 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-use-the-product/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-validate-tracker-mapping/SKILL.md +195 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-validate-tracker-mapping/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verification-lifecycle/SKILL.md +365 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verification-lifecycle/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verify/SKILL.md +52 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verify/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verify-prd/SKILL.md +392 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verify-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-wiki-install/SKILL.md +101 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-wiki-install/agents/openai.yaml +4 -0
- package/plugins/lisa/hooks/inject-rules.sh +3 -2
- package/plugins/lisa/hooks/install-pkgs.sh +4 -45
- package/plugins/lisa/hooks/setup-jira-cli.sh +4 -12
- package/plugins/lisa/skills/lisa-setup-linear/SKILL.md +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-setup-linear/SKILL.md +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/hooks/inject-rules.sh +3 -2
- package/plugins/lisa-copilot/hooks/install-pkgs.sh +4 -45
- package/plugins/lisa-copilot/hooks/setup-jira-cli.sh +4 -12
- package/plugins/lisa-copilot/skills/lisa-setup-linear/SKILL.md +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/install-pkgs.sh +4 -45
- package/plugins/lisa-cursor/hooks/setup-jira-cli.sh +4 -12
- package/plugins/lisa-cursor/skills/lisa-setup-linear/SKILL.md +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +2 -2
- package/plugins/lisa-expo/.codex-plugin/skills/add-app-clip/SKILL.md +280 -0
- package/plugins/lisa-expo/.codex-plugin/skills/add-app-clip/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/add-app-clip/references/native-module.md +96 -0
- package/plugins/lisa-expo/.codex-plugin/skills/apollo-client/SKILL.md +238 -0
- package/plugins/lisa-expo/.codex-plugin/skills/apollo-client/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/apollo-client/references/mutation-patterns.md +360 -0
- package/plugins/lisa-expo/.codex-plugin/skills/atomic-design-gluestack/SKILL.md +367 -0
- package/plugins/lisa-expo/.codex-plugin/skills/atomic-design-gluestack/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/atomic-design-gluestack/references/atomic-levels.md +417 -0
- package/plugins/lisa-expo/.codex-plugin/skills/atomic-design-gluestack/references/folder-structure.md +257 -0
- package/plugins/lisa-expo/.codex-plugin/skills/atomic-design-gluestack/references/gluestack-mapping.md +233 -0
- package/plugins/lisa-expo/.codex-plugin/skills/atomic-design-gluestack/scripts/test_validate_atomic_structure.py +240 -0
- package/plugins/lisa-expo/.codex-plugin/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +438 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/SKILL.md +321 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/animations.md +220 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/controls.md +272 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/form-sheet.md +253 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/gradients.md +106 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/icons.md +213 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/media.md +198 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/route-structure.md +229 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/search.md +248 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/storage.md +121 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/tabs.md +433 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/toolbar-and-headers.md +284 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/visual-effects.md +197 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/webgpu-three.md +605 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/zoom-transitions.md +158 -0
- package/plugins/lisa-expo/.codex-plugin/skills/container-view-pattern/SKILL.md +299 -0
- package/plugins/lisa-expo/.codex-plugin/skills/container-view-pattern/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/container-view-pattern/references/examples.md +749 -0
- package/plugins/lisa-expo/.codex-plugin/skills/container-view-pattern/references/patterns.md +318 -0
- package/plugins/lisa-expo/.codex-plugin/skills/container-view-pattern/scripts/create_component.py +200 -0
- package/plugins/lisa-expo/.codex-plugin/skills/container-view-pattern/scripts/validate_component.py +209 -0
- package/plugins/lisa-expo/.codex-plugin/skills/cross-platform-compatibility/SKILL.md +268 -0
- package/plugins/lisa-expo/.codex-plugin/skills/cross-platform-compatibility/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/cross-platform-compatibility/references/common-issues.md +619 -0
- package/plugins/lisa-expo/.codex-plugin/skills/cross-platform-compatibility/references/file-extensions.md +340 -0
- package/plugins/lisa-expo/.codex-plugin/skills/cross-platform-compatibility/references/platform-api.md +276 -0
- package/plugins/lisa-expo/.codex-plugin/skills/cross-platform-compatibility/scripts/validate_cross_platform.py +416 -0
- package/plugins/lisa-expo/.codex-plugin/skills/directory-structure/SKILL.md +214 -0
- package/plugins/lisa-expo/.codex-plugin/skills/directory-structure/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/directory-structure/scripts/validate_structure.py +454 -0
- package/plugins/lisa-expo/.codex-plugin/skills/e2e-coverage-gaps/SKILL.md +105 -0
- package/plugins/lisa-expo/.codex-plugin/skills/e2e-coverage-gaps/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/eas-update-insights/SKILL.md +228 -0
- package/plugins/lisa-expo/.codex-plugin/skills/eas-update-insights/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/eas-update-insights/references/channel-insights-schema.md +47 -0
- package/plugins/lisa-expo/.codex-plugin/skills/eas-update-insights/references/update-insights-schema.md +69 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-api-routes/SKILL.md +369 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-api-routes/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-brownfield/SKILL.md +54 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-brownfield/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-brownfield/references/brownfield-integrated.md +526 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-brownfield/references/brownfield-isolated.md +402 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-brownfield/references/comparison.md +63 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-brownfield/references/troubleshooting.md +88 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-cicd-workflows/SKILL.md +92 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-cicd-workflows/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-cicd-workflows/scripts/fetch.js +113 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-cicd-workflows/scripts/package.json +11 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-cicd-workflows/scripts/validate.js +85 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-deployment/SKILL.md +193 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-deployment/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-deployment/references/app-store-metadata.md +479 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-deployment/references/ios-app-store.md +355 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-deployment/references/play-store.md +264 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-deployment/references/testflight.md +58 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-deployment/references/workflows.md +200 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-dev-client/SKILL.md +164 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-dev-client/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-env-config/SKILL.md +309 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-env-config/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-env-config/references/validation-patterns.md +417 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/SKILL.md +141 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/references/config-plugin.md +90 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/references/create-expo-module.md +206 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/references/lifecycle.md +127 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/references/module-config.md +48 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/references/native-module.md +286 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/references/native-view.md +171 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-router-best-practices/SKILL.md +431 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-router-best-practices/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-router-best-practices/references/official-docs.md +290 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-router-best-practices/scripts/generate-route.py +171 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-tailwind-setup/SKILL.md +480 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-tailwind-setup/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-ui-jetpack-compose/SKILL.md +40 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-ui-jetpack-compose/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-ui-swift-ui/SKILL.md +39 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-ui-swift-ui/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/gluestack-nativewind/SKILL.md +419 -0
- package/plugins/lisa-expo/.codex-plugin/skills/gluestack-nativewind/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/gluestack-nativewind/references/color-tokens.md +343 -0
- package/plugins/lisa-expo/.codex-plugin/skills/gluestack-nativewind/references/component-mapping.md +307 -0
- package/plugins/lisa-expo/.codex-plugin/skills/gluestack-nativewind/references/spacing-scale.md +300 -0
- package/plugins/lisa-expo/.codex-plugin/skills/gluestack-nativewind/scripts/test_validate_styling.py +240 -0
- package/plugins/lisa-expo/.codex-plugin/skills/gluestack-nativewind/scripts/validate_styling.py +424 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-add-journey/SKILL.md +126 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-add-journey/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-create/SKILL.md +161 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-create/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-evidence/SKILL.md +78 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-evidence/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-evidence/scripts/post-evidence.sh +180 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-journey/SKILL.md +190 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-journey/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-journey/scripts/generate-templates.py +281 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-journey/scripts/parse-plan.py +368 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-verify/SKILL.md +27 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-verify/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/lisa-e2e-coverage-gaps/SKILL.md +13 -0
- package/plugins/lisa-expo/.codex-plugin/skills/lisa-e2e-coverage-gaps/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/local-state/SKILL.md +362 -0
- package/plugins/lisa-expo/.codex-plugin/skills/local-state/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/local-state/references/async-storage.md +505 -0
- package/plugins/lisa-expo/.codex-plugin/skills/local-state/references/persistence-patterns.md +711 -0
- package/plugins/lisa-expo/.codex-plugin/skills/local-state/references/reactive-variables.md +446 -0
- package/plugins/lisa-expo/.codex-plugin/skills/native-data-fetching/SKILL.md +507 -0
- package/plugins/lisa-expo/.codex-plugin/skills/native-data-fetching/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/native-data-fetching/references/expo-router-loaders.md +344 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-browser-uat/SKILL.md +124 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-browser-uat/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-check-logs/SKILL.md +217 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-check-logs/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-db-ops/SKILL.md +123 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-db-ops/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-deploy/SKILL.md +123 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-deploy/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-monitor-errors/SKILL.md +99 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-monitor-errors/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-performance/SKILL.md +165 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-performance/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-run-local/SKILL.md +169 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-run-local/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-verify-health/SKILL.md +101 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-verify-health/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/owasp-zap/SKILL.md +61 -0
- package/plugins/lisa-expo/.codex-plugin/skills/owasp-zap/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/play-store-access/SKILL.md +226 -0
- package/plugins/lisa-expo/.codex-plugin/skills/play-store-access/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/playwright-ci-debugging/SKILL.md +140 -0
- package/plugins/lisa-expo/.codex-plugin/skills/playwright-ci-debugging/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/playwright-selectors/SKILL.md +455 -0
- package/plugins/lisa-expo/.codex-plugin/skills/playwright-selectors/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/reduce-complexity/SKILL.md +251 -0
- package/plugins/lisa-expo/.codex-plugin/skills/reduce-complexity/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/reduce-complexity/references/extraction-strategies.md +456 -0
- package/plugins/lisa-expo/.codex-plugin/skills/reduce-complexity/references/refactoring-patterns.md +557 -0
- package/plugins/lisa-expo/.codex-plugin/skills/testing-library/SKILL.md +314 -0
- package/plugins/lisa-expo/.codex-plugin/skills/testing-library/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/testing-library/references/async-patterns.md +420 -0
- package/plugins/lisa-expo/.codex-plugin/skills/testing-library/references/expo-router-testing.md +556 -0
- package/plugins/lisa-expo/.codex-plugin/skills/testing-library/references/mocking-patterns.md +590 -0
- package/plugins/lisa-expo/.codex-plugin/skills/testing-library/references/query-priority.md +291 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/SKILL.md +134 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/references/expo-av-to-audio.md +132 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/references/expo-av-to-video.md +160 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/references/native-tabs.md +124 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/references/new-architecture.md +79 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/references/react-19.md +79 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/references/react-compiler.md +59 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/references/react-navigation-to-expo-router.md +61 -0
- package/plugins/lisa-expo/.codex-plugin/skills/use-dom/SKILL.md +417 -0
- package/plugins/lisa-expo/.codex-plugin/skills/use-dom/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/skills/building-native-ui/SKILL.md +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-agy/skills/building-native-ui/SKILL.md +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/skills/building-native-ui/SKILL.md +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/skills/building-native-ui/SKILL.md +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +2 -2
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/e2e-coverage-gaps/SKILL.md +105 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/e2e-coverage-gaps/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-auth/SKILL.md +368 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-auth/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-build-and-deploy/SKILL.md +198 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-build-and-deploy/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-caching/SKILL.md +265 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-caching/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-component-model/SKILL.md +87 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-component-model/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-config-yaml/SKILL.md +283 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-config-yaml/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-operations/SKILL.md +239 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-operations/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-realtime/SKILL.md +187 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-realtime/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-resources/SKILL.md +142 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-resources/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-rest-queries/SKILL.md +403 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-rest-queries/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-schema-graphql/SKILL.md +123 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-schema-graphql/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-testing/SKILL.md +254 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-testing/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/lisa-e2e-coverage-gaps/SKILL.md +13 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/lisa-e2e-coverage-gaps/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/hooks/block-generated-artifact-edits.sh +42 -24
- package/plugins/lisa-harper-fabric/hooks/enforce-config-extensions.mjs +12 -14
- package/plugins/lisa-harper-fabric/hooks/enforce-config-extensions.sh +30 -3
- package/plugins/lisa-harper-fabric/hooks/inject-rules.sh +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-copilot/hooks/block-generated-artifact-edits.sh +42 -24
- package/plugins/lisa-harper-fabric-copilot/hooks/enforce-config-extensions.mjs +12 -14
- package/plugins/lisa-harper-fabric-copilot/hooks/enforce-config-extensions.sh +30 -3
- package/plugins/lisa-harper-fabric-copilot/hooks/inject-rules.sh +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/hooks/block-generated-artifact-edits.sh +42 -24
- package/plugins/lisa-harper-fabric-cursor/hooks/enforce-config-extensions.mjs +12 -14
- package/plugins/lisa-harper-fabric-cursor/hooks/enforce-config-extensions.sh +30 -3
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +2 -2
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-graphql/SKILL.md +176 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-graphql/agents/openai.yaml +4 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-graphql/references/advanced-features.md +527 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-graphql/references/project-patterns.md +531 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-graphql/references/quick-start.md +257 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-graphql/references/resolvers-mutations.md +413 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-graphql/references/types-scalars.md +513 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-rules/SKILL.md +565 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-rules/agents/openai.yaml +4 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/typeorm-patterns/SKILL.md +275 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/typeorm-patterns/agents/openai.yaml +4 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/typeorm-patterns/references/configuration-patterns.md +487 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/typeorm-patterns/references/entity-patterns.md +450 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/typeorm-patterns/references/observability-patterns.md +536 -0
- package/plugins/lisa-nestjs/skills/typeorm-patterns/references/configuration-patterns.md +5 -5
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/skills/typeorm-patterns/references/configuration-patterns.md +5 -5
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/skills/typeorm-patterns/references/configuration-patterns.md +5 -5
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/skills/typeorm-patterns/references/configuration-patterns.md +5 -5
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +2 -2
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-repo-topic/SKILL.md +13 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-repo-topic/agents/openai.yaml +4 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-staff-slack/SKILL.md +13 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-staff-slack/agents/openai.yaml +4 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-staff-telegram/SKILL.md +13 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-staff-telegram/agents/openai.yaml +4 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-repo-topic/SKILL.md +163 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-repo-topic/agents/openai.yaml +4 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +185 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-staff/SKILL.md +175 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-staff/agents/openai.yaml +4 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-staff/references/platform-routing.md +123 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-staff/references/prompts.md +78 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-setup/SKILL.md +141 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-setup/agents/openai.yaml +4 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-setup-openclaw/SKILL.md +13 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-setup-openclaw/agents/openai.yaml +4 -0
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +2 -2
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-accessibility/SKILL.md +135 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-accessibility/agents/openai.yaml +4 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-asset-pipeline/SKILL.md +222 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-asset-pipeline/agents/openai.yaml +4 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-asset-sourcing/SKILL.md +151 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-asset-sourcing/agents/openai.yaml +4 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-build-deploy/SKILL.md +153 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-build-deploy/agents/openai.yaml +4 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-i18n/SKILL.md +122 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-i18n/agents/openai.yaml +4 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-project-structure/SKILL.md +89 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-project-structure/agents/openai.yaml +4 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-services/SKILL.md +208 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-services/agents/openai.yaml +4 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-testing/SKILL.md +192 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-testing/agents/openai.yaml +4 -0
- package/plugins/lisa-phaser/hooks/inject-rules.sh +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/hooks/inject-rules.sh +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +2 -2
- package/plugins/lisa-rails/.codex-plugin/skills/action-controller-best-practices/SKILL.md +374 -0
- package/plugins/lisa-rails/.codex-plugin/skills/action-controller-best-practices/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/action-view-best-practices/SKILL.md +335 -0
- package/plugins/lisa-rails/.codex-plugin/skills/action-view-best-practices/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/active-record-model-best-practices/SKILL.md +166 -0
- package/plugins/lisa-rails/.codex-plugin/skills/active-record-model-best-practices/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/e2e-coverage-gaps/SKILL.md +105 -0
- package/plugins/lisa-rails/.codex-plugin/skills/e2e-coverage-gaps/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/fix-linter-error/SKILL.md +45 -0
- package/plugins/lisa-rails/.codex-plugin/skills/fix-linter-error/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-code-complexity/SKILL.md +48 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-code-complexity/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-max-lines/SKILL.md +46 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-max-lines/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-max-lines-per-function/SKILL.md +46 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-max-lines-per-function/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-test-coverage/SKILL.md +45 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-test-coverage/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-add-journey/SKILL.md +65 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-add-journey/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-create/SKILL.md +100 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-create/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-evidence/SKILL.md +70 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-evidence/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-evidence/scripts/post-evidence.sh +180 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-journey/SKILL.md +64 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-journey/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-verify/SKILL.md +26 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-verify/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/lisa-e2e-coverage-gaps/SKILL.md +13 -0
- package/plugins/lisa-rails/.codex-plugin/skills/lisa-e2e-coverage-gaps/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-check-logs/SKILL.md +191 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-check-logs/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-deploy/SKILL.md +153 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-deploy/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-run-local/SKILL.md +169 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-run-local/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-verify-jobs/SKILL.md +157 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-verify-jobs/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-verify-telemetry/SKILL.md +197 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-verify-telemetry/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/hooks/inject-rules.sh +2 -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-copilot/hooks/inject-rules.sh +2 -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 +2 -2
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-add-ingest/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-add-ingest/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-add-role/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-add-role/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-ingest/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-ingest/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-lint/SKILL.md +11 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-lint/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-migrate/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-migrate/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-onboard-me/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-onboard-me/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-query/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-query/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-setup/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-setup/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-setup-wiki/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-setup-wiki/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-status/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-status/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-add-ingest/SKILL.md +34 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-add-ingest/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-add-role/SKILL.md +30 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-add-role/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-confluence/SKILL.md +25 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-confluence/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-docs/SKILL.md +30 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-docs/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-git/SKILL.md +25 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-git/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-jira/SKILL.md +28 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-jira/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-memory/SKILL.md +28 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-memory/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-notion/SKILL.md +25 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-notion/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-roles/SKILL.md +22 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-roles/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-slack/SKILL.md +30 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-slack/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-web/SKILL.md +23 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-web/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-doctor/SKILL.md +47 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-doctor/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-ingest/SKILL.md +99 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-ingest/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-lint/SKILL.md +32 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-lint/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-migrate/SKILL.md +43 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-migrate/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-onboard-me/SKILL.md +33 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-onboard-me/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-query/SKILL.md +36 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-query/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-setup/SKILL.md +75 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-setup/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-setup-automations/SKILL.md +83 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-setup-automations/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-status/SKILL.md +47 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-status/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-tear-down-automations/SKILL.md +34 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-tear-down-automations/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-usage/SKILL.md +50 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-usage/agents/openai.yaml +4 -0
- 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/hooks/inject-rules.sh +3 -2
- package/plugins/src/base/hooks/install-pkgs.sh +4 -45
- package/plugins/src/base/hooks/setup-jira-cli.sh +4 -12
- package/plugins/src/base/skills/lisa-setup-linear/SKILL.md +1 -1
- package/plugins/src/expo/skills/building-native-ui/SKILL.md +1 -1
- package/plugins/src/harper-fabric/hooks/block-generated-artifact-edits.sh +42 -24
- package/plugins/src/harper-fabric/hooks/enforce-config-extensions.mjs +12 -14
- package/plugins/src/harper-fabric/hooks/enforce-config-extensions.sh +30 -3
- package/plugins/src/harper-fabric/hooks/inject-rules.sh +1 -1
- package/plugins/src/nestjs/skills/typeorm-patterns/references/configuration-patterns.md +5 -5
- package/plugins/src/phaser/hooks/inject-rules.sh +1 -1
- package/plugins/src/rails/hooks/inject-rules.sh +2 -1
- package/scripts/clean-dist.mjs +7 -0
- package/scripts/generate-codex-plugin-artifacts.mjs +311 -20
- package/scripts/install-claude-plugins.sh +53 -40
- package/typescript/package-lisa/package.lisa.json +1 -1
- package/.agents/plugins/marketplace.json +0 -128
- package/dist/codex/lisa-plugin-detection.d.ts +0 -68
- package/dist/codex/lisa-plugin-detection.d.ts.map +0 -1
- package/dist/codex/lisa-plugin-detection.js +0 -139
- package/dist/codex/lisa-plugin-detection.js.map +0 -1
|
@@ -0,0 +1,1030 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lisa-repair-intake
|
|
3
|
+
description: "Vendor-agnostic repair scanner…"
|
|
4
|
+
allowed-tools: ["Skill", "Bash", "Read", "Write", "Edit"]
|
|
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 and
|
|
11
|
+
close-out** roles and moves work *unstuck* or *fully closed*:
|
|
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.) For a stalled **build**, repair-intake first diagnoses *why* it stalled by
|
|
18
|
+
inspecting its PRs and deploys. A PR that **already merged** is recovered by applying the env
|
|
19
|
+
transition build-intake never got to (its merge gate left the item `claimed` when the merge landed
|
|
20
|
+
after its agent returned) — no re-dispatch. A PR that is merely **behind its base** (`BEHIND`, no
|
|
21
|
+
conflict) is **re-synced in place** with `gh pr update-branch` so the already-enabled auto-merge can
|
|
22
|
+
finally land — a clean rebase needs no human, and leaving it stranded is the exact gap that lets an
|
|
23
|
+
auto-merge PR sit unmerged forever. A **true merge conflict** is first given **one bounded in-place
|
|
24
|
+
re-dispatch** to the build agent — whose `drive-pr-to-merge` fix-mode loop resolves conflicts — because
|
|
25
|
+
a conflict, unlike a failing external check, is fixable by re-running the build; only a conflict that
|
|
26
|
+
survives that single attempt (or that the agent says needs design input) becomes a fix ticket. The
|
|
27
|
+
genuinely non-resolvable blockers — failing checks / unaddressed CodeRabbit or `CHANGES_REQUESTED`
|
|
28
|
+
review / a failed deploy — get a build-ready leaf fix ticket with the item moved to `blocked` (blocked
|
|
29
|
+
by that ticket) instead of blindly re-dispatching the agent, which would just churn against them.
|
|
30
|
+
- **Recoverable blocked** — an item in `blocked` whose blocker may now be gone. The blocker is
|
|
31
|
+
one of three classes, and repair re-checks **all** of them, not just dependencies: (a) an
|
|
32
|
+
`is blocked by` **dependency** has since closed; (b) a **validation / quality-gate self-block** —
|
|
33
|
+
the item was bounced to `blocked` by its own pre-flight `verify`/`validate` gate (missing
|
|
34
|
+
Validation Journey, Sign-in Required, Acceptance Criteria, etc.) with **no dependency at all**,
|
|
35
|
+
and a human has since edited the item to add what the gate demanded; or (c) **clarifying
|
|
36
|
+
questions answered** / an **ambiguity** research can now settle. A self-block (b) is the common
|
|
37
|
+
one missed by dependency-only re-checks: nothing else is blocking it, so re-running the same gate
|
|
38
|
+
against its current content is the only way to know it is now passable.
|
|
39
|
+
- **Terminal-open drift** — an item already carrying its true terminal lifecycle role (for
|
|
40
|
+
example GitHub `status:done`) but still open/active in the provider's native state.
|
|
41
|
+
- **Rollup drift** — a parent/container item (Epic, Story, PRD, Linear Project, or equivalent)
|
|
42
|
+
whose own lifecycle state does not match the roll-up of its children's states per
|
|
43
|
+
`leaf-only-lifecycle`. This covers the *completed* case (all children terminal → close the parent
|
|
44
|
+
out) **and** the *intermediate-env* case (all children shipped to an env like `On Stg`, but the
|
|
45
|
+
parent never advanced — including a parent left stranded in a status it should never carry).
|
|
46
|
+
- **Stale-`ready` container** — a parent/container (open child work, or a childless
|
|
47
|
+
**Epic**) wrongly carrying the build-ready role. This is a leaf-only-invariant violation
|
|
48
|
+
the build-intake claim gate deliberately leaves for a human; repair-intake reconciles it by
|
|
49
|
+
rolling the parent up from its children (with an audit note), so a container never sits in `ready`
|
|
50
|
+
indefinitely.
|
|
51
|
+
- **Missing official ready-label drift** — a GitHub issue that is missing every configured Lisa
|
|
52
|
+
lifecycle label. repair-intake classifies it as a PRD or build ticket and adds the configured
|
|
53
|
+
`ready` label (`prd-ready` for a PRD, build `status:ready` for a ticket) so normal intake can see
|
|
54
|
+
it; if the later intake/implement gate finds the item incomplete, it moves the item to `blocked`.
|
|
55
|
+
- **Missing native child link drift** — a GitHub parent (a `ticketed`/other open non-product-owned
|
|
56
|
+
PRD, **or a build Epic/Story container**) whose children are discoverable — from the generated-work
|
|
57
|
+
section/comment for a PRD, or from body parentage (`Parent: #<n>` / `Parent Epic: #<n>`) for a build
|
|
58
|
+
container resolved via the documented hierarchy fallback — but whose native sub-issue list is missing
|
|
59
|
+
one or more of those children. This is the common shape when children were created by an external
|
|
60
|
+
generator (e.g. Codex) or an older write path that recorded parentage only in prose and never called
|
|
61
|
+
`addSubIssue`. repair-intake replays the `prd-backlink` / `github-write-issue` native-linking contract
|
|
62
|
+
and attaches the missing same-repo children idempotently, so rollup and the GitHub UI can rely on the
|
|
63
|
+
native graph again.
|
|
64
|
+
|
|
65
|
+
This skill is the symmetric counterpart to `lisa-intake`. It reuses the same queue-detection,
|
|
66
|
+
the same agent-team orchestration, the same "don't ask, just run" confirmation policy, and the
|
|
67
|
+
same per-item surfaces the vendor intakes use (`lisa:<source>-to-tracker` dry-run for PRDs;
|
|
68
|
+
`lisa:<tracker>-agent` + the scanner's lifecycle transitions for build) — it differs in *which
|
|
69
|
+
roles it scans* and, for stalled/blocked work, *that it skips the claim step* (the item is already
|
|
70
|
+
claimed/blocked). Close-out candidates do not dispatch agents; they only reconcile terminal
|
|
71
|
+
lifecycle state with provider-native closure and rollup state.
|
|
72
|
+
|
|
73
|
+
## Public contract
|
|
74
|
+
|
|
75
|
+
```text
|
|
76
|
+
/lisa:repair-intake <queue> [intake_mode=prd|build|both] [stale_after=2h] [max_candidates=100] [force=true]
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
| Token | Meaning | Default |
|
|
80
|
+
|-------|---------|---------|
|
|
81
|
+
| `<queue>` | Same queue identifier `lisa-intake` accepts (see Source dispatch). Required. | — |
|
|
82
|
+
| `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 → `both` when both namespaces exist, else whichever lifecycle exists. | `both` for dual GitHub queues; otherwise infer |
|
|
83
|
+
| `stale_after` | How long since the last state-changing transition into the in-progress role, or since the last human / PR-side forward-progress activity, before an in-progress item counts as stalled. Automation self-comments do not reset this clock. 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. | `2h` |
|
|
84
|
+
| `max_candidates` | Cap on how many stuck/close-out candidates to enumerate and evaluate. Repair every materially actionable candidate within this bounded set, then stop. Overrides config. | `100` |
|
|
85
|
+
| `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` |
|
|
86
|
+
|
|
87
|
+
## Confirmation policy
|
|
88
|
+
|
|
89
|
+
Do NOT ask the caller whether to proceed. Once invoked with a queue, run the cycle to
|
|
90
|
+
completion. The caller (a human at the CLI or a scheduled cron) has already authorized the run
|
|
91
|
+
by invoking the skill; re-prompting defeats the purpose of a background repair sweep.
|
|
92
|
+
|
|
93
|
+
Specifically forbidden:
|
|
94
|
+
|
|
95
|
+
- Previewing projected scope (number of stuck items, projected re-dispatch count, write counts)
|
|
96
|
+
and asking whether to continue.
|
|
97
|
+
- Offering A/B/C-style choices like "repair / skip / report-only" — the documented behavior IS
|
|
98
|
+
the default.
|
|
99
|
+
- Pausing because many items are stuck, an item looks complex, or a repair is likely to land
|
|
100
|
+
the item back in `blocked`. Returning an item to `blocked` with a current, accurate note is a
|
|
101
|
+
valid outcome of the repair lifecycle, not a failure.
|
|
102
|
+
- Pausing because a re-dispatch looks expensive. The cost of one cycle is bounded by
|
|
103
|
+
`max_candidates` and the actionable subset inside that cap; the cost of stalling a scheduled
|
|
104
|
+
cron waiting on a human is unbounded.
|
|
105
|
+
|
|
106
|
+
The only legitimate reasons to stop early:
|
|
107
|
+
|
|
108
|
+
- Missing required input (no queue argument, missing project configuration). Surface the
|
|
109
|
+
missing value and exit.
|
|
110
|
+
- The queue itself is misconfigured (Status property missing expected values, JIRA workflow
|
|
111
|
+
can't reach required transitions). Surface and exit.
|
|
112
|
+
- No stuck/close-out candidates, or none actionable this cycle. Exit cleanly with the idle-case
|
|
113
|
+
summary.
|
|
114
|
+
|
|
115
|
+
## Orchestration: agent team
|
|
116
|
+
|
|
117
|
+
If you are NOT already operating inside an agent team (no prior successful team-creation or
|
|
118
|
+
subagent-delegation tool call in this session, not spawned into a team context), the very first
|
|
119
|
+
thing you do is establish team orchestration.
|
|
120
|
+
|
|
121
|
+
Use the team tool for the current runtime:
|
|
122
|
+
|
|
123
|
+
- Claude Code >= 2.1.178: there is no `TeamCreate` tool; the team forms automatically when you spawn
|
|
124
|
+
the first teammate with `Agent`. That first spawn should be the bounded specialist needed to start
|
|
125
|
+
this flow. On older Claude Code that still exposes `TeamCreate`, the explicit team-create path is
|
|
126
|
+
also acceptable.
|
|
127
|
+
- Codex: do not call `TeamCreate`; Codex does not expose that Claude tool. Use `tool_search`
|
|
128
|
+
with a query like `multi-agent tools` to load `multi_agent_v1`, then use
|
|
129
|
+
`multi_agent_v1.spawn_agent` for teammate delegation. Treat the first successful `spawn_agent`
|
|
130
|
+
call as establishing team orchestration.
|
|
131
|
+
- Other runtimes: use the current runtime's tool-discovery mechanism to discover and call the
|
|
132
|
+
appropriate multi-agent/team tool.
|
|
133
|
+
|
|
134
|
+
If no team creation or subagent delegation tool is available, explicitly state that team
|
|
135
|
+
orchestration is unavailable in this runtime, continue as the lead agent, and preserve the
|
|
136
|
+
workflow's review, verification, and task-tracking obligations locally.
|
|
137
|
+
|
|
138
|
+
Until the team is established, the first Codex teammate has been spawned, or the no-team
|
|
139
|
+
fallback has been declared, do NOT call any of: `TaskCreate`, `Skill`, MCP tools
|
|
140
|
+
(Atlassian / Linear / GitHub / Notion), `Read`, `Write`, `Edit`, `Bash`, `Grep`, `Glob`.
|
|
141
|
+
The initial Claude `Agent` spawn described above is the only pre-team exception because it
|
|
142
|
+
establishes the team.
|
|
143
|
+
Scanning the queue, evaluating staleness, and dispatching per-item repairs — all of those are
|
|
144
|
+
tasks for the team you are about to create, not for the lead session before orchestration
|
|
145
|
+
exists.
|
|
146
|
+
|
|
147
|
+
If you ARE already inside an agent team (e.g., a teammate invoked this skill via the Skill
|
|
148
|
+
tool), do NOT create a second team — many harnesses reject double-creates — and do NOT collapse the nested flow into a single inline worker. A nested team-first flow must still bring in the specialists it requires by adding them to the existing team, not by doing the work itself:
|
|
149
|
+
|
|
150
|
+
- **Claude:** teams are flat and only the lead can add named teammates, so do NOT call `Agent` with a `name` from a teammate (the harness rejects it: *"Teammates cannot spawn other teammates — the team roster is flat"*). Send the team lead a message naming the specialist teammate(s) this flow needs, their task assignments, and completion criteria, then coordinate through the shared task list until they finish. An anonymous subagent (`Agent` with `name` omitted) is permitted only for bounded one-shot work whose result returns directly to you — it is not a substitute for the required lifecycle specialists.
|
|
151
|
+
- **Codex:** do NOT call `TeamCreate`. If the lead/root agent is addressable (you were given its id/handle), send it a request to `multi_agent_v1.spawn_agent` the specialist agent(s), including each agent's prompt, ownership, and expected result. If no lead handle exists but `spawn_agent` is available to you, spawn only the bounded specialist agent(s) this flow needs, `wait_agent` for their results, and relay those results upward to the parent/lead.
|
|
152
|
+
|
|
153
|
+
Treat the first successful lead-spawn request (or, on the Codex fallback, the first specialist spawn) as preserving team orchestration. Never satisfy a team-first lifecycle flow by doing all the work inline. The cycle's outer team is created by repair-intake. Each per-item repair it runs
|
|
154
|
+
(`lisa:<source>-to-tracker` for a PRD, `lisa:<tracker>-agent` for a build item) executes within
|
|
155
|
+
the same team — those skills' orchestration preambles detect the existing team and skip creating
|
|
156
|
+
a second one. One team per cron cycle.
|
|
157
|
+
|
|
158
|
+
## Source dispatch
|
|
159
|
+
|
|
160
|
+
Detect the queue type from `$ARGUMENTS` using the **exact same detection and disambiguation
|
|
161
|
+
rules as `lisa-intake`** — read that skill's "Source dispatch" section for the authoritative
|
|
162
|
+
table; the detection is identical and only the per-item action changes (repair instead of
|
|
163
|
+
claim-and-advance). The essentials, inlined here so this skill is self-complete:
|
|
164
|
+
|
|
165
|
+
| If `$ARGUMENTS` is... | Queue / lifecycle | Source/tracker key | Candidates repaired |
|
|
166
|
+
|------------------------|-------------------|--------------------|----------------------|
|
|
167
|
+
| Notion **database** URL/ID | PRD (Notion) | source=notion | `in_review`, `blocked`, terminal/open PRDs, all-terminal generated-work rollups |
|
|
168
|
+
| Confluence **space** URL/key | PRD (Confluence) | source=confluence | `in_review`, `blocked`, terminal/open PRDs, all-terminal generated-work rollups |
|
|
169
|
+
| Confluence **parent page** URL/ID | PRD (Confluence, narrowed) | source=confluence | `in_review`, `blocked`, terminal/open PRDs, all-terminal generated-work rollups |
|
|
170
|
+
| Linear **workspace** URL, **team** URL/key, or literal `linear` | PRD (Linear) | source=linear | `in_review`, `blocked`, terminal/open PRDs, all-terminal generated-work rollups |
|
|
171
|
+
| GitHub **repo** URL / `org/repo` (PRD namespace) | PRD (GitHub) | source=github | `in_review`, `blocked`, terminal/open PRDs, missing PRD child links, all-terminal generated-work rollups |
|
|
172
|
+
| GitHub **repo** URL / `org/repo` with `tracker = github` (build namespace) | Build (GitHub) | tracker=github | `claimed`, `blocked`, terminal/open issues, parent rollups (intermediate-env + all-terminal), stale-`ready` containers |
|
|
173
|
+
| GitHub **repo** URL / `org/repo` with an open issue missing configured lifecycle labels | GitHub label normalization | per classified lifecycle | add configured `prd.ready` or build `ready` |
|
|
174
|
+
| Literal `github` | GitHub; route by `intake_mode` (`prd` / `build` / `both`) | per lifecycle | per lifecycle above, plus GitHub ready-label normalization |
|
|
175
|
+
| JIRA project key or full JQL | Build (JIRA) | tracker=jira | `claimed`, `blocked`, terminal/closure verification, parent rollups (intermediate-env + all-terminal), stale-`ready` containers |
|
|
176
|
+
|
|
177
|
+
Disambiguation (same as `lisa-intake`): a `notion.so`/`notion.site` URL → Notion; an Atlassian
|
|
178
|
+
`/wiki/spaces/<KEY>` URL → Confluence (with `/pages/<id>` → parent-page narrowing); a
|
|
179
|
+
`linear.app` workspace/team URL or literal `linear` → Linear; a `github.com` URL / `<org>/<repo>`
|
|
180
|
+
token / literal `github` → GitHub; a bare token matching the JIRA project-key regex → JIRA
|
|
181
|
+
(else try Confluence space, then Linear team); a string with JQL operators → JQL. **A single-item
|
|
182
|
+
URL is out of scope** — this skill is batch-only; repair one item by hand via `lisa-implement`
|
|
183
|
+
(build) or by re-running `lisa:<source>-to-tracker` (PRD).
|
|
184
|
+
|
|
185
|
+
Role names for every vendor are resolved from `.lisa.config.json` per the `config-resolution`
|
|
186
|
+
rule — never hardcode status/label strings. The relevant repair roles:
|
|
187
|
+
|
|
188
|
+
| Lifecycle | Vendor | In-progress role key | Blocked role key | Terminal / rollup role key |
|
|
189
|
+
|-----------|--------|----------------------|------------------|----------------------------|
|
|
190
|
+
| Build | JIRA | `jira.workflow.claimed` (`In Progress`) | `jira.workflow.blocked` (`Blocked`) | env-resolved `jira.workflow.done` |
|
|
191
|
+
| Build | GitHub | `github.labels.build.claimed` (`status:in-progress`) | `github.labels.build.blocked` (`status:blocked`) | env-resolved `github.labels.build.done` (`status:done`) |
|
|
192
|
+
| Build | Linear | `linear.labels.build.claimed` (`status:in-progress`) | `linear.labels.build.blocked` (`status:blocked`) | env-resolved `linear.labels.build.done` (`status:done`) |
|
|
193
|
+
| PRD | Notion | `notion.values.in_review` (`In Review`) | `notion.values.blocked` (`Blocked`) | `notion.values.shipped` (`Shipped`) |
|
|
194
|
+
| PRD | GitHub | `github.labels.prd.in_review` (`prd-in-review`) | `github.labels.prd.blocked` (`prd-blocked`) | `github.labels.prd.shipped` (`prd-shipped`) |
|
|
195
|
+
| PRD | Linear | `linear.labels.prd.in_review` (`prd-in-review`) | `linear.labels.prd.blocked` (`prd-blocked`) | `linear.labels.prd.shipped` (`prd-shipped`) |
|
|
196
|
+
| PRD | Confluence | `confluence.parents.in_review` (page id) | `confluence.parents.blocked` (page id) | `confluence.parents.shipped` (page id) |
|
|
197
|
+
|
|
198
|
+
In addition to the lifecycle roles above, the build lifecycle defines the **`human_needed` marker** — an additive label (`jira.labels.human_needed` / `github.labels.build.human_needed` / `linear.labels.build.human_needed`, default `Human Needed` / `human-needed`) that rides alongside `blocked` when the block needs human-only input no agent or retry can supply (see `config-resolution` "Build markers"). repair-intake's interaction with the marker is asymmetric and is the whole point of the distinction below:
|
|
199
|
+
|
|
200
|
+
- The blocks repair-intake **itself writes** are the auto-recoverable kind — it files a build-ready fix ticket and moves the item `blocked` *blocked by that ticket*, expecting the next cycle to self-heal. Those are **not** `human_needed`; if such an item arrives already carrying a stale `human_needed` marker, repair-intake **clears** it (the block is no longer waiting on a human).
|
|
201
|
+
- The blocks the **vendor agent** writes when repair-intake re-dispatches it (its pre-flight gate) carry `human_needed` already — the agent owns that marker. repair-intake leaves it in place.
|
|
202
|
+
|
|
203
|
+
Resolve with the standard role-read pattern (local overrides global, default fallback):
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
read_role() {
|
|
207
|
+
local path="$1" default="$2"
|
|
208
|
+
local local_v global_v
|
|
209
|
+
local_v=$(jq -r "${path} // empty" .lisa.config.local.json 2>/dev/null)
|
|
210
|
+
global_v=$(jq -r "${path} // empty" .lisa.config.json 2>/dev/null)
|
|
211
|
+
echo "${local_v:-${global_v:-$default}}"
|
|
212
|
+
}
|
|
213
|
+
# e.g. build/github:
|
|
214
|
+
CLAIMED=$(read_role '.github.labels.build.claimed' 'status:in-progress')
|
|
215
|
+
BLOCKED=$(read_role '.github.labels.build.blocked' 'status:blocked')
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
## Access layer (which surface does each write)
|
|
219
|
+
|
|
220
|
+
repair-intake stays vendor-neutral; concrete reads/writes go through the same layers the vendor
|
|
221
|
+
intakes use. Never call Atlassian MCP or `acli` directly — go through `lisa-atlassian-access`.
|
|
222
|
+
|
|
223
|
+
| Vendor | Reads (scan / comments / links) | Writes (transition / comment / close-out) | Re-dispatch / re-validate |
|
|
224
|
+
|--------|---------------------------------|-------------------------------|---------------------------|
|
|
225
|
+
| JIRA (build) | `lisa-atlassian-access` `search-issues` / `lisa-jira-read-ticket` | `lisa-atlassian-access` `transition` / `comment` | `lisa-jira-agent` |
|
|
226
|
+
| GitHub (build) | `gh issue list` / `gh issue view --json` / `gh pr list` / GraphQL sub-issues | `gh issue edit` (labels) / `gh issue comment` / `gh issue close --reason completed` | `lisa-github-agent` |
|
|
227
|
+
| Linear (build) | Linear MCP `list_issues` / `get_issue` / `list_comments` | Linear MCP `save_issue` (labels) / `save_comment` | `lisa-linear-agent` |
|
|
228
|
+
| Notion (PRD) | `lisa-notion-access` (`query`, page comments) | `lisa-notion-access` `write-page` (status) / page comment | `lisa-notion-to-tracker` (dry-run) |
|
|
229
|
+
| GitHub (PRD) | `gh issue list/view` (PRD labels) / GraphQL sub-issues / generated-work section | `gh issue edit` / `gh issue comment` / `gh issue close --reason completed` | `lisa-github-to-tracker` (dry-run) |
|
|
230
|
+
| Linear (PRD) | Linear MCP `list_projects` / `get_project` (+ sentinel feedback issue) | Linear MCP `save_project` (labels) / `save_comment` | `lisa-linear-to-tracker` (dry-run) |
|
|
231
|
+
| Confluence (PRD) | `lisa-atlassian-access` CQL | `lisa-atlassian-access` page `parentId` update / comment | `lisa-confluence-to-tracker` (dry-run) |
|
|
232
|
+
|
|
233
|
+
## Staleness model
|
|
234
|
+
|
|
235
|
+
An in-progress item (build `claimed`, PRD `in_review`) is **stalled** when the last
|
|
236
|
+
state-changing transition into the in-progress role, or the last human / PR-side forward-progress
|
|
237
|
+
activity after that transition, is older than the `stale_after` threshold. `blocked` items are NOT
|
|
238
|
+
gated on staleness — their repairability is judged on current blocker/answer state, not elapsed
|
|
239
|
+
time.
|
|
240
|
+
|
|
241
|
+
Automation self-comments are not forward progress and must not reset the staleness clock. Status
|
|
242
|
+
comments like `[claude-build-intake] PR remains open...`, `[codex-build-intake] Follow-up pushed...`,
|
|
243
|
+
or `[lisa-repair-intake] ...` may be useful audit notes, but they cannot make a claimed item fresh
|
|
244
|
+
forever. If a provider exposes a changelog/history surface, prefer the timestamp of the last
|
|
245
|
+
transition into the claimed/In-Progress role over the item's generic `updated` timestamp. When the
|
|
246
|
+
history surface is unavailable, ignore comments whose author/marker clearly belongs to Lisa or its
|
|
247
|
+
automation agents, and use the newest human comment/edit or PR-side progress event instead.
|
|
248
|
+
|
|
249
|
+
A build `claimed` leaf whose linked PR has **already merged** (`state == MERGED`) is likewise NOT
|
|
250
|
+
gated on staleness. A merged PR is a settled terminal state, not in-flight work: the only thing
|
|
251
|
+
missing is the env transition build-intake never applied (its merge gate left the item `claimed`
|
|
252
|
+
because the merge landed after its agent returned). The recovery is judged on PR merge state, not
|
|
253
|
+
elapsed time — and crucially **post-merge activity does not defer it**. A freshly-merged PR keeps
|
|
254
|
+
producing activity that the signal below would otherwise read as keep-alive (a queued/in-progress
|
|
255
|
+
release or deploy check-run, a post-merge CodeRabbit summary comment), so gating merged-PR recovery
|
|
256
|
+
on staleness strands a *completed* leaf in `claimed` for as long as that activity keeps the clock
|
|
257
|
+
warm — exactly the failure that leaves a shipped Sub-task showing `status:in-progress` for a day
|
|
258
|
+
while its parents roll up against it. Recover it regardless of recent activity (Build `claimed`
|
|
259
|
+
decision tree step 0, and the dedicated high-confidence ordering bucket).
|
|
260
|
+
|
|
261
|
+
### Threshold resolution
|
|
262
|
+
|
|
263
|
+
1. `$ARGUMENTS` `stale_after=<dur>` (one-off override) — always wins. Parse `Nh` / `Nm` / `Nd` /
|
|
264
|
+
`0` into hours.
|
|
265
|
+
2. `.lisa.config.json` `intake.repair.staleAfterHours` (durable project default).
|
|
266
|
+
3. Built-in default: **2 hours**.
|
|
267
|
+
|
|
268
|
+
`stale_after=0` means "treat any in-progress item as stalled" — a manual full-recovery lever,
|
|
269
|
+
and the only way to resume work on a provider that exposes no reliable activity timestamp.
|
|
270
|
+
|
|
271
|
+
### Activity signal (state-change first, portable across vendors)
|
|
272
|
+
|
|
273
|
+
Compute the item's newest eligible activity timestamp from the highest-priority signal the vendor
|
|
274
|
+
exposes, and compare it to `now - stale_after`:
|
|
275
|
+
|
|
276
|
+
1. Provider-native status/label **transition** time into the in-progress role, when the provider
|
|
277
|
+
exposes it cleanly (JIRA changelog transition to `claimed` / In Progress, GitHub label event,
|
|
278
|
+
Linear state/label history, Notion/Confluence page move/status history).
|
|
279
|
+
2. Latest human lifecycle/progress **comment** or edit on the item (and, for Linear PRDs, the
|
|
280
|
+
sentinel feedback issue). Exclude automation self-comments and Lisa audit markers such as
|
|
281
|
+
`[claude-build-intake]`, `[codex-build-intake]`, `[lisa-build-intake]`, and
|
|
282
|
+
`[lisa-repair-intake]`.
|
|
283
|
+
3. For build items, latest **PR-side forward-progress activity** on the linked PR: newest commit,
|
|
284
|
+
review, check-run,
|
|
285
|
+
or PR comment.
|
|
286
|
+
4. Provider-native item `updatedAt` / `last_edited_time` / `updated` only when the provider cannot
|
|
287
|
+
expose transition/comment authorship and the timestamp is not known to be driven by automation
|
|
288
|
+
self-comments.
|
|
289
|
+
|
|
290
|
+
If ANY of these is newer than the threshold, the item is **active** → record it as `active` and
|
|
291
|
+
skip it (read-only). For build `claimed`, an open PR with recent commits/checks is active. For
|
|
292
|
+
PRD `in_review`, a recent comment or page edit is active.
|
|
293
|
+
|
|
294
|
+
Count only **forward-progress** signals as keep-alive: new commits, a review that was just
|
|
295
|
+
requested or posted, an in-progress/queued check run, a fresh progress comment. A **settled
|
|
296
|
+
blocker state** — a failing/errored check run, `CONFLICTING` mergeability, a `CHANGES_REQUESTED`
|
|
297
|
+
review, an unaddressed CodeRabbit/reviewer change request, or a failed deployment — is NOT
|
|
298
|
+
keep-alive activity: it does not reset the staleness clock. The clock runs from the last genuine
|
|
299
|
+
progress event, so a PR that has been sitting failed/conflicted/awaiting-changes for longer than
|
|
300
|
+
`stale_after` counts as stalled and is diagnosed below.
|
|
301
|
+
|
|
302
|
+
A **merged** linked PR is the same kind of non-keep-alive signal, in the other direction: the work
|
|
303
|
+
is settled and complete, so its post-merge check-runs and summary comments must NOT count as
|
|
304
|
+
keep-alive either. A build `claimed` leaf with a merged PR is recovered regardless of the staleness
|
|
305
|
+
clock (see the Staleness model note above and the dedicated ordering bucket); it is never recorded
|
|
306
|
+
`active` and skipped on the strength of post-merge activity.
|
|
307
|
+
|
|
308
|
+
If a provider cannot expose any reliable timestamp, do **not** auto-resume its in-progress
|
|
309
|
+
items unless the caller passed `stale_after=0`. (Dependency-cleared `blocked` repair still
|
|
310
|
+
proceeds — it is judged on blocker state, not time.)
|
|
311
|
+
|
|
312
|
+
## Repair decision tree
|
|
313
|
+
|
|
314
|
+
Apply per candidate. Continue through the ordered list until every candidate inside the
|
|
315
|
+
`max_candidates` cap has been evaluated. Each candidate may trigger a write (lifecycle transition,
|
|
316
|
+
native close/archive/complete, re-dispatch, or refreshed note), be recorded read-only, or be
|
|
317
|
+
recorded under Errors. Do not stop after the first write; the cap is the batch boundary.
|
|
318
|
+
|
|
319
|
+
### Build `claimed` (stalled in-progress) → diagnose blocker, else resume in place
|
|
320
|
+
|
|
321
|
+
**First check for an already-merged PR — this check is NOT gated on staleness.** Read the item's
|
|
322
|
+
linked PR state before applying the staleness gate (see "Stuck-cause diagnosis" step 1–2 for
|
|
323
|
+
discovery). If `state == MERGED`, recover it immediately via step 0's merged-PR arm regardless of
|
|
324
|
+
elapsed time or recent post-merge activity (per the Staleness model's merged-PR exemption): a merged
|
|
325
|
+
PR is a completed leaf, and deferring it behind the staleness clock is what strands shipped work in
|
|
326
|
+
`claimed`.
|
|
327
|
+
|
|
328
|
+
Only if the PR is **not** merged does the staleness gate apply. Once it passes, **diagnose why it
|
|
329
|
+
stalled** by inspecting the item's PRs and deploys (see "Stuck-cause diagnosis" below). A stalled
|
|
330
|
+
build usually stalled for a concrete external reason, and re-dispatching the agent at it will not fix
|
|
331
|
+
a PR that cannot merge or a deploy that failed — it just churns.
|
|
332
|
+
|
|
333
|
+
0. **Diagnose PR & deploy state.** Run "Stuck-cause diagnosis" below. It resolves, in order:
|
|
334
|
+
- **PR already merged** (checked first, staleness-exempt) → the build effectively completed; the
|
|
335
|
+
vendor build-intake's merge gate left the item `claimed` because the merge landed after its agent
|
|
336
|
+
returned. Do **not** re-dispatch or file anything — apply the scanner's post-agent env-resolved
|
|
337
|
+
`claimed → done` transition directly (step 2 below, env-resolved), and record it. This is the
|
|
338
|
+
recovery arm for build-intake leaving merged-but-unadvanced items in `claimed`.
|
|
339
|
+
- **PR only behind its base (a needed rebase)** → mechanically resolvable, **not** a human blocker.
|
|
340
|
+
Re-sync the branch in place so the already-enabled auto-merge can land (see diagnosis step 3).
|
|
341
|
+
Keep the item `claimed`; a later cycle confirms the merge and transitions. Do **not** file a fix
|
|
342
|
+
ticket for a clean rebase.
|
|
343
|
+
- **A true merge conflict** → **not** an immediate fix ticket. A conflict is fixable by re-running
|
|
344
|
+
the build, so attempt **one** in-place re-dispatch first (the resume sequence below; the vendor
|
|
345
|
+
agent re-enters `drive-pr-to-merge` fix mode, which resolves conflicts). Only a conflict that
|
|
346
|
+
survives that single attempt — the same conflicting head still `CONFLICTING` on a later cycle — or
|
|
347
|
+
that the agent reports needs design input, falls through to the fix-ticket path (diagnosis step 5).
|
|
348
|
+
- **A real external blocker re-running the build cannot fix** (failing checks / `CHANGES_REQUESTED` /
|
|
349
|
+
unaddressed CodeRabbit; or a failed deploy) → **do not dispatch the agent**. File a build-ready leaf
|
|
350
|
+
fix ticket for the blocker, move this item `claimed → blocked` with an `is blocked by` link to that
|
|
351
|
+
ticket, and record it. The existing "Build `blocked` → unblock if cleared" path resumes this item on
|
|
352
|
+
a later cycle once the fix ticket is terminal — a self-healing loop. Skip the resume steps below.
|
|
353
|
+
|
|
354
|
+
If the PR is healthy in-flight and no blocker is found, the work simply died mid-flight — run the **same per-item sequence
|
|
355
|
+
the vendor build-intake runs**, skipping the claim transition (the item is already `claimed`):
|
|
356
|
+
|
|
357
|
+
1. Dispatch the item to the vendor agent — `lisa-jira-agent` / `lisa-github-agent` /
|
|
358
|
+
`lisa-linear-agent` (matching the queue's tracker) — with the item ref. If repair-intake is
|
|
359
|
+
running as a teammate rather than the lead/root agent, return a structured `delegation-request`
|
|
360
|
+
to the lead instead of spawning that named peer yourself; only the lead can add named teammates
|
|
361
|
+
in Claude's flat roster. This resumes the work in place, preserving its existing branch/PR and
|
|
362
|
+
prior comments.
|
|
363
|
+
2. **On agent success**, apply the scanner's post-agent transition yourself: `claimed → done`,
|
|
364
|
+
where `done` is **env-resolved** exactly as `lisa:<tracker>-build-intake` resolves it (per
|
|
365
|
+
`config-resolution` env-keyed `done`: explicit `target_env` arg wins; else reverse-lookup the
|
|
366
|
+
env from the resulting PR's base branch via `deploy.branches`; if `done` is a map and env is
|
|
367
|
+
unresolvable, fail loudly — never guess). repair-intake owns this transition because it is
|
|
368
|
+
standing in for the scanner that never got to finish it.
|
|
369
|
+
3. **On a surfaced blocker** (agent reports it cannot proceed), leave/move the item to `blocked`
|
|
370
|
+
with a `[lisa-repair-intake]` note (see Loop prevention). When the surfaced blocker is something
|
|
371
|
+
**only a human can supply** (credentials, access/permissions, a product or scoping decision), the
|
|
372
|
+
item also carries the `human_needed` marker — the vendor agent's pre-flight gate applies it; if
|
|
373
|
+
repair-intake makes the block transition itself for such a reason, it adds the marker too. (A
|
|
374
|
+
block that another tracked ticket or retry will clear is *not* human-needed — that is the
|
|
375
|
+
auto-recoverable fix-ticket path above.)
|
|
376
|
+
|
|
377
|
+
> Do **not** reset stalled in-progress items to `ready`. Reset throws away state, makes a
|
|
378
|
+
> partially-built item look freshly human-approved to the next `lisa-intake` claim, and forces a
|
|
379
|
+
> two-cycle recovery. Resume in place.
|
|
380
|
+
|
|
381
|
+
#### Stuck-cause diagnosis: PR & deploy blockers
|
|
382
|
+
|
|
383
|
+
Run this for every stalled `claimed` build item **before** considering an agent re-dispatch. The
|
|
384
|
+
goal is to distinguish "work died mid-flight, just resume it" from "work is blocked on a concrete
|
|
385
|
+
external state that resuming the agent cannot fix."
|
|
386
|
+
|
|
387
|
+
**1. Find the associated PR(s) and deploy(s).** From the item's linked PRs (GitHub: prefer the
|
|
388
|
+
native dev-link surface — `gh issue view <n> --json closedByPullRequestsReferences` — which lists
|
|
389
|
+
merged PRs that closed the issue, then `gh pr list --search <issue-ref> --state all`; JIRA:
|
|
390
|
+
dev-status / remote links; Linear: attachments and git-branch links) and the deploy(s) for the
|
|
391
|
+
resulting merge (the env-keyed `deploy.branches` mapping from `config-resolution`). The `--state all`
|
|
392
|
+
is load-bearing: `gh pr list --search` defaults to `--state open`, so a **merged** (closed) PR is
|
|
393
|
+
invisible on that surface — the exact state this recovery path exists to catch. A merged PR linked
|
|
394
|
+
only via search (no `Closes #` / native dev link) would otherwise never be discovered, and the leaf
|
|
395
|
+
would never recover. Read each PR with the vendor's native state, e.g. GitHub
|
|
396
|
+
`gh pr view <n> --json state,mergedAt,mergeable,mergeStateStatus,reviewDecision,statusCheckRollup,comments,reviews`.
|
|
397
|
+
|
|
398
|
+
**2. PR already merged → recover, don't re-dispatch.** If `state == MERGED`, the build is effectively
|
|
399
|
+
complete and the only thing missing is the env transition the build-intake never applied (its merge
|
|
400
|
+
gate left the item `claimed` because the merge landed after its agent returned). Do **not** re-dispatch
|
|
401
|
+
or file anything: apply the scanner's post-agent env-resolved `claimed → done` transition (the
|
|
402
|
+
resume-sequence step 2, env-resolved from the merged PR's base branch) and record it as a repair
|
|
403
|
+
write. Where the env deploy is observable, confirm it did not fail first; a failed post-merge deploy
|
|
404
|
+
falls through to the blocker path (step 4).
|
|
405
|
+
|
|
406
|
+
**3. PR only behind its base → re-sync in place (mechanical, not a blocker).** If the PR is clean but
|
|
407
|
+
behind its base — `mergeStateStatus == BEHIND` while `mergeable != CONFLICTING` and no required check
|
|
408
|
+
is failing — it does **not** need a human. This is exactly the case that strands a PR forever: GitHub
|
|
409
|
+
auto-merge will not advance a `BEHIND` branch on its own, so a PR opened with `--auto` sits unmerged
|
|
410
|
+
until something rebases it. Delegate this mechanical nudge + classification to the
|
|
411
|
+
`drive-pr-to-merge` skill in **report** mode — the single source of truth for the
|
|
412
|
+
"ensure auto-merge + re-sync a clean `BEHIND` branch" primitive — so this scanner does not
|
|
413
|
+
re-implement it:
|
|
414
|
+
|
|
415
|
+
```text
|
|
416
|
+
drive-pr-to-merge pr=<n> on_blocker=report
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
In report mode it ensures auto-merge is enabled and runs `gh pr update-branch <n>` only when the
|
|
420
|
+
PR is `BEHIND`-but-clean **and** the base branch's ruleset or classic branch protection requires
|
|
421
|
+
strict up-to-date status checks (`strict_required_status_checks_policy` / `required_status_checks.strict`).
|
|
422
|
+
If strict checks are off, it does not update the branch solely because the base moved; that avoids
|
|
423
|
+
CI cancellation storms in repos where updating the PR head restarts and cancels in-flight runs. It
|
|
424
|
+
never edits code, resolves threads, or dismisses reviews. It returns a classification (`merged` /
|
|
425
|
+
`will-merge-after-resync` / `blocked:<reason>`). On a `merged` / `will-merge-after-resync` result,
|
|
426
|
+
record this as a repair write (`resynced`), keep the item `claimed`, and move on — a later cycle sees
|
|
427
|
+
the now-`CLEAN` (or merged) PR and either lets auto-merge finish or applies the merged-PR recovery in
|
|
428
|
+
step 2. Only if `gh pr update-branch` itself reports a conflict it cannot apply does the PR become a
|
|
429
|
+
true conflict (step 4). Honor the backoff window so repeated cycles don't re-issue `update-branch` on
|
|
430
|
+
an unchanged head (Loop prevention). For JIRA/Linear items the PR is still the GitHub PR backing the
|
|
431
|
+
branch — operate on it the same way.
|
|
432
|
+
|
|
433
|
+
**4. Classify as a blocker.** Treat any of these as a real external blocker:
|
|
434
|
+
|
|
435
|
+
- **True merge conflict** — `mergeable = CONFLICTING` or `mergeStateStatus = DIRTY` (overlapping
|
|
436
|
+
changes a plain rebase cannot resolve), or `gh pr update-branch` (step 3) reported a conflict. A
|
|
437
|
+
merely `BEHIND` branch is **not** here — it was re-synced in step 3. Unlike the other classes below, a
|
|
438
|
+
conflict is **resolvable by re-running the build**, so step 5 gives it one in-place re-dispatch before
|
|
439
|
+
filing — see its conflict-first rule.
|
|
440
|
+
- **Failing required checks** — `statusCheckRollup` has a `FAILURE`/`ERROR`/`TIMED_OUT` conclusion,
|
|
441
|
+
or `mergeStateStatus = UNSTABLE`/`BLOCKED` due to checks.
|
|
442
|
+
- **Change requests outstanding** — `reviewDecision = CHANGES_REQUESTED`, or unresolved CodeRabbit
|
|
443
|
+
(or other reviewer) comments that request changes and have not been addressed by a newer commit.
|
|
444
|
+
- **Branch-protection / approvals blocked** — `mergeStateStatus = BLOCKED` for a reason other than
|
|
445
|
+
a transient check still running.
|
|
446
|
+
- **Failed deploy** — the deployment for the item's merge/branch reports a failed/errored status
|
|
447
|
+
(failed deploy workflow run, failed deployment status, or the project's deploy check is red).
|
|
448
|
+
|
|
449
|
+
A check that is still **queued/in progress**, or a `CLEAN`/`HAS_HOOKS` mergeable PR with no
|
|
450
|
+
outstanding change request, is **not** a blocker — that is normal in-flight state. (Such a PR with
|
|
451
|
+
recent check/commit activity would already have been caught as `active` by the staleness gate.)
|
|
452
|
+
|
|
453
|
+
**5. On a blocker found → file a leaf fix ticket + block the item.**
|
|
454
|
+
|
|
455
|
+
**Conflict-first exception (try to resolve before filing).** A *true merge conflict* — and only a
|
|
456
|
+
conflict, not failing checks, change requests, or a failed deploy — is fixable by re-running the build:
|
|
457
|
+
the vendor agent's `drive-pr-to-merge` fix-mode loop resolves conflicts. So before filing a fix ticket
|
|
458
|
+
for a conflict, give the item **one** in-place re-dispatch: run the resume-in-place sequence (steps 1–3
|
|
459
|
+
of the parent path above), which re-enters `drive-pr-to-merge` in fix mode against the existing PR.
|
|
460
|
+
Bound it to a single attempt per conflicting head — when you re-dispatch, post a `[lisa-repair-intake]
|
|
461
|
+
conflict-resolve-attempt: <item-ref>@<head-sha>` marker keyed on the PR head SHA. On a later cycle, if
|
|
462
|
+
that marker already exists for the **same** head SHA and the PR is still `CONFLICTING`, the attempt
|
|
463
|
+
failed: stop retrying and file the fix ticket below. File immediately (skip the attempt) if the agent
|
|
464
|
+
reports the conflict needs design input. Every other blocker class files the fix ticket with no
|
|
465
|
+
re-dispatch. Honor the backoff window / state fingerprint (Loop prevention) so the re-dispatch is never
|
|
466
|
+
re-issued against an unchanged conflicting head.
|
|
467
|
+
|
|
468
|
+
1. **File one build-ready leaf fix ticket** per distinct blocker via `lisa-tracker-write` (the
|
|
469
|
+
vendor-neutral leaf writer + validation gate; never a vendor `*-write-*` skill directly),
|
|
470
|
+
`issue_type: Bug` for a failing-check/conflict/failed-deploy, `Task` for review-feedback
|
|
471
|
+
follow-up, `build_ready: true` so it auto-builds. The ticket MUST name: the blocked item + its
|
|
472
|
+
PR/deploy URL, the exact blocker (conflict / which checks failed with their logs link / which
|
|
473
|
+
change requests / which deploy run), three-audience description, and Gherkin acceptance criteria
|
|
474
|
+
for "PR is mergeable / deploy is green."
|
|
475
|
+
2. **Transition the stalled item `claimed → blocked`** and add an **`is blocked by`** link to the
|
|
476
|
+
new fix ticket (vendor-native: JIRA issue link `is blocked by`; GitHub/Linear `Blocked by:` line
|
|
477
|
+
+ label). Post a `[lisa-repair-intake]` note naming what it is blocked by and why. This block is
|
|
478
|
+
**auto-recoverable** — the fix ticket will build and close on its own — so do **not** add the
|
|
479
|
+
`human_needed` marker, and if the item already carries a stale `human_needed` label, remove it
|
|
480
|
+
here (it is no longer waiting on a human). The `human_needed` marker is reserved for blocks a
|
|
481
|
+
human must clear; this one a later cycle clears automatically.
|
|
482
|
+
3. **Record it** as a repair write. Do **not** dispatch the vendor agent for this item this cycle.
|
|
483
|
+
|
|
484
|
+
The item now sits in `blocked`; once the fix ticket reaches a terminal state, the **Build
|
|
485
|
+
`blocked` → unblock if cleared** path (next section) detects the cleared `is blocked by`
|
|
486
|
+
dependency and resumes the original in place — a self-healing loop.
|
|
487
|
+
|
|
488
|
+
**Idempotency.** Before filing, check for an **open** fix ticket already carrying the marker
|
|
489
|
+
`[lisa-repair-intake] blocker:<item-ref>/<blocker-key>` (blocker-key is a stable slug of the
|
|
490
|
+
blocker, e.g. `pr-1234/merge-conflict` or `pr-1234/checks-failing`). If one exists, reference it
|
|
491
|
+
and ensure the `is blocked by` link is present rather than creating a duplicate. Honor the backoff
|
|
492
|
+
window and state fingerprint (Loop prevention) so re-runs over the same unchanged blocker are no-ops.
|
|
493
|
+
|
|
494
|
+
### Build `blocked` → re-evaluate, unblock if cleared
|
|
495
|
+
|
|
496
|
+
1. Read the block reason and classify the blocker (see Blocker classification & clearing). An item
|
|
497
|
+
may be held by a **dependency**, by a **validation / quality-gate self-block**, by a
|
|
498
|
+
**deployed / runtime verification failure**, by an **ambiguity**, or by more than one at once.
|
|
499
|
+
Re-check **every** class present — do not stop at "no `is blocked by` links, therefore nothing
|
|
500
|
+
to do." A self-block has zero dependencies by definition, yet is fully re-checkable.
|
|
501
|
+
2. **Dependency cleared** — if every parsed `is blocked by` dependency is **cleared** → move
|
|
502
|
+
`blocked → claimed`, then run the same agent-dispatch + post-agent `claimed → done` sequence as
|
|
503
|
+
the stalled-`claimed` path above (one-cycle recovery). If the agent re-blocks, move back to
|
|
504
|
+
`blocked` — a valid outcome.
|
|
505
|
+
3. **Validation / quality-gate self-block re-check** — if the block reason is a pre-flight
|
|
506
|
+
`verify`/`validate` gate failure (its `[lisa-*]` block note carries a gate marker + a "Missing
|
|
507
|
+
requirements" list and there is **no** open `is blocked by` dependency), re-run the **same gate**
|
|
508
|
+
against the item's **current** content via `lisa-tracker-validate` (read-only; the vendor-neutral
|
|
509
|
+
gate `lisa:<tracker>-build-intake` and `lisa:<tracker>-write-*` already use). This is the build
|
|
510
|
+
mirror of the PRD `blocked → re-validate` path below.
|
|
511
|
+
- **PASS now** (the human added what was missing) → move `blocked → claimed` and resume exactly
|
|
512
|
+
as in (2): agent-dispatch + post-agent `claimed → done`.
|
|
513
|
+
- **Still FAIL** → stay `blocked`, but refresh the note with the **current** (usually smaller)
|
|
514
|
+
missing-requirement set so the human sees what remains. Because the fingerprint includes the
|
|
515
|
+
gate verdict + missing-requirement set (Loop prevention), a partial human fix changes the
|
|
516
|
+
fingerprint and re-checks next cycle, while a truly-unchanged gate result stays in backoff.
|
|
517
|
+
4. **Deployed / runtime verification blocker re-check** — if the block reason is a failed
|
|
518
|
+
*deployed* or *runtime* verification (a smoke/E2E/health check or manual probe against a live
|
|
519
|
+
environment that errored — e.g. an authenticated endpoint returning 500, a deploy health check
|
|
520
|
+
red, a seeded-data assertion failing), re-check by **reproducing the original failing check with
|
|
521
|
+
the same context it used**: the same auth identity/credentials, the same target environment, the
|
|
522
|
+
same route, and the same scope/parameters. A probe that does **not** exercise the failed path is
|
|
523
|
+
**not** evidence the blocker cleared — an *anonymous* request to an *auth-gated* resource, a
|
|
524
|
+
request against a different environment, or a narrower scope can all return a healthy status
|
|
525
|
+
while the originally-failing path is still broken. (This exact false-negative — an unauthenticated
|
|
526
|
+
`GET` to an auth-gated resource returning 200 without touching the failing table — wrongly unblocked
|
|
527
|
+
a build item whose authenticated path was still 500ing, sending it `ready → claimed → blocked` again.)
|
|
528
|
+
- **Reproduces clean now** (the *same* check that failed now passes) → move `blocked → claimed`
|
|
529
|
+
and resume as in (2).
|
|
530
|
+
- **Still failing** → stay `blocked`; refresh the note with the current observed result. Because
|
|
531
|
+
the root cause is external (a deployed defect, not item content), prefer filing/keeping a
|
|
532
|
+
build-ready fix ticket and an `is blocked by` link to it (the "real external blocker" path),
|
|
533
|
+
so a later cycle self-heals when that ticket goes terminal.
|
|
534
|
+
- **Cannot reproduce this cycle** (the agent lacks the credentials/env access to run the original
|
|
535
|
+
check) → stay `blocked`; do **not** unblock on the absence of a reproduction. If the missing
|
|
536
|
+
access is human-only, apply the `human_needed` marker. Never unblock a deployed-verification
|
|
537
|
+
blocker on a weaker signal than the one that set it.
|
|
538
|
+
5. If the block was an **ambiguity** research can settle and no dependency remains → run the
|
|
539
|
+
research needed (`lisa-codebase-research` / `lisa-product-walkthrough`); if resolved, proceed
|
|
540
|
+
as in (2).
|
|
541
|
+
6. Else → still blocked. Refresh the note with the current reason (Loop prevention) and leave it
|
|
542
|
+
`blocked`.
|
|
543
|
+
|
|
544
|
+
### Build terminal-open → native close / complete / resolve
|
|
545
|
+
|
|
546
|
+
For each build item that already carries the env-resolved true terminal `done` role but is still
|
|
547
|
+
native-open / active / unresolved:
|
|
548
|
+
|
|
549
|
+
1. Verify the item is a **leaf** or a **rollup parent whose all required children are terminal**.
|
|
550
|
+
If it is a parent with incomplete children, do not close it; refresh a `[lisa-repair-intake]`
|
|
551
|
+
note naming the incomplete child set.
|
|
552
|
+
2. Verify the terminal `done` role is the true final value per `leaf-only-lifecycle` and
|
|
553
|
+
`config-resolution` env-keyed `done`. Intermediate env labels (for example `status:on-dev` or
|
|
554
|
+
`status:on-stg`) are not terminal and must stay open.
|
|
555
|
+
3. Perform the provider-native terminal action idempotently:
|
|
556
|
+
- GitHub: `gh issue close <number> --repo <org>/<repo> --reason completed`.
|
|
557
|
+
- Linear: move the issue to the configured Done / Completed native workflow state if available;
|
|
558
|
+
otherwise record the missing native state as a setup error.
|
|
559
|
+
- JIRA: verify it is resolved / closed (`statusCategory = Done`, resolution set if required);
|
|
560
|
+
if not, transition through the configured terminal workflow path or report the missing setup.
|
|
561
|
+
4. Post a compact `[lisa-repair-intake]` note only when the native close-out changed state or when
|
|
562
|
+
an actionable setup error must be surfaced. Do not spam already-closed terminal items.
|
|
563
|
+
|
|
564
|
+
### Build parent rollup reconciliation (intermediate-env or terminal close-out)
|
|
565
|
+
|
|
566
|
+
For each parent/container item (an Epic, a Linear Project, or any item — of any type — with open child work),
|
|
567
|
+
reconcile its lifecycle state with the roll-up of its children — **including the intermediate-env
|
|
568
|
+
case**, not only fully-terminal close-out. This is the recovery-side complement to the forward
|
|
569
|
+
rollup the `*-sync --rollup` skills perform; it catches a parent that was never rolled up (or was
|
|
570
|
+
left in a status it should not carry, including a stale build-ready `ready`).
|
|
571
|
+
|
|
572
|
+
1. Read the child set using the vendor-native hierarchy first (GitHub sub-issues, JIRA
|
|
573
|
+
Epic/parent/sub-task hierarchy, Linear project/parent/sub-issues), with the same fallbacks the
|
|
574
|
+
vendor read/sync skills document. **Record which children were resolved natively vs. only via the
|
|
575
|
+
prose/body-parentage fallback** — the gap between the two sets is repairable native-link drift.
|
|
576
|
+
1a. **Heal native child links before rolling up (GitHub).** Whenever the resolved child set
|
|
577
|
+
contains same-repo children that are *not* in the parent's native `subIssues` graph — the typical
|
|
578
|
+
case when the children carry `Parent: #<n>` / `Parent Epic: #<n>` in prose but were never attached
|
|
579
|
+
(external generators like Codex, or an older write path) — attach each missing same-repo child as a
|
|
580
|
+
native sub-issue using the identical idempotent `addSubIssue` contract the "GitHub PRD missing child
|
|
581
|
+
links" path documents below: dedupe by `owner/repo#number`, treat "already linked" as success, keep
|
|
582
|
+
cross-repo/cross-vendor children documented-only with a warning, and on `subIssues`/`addSubIssue`
|
|
583
|
+
unavailability record a capability warning and continue. A build parent attaches the children
|
|
584
|
+
resolved by its hierarchy (its Stories/Sub-tasks), not only empty-parent-token top-level work — the
|
|
585
|
+
PRD top-level-only restriction is a PRD rule, not a build one. Record repaired refs in the rollup
|
|
586
|
+
state fingerprint so repeated cycles do not re-post. Do this even when step 2 derives `unchanged`:
|
|
587
|
+
the native graph is what the GitHub UI rollup and progress bar depend on, independently of the
|
|
588
|
+
parent's status.
|
|
589
|
+
2. **Compute the derived parent state** bottom-up per the `leaf-only-lifecycle` **Parent status
|
|
590
|
+
rollup** state machine, evaluated over the env ladder `in-progress < dev < staging <
|
|
591
|
+
production` (the ordered keys of the env-keyed `done` map): any required child blocked →
|
|
592
|
+
`blocked`; else every required child shipped to some env → the **least-advanced** env among
|
|
593
|
+
them (e.g. all `On Stg` → `On Stg`); else any child started → `claimed`; else unchanged.
|
|
594
|
+
Optional / won't-do / not-planned children are terminal-but-dropped and do not hold the parent
|
|
595
|
+
open.
|
|
596
|
+
3. **If the derived state differs from the parent's current state, apply it** via the vendor's
|
|
597
|
+
lifecycle write (JIRA transition, GitHub/Linear label swap keeping exactly one `status:*`),
|
|
598
|
+
removing any conflicting stale build lifecycle role — **including a stale `ready`** the parent
|
|
599
|
+
should never carry. Post an idempotent `[lisa-repair-intake]` rollup note naming the derived
|
|
600
|
+
state and the child tally (honor the backoff window + fingerprint).
|
|
601
|
+
4. **Perform native closure only at the true terminal `done`.** When — and only when — the derived
|
|
602
|
+
env is the production/terminal value, finalize through the provider-native mechanism (GitHub
|
|
603
|
+
`gh issue close --reason completed`, Linear move to Done state, JIRA resolved/closed verified at
|
|
604
|
+
`statusCategory = Done`). An intermediate-env rollup (`On Dev`/`On Stg`) advances the parent's
|
|
605
|
+
status but **must not** close it — it is still open per `leaf-only-lifecycle`.
|
|
606
|
+
5. If the derived state is `unchanged` (children exist but none started) or the required set is
|
|
607
|
+
ambiguous / inaccessible, leave the parent as-is and record it as `active` or `still_blocked`
|
|
608
|
+
with the current child tally; never guess a transition.
|
|
609
|
+
|
|
610
|
+
### PRD `in_review` (stalled in-progress) → re-run validate→route
|
|
611
|
+
|
|
612
|
+
After the staleness gate passes, run the **same dry-run validate→route pipeline the vendor PRD
|
|
613
|
+
intake runs per item**, targeted at this single PRD and **skipping the claim** (it is already
|
|
614
|
+
`in_review`):
|
|
615
|
+
|
|
616
|
+
1. Invoke `lisa:<source>-to-tracker` with `dry_run: true` and the PRD's URL (source = the queue's
|
|
617
|
+
PRD vendor: `notion-to-tracker` / `confluence-to-tracker` / `linear-to-tracker` /
|
|
618
|
+
`github-to-tracker`). This indirectly runs `lisa-tracker-source-artifacts`,
|
|
619
|
+
`lisa-product-walkthrough`, and the `lisa-tracker-validate` gate, returning a structured
|
|
620
|
+
PASS/FAIL report with `prd_anchor` snippets — the same report the PRD intake consumes.
|
|
621
|
+
2. **On PASS** → re-invoke `lisa:<source>-to-tracker` with `dry_run: false` to write the tickets
|
|
622
|
+
(its full run already writes the PRD back-link via `lisa-prd-backlink`), run the
|
|
623
|
+
`lisa-prd-ticket-coverage` audit as the PRD intake does, then transition the PRD to its
|
|
624
|
+
`ticketed` role via the access layer.
|
|
625
|
+
3. **On FAIL** → post the clarifying-question comments grouped by `prd_anchor` (page-level for
|
|
626
|
+
`prd_anchor: null`), tagged `[lisa-repair-intake]` (Loop prevention), and transition to
|
|
627
|
+
`blocked`.
|
|
628
|
+
|
|
629
|
+
### PRD `blocked` → re-validate if new answers exist
|
|
630
|
+
|
|
631
|
+
1. Determine whether **new clarifying answers** exist: any comment/update on the PRD newer than
|
|
632
|
+
the last `[lisa-repair-intake]` note or the original `blocked` note. For Linear include the
|
|
633
|
+
sentinel feedback issue and anchored sub-issue comments; for Confluence include inline/footer
|
|
634
|
+
comments where the access layer exposes them; for Notion include page comments and
|
|
635
|
+
`last_edited_time`.
|
|
636
|
+
2. If new answers exist → run the `lisa:<source>-to-tracker` dry-run validate→route pipeline as
|
|
637
|
+
in PRD `in_review` above (skipping claim). PASS → `ticketed`; FAIL → refresh note, stay
|
|
638
|
+
`blocked`.
|
|
639
|
+
3. If no new answers and no dependency change → leave `blocked` untouched (subject to the
|
|
640
|
+
backoff window — do not re-post an identical note).
|
|
641
|
+
|
|
642
|
+
### PRD terminal-open → close / archive source artifact
|
|
643
|
+
|
|
644
|
+
For each PRD source artifact that already carries the configured terminal source role (`shipped`
|
|
645
|
+
for generated-work completion, or a source-specific terminal role that the configured PRD source
|
|
646
|
+
declares closed-out) but is still native-open / active:
|
|
647
|
+
|
|
648
|
+
1. Verify the PRD's generated top-level work is terminal per `prd-lifecycle-rollup`, unless the
|
|
649
|
+
source artifact is already in a stronger product-owned terminal role that explicitly permits
|
|
650
|
+
closure. Do not move a PRD out of `draft` or `verified`.
|
|
651
|
+
2. Close or archive through the source vendor's native mechanism where one exists:
|
|
652
|
+
- GitHub: close the PRD issue with `--reason completed`.
|
|
653
|
+
- Linear: archive/close the PRD project through Linear MCP when supported by the workspace.
|
|
654
|
+
- Confluence/Notion: archive the page only when the access layer exposes a supported archival
|
|
655
|
+
action; otherwise record a capability-aware no-op.
|
|
656
|
+
3. Never set `verified`; `/lisa:verify-prd` remains the only automated writer of the verified
|
|
657
|
+
role. This path only reconciles an already-terminal PRD with native closure.
|
|
658
|
+
|
|
659
|
+
### PRD rollup with all generated work terminal → ship and close out
|
|
660
|
+
|
|
661
|
+
For each PRD in `ticketed` or another non-product-owned open PRD role whose generated top-level
|
|
662
|
+
work is fully terminal:
|
|
663
|
+
|
|
664
|
+
1. Read the generated top-level child set exactly as `prd-ticket-coverage` / the vendor PRD intake
|
|
665
|
+
does: native PRD children where supported, plus the durable generated-work section fallback.
|
|
666
|
+
2. Evaluate terminal state using `prd-lifecycle-rollup`'s vendor predicate. A generated Epic or
|
|
667
|
+
Story is terminal only when it has itself rolled up and closed out; do not re-derive its leaf
|
|
668
|
+
descendants directly when its own state is still open.
|
|
669
|
+
3. Transition the PRD to the configured `shipped` role.
|
|
670
|
+
4. Close/archive the PRD source artifact through the vendor-native close-out mechanism where
|
|
671
|
+
supported. This repair path is the explicit close-out sweep for PRDs whose child work is done;
|
|
672
|
+
it does not set `verified` and does not run `/lisa:verify-prd`.
|
|
673
|
+
5. If generated work is missing, ambiguous, or partially incomplete, leave the PRD open and report
|
|
674
|
+
the incomplete child set. Never close a PRD on partial completion.
|
|
675
|
+
|
|
676
|
+
### GitHub PRD missing child links → native sub-issue repair
|
|
677
|
+
|
|
678
|
+
For each open GitHub PRD in `ticketed` or another non-product-owned PRD role, compare the durable
|
|
679
|
+
generated-work fallback against the PRD's native sub-issue graph and repair missing native links.
|
|
680
|
+
This is the recovery counterpart to `lisa-prd-backlink`'s GitHub native parent-linking section:
|
|
681
|
+
PRD intake/backlink should attach generated top-level work as native PRD children when possible,
|
|
682
|
+
but repair-intake must heal the graph when that write was skipped, failed, or later drifted.
|
|
683
|
+
|
|
684
|
+
1. Read the generated work exactly as PRD rollup does:
|
|
685
|
+
- Prefer the machine-readable `## Tickets` / `## Generated Work` section (`lisa:gw` tokens).
|
|
686
|
+
- If the machine-readable section is absent but an older Lisa ticketing comment exists, parse only
|
|
687
|
+
its structured `Top-level work:` block as a compatibility fallback. Do not scrape arbitrary
|
|
688
|
+
prose.
|
|
689
|
+
2. Select only generated **top-level** work:
|
|
690
|
+
- `lisa:gw` entries whose `parent` token is empty.
|
|
691
|
+
- Older ticketing-comment entries under `Top-level work:`.
|
|
692
|
+
Leaf Sub-tasks and descendant Stories are never direct PRD children.
|
|
693
|
+
3. Restrict native repair to same-repo GitHub issues. Cross-repo or cross-vendor generated work stays
|
|
694
|
+
documented-only; record a warning instead of failing.
|
|
695
|
+
4. Read the PRD's existing native sub-issues with the same GraphQL `subIssues` query documented by
|
|
696
|
+
`lisa-prd-backlink` / `lisa-github-read-issue`, and dedupe by child-ref
|
|
697
|
+
(`owner/repo#number`).
|
|
698
|
+
5. For each missing same-repo top-level child, resolve node IDs and call the same GitHub GraphQL
|
|
699
|
+
mutation as `prd-backlink`:
|
|
700
|
+
|
|
701
|
+
```graphql
|
|
702
|
+
mutation($parentId:ID!,$childId:ID!){
|
|
703
|
+
addSubIssue(input:{issueId:$parentId,subIssueId:$childId}){issue{number}subIssue{number}}
|
|
704
|
+
}
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
Treat "already linked" duplicate rejections as success. If `subIssues` / `addSubIssue` is
|
|
708
|
+
unavailable, leave the documented generated-work fallback intact, record a capability warning, and
|
|
709
|
+
continue.
|
|
710
|
+
6. Post one idempotent `[lisa-repair-intake]` note when a missing native PRD child link is repaired
|
|
711
|
+
or when the native-link capability is unavailable. Include the generated top-level child set, the
|
|
712
|
+
pre-existing native child set, and repaired child refs in the state fingerprint so repeated cycles
|
|
713
|
+
do not spam comments.
|
|
714
|
+
7. Do not transition the PRD lifecycle merely because child links were repaired. Rollup/ship remains
|
|
715
|
+
governed by the PRD rollup path after the child graph is complete.
|
|
716
|
+
|
|
717
|
+
### GitHub missing official ready-label normalization → configured ready
|
|
718
|
+
|
|
719
|
+
For GitHub queues, enumerate open issues that have **no configured Lisa lifecycle label** in the
|
|
720
|
+
active lifecycle namespace(s). This is the repair path for issues created by older tools or humans
|
|
721
|
+
with labels like `build-ready`, or with no Lisa status label at all, that are invisible to
|
|
722
|
+
`lisa-intake`, whose scanner only reads the configured `ready` labels.
|
|
723
|
+
|
|
724
|
+
1. Resolve configured lifecycle labels from `.lisa.config.json` / `.lisa.config.local.json`:
|
|
725
|
+
- PRD lifecycle labels: `draft`, `ready`, `in_review`, `blocked`, `ticketed`, `shipped`,
|
|
726
|
+
`verified` when configured.
|
|
727
|
+
- Build lifecycle labels: `ready`, `claimed`, `blocked`, every env-resolved `done` value,
|
|
728
|
+
intermediate status labels where configured, and `human_needed`.
|
|
729
|
+
2. Query open GitHub issues that are missing all configured lifecycle labels for the lifecycle(s)
|
|
730
|
+
selected by `intake_mode`. If `intake_mode=prd`, only PRD-classified issues are normalized. If
|
|
731
|
+
`intake_mode=build`, every non-PRD issue is normalized as a build ticket. If `intake_mode=both`,
|
|
732
|
+
classify PRDs first and normalize all remaining issues as build tickets.
|
|
733
|
+
3. Classify the issue:
|
|
734
|
+
- **PRD** if it has PRD labels/markers (`prd`, `type:PRD`, `kind:prd`), PRD structure
|
|
735
|
+
(`## Problem`, `## Goals`, `## Validation Journey`, generated-work/backlink sections), or
|
|
736
|
+
body/comment text that explicitly says `prd-ready`.
|
|
737
|
+
- **Build ticket** if it has build work labels/types (`bug`, `type:Bug`, `task`, `type:Task`,
|
|
738
|
+
`sub-task`, `type:Sub-task`, `improvement`, `type:Improvement`, `story`, `spike`) or
|
|
739
|
+
body/comment text that explicitly says `build-ready`. When PRD signals are absent and the
|
|
740
|
+
selected lifecycle includes build, default to **Build ticket** even if no build type label is
|
|
741
|
+
present; build-intake/implement will validate the item and move it to `blocked` if required
|
|
742
|
+
sections are missing.
|
|
743
|
+
- **Ambiguous PRD/build** if strong PRD and build classifications both match. In `intake_mode=prd`
|
|
744
|
+
normalize as PRD; in `intake_mode=build` normalize as build; in `intake_mode=both`, prefer PRD
|
|
745
|
+
only when the body has PRD structure, otherwise build.
|
|
746
|
+
4. Apply exactly one configured ready label for the classified lifecycle:
|
|
747
|
+
- PRD → add the configured PRD `ready` label (default `prd-ready`).
|
|
748
|
+
- Build ticket → add the configured build `ready` label (default `status:ready`).
|
|
749
|
+
Keep any unofficial labels for auditability unless the project has explicitly configured one as a
|
|
750
|
+
conflicting lifecycle label. Do not claim the item or dispatch an agent in the same repair cycle;
|
|
751
|
+
normalization makes the next normal `lisa-intake` run pick it up.
|
|
752
|
+
5. Post one idempotent `[lisa-repair-intake]` note naming the classification and the configured label
|
|
753
|
+
applied. Include the normalization result in the loop-prevention fingerprint so repeated repair
|
|
754
|
+
cycles do not spam comments.
|
|
755
|
+
|
|
756
|
+
## Blocker classification & clearing (conservative, vendor-specific extraction)
|
|
757
|
+
|
|
758
|
+
A `blocked` build item is held by one or more of three blocker classes. Identify which are present
|
|
759
|
+
from the item's block note(s) and links, then clear-check **each present class** — an item with no
|
|
760
|
+
dependency is not automatically un-actionable; it may be a self-block that now passes.
|
|
761
|
+
|
|
762
|
+
### Class A — dependency blockers
|
|
763
|
+
|
|
764
|
+
`lisa-tracker-read` is a thin dispatcher that returns each vendor's bundle **verbatim** — there
|
|
765
|
+
is no normalized `is blocked by` field. Read the bundle, then extract blockers per vendor:
|
|
766
|
+
|
|
767
|
+
- **GitHub**: parse the durable forms `lisa-github-build-intake` documents — `Blocked by: #123`,
|
|
768
|
+
qualified cross-repo refs (`owner/repo#123`), issue URLs in the body/comments — plus timeline
|
|
769
|
+
cross-reference events.
|
|
770
|
+
- **JIRA**: inspect the native issue-link records `lisa-jira-read-ticket` returns and select the
|
|
771
|
+
`is blocked by` link type.
|
|
772
|
+
- **Linear**: inspect the native issue **relations** from Linear MCP `get_issue` and select
|
|
773
|
+
blocker relations.
|
|
774
|
+
|
|
775
|
+
Then classify each blocker:
|
|
776
|
+
|
|
777
|
+
- **Closed, or shipped to any environment** → **cleared**. A blocker is cleared at **any**
|
|
778
|
+
env-staged `done` role — not only the production terminal. The `done` role is configured
|
|
779
|
+
per-env as a `{dev, staging, production}` map (`config-resolution`), so `On Dev`, `On Stg`,
|
|
780
|
+
**and** production `Done` all mean the blocker's code is merged and deployed to ≥1 environment.
|
|
781
|
+
A post-build `review` role (e.g. `Code Review`) is likewise cleared — the change exists and is
|
|
782
|
+
in flight. An `is blocked by` link is a **development** dependency: it is satisfied once the
|
|
783
|
+
blocker's code is in trunk; it must NOT wait for the blocker to reach production. (This matches
|
|
784
|
+
the intake-path dependency-hold gate in `lisa-intake-explain`, which already treats
|
|
785
|
+
`code-review` / `on-dev` / `on-stg` / `done` as cleared — repair-intake must not be stricter.
|
|
786
|
+
In an env-staged workflow where `Done` means "in production", a strict production-terminal
|
|
787
|
+
check strands every dependent forever behind a blocker that is already merged and sitting at
|
|
788
|
+
`On Stg` / `On Dev`.)
|
|
789
|
+
- **Open** in a pre-merge role (`ready` / `claimed` / unknown — code not yet in trunk) → **still
|
|
790
|
+
blocking**.
|
|
791
|
+
- **Inaccessible** (deleted, cross-org, permission denied) → **still blocking**, unless the item
|
|
792
|
+
body or a newer human comment explicitly states the dependency is resolved.
|
|
793
|
+
|
|
794
|
+
Only re-dispatch when **every** parsed blocker is cleared. When in doubt, stay blocked — a
|
|
795
|
+
false-negative (left blocked) is cheap; a false-positive (re-dispatched into a real blocker)
|
|
796
|
+
wastes a build cycle.
|
|
797
|
+
|
|
798
|
+
### Class B — validation / quality-gate self-block
|
|
799
|
+
|
|
800
|
+
A self-block has **no** `is blocked by` dependency: the build-intake/agent flow claimed the item,
|
|
801
|
+
its pre-flight `verify`/`validate` gate failed (missing Validation Journey, Sign-in Required,
|
|
802
|
+
Target Backend Environment, Repository, Out of Scope, Evidence manifest, weak Acceptance Criteria,
|
|
803
|
+
etc.), and the item was bounced to `blocked` carrying that gate's `[lisa-*]` note + "Missing
|
|
804
|
+
requirements" list. Detect it by: (1) the block note bears a known gate marker (e.g.
|
|
805
|
+
`Pre-flight verify gate: BLOCKED`, `jira-verify` / `*-validate-*`), **and** (2) there is no open
|
|
806
|
+
`is blocked by` dependency. (If both a dependency and a self-block are present, clear the
|
|
807
|
+
dependency via Class A first; the self-block re-check still gates the eventual re-dispatch.)
|
|
808
|
+
|
|
809
|
+
Clear-check by **re-running the same gate against current content** — `lisa-tracker-validate`
|
|
810
|
+
(read-only; never writes), which dispatches to `lisa:<tracker>-validate-*` exactly as the write
|
|
811
|
+
path and build-intake do, so the bar cannot drift:
|
|
812
|
+
|
|
813
|
+
- **PASS** → cleared. Proceed to re-dispatch (decision tree step 2).
|
|
814
|
+
- **FAIL** → still self-blocked. Refresh the note with the current missing set (Loop prevention).
|
|
815
|
+
|
|
816
|
+
Conservative, same as Class A: a still-failing gate is a real blocker — never re-dispatch a build
|
|
817
|
+
whose own gate has not yet passed. This is intentionally symmetric with the PRD `blocked →
|
|
818
|
+
re-validate` path: PRDs re-run their dry-run `validate→route` when source content changes; builds
|
|
819
|
+
re-run `tracker-validate` when item content changes. The asymmetry where build `blocked` checked
|
|
820
|
+
only dependencies — leaving verify-gate self-blocks stranded forever after a human filled in the
|
|
821
|
+
missing sections — is the gap this class closes.
|
|
822
|
+
|
|
823
|
+
### Class C — ambiguity / clarifying answers
|
|
824
|
+
|
|
825
|
+
A block that research or a human answer can settle (no dependency, no failing gate). Re-check by
|
|
826
|
+
running the needed research (`lisa-codebase-research` / `lisa-product-walkthrough`) or detecting a
|
|
827
|
+
human comment/edit newer than the last `[lisa-repair-intake]` note. Resolved → proceed to
|
|
828
|
+
re-dispatch; else stay blocked.
|
|
829
|
+
|
|
830
|
+
### Class D — deployed / runtime verification failure
|
|
831
|
+
|
|
832
|
+
A block set by a *deployed* or *runtime* check that failed against a live environment — a
|
|
833
|
+
smoke/E2E/health probe or manual reproduction that returned an error (an authenticated endpoint
|
|
834
|
+
500ing, a deploy health check red, a seeded-data assertion failing). This is neither a dependency
|
|
835
|
+
nor a content gate: the item is correct but the environment it must verify against is broken.
|
|
836
|
+
|
|
837
|
+
Clear-check by **reproducing the original failing check with the same context that set it** — same
|
|
838
|
+
auth identity/credentials, same environment, same route, same scope. The cardinal rule: **never
|
|
839
|
+
unblock on a probe weaker than the one that set the block.** A signal that does not exercise the
|
|
840
|
+
failed path is not a clear:
|
|
841
|
+
|
|
842
|
+
- Anonymous/unauthenticated request to an **auth-gated** resource (it can short-circuit to a
|
|
843
|
+
healthy response without touching the failing code path).
|
|
844
|
+
- A request against a **different environment** than the one that failed.
|
|
845
|
+
- A **narrower scope** than the failing check (a subset that happens to pass).
|
|
846
|
+
|
|
847
|
+
Conservative, same as the other classes: reproduces-clean → cleared; still-failing or
|
|
848
|
+
not-reproducible-this-cycle → stay blocked. Because the cause is external (a deployed defect, not
|
|
849
|
+
item content), the durable handling is the **real external blocker** path — file/keep a build-ready
|
|
850
|
+
fix ticket for the deployed defect and `is blocked by`-link the item to it, so a later cycle
|
|
851
|
+
self-heals when that ticket is terminal. If reproducing the check needs human-only access the agent
|
|
852
|
+
lacks, apply `human_needed`.
|
|
853
|
+
|
|
854
|
+
## Loop prevention
|
|
855
|
+
|
|
856
|
+
A `blocked` item with a permanently unresolved problem must not be "repaired" and re-noted every
|
|
857
|
+
cron tick.
|
|
858
|
+
|
|
859
|
+
- Every note this skill writes is prefixed `[lisa-repair-intake]` and carries a compact **state
|
|
860
|
+
fingerprint**: the lifecycle role, the set of blocker refs + their observed states, the
|
|
861
|
+
validation verdict (PASS/FAIL) **plus the current missing-requirement set for a Class-B
|
|
862
|
+
self-block** (so a human filling in one of several missing sections changes the fingerprint and
|
|
863
|
+
triggers a re-check next cycle, rather than being suppressed as a no-op), terminal/open state,
|
|
864
|
+
rollup child tally, and a timestamp.
|
|
865
|
+
- Before writing a note or re-attempting a `blocked` item, compute the current fingerprint. If
|
|
866
|
+
an identical fingerprint was already posted within the **backoff window**, skip the item
|
|
867
|
+
silently (record as `still_blocked` / `active`, no write).
|
|
868
|
+
- Backoff window default = `stale_after` (2h). `force=true` bypasses backoff for a manual run.
|
|
869
|
+
- A *changed* fingerprint (new blocker state, new answers, new verdict) always warrants a fresh
|
|
870
|
+
note + re-attempt — backoff suppresses only no-op repeats.
|
|
871
|
+
|
|
872
|
+
## Lifecycle ownership guard
|
|
873
|
+
|
|
874
|
+
repair-intake owns the repair surfaces needed to recover stuck work and close-out drift:
|
|
875
|
+
build `claimed` / `blocked`, PRD `in_review` / `blocked`, terminal-labeled native-open items,
|
|
876
|
+
parent/container rollups (intermediate-env *and* fully-terminal), and stale-`ready` containers.
|
|
877
|
+
It MAY:
|
|
878
|
+
|
|
879
|
+
- Apply the build scanner's post-agent `claimed → done` on a successful resume (it is finishing
|
|
880
|
+
the scanner's interrupted job), and move a dependency-cleared build item `blocked → claimed`.
|
|
881
|
+
- Manage the `human_needed` marker on build blocks: leave it where the vendor agent set it (a
|
|
882
|
+
human-only pre-flight block), and **clear** it from an item it moves to an auto-recoverable
|
|
883
|
+
`blocked` (blocked by a build-ready fix ticket) — that block self-heals and is not waiting on a
|
|
884
|
+
human.
|
|
885
|
+
- Move a re-validated PRD `in_review`/`blocked → ticketed` (PASS) or `→ blocked` (FAIL), exactly
|
|
886
|
+
as the PRD intake does.
|
|
887
|
+
- Close / complete / resolve build items that already carry the true terminal `done` role but are
|
|
888
|
+
still natively open, per `leaf-only-lifecycle`.
|
|
889
|
+
- Roll up a parent/container to its derived state per the `leaf-only-lifecycle` state machine —
|
|
890
|
+
**including an intermediate env value** (`On Dev`/`On Stg`) when all required children have
|
|
891
|
+
reached that env — and close/complete/resolve it **only** when the derived env is the true
|
|
892
|
+
terminal `done`.
|
|
893
|
+
- Reconcile a **container** wrongly carrying the build-ready `ready` role (a leaf-only-invariant
|
|
894
|
+
violation) by rolling it up from its children and removing the `ready`, with a
|
|
895
|
+
`[lisa-repair-intake]` audit note. This is the one `ready`-touching exception (see MUST NOT) and
|
|
896
|
+
applies only to containers, never to leaves.
|
|
897
|
+
- Move a PRD with fully terminal generated work to `shipped` and close/archive the source artifact
|
|
898
|
+
where the source vendor supports native close-out, per `prd-lifecycle-rollup`.
|
|
899
|
+
- Repair missing native GitHub child links by replaying the same-repo, idempotent `addSubIssue`
|
|
900
|
+
contract — for a **PRD** from the generated-work fallback (top-level-only), and for a **build
|
|
901
|
+
Epic/Story container** from its hierarchy/body-parentage children — so rollup and the GitHub UI can
|
|
902
|
+
rely on the native graph. This repairs structure only; it does not ship, transition, or verify the
|
|
903
|
+
parent.
|
|
904
|
+
- Normalize a GitHub issue with no configured lifecycle label by adding the configured PRD or build
|
|
905
|
+
`ready` label after classifying the issue. This is a visibility repair, not a claim; the item
|
|
906
|
+
remains open and unclaimed for normal intake.
|
|
907
|
+
|
|
908
|
+
It MUST NOT:
|
|
909
|
+
|
|
910
|
+
- Move a PRD out of `draft` or `verified` (those are product-owned), or set `verified` itself.
|
|
911
|
+
- Link leaf Sub-tasks or descendant Stories directly under a PRD. Only generated top-level work
|
|
912
|
+
(empty parent token / `Top-level work:` entries) may become PRD children.
|
|
913
|
+
- Apply a build `done` value other than via the env-resolution rules, or close a native item at
|
|
914
|
+
any value other than the true terminal `done` (see `leaf-only-lifecycle`).
|
|
915
|
+
- Touch `ready` **leaves** (that is `lisa-intake`'s lane). A container carrying `ready` is the
|
|
916
|
+
documented exception above — repair-intake reconciles it because `ready` on a parent is an
|
|
917
|
+
invariant violation, not the human "claim this leaf" signal intake owns.
|
|
918
|
+
- Move a GitHub issue that already carries a configured lifecycle label back to `ready` merely
|
|
919
|
+
because some other label looks stale. Official lifecycle labels remain authoritative.
|
|
920
|
+
|
|
921
|
+
## Cycle behavior
|
|
922
|
+
|
|
923
|
+
1. **Resolve the queue** — detect vendor/lifecycle (Source dispatch); resolve stuck role names
|
|
924
|
+
from config. For JIRA, confirm the needed transitions are reachable; stop on misconfig.
|
|
925
|
+
2. **Enumerate repair candidates** — query in-progress role(s), `blocked` role(s), terminal/open
|
|
926
|
+
items, GitHub parents (PRDs **and build Epic/Story containers**) whose discoverable children —
|
|
927
|
+
generated-work fallback for a PRD, hierarchy/body-parentage for a build container — are missing from
|
|
928
|
+
their native sub-issue graph, rollup parents/PRDs with child work, **containers carrying the `ready`
|
|
929
|
+
role** (a
|
|
930
|
+
leaf-only-invariant violation to reconcile), and GitHub issues with no configured lifecycle label,
|
|
931
|
+
for the detected lifecycle(s), up to `max_candidates`, via the Access layer reads.
|
|
932
|
+
3. **Order deterministically**, highest repair-confidence first:
|
|
933
|
+
1. terminal-labeled items that only need native close / complete / resolve,
|
|
934
|
+
2. build `claimed` leaves whose linked PR is **already merged** — apply the env-resolved
|
|
935
|
+
`claimed → done` close-out (staleness-exempt; no re-dispatch). This MUST run before any rollup
|
|
936
|
+
bucket: a merged-PR leaf is a settled terminal state, and recovering it first means its parent
|
|
937
|
+
rolls up to its true derived state in the **same** cycle. If this ran after rollup (or last,
|
|
938
|
+
among generic stalled items), the parent would be reconciled against a not-yet-closed child and
|
|
939
|
+
the shipped leaf would linger another cron pass — the failure this ordering exists to prevent,
|
|
940
|
+
3. GitHub parents (PRDs missing native links for generated top-level work, or build Epic/Story
|
|
941
|
+
containers missing native links for prose/hierarchy children) needing structure-only repair,
|
|
942
|
+
4. rollup parents/PRDs whose child sets are all terminal (close-out),
|
|
943
|
+
5. rollup parents whose children have advanced to an intermediate env, or stale-`ready`
|
|
944
|
+
containers, that need their derived state applied (status-only reconciliation, no native
|
|
945
|
+
close),
|
|
946
|
+
6. `blocked` items whose dependencies are now **cleared** (safe, high-value, one-cycle wins),
|
|
947
|
+
7. `blocked` items whose **validation / quality-gate self-block now re-validates PASS** —
|
|
948
|
+
a human filled in the missing sections (Class B; equally safe and high-value),
|
|
949
|
+
8. `blocked` items with **new clarifying answers**,
|
|
950
|
+
9. GitHub missing-official-label normalization candidates,
|
|
951
|
+
10. **stalled** in-progress items (PR not merged), oldest activity first.
|
|
952
|
+
4. **Walk the ordered list**, evaluating each candidate (terminal close-out, rollup child tally,
|
|
953
|
+
staleness, dependency, answer checks), and repair **every** candidate that is actionable inside
|
|
954
|
+
the `max_candidates` cap. Continue after successful writes and after per-item errors.
|
|
955
|
+
5. **Empty / nothing actionable** → exit cleanly:
|
|
956
|
+
`"No stuck items actionable this cycle (examined N, all active or in backoff)."`
|
|
957
|
+
6. **Failure isolation** — if evaluating one candidate errors, record it under Errors and
|
|
958
|
+
continue to the next; one bad item never aborts the cycle.
|
|
959
|
+
|
|
960
|
+
Process **all materially actionable repairs among the enumerated candidates** — scan up to
|
|
961
|
+
`max_candidates`, repair the actionable subset, then exit. This intentionally differs from
|
|
962
|
+
`lisa-intake`'s one-ready-item claim contract because repair work is bounded by an explicit cap and
|
|
963
|
+
often consists of cheap close-out reconciliation that should drain in one cron pass.
|
|
964
|
+
|
|
965
|
+
## Summary report
|
|
966
|
+
|
|
967
|
+
Report outcomes in these buckets:
|
|
968
|
+
|
|
969
|
+
- `resumed` — stalled in-progress work re-dispatched in place.
|
|
970
|
+
- `resynced` — a stalled build whose PR was merely behind its base, re-synced via
|
|
971
|
+
`gh pr update-branch` so the already-enabled auto-merge can land; the item stays `claimed` for a
|
|
972
|
+
later cycle to confirm the merge and transition.
|
|
973
|
+
- `recovered` — a stalled build whose PR had already merged, advanced by applying the env-resolved
|
|
974
|
+
`claimed → done` transition build-intake never got to (no re-dispatch).
|
|
975
|
+
- `unblocked` — blocker cleared (or answers resolved); re-dispatched or transitioned to
|
|
976
|
+
`ticketed`.
|
|
977
|
+
- `closed_out` — terminal-labeled items whose native open/active state was closed, completed,
|
|
978
|
+
resolved, or archived.
|
|
979
|
+
- `rolled_up` — parent/container/PRD rollups advanced to their derived state: an intermediate env
|
|
980
|
+
(e.g. all children at `On Stg` → parent `On Stg`), a fully-terminal close-out, or a stale-`ready`
|
|
981
|
+
container reconciled from its children.
|
|
982
|
+
- `relinked` — GitHub parents (PRDs from the generated-work fallback, or build Epic/Story containers
|
|
983
|
+
from hierarchy/body-parentage) whose missing native sub-issue links were attached.
|
|
984
|
+
- `normalized_ready` — GitHub issues missing official lifecycle labels that were classified and
|
|
985
|
+
given the configured PRD/build `ready` label so normal intake can claim them.
|
|
986
|
+
- `still_blocked` — examined and intentionally left `blocked`, with the active reason.
|
|
987
|
+
- `active` — skipped because current work is not stale (or within backoff).
|
|
988
|
+
- `errors` — items that failed evaluation, with the error.
|
|
989
|
+
|
|
990
|
+
State every item repaired this cycle and the action taken. If the output would be long, group by
|
|
991
|
+
bucket and show compact refs plus counts.
|
|
992
|
+
|
|
993
|
+
## Schedule examples
|
|
994
|
+
|
|
995
|
+
```text
|
|
996
|
+
/schedule "every 2 hours" /lisa:repair-intake https://www.notion.so/<workspace>/<database-id>
|
|
997
|
+
/schedule "every 2 hours" /lisa:repair-intake https://linear.app/acme
|
|
998
|
+
/schedule "every 2 hours" /lisa:repair-intake acme/product-prds
|
|
999
|
+
/schedule "every 2 hours" /lisa:repair-intake acme/frontend-v2 intake_mode=build
|
|
1000
|
+
/schedule "every 2 hours" /lisa:repair-intake github intake_mode=both
|
|
1001
|
+
/schedule "every 4 hours" /lisa:repair-intake SE stale_after=12h
|
|
1002
|
+
/lisa:repair-intake SE stale_after=0 force=true # manual: treat all in-progress as stalled, ignore backoff
|
|
1003
|
+
```
|
|
1004
|
+
|
|
1005
|
+
Run repair-intake **less frequently than** `lisa-intake` (the ready queue moves faster than
|
|
1006
|
+
stuck work accumulates), or interleaved on a longer cadence.
|
|
1007
|
+
|
|
1008
|
+
## Rules
|
|
1009
|
+
|
|
1010
|
+
- Never run a cycle without an explicit queue. Side effects too high to default.
|
|
1011
|
+
- Never reset stalled in-progress items to `ready` — resume in place (decision tree).
|
|
1012
|
+
- Never mutate product-owned states (`draft`, `verified`) or set `verified`; PRD rollup close-out
|
|
1013
|
+
may move open generated-work PRDs to `shipped` and close/archive them only after all associated
|
|
1014
|
+
child work is terminal.
|
|
1015
|
+
- Apply build `done` ONLY via the env-resolution rules, and trigger native closure only at the
|
|
1016
|
+
true terminal `done` value (`leaf-only-lifecycle`).
|
|
1017
|
+
- A `blocked` build item's blocker may be a dependency, a validation/quality-gate self-block (no
|
|
1018
|
+
dependency — re-check by re-running `lisa-tracker-validate` against current content), or an
|
|
1019
|
+
ambiguity. Re-check every class present; do not treat "no `is blocked by` links" as "nothing to
|
|
1020
|
+
do."
|
|
1021
|
+
- Never re-dispatch a `blocked` build item unless every parsed blocker is cleared (conservative
|
|
1022
|
+
dependency clearing).
|
|
1023
|
+
- Repair every materially actionable candidate inside the `max_candidates` cap; default cap is 100.
|
|
1024
|
+
- Default GitHub `intake_mode` is `both` when both PRD and build namespaces exist.
|
|
1025
|
+
- Honor the backoff window — never re-post an identical `[lisa-repair-intake]` note within it
|
|
1026
|
+
(unless `force=true`).
|
|
1027
|
+
- Never run two repair cycles concurrently against overlapping queues, and never run
|
|
1028
|
+
repair-intake against a queue `lisa-intake` is concurrently draining — the scheduling layer is
|
|
1029
|
+
responsible for serialization.
|
|
1030
|
+
- Stop and surface failures rather than retry-loop.
|