@codyswann/lisa 2.119.1 → 2.121.1
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/.claude-plugin/marketplace.json +18 -0
- package/dist/agy/agents-md-installer.d.ts +24 -0
- package/dist/agy/agents-md-installer.d.ts.map +1 -0
- package/dist/agy/agents-md-installer.js +126 -0
- package/dist/agy/agents-md-installer.js.map +1 -0
- package/dist/agy/mcp-installer.d.ts +102 -0
- package/dist/agy/mcp-installer.d.ts.map +1 -0
- package/dist/agy/mcp-installer.js +155 -0
- package/dist/agy/mcp-installer.js.map +1 -0
- package/dist/agy/plugin-installer.d.ts +21 -0
- package/dist/agy/plugin-installer.d.ts.map +1 -0
- package/dist/agy/plugin-installer.js +88 -0
- package/dist/agy/plugin-installer.js.map +1 -0
- package/dist/claude/claude-md-installer.d.ts +18 -0
- package/dist/claude/claude-md-installer.d.ts.map +1 -0
- package/dist/claude/claude-md-installer.js +62 -0
- package/dist/claude/claude-md-installer.js.map +1 -0
- package/dist/codex/lisa-plugin-detection.d.ts +68 -0
- package/dist/codex/lisa-plugin-detection.d.ts.map +1 -0
- package/dist/codex/lisa-plugin-detection.js +139 -0
- package/dist/codex/lisa-plugin-detection.js.map +1 -0
- package/dist/copilot/copilot-instructions-installer.d.ts +18 -0
- package/dist/copilot/copilot-instructions-installer.d.ts.map +1 -0
- package/dist/copilot/copilot-instructions-installer.js +61 -0
- package/dist/copilot/copilot-instructions-installer.js.map +1 -0
- package/dist/copilot/plugin-installer.d.ts +29 -0
- package/dist/copilot/plugin-installer.d.ts.map +1 -0
- package/dist/copilot/plugin-installer.js +144 -0
- package/dist/copilot/plugin-installer.js.map +1 -0
- package/dist/core/config.d.ts +28 -4
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +24 -0
- package/dist/core/config.js.map +1 -1
- package/dist/core/lisa.d.ts +35 -0
- package/dist/core/lisa.d.ts.map +1 -1
- package/dist/core/lisa.js +99 -2
- package/dist/core/lisa.js.map +1 -1
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +2 -1
- package/plugins/lisa/hooks/hooks.json +75 -0
- package/plugins/lisa-agy/agents/architecture-specialist.md +47 -0
- package/plugins/lisa-agy/agents/bug-fixer.md +39 -0
- package/plugins/lisa-agy/agents/builder.md +40 -0
- package/plugins/lisa-agy/agents/confluence-prd-intake.md +65 -0
- package/plugins/lisa-agy/agents/debug-specialist.md +114 -0
- package/plugins/lisa-agy/agents/git-history-analyzer.md +183 -0
- package/plugins/lisa-agy/agents/github-agent.md +148 -0
- package/plugins/lisa-agy/agents/github-build-intake.md +64 -0
- package/plugins/lisa-agy/agents/github-prd-intake.md +66 -0
- package/plugins/lisa-agy/agents/jira-agent.md +129 -0
- package/plugins/lisa-agy/agents/jira-build-intake.md +64 -0
- package/plugins/lisa-agy/agents/learner.md +43 -0
- package/plugins/lisa-agy/agents/learnings-synthesizer.md +135 -0
- package/plugins/lisa-agy/agents/linear-agent.md +134 -0
- package/plugins/lisa-agy/agents/linear-build-intake.md +64 -0
- package/plugins/lisa-agy/agents/linear-prd-intake.md +66 -0
- package/plugins/lisa-agy/agents/notion-prd-intake.md +63 -0
- package/plugins/lisa-agy/agents/performance-specialist.md +85 -0
- package/plugins/lisa-agy/agents/pr-mining-specialist.md +85 -0
- package/plugins/lisa-agy/agents/product-specialist.md +63 -0
- package/plugins/lisa-agy/agents/quality-specialist.md +56 -0
- package/plugins/lisa-agy/agents/security-specialist.md +51 -0
- package/plugins/lisa-agy/agents/skill-evaluator.md +245 -0
- package/plugins/lisa-agy/agents/spec-conformance-specialist.md +49 -0
- package/plugins/lisa-agy/agents/test-specialist.md +49 -0
- package/plugins/lisa-agy/agents/tracker-mining-specialist.md +85 -0
- package/plugins/lisa-agy/agents/verification-specialist.md +135 -0
- package/plugins/lisa-agy/commands/automation-status.md +12 -0
- package/plugins/lisa-agy/commands/codify-verification.md +6 -0
- package/plugins/lisa-agy/commands/debrief/apply.md +6 -0
- package/plugins/lisa-agy/commands/debrief.md +6 -0
- package/plugins/lisa-agy/commands/doctor.md +6 -0
- package/plugins/lisa-agy/commands/fix/linter-error.md +7 -0
- package/plugins/lisa-agy/commands/git/commit.md +7 -0
- package/plugins/lisa-agy/commands/git/prune.md +6 -0
- package/plugins/lisa-agy/commands/git/submit-pr.md +7 -0
- package/plugins/lisa-agy/commands/implement.md +6 -0
- package/plugins/lisa-agy/commands/improve/code-complexity.md +6 -0
- package/plugins/lisa-agy/commands/improve/max-lines-per-function.md +7 -0
- package/plugins/lisa-agy/commands/improve/max-lines.md +7 -0
- package/plugins/lisa-agy/commands/improve/test-coverage.md +7 -0
- package/plugins/lisa-agy/commands/improve/tests.md +7 -0
- package/plugins/lisa-agy/commands/intake-explain.md +31 -0
- package/plugins/lisa-agy/commands/intake.md +6 -0
- package/plugins/lisa-agy/commands/monitor.md +6 -0
- package/plugins/lisa-agy/commands/plan.md +6 -0
- package/plugins/lisa-agy/commands/plugin-sync-explain.md +8 -0
- package/plugins/lisa-agy/commands/product-walkthrough.md +7 -0
- package/plugins/lisa-agy/commands/project-ideation.md +6 -0
- package/plugins/lisa-agy/commands/pull-request/review.md +7 -0
- package/plugins/lisa-agy/commands/queue-status.md +34 -0
- package/plugins/lisa-agy/commands/repair-intake.md +6 -0
- package/plugins/lisa-agy/commands/research.md +6 -0
- package/plugins/lisa-agy/commands/review/local.md +6 -0
- package/plugins/lisa-agy/commands/security/zap-scan.md +6 -0
- package/plugins/lisa-agy/commands/setup/atlassian.md +7 -0
- package/plugins/lisa-agy/commands/setup/confluence.md +7 -0
- package/plugins/lisa-agy/commands/setup/github.md +7 -0
- package/plugins/lisa-agy/commands/setup/jira.md +7 -0
- package/plugins/lisa-agy/commands/setup/linear.md +7 -0
- package/plugins/lisa-agy/commands/setup/notion.md +7 -0
- package/plugins/lisa-agy/commands/setup-automations.md +6 -0
- package/plugins/lisa-agy/commands/tear-down-automations.md +6 -0
- package/plugins/lisa-agy/commands/verify-prd.md +6 -0
- package/plugins/lisa-agy/commands/verify.md +6 -0
- package/plugins/lisa-agy/commands/wiki/install.md +7 -0
- package/plugins/lisa-agy/plugin.json +8 -0
- package/plugins/lisa-agy/scripts/automation-status-claude-adapter.mjs +672 -0
- package/plugins/lisa-agy/scripts/automation-status-codex-adapter.mjs +697 -0
- package/plugins/lisa-agy/scripts/automation-status-contract-drift.mjs +392 -0
- package/plugins/lisa-agy/scripts/automation-status-expected-fleet.mjs +319 -0
- package/plugins/lisa-agy/scripts/automation-status-report.mjs +170 -0
- package/plugins/lisa-agy/scripts/doctor-report.mjs +143 -0
- package/plugins/lisa-agy/scripts/plugin-sync-explain.mjs +512 -0
- package/plugins/lisa-agy/scripts/project-ideation-idempotency-harness.mjs +319 -0
- package/plugins/lisa-agy/scripts/queue-contract-resolution.mjs +453 -0
- package/plugins/lisa-agy/scripts/queue-health-classification.mjs +157 -0
- package/plugins/lisa-agy/scripts/queue-status-build-readers.mjs +509 -0
- package/plugins/lisa-agy/scripts/queue-status-prd-readers.mjs +452 -0
- package/plugins/lisa-agy/skills/acceptance-criteria/SKILL.md +71 -0
- package/plugins/lisa-agy/skills/agent-design-best-practices/SKILL.md +219 -0
- package/plugins/lisa-agy/skills/atlassian-access/SKILL.md +293 -0
- package/plugins/lisa-agy/skills/automation-status/SKILL.md +111 -0
- package/plugins/lisa-agy/skills/bug-triage/SKILL.md +23 -0
- package/plugins/lisa-agy/skills/codebase-research/SKILL.md +87 -0
- package/plugins/lisa-agy/skills/codify-verification/SKILL.md +152 -0
- package/plugins/lisa-agy/skills/confluence-prd-intake/SKILL.md +417 -0
- package/plugins/lisa-agy/skills/confluence-to-tracker/SKILL.md +360 -0
- package/plugins/lisa-agy/skills/confluence-write-prd/SKILL.md +109 -0
- package/plugins/lisa-agy/skills/debrief/SKILL.md +94 -0
- package/plugins/lisa-agy/skills/debrief-apply/SKILL.md +63 -0
- package/plugins/lisa-agy/skills/doctor/SKILL.md +317 -0
- package/plugins/lisa-agy/skills/epic-triage/SKILL.md +28 -0
- package/plugins/lisa-agy/skills/fix-linter-error/SKILL.md +45 -0
- package/plugins/lisa-agy/skills/git-commit/SKILL.md +48 -0
- package/plugins/lisa-agy/skills/git-prune/SKILL.md +35 -0
- package/plugins/lisa-agy/skills/git-submit-pr/SKILL.md +105 -0
- package/plugins/lisa-agy/skills/github-add-journey/SKILL.md +115 -0
- package/plugins/lisa-agy/skills/github-build-intake/SKILL.md +377 -0
- package/plugins/lisa-agy/skills/github-create/SKILL.md +101 -0
- package/plugins/lisa-agy/skills/github-evidence/SKILL.md +110 -0
- package/plugins/lisa-agy/skills/github-journey/SKILL.md +121 -0
- package/plugins/lisa-agy/skills/github-prd-intake/SKILL.md +432 -0
- package/plugins/lisa-agy/skills/github-project-v2/SKILL.md +227 -0
- package/plugins/lisa-agy/skills/github-read-issue/SKILL.md +248 -0
- package/plugins/lisa-agy/skills/github-sync/SKILL.md +119 -0
- package/plugins/lisa-agy/skills/github-to-tracker/SKILL.md +345 -0
- package/plugins/lisa-agy/skills/github-validate-issue/SKILL.md +331 -0
- package/plugins/lisa-agy/skills/github-verify/SKILL.md +29 -0
- package/plugins/lisa-agy/skills/github-write-issue/SKILL.md +339 -0
- package/plugins/lisa-agy/skills/github-write-prd/SKILL.md +157 -0
- package/plugins/lisa-agy/skills/implement/SKILL.md +145 -0
- package/plugins/lisa-agy/skills/improve-code-complexity/SKILL.md +44 -0
- package/plugins/lisa-agy/skills/improve-max-lines/SKILL.md +45 -0
- package/plugins/lisa-agy/skills/improve-max-lines-per-function/SKILL.md +46 -0
- package/plugins/lisa-agy/skills/improve-test-coverage/SKILL.md +44 -0
- package/plugins/lisa-agy/skills/improve-tests/SKILL.md +47 -0
- package/plugins/lisa-agy/skills/intake/SKILL.md +132 -0
- package/plugins/lisa-agy/skills/intake-explain/SKILL.md +279 -0
- package/plugins/lisa-agy/skills/jira-add-journey/SKILL.md +121 -0
- package/plugins/lisa-agy/skills/jira-build-intake/SKILL.md +286 -0
- package/plugins/lisa-agy/skills/jira-create/SKILL.md +154 -0
- package/plugins/lisa-agy/skills/jira-evidence/SKILL.md +90 -0
- package/plugins/lisa-agy/skills/jira-evidence/scripts/post-evidence.sh +163 -0
- package/plugins/lisa-agy/skills/jira-journey/SKILL.md +127 -0
- package/plugins/lisa-agy/skills/jira-journey/scripts/generate-templates.py +233 -0
- package/plugins/lisa-agy/skills/jira-journey/scripts/parse-plan.py +368 -0
- package/plugins/lisa-agy/skills/jira-read-ticket/SKILL.md +198 -0
- package/plugins/lisa-agy/skills/jira-read-ticket/scripts/download-attachment.sh +110 -0
- package/plugins/lisa-agy/skills/jira-sync/SKILL.md +95 -0
- package/plugins/lisa-agy/skills/jira-validate-ticket/SKILL.md +318 -0
- package/plugins/lisa-agy/skills/jira-verify/SKILL.md +30 -0
- package/plugins/lisa-agy/skills/jira-write-ticket/SKILL.md +265 -0
- package/plugins/lisa-agy/skills/jsdoc-best-practices/SKILL.md +432 -0
- package/plugins/lisa-agy/skills/linear-add-journey/SKILL.md +105 -0
- package/plugins/lisa-agy/skills/linear-build-intake/SKILL.md +283 -0
- package/plugins/lisa-agy/skills/linear-create/SKILL.md +146 -0
- package/plugins/lisa-agy/skills/linear-evidence/SKILL.md +103 -0
- package/plugins/lisa-agy/skills/linear-journey/SKILL.md +134 -0
- package/plugins/lisa-agy/skills/linear-prd-intake/SKILL.md +383 -0
- package/plugins/lisa-agy/skills/linear-read-issue/SKILL.md +200 -0
- package/plugins/lisa-agy/skills/linear-sync/SKILL.md +114 -0
- package/plugins/lisa-agy/skills/linear-to-tracker/SKILL.md +342 -0
- package/plugins/lisa-agy/skills/linear-validate-issue/SKILL.md +313 -0
- package/plugins/lisa-agy/skills/linear-verify/SKILL.md +51 -0
- package/plugins/lisa-agy/skills/linear-write-issue/SKILL.md +292 -0
- package/plugins/lisa-agy/skills/linear-write-prd/SKILL.md +96 -0
- package/plugins/lisa-agy/skills/lisa-review-implementation/SKILL.md +209 -0
- package/plugins/lisa-agy/skills/monitor/SKILL.md +48 -0
- package/plugins/lisa-agy/skills/nightly-add-test-coverage/SKILL.md +40 -0
- package/plugins/lisa-agy/skills/nightly-improve-tests/SKILL.md +29 -0
- package/plugins/lisa-agy/skills/nightly-lower-code-complexity/SKILL.md +28 -0
- package/plugins/lisa-agy/skills/notion-access/SKILL.md +226 -0
- package/plugins/lisa-agy/skills/notion-prd-intake/SKILL.md +360 -0
- package/plugins/lisa-agy/skills/notion-to-tracker/SKILL.md +357 -0
- package/plugins/lisa-agy/skills/notion-write-prd/SKILL.md +109 -0
- package/plugins/lisa-agy/skills/performance-review/SKILL.md +94 -0
- package/plugins/lisa-agy/skills/plan/SKILL.md +60 -0
- package/plugins/lisa-agy/skills/plugin-sync-explain/SKILL.md +53 -0
- package/plugins/lisa-agy/skills/prd-backlink/SKILL.md +265 -0
- package/plugins/lisa-agy/skills/prd-source-write/SKILL.md +101 -0
- package/plugins/lisa-agy/skills/prd-ticket-coverage/SKILL.md +170 -0
- package/plugins/lisa-agy/skills/product-walkthrough/SKILL.md +129 -0
- package/plugins/lisa-agy/skills/project-ideation/SKILL.md +315 -0
- package/plugins/lisa-agy/skills/project-ideation/examples/evidence-card-format.md +21 -0
- package/plugins/lisa-agy/skills/project-ideation/examples/host-project-only.md +22 -0
- package/plugins/lisa-agy/skills/project-ideation/examples/idempotency-verification-harness.md +57 -0
- package/plugins/lisa-agy/skills/project-ideation/examples/public-external-inspiration.md +22 -0
- package/plugins/lisa-agy/skills/project-ideation/examples/unavailable-data-rejection.md +22 -0
- package/plugins/lisa-agy/skills/pull-request-review/SKILL.md +68 -0
- package/plugins/lisa-agy/skills/quality-review/SKILL.md +54 -0
- package/plugins/lisa-agy/skills/queue-status/SKILL.md +133 -0
- package/plugins/lisa-agy/skills/repair-intake/SKILL.md +584 -0
- package/plugins/lisa-agy/skills/reproduce-bug/SKILL.md +96 -0
- package/plugins/lisa-agy/skills/research/SKILL.md +68 -0
- package/plugins/lisa-agy/skills/review-local/SKILL.md +88 -0
- package/plugins/lisa-agy/skills/root-cause-analysis/SKILL.md +155 -0
- package/plugins/lisa-agy/skills/security-review/SKILL.md +57 -0
- package/plugins/lisa-agy/skills/security-zap-scan/SKILL.md +33 -0
- package/plugins/lisa-agy/skills/setup-atlassian/SKILL.md +347 -0
- package/plugins/lisa-agy/skills/setup-automations/SKILL.md +99 -0
- package/plugins/lisa-agy/skills/setup-confluence/SKILL.md +254 -0
- package/plugins/lisa-agy/skills/setup-github/SKILL.md +268 -0
- package/plugins/lisa-agy/skills/setup-jira/SKILL.md +198 -0
- package/plugins/lisa-agy/skills/setup-linear/SKILL.md +251 -0
- package/plugins/lisa-agy/skills/setup-notion/SKILL.md +316 -0
- package/plugins/lisa-agy/skills/spec-conformance/SKILL.md +159 -0
- package/plugins/lisa-agy/skills/task-decomposition/SKILL.md +127 -0
- package/plugins/lisa-agy/skills/task-triage/SKILL.md +23 -0
- package/plugins/lisa-agy/skills/tdd-implementation/SKILL.md +83 -0
- package/plugins/lisa-agy/skills/tear-down-automations/SKILL.md +34 -0
- package/plugins/lisa-agy/skills/test-strategy/SKILL.md +63 -0
- package/plugins/lisa-agy/skills/ticket-triage/SKILL.md +182 -0
- package/plugins/lisa-agy/skills/tracker-add-journey/SKILL.md +26 -0
- package/plugins/lisa-agy/skills/tracker-build-intake/SKILL.md +64 -0
- package/plugins/lisa-agy/skills/tracker-create/SKILL.md +26 -0
- package/plugins/lisa-agy/skills/tracker-evidence/SKILL.md +52 -0
- package/plugins/lisa-agy/skills/tracker-journey/SKILL.md +26 -0
- package/plugins/lisa-agy/skills/tracker-read/SKILL.md +27 -0
- package/plugins/lisa-agy/skills/tracker-source-artifacts/SKILL.md +107 -0
- package/plugins/lisa-agy/skills/tracker-sync/SKILL.md +51 -0
- package/plugins/lisa-agy/skills/tracker-validate/SKILL.md +36 -0
- package/plugins/lisa-agy/skills/tracker-verify/SKILL.md +27 -0
- package/plugins/lisa-agy/skills/tracker-write/SKILL.md +53 -0
- package/plugins/lisa-agy/skills/usage-accounting/SKILL.md +170 -0
- package/plugins/lisa-agy/skills/verification-lifecycle/SKILL.md +339 -0
- package/plugins/lisa-agy/skills/verify/SKILL.md +49 -0
- package/plugins/lisa-agy/skills/verify-prd/SKILL.md +392 -0
- package/plugins/lisa-agy/skills/wiki-install/SKILL.md +101 -0
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +72 -0
- package/plugins/lisa-copilot/agents/architecture-specialist.agent.md +47 -0
- package/plugins/lisa-copilot/agents/bug-fixer.agent.md +39 -0
- package/plugins/lisa-copilot/agents/builder.agent.md +40 -0
- package/plugins/lisa-copilot/agents/confluence-prd-intake.agent.md +65 -0
- package/plugins/lisa-copilot/agents/debug-specialist.agent.md +114 -0
- package/plugins/lisa-copilot/agents/git-history-analyzer.agent.md +183 -0
- package/plugins/lisa-copilot/agents/github-agent.agent.md +148 -0
- package/plugins/lisa-copilot/agents/github-build-intake.agent.md +64 -0
- package/plugins/lisa-copilot/agents/github-prd-intake.agent.md +66 -0
- package/plugins/lisa-copilot/agents/jira-agent.agent.md +129 -0
- package/plugins/lisa-copilot/agents/jira-build-intake.agent.md +64 -0
- package/plugins/lisa-copilot/agents/learner.agent.md +43 -0
- package/plugins/lisa-copilot/agents/learnings-synthesizer.agent.md +135 -0
- package/plugins/lisa-copilot/agents/linear-agent.agent.md +134 -0
- package/plugins/lisa-copilot/agents/linear-build-intake.agent.md +64 -0
- package/plugins/lisa-copilot/agents/linear-prd-intake.agent.md +66 -0
- package/plugins/lisa-copilot/agents/notion-prd-intake.agent.md +63 -0
- package/plugins/lisa-copilot/agents/performance-specialist.agent.md +85 -0
- package/plugins/lisa-copilot/agents/pr-mining-specialist.agent.md +85 -0
- package/plugins/lisa-copilot/agents/product-specialist.agent.md +63 -0
- package/plugins/lisa-copilot/agents/quality-specialist.agent.md +56 -0
- package/plugins/lisa-copilot/agents/security-specialist.agent.md +51 -0
- package/plugins/lisa-copilot/agents/skill-evaluator.agent.md +245 -0
- package/plugins/lisa-copilot/agents/spec-conformance-specialist.agent.md +49 -0
- package/plugins/lisa-copilot/agents/test-specialist.agent.md +49 -0
- package/plugins/lisa-copilot/agents/tracker-mining-specialist.agent.md +85 -0
- package/plugins/lisa-copilot/agents/verification-specialist.agent.md +135 -0
- package/plugins/lisa-copilot/commands/automation-status.md +12 -0
- package/plugins/lisa-copilot/commands/codify-verification.md +6 -0
- package/plugins/lisa-copilot/commands/debrief/apply.md +6 -0
- package/plugins/lisa-copilot/commands/debrief.md +6 -0
- package/plugins/lisa-copilot/commands/doctor.md +6 -0
- package/plugins/lisa-copilot/commands/fix/linter-error.md +7 -0
- package/plugins/lisa-copilot/commands/git/commit.md +7 -0
- package/plugins/lisa-copilot/commands/git/prune.md +6 -0
- package/plugins/lisa-copilot/commands/git/submit-pr.md +7 -0
- package/plugins/lisa-copilot/commands/implement.md +6 -0
- package/plugins/lisa-copilot/commands/improve/code-complexity.md +6 -0
- package/plugins/lisa-copilot/commands/improve/max-lines-per-function.md +7 -0
- package/plugins/lisa-copilot/commands/improve/max-lines.md +7 -0
- package/plugins/lisa-copilot/commands/improve/test-coverage.md +7 -0
- package/plugins/lisa-copilot/commands/improve/tests.md +7 -0
- package/plugins/lisa-copilot/commands/intake-explain.md +31 -0
- package/plugins/lisa-copilot/commands/intake.md +6 -0
- package/plugins/lisa-copilot/commands/monitor.md +6 -0
- package/plugins/lisa-copilot/commands/plan.md +6 -0
- package/plugins/lisa-copilot/commands/plugin-sync-explain.md +8 -0
- package/plugins/lisa-copilot/commands/product-walkthrough.md +7 -0
- package/plugins/lisa-copilot/commands/project-ideation.md +6 -0
- package/plugins/lisa-copilot/commands/pull-request/review.md +7 -0
- package/plugins/lisa-copilot/commands/queue-status.md +34 -0
- package/plugins/lisa-copilot/commands/repair-intake.md +6 -0
- package/plugins/lisa-copilot/commands/research.md +6 -0
- package/plugins/lisa-copilot/commands/review/local.md +6 -0
- package/plugins/lisa-copilot/commands/security/zap-scan.md +6 -0
- package/plugins/lisa-copilot/commands/setup/atlassian.md +7 -0
- package/plugins/lisa-copilot/commands/setup/confluence.md +7 -0
- package/plugins/lisa-copilot/commands/setup/github.md +7 -0
- package/plugins/lisa-copilot/commands/setup/jira.md +7 -0
- package/plugins/lisa-copilot/commands/setup/linear.md +7 -0
- package/plugins/lisa-copilot/commands/setup/notion.md +7 -0
- package/plugins/lisa-copilot/commands/setup-automations.md +6 -0
- package/plugins/lisa-copilot/commands/tear-down-automations.md +6 -0
- package/plugins/lisa-copilot/commands/verify-prd.md +6 -0
- package/plugins/lisa-copilot/commands/verify.md +6 -0
- package/plugins/lisa-copilot/commands/wiki/install.md +7 -0
- package/plugins/lisa-copilot/hooks/block-no-verify.sh +37 -0
- package/plugins/lisa-copilot/hooks/inject-rules.sh +33 -0
- package/plugins/lisa-copilot/hooks/install-pkgs.sh +69 -0
- package/plugins/lisa-copilot/hooks/notify-ntfy.sh +183 -0
- package/plugins/lisa-copilot/hooks/setup-jira-cli.sh +51 -0
- package/plugins/lisa-copilot/rules/eager/base-rules.md +70 -0
- package/plugins/lisa-copilot/rules/eager/coding-philosophy.md +27 -0
- package/plugins/lisa-copilot/rules/eager/config-resolution.md +28 -0
- package/plugins/lisa-copilot/rules/eager/documentation-source-paths.md +13 -0
- package/plugins/lisa-copilot/rules/eager/empirical-inquiry.md +22 -0
- package/plugins/lisa-copilot/rules/eager/intent-routing.md +18 -0
- package/plugins/lisa-copilot/rules/eager/leaf-only-lifecycle.md +39 -0
- package/plugins/lisa-copilot/rules/eager/prd-lifecycle-rollup.md +31 -0
- package/plugins/lisa-copilot/rules/eager/repo-scope-split.md +39 -0
- package/plugins/lisa-copilot/rules/eager/security-audit-handling.md +29 -0
- package/plugins/lisa-copilot/rules/eager/usage-accounting.md +28 -0
- package/plugins/lisa-copilot/rules/eager/verification.md +21 -0
- package/plugins/lisa-copilot/rules/eager/wiki-knowledge-source.md +16 -0
- package/plugins/lisa-copilot/rules/reference/base-rules.md +133 -0
- package/plugins/lisa-copilot/rules/reference/coding-philosophy.md +428 -0
- package/plugins/lisa-copilot/rules/reference/config-resolution.md +691 -0
- package/plugins/lisa-copilot/rules/reference/documentation-source-paths.md +13 -0
- package/plugins/lisa-copilot/rules/reference/empirical-inquiry.md +27 -0
- package/plugins/lisa-copilot/rules/reference/intent-routing.md +407 -0
- package/plugins/lisa-copilot/rules/reference/leaf-only-lifecycle.md +120 -0
- package/plugins/lisa-copilot/rules/reference/prd-lifecycle-rollup.md +156 -0
- package/plugins/lisa-copilot/rules/reference/repo-scope-split.md +58 -0
- package/plugins/lisa-copilot/rules/reference/security-audit-handling.md +30 -0
- package/plugins/lisa-copilot/rules/reference/usage-accounting.md +144 -0
- package/plugins/lisa-copilot/rules/reference/verification.md +124 -0
- package/plugins/lisa-copilot/rules/reference/wiki-knowledge-source.md +14 -0
- package/plugins/lisa-copilot/scripts/automation-status-claude-adapter.mjs +672 -0
- package/plugins/lisa-copilot/scripts/automation-status-codex-adapter.mjs +697 -0
- package/plugins/lisa-copilot/scripts/automation-status-contract-drift.mjs +392 -0
- package/plugins/lisa-copilot/scripts/automation-status-expected-fleet.mjs +319 -0
- package/plugins/lisa-copilot/scripts/automation-status-report.mjs +170 -0
- package/plugins/lisa-copilot/scripts/doctor-report.mjs +143 -0
- package/plugins/lisa-copilot/scripts/plugin-sync-explain.mjs +512 -0
- package/plugins/lisa-copilot/scripts/project-ideation-idempotency-harness.mjs +319 -0
- package/plugins/lisa-copilot/scripts/queue-contract-resolution.mjs +453 -0
- package/plugins/lisa-copilot/scripts/queue-health-classification.mjs +157 -0
- package/plugins/lisa-copilot/scripts/queue-status-build-readers.mjs +509 -0
- package/plugins/lisa-copilot/scripts/queue-status-prd-readers.mjs +452 -0
- package/plugins/lisa-copilot/skills/acceptance-criteria/SKILL.md +71 -0
- package/plugins/lisa-copilot/skills/agent-design-best-practices/SKILL.md +219 -0
- package/plugins/lisa-copilot/skills/atlassian-access/SKILL.md +293 -0
- package/plugins/lisa-copilot/skills/automation-status/SKILL.md +111 -0
- package/plugins/lisa-copilot/skills/bug-triage/SKILL.md +23 -0
- package/plugins/lisa-copilot/skills/codebase-research/SKILL.md +87 -0
- package/plugins/lisa-copilot/skills/codify-verification/SKILL.md +152 -0
- package/plugins/lisa-copilot/skills/confluence-prd-intake/SKILL.md +417 -0
- package/plugins/lisa-copilot/skills/confluence-to-tracker/SKILL.md +360 -0
- package/plugins/lisa-copilot/skills/confluence-write-prd/SKILL.md +109 -0
- package/plugins/lisa-copilot/skills/debrief/SKILL.md +94 -0
- package/plugins/lisa-copilot/skills/debrief-apply/SKILL.md +63 -0
- package/plugins/lisa-copilot/skills/doctor/SKILL.md +317 -0
- package/plugins/lisa-copilot/skills/epic-triage/SKILL.md +28 -0
- package/plugins/lisa-copilot/skills/fix-linter-error/SKILL.md +45 -0
- package/plugins/lisa-copilot/skills/git-commit/SKILL.md +48 -0
- package/plugins/lisa-copilot/skills/git-prune/SKILL.md +35 -0
- package/plugins/lisa-copilot/skills/git-submit-pr/SKILL.md +105 -0
- package/plugins/lisa-copilot/skills/github-add-journey/SKILL.md +115 -0
- package/plugins/lisa-copilot/skills/github-build-intake/SKILL.md +377 -0
- package/plugins/lisa-copilot/skills/github-create/SKILL.md +101 -0
- package/plugins/lisa-copilot/skills/github-evidence/SKILL.md +110 -0
- package/plugins/lisa-copilot/skills/github-journey/SKILL.md +121 -0
- package/plugins/lisa-copilot/skills/github-prd-intake/SKILL.md +432 -0
- package/plugins/lisa-copilot/skills/github-project-v2/SKILL.md +227 -0
- package/plugins/lisa-copilot/skills/github-read-issue/SKILL.md +248 -0
- package/plugins/lisa-copilot/skills/github-sync/SKILL.md +119 -0
- package/plugins/lisa-copilot/skills/github-to-tracker/SKILL.md +345 -0
- package/plugins/lisa-copilot/skills/github-validate-issue/SKILL.md +331 -0
- package/plugins/lisa-copilot/skills/github-verify/SKILL.md +29 -0
- package/plugins/lisa-copilot/skills/github-write-issue/SKILL.md +339 -0
- package/plugins/lisa-copilot/skills/github-write-prd/SKILL.md +157 -0
- package/plugins/lisa-copilot/skills/implement/SKILL.md +145 -0
- package/plugins/lisa-copilot/skills/improve-code-complexity/SKILL.md +44 -0
- package/plugins/lisa-copilot/skills/improve-max-lines/SKILL.md +45 -0
- package/plugins/lisa-copilot/skills/improve-max-lines-per-function/SKILL.md +46 -0
- package/plugins/lisa-copilot/skills/improve-test-coverage/SKILL.md +44 -0
- package/plugins/lisa-copilot/skills/improve-tests/SKILL.md +47 -0
- package/plugins/lisa-copilot/skills/intake/SKILL.md +132 -0
- package/plugins/lisa-copilot/skills/intake-explain/SKILL.md +279 -0
- package/plugins/lisa-copilot/skills/jira-add-journey/SKILL.md +121 -0
- package/plugins/lisa-copilot/skills/jira-build-intake/SKILL.md +286 -0
- package/plugins/lisa-copilot/skills/jira-create/SKILL.md +154 -0
- package/plugins/lisa-copilot/skills/jira-evidence/SKILL.md +90 -0
- package/plugins/lisa-copilot/skills/jira-evidence/scripts/post-evidence.sh +163 -0
- package/plugins/lisa-copilot/skills/jira-journey/SKILL.md +127 -0
- package/plugins/lisa-copilot/skills/jira-journey/scripts/generate-templates.py +233 -0
- package/plugins/lisa-copilot/skills/jira-journey/scripts/parse-plan.py +368 -0
- package/plugins/lisa-copilot/skills/jira-read-ticket/SKILL.md +198 -0
- package/plugins/lisa-copilot/skills/jira-read-ticket/scripts/download-attachment.sh +110 -0
- package/plugins/lisa-copilot/skills/jira-sync/SKILL.md +95 -0
- package/plugins/lisa-copilot/skills/jira-validate-ticket/SKILL.md +318 -0
- package/plugins/lisa-copilot/skills/jira-verify/SKILL.md +30 -0
- package/plugins/lisa-copilot/skills/jira-write-ticket/SKILL.md +265 -0
- package/plugins/lisa-copilot/skills/jsdoc-best-practices/SKILL.md +432 -0
- package/plugins/lisa-copilot/skills/linear-add-journey/SKILL.md +105 -0
- package/plugins/lisa-copilot/skills/linear-build-intake/SKILL.md +283 -0
- package/plugins/lisa-copilot/skills/linear-create/SKILL.md +146 -0
- package/plugins/lisa-copilot/skills/linear-evidence/SKILL.md +103 -0
- package/plugins/lisa-copilot/skills/linear-journey/SKILL.md +134 -0
- package/plugins/lisa-copilot/skills/linear-prd-intake/SKILL.md +383 -0
- package/plugins/lisa-copilot/skills/linear-read-issue/SKILL.md +200 -0
- package/plugins/lisa-copilot/skills/linear-sync/SKILL.md +114 -0
- package/plugins/lisa-copilot/skills/linear-to-tracker/SKILL.md +342 -0
- package/plugins/lisa-copilot/skills/linear-validate-issue/SKILL.md +313 -0
- package/plugins/lisa-copilot/skills/linear-verify/SKILL.md +51 -0
- package/plugins/lisa-copilot/skills/linear-write-issue/SKILL.md +292 -0
- package/plugins/lisa-copilot/skills/linear-write-prd/SKILL.md +96 -0
- package/plugins/lisa-copilot/skills/lisa-review-implementation/SKILL.md +209 -0
- package/plugins/lisa-copilot/skills/monitor/SKILL.md +48 -0
- package/plugins/lisa-copilot/skills/nightly-add-test-coverage/SKILL.md +40 -0
- package/plugins/lisa-copilot/skills/nightly-improve-tests/SKILL.md +29 -0
- package/plugins/lisa-copilot/skills/nightly-lower-code-complexity/SKILL.md +28 -0
- package/plugins/lisa-copilot/skills/notion-access/SKILL.md +226 -0
- package/plugins/lisa-copilot/skills/notion-prd-intake/SKILL.md +360 -0
- package/plugins/lisa-copilot/skills/notion-to-tracker/SKILL.md +357 -0
- package/plugins/lisa-copilot/skills/notion-write-prd/SKILL.md +109 -0
- package/plugins/lisa-copilot/skills/performance-review/SKILL.md +94 -0
- package/plugins/lisa-copilot/skills/plan/SKILL.md +60 -0
- package/plugins/lisa-copilot/skills/plugin-sync-explain/SKILL.md +53 -0
- package/plugins/lisa-copilot/skills/prd-backlink/SKILL.md +265 -0
- package/plugins/lisa-copilot/skills/prd-source-write/SKILL.md +101 -0
- package/plugins/lisa-copilot/skills/prd-ticket-coverage/SKILL.md +170 -0
- package/plugins/lisa-copilot/skills/product-walkthrough/SKILL.md +129 -0
- package/plugins/lisa-copilot/skills/project-ideation/SKILL.md +315 -0
- package/plugins/lisa-copilot/skills/project-ideation/examples/evidence-card-format.md +21 -0
- package/plugins/lisa-copilot/skills/project-ideation/examples/host-project-only.md +22 -0
- package/plugins/lisa-copilot/skills/project-ideation/examples/idempotency-verification-harness.md +57 -0
- package/plugins/lisa-copilot/skills/project-ideation/examples/public-external-inspiration.md +22 -0
- package/plugins/lisa-copilot/skills/project-ideation/examples/unavailable-data-rejection.md +22 -0
- package/plugins/lisa-copilot/skills/pull-request-review/SKILL.md +68 -0
- package/plugins/lisa-copilot/skills/quality-review/SKILL.md +54 -0
- package/plugins/lisa-copilot/skills/queue-status/SKILL.md +133 -0
- package/plugins/lisa-copilot/skills/repair-intake/SKILL.md +584 -0
- package/plugins/lisa-copilot/skills/reproduce-bug/SKILL.md +96 -0
- package/plugins/lisa-copilot/skills/research/SKILL.md +68 -0
- package/plugins/lisa-copilot/skills/review-local/SKILL.md +88 -0
- package/plugins/lisa-copilot/skills/root-cause-analysis/SKILL.md +155 -0
- package/plugins/lisa-copilot/skills/security-review/SKILL.md +57 -0
- package/plugins/lisa-copilot/skills/security-zap-scan/SKILL.md +33 -0
- package/plugins/lisa-copilot/skills/setup-atlassian/SKILL.md +347 -0
- package/plugins/lisa-copilot/skills/setup-automations/SKILL.md +99 -0
- package/plugins/lisa-copilot/skills/setup-confluence/SKILL.md +254 -0
- package/plugins/lisa-copilot/skills/setup-github/SKILL.md +268 -0
- package/plugins/lisa-copilot/skills/setup-jira/SKILL.md +198 -0
- package/plugins/lisa-copilot/skills/setup-linear/SKILL.md +251 -0
- package/plugins/lisa-copilot/skills/setup-notion/SKILL.md +316 -0
- package/plugins/lisa-copilot/skills/spec-conformance/SKILL.md +159 -0
- package/plugins/lisa-copilot/skills/task-decomposition/SKILL.md +127 -0
- package/plugins/lisa-copilot/skills/task-triage/SKILL.md +23 -0
- package/plugins/lisa-copilot/skills/tdd-implementation/SKILL.md +83 -0
- package/plugins/lisa-copilot/skills/tear-down-automations/SKILL.md +34 -0
- package/plugins/lisa-copilot/skills/test-strategy/SKILL.md +63 -0
- package/plugins/lisa-copilot/skills/ticket-triage/SKILL.md +182 -0
- package/plugins/lisa-copilot/skills/tracker-add-journey/SKILL.md +26 -0
- package/plugins/lisa-copilot/skills/tracker-build-intake/SKILL.md +64 -0
- package/plugins/lisa-copilot/skills/tracker-create/SKILL.md +26 -0
- package/plugins/lisa-copilot/skills/tracker-evidence/SKILL.md +52 -0
- package/plugins/lisa-copilot/skills/tracker-journey/SKILL.md +26 -0
- package/plugins/lisa-copilot/skills/tracker-read/SKILL.md +27 -0
- package/plugins/lisa-copilot/skills/tracker-source-artifacts/SKILL.md +107 -0
- package/plugins/lisa-copilot/skills/tracker-sync/SKILL.md +51 -0
- package/plugins/lisa-copilot/skills/tracker-validate/SKILL.md +36 -0
- package/plugins/lisa-copilot/skills/tracker-verify/SKILL.md +27 -0
- package/plugins/lisa-copilot/skills/tracker-write/SKILL.md +53 -0
- package/plugins/lisa-copilot/skills/usage-accounting/SKILL.md +170 -0
- package/plugins/lisa-copilot/skills/verification-lifecycle/SKILL.md +339 -0
- package/plugins/lisa-copilot/skills/verify/SKILL.md +49 -0
- package/plugins/lisa-copilot/skills/verify-prd/SKILL.md +392 -0
- package/plugins/lisa-copilot/skills/wiki-install/SKILL.md +101 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +52 -0
- package/plugins/lisa-cursor/agents/architecture-specialist.md +47 -0
- package/plugins/lisa-cursor/agents/bug-fixer.md +39 -0
- package/plugins/lisa-cursor/agents/builder.md +40 -0
- package/plugins/lisa-cursor/agents/confluence-prd-intake.md +65 -0
- package/plugins/lisa-cursor/agents/debug-specialist.md +114 -0
- package/plugins/lisa-cursor/agents/git-history-analyzer.md +183 -0
- package/plugins/lisa-cursor/agents/github-agent.md +148 -0
- package/plugins/lisa-cursor/agents/github-build-intake.md +64 -0
- package/plugins/lisa-cursor/agents/github-prd-intake.md +66 -0
- package/plugins/lisa-cursor/agents/jira-agent.md +129 -0
- package/plugins/lisa-cursor/agents/jira-build-intake.md +64 -0
- package/plugins/lisa-cursor/agents/learner.md +43 -0
- package/plugins/lisa-cursor/agents/learnings-synthesizer.md +135 -0
- package/plugins/lisa-cursor/agents/linear-agent.md +134 -0
- package/plugins/lisa-cursor/agents/linear-build-intake.md +64 -0
- package/plugins/lisa-cursor/agents/linear-prd-intake.md +66 -0
- package/plugins/lisa-cursor/agents/notion-prd-intake.md +63 -0
- package/plugins/lisa-cursor/agents/performance-specialist.md +85 -0
- package/plugins/lisa-cursor/agents/pr-mining-specialist.md +85 -0
- package/plugins/lisa-cursor/agents/product-specialist.md +63 -0
- package/plugins/lisa-cursor/agents/quality-specialist.md +56 -0
- package/plugins/lisa-cursor/agents/security-specialist.md +51 -0
- package/plugins/lisa-cursor/agents/skill-evaluator.md +245 -0
- package/plugins/lisa-cursor/agents/spec-conformance-specialist.md +49 -0
- package/plugins/lisa-cursor/agents/test-specialist.md +49 -0
- package/plugins/lisa-cursor/agents/tracker-mining-specialist.md +85 -0
- package/plugins/lisa-cursor/agents/verification-specialist.md +135 -0
- package/plugins/lisa-cursor/commands/automation-status.md +12 -0
- package/plugins/lisa-cursor/commands/codify-verification.md +6 -0
- package/plugins/lisa-cursor/commands/debrief/apply.md +6 -0
- package/plugins/lisa-cursor/commands/debrief.md +6 -0
- package/plugins/lisa-cursor/commands/doctor.md +6 -0
- package/plugins/lisa-cursor/commands/fix/linter-error.md +7 -0
- package/plugins/lisa-cursor/commands/git/commit.md +7 -0
- package/plugins/lisa-cursor/commands/git/prune.md +6 -0
- package/plugins/lisa-cursor/commands/git/submit-pr.md +7 -0
- package/plugins/lisa-cursor/commands/implement.md +6 -0
- package/plugins/lisa-cursor/commands/improve/code-complexity.md +6 -0
- package/plugins/lisa-cursor/commands/improve/max-lines-per-function.md +7 -0
- package/plugins/lisa-cursor/commands/improve/max-lines.md +7 -0
- package/plugins/lisa-cursor/commands/improve/test-coverage.md +7 -0
- package/plugins/lisa-cursor/commands/improve/tests.md +7 -0
- package/plugins/lisa-cursor/commands/intake-explain.md +31 -0
- package/plugins/lisa-cursor/commands/intake.md +6 -0
- package/plugins/lisa-cursor/commands/monitor.md +6 -0
- package/plugins/lisa-cursor/commands/plan.md +6 -0
- package/plugins/lisa-cursor/commands/plugin-sync-explain.md +8 -0
- package/plugins/lisa-cursor/commands/product-walkthrough.md +7 -0
- package/plugins/lisa-cursor/commands/project-ideation.md +6 -0
- package/plugins/lisa-cursor/commands/pull-request/review.md +7 -0
- package/plugins/lisa-cursor/commands/queue-status.md +34 -0
- package/plugins/lisa-cursor/commands/repair-intake.md +6 -0
- package/plugins/lisa-cursor/commands/research.md +6 -0
- package/plugins/lisa-cursor/commands/review/local.md +6 -0
- package/plugins/lisa-cursor/commands/security/zap-scan.md +6 -0
- package/plugins/lisa-cursor/commands/setup/atlassian.md +7 -0
- package/plugins/lisa-cursor/commands/setup/confluence.md +7 -0
- package/plugins/lisa-cursor/commands/setup/github.md +7 -0
- package/plugins/lisa-cursor/commands/setup/jira.md +7 -0
- package/plugins/lisa-cursor/commands/setup/linear.md +7 -0
- package/plugins/lisa-cursor/commands/setup/notion.md +7 -0
- package/plugins/lisa-cursor/commands/setup-automations.md +6 -0
- package/plugins/lisa-cursor/commands/tear-down-automations.md +6 -0
- package/plugins/lisa-cursor/commands/verify-prd.md +6 -0
- package/plugins/lisa-cursor/commands/verify.md +6 -0
- package/plugins/lisa-cursor/commands/wiki/install.md +7 -0
- package/plugins/lisa-cursor/hooks/block-no-verify.sh +37 -0
- package/plugins/lisa-cursor/hooks/install-pkgs.sh +69 -0
- package/plugins/lisa-cursor/hooks/notify-ntfy.sh +183 -0
- package/plugins/lisa-cursor/hooks/setup-jira-cli.sh +51 -0
- package/plugins/lisa-cursor/rules/eager/base-rules.md +70 -0
- package/plugins/lisa-cursor/rules/eager/coding-philosophy.md +27 -0
- package/plugins/lisa-cursor/rules/eager/config-resolution.md +28 -0
- package/plugins/lisa-cursor/rules/eager/documentation-source-paths.md +13 -0
- package/plugins/lisa-cursor/rules/eager/empirical-inquiry.md +22 -0
- package/plugins/lisa-cursor/rules/eager/intent-routing.md +18 -0
- package/plugins/lisa-cursor/rules/eager/leaf-only-lifecycle.md +39 -0
- package/plugins/lisa-cursor/rules/eager/prd-lifecycle-rollup.md +31 -0
- package/plugins/lisa-cursor/rules/eager/repo-scope-split.md +39 -0
- package/plugins/lisa-cursor/rules/eager/security-audit-handling.md +29 -0
- package/plugins/lisa-cursor/rules/eager/usage-accounting.md +28 -0
- package/plugins/lisa-cursor/rules/eager/verification.md +21 -0
- package/plugins/lisa-cursor/rules/eager/wiki-knowledge-source.md +16 -0
- package/plugins/lisa-cursor/rules/reference/base-rules.md +133 -0
- package/plugins/lisa-cursor/rules/reference/coding-philosophy.md +428 -0
- package/plugins/lisa-cursor/rules/reference/config-resolution.md +691 -0
- package/plugins/lisa-cursor/rules/reference/documentation-source-paths.md +13 -0
- package/plugins/lisa-cursor/rules/reference/empirical-inquiry.md +27 -0
- package/plugins/lisa-cursor/rules/reference/intent-routing.md +407 -0
- package/plugins/lisa-cursor/rules/reference/leaf-only-lifecycle.md +120 -0
- package/plugins/lisa-cursor/rules/reference/prd-lifecycle-rollup.md +156 -0
- package/plugins/lisa-cursor/rules/reference/repo-scope-split.md +58 -0
- package/plugins/lisa-cursor/rules/reference/security-audit-handling.md +30 -0
- package/plugins/lisa-cursor/rules/reference/usage-accounting.md +144 -0
- package/plugins/lisa-cursor/rules/reference/verification.md +124 -0
- package/plugins/lisa-cursor/rules/reference/wiki-knowledge-source.md +14 -0
- package/plugins/lisa-cursor/scripts/automation-status-claude-adapter.mjs +672 -0
- package/plugins/lisa-cursor/scripts/automation-status-codex-adapter.mjs +697 -0
- package/plugins/lisa-cursor/scripts/automation-status-contract-drift.mjs +392 -0
- package/plugins/lisa-cursor/scripts/automation-status-expected-fleet.mjs +319 -0
- package/plugins/lisa-cursor/scripts/automation-status-report.mjs +170 -0
- package/plugins/lisa-cursor/scripts/doctor-report.mjs +143 -0
- package/plugins/lisa-cursor/scripts/plugin-sync-explain.mjs +512 -0
- package/plugins/lisa-cursor/scripts/project-ideation-idempotency-harness.mjs +319 -0
- package/plugins/lisa-cursor/scripts/queue-contract-resolution.mjs +453 -0
- package/plugins/lisa-cursor/scripts/queue-health-classification.mjs +157 -0
- package/plugins/lisa-cursor/scripts/queue-status-build-readers.mjs +509 -0
- package/plugins/lisa-cursor/scripts/queue-status-prd-readers.mjs +452 -0
- package/plugins/lisa-cursor/skills/acceptance-criteria/SKILL.md +71 -0
- package/plugins/lisa-cursor/skills/agent-design-best-practices/SKILL.md +219 -0
- package/plugins/lisa-cursor/skills/atlassian-access/SKILL.md +293 -0
- package/plugins/lisa-cursor/skills/automation-status/SKILL.md +111 -0
- package/plugins/lisa-cursor/skills/bug-triage/SKILL.md +23 -0
- package/plugins/lisa-cursor/skills/codebase-research/SKILL.md +87 -0
- package/plugins/lisa-cursor/skills/codify-verification/SKILL.md +152 -0
- package/plugins/lisa-cursor/skills/confluence-prd-intake/SKILL.md +417 -0
- package/plugins/lisa-cursor/skills/confluence-to-tracker/SKILL.md +360 -0
- package/plugins/lisa-cursor/skills/confluence-write-prd/SKILL.md +109 -0
- package/plugins/lisa-cursor/skills/debrief/SKILL.md +94 -0
- package/plugins/lisa-cursor/skills/debrief-apply/SKILL.md +63 -0
- package/plugins/lisa-cursor/skills/doctor/SKILL.md +317 -0
- package/plugins/lisa-cursor/skills/epic-triage/SKILL.md +28 -0
- package/plugins/lisa-cursor/skills/fix-linter-error/SKILL.md +45 -0
- package/plugins/lisa-cursor/skills/git-commit/SKILL.md +48 -0
- package/plugins/lisa-cursor/skills/git-prune/SKILL.md +35 -0
- package/plugins/lisa-cursor/skills/git-submit-pr/SKILL.md +105 -0
- package/plugins/lisa-cursor/skills/github-add-journey/SKILL.md +115 -0
- package/plugins/lisa-cursor/skills/github-build-intake/SKILL.md +377 -0
- package/plugins/lisa-cursor/skills/github-create/SKILL.md +101 -0
- package/plugins/lisa-cursor/skills/github-evidence/SKILL.md +110 -0
- package/plugins/lisa-cursor/skills/github-journey/SKILL.md +121 -0
- package/plugins/lisa-cursor/skills/github-prd-intake/SKILL.md +432 -0
- package/plugins/lisa-cursor/skills/github-project-v2/SKILL.md +227 -0
- package/plugins/lisa-cursor/skills/github-read-issue/SKILL.md +248 -0
- package/plugins/lisa-cursor/skills/github-sync/SKILL.md +119 -0
- package/plugins/lisa-cursor/skills/github-to-tracker/SKILL.md +345 -0
- package/plugins/lisa-cursor/skills/github-validate-issue/SKILL.md +331 -0
- package/plugins/lisa-cursor/skills/github-verify/SKILL.md +29 -0
- package/plugins/lisa-cursor/skills/github-write-issue/SKILL.md +339 -0
- package/plugins/lisa-cursor/skills/github-write-prd/SKILL.md +157 -0
- package/plugins/lisa-cursor/skills/implement/SKILL.md +145 -0
- package/plugins/lisa-cursor/skills/improve-code-complexity/SKILL.md +44 -0
- package/plugins/lisa-cursor/skills/improve-max-lines/SKILL.md +45 -0
- package/plugins/lisa-cursor/skills/improve-max-lines-per-function/SKILL.md +46 -0
- package/plugins/lisa-cursor/skills/improve-test-coverage/SKILL.md +44 -0
- package/plugins/lisa-cursor/skills/improve-tests/SKILL.md +47 -0
- package/plugins/lisa-cursor/skills/intake/SKILL.md +132 -0
- package/plugins/lisa-cursor/skills/intake-explain/SKILL.md +279 -0
- package/plugins/lisa-cursor/skills/jira-add-journey/SKILL.md +121 -0
- package/plugins/lisa-cursor/skills/jira-build-intake/SKILL.md +286 -0
- package/plugins/lisa-cursor/skills/jira-create/SKILL.md +154 -0
- package/plugins/lisa-cursor/skills/jira-evidence/SKILL.md +90 -0
- package/plugins/lisa-cursor/skills/jira-evidence/scripts/post-evidence.sh +163 -0
- package/plugins/lisa-cursor/skills/jira-journey/SKILL.md +127 -0
- package/plugins/lisa-cursor/skills/jira-journey/scripts/generate-templates.py +233 -0
- package/plugins/lisa-cursor/skills/jira-journey/scripts/parse-plan.py +368 -0
- package/plugins/lisa-cursor/skills/jira-read-ticket/SKILL.md +198 -0
- package/plugins/lisa-cursor/skills/jira-read-ticket/scripts/download-attachment.sh +110 -0
- package/plugins/lisa-cursor/skills/jira-sync/SKILL.md +95 -0
- package/plugins/lisa-cursor/skills/jira-validate-ticket/SKILL.md +318 -0
- package/plugins/lisa-cursor/skills/jira-verify/SKILL.md +30 -0
- package/plugins/lisa-cursor/skills/jira-write-ticket/SKILL.md +265 -0
- package/plugins/lisa-cursor/skills/jsdoc-best-practices/SKILL.md +432 -0
- package/plugins/lisa-cursor/skills/linear-add-journey/SKILL.md +105 -0
- package/plugins/lisa-cursor/skills/linear-build-intake/SKILL.md +283 -0
- package/plugins/lisa-cursor/skills/linear-create/SKILL.md +146 -0
- package/plugins/lisa-cursor/skills/linear-evidence/SKILL.md +103 -0
- package/plugins/lisa-cursor/skills/linear-journey/SKILL.md +134 -0
- package/plugins/lisa-cursor/skills/linear-prd-intake/SKILL.md +383 -0
- package/plugins/lisa-cursor/skills/linear-read-issue/SKILL.md +200 -0
- package/plugins/lisa-cursor/skills/linear-sync/SKILL.md +114 -0
- package/plugins/lisa-cursor/skills/linear-to-tracker/SKILL.md +342 -0
- package/plugins/lisa-cursor/skills/linear-validate-issue/SKILL.md +313 -0
- package/plugins/lisa-cursor/skills/linear-verify/SKILL.md +51 -0
- package/plugins/lisa-cursor/skills/linear-write-issue/SKILL.md +292 -0
- package/plugins/lisa-cursor/skills/linear-write-prd/SKILL.md +96 -0
- package/plugins/lisa-cursor/skills/lisa-review-implementation/SKILL.md +209 -0
- package/plugins/lisa-cursor/skills/monitor/SKILL.md +48 -0
- package/plugins/lisa-cursor/skills/nightly-add-test-coverage/SKILL.md +40 -0
- package/plugins/lisa-cursor/skills/nightly-improve-tests/SKILL.md +29 -0
- package/plugins/lisa-cursor/skills/nightly-lower-code-complexity/SKILL.md +28 -0
- package/plugins/lisa-cursor/skills/notion-access/SKILL.md +226 -0
- package/plugins/lisa-cursor/skills/notion-prd-intake/SKILL.md +360 -0
- package/plugins/lisa-cursor/skills/notion-to-tracker/SKILL.md +357 -0
- package/plugins/lisa-cursor/skills/notion-write-prd/SKILL.md +109 -0
- package/plugins/lisa-cursor/skills/performance-review/SKILL.md +94 -0
- package/plugins/lisa-cursor/skills/plan/SKILL.md +60 -0
- package/plugins/lisa-cursor/skills/plugin-sync-explain/SKILL.md +53 -0
- package/plugins/lisa-cursor/skills/prd-backlink/SKILL.md +265 -0
- package/plugins/lisa-cursor/skills/prd-source-write/SKILL.md +101 -0
- package/plugins/lisa-cursor/skills/prd-ticket-coverage/SKILL.md +170 -0
- package/plugins/lisa-cursor/skills/product-walkthrough/SKILL.md +129 -0
- package/plugins/lisa-cursor/skills/project-ideation/SKILL.md +315 -0
- package/plugins/lisa-cursor/skills/project-ideation/examples/evidence-card-format.md +21 -0
- package/plugins/lisa-cursor/skills/project-ideation/examples/host-project-only.md +22 -0
- package/plugins/lisa-cursor/skills/project-ideation/examples/idempotency-verification-harness.md +57 -0
- package/plugins/lisa-cursor/skills/project-ideation/examples/public-external-inspiration.md +22 -0
- package/plugins/lisa-cursor/skills/project-ideation/examples/unavailable-data-rejection.md +22 -0
- package/plugins/lisa-cursor/skills/pull-request-review/SKILL.md +68 -0
- package/plugins/lisa-cursor/skills/quality-review/SKILL.md +54 -0
- package/plugins/lisa-cursor/skills/queue-status/SKILL.md +133 -0
- package/plugins/lisa-cursor/skills/repair-intake/SKILL.md +584 -0
- package/plugins/lisa-cursor/skills/reproduce-bug/SKILL.md +96 -0
- package/plugins/lisa-cursor/skills/research/SKILL.md +68 -0
- package/plugins/lisa-cursor/skills/review-local/SKILL.md +88 -0
- package/plugins/lisa-cursor/skills/root-cause-analysis/SKILL.md +155 -0
- package/plugins/lisa-cursor/skills/security-review/SKILL.md +57 -0
- package/plugins/lisa-cursor/skills/security-zap-scan/SKILL.md +33 -0
- package/plugins/lisa-cursor/skills/setup-atlassian/SKILL.md +347 -0
- package/plugins/lisa-cursor/skills/setup-automations/SKILL.md +99 -0
- package/plugins/lisa-cursor/skills/setup-confluence/SKILL.md +254 -0
- package/plugins/lisa-cursor/skills/setup-github/SKILL.md +268 -0
- package/plugins/lisa-cursor/skills/setup-jira/SKILL.md +198 -0
- package/plugins/lisa-cursor/skills/setup-linear/SKILL.md +251 -0
- package/plugins/lisa-cursor/skills/setup-notion/SKILL.md +316 -0
- package/plugins/lisa-cursor/skills/spec-conformance/SKILL.md +159 -0
- package/plugins/lisa-cursor/skills/task-decomposition/SKILL.md +127 -0
- package/plugins/lisa-cursor/skills/task-triage/SKILL.md +23 -0
- package/plugins/lisa-cursor/skills/tdd-implementation/SKILL.md +83 -0
- package/plugins/lisa-cursor/skills/tear-down-automations/SKILL.md +34 -0
- package/plugins/lisa-cursor/skills/test-strategy/SKILL.md +63 -0
- package/plugins/lisa-cursor/skills/ticket-triage/SKILL.md +182 -0
- package/plugins/lisa-cursor/skills/tracker-add-journey/SKILL.md +26 -0
- package/plugins/lisa-cursor/skills/tracker-build-intake/SKILL.md +64 -0
- package/plugins/lisa-cursor/skills/tracker-create/SKILL.md +26 -0
- package/plugins/lisa-cursor/skills/tracker-evidence/SKILL.md +52 -0
- package/plugins/lisa-cursor/skills/tracker-journey/SKILL.md +26 -0
- package/plugins/lisa-cursor/skills/tracker-read/SKILL.md +27 -0
- package/plugins/lisa-cursor/skills/tracker-source-artifacts/SKILL.md +107 -0
- package/plugins/lisa-cursor/skills/tracker-sync/SKILL.md +51 -0
- package/plugins/lisa-cursor/skills/tracker-validate/SKILL.md +36 -0
- package/plugins/lisa-cursor/skills/tracker-verify/SKILL.md +27 -0
- package/plugins/lisa-cursor/skills/tracker-write/SKILL.md +53 -0
- package/plugins/lisa-cursor/skills/usage-accounting/SKILL.md +170 -0
- package/plugins/lisa-cursor/skills/verification-lifecycle/SKILL.md +339 -0
- package/plugins/lisa-cursor/skills/verify/SKILL.md +49 -0
- package/plugins/lisa-cursor/skills/verify-prd/SKILL.md +392 -0
- package/plugins/lisa-cursor/skills/wiki-install/SKILL.md +101 -0
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +2 -1
- package/plugins/lisa-harper-fabric/hooks/hooks.json +26 -0
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +2 -1
- package/plugins/lisa-nestjs/hooks/hooks.json +15 -0
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +2 -1
- package/plugins/lisa-rails/hooks/hooks.json +41 -0
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +2 -1
- package/plugins/lisa-typescript/hooks/format-on-edit.sh +5 -3
- package/plugins/lisa-typescript/hooks/hooks.json +34 -0
- package/plugins/lisa-typescript/hooks/lint-on-edit.sh +5 -2
- package/plugins/lisa-typescript/hooks/sg-scan-on-edit.sh +5 -2
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/src/typescript/hooks/format-on-edit.sh +5 -3
- package/plugins/src/typescript/hooks/lint-on-edit.sh +5 -2
- package/plugins/src/typescript/hooks/sg-scan-on-edit.sh +5 -2
- package/scripts/build-plugins.sh +24 -0
- package/scripts/generate-agy-plugin-artifacts.mjs +168 -0
- package/scripts/generate-codex-plugin-artifacts.mjs +150 -12
- package/scripts/generate-copilot-plugin-artifacts.mjs +235 -0
- package/scripts/generate-cursor-plugin-artifacts.mjs +177 -0
- package/scripts/internal-agy-skill-policy.json +3 -0
- package/scripts/internal-copilot-runtime-probe.json +13 -0
- package/scripts/internal-copilot-skill-policy.json +3 -0
- package/scripts/internal-cursor-skill-policy.json +3 -0
- package/scripts/lib/per-agent-hook-filter.mjs +249 -0
- package/scripts/probes/wave3-verification.sh +106 -0
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: plugin-sync-explain
|
|
3
|
+
description: "Read-only diagnostic for Lisa plugin source/generated drift. Compares plugins/src against generated plugins/lisa* status, reports source-not-built, generated-only, and marketplace registration drift, and preserves the working tree."
|
|
4
|
+
allowed-tools: ["Bash", "Read"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Plugin Sync Explain: $ARGUMENTS
|
|
8
|
+
|
|
9
|
+
`/lisa:plugin-sync-explain` explains why the plugin sync gate would need attention without mutating the working tree.
|
|
10
|
+
|
|
11
|
+
## Scope
|
|
12
|
+
|
|
13
|
+
Inspect the current Lisa repository, or an optional path passed as `$ARGUMENTS`, using `scripts/plugin-sync-explain.mjs`.
|
|
14
|
+
|
|
15
|
+
The diagnostic is **read-only**:
|
|
16
|
+
|
|
17
|
+
- Do not run `bun run build:plugins`.
|
|
18
|
+
- Do not run `bun run check:plugins`.
|
|
19
|
+
- Do not edit source files, generated plugin artifacts, or `.claude-plugin/marketplace.json`.
|
|
20
|
+
- Do not stash, commit, reset, or clean local changes.
|
|
21
|
+
|
|
22
|
+
## What to Report
|
|
23
|
+
|
|
24
|
+
Report a concise terminal-first summary with stable classifications:
|
|
25
|
+
|
|
26
|
+
- `SOURCE_NOT_BUILT`: files under `plugins/src/**` changed without their generated `plugins/lisa*` counterpart.
|
|
27
|
+
- `GENERATED_ONLY`: files under `plugins/lisa*` changed without their `plugins/src/**` source counterpart.
|
|
28
|
+
- `MARKETPLACE_REGISTRATION_DRIFT`: a built plugin directory is missing from `.claude-plugin/marketplace.json`, or a marketplace source points at a missing built directory.
|
|
29
|
+
- `OUT_OF_SYNC`: source and generated counterparts both changed and need human review.
|
|
30
|
+
- `IN_SYNC`: no plugin source/generated or marketplace registration drift was detected.
|
|
31
|
+
|
|
32
|
+
For every finding, include the evidence path and the smallest source-first next action. Prefer `bun run build:plugins` only after source edits are in the right place, and preserve `bun run check:plugins` as the final reproducibility gate.
|
|
33
|
+
|
|
34
|
+
## Process
|
|
35
|
+
|
|
36
|
+
1. Resolve the repo path from `$ARGUMENTS` or the current directory.
|
|
37
|
+
2. Capture `git status --porcelain` before the diagnostic.
|
|
38
|
+
3. Run:
|
|
39
|
+
```bash
|
|
40
|
+
node plugins/lisa/scripts/plugin-sync-explain.mjs "$REPO_PATH"
|
|
41
|
+
```
|
|
42
|
+
If running from the source tree before generated artifacts are rebuilt, use:
|
|
43
|
+
```bash
|
|
44
|
+
node plugins/src/base/scripts/plugin-sync-explain.mjs "$REPO_PATH"
|
|
45
|
+
```
|
|
46
|
+
4. Capture `git status --porcelain` after the diagnostic and confirm it is unchanged.
|
|
47
|
+
5. Surface the script output plus the read-only confirmation.
|
|
48
|
+
|
|
49
|
+
## Rules
|
|
50
|
+
|
|
51
|
+
- Keep this surface aligned with `scripts/check-plugins-sync.sh`; it explains the gate but does not replace it.
|
|
52
|
+
- Treat `plugins/src/**` as the source of truth and `plugins/lisa*` as generated artifacts.
|
|
53
|
+
- If the diagnostic cannot inspect git status or marketplace JSON, report the error plainly and do not guess.
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prd-backlink
|
|
3
|
+
description: "Update a source PRD with an always-written, machine-readable `## Tickets` (alias `## Generated Work`) section linking back to every work item created from it. Each entry carries a parseable ref + URL + type + parent token so the generated child set is readable without scraping prose. Vendor-aware on the source side (Notion / Confluence / Linear / GitHub Issue / file) and tracker-agnostic on the ticket side; the documented section is written for every vendor, additive to native hierarchy linking. Idempotent — regenerates the section on each run rather than appending, so re-planning never accumulates stale links. Invoked by the *-to-tracker skills at the end of their pipeline and standalone if a PRD's Tickets section needs to be refreshed."
|
|
4
|
+
allowed-tools: ["Skill", "Bash", "Read", "Edit", "Write", "Glob", "Grep"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# PRD Back-link
|
|
8
|
+
|
|
9
|
+
Write or update the `## Tickets` section of a source PRD so it links to every work item created from that PRD. The Debrief flow (and a human reading the PRD months later) uses this section as the canonical work-item set for the initiative.
|
|
10
|
+
|
|
11
|
+
This documented section is the **always-written, machine-readable record** of the generated child set. It is written for **every** `source_type` — including the vendors that also get a native hierarchy link (`github` / `linear` / `jira`) — so the generated top-level work is readable later from the PRD body alone, without parsing free-form comments or depending on a native relationship that may be unavailable on older hosts or across vendors. Native hierarchy linking (see the per-vendor sections below) is **additive** to this section, never a substitute for it. This is the documented-section leg of the `prd-lifecycle-rollup` rule (cited by slug; its taxonomy is not restated here).
|
|
12
|
+
|
|
13
|
+
## Input
|
|
14
|
+
|
|
15
|
+
Pass `$ARGUMENTS` as a single JSON-style block:
|
|
16
|
+
|
|
17
|
+
```json
|
|
18
|
+
{
|
|
19
|
+
"source_type": "notion" | "confluence" | "linear" | "github" | "file",
|
|
20
|
+
"source_ref": "<URL, page id, project id, issue ref, or absolute file path>",
|
|
21
|
+
"tickets": [
|
|
22
|
+
{ "key": "<tracker-key>", "title": "<summary>", "type": "Epic|Story|Task|Sub-task|Bug|Spike", "url": "<link>", "parent_key": "<key or null>" }
|
|
23
|
+
],
|
|
24
|
+
"section_heading": "## Tickets" // optional override; default "## Tickets"
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Behaviour
|
|
29
|
+
|
|
30
|
+
1. **Fetch the current PRD content** using the source's native read tool:
|
|
31
|
+
- `notion` → `notion-fetch`
|
|
32
|
+
- `confluence` → `getConfluencePage`
|
|
33
|
+
- `linear` → Linear MCP project / issue read
|
|
34
|
+
- `github` → `gh issue view`
|
|
35
|
+
- `file` → `Read` tool on the absolute path
|
|
36
|
+
2. **Locate the existing section.** Search for `section_heading` (default `## Tickets`). The canonical heading is `## Tickets`; `## Generated Work` is an accepted alias that the reader recognizes — match either heading when locating an existing section so a PRD authored with either name is found and regenerated in place (never duplicated under the other name). If present under either name, you will replace it (keeping whichever heading was already there, or the explicit `section_heading` override). If not present, you will append a new section just before any closing footer / sign-off / signature block, otherwise at the end.
|
|
37
|
+
3. **Render the section.** Always render it — for every `source_type`, even when a native hierarchy link was also made (additive, not exclusive). Use the format below. Group by Epic. Within an Epic, group by Story. Sub-tasks nest under their Story. Bugs and Spikes that are not under a Story go in a flat list at the bottom. Each entry carries a machine-readable token (ref + URL + type + parent) so the generated child set is parseable without reading prose — see [Format](#format).
|
|
38
|
+
4. **Write the updated PRD back** using the source's native write tool:
|
|
39
|
+
- `notion` → `notion-update-page`
|
|
40
|
+
- `confluence` → `updateConfluencePage`
|
|
41
|
+
- `linear` → Linear MCP update
|
|
42
|
+
- `github` → `gh issue edit --body`
|
|
43
|
+
- `file` → `Edit` (preferred) or `Write` (full rewrite if needed)
|
|
44
|
+
5. **Record the PRD→child relationship in the source tool's native hierarchy** where the source supports it and the destination tracker is the same system. Each supported source has its own native-linking section, all governed by the same generated-top-level-work contract, child-ref idempotency, and graceful-degradation discipline from the `prd-lifecycle-rollup` rule:
|
|
45
|
+
- `github` (same repo as the created tickets) → native GitHub **sub-issue** of the PRD issue — see [Native parent linking (GitHub)](#native-parent-linking-github).
|
|
46
|
+
- `linear` (PRD also lives in Linear) → native **parent / project** relationship — see [Native parent linking (Linear)](#native-parent-linking-linear).
|
|
47
|
+
- `jira` (PRD also lives in the same JIRA/Atlassian instance) → native **parent / Epic link** or a documented **issue-link type** — see [Native parent linking (JIRA)](#native-parent-linking-jira).
|
|
48
|
+
|
|
49
|
+
The documented `## Tickets` section from step 3 is always written regardless; native linking is **in addition to** it, not a replacement (the documented section is the cross-vendor and older-host fallback per the `prd-lifecycle-rollup` rule). Sources without native issue hierarchy (Notion, Confluence, file) rely on the documented section alone, as does any cross-vendor combination (e.g. a Notion PRD with a JIRA tracker).
|
|
50
|
+
6. **Return** the rendered section (so the caller can include it in its own report) and the source URL of the updated PRD.
|
|
51
|
+
|
|
52
|
+
## Format
|
|
53
|
+
|
|
54
|
+
The rendered section must be deterministic — same inputs produce identical output bytes. This is what makes idempotency reliable. Every entry is simultaneously **human-readable** (a nested markdown link) and **machine-readable** (a trailing structured token), so the generated child set can be enumerated by parsing this section alone — the contract LPC-1.3 rollup (`github-prd-intake` / `*-prd-intake`) reads against, with no need to scrape free-form comments.
|
|
55
|
+
|
|
56
|
+
```markdown
|
|
57
|
+
## Tickets
|
|
58
|
+
|
|
59
|
+
_Generated by `lisa:prd-backlink`. Regenerated on every Plan run; do not edit by hand._
|
|
60
|
+
|
|
61
|
+
### <Epic key>: <Epic title>
|
|
62
|
+
|
|
63
|
+
- [<Epic key>](<url>) — Epic <!-- lisa:gw ref=<ref> url=<url> type=Epic parent= -->
|
|
64
|
+
- [<Story key>](<url>) — Story: <title> <!-- lisa:gw ref=<ref> url=<url> type=Story parent=<Epic ref> -->
|
|
65
|
+
- [<Sub-task key>](<url>) — Sub-task: <title> <!-- lisa:gw ref=<ref> url=<url> type=Sub-task parent=<Story ref> -->
|
|
66
|
+
- [<Sub-task key>](<url>) — Sub-task: <title> <!-- lisa:gw ref=<ref> url=<url> type=Sub-task parent=<Story ref> -->
|
|
67
|
+
- [<Story key>](<url>) — Story: <title> <!-- lisa:gw ref=<ref> url=<url> type=Story parent=<Epic ref> -->
|
|
68
|
+
|
|
69
|
+
### <Epic key>: <Epic title>
|
|
70
|
+
...
|
|
71
|
+
|
|
72
|
+
### Unparented items
|
|
73
|
+
|
|
74
|
+
- [<Bug key>](<url>) — Bug: <title> <!-- lisa:gw ref=<ref> url=<url> type=Bug parent= -->
|
|
75
|
+
- [<Spike key>](<url>) — Spike: <title> <!-- lisa:gw ref=<ref> url=<url> type=Spike parent= -->
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Machine-readable entry token
|
|
79
|
+
|
|
80
|
+
Every list entry ends with a single-line HTML comment — invisible in rendered markdown, so the section stays clean for humans, but a stable, greppable record for machines:
|
|
81
|
+
|
|
82
|
+
```text
|
|
83
|
+
<!-- lisa:gw ref=<ref> url=<url> type=<type> parent=<parent-ref or empty> -->
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
- **`lisa:gw`** — a fixed sentinel (`gw` = generated work). A reader enumerates the generated child set by matching `<!-- lisa:gw ` lines; it never has to parse the surrounding prose, headings, or indentation.
|
|
87
|
+
- **`ref`** — the child-ref identity from the `prd-lifecycle-rollup` rule: `<org>/<repo>#<n>` for GitHub, the issue/project identifier (e.g. `TEAM-123`) for Linear, the issue key (e.g. `PROJ-123`) for JIRA. This is the same dedupe key native linking uses, so the documented record and the native record agree.
|
|
88
|
+
- **`url`** — the canonical URL of the work item.
|
|
89
|
+
- **`type`** — `Epic | Story | Task | Sub-task | Bug | Spike` (verbatim from the ticket's `type`).
|
|
90
|
+
- **`parent`** — the **`ref`** of this entry's parent (its `parent_key` resolved to the parent's ref), or **empty** when the entry is top-level (`parent_key` null/empty). A reader selects the **generated top-level child set** — exactly what the PRD owns per the rule — as every `lisa:gw` line whose `parent` is empty.
|
|
91
|
+
|
|
92
|
+
The visible markdown link and the token always carry the same `ref`/`url`/`type`; the token is the authoritative machine field (the prose may wrap or be reflowed by a host editor, the comment line will not). Field order within the token is fixed (`ref`, `url`, `type`, `parent`) so output is byte-stable.
|
|
93
|
+
|
|
94
|
+
If the input contains zero items, write the section header with a single line: `_No tickets created — Plan flow may not have completed._` Do not omit the section; presence-of-section is itself a signal to Debrief, and the always-written guarantee means a reader can always distinguish "ran, produced nothing" from "never ran."
|
|
95
|
+
|
|
96
|
+
## Idempotency
|
|
97
|
+
|
|
98
|
+
Rendering rules:
|
|
99
|
+
- Sort epics by key (lexical). Sort stories within an epic by key. Sort sub-tasks within a story by key. Sort the unparented list by `(type, key)`. The same sort applies to the `lisa:gw` tokens (each token sits on its entry's line), so the machine-readable order is identical across runs.
|
|
100
|
+
- The line `_Generated by ..._` is fixed text — does not include a timestamp. A timestamp would defeat the diff-equality check Debrief relies on.
|
|
101
|
+
- Regenerate the whole section from the current ticket set on every run — **never append**. Dedupe is by **child-ref** (the token's `ref`, per the `prd-lifecycle-rollup` idempotency dedupe key): the same ticket set produces a byte-identical section with no duplicate entries, and re-running over an existing section is a no-op diff. A ticket present in a prior run but absent now simply does not reappear (stale links never accumulate).
|
|
102
|
+
- **Match by stable ref, never by title** (`prd-lifecycle-rollup` idempotency dedupe key). A child is identified by its `ref` token alone — a ticket whose `title` changed but whose `ref` is unchanged is the **same** entry: its displayed title is refreshed in place and it appears exactly once, never duplicated. Title is rendered, never matched on.
|
|
103
|
+
|
|
104
|
+
## Native parent linking (GitHub)
|
|
105
|
+
|
|
106
|
+
When `source_type: github` **and** the PRD issue lives in the same repository as the created tickets, make the PRD the structural parent of the work it generated by linking each generated top-level work item as a native GitHub **sub-issue** of the PRD issue. This is the GitHub leg of the PRD→child native-hierarchy requirement in the `prd-lifecycle-rollup` rule (cite it by slug; do not restate its taxonomy here). The documented `## Tickets` section is still written either way — native linking is the first-class relationship; the documented section is the durable fallback for cross-vendor and older hosts.
|
|
107
|
+
|
|
108
|
+
This section is GitHub-only. The Linear and JIRA native parents have their own sections below ([Linear](#native-parent-linking-linear), [JIRA](#native-parent-linking-jira)); the documented-section-only fallback for Notion / Confluence / file / cross-vendor sources is governed by the `prd-lifecycle-rollup` rule and is out of scope for this GitHub section.
|
|
109
|
+
|
|
110
|
+
### What gets linked — generated top-level work only
|
|
111
|
+
|
|
112
|
+
Per the `prd-lifecycle-rollup` "generated top-level work" contract, the PRD owns **only** its generated top-level work as direct children:
|
|
113
|
+
|
|
114
|
+
- A ticket is **top-level** when its `parent_key` is null/empty — these are the created Epic(s) and any top-level Story created directly under the PRD. Link these as sub-issues of the PRD.
|
|
115
|
+
- A ticket with a non-null `parent_key` is a **descendant** (a Story under an Epic, or a leaf Sub-task) — it is owned by its own top-level parent, **never** linked directly to the PRD. Leaf Sub-tasks are explicitly NOT direct PRD children (PRD #525 non-goal).
|
|
116
|
+
|
|
117
|
+
So if the PRD generated `Epic E1 → Story S1 → Sub-task T1`, only `E1` becomes a sub-issue of the PRD; `S1` is a sub-issue of `E1` and `T1` of `S1` (those links were already made by the write path), and neither `S1` nor `T1` is a direct child of the PRD.
|
|
118
|
+
|
|
119
|
+
### Same-repo guard
|
|
120
|
+
|
|
121
|
+
Native sub-issue linking only applies when the PRD and the work item are in the same repository. Parse `owner/repo` from `source_ref` (the PRD URL or `<org>/<repo>#<n>` token) and from each top-level ticket's `key`/`url`. Skip native linking for any ticket whose repo differs from the PRD's repo (cross-repo or cross-vendor) — record those in the documented section only. The cross-vendor case (e.g. a GitHub PRD with a JIRA/Linear tracker) never reaches this path because the ticket is not a GitHub issue.
|
|
122
|
+
|
|
123
|
+
### Idempotency — dedupe by child-ref
|
|
124
|
+
|
|
125
|
+
The dedupe key is **child-ref identity** (`owner/repo#number`), per the `prd-lifecycle-rollup` idempotency rule. Before adding any link, read the PRD's current sub-issues and skip any child already linked, so re-running `prd-backlink` never creates duplicate sub-issue links and is a no-op when everything is already linked.
|
|
126
|
+
|
|
127
|
+
1. **Read the PRD's existing sub-issues** (same GraphQL `subIssues` query `lisa:github-read-issue` Phase 3 uses), and build the set of already-linked child refs:
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
gh api graphql -f query='query($org:String!,$repo:String!,$number:Int!){repository(owner:$org,name:$repo){issue(number:$number){subIssues(first:100){nodes{number repository{nameWithOwner}}}}}}' \
|
|
131
|
+
-F org=<prd_org> -F repo=<prd_repo> -F number=<prd_number> \
|
|
132
|
+
--jq '.data.repository.issue.subIssues.nodes[] | "\(.repository.nameWithOwner)#\(.number)"'
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
The resulting `owner/repo#number` strings are the existing child-ref set.
|
|
136
|
+
|
|
137
|
+
2. **For each generated top-level ticket** in the same repo whose child-ref is **not** already in that set, resolve node IDs and call `addSubIssue` (the same mutation `lisa:github-write-issue` Phase 6 step 3 uses):
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
prd_id=$(gh api graphql -f query='query($org:String!,$repo:String!,$number:Int!){repository(owner:$org,name:$repo){issue(number:$number){id}}}' -F org=<prd_org> -F repo=<prd_repo> -F number=<prd_number> --jq '.data.repository.issue.id')
|
|
141
|
+
child_id=$(gh api graphql -f query='query($org:String!,$repo:String!,$number:Int!){repository(owner:$org,name:$repo){issue(number:$number){id}}}' -F org=<org> -F repo=<repo> -F number=<child_number> --jq '.data.repository.issue.id')
|
|
142
|
+
gh api graphql -f query='mutation($parentId:ID!,$childId:ID!){addSubIssue(input:{issueId:$parentId,subIssueId:$childId}){issue{number}subIssue{number}}}' -F parentId="$prd_id" -F childId="$child_id"
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
A child already in the existing-sub-issue set is a no-op — do not call the mutation for it.
|
|
146
|
+
|
|
147
|
+
### Graceful degradation
|
|
148
|
+
|
|
149
|
+
- **Already linked.** Covered by the dedupe read above (no mutation issued). If a concurrent run linked it between the read and the mutation, GitHub rejects the duplicate — treat that rejection as success (the desired end state already holds), not a failure.
|
|
150
|
+
- **Mutation unavailable** (older GHES, sub-issues feature off, or the `addSubIssue`/`subIssues` fields are missing). Fall back to the documented `## Tickets` section only and surface a warning to the caller (`native sub-issue linking unavailable — documented section written`). Never silently drop the relationship and never abort the run — the documented section is the contract that always lands.
|
|
151
|
+
|
|
152
|
+
## Native parent linking (Linear)
|
|
153
|
+
|
|
154
|
+
When `source_type: linear` **and** the PRD also lives in Linear (same workspace as the created work items), make the PRD the structural parent of the work it generated using Linear's native **parent / project** relationship. This is the Linear leg of the PRD→child native-hierarchy requirement in the `prd-lifecycle-rollup` rule (cite it by slug; do not restate its taxonomy here). The documented `## Tickets` section is still written either way — native linking is the first-class relationship; the documented section is the durable fallback for cross-vendor and older hosts.
|
|
155
|
+
|
|
156
|
+
This section is Linear-only. The GitHub and JIRA native parents have their own sections; the documented-section-only fallback for Notion / Confluence / file / cross-vendor sources is out of scope here.
|
|
157
|
+
|
|
158
|
+
### Which Linear primitive — PRD shape decides
|
|
159
|
+
|
|
160
|
+
Linear models top-level grouping two ways, and the PRD's own entity type decides which native relationship to use:
|
|
161
|
+
|
|
162
|
+
- **PRD is a Linear Project** (the common case — a PRD project groups its generated work). Generated top-level **Issues** are attached to the PRD by setting their `projectId` to the PRD Project's id. The Project *is* the native parent of its Issues; no separate parent-issue link is needed.
|
|
163
|
+
- **PRD is a Linear Issue** (a parent issue, not a project). Generated top-level Issues are attached as native **sub-Issues** of the PRD Issue by setting their `parentId` to the PRD Issue's id.
|
|
164
|
+
|
|
165
|
+
Either way the write surface is `mcp__linear-server__save_issue` with the single relevant field (`projectId` or `parentId`) — the same primitive `lisa:linear-write-issue` uses to set a Story's `projectId` (Epic Project) and a Sub-task's `parentId` (Story Issue). Send **only** that field on update; Linear treats `save_issue` as a full overwrite of the fields named (`lisa:linear-write-issue` Phase 6 UPDATE), so resending other fields would clobber them.
|
|
166
|
+
|
|
167
|
+
### What gets linked — generated top-level work only
|
|
168
|
+
|
|
169
|
+
Per the `prd-lifecycle-rollup` "generated top-level work" contract, the PRD owns **only** its generated top-level work as direct children:
|
|
170
|
+
|
|
171
|
+
- A work item is **top-level** when its `parent_key` is null/empty — these are the created Epic(s) (Linear Projects) and any top-level Story (Linear Issue) created directly under the PRD. Attach these to the PRD via `projectId`/`parentId`.
|
|
172
|
+
- A work item with a non-null `parent_key` is a **descendant** (a Story under an Epic Project, or a leaf Sub-task) — it is owned by its own top-level parent, **never** linked directly to the PRD. Leaf Sub-tasks are explicitly NOT direct PRD children (PRD #525 non-goal); their `parentId` already points at their Story (set by the write path), and overwriting it to point at the PRD would break that hierarchy.
|
|
173
|
+
|
|
174
|
+
So if the PRD generated `Epic E1 (Project) → Story S1 (Issue) → Sub-task T1 (sub-Issue)`, only the top-level unit is attached to the PRD; `S1` already carries `projectId = E1` and `T1` already carries `parentId = S1` (set by the write path), and neither `S1` nor `T1` is a direct child of the PRD.
|
|
175
|
+
|
|
176
|
+
### Idempotency — dedupe by child-ref
|
|
177
|
+
|
|
178
|
+
The dedupe key is **child-ref identity** — the Linear issue/project identifier (e.g. `TEAM-123`) or its UUID — per the `prd-lifecycle-rollup` idempotency rule. Before attaching any child, read the PRD's current children and skip any child already attached, so re-running `prd-backlink` never duplicates a relationship and is a no-op when everything is already attached.
|
|
179
|
+
|
|
180
|
+
1. **Read the PRD's existing children** (the same reads `lisa:linear-read-issue` uses for Project members and sub-Issues):
|
|
181
|
+
- PRD-as-Project → `mcp__linear-server__list_issues({project: <prd_project_id>})` and collect each member Issue's identifier/UUID.
|
|
182
|
+
- PRD-as-Issue → `mcp__linear-server__get_issue({id: <prd_issue_id>})` and collect its sub-Issue identifiers/UUIDs.
|
|
183
|
+
|
|
184
|
+
The resulting identifiers/UUIDs are the existing child-ref set.
|
|
185
|
+
|
|
186
|
+
2. **For each generated top-level item** whose child-ref is **not** already in that set, attach it with a single-field `save_issue`:
|
|
187
|
+
- PRD-as-Project → `mcp__linear-server__save_issue({id: <child_id>, projectId: <prd_project_id>})`.
|
|
188
|
+
- PRD-as-Issue → `mcp__linear-server__save_issue({id: <child_id>, parentId: <prd_issue_id>})`.
|
|
189
|
+
|
|
190
|
+
A child already in the existing-children set is a no-op — do not issue the `save_issue` call for it. Reading the child's current `projectId`/`parentId` and finding it already equal to the PRD's id is the same no-op (attaching to the value it already holds changes nothing).
|
|
191
|
+
|
|
192
|
+
### Graceful degradation
|
|
193
|
+
|
|
194
|
+
- **Already attached.** Covered by the dedupe read above (no write issued). If a concurrent run attached it between the read and the write, re-setting the same `projectId`/`parentId` is harmless (the desired end state already holds) — treat it as success, not a failure.
|
|
195
|
+
- **No native hierarchy / cross-vendor.** If the PRD is not itself a Linear entity (cross-vendor — e.g. a Notion PRD with a Linear tracker, which reaches this skill as `source_type: notion`, not `linear`), or the workspace/team does not expose the relationship, this is a clean **no-op**: fall back to the documented `## Tickets` section only and surface a warning to the caller (`native Linear parent linking unavailable — documented section written`). Never silently drop the relationship and never abort the run — the documented section is the contract that always lands.
|
|
196
|
+
|
|
197
|
+
## Native parent linking (JIRA)
|
|
198
|
+
|
|
199
|
+
When `source_type: jira` **and** the PRD also lives in the same JIRA/Atlassian instance as the created tickets, make the PRD the structural parent of the work it generated using JIRA's native **parent / Epic link**, or — where the instance does not allow an Epic/Story to be a child of the PRD's issue type — a documented **issue-link type** (e.g. `relates to`). This is the JIRA leg of the PRD→child native-hierarchy requirement in the `prd-lifecycle-rollup` rule (cite it by slug; do not restate its taxonomy here). The documented `## Tickets` section is still written either way — native linking is the first-class relationship; the documented section is the durable fallback for cross-vendor and older hosts.
|
|
200
|
+
|
|
201
|
+
This section is JIRA-only. The GitHub and Linear native parents have their own sections; the documented-section-only fallback for Notion / Confluence / file / cross-vendor sources is out of scope here.
|
|
202
|
+
|
|
203
|
+
### Which JIRA primitive — native parent first, issue-link fallback
|
|
204
|
+
|
|
205
|
+
JIRA's hierarchy support varies by instance and issue-type scheme, so prefer the strongest relationship the instance allows:
|
|
206
|
+
|
|
207
|
+
1. **Native parent / Epic link (preferred).** If the PRD's issue type can be a parent of the generated top-level type in the instance's hierarchy (e.g. the PRD is a parent-level issue and the generated work is Epics/Stories beneath it), set the generated top-level issue's **parent** to the PRD — the same parent/Epic-link surface `lisa:jira-write-ticket` uses to set a Story's epic parent (Phase 4a + Phase 6 CREATE). Use `lisa:atlassian-access` `operation: write-ticket payload: {key: <child>, parent: <prd_key>}` (send only the parent field on update so other fields are preserved — `lisa:jira-write-ticket` Phase 6 UPDATE).
|
|
208
|
+
2. **Documented issue-link type (fallback).** If the instance's hierarchy does not allow the PRD to parent the generated type (common when both are Epics, or the PRD is itself an Epic and Epics cannot nest), create a native **issue link** of a documented type instead — `lisa:atlassian-access` `operation: link from: <prd_key> to: <child_key> type: "<link-type>"` — the same link surface `lisa:jira-write-ticket` Phase 6 step 3 uses for `blocks` / `relates to` / etc. Use the project's configured PRD→work link type (default `relates to`); surface an error if an unknown type is passed rather than inventing one.
|
|
209
|
+
|
|
210
|
+
Choosing between (1) and (2) is per the instance's capability — never invent a parent relationship the issue-type scheme rejects, and never silently downgrade without recording which relationship was used.
|
|
211
|
+
|
|
212
|
+
### What gets linked — generated top-level work only
|
|
213
|
+
|
|
214
|
+
Per the `prd-lifecycle-rollup` "generated top-level work" contract, the PRD owns **only** its generated top-level work as direct children:
|
|
215
|
+
|
|
216
|
+
- A ticket is **top-level** when its `parent_key` is null/empty — these are the created Epic(s) and any top-level Story created directly under the PRD. Attach these to the PRD via the native parent or the documented issue-link type.
|
|
217
|
+
- A ticket with a non-null `parent_key` is a **descendant** (a Story under an Epic, or a leaf Sub-task) — it is owned by its own top-level parent, **never** linked directly to the PRD. Leaf Sub-tasks are explicitly NOT direct PRD children (PRD #525 non-goal); their parent already points at their Story/Epic (set by the write path), and re-parenting them to the PRD would break that hierarchy.
|
|
218
|
+
|
|
219
|
+
So if the PRD generated `Epic E1 → Story S1 → Sub-task T1`, only `E1` is attached to the PRD; `S1` already carries its epic parent `E1` and `T1` its parent `S1` (set by the write path), and neither `S1` nor `T1` is a direct child of the PRD.
|
|
220
|
+
|
|
221
|
+
### Idempotency — dedupe by child-ref
|
|
222
|
+
|
|
223
|
+
The dedupe key is **child-ref identity** — the JIRA issue key (e.g. `PROJ-123`) — per the `prd-lifecycle-rollup` idempotency rule. Before attaching any child, read the PRD's current children/links and skip any child already attached, so re-running `prd-backlink` never duplicates a parent assignment or issue link and is a no-op when everything is already attached.
|
|
224
|
+
|
|
225
|
+
1. **Read the PRD's existing children and links** (the same reads `lisa:jira-read-ticket` uses):
|
|
226
|
+
- Native-parent path → enumerate the PRD's children via the epic-link/parent JQL `lisa:jira-read-ticket` Phase 5 uses (`"Epic Link" = <PRD-KEY>` or `parent = <PRD-KEY>`), and collect their keys.
|
|
227
|
+
- Issue-link path → read the PRD's `issuelinks` (`lisa:jira-read-ticket` Phase 4) and collect the keys already linked with the configured PRD→work link type.
|
|
228
|
+
|
|
229
|
+
The resulting issue keys are the existing child-ref set.
|
|
230
|
+
|
|
231
|
+
2. **For each generated top-level ticket** whose key is **not** already in that set, attach it via the chosen primitive:
|
|
232
|
+
- Native-parent → `lisa:atlassian-access` `operation: write-ticket payload: {key: <child>, parent: <prd_key>}`.
|
|
233
|
+
- Issue-link → `lisa:atlassian-access` `operation: link from: <prd_key> to: <child> type: "<link-type>"`.
|
|
234
|
+
|
|
235
|
+
A child already in the existing-children/links set is a no-op — do not issue the write/link for it.
|
|
236
|
+
|
|
237
|
+
### Graceful degradation
|
|
238
|
+
|
|
239
|
+
- **Already attached.** Covered by the dedupe read above (no write issued). If a concurrent run attached it between the read and the write, JIRA either no-ops the identical parent assignment or rejects the duplicate link — treat that as success (the desired end state already holds), not a failure.
|
|
240
|
+
- **No native hierarchy / cross-vendor.** If the PRD is not itself a JIRA issue (cross-vendor — e.g. a Notion or Confluence PRD with a JIRA tracker, which reaches this skill as `source_type: notion`/`confluence`, not `jira`), or neither a native parent nor a documented issue-link type is available in the instance, this is a clean **no-op**: fall back to the documented `## Tickets` section only and surface a warning to the caller (`native JIRA parent linking unavailable — documented section written`). Never silently drop the relationship and never abort the run — the documented section is the contract that always lands.
|
|
241
|
+
|
|
242
|
+
## Failures
|
|
243
|
+
|
|
244
|
+
- **Source unreachable / permission denied.** Stop and report. Do not silently swallow.
|
|
245
|
+
- **Section already present but in a non-standard format** (e.g., user hand-edited it). Replace it anyway — the warning line `_do not edit by hand_` is the contract. Note in the run output that an existing section was overwritten.
|
|
246
|
+
- **Source is a Notion database URL, a Confluence space URL, or any other non-page input.** Stop — back-linking only makes sense against a single PRD page, not a queue. Direct the caller to pass the specific page.
|
|
247
|
+
|
|
248
|
+
## Output
|
|
249
|
+
|
|
250
|
+
```text
|
|
251
|
+
PRD back-link updated: <source_url>
|
|
252
|
+
Section: ## Tickets — <n> epics, <n> stories, <n> sub-tasks, <n> unparented (<bugs/spikes>)
|
|
253
|
+
Native parent links: <n> linked, <n> already linked (<vendor> native hierarchy; documented section is the fallback)
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
The `Native parent links` line reports whichever vendor's native linking ran:
|
|
257
|
+
- **GitHub** (same-repo PRD) → sub-issues via `addSubIssue`.
|
|
258
|
+
- **Linear** (PRD in Linear) → `projectId`/`parentId` attachments via `save_issue`.
|
|
259
|
+
- **JIRA** (PRD in JIRA) → native parent / Epic link, or documented issue-link type.
|
|
260
|
+
|
|
261
|
+
Omit the `Native parent links` line when no native linking applies (Notion / Confluence / file source, or any cross-vendor combination — documented section only). If native linking was attempted but unavailable for the vendor, replace the counts with the degradation warning from that vendor's Graceful degradation subsection.
|
|
262
|
+
|
|
263
|
+
## Related rules
|
|
264
|
+
|
|
265
|
+
- `prd-lifecycle-rollup` — the vendor-neutral source of truth for PRD→generated-top-level-work ownership, the per-vendor terminal predicate, PRD `shipped` rollup, and the child-ref idempotency dedupe key. This skill implements both the **documented always-written, machine-readable generated-work section** leg (the universal fallback written for every vendor) and the GitHub, Linear, and JIRA native-linking legs of that rule; it cites the rule by slug rather than restating its taxonomy.
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prd-source-write
|
|
3
|
+
description: "Vendor-neutral wrapper for creating (or idempotently updating) a PRD in the configured PRD source. The PRD-side sibling of lisa:tracker-write. Resolves `source` from .lisa.config.local.json first (then .lisa.config.json — local overrides global) and dispatches to lisa:notion-write-prd, lisa:confluence-write-prd, lisa:github-write-prd, or lisa:linear-write-prd. Callers (notably lisa:research) MUST invoke this skill instead of a vendor PRD writer directly — that is what makes the PRD source switchable per project. Accepts an `initial_role` of `draft` (default) or `ready` so a freshly created PRD either waits for human promotion or is immediately picked up by lisa:intake; and a stable dedupe marker so re-runs reference the existing PRD instead of creating a duplicate. The PRD lives in the source — there is no separate document artifact."
|
|
4
|
+
allowed-tools: ["Skill", "Bash", "Read"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# PRD Source Write: $ARGUMENTS
|
|
8
|
+
|
|
9
|
+
Thin dispatcher. Resolves the configured PRD `source` and delegates to the matching vendor PRD
|
|
10
|
+
writer, which owns the concrete create/update, the lifecycle-role application, and the marker-based
|
|
11
|
+
dedupe. When the supplied PRD body already contains the canonical `## Lisa Usage` ledger, the
|
|
12
|
+
vendor writer must preserve that managed section on update instead of dropping it or reformatting it
|
|
13
|
+
ad hoc. This skill only routes — it never talks to a source API itself.
|
|
14
|
+
|
|
15
|
+
See the `config-resolution` rule for the full configuration schema and the PRD lifecycle roles.
|
|
16
|
+
|
|
17
|
+
## Input contract
|
|
18
|
+
|
|
19
|
+
Callers pass a single structured spec:
|
|
20
|
+
|
|
21
|
+
```yaml
|
|
22
|
+
operation: create_or_update # the only operation; create unless the marker already exists
|
|
23
|
+
title: "<PRD title>"
|
|
24
|
+
body: "<full PRD markdown — the entire spec>"
|
|
25
|
+
initial_role: draft | ready # default: draft. ready = picked up by lisa:intake's PRD scan
|
|
26
|
+
dedupe_key: "<stable-key>" # e.g. project-ideation's idea key
|
|
27
|
+
marker: "[lisa-project-ideation] idea=<stable-key>" # embedded in the PRD body for dedupe
|
|
28
|
+
origin: { tool: project-ideation | research | manual }
|
|
29
|
+
source_ref: "<optional existing PRD ref to force an update>"
|
|
30
|
+
ideation_ledger_payload: # optional; forwarded unchanged to the vendor writer
|
|
31
|
+
selected_marker: "<same value as marker>"
|
|
32
|
+
automation_id: "<Codex/Claude automation id or unavailable>"
|
|
33
|
+
automation_memory_path: "<path or unavailable>"
|
|
34
|
+
repo: "<org>/<repo or detected repo identity>"
|
|
35
|
+
prd_ready: true|false
|
|
36
|
+
persona_names: ["<derived persona name>"]
|
|
37
|
+
persona_evidence_refs: ["<file/doc/table/release ref>"]
|
|
38
|
+
selected_idea: "<selected idea title/key>"
|
|
39
|
+
rejected_overlap_candidates: ["<issue refs/titles considered and rejected>"]
|
|
40
|
+
expected_empirical_verification_artifact: "<artifact ref or unavailable>"
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`initial_role` semantics are uniform across vendors (the role STRINGS resolve per vendor from
|
|
44
|
+
`config-resolution`):
|
|
45
|
+
|
|
46
|
+
- **`draft`** (default) → the PRD is created in the source's `draft` PRD role. It waits for a human
|
|
47
|
+
(or a later `ready` promotion) before any intake claims it.
|
|
48
|
+
- **`ready`** → the PRD is created in the source's `ready` PRD role (`prd-ready`), so the PRD-side of
|
|
49
|
+
`lisa:intake` / the `*-prd-intake` scanner auto-claims it on the next cycle.
|
|
50
|
+
|
|
51
|
+
There is no "omitted = legacy behavior" mode (unlike the ticket-side `build_ready`): there was no
|
|
52
|
+
prior PRD-source-write behavior to preserve, so omitted means `draft`.
|
|
53
|
+
|
|
54
|
+
## Workflow
|
|
55
|
+
|
|
56
|
+
1. **Resolve the source.** Read `.lisa.config.local.json` first (if present), then
|
|
57
|
+
`.lisa.config.json`. Local overrides global per key. Use `jq` — never hand-parse JSON.
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
local_source=$(jq -r '.source // empty' .lisa.config.local.json 2>/dev/null)
|
|
61
|
+
global_source=$(jq -r '.source // empty' .lisa.config.json 2>/dev/null)
|
|
62
|
+
source="${local_source:-${global_source}}"
|
|
63
|
+
if [ -z "$source" ]; then
|
|
64
|
+
echo "Error: 'source' is not set in .lisa.config.json. A PRD source (notion / confluence / github / linear) is required to create a PRD. Run /lisa:setup:notion (or :confluence, :github, :linear)." >&2
|
|
65
|
+
exit 1
|
|
66
|
+
fi
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
2. **Validate the value and dispatch** (pass the spec verbatim):
|
|
70
|
+
|
|
71
|
+
- `notion` → confirm `notion.workspaceId` and `notion.prdDatabaseId` are present, then invoke
|
|
72
|
+
`lisa:notion-write-prd`.
|
|
73
|
+
- `confluence` → confirm `atlassian.cloudId` and (`confluence.spaceKey` or
|
|
74
|
+
`confluence.parents.draft`/`.ready`) are present, then invoke `lisa:confluence-write-prd`.
|
|
75
|
+
- `github` → confirm `github.org` and `github.repo` are present, then invoke
|
|
76
|
+
`lisa:github-write-prd`.
|
|
77
|
+
- `linear` → confirm `linear.workspace` (and team for project placement) is present, then invoke
|
|
78
|
+
`lisa:linear-write-prd`.
|
|
79
|
+
- `jira` → **stop and fail loudly**: `"source=jira is not a supported PRD source — config-resolution defines no JIRA PRD lifecycle roles. Use notion / confluence / github / linear, or set source accordingly."` (JIRA is a destination tracker, not a PRD source.)
|
|
80
|
+
- Any other value (including `file`) → stop and report: `"Unknown PRD source '<value>'. Expected one of: notion, confluence, github, linear."`
|
|
81
|
+
|
|
82
|
+
3. **Surface the vendor writer's output unchanged.** It returns the created/reused PRD ref + URL,
|
|
83
|
+
the applied role (`draft`/`ready`), the dedupe marker, and whether it was created or reused.
|
|
84
|
+
Downstream callers (research, project-ideation) parse this — do not paraphrase.
|
|
85
|
+
|
|
86
|
+
When `ideation_ledger_payload` is present, this shim still does not render or interpret it. Forward
|
|
87
|
+
the object verbatim to the selected vendor writer so source-specific rendering remains behind the
|
|
88
|
+
configured writer and the dispatch layer never bypasses source selection.
|
|
89
|
+
|
|
90
|
+
## Rules
|
|
91
|
+
|
|
92
|
+
- Never bypass dispatch — a vendor-neutral caller calling a `*-write-prd` skill directly defeats the
|
|
93
|
+
per-project source switch (exactly the `tracker-write` discipline, mirrored).
|
|
94
|
+
- Never drop or duplicate an existing managed `## Lisa Usage` section. Writer-specific preservation
|
|
95
|
+
and fallback behavior belongs in the vendor writers and follows the `usage-accounting` contract.
|
|
96
|
+
- Never accept a source outside `{notion, confluence, github, linear}`. `jira` and `file` fail loudly.
|
|
97
|
+
- Never mutate the spec between layers. The vendor writers define their own create/dedupe contract.
|
|
98
|
+
- Never drop, rename, or vendor-render `ideation_ledger_payload`; it is a pass-through payload for
|
|
99
|
+
the configured writer.
|
|
100
|
+
- Never invent a PRD lifecycle role string — resolve every role from `config-resolution` per vendor.
|
|
101
|
+
- Idempotency is the vendor writer's job (marker search before create); this shim only routes.
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: prd-ticket-coverage
|
|
3
|
+
description: "Verifies that every requirement in a PRD (Notion, Confluence, Linear, or GitHub Issues) is covered by at least one created destination ticket (JIRA, GitHub Issues, or Linear) — no silent drops. Parses the PRD into atomic items (goals, user stories, functional/non-functional requirements, acceptance criteria, important notes), maps each to the created tickets, and produces a coverage matrix and verdict (COMPLETE / COMPLETE_WITH_SCOPE_CREEP / GAPS_FOUND / NO_TICKETS_FOUND). Used by notion-prd-intake / confluence-prd-intake / linear-prd-intake / github-prd-intake post-write to gate the Ticketed transition; can also be invoked standalone for after-the-fact audits."
|
|
4
|
+
allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getConfluencePageFooterComments", "mcp__atlassian__getConfluencePageInlineComments", "mcp__atlassian__getConfluenceCommentChildren", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources", "mcp__linear-server__get_project", "mcp__linear-server__list_documents", "mcp__linear-server__get_document", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__list_comments"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# PRD Ticket Coverage Audit: $ARGUMENTS
|
|
8
|
+
|
|
9
|
+
`$ARGUMENTS` is one of:
|
|
10
|
+
|
|
11
|
+
1. A PRD URL alone — auto-discover created tickets via the PRD's epic remote link.
|
|
12
|
+
2. A PRD URL plus an explicit list of ticket keys — `<PRD URL> tickets=[KEY-1,KEY-2,...]`. Use this when called from `lisa:notion-prd-intake` or `lisa:confluence-prd-intake` (which know the keys they just created).
|
|
13
|
+
|
|
14
|
+
The PRD URL can be a **Notion page URL**, a **Confluence page URL**, a **Linear project URL**, or a **GitHub issue URL**. Detect the vendor from the host:
|
|
15
|
+
|
|
16
|
+
- `notion.so` / `notion.site` → Notion. Fetch with `mcp__claude_ai_Notion__notion-fetch` (`include_discussions: true`) and `mcp__claude_ai_Notion__notion-get-comments`.
|
|
17
|
+
- Atlassian Confluence host (e.g. `*.atlassian.net/wiki/...`) → Confluence. Fetch with `mcp__atlassian__getConfluencePage`, `mcp__atlassian__getConfluencePageDescendants` (for child epic pages), `mcp__atlassian__getConfluencePageFooterComments`, `mcp__atlassian__getConfluencePageInlineComments`, and `mcp__atlassian__getConfluenceCommentChildren` for nested replies.
|
|
18
|
+
- `linear.app` host → Linear. Fetch with `mcp__linear-server__get_project` (capture description, labels, state, attached resources), `mcp__linear-server__list_documents({projectId})` + `mcp__linear-server__get_document` per attached document, `mcp__linear-server__list_issues({project})` for sub-issues that act as child epics / user stories, and `mcp__linear-server__list_comments({issueId})` per sub-issue for decisions and engineering notes. Comments do not exist on the project itself in the MCP surface — sub-issue comments are the substitute.
|
|
19
|
+
- `github.com` host → GitHub Issues. Fetch with the `gh` CLI (no GitHub MCP — Lisa uses the CLI exclusively for GitHub):
|
|
20
|
+
- `gh issue view <number> --repo <org>/<repo> --json number,title,body,labels,milestone,assignees,author,createdAt,comments,url` for the PRD body and comments.
|
|
21
|
+
- `gh api graphql` with the `subIssues` field for native sub-issue children (these stand in for child epic pages — see `lisa:github-read-issue` Phase 3 for the exact query).
|
|
22
|
+
- `gh issue view <child-num> --repo <org>/<repo> --json body,comments` per child sub-issue, recursively to depth 3.
|
|
23
|
+
|
|
24
|
+
All four vendors produce the same downstream artifact-extraction and coverage-matrix logic — only the fetch surface differs. The rest of this skill is vendor-agnostic.
|
|
25
|
+
|
|
26
|
+
Verify that every atomic item in the PRD is covered by at least one of the listed/discovered destination tickets. The output gates whether the PRD's lifecycle should remain at `Ticketed` (Notion `Status = Ticketed`, Confluence / Linear / GitHub `prd-ticketed` label) or revert to `Blocked`.
|
|
27
|
+
|
|
28
|
+
The destination tickets are read via `lisa:tracker-read` (which dispatches to `lisa:jira-read-ticket` or `lisa:github-read-issue` per `.lisa.config.json` `tracker`) so this skill itself stays agnostic of which tracker hosts the work.
|
|
29
|
+
|
|
30
|
+
## Why this exists
|
|
31
|
+
|
|
32
|
+
Per-ticket gates (`lisa:jira-validate-ticket`) prove each created ticket is well-formed in isolation. They do NOT prove the *set* of created tickets is complete relative to the source PRD. Silent drops happen — an agent generates 8 tickets when the PRD called for 9, and nothing notices. This skill is the catch.
|
|
33
|
+
|
|
34
|
+
## Phases
|
|
35
|
+
|
|
36
|
+
### Phase 1 — Resolve inputs
|
|
37
|
+
|
|
38
|
+
1. Parse `$ARGUMENTS`:
|
|
39
|
+
- PRD URL → detect vendor from host, extract page ID.
|
|
40
|
+
- Optional `tickets=[...]` → list of explicit ticket keys.
|
|
41
|
+
2. Fetch the PRD using the vendor-appropriate tool surface:
|
|
42
|
+
- **Notion**: `notion-fetch` with `include_discussions: true`. Capture: title, body, child Epic pages, all comment threads.
|
|
43
|
+
- **Confluence**: `getConfluencePage` (capture title, body, labels), `getConfluencePageFooterComments` + `getConfluencePageInlineComments` (capture all comments; walk replies via `getConfluenceCommentChildren` for any thread with children).
|
|
44
|
+
- **Linear**: `get_project` (capture name, description, labels, state, attached resources). Capture sub-issues via `list_issues({project})` and per-issue comments via `list_comments({issueId})`.
|
|
45
|
+
- **GitHub**: `gh issue view --json` for the source PRD issue (title, body, labels, comments). Capture sub-issues via the GraphQL `subIssues` traversal.
|
|
46
|
+
3. If the PRD has child Epic sub-pages / sub-issues (a multi-epic PRD), fetch each in parallel:
|
|
47
|
+
- **Notion**: `notion-fetch` per child page with `include_discussions: true`.
|
|
48
|
+
- **Confluence**: enumerate descendants via `getConfluencePageDescendants`, then `getConfluencePage` per child plus its comment streams.
|
|
49
|
+
- **Linear**: enumerate attached documents via `list_documents({projectId})` and fetch each via `get_document`. Treat each document as an extra body source. Sub-issues themselves stand in for "child epic pages" — their descriptions and comments are already captured in step 2.
|
|
50
|
+
- **GitHub**: enumerate native sub-issues via `gh api graphql` (`subIssues` field), then `gh issue view <child-num> --json body,comments` per child. Recurse to depth 3.
|
|
51
|
+
The audit walks the full PRD tree.
|
|
52
|
+
4. If `tickets=[...]` not provided, locate the destination Epic by:
|
|
53
|
+
- Looking for a destination URL in the PRD body, comments, or the PRD's most recent "Ticketed by Claude" comment posted by `lisa:notion-prd-intake` / `lisa:confluence-prd-intake` / `lisa:linear-prd-intake` / `lisa:github-prd-intake` (for Linear, this comment lives on the project's sentinel feedback issue; for the others, it lives on the PRD page / issue itself).
|
|
54
|
+
- Searching the destination tracker via `lisa:tracker-read` (or directly via `searchJiraIssuesUsingJql` / `gh issue list --search`) for an epic whose summary or description references the PRD title or project ID.
|
|
55
|
+
- If no epic found, return verdict `NO_TICKETS_FOUND` with a clear remediation — coverage cannot be assessed without the ticket set.
|
|
56
|
+
5. Once the epic is known, fetch all child stories and sub-tasks:
|
|
57
|
+
- **JIRA destination**: JQL `"Epic Link" = <EPIC-KEY>` and recursively for sub-tasks.
|
|
58
|
+
- **GitHub destination**: `gh api graphql` `subIssues` traversal of the Epic, recursively for sub-tasks.
|
|
59
|
+
|
|
60
|
+
### Phase 2 — Extract atomic PRD items
|
|
61
|
+
|
|
62
|
+
Walk the PRD content and produce a list of **atomic items** — testable, ticketable units of work. Each item gets a stable identifier so the matrix is auditable.
|
|
63
|
+
|
|
64
|
+
The item types to extract:
|
|
65
|
+
|
|
66
|
+
| Type | Where it appears in the PRD | Example identifier |
|
|
67
|
+
|------|----------------------------|--------------------|
|
|
68
|
+
| `goal` | `## Goals` section bullets | `goal:1`, `goal:2`, ... |
|
|
69
|
+
| `non-goal` | `## Non-goals` (for scope-creep detection) | `non-goal:1` |
|
|
70
|
+
| `user-story` | Per-Epic page, "User Story" sub-headings | `epic-1.story-1.1` |
|
|
71
|
+
| `functional-req` | "Functional Requirements" sub-section | `epic-1.story-1.1.fr-1` |
|
|
72
|
+
| `non-functional-req` | "Non-functional Requirements" sub-section | `epic-1.story-1.1.nfr-1` |
|
|
73
|
+
| `acceptance-criterion` | Inline AC under a user story | `epic-1.story-1.1.ac-1` |
|
|
74
|
+
| `important-note` | Bold "Important note:" callouts | `note:1` |
|
|
75
|
+
| `mobile-spec` | Mobile-specific behavior callouts | `epic-1.story-1.1.mobile-1` |
|
|
76
|
+
| `state` | Empty / error / loading state notes | `epic-2.story-2.1.state:empty` |
|
|
77
|
+
| `permission` | Role-scoped permission notes | `epic-2.story-2.1.perm:admin` |
|
|
78
|
+
| `decision` | Confirmed decisions in comments (e.g. "Engineering: ...") | `comment:42` |
|
|
79
|
+
|
|
80
|
+
**Items NOT to extract** (these are not coverage gaps if missing):
|
|
81
|
+
- Open Questions / `[Needs validation]` items — these are PRD-side blockers, not ticket scope.
|
|
82
|
+
- Original concept thesis or annex/historical content — context, not requirements.
|
|
83
|
+
- "Out of scope" items in the PRD — explicitly excluded by product.
|
|
84
|
+
|
|
85
|
+
For each extracted item, capture: `{ id, type, source (PRD section / line), text (concise summary), keywords (3-5 terms for matching) }`.
|
|
86
|
+
|
|
87
|
+
### Phase 3 — Map items to tickets
|
|
88
|
+
|
|
89
|
+
For each created ticket (epic + each story + each sub-task), capture: `{ key, summary, description, acceptance_criteria, scope_signals (keywords from summary + AC) }`.
|
|
90
|
+
|
|
91
|
+
Build a coverage matrix:
|
|
92
|
+
|
|
93
|
+
```text
|
|
94
|
+
PRD item id → [ticket keys that cover it]
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Matching rules (in priority order):
|
|
98
|
+
|
|
99
|
+
1. **Direct quote / strong keyword overlap**: the ticket's summary or AC explicitly names the PRD item's keywords. High confidence.
|
|
100
|
+
2. **Domain match**: PRD item describes a UI affordance ("Tasks widget") and a ticket scopes that affordance (`[CU-2.1] Tasks widget — empty state`). Medium-high confidence.
|
|
101
|
+
3. **Scope inheritance**: PRD item is a sub-detail of a parent (e.g. an AC under a user story); the ticket covers the parent user story. Medium confidence — flag for review if no more specific ticket exists.
|
|
102
|
+
4. **Cross-ticket coverage**: PRD item spans multiple tickets (e.g. a permission rule that applies to several widgets). Each contributing ticket is recorded.
|
|
103
|
+
|
|
104
|
+
Items with **zero** matching tickets are coverage gaps.
|
|
105
|
+
|
|
106
|
+
### Phase 4 — Detect scope creep (informational)
|
|
107
|
+
|
|
108
|
+
For each created ticket, identify any tickets whose scope_signals do NOT trace back to a PRD item, AND are not justifiable as standard infrastructure tasks (e.g. `X.0 Setup` stories for data model / migrations are typically infrastructure scaffolding, not scope creep).
|
|
109
|
+
|
|
110
|
+
Scope creep is informational, not blocking — but worth surfacing because it usually indicates the agent invented work.
|
|
111
|
+
|
|
112
|
+
### Phase 5 — Determine verdict
|
|
113
|
+
|
|
114
|
+
| Condition | Verdict |
|
|
115
|
+
|-----------|---------|
|
|
116
|
+
| All extracted PRD items have ≥1 matching ticket; no scope creep | `COMPLETE` |
|
|
117
|
+
| All extracted PRD items have ≥1 matching ticket; one or more scope-creep tickets | `COMPLETE_WITH_SCOPE_CREEP` |
|
|
118
|
+
| One or more PRD items have zero matching tickets | `GAPS_FOUND` |
|
|
119
|
+
| The created-tickets list is empty or unfetchable | `NO_TICKETS_FOUND` |
|
|
120
|
+
|
|
121
|
+
`GAPS_FOUND` is the only verdict that should gate the PRD's `Status`. Scope creep is advisory — surface it, but do not block.
|
|
122
|
+
|
|
123
|
+
### Phase 6 — Emit report
|
|
124
|
+
|
|
125
|
+
Output a single fenced text block. Callers parse it; do not add free-form prose around it.
|
|
126
|
+
|
|
127
|
+
```text
|
|
128
|
+
## prd-ticket-coverage: <PRD title>
|
|
129
|
+
|
|
130
|
+
PRD page: <URL>
|
|
131
|
+
Tickets audited: <epic-key> + <story-count> stories + <subtask-count> sub-tasks
|
|
132
|
+
Atomic PRD items extracted: <n>
|
|
133
|
+
|
|
134
|
+
### Coverage matrix
|
|
135
|
+
| PRD item | Tickets |
|
|
136
|
+
|----------|---------|
|
|
137
|
+
| <id> (<type>) — <text> | <ticket-key>, <ticket-key> |
|
|
138
|
+
| <id> (<type>) — <text> | <ticket-key> |
|
|
139
|
+
| <id> (<type>) — <text> | **(none)** |
|
|
140
|
+
| ... | ... |
|
|
141
|
+
|
|
142
|
+
### Gaps (PRD items with zero ticket coverage — blocks Ticketed status)
|
|
143
|
+
- item: <item-id> (<type>)
|
|
144
|
+
text: <text>
|
|
145
|
+
prd_section: "<heading text from the PRD>"
|
|
146
|
+
prd_anchor: "<first ~10 chars>...<last ~10 chars>" # for selection_with_ellipsis; null if no specific section
|
|
147
|
+
category: <product-clarity|acceptance-criteria|design-ux|scope|dependency|data|technical|structural>
|
|
148
|
+
what: <plain-language description of the gap, no JIRA jargon — written for the product team>
|
|
149
|
+
recommendation: <1–3 candidate resolutions: add a ticket scoped to X / extend ticket Y to cover this / mark out-of-scope explicitly. Never "clarify this".>
|
|
150
|
+
|
|
151
|
+
### Scope creep (tickets without PRD trace — informational, does not block)
|
|
152
|
+
- <ticket-key> — <summary>
|
|
153
|
+
- *Why flagged:* <reason — e.g. "no matching item in PRD; not an infra task">
|
|
154
|
+
|
|
155
|
+
### Verdict: COMPLETE | COMPLETE_WITH_SCOPE_CREEP | GAPS_FOUND | NO_TICKETS_FOUND
|
|
156
|
+
### Gap count: <n>
|
|
157
|
+
### Scope-creep count: <n>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
`prd_anchor` and `prd_section` are built the same way as in `lisa:notion-to-tracker` / `lisa:confluence-to-tracker` / `lisa:linear-to-tracker` / `lisa:github-to-tracker`. For Notion, `prd_anchor` is the `selection_with_ellipsis` start/end snippet; for Confluence, it's the inline-comment selection text accepted by `createConfluenceInlineComment`; for Linear, it's a sub-issue identifier (e.g. `LIN-123`) when the gap maps to a specific issue, otherwise `null` (the caller posts unanchored Linear gaps on the project's sentinel feedback issue); for GitHub, it's the section heading from the PRD issue body when the gap traces to a specific section, otherwise `null` (the caller approximates inline anchoring by quoting a body excerpt at the top of the comment). The downstream caller knows which vendor it's writing to and uses the right API; this skill just emits the anchor that vendor expects.
|
|
161
|
+
|
|
162
|
+
`category` is drawn from the same fixed taxonomy used by `lisa:jira-validate-ticket` so downstream callers can apply one consistent comment-formatting policy. Most coverage gaps map to `scope` (item not represented in any ticket) or `product-clarity` (item too vague to map). Use `acceptance-criteria` for missing pass/fail conditions and `design-ux` for missing visuals.
|
|
163
|
+
|
|
164
|
+
## Rules
|
|
165
|
+
|
|
166
|
+
- Read-only — never write to JIRA, never write to Notion (callers do that based on the verdict).
|
|
167
|
+
- Never silently drop a PRD item from extraction. If an item is ambiguous about whether it's scope, include it in extraction with type `ambiguous` and let the matching phase resolve it. The point of the audit is to catch silent drops; the audit can't have its own.
|
|
168
|
+
- Be explicit about confidence in matches — the matrix is for humans to skim; vague matches help no one. If a match is rule-3 ("scope inheritance"), say so.
|
|
169
|
+
- Scope creep is INFORMATIONAL. It is normal for an agent to add infra tickets (`X.0 Setup`) the PRD doesn't explicitly enumerate. Only flag scope creep when the ticket genuinely doesn't trace to PRD content AND isn't standard scaffolding.
|
|
170
|
+
- The `GAPS_FOUND` verdict is the gate. The caller (e.g. `lisa:notion-prd-intake`, `lisa:confluence-prd-intake`, `lisa:linear-prd-intake`, `lisa:github-prd-intake`) uses it to decide whether to revert the lifecycle from `Ticketed` to `Blocked`.
|