@codyswann/lisa 4.74.9 → 4.75.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 +60 -0
- package/all/copy-overwrite/scripts/lib/npm-update-github.mjs +73 -40
- package/all/copy-overwrite/scripts/lib/npm-update-invariants.mjs +54 -0
- package/all/copy-overwrite/scripts/npm-updater-helper-graph.json +3 -2
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +6 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/lisa-skill-sources.d.ts +3 -3
- package/dist/core/lisa-skill-sources.d.ts.map +1 -1
- package/dist/core/lisa-skill-sources.js +3 -2
- package/dist/core/lisa-skill-sources.js.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +735 -8
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +4 -4
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-cdk-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-cdk-devin/skills/setup-aws-accounts/SKILL.md +292 -0
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-devin/.claude-plugin/plugin.json +8 -0
- package/plugins/lisa-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-devin/.mcp.json +8 -0
- package/plugins/lisa-devin/agents/architecture-specialist.md +32 -0
- package/plugins/lisa-devin/agents/bug-fixer.md +43 -0
- package/plugins/lisa-devin/agents/builder.md +44 -0
- package/plugins/lisa-devin/agents/confluence-prd-intake.md +65 -0
- package/plugins/lisa-devin/agents/debug-specialist.md +34 -0
- package/plugins/lisa-devin/agents/eval-specialist.md +33 -0
- package/plugins/lisa-devin/agents/git-history-analyzer.md +183 -0
- package/plugins/lisa-devin/agents/github-agent.md +155 -0
- package/plugins/lisa-devin/agents/github-build-intake.md +64 -0
- package/plugins/lisa-devin/agents/github-prd-intake.md +66 -0
- package/plugins/lisa-devin/agents/jira-agent.md +135 -0
- package/plugins/lisa-devin/agents/jira-build-intake.md +64 -0
- package/plugins/lisa-devin/agents/learner.md +85 -0
- package/plugins/lisa-devin/agents/learning-judge.md +119 -0
- package/plugins/lisa-devin/agents/learnings-synthesizer.md +155 -0
- package/plugins/lisa-devin/agents/linear-agent.md +138 -0
- package/plugins/lisa-devin/agents/linear-build-intake.md +64 -0
- package/plugins/lisa-devin/agents/linear-prd-intake.md +66 -0
- package/plugins/lisa-devin/agents/notion-prd-intake.md +63 -0
- package/plugins/lisa-devin/agents/performance-specialist.md +26 -0
- package/plugins/lisa-devin/agents/pr-mining-specialist.md +85 -0
- package/plugins/lisa-devin/agents/product-specialist.md +30 -0
- package/plugins/lisa-devin/agents/quality-specialist.md +30 -0
- package/plugins/lisa-devin/agents/security-specialist.md +43 -0
- package/plugins/lisa-devin/agents/skill-evaluator.md +205 -0
- package/plugins/lisa-devin/agents/spec-conformance-specialist.md +56 -0
- package/plugins/lisa-devin/agents/test-specialist.md +32 -0
- package/plugins/lisa-devin/agents/tracker-mining-specialist.md +85 -0
- package/plugins/lisa-devin/agents/verification-specialist.md +145 -0
- package/plugins/lisa-devin/hooks/auto-update.mjs +824 -0
- package/plugins/lisa-devin/hooks/auto-update.sh +31 -0
- package/plugins/lisa-devin/hooks/block-blind-automerge.sh +1242 -0
- package/plugins/lisa-devin/hooks/block-direct-issue-create.sh +2603 -0
- package/plugins/lisa-devin/hooks/block-host-name-leak.mjs +412 -0
- package/plugins/lisa-devin/hooks/block-host-name-leak.sh +61 -0
- package/plugins/lisa-devin/hooks/block-instruction-file-edits.sh +207 -0
- package/plugins/lisa-devin/hooks/block-managed-file-edits.sh +1175 -0
- package/plugins/lisa-devin/hooks/block-no-verify.sh +2288 -0
- package/plugins/lisa-devin/hooks/block-shell-json-parsing.sh +263 -0
- package/plugins/lisa-devin/hooks/cleanup-stale-worktrees.sh +122 -0
- package/plugins/lisa-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-devin/hooks/discharge-work-item-gates.sh +90 -0
- package/plugins/lisa-devin/hooks/enforce-verification-gate.sh +506 -0
- package/plugins/lisa-devin/hooks/enforcement-vintage-npm.mjs +320 -0
- package/plugins/lisa-devin/hooks/enforcement-vintage.mjs +472 -0
- package/plugins/lisa-devin/hooks/enforcement-vintage.sh +48 -0
- package/plugins/lisa-devin/hooks/failure-signature-index.mjs +717 -0
- package/plugins/lisa-devin/hooks/failure-signature-index.sh +26 -0
- package/plugins/lisa-devin/hooks/guard-dedupe.bash +374 -0
- package/plugins/lisa-devin/hooks/inject-resolved-config.mjs +903 -0
- package/plugins/lisa-devin/hooks/inject-resolved-config.sh +107 -0
- package/plugins/lisa-devin/hooks/inject-rules.sh +49 -0
- package/plugins/lisa-devin/hooks/install-pkgs.sh +84 -0
- package/plugins/lisa-devin/hooks/operational-hazards.mjs +736 -0
- package/plugins/lisa-devin/hooks/operational-hazards.sh +28 -0
- package/plugins/lisa-devin/hooks/parity-safety-net-heredoc.py +1004 -0
- package/plugins/lisa-devin/hooks/parity-safety-net.sh +3275 -0
- package/plugins/lisa-devin/hooks/secrets-preflight.sh +72 -0
- package/plugins/lisa-devin/hooks/setup-jira-cli.sh +205 -0
- package/plugins/lisa-devin/hooks/shell-write-nudge.sh +86 -0
- package/plugins/lisa-devin/hooks/sonar-secrets.sh +205 -0
- package/plugins/lisa-devin/hooks/threshold-ratchet-compare.mjs +518 -0
- package/plugins/lisa-devin/hooks/threshold-ratchet-families.mjs +543 -0
- package/plugins/lisa-devin/hooks/threshold-ratchet.mjs +568 -0
- package/plugins/lisa-devin/hooks/threshold-ratchet.sh +22 -0
- package/plugins/lisa-devin/hooks/withdrawn-rulings.mjs +600 -0
- package/plugins/lisa-devin/hooks/withdrawn-rulings.sh +24 -0
- package/plugins/lisa-devin/hooks/worktree-binding-guard.mjs +1383 -0
- package/plugins/lisa-devin/hooks/worktree-binding-guard.sh +79 -0
- package/plugins/lisa-devin/hooks.json +247 -0
- package/plugins/lisa-devin/rules/eager/00-rule-index.md +82 -0
- package/plugins/lisa-devin/rules/eager/base-rules.md +85 -0
- package/plugins/lisa-devin/rules/eager/coding-philosophy.md +27 -0
- package/plugins/lisa-devin/rules/eager/config-resolution.md +37 -0
- package/plugins/lisa-devin/rules/eager/do-it-now.md +11 -0
- package/plugins/lisa-devin/rules/eager/empirical-inquiry.md +24 -0
- package/plugins/lisa-devin/rules/eager/falsifiable-checks.md +48 -0
- package/plugins/lisa-devin/rules/eager/history-audit.md +27 -0
- package/plugins/lisa-devin/rules/eager/integration-access-layer.md +19 -0
- package/plugins/lisa-devin/rules/eager/intent-routing.md +18 -0
- package/plugins/lisa-devin/rules/eager/learnings-ladder.md +18 -0
- package/plugins/lisa-devin/rules/eager/local-ci-first.md +15 -0
- package/plugins/lisa-devin/rules/eager/measurement-integrity.md +18 -0
- package/plugins/lisa-devin/rules/eager/never-name-a-downstream-project.md +9 -0
- package/plugins/lisa-devin/rules/eager/not-blocked-just-waiting.md +13 -0
- package/plugins/lisa-devin/rules/eager/operational-hazards.md +50 -0
- package/plugins/lisa-devin/rules/eager/report-actionability.md +26 -0
- package/plugins/lisa-devin/rules/eager/security-audit-handling.md +40 -0
- package/plugins/lisa-devin/rules/eager/session-status-updates.md +20 -0
- package/plugins/lisa-devin/rules/eager/settled-decisions.md +75 -0
- package/plugins/lisa-devin/rules/eager/stale-state-claims.md +26 -0
- package/plugins/lisa-devin/rules/eager/tool-access-gate.md +23 -0
- package/plugins/lisa-devin/rules/eager/tracked-work.md +9 -0
- package/plugins/lisa-devin/rules/eager/upstream-to-lisa.md +14 -0
- package/plugins/lisa-devin/rules/eager/verification.md +33 -0
- package/plugins/lisa-devin/rules/eager/wiki-knowledge-source.md +13 -0
- package/plugins/lisa-devin/rules/eager/withdrawn-rulings.md +102 -0
- package/plugins/lisa-devin/rules/reference/automation-runbook-contract.md +355 -0
- package/plugins/lisa-devin/rules/reference/base-rules.md +136 -0
- package/plugins/lisa-devin/rules/reference/bdd-e2e-coverage.md +301 -0
- package/plugins/lisa-devin/rules/reference/blocker-containment.md +165 -0
- package/plugins/lisa-devin/rules/reference/claim-archaeology.md +184 -0
- package/plugins/lisa-devin/rules/reference/claim-evidence-mapping.md +362 -0
- package/plugins/lisa-devin/rules/reference/claim-time-guards.md +135 -0
- package/plugins/lisa-devin/rules/reference/coding-philosophy.md +428 -0
- package/plugins/lisa-devin/rules/reference/config-resolution.md +1225 -0
- package/plugins/lisa-devin/rules/reference/control-reachability.md +166 -0
- package/plugins/lisa-devin/rules/reference/convergent-review.md +145 -0
- package/plugins/lisa-devin/rules/reference/credential-substrate-precedence.md +249 -0
- package/plugins/lisa-devin/rules/reference/dependency-decision-records.md +177 -0
- package/plugins/lisa-devin/rules/reference/dependency-internalization-kit.md +244 -0
- package/plugins/lisa-devin/rules/reference/dependency-trust-classes.md +291 -0
- package/plugins/lisa-devin/rules/reference/deployed-state-readback.md +142 -0
- package/plugins/lisa-devin/rules/reference/derived-branch-plan.md +214 -0
- package/plugins/lisa-devin/rules/reference/design-source-of-truth.md +260 -0
- package/plugins/lisa-devin/rules/reference/design-value-binding.md +311 -0
- package/plugins/lisa-devin/rules/reference/do-it-now.md +19 -0
- package/plugins/lisa-devin/rules/reference/documentation-source-paths.md +31 -0
- package/plugins/lisa-devin/rules/reference/empirical-inquiry.md +28 -0
- package/plugins/lisa-devin/rules/reference/factory-model.md +111 -0
- package/plugins/lisa-devin/rules/reference/falsifiable-checks.md +275 -0
- package/plugins/lisa-devin/rules/reference/history-audit.md +42 -0
- package/plugins/lisa-devin/rules/reference/integration-access-layer.md +89 -0
- package/plugins/lisa-devin/rules/reference/intent-routing.md +428 -0
- package/plugins/lisa-devin/rules/reference/leaf-only-lifecycle.md +227 -0
- package/plugins/lisa-devin/rules/reference/learnings-ladder.md +41 -0
- package/plugins/lisa-devin/rules/reference/local-ci-first.md +34 -0
- package/plugins/lisa-devin/rules/reference/measurement-integrity.md +119 -0
- package/plugins/lisa-devin/rules/reference/never-name-a-downstream-project.md +37 -0
- package/plugins/lisa-devin/rules/reference/not-blocked-just-waiting.md +41 -0
- package/plugins/lisa-devin/rules/reference/observability-audit.md +146 -0
- package/plugins/lisa-devin/rules/reference/operational-hazards.md +115 -0
- package/plugins/lisa-devin/rules/reference/prd-definition-of-ready.md +118 -0
- package/plugins/lisa-devin/rules/reference/prd-lifecycle-rollup.md +192 -0
- package/plugins/lisa-devin/rules/reference/pre-flight-autofill.md +250 -0
- package/plugins/lisa-devin/rules/reference/project-learnings.md +159 -0
- package/plugins/lisa-devin/rules/reference/promotion-contract.md +148 -0
- package/plugins/lisa-devin/rules/reference/readiness-rubric.md +242 -0
- package/plugins/lisa-devin/rules/reference/ready-role-filing.md +212 -0
- package/plugins/lisa-devin/rules/reference/rejection-detection.md +308 -0
- package/plugins/lisa-devin/rules/reference/repo-scope-split.md +119 -0
- package/plugins/lisa-devin/rules/reference/report-actionability.md +61 -0
- package/plugins/lisa-devin/rules/reference/reset-seed-coverage.md +286 -0
- package/plugins/lisa-devin/rules/reference/security-audit-handling.md +55 -0
- package/plugins/lisa-devin/rules/reference/session-status-updates.md +111 -0
- package/plugins/lisa-devin/rules/reference/settled-decisions.md +39 -0
- package/plugins/lisa-devin/rules/reference/stale-state-claims.md +88 -0
- package/plugins/lisa-devin/rules/reference/tool-access-gate.md +114 -0
- package/plugins/lisa-devin/rules/reference/tracked-work.md +49 -0
- package/plugins/lisa-devin/rules/reference/upstream-to-lisa.md +26 -0
- package/plugins/lisa-devin/rules/reference/usage-accounting.md +261 -0
- package/plugins/lisa-devin/rules/reference/verification.md +278 -0
- package/plugins/lisa-devin/rules/reference/wiki-knowledge-source.md +37 -0
- package/plugins/lisa-devin/rules/reference/withdrawn-rulings.md +148 -0
- package/plugins/lisa-devin/rules/reference/work-item-definition-of-ready.md +177 -0
- package/plugins/lisa-devin/rules/reference/work-item-trailer-definition.md +129 -0
- package/plugins/lisa-devin/scripts/automation-run-record.mjs +678 -0
- package/plugins/lisa-devin/scripts/automation-status-claude-adapter.mjs +804 -0
- package/plugins/lisa-devin/scripts/automation-status-codex-adapter.mjs +1081 -0
- package/plugins/lisa-devin/scripts/automation-status-contract-drift.mjs +392 -0
- package/plugins/lisa-devin/scripts/automation-status-expected-fleet.mjs +508 -0
- package/plugins/lisa-devin/scripts/automation-status-report.mjs +200 -0
- package/plugins/lisa-devin/scripts/automation-status-run-history.mjs +216 -0
- package/plugins/lisa-devin/scripts/automation-status-unrecorded-runs.mjs +127 -0
- package/plugins/lisa-devin/scripts/blocker-edge-resolution.mjs +150 -0
- package/plugins/lisa-devin/scripts/cross-pollinate.mjs +763 -0
- package/plugins/lisa-devin/scripts/design-bindings-probe.mjs +713 -0
- package/plugins/lisa-devin/scripts/design-intake-gate.mjs +470 -0
- package/plugins/lisa-devin/scripts/design-source-gate.mjs +610 -0
- package/plugins/lisa-devin/scripts/design-variable-ids.mjs +567 -0
- package/plugins/lisa-devin/scripts/doctor-report.mjs +635 -0
- package/plugins/lisa-devin/scripts/install-remote-agent-aws.mjs +443 -0
- package/plugins/lisa-devin/scripts/intake-blocker-reprobe.mjs +1065 -0
- package/plugins/lisa-devin/scripts/intake-prework-denominator.mjs +249 -0
- package/plugins/lisa-devin/scripts/lifecycle-label-trust.mjs +593 -0
- package/plugins/lisa-devin/scripts/linear-state-write-target.mjs +362 -0
- package/plugins/lisa-devin/scripts/plugin-sync-explain.mjs +654 -0
- package/plugins/lisa-devin/scripts/pr-arming-sweep.mjs +561 -0
- package/plugins/lisa-devin/scripts/project-ideation-idempotency-harness.mjs +338 -0
- package/plugins/lisa-devin/scripts/qa-signal-lifecycle.mjs +523 -0
- package/plugins/lisa-devin/scripts/queue-contract-resolution.mjs +583 -0
- package/plugins/lisa-devin/scripts/queue-health-classification.mjs +157 -0
- package/plugins/lisa-devin/scripts/queue-status-build-readers.mjs +561 -0
- package/plugins/lisa-devin/scripts/queue-status-prd-readers.mjs +452 -0
- package/plugins/lisa-devin/scripts/remote-agent-aws-setup.sh +677 -0
- package/plugins/lisa-devin/scripts/repo-scope-vocabulary-audit.mjs +458 -0
- package/plugins/lisa-devin/scripts/resolve-lifecycle-role.mjs +347 -0
- package/plugins/lisa-devin/scripts/rollup-blocker-classification.mjs +616 -0
- package/plugins/lisa-devin/scripts/scoping-label-audit.mjs +474 -0
- package/plugins/lisa-devin/skills/lisa-acceptance-criteria/SKILL.md +73 -0
- package/plugins/lisa-devin/skills/lisa-agent-design-best-practices/SKILL.md +242 -0
- package/plugins/lisa-devin/skills/lisa-agent-ready/SKILL.md +271 -0
- package/plugins/lisa-devin/skills/lisa-analyze-claude-remote/SKILL.md +434 -0
- package/plugins/lisa-devin/skills/lisa-atlassian-access/SKILL.md +469 -0
- package/plugins/lisa-devin/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs +236 -0
- package/plugins/lisa-devin/skills/lisa-attribute-failure/SKILL.md +142 -0
- package/plugins/lisa-devin/skills/lisa-automation-status/SKILL.md +149 -0
- package/plugins/lisa-devin/skills/lisa-bug-triage/SKILL.md +23 -0
- package/plugins/lisa-devin/skills/lisa-capability-drift/SKILL.md +71 -0
- package/plugins/lisa-devin/skills/lisa-codebase-research/SKILL.md +87 -0
- package/plugins/lisa-devin/skills/lisa-codify-verification/SKILL.md +213 -0
- package/plugins/lisa-devin/skills/lisa-confluence-prd-intake/SKILL.md +417 -0
- package/plugins/lisa-devin/skills/lisa-confluence-to-tracker/SKILL.md +469 -0
- package/plugins/lisa-devin/skills/lisa-confluence-write-prd/SKILL.md +111 -0
- package/plugins/lisa-devin/skills/lisa-cross-pollinate/SKILL.md +175 -0
- package/plugins/lisa-devin/skills/lisa-debrief/SKILL.md +96 -0
- package/plugins/lisa-devin/skills/lisa-debrief-apply/SKILL.md +106 -0
- package/plugins/lisa-devin/skills/lisa-delivery-effectiveness/SKILL.md +62 -0
- package/plugins/lisa-devin/skills/lisa-design-intake/SKILL.md +198 -0
- package/plugins/lisa-devin/skills/lisa-detect-tooling/SKILL.md +110 -0
- package/plugins/lisa-devin/skills/lisa-detect-tooling/scripts/commands.mjs +479 -0
- package/plugins/lisa-devin/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +658 -0
- package/plugins/lisa-devin/skills/lisa-doctor/SKILL.md +743 -0
- package/plugins/lisa-devin/skills/lisa-drive-pr-to-merge/SKILL.md +1587 -0
- package/plugins/lisa-devin/skills/lisa-epic-triage/SKILL.md +28 -0
- package/plugins/lisa-devin/skills/lisa-evaluation-suite/SKILL.md +63 -0
- package/plugins/lisa-devin/skills/lisa-exploratory-qa/SKILL.md +185 -0
- package/plugins/lisa-devin/skills/lisa-fix-linter-error/SKILL.md +45 -0
- package/plugins/lisa-devin/skills/lisa-generate-claude-remote-build-script/SKILL.md +235 -0
- package/plugins/lisa-devin/skills/lisa-git-commit/SKILL.md +53 -0
- package/plugins/lisa-devin/skills/lisa-git-prune/SKILL.md +35 -0
- package/plugins/lisa-devin/skills/lisa-git-submit-pr/SKILL.md +170 -0
- package/plugins/lisa-devin/skills/lisa-github-add-journey/SKILL.md +118 -0
- package/plugins/lisa-devin/skills/lisa-github-build-intake/SKILL.md +745 -0
- package/plugins/lisa-devin/skills/lisa-github-claim/SKILL.md +27 -0
- package/plugins/lisa-devin/skills/lisa-github-create/SKILL.md +105 -0
- package/plugins/lisa-devin/skills/lisa-github-evidence/SKILL.md +120 -0
- package/plugins/lisa-devin/skills/lisa-github-journey/SKILL.md +134 -0
- package/plugins/lisa-devin/skills/lisa-github-prd-intake/SKILL.md +424 -0
- package/plugins/lisa-devin/skills/lisa-github-project-v2/SKILL.md +227 -0
- package/plugins/lisa-devin/skills/lisa-github-read-issue/SKILL.md +305 -0
- package/plugins/lisa-devin/skills/lisa-github-sync/SKILL.md +201 -0
- package/plugins/lisa-devin/skills/lisa-github-to-tracker/SKILL.md +456 -0
- package/plugins/lisa-devin/skills/lisa-github-validate-issue/SKILL.md +598 -0
- package/plugins/lisa-devin/skills/lisa-github-verify/SKILL.md +60 -0
- package/plugins/lisa-devin/skills/lisa-github-write-issue/SKILL.md +531 -0
- package/plugins/lisa-devin/skills/lisa-github-write-prd/SKILL.md +156 -0
- package/plugins/lisa-devin/skills/lisa-health/SKILL.md +142 -0
- package/plugins/lisa-devin/skills/lisa-health-drift-cron/SKILL.md +80 -0
- package/plugins/lisa-devin/skills/lisa-implement/SKILL.md +372 -0
- package/plugins/lisa-devin/skills/lisa-improve-code-complexity/SKILL.md +44 -0
- package/plugins/lisa-devin/skills/lisa-improve-harness/SKILL.md +487 -0
- package/plugins/lisa-devin/skills/lisa-improve-max-lines/SKILL.md +45 -0
- package/plugins/lisa-devin/skills/lisa-improve-max-lines-per-function/SKILL.md +46 -0
- package/plugins/lisa-devin/skills/lisa-improve-test-coverage/SKILL.md +47 -0
- package/plugins/lisa-devin/skills/lisa-improve-tests/SKILL.md +50 -0
- package/plugins/lisa-devin/skills/lisa-intake/SKILL.md +208 -0
- package/plugins/lisa-devin/skills/lisa-intake-explain/SKILL.md +279 -0
- package/plugins/lisa-devin/skills/lisa-jam-access/SKILL.md +128 -0
- package/plugins/lisa-devin/skills/lisa-jira-add-journey/SKILL.md +139 -0
- package/plugins/lisa-devin/skills/lisa-jira-build-intake/SKILL.md +556 -0
- package/plugins/lisa-devin/skills/lisa-jira-claim/SKILL.md +27 -0
- package/plugins/lisa-devin/skills/lisa-jira-create/SKILL.md +157 -0
- package/plugins/lisa-devin/skills/lisa-jira-evidence/SKILL.md +106 -0
- package/plugins/lisa-devin/skills/lisa-jira-evidence/scripts/post-evidence.sh +262 -0
- package/plugins/lisa-devin/skills/lisa-jira-journey/SKILL.md +168 -0
- package/plugins/lisa-devin/skills/lisa-jira-journey/scripts/generate-templates.py +239 -0
- package/plugins/lisa-devin/skills/lisa-jira-journey/scripts/parse-plan.py +570 -0
- package/plugins/lisa-devin/skills/lisa-jira-read-ticket/SKILL.md +199 -0
- package/plugins/lisa-devin/skills/lisa-jira-read-ticket/scripts/download-attachment.sh +211 -0
- package/plugins/lisa-devin/skills/lisa-jira-sync/SKILL.md +117 -0
- package/plugins/lisa-devin/skills/lisa-jira-validate-ticket/SKILL.md +525 -0
- package/plugins/lisa-devin/skills/lisa-jira-verify/SKILL.md +61 -0
- package/plugins/lisa-devin/skills/lisa-jira-write-ticket/SKILL.md +440 -0
- package/plugins/lisa-devin/skills/lisa-jsdoc-best-practices/SKILL.md +491 -0
- package/plugins/lisa-devin/skills/lisa-kane-browser/SKILL.md +80 -0
- package/plugins/lisa-devin/skills/lisa-learnings-audit/SKILL.md +490 -0
- package/plugins/lisa-devin/skills/lisa-linear-access/SKILL.md +483 -0
- package/plugins/lisa-devin/skills/lisa-linear-add-journey/SKILL.md +109 -0
- package/plugins/lisa-devin/skills/lisa-linear-build-intake/SKILL.md +548 -0
- package/plugins/lisa-devin/skills/lisa-linear-claim/SKILL.md +28 -0
- package/plugins/lisa-devin/skills/lisa-linear-create/SKILL.md +150 -0
- package/plugins/lisa-devin/skills/lisa-linear-evidence/SKILL.md +124 -0
- package/plugins/lisa-devin/skills/lisa-linear-journey/SKILL.md +147 -0
- package/plugins/lisa-devin/skills/lisa-linear-prd-intake/SKILL.md +411 -0
- package/plugins/lisa-devin/skills/lisa-linear-read-issue/SKILL.md +201 -0
- package/plugins/lisa-devin/skills/lisa-linear-sync/SKILL.md +164 -0
- package/plugins/lisa-devin/skills/lisa-linear-to-tracker/SKILL.md +454 -0
- package/plugins/lisa-devin/skills/lisa-linear-validate-issue/SKILL.md +504 -0
- package/plugins/lisa-devin/skills/lisa-linear-verify/SKILL.md +65 -0
- package/plugins/lisa-devin/skills/lisa-linear-write-issue/SKILL.md +448 -0
- package/plugins/lisa-devin/skills/lisa-linear-write-prd/SKILL.md +98 -0
- package/plugins/lisa-devin/skills/lisa-monitor/SKILL.md +224 -0
- package/plugins/lisa-devin/skills/lisa-nightly-add-test-coverage/SKILL.md +40 -0
- package/plugins/lisa-devin/skills/lisa-nightly-improve-tests/SKILL.md +29 -0
- package/plugins/lisa-devin/skills/lisa-nightly-lower-code-complexity/SKILL.md +42 -0
- package/plugins/lisa-devin/skills/lisa-notion-access/SKILL.md +301 -0
- package/plugins/lisa-devin/skills/lisa-notion-prd-intake/SKILL.md +360 -0
- package/plugins/lisa-devin/skills/lisa-notion-to-tracker/SKILL.md +467 -0
- package/plugins/lisa-devin/skills/lisa-notion-write-prd/SKILL.md +111 -0
- package/plugins/lisa-devin/skills/lisa-parity-code-review/SKILL.md +83 -0
- package/plugins/lisa-devin/skills/lisa-parity-code-simplifier/SKILL.md +76 -0
- package/plugins/lisa-devin/skills/lisa-parity-coderabbit/SKILL.md +87 -0
- package/plugins/lisa-devin/skills/lisa-parity-sentry-sdk-setup/SKILL.md +375 -0
- package/plugins/lisa-devin/skills/lisa-parity-sentry-seer/SKILL.md +168 -0
- package/plugins/lisa-devin/skills/lisa-parity-skill-creator/SKILL.md +155 -0
- package/plugins/lisa-devin/skills/lisa-performance-review/SKILL.md +94 -0
- package/plugins/lisa-devin/skills/lisa-persist-learning/SKILL.md +247 -0
- package/plugins/lisa-devin/skills/lisa-plan/SKILL.md +64 -0
- package/plugins/lisa-devin/skills/lisa-plugin-sync-explain/SKILL.md +53 -0
- package/plugins/lisa-devin/skills/lisa-posthog-access/SKILL.md +140 -0
- package/plugins/lisa-devin/skills/lisa-prd-backlink/SKILL.md +274 -0
- package/plugins/lisa-devin/skills/lisa-prd-source-write/SKILL.md +104 -0
- package/plugins/lisa-devin/skills/lisa-prd-ticket-coverage/SKILL.md +187 -0
- package/plugins/lisa-devin/skills/lisa-product-walkthrough/SKILL.md +106 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/SKILL.md +417 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/examples/evidence-card-format.md +21 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/examples/host-project-only.md +22 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/examples/idempotency-verification-harness.md +57 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/examples/public-external-inspiration.md +22 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/examples/unavailable-data-rejection.md +22 -0
- package/plugins/lisa-devin/skills/lisa-pull-request-review/SKILL.md +132 -0
- package/plugins/lisa-devin/skills/lisa-quality-review/SKILL.md +63 -0
- package/plugins/lisa-devin/skills/lisa-queue-status/SKILL.md +215 -0
- package/plugins/lisa-devin/skills/lisa-remote-dispatch/SKILL.md +109 -0
- package/plugins/lisa-devin/skills/lisa-remote-dispatch/scripts/dispatch.mjs +535 -0
- package/plugins/lisa-devin/skills/lisa-repair-intake/SKILL.md +1621 -0
- package/plugins/lisa-devin/skills/lisa-reproduce-bug/SKILL.md +75 -0
- package/plugins/lisa-devin/skills/lisa-research/SKILL.md +92 -0
- package/plugins/lisa-devin/skills/lisa-review-implementation/SKILL.md +209 -0
- package/plugins/lisa-devin/skills/lisa-review-local/SKILL.md +141 -0
- package/plugins/lisa-devin/skills/lisa-rework-triage/SKILL.md +206 -0
- package/plugins/lisa-devin/skills/lisa-root-cause-analysis/SKILL.md +135 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/SKILL.md +430 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/aws-bootstrap.mjs +433 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/bootstrap-store.mjs +288 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +273 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/envfile.mjs +80 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/inspect-vault.mjs +142 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +1085 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/note-format.mjs +179 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/owner.mjs +96 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/preflight-secrets.mjs +342 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/prompt-secret.mjs +79 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/providers.mjs +805 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +680 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/read-secret-note.mjs +105 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/resolve-expo-token.mjs +90 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/resolve-secret.mjs +285 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/rotate-secret.mjs +297 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/routing-floor.mjs +153 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/surfaces.mjs +480 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +510 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/tools-from-notes.mjs +63 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/validate-config.mjs +550 -0
- package/plugins/lisa-devin/skills/lisa-security-review/SKILL.md +124 -0
- package/plugins/lisa-devin/skills/lisa-security-zap-scan/SKILL.md +53 -0
- package/plugins/lisa-devin/skills/lisa-sentry-access/SKILL.md +140 -0
- package/plugins/lisa-devin/skills/lisa-setup-atlassian/SKILL.md +407 -0
- package/plugins/lisa-devin/skills/lisa-setup-automations/SKILL.md +430 -0
- package/plugins/lisa-devin/skills/lisa-setup-automations/scripts/generate-workflow.mjs +288 -0
- package/plugins/lisa-devin/skills/lisa-setup-confluence/SKILL.md +254 -0
- package/plugins/lisa-devin/skills/lisa-setup-github/SKILL.md +319 -0
- package/plugins/lisa-devin/skills/lisa-setup-github-repo/SKILL.md +128 -0
- package/plugins/lisa-devin/skills/lisa-setup-jira/SKILL.md +198 -0
- package/plugins/lisa-devin/skills/lisa-setup-kane/SKILL.md +96 -0
- package/plugins/lisa-devin/skills/lisa-setup-linear/SKILL.md +375 -0
- package/plugins/lisa-devin/skills/lisa-setup-local-env/SKILL.md +95 -0
- package/plugins/lisa-devin/skills/lisa-setup-local-env/scripts/local-env.mjs +196 -0
- package/plugins/lisa-devin/skills/lisa-setup-notion/SKILL.md +376 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-aws/SKILL.md +149 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/SKILL.md +382 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/assets/materialized-env-authority.mjs +262 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/assets/session-start.sh +87 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/assets/setup.sh +216 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/environment.mjs +227 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/preflight-tools.mjs +378 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +1632 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/tool-floor.mjs +94 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/toolchain.mjs +448 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs +250 -0
- package/plugins/lisa-devin/skills/lisa-setup-sonar/SKILL.md +153 -0
- package/plugins/lisa-devin/skills/lisa-setup-workstation/SKILL.md +143 -0
- package/plugins/lisa-devin/skills/lisa-setup-workstation/scripts/bounded-child.mjs +168 -0
- package/plugins/lisa-devin/skills/lisa-setup-workstation/scripts/catalogue.mjs +293 -0
- package/plugins/lisa-devin/skills/lisa-setup-workstation/scripts/cli.mjs +333 -0
- package/plugins/lisa-devin/skills/lisa-setup-workstation/scripts/workstation.mjs +511 -0
- package/plugins/lisa-devin/skills/lisa-sonarcloud-access/SKILL.md +202 -0
- package/plugins/lisa-devin/skills/lisa-spec-conformance/SKILL.md +205 -0
- package/plugins/lisa-devin/skills/lisa-starter-sync/SKILL.md +35 -0
- package/plugins/lisa-devin/skills/lisa-sync-down/SKILL.md +209 -0
- package/plugins/lisa-devin/skills/lisa-task-decomposition/SKILL.md +195 -0
- package/plugins/lisa-devin/skills/lisa-task-triage/SKILL.md +23 -0
- package/plugins/lisa-devin/skills/lisa-tdd-implementation/SKILL.md +91 -0
- package/plugins/lisa-devin/skills/lisa-tear-down-automations/SKILL.md +85 -0
- package/plugins/lisa-devin/skills/lisa-test-strategy/SKILL.md +66 -0
- package/plugins/lisa-devin/skills/lisa-ticket-triage/SKILL.md +214 -0
- package/plugins/lisa-devin/skills/lisa-track/SKILL.md +129 -0
- package/plugins/lisa-devin/skills/lisa-tracker-add-journey/SKILL.md +28 -0
- package/plugins/lisa-devin/skills/lisa-tracker-build-intake/SKILL.md +134 -0
- package/plugins/lisa-devin/skills/lisa-tracker-claim/SKILL.md +35 -0
- package/plugins/lisa-devin/skills/lisa-tracker-create/SKILL.md +28 -0
- package/plugins/lisa-devin/skills/lisa-tracker-evidence/SKILL.md +63 -0
- package/plugins/lisa-devin/skills/lisa-tracker-journey/SKILL.md +27 -0
- package/plugins/lisa-devin/skills/lisa-tracker-read/SKILL.md +28 -0
- package/plugins/lisa-devin/skills/lisa-tracker-source-artifacts/SKILL.md +111 -0
- package/plugins/lisa-devin/skills/lisa-tracker-sync/SKILL.md +150 -0
- package/plugins/lisa-devin/skills/lisa-tracker-validate/SKILL.md +37 -0
- package/plugins/lisa-devin/skills/lisa-tracker-verify/SKILL.md +29 -0
- package/plugins/lisa-devin/skills/lisa-tracker-write/SKILL.md +55 -0
- package/plugins/lisa-devin/skills/lisa-usage-accounting/SKILL.md +205 -0
- package/plugins/lisa-devin/skills/lisa-usage-accounting/references/effectiveness.md +63 -0
- package/plugins/lisa-devin/skills/lisa-use-the-product/SKILL.md +86 -0
- package/plugins/lisa-devin/skills/lisa-validate-tracker-mapping/SKILL.md +467 -0
- package/plugins/lisa-devin/skills/lisa-verification-lifecycle/SKILL.md +384 -0
- package/plugins/lisa-devin/skills/lisa-verify/SKILL.md +55 -0
- package/plugins/lisa-devin/skills/lisa-verify-prd/SKILL.md +394 -0
- package/plugins/lisa-devin/skills/lisa-verify-workflow-change/SKILL.md +154 -0
- package/plugins/lisa-devin/skills/lisa-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-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-expo-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-expo-devin/.mcp.json +8 -0
- package/plugins/lisa-expo-devin/THIRD-PARTY-NOTICES.md +84 -0
- package/plugins/lisa-expo-devin/agents/ops-specialist.md +124 -0
- package/plugins/lisa-expo-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-expo-devin/hooks/register-maestro-mcp.sh +84 -0
- package/plugins/lisa-expo-devin/hooks.json +14 -0
- package/plugins/lisa-expo-devin/skills/add-app-clip/SKILL.md +280 -0
- package/plugins/lisa-expo-devin/skills/add-app-clip/references/native-module.md +96 -0
- package/plugins/lisa-expo-devin/skills/apollo-client/SKILL.md +238 -0
- package/plugins/lisa-expo-devin/skills/apollo-client/references/mutation-patterns.md +360 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/SKILL.md +369 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/references/atomic-levels.md +417 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/references/folder-structure.md +257 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/references/gluestack-mapping.md +233 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/scripts/test_validate_atomic_structure.py +240 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +438 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/SKILL.md +321 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/animations.md +220 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/controls.md +272 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/form-sheet.md +253 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/gradients.md +106 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/icons.md +213 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/media.md +198 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/route-structure.md +229 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/search.md +248 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/storage.md +121 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/tabs.md +433 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/toolbar-and-headers.md +284 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/visual-effects.md +197 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/webgpu-three.md +605 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/zoom-transitions.md +158 -0
- package/plugins/lisa-expo-devin/skills/container-view-pattern/SKILL.md +355 -0
- package/plugins/lisa-expo-devin/skills/container-view-pattern/references/examples.md +749 -0
- package/plugins/lisa-expo-devin/skills/container-view-pattern/references/patterns.md +318 -0
- package/plugins/lisa-expo-devin/skills/container-view-pattern/scripts/create_component.py +200 -0
- package/plugins/lisa-expo-devin/skills/container-view-pattern/scripts/validate_component.py +332 -0
- package/plugins/lisa-expo-devin/skills/cross-platform-compatibility/SKILL.md +268 -0
- package/plugins/lisa-expo-devin/skills/cross-platform-compatibility/references/common-issues.md +619 -0
- package/plugins/lisa-expo-devin/skills/cross-platform-compatibility/references/file-extensions.md +340 -0
- package/plugins/lisa-expo-devin/skills/cross-platform-compatibility/references/platform-api.md +276 -0
- package/plugins/lisa-expo-devin/skills/cross-platform-compatibility/scripts/validate_cross_platform.py +416 -0
- package/plugins/lisa-expo-devin/skills/directory-structure/SKILL.md +214 -0
- package/plugins/lisa-expo-devin/skills/directory-structure/scripts/validate_structure.py +454 -0
- package/plugins/lisa-expo-devin/skills/e2e-coverage-gaps/SKILL.md +117 -0
- package/plugins/lisa-expo-devin/skills/eas-update-insights/SKILL.md +228 -0
- package/plugins/lisa-expo-devin/skills/eas-update-insights/references/channel-insights-schema.md +47 -0
- package/plugins/lisa-expo-devin/skills/eas-update-insights/references/update-insights-schema.md +69 -0
- package/plugins/lisa-expo-devin/skills/expo-api-routes/SKILL.md +369 -0
- package/plugins/lisa-expo-devin/skills/expo-brownfield/SKILL.md +54 -0
- package/plugins/lisa-expo-devin/skills/expo-brownfield/references/brownfield-integrated.md +526 -0
- package/plugins/lisa-expo-devin/skills/expo-brownfield/references/brownfield-isolated.md +402 -0
- package/plugins/lisa-expo-devin/skills/expo-brownfield/references/comparison.md +63 -0
- package/plugins/lisa-expo-devin/skills/expo-brownfield/references/troubleshooting.md +88 -0
- package/plugins/lisa-expo-devin/skills/expo-cicd-workflows/SKILL.md +92 -0
- package/plugins/lisa-expo-devin/skills/expo-cicd-workflows/scripts/fetch.js +113 -0
- package/plugins/lisa-expo-devin/skills/expo-cicd-workflows/scripts/package.json +11 -0
- package/plugins/lisa-expo-devin/skills/expo-cicd-workflows/scripts/validate.js +85 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/SKILL.md +193 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/references/app-store-metadata.md +479 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/references/ios-app-store.md +355 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/references/play-store.md +264 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/references/testflight.md +58 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/references/workflows.md +200 -0
- package/plugins/lisa-expo-devin/skills/expo-dev-client/SKILL.md +164 -0
- package/plugins/lisa-expo-devin/skills/expo-env-config/SKILL.md +309 -0
- package/plugins/lisa-expo-devin/skills/expo-env-config/references/validation-patterns.md +417 -0
- package/plugins/lisa-expo-devin/skills/expo-module/SKILL.md +141 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/config-plugin.md +90 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/create-expo-module.md +206 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/lifecycle.md +127 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/module-config.md +48 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/native-module.md +286 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/native-view.md +171 -0
- package/plugins/lisa-expo-devin/skills/expo-router-best-practices/SKILL.md +432 -0
- package/plugins/lisa-expo-devin/skills/expo-router-best-practices/references/official-docs.md +290 -0
- package/plugins/lisa-expo-devin/skills/expo-router-best-practices/references/static-export-verification.md +54 -0
- package/plugins/lisa-expo-devin/skills/expo-router-best-practices/scripts/generate-route.py +171 -0
- package/plugins/lisa-expo-devin/skills/expo-tailwind-setup/SKILL.md +487 -0
- package/plugins/lisa-expo-devin/skills/expo-ui-jetpack-compose/SKILL.md +40 -0
- package/plugins/lisa-expo-devin/skills/expo-ui-swift-ui/SKILL.md +39 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/SKILL.md +419 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/references/color-tokens.md +343 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/references/component-mapping.md +307 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/references/spacing-scale.md +300 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/scripts/test_validate_styling.py +240 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/scripts/validate_styling.py +424 -0
- package/plugins/lisa-expo-devin/skills/jira-add-journey/SKILL.md +140 -0
- package/plugins/lisa-expo-devin/skills/jira-create/SKILL.md +161 -0
- package/plugins/lisa-expo-devin/skills/jira-evidence/SKILL.md +84 -0
- package/plugins/lisa-expo-devin/skills/jira-evidence/scripts/post-evidence.sh +262 -0
- package/plugins/lisa-expo-devin/skills/jira-journey/SKILL.md +196 -0
- package/plugins/lisa-expo-devin/skills/jira-journey/scripts/generate-templates.py +281 -0
- package/plugins/lisa-expo-devin/skills/jira-journey/scripts/parse-plan.py +400 -0
- package/plugins/lisa-expo-devin/skills/jira-verify/SKILL.md +27 -0
- package/plugins/lisa-expo-devin/skills/local-state/SKILL.md +362 -0
- package/plugins/lisa-expo-devin/skills/local-state/references/async-storage.md +505 -0
- package/plugins/lisa-expo-devin/skills/local-state/references/persistence-patterns.md +711 -0
- package/plugins/lisa-expo-devin/skills/local-state/references/reactive-variables.md +446 -0
- package/plugins/lisa-expo-devin/skills/maestro-mcp-setup/SKILL.md +144 -0
- package/plugins/lisa-expo-devin/skills/native-data-fetching/SKILL.md +507 -0
- package/plugins/lisa-expo-devin/skills/native-data-fetching/references/expo-router-loaders.md +344 -0
- package/plugins/lisa-expo-devin/skills/ops-browser-uat/SKILL.md +124 -0
- package/plugins/lisa-expo-devin/skills/ops-check-logs/SKILL.md +217 -0
- package/plugins/lisa-expo-devin/skills/ops-db-ops/SKILL.md +214 -0
- package/plugins/lisa-expo-devin/skills/ops-deploy/SKILL.md +123 -0
- package/plugins/lisa-expo-devin/skills/ops-monitor-errors/SKILL.md +99 -0
- package/plugins/lisa-expo-devin/skills/ops-performance/SKILL.md +165 -0
- package/plugins/lisa-expo-devin/skills/ops-run-local/SKILL.md +169 -0
- package/plugins/lisa-expo-devin/skills/ops-verify-health/SKILL.md +101 -0
- package/plugins/lisa-expo-devin/skills/owasp-zap/SKILL.md +61 -0
- package/plugins/lisa-expo-devin/skills/play-store-access/SKILL.md +226 -0
- package/plugins/lisa-expo-devin/skills/playwright-ci-debugging/SKILL.md +140 -0
- package/plugins/lisa-expo-devin/skills/playwright-selectors/SKILL.md +496 -0
- package/plugins/lisa-expo-devin/skills/reduce-complexity/SKILL.md +251 -0
- package/plugins/lisa-expo-devin/skills/reduce-complexity/references/extraction-strategies.md +456 -0
- package/plugins/lisa-expo-devin/skills/reduce-complexity/references/refactoring-patterns.md +557 -0
- package/plugins/lisa-expo-devin/skills/testing-library/SKILL.md +314 -0
- package/plugins/lisa-expo-devin/skills/testing-library/references/async-patterns.md +420 -0
- package/plugins/lisa-expo-devin/skills/testing-library/references/expo-router-testing.md +556 -0
- package/plugins/lisa-expo-devin/skills/testing-library/references/mocking-patterns.md +612 -0
- package/plugins/lisa-expo-devin/skills/testing-library/references/query-priority.md +291 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/SKILL.md +134 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/expo-av-to-audio.md +132 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/expo-av-to-video.md +160 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/native-tabs.md +124 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/new-architecture.md +79 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/react-19.md +79 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/react-compiler.md +59 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/react-navigation-to-expo-router.md +61 -0
- package/plugins/lisa-expo-devin/skills/use-dom/SKILL.md +417 -0
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-harper-fabric-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-harper-fabric-devin/generated-artifact-globs.txt +5 -0
- package/plugins/lisa-harper-fabric-devin/hooks/block-generated-artifact-edits.sh +141 -0
- package/plugins/lisa-harper-fabric-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-harper-fabric-devin/hooks/enforce-config-extensions.mjs +196 -0
- package/plugins/lisa-harper-fabric-devin/hooks/enforce-config-extensions.sh +46 -0
- package/plugins/lisa-harper-fabric-devin/hooks/inject-rules.sh +27 -0
- package/plugins/lisa-harper-fabric-devin/hooks.json +36 -0
- package/plugins/lisa-harper-fabric-devin/rules/eager/harper-fabric.md +31 -0
- package/plugins/lisa-harper-fabric-devin/rules/reference/harper-fabric.md +52 -0
- package/plugins/lisa-harper-fabric-devin/skills/e2e-coverage-gaps/SKILL.md +117 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-auth/SKILL.md +368 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-build-and-deploy/SKILL.md +198 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-caching/SKILL.md +265 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-component-model/SKILL.md +87 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-config-yaml/SKILL.md +283 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-operations/SKILL.md +239 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-realtime/SKILL.md +187 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-resources/SKILL.md +142 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-rest-queries/SKILL.md +403 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-schema-graphql/SKILL.md +123 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-testing/SKILL.md +254 -0
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-nestjs-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-nestjs-devin/hooks/block-migration-edits.sh +125 -0
- package/plugins/lisa-nestjs-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-nestjs-devin/hooks/lisa-edit-gate.sh +152 -0
- package/plugins/lisa-nestjs-devin/hooks.json +15 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/SKILL.md +176 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/references/advanced-features.md +527 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/references/project-patterns.md +531 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/references/quick-start.md +257 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/references/resolvers-mutations.md +413 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/references/types-scalars.md +513 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-rules/SKILL.md +560 -0
- package/plugins/lisa-nestjs-devin/skills/typeorm-patterns/SKILL.md +275 -0
- package/plugins/lisa-nestjs-devin/skills/typeorm-patterns/references/configuration-patterns.md +487 -0
- package/plugins/lisa-nestjs-devin/skills/typeorm-patterns/references/entity-patterns.md +450 -0
- package/plugins/lisa-nestjs-devin/skills/typeorm-patterns/references/observability-patterns.md +536 -0
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-devin/.claude-plugin/plugin.json +8 -0
- package/plugins/lisa-openclaw-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-connect-repo-topic/SKILL.md +163 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +185 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-connect-staff/SKILL.md +175 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-connect-staff/references/platform-routing.md +123 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-connect-staff/references/prompts.md +78 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-setup/SKILL.md +141 -0
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-phaser-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-phaser-devin/agents/accessibility-advocate.md +55 -0
- package/plugins/lisa-phaser-devin/agents/art-director.md +90 -0
- package/plugins/lisa-phaser-devin/agents/audio-director.md +65 -0
- package/plugins/lisa-phaser-devin/agents/combat-designer.md +61 -0
- package/plugins/lisa-phaser-devin/agents/economy-designer.md +59 -0
- package/plugins/lisa-phaser-devin/agents/game-designer.md +62 -0
- package/plugins/lisa-phaser-devin/agents/game-feel-specialist.md +56 -0
- package/plugins/lisa-phaser-devin/agents/level-designer.md +59 -0
- package/plugins/lisa-phaser-devin/agents/localization-manager.md +61 -0
- package/plugins/lisa-phaser-devin/agents/marketing-strategist.md +59 -0
- package/plugins/lisa-phaser-devin/agents/monetization-designer.md +59 -0
- package/plugins/lisa-phaser-devin/agents/narrative-designer.md +56 -0
- package/plugins/lisa-phaser-devin/agents/onboarding-advocate.md +59 -0
- package/plugins/lisa-phaser-devin/agents/player-advocate.md +57 -0
- package/plugins/lisa-phaser-devin/agents/producer.md +61 -0
- package/plugins/lisa-phaser-devin/agents/product-analyst.md +62 -0
- package/plugins/lisa-phaser-devin/agents/publisher.md +59 -0
- package/plugins/lisa-phaser-devin/agents/qa-playtester.md +57 -0
- package/plugins/lisa-phaser-devin/agents/target-player.md +52 -0
- package/plugins/lisa-phaser-devin/agents/ux-ui-designer.md +60 -0
- package/plugins/lisa-phaser-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-phaser-devin/hooks/inject-rules.sh +27 -0
- package/plugins/lisa-phaser-devin/hooks.json +14 -0
- package/plugins/lisa-phaser-devin/rules/eager/phaser.md +44 -0
- package/plugins/lisa-phaser-devin/rules/reference/phaser.md +184 -0
- package/plugins/lisa-phaser-devin/skills/phaser-accessibility/SKILL.md +135 -0
- package/plugins/lisa-phaser-devin/skills/phaser-asset-pipeline/SKILL.md +222 -0
- package/plugins/lisa-phaser-devin/skills/phaser-asset-sourcing/SKILL.md +151 -0
- package/plugins/lisa-phaser-devin/skills/phaser-build-deploy/SKILL.md +153 -0
- package/plugins/lisa-phaser-devin/skills/phaser-i18n/SKILL.md +122 -0
- package/plugins/lisa-phaser-devin/skills/phaser-project-structure/SKILL.md +89 -0
- package/plugins/lisa-phaser-devin/skills/phaser-services/SKILL.md +208 -0
- package/plugins/lisa-phaser-devin/skills/phaser-testing/SKILL.md +192 -0
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-rails-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-rails-devin/agents/ops-specialist.md +226 -0
- package/plugins/lisa-rails-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-rails-devin/hooks/inject-rules.sh +40 -0
- package/plugins/lisa-rails-devin/hooks/lisa-edit-gate.sh +152 -0
- package/plugins/lisa-rails-devin/hooks/rubocop-on-edit.sh +101 -0
- package/plugins/lisa-rails-devin/hooks/sg-scan-on-edit.sh +97 -0
- package/plugins/lisa-rails-devin/hooks.json +29 -0
- package/plugins/lisa-rails-devin/rules/eager/rails-conventions.md +23 -0
- package/plugins/lisa-rails-devin/rules/reference/rails-conventions.md +176 -0
- package/plugins/lisa-rails-devin/skills/action-controller-best-practices/SKILL.md +374 -0
- package/plugins/lisa-rails-devin/skills/action-view-best-practices/SKILL.md +335 -0
- package/plugins/lisa-rails-devin/skills/active-record-model-best-practices/SKILL.md +166 -0
- package/plugins/lisa-rails-devin/skills/e2e-coverage-gaps/SKILL.md +117 -0
- package/plugins/lisa-rails-devin/skills/fix-linter-error/SKILL.md +45 -0
- package/plugins/lisa-rails-devin/skills/improve-code-complexity/SKILL.md +51 -0
- package/plugins/lisa-rails-devin/skills/improve-max-lines/SKILL.md +46 -0
- package/plugins/lisa-rails-devin/skills/improve-max-lines-per-function/SKILL.md +46 -0
- package/plugins/lisa-rails-devin/skills/improve-test-coverage/SKILL.md +48 -0
- package/plugins/lisa-rails-devin/skills/jira-add-journey/SKILL.md +79 -0
- package/plugins/lisa-rails-devin/skills/jira-create/SKILL.md +100 -0
- package/plugins/lisa-rails-devin/skills/jira-evidence/SKILL.md +76 -0
- package/plugins/lisa-rails-devin/skills/jira-evidence/scripts/post-evidence.sh +262 -0
- package/plugins/lisa-rails-devin/skills/jira-journey/SKILL.md +65 -0
- package/plugins/lisa-rails-devin/skills/jira-verify/SKILL.md +26 -0
- package/plugins/lisa-rails-devin/skills/ops-check-logs/SKILL.md +191 -0
- package/plugins/lisa-rails-devin/skills/ops-deploy/SKILL.md +153 -0
- package/plugins/lisa-rails-devin/skills/ops-run-local/SKILL.md +169 -0
- package/plugins/lisa-rails-devin/skills/ops-verify-jobs/SKILL.md +157 -0
- package/plugins/lisa-rails-devin/skills/ops-verify-telemetry/SKILL.md +226 -0
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-typescript-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-typescript-devin/hooks/block-suppress-directives.sh +141 -0
- package/plugins/lisa-typescript-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-typescript-devin/hooks/format-on-edit.sh +102 -0
- package/plugins/lisa-typescript-devin/hooks/lint-on-edit.sh +117 -0
- package/plugins/lisa-typescript-devin/hooks/lisa-edit-gate.sh +152 -0
- package/plugins/lisa-typescript-devin/hooks/sg-scan-on-edit.sh +94 -0
- package/plugins/lisa-typescript-devin/hooks.json +34 -0
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-devin/.claude-plugin/plugin.json +8 -0
- package/plugins/lisa-wiki-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-wiki-devin/ci/lisa-wiki-validate.yml +33 -0
- package/plugins/lisa-wiki-devin/schema/lisa-wiki-config.schema.json +162 -0
- package/plugins/lisa-wiki-devin/schema/wiki-structure.schema.json +51 -0
- package/plugins/lisa-wiki-devin/scripts/_wiki-lib.mjs +204 -0
- package/plugins/lisa-wiki-devin/scripts/diff-guard.mjs +117 -0
- package/plugins/lisa-wiki-devin/scripts/ensure-gitignore.mjs +131 -0
- package/plugins/lisa-wiki-devin/scripts/ensure-wiki.mjs +268 -0
- package/plugins/lisa-wiki-devin/scripts/ingest-git.mjs +198 -0
- package/plugins/lisa-wiki-devin/scripts/ingest-memory.mjs +135 -0
- package/plugins/lisa-wiki-devin/scripts/ingest-roles.mjs +95 -0
- package/plugins/lisa-wiki-devin/scripts/ingest_slack_channel.py +361 -0
- package/plugins/lisa-wiki-devin/scripts/lib/bounded-child.mjs +159 -0
- package/plugins/lisa-wiki-devin/scripts/lint-wiki.mjs +513 -0
- package/plugins/lisa-wiki-devin/scripts/mcp-doctor.mjs +72 -0
- package/plugins/lisa-wiki-devin/scripts/render-contract.mjs +107 -0
- package/plugins/lisa-wiki-devin/scripts/rewrite-refs.mjs +144 -0
- package/plugins/lisa-wiki-devin/scripts/slack_oauth_user.py +179 -0
- package/plugins/lisa-wiki-devin/scripts/validate-config.mjs +321 -0
- package/plugins/lisa-wiki-devin/scripts/verify-migration.mjs +203 -0
- package/plugins/lisa-wiki-devin/scripts/verify-wiki-safety.mjs +126 -0
- package/plugins/lisa-wiki-devin/scripts/wiki-safety.mjs +378 -0
- package/plugins/lisa-wiki-devin/scripts/wiki-status.mjs +345 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-add-ingest/SKILL.md +34 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-add-role/SKILL.md +35 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-confluence/SKILL.md +25 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-docs/SKILL.md +30 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-git/SKILL.md +25 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-jira/SKILL.md +28 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-memory/SKILL.md +28 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-notion/SKILL.md +25 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-roles/SKILL.md +22 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-slack/SKILL.md +30 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-web/SKILL.md +23 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-doctor/SKILL.md +47 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-ingest/SKILL.md +106 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-lint/SKILL.md +32 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-migrate/SKILL.md +43 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-onboard-me/SKILL.md +33 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-query/SKILL.md +40 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-setup/SKILL.md +75 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-setup-automations/SKILL.md +83 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-status/SKILL.md +47 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-tear-down-automations/SKILL.md +34 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-usage/SKILL.md +50 -0
- package/plugins/lisa-wiki-devin/templates/agents/role-agent.claude.md +16 -0
- package/plugins/lisa-wiki-devin/templates/agents/role-agent.codex.toml +15 -0
- package/plugins/lisa-wiki-devin/templates/index.md +17 -0
- package/plugins/lisa-wiki-devin/templates/llm-wiki-contract.md +72 -0
- package/plugins/lisa-wiki-devin/templates/log.md +8 -0
- package/plugins/lisa-wiki-devin/templates/page-types/architecture.md +18 -0
- package/plugins/lisa-wiki-devin/templates/page-types/concept.md +18 -0
- package/plugins/lisa-wiki-devin/templates/page-types/decision.md +18 -0
- package/plugins/lisa-wiki-devin/templates/page-types/entity.md +19 -0
- package/plugins/lisa-wiki-devin/templates/page-types/open-question.md +18 -0
- package/plugins/lisa-wiki-devin/templates/page-types/playbook.md +18 -0
- package/plugins/lisa-wiki-devin/templates/page-types/project.md +19 -0
- package/plugins/lisa-wiki-devin/templates/page-types/requirement.md +19 -0
- package/plugins/lisa-wiki-devin/templates/page-types/staff.md +26 -0
- package/plugins/lisa-wiki-devin/templates/start-here.md +24 -0
- package/plugins/lisa-wiki-devin/templates/state-readme.md +20 -0
- package/plugins/lisa-wiki-devin/templates/wrapper-gitignore.txt +19 -0
- package/scripts/build-plugins.sh +2 -2
- package/scripts/deployed-guard-advice.mjs +1 -0
- package/scripts/generate-devin-plugin-artifacts.mjs +263 -0
- package/scripts/lib/hook-registration-audit.mjs +3 -1
- package/scripts/lib/per-agent-hook-filter.mjs +174 -5
- package/scripts/lib/plugin-rule-citations.mjs +2 -2
|
@@ -0,0 +1,743 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: lisa-doctor
|
|
3
|
+
description: "Audit whether the current repository is ready to use Lisa. Runs grouped read-only checks across project detection, Lisa config, runtime distribution surfaces, tracker/source preflight access, automation prerequisites, optional GitHub Project coordination, and optional wiki delegation, then reports PASS/WARN/FAIL/SKIP results plus an overall readiness verdict (`READY`, `READY_WITH_WARNINGS`, or `NOT_READY`)."
|
|
4
|
+
allowed-tools: ["Skill", "Bash", "Read", "Glob", "Grep"]
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Doctor: $ARGUMENTS
|
|
8
|
+
|
|
9
|
+
Run a read-only Lisa readiness audit for the current repository.
|
|
10
|
+
|
|
11
|
+
## Purpose
|
|
12
|
+
|
|
13
|
+
`/lisa:doctor` is the deterministic answer to "is this repo actually ready to use Lisa?" It audits
|
|
14
|
+
the repository in grouped sections, reports each check as `PASS`, `WARN`, `FAIL`, or `SKIP`, and
|
|
15
|
+
emits one overall verdict: `READY`, `READY_WITH_WARNINGS`, or `NOT_READY`.
|
|
16
|
+
|
|
17
|
+
The command is repository-scoped. It validates only what can be observed from the current repo,
|
|
18
|
+
current machine, and current runtime. It does **not** create automations, labels, tracker items, or
|
|
19
|
+
other external state as part of the default audit path.
|
|
20
|
+
|
|
21
|
+
## Inputs
|
|
22
|
+
|
|
23
|
+
- Optional flags in `$ARGUMENTS` that narrow or tune read-only validation.
|
|
24
|
+
- The current repository root and its Lisa config files (`.lisa.config.json`,
|
|
25
|
+
`.lisa.config.local.json`) when present.
|
|
26
|
+
|
|
27
|
+
## Confirmation policy
|
|
28
|
+
|
|
29
|
+
Do **not** ask whether to proceed. Once invoked, run the read-only audit, print the grouped
|
|
30
|
+
results, emit the overall verdict, and stop.
|
|
31
|
+
|
|
32
|
+
Specifically forbidden:
|
|
33
|
+
|
|
34
|
+
- Previewing the number of checks and asking whether to continue.
|
|
35
|
+
- Offering "run a few checks first" or "dry-run vs real run" choices. This skill is already the
|
|
36
|
+
read-only path.
|
|
37
|
+
- Performing setup mutations just because a failing check discovered something missing.
|
|
38
|
+
|
|
39
|
+
The only legitimate reasons to stop early are:
|
|
40
|
+
|
|
41
|
+
- The current working directory cannot be resolved to a repository/root the audit can inspect.
|
|
42
|
+
- The runtime blocks all required local reads needed to even classify the repo.
|
|
43
|
+
|
|
44
|
+
## Audit contract
|
|
45
|
+
|
|
46
|
+
Doctor reports grouped checks in a stable, human-readable structure. The grouped sections include,
|
|
47
|
+
as applicable to the current repo:
|
|
48
|
+
|
|
49
|
+
1. **Project detection and runtime basics** — detect the project root, package/runtime surface, and
|
|
50
|
+
whether Lisa is installed where the repo expects it.
|
|
51
|
+
2. **Lisa config readiness** — read `.lisa.config.json` and `.lisa.config.local.json` using the
|
|
52
|
+
same local-overrides-global semantics defined by `config-resolution`; report missing required
|
|
53
|
+
keys, incompatible combinations, and committed-vs-local locality problems as findings rather
|
|
54
|
+
than mutating config.
|
|
55
|
+
3. **Tracker/source preflight** — perform read-only readiness checks for the configured `tracker`
|
|
56
|
+
and `source` only. If a required CLI, MCP surface, or auth context is unavailable in the current
|
|
57
|
+
runtime, report that explicitly instead of pretending the repo is ready.
|
|
58
|
+
4. **Runtime distribution surfaces** — confirm the command, skill, hook, and related distribution
|
|
59
|
+
surfaces relevant to this repo are present where Lisa expects them on the active runtime, and
|
|
60
|
+
that the Lisa-owned enforcement artifacts (`scripts/lisa-hooks/*`,
|
|
61
|
+
`scripts/lisa-enforcement-fallback.sh`) match the installed Lisa version rather than an older
|
|
62
|
+
copy. Present-but-stale is a finding: a guard whose fix never landed enforces the old behavior.
|
|
63
|
+
5. **Automation readiness** — inspect whether the configured queue source/tracker and scheduling
|
|
64
|
+
prerequisites are observable, but do **not** create, edit, or delete automations during doctor.
|
|
65
|
+
6. **Optional GitHub Project coordination** — when `github.projects.v2` is configured, delegate
|
|
66
|
+
the shared validation read to `github-project-v2` instead of reimplementing ad-hoc GraphQL
|
|
67
|
+
checks. Honor the `required=false` vs `required=true` semantics documented by
|
|
68
|
+
`config-resolution`: best-effort failures are `WARN`, required-mode failures are `FAIL`.
|
|
69
|
+
7. **Optional wiki delegation** — when a repo-local `wiki/` exists, either summarize the
|
|
70
|
+
specialized `lisa-wiki-doctor` verdict or explicitly report that deeper wiki checks are
|
|
71
|
+
available there. The base doctor stays narrower than full wiki migration enforcement.
|
|
72
|
+
8. **Optional Kane browser provider** — when `verification.browser.kane.enabled` is true, run the
|
|
73
|
+
Lisa-owned readiness probe. Require explicit cloud-upload approval, the contract-tested exact
|
|
74
|
+
version, a non-production environment allow-list, local Chrome/Chromium, Test Manager
|
|
75
|
+
project/folder targeting, `whoami` authentication, and nonzero/observable credit readiness.
|
|
76
|
+
Report missing executable/browser, auth failure, wrong target, zero credits, and control-plane
|
|
77
|
+
failure separately. If Kane is not enabled, report an informational `OK`/not enabled rather than
|
|
78
|
+
probing or installing it.
|
|
79
|
+
|
|
80
|
+
If a check family is not applicable to the current repo, report `SKIP` with the reason.
|
|
81
|
+
|
|
82
|
+
### Minimum config-readiness checks
|
|
83
|
+
|
|
84
|
+
The Lisa config group is not just "does a file exist?" Doctor must audit the config contract in
|
|
85
|
+
this order:
|
|
86
|
+
|
|
87
|
+
1. **Presence + parseability**
|
|
88
|
+
- `FAIL` when `.lisa.config.json` is missing, empty, or invalid JSON.
|
|
89
|
+
- Read `.lisa.config.local.json` only when present; if present but invalid JSON, `FAIL`.
|
|
90
|
+
2. **Merged effective config**
|
|
91
|
+
- Resolve every key with the same per-key local-overrides-global semantics documented by
|
|
92
|
+
`config-resolution`. Doctor must describe findings against the effective merged value, not by
|
|
93
|
+
pretending one file fully replaces the other.
|
|
94
|
+
3. **Required top-level dispatch keys**
|
|
95
|
+
- `FAIL` when merged `tracker` is missing or is not one of `jira`, `github`, or `linear`.
|
|
96
|
+
- `FAIL` when merged `source` is present but is not one of `notion`, `confluence`, `linear`,
|
|
97
|
+
`github`, or `jira`.
|
|
98
|
+
4. **Vendor required-key audit**
|
|
99
|
+
- `FAIL` when the configured tracker/source points at a vendor whose required keys are absent
|
|
100
|
+
after merge. Examples: `tracker=github` requires `github.org` + `github.repo`;
|
|
101
|
+
`tracker=jira` requires `atlassian.cloudId` + `jira.project`; `source=notion` requires
|
|
102
|
+
`notion.workspaceId` + `notion.prdDatabaseId`.
|
|
103
|
+
- Reuse the `config-resolution` vendor tables rather than inventing a second required-key list.
|
|
104
|
+
5. **Local-vs-committed locality audit**
|
|
105
|
+
- `WARN` when developer-specific fields appear in committed config. At minimum enforce the
|
|
106
|
+
documented local-only examples: `atlassian.email`, `intake.assignee`, and
|
|
107
|
+
`jira.verified_workflow_hash`.
|
|
108
|
+
- `WARN` when project-wide shared fields exist only in `.lisa.config.local.json` and are absent
|
|
109
|
+
from `.lisa.config.json`, because the current machine may work while the repository remains
|
|
110
|
+
under-configured for teammates and automations. Examples include `tracker`, `source`,
|
|
111
|
+
`github.org`, `github.repo`, `atlassian.cloudId`, `atlassian.site`, `jira.project`,
|
|
112
|
+
`linear.workspace`, `linear.teamKey`, and `deploy.branches`.
|
|
113
|
+
|
|
114
|
+
6. **Deploy env-order audit** (only when `deploy.branches` is present)
|
|
115
|
+
- `PASS` (or skip) when `deploy.branches` defines a single environment — `deploy.order` is
|
|
116
|
+
optional and the back-sync chain is empty.
|
|
117
|
+
- `PASS` (or skip) when `deploy.branches` defines multiple environments that all map to the
|
|
118
|
+
**same** branch (e.g. `dev`/`staging`/`production` all → `main`). The branches resolve to a
|
|
119
|
+
single distinct branch, so there is nothing to back-sync, the chain is the empty no-op, and
|
|
120
|
+
`deploy.order` is not required. Do not WARN.
|
|
121
|
+
- `WARN` when `deploy.branches` resolves to **more than one distinct** branch but `deploy.order`
|
|
122
|
+
is absent. Config-driven back-sync cannot derive a source→target chain without the env
|
|
123
|
+
ranking; the repo must add `deploy.order` (low→high, e.g.
|
|
124
|
+
`["dev","staging","production"]`).
|
|
125
|
+
- `FAIL` when `deploy.order` is present but its env-name set does not exactly match the keys of
|
|
126
|
+
`deploy.branches` (every env in one must appear in the other). A mismatch silently breaks the
|
|
127
|
+
derived chain.
|
|
128
|
+
- Reuse the `deploy.order` / `deploy.branches` contract from `config-resolution` ("Env order
|
|
129
|
+
(sync-down chain)") rather than re-deriving the rules here.
|
|
130
|
+
|
|
131
|
+
Locality findings are advisory unless the merged config is unusable. Missing shared keys after the
|
|
132
|
+
merge are `FAIL`; shared keys that exist only locally are `WARN`.
|
|
133
|
+
|
|
134
|
+
### Minimum tracker/source preflight checks
|
|
135
|
+
|
|
136
|
+
After config readiness passes far enough to resolve the merged `tracker` and optional `source`,
|
|
137
|
+
doctor must perform read-only preflight checks for the configured vendors only. It does not probe
|
|
138
|
+
every vendor Lisa supports.
|
|
139
|
+
|
|
140
|
+
1. **Scope the audit to configured vendors**
|
|
141
|
+
- Audit the merged `tracker`.
|
|
142
|
+
- Audit the merged `source` only when present and distinct from the tracker.
|
|
143
|
+
- Report every non-configured vendor as `SKIP` rather than pretending it was checked.
|
|
144
|
+
2. **Prove a readable substrate exists**
|
|
145
|
+
- `tracker=github` or `source=github`: require `gh` CLI availability, a passing `gh auth status`,
|
|
146
|
+
and a read probe against the configured repo such as `gh repo view <org>/<repo>`.
|
|
147
|
+
- `tracker=jira`, `source=jira`, or `source=confluence`: follow the `atlassian-access`
|
|
148
|
+
substrate ladder and prove at least one read-capable path can see the configured
|
|
149
|
+
`atlassian.cloudId` and vendor scope. Acceptable substrates are `acli`, Atlassian MCP, or the
|
|
150
|
+
validated API-token/curl path documented by `config-resolution`.
|
|
151
|
+
- `tracker=linear` or `source=linear`: require either readable Linear MCP access or a valid
|
|
152
|
+
personal API-key probe against the configured workspace. When Linear is the tracker, doctor
|
|
153
|
+
must also prove the configured `linear.teamKey` is visible.
|
|
154
|
+
- `source=notion`: require either a Notion MCP identity match for `notion.workspaceId` or a
|
|
155
|
+
valid internal-integration token probe, plus read visibility to `notion.prdDatabaseId`.
|
|
156
|
+
3. **Separate missing tooling from missing auth or scope**
|
|
157
|
+
- Missing executable / MCP substrate availability is a distinct observed fact, not the same as
|
|
158
|
+
"auth failed."
|
|
159
|
+
- When a probe runs and fails, preserve the exact read-only failure text or HTTP/GraphQL status
|
|
160
|
+
in the observed output so the operator can distinguish wrong workspace/site/repo from missing
|
|
161
|
+
credentials.
|
|
162
|
+
4. **Severity ladder**
|
|
163
|
+
- `PASS` when at least one supported read-only substrate proves the configured vendor is
|
|
164
|
+
reachable with the required scope.
|
|
165
|
+
- `WARN` when the configured vendor is reachable, but an additional optional substrate is
|
|
166
|
+
unavailable and later Lisa flows would need to fall back.
|
|
167
|
+
- `FAIL` when no supported substrate can prove read access for the configured tracker/source, or
|
|
168
|
+
when the configured vendor target is unreadable from the current runtime.
|
|
169
|
+
|
|
170
|
+
### Minimum GitHub Project coordination checks
|
|
171
|
+
|
|
172
|
+
When `github.projects.v2` is configured, doctor must run one additional read-only coordination
|
|
173
|
+
check instead of treating the config block as implicitly ready.
|
|
174
|
+
|
|
175
|
+
1. **Delegate through the shared chokepoint**
|
|
176
|
+
- Call `lisa-github-project-v2` in read-only resolution mode:
|
|
177
|
+
|
|
178
|
+
```text
|
|
179
|
+
operation: resolve-project
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
- Do not inline ad-hoc Project GraphQL in doctor. Setup, doctor, writers, and linked-PR flows
|
|
183
|
+
must all read the same owner/access contract from the shared utility.
|
|
184
|
+
2. **Preserve exact namespace + access failures**
|
|
185
|
+
- Enforce the v1 namespace rule exactly as documented by the shared utility. If
|
|
186
|
+
`github.projects.v2.owner.slug` does not match `github.org`, report:
|
|
187
|
+
|
|
188
|
+
```yaml
|
|
189
|
+
code: project_namespace_mismatch
|
|
190
|
+
message: "github.projects.v2.owner.slug must match github.org in v1"
|
|
191
|
+
remediation: "Use a Project owned by <github.org> or remove github.projects.v2."
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
- For owner-access or GraphQL failures, preserve the exact GitHub / GraphQL failure text in the
|
|
195
|
+
observed output. Examples include missing Project, `Resource not accessible by integration`,
|
|
196
|
+
unsupported owner kind, or a wrong owner/number pair.
|
|
197
|
+
3. **Report exact remediation paths**
|
|
198
|
+
- Doctor must make the next operator action explicit. At minimum, say whether they need to:
|
|
199
|
+
1. choose a Project owned by the tracked repo namespace,
|
|
200
|
+
2. grant the token Project read/write access,
|
|
201
|
+
3. correct the configured Project number/owner, or
|
|
202
|
+
4. remove `github.projects.v2` when coordination is not required.
|
|
203
|
+
4. **Map shared utility outcomes into doctor severity**
|
|
204
|
+
- `required: false` => doctor `WARN`. Repository-local GitHub issue/PR flows remain usable while
|
|
205
|
+
Project coordination is degraded.
|
|
206
|
+
- `required: true` => doctor `FAIL`. The same Project validation failure blocks Lisa readiness
|
|
207
|
+
because coordination was configured as required.
|
|
208
|
+
|
|
209
|
+
Good output examples:
|
|
210
|
+
|
|
211
|
+
```text
|
|
212
|
+
WARN github.projects.v2: Resource not accessible by integration
|
|
213
|
+
Observed: exact GitHub / GraphQL failure text preserved from resolve-project.
|
|
214
|
+
Remediation: grant the token Project read/write access or remove github.projects.v2.required.
|
|
215
|
+
Repository-local GitHub issue/PR flows remain usable; Project coordination is disabled.
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
```text
|
|
219
|
+
FAIL github.projects.v2: github.projects.v2.owner.slug must match github.org in v1
|
|
220
|
+
Remediation: use a Project owned by CodySwannGT or remove github.projects.v2.
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Minimum automation-readiness checks
|
|
224
|
+
|
|
225
|
+
Doctor's automation-readiness group stays read-only: it audits whether this repo and runtime could
|
|
226
|
+
support `/lisa:setup-automations` and the resulting recurring jobs, but it does **not** create,
|
|
227
|
+
edit, delete, or reconcile automations on the default doctor path.
|
|
228
|
+
|
|
229
|
+
1. **Resolve the queue inputs exactly as setup-automations would**
|
|
230
|
+
- Resolve the PRD queue from merged `source`.
|
|
231
|
+
- Resolve the build queue from merged `tracker`.
|
|
232
|
+
- Resolve the repair queue from the same queue-detection rules as `lisa-repair-intake`
|
|
233
|
+
(identical source-dispatch contract to `lisa-intake`).
|
|
234
|
+
- If any automation would require guessing because `source`, `tracker`, or their vendor keys are
|
|
235
|
+
still unresolved after the config-readiness audit, report that automation as `FAIL` rather
|
|
236
|
+
than pretending scheduling can proceed safely.
|
|
237
|
+
2. **Audit the current runtime's native scheduler surface without mutating it**
|
|
238
|
+
- Codex: doctor should report whether the runtime exposes the native automations surface
|
|
239
|
+
(`automation_update`) needed by `/lisa:setup-automations`.
|
|
240
|
+
- Claude: doctor should report whether the runtime exposes `/schedule`.
|
|
241
|
+
- Other runtimes: doctor should explicitly say that no native Lisa scheduler is known for the
|
|
242
|
+
current runtime.
|
|
243
|
+
- This is observability only. Never create a placeholder automation just to prove the scheduler
|
|
244
|
+
works.
|
|
245
|
+
3. **Check exploratory-automation support by shipped stack surface**
|
|
246
|
+
- `exploratory-bugs` is supported only when the project ships an `exploratory-qa` command
|
|
247
|
+
surface (the `expo`, `rails`, or `harper-fabric` stacks today). Reuse the same stack/support
|
|
248
|
+
rule documented by `setup-automations`; do not invent exploratory jobs for stacks that do not
|
|
249
|
+
ship that command.
|
|
250
|
+
- When the repo does not ship `exploratory-qa`, report `exploratory-bugs` as `SKIP` with the
|
|
251
|
+
reason.
|
|
252
|
+
- `exploratory-prds` remains applicable when the repo can run `/lisa:project-ideation`; if its
|
|
253
|
+
queue/config prerequisites are unresolved, report the exact blocking config fact.
|
|
254
|
+
4. **Severity ladder**
|
|
255
|
+
- `PASS` when an automation's queue inputs are resolvable and the runtime exposes the required
|
|
256
|
+
native scheduler surface for that automation.
|
|
257
|
+
- `WARN` when Lisa remains usable manually, but the current runtime has no native scheduler
|
|
258
|
+
surface for unattended runs, so automation setup would be unavailable from here.
|
|
259
|
+
- `SKIP` when an optional automation is intentionally unsupported for this repo surface (for
|
|
260
|
+
example, `exploratory-bugs` on a stack with no `exploratory-qa` command).
|
|
261
|
+
- `FAIL` when the repo's config cannot resolve the queue that an automation needs, because that
|
|
262
|
+
would make unattended runs ambiguous or broken before scheduling even starts.
|
|
263
|
+
|
|
264
|
+
### Minimum wiki-delegation checks
|
|
265
|
+
|
|
266
|
+
When a repo-local `wiki/` directory exists, doctor must surface the specialized wiki-readiness path
|
|
267
|
+
without turning the base doctor into a second `lisa-wiki-doctor`.
|
|
268
|
+
|
|
269
|
+
1. **Detect whether wiki delegation applies**
|
|
270
|
+
- If no repo-local `wiki/` directory exists, report the entire wiki group as `SKIP` with the
|
|
271
|
+
reason that no wiki surface is present in this repository.
|
|
272
|
+
- If `wiki/` exists, keep the group present in the final report; do not silently omit it.
|
|
273
|
+
2. **Prefer summary of an existing specialized verdict**
|
|
274
|
+
- If the repo already has a readable `wiki/state/migration/doctor-report.json`, doctor may
|
|
275
|
+
summarize the specialized verdict (`READY`, `READY_WITH_WARNINGS`, or `NOT_READY`) plus the
|
|
276
|
+
most relevant blocking/warning facts, clearly attributing them to `lisa-wiki-doctor`.
|
|
277
|
+
- Preserve the base doctor's narrower scope: summarize or quote the specialized verdict, but do
|
|
278
|
+
not inline the full migration/readiness checklist into the base doctor output.
|
|
279
|
+
3. **Otherwise advertise the deeper follow-up explicitly**
|
|
280
|
+
- If `wiki/` exists but no specialized report is available yet, doctor must still tell the
|
|
281
|
+
operator that deeper wiki checks live behind `lisa-wiki-doctor`.
|
|
282
|
+
- The report should make the next action explicit, for example:
|
|
283
|
+
|
|
284
|
+
```text
|
|
285
|
+
WARN wiki-follow-up: wiki/ detected; deeper wiki migration checks not yet summarized
|
|
286
|
+
Observed: wiki/ exists, but no wiki/state/migration/doctor-report.json was found.
|
|
287
|
+
Remediation: run lisa-wiki-doctor to produce the wiki-specific readiness verdict.
|
|
288
|
+
```
|
|
289
|
+
4. **Severity ladder**
|
|
290
|
+
- `SKIP` when `wiki/` is absent.
|
|
291
|
+
- `PASS` when `wiki/` exists and doctor successfully summarizes an existing
|
|
292
|
+
`lisa-wiki-doctor` verdict.
|
|
293
|
+
- `WARN` when `wiki/` exists and doctor can only advertise the specialized follow-up because no
|
|
294
|
+
persisted wiki verdict is available yet.
|
|
295
|
+
- `FAIL` only when `wiki/` exists but the repo cannot surface the specialized follow-up at all
|
|
296
|
+
(for example, the required `lisa-wiki-doctor` distribution surface is missing or the existing
|
|
297
|
+
report is unreadable/malformed enough that doctor cannot safely summarize it).
|
|
298
|
+
5. **Keep wiki readiness optional for non-wiki repos**
|
|
299
|
+
- Never require a wiki plugin surface when `wiki/` is absent.
|
|
300
|
+
- Never let wiki-specific checks downgrade unrelated non-wiki repositories.
|
|
301
|
+
|
|
302
|
+
### Minimum repository-readiness checks
|
|
303
|
+
|
|
304
|
+
The eight groups above answer one question: **is Lisa installed correctly here?** There is a second,
|
|
305
|
+
orthogonal question — **may an agent fleet operate here unattended?** — and conflating them is how a
|
|
306
|
+
brownfield onboarding ends in "we built a wiki, looks good" instead of a verdict someone can act on.
|
|
307
|
+
`Repository readiness` is that second question, and it is opt-in behind the `--readiness` flag; the
|
|
308
|
+
default doctor path never renders it and stays byte-identical.
|
|
309
|
+
|
|
310
|
+
1. **Render one separately-titled group.** When readiness mode is requested, append a single
|
|
311
|
+
`Repository readiness` group (id `repository-readiness`) in a fixed position after the eight
|
|
312
|
+
installation groups, using the shared `createRepositoryReadinessDoctorGroup` helper from
|
|
313
|
+
`scripts/doctor-report.mjs`. It is distinct from the installation groups so a reader is never left
|
|
314
|
+
guessing which question a verdict answered.
|
|
315
|
+
2. **Score exactly the eight ownership dimensions from `readiness-rubric`.** Report **eight** checks,
|
|
316
|
+
in fixed order, **never fewer** and never silently omit one: `context-routing`,
|
|
317
|
+
`capabilities-tools`, `domain-ownership`, `execution-proof`, `feedback-guardrails`,
|
|
318
|
+
`dependencies-supply-chain`, `delivery-authority`, `proportionality`. Cite the `readiness-rubric`
|
|
319
|
+
slug for the dimension definitions, the seven ship blockers, and the consequence-ordering
|
|
320
|
+
contract; do not restate or fork that vocabulary here.
|
|
321
|
+
3. **`SKIP` carries a reason and is never blank.** A dimension with no applicable evidence renders
|
|
322
|
+
`SKIP` with a stated reason ("no deployment target configured, so delivery/authority was not
|
|
323
|
+
assessed"). An unassessed dimension is a known unknown, and the report says so.
|
|
324
|
+
|
|
325
|
+
**This surface reflects the CLI; it does not re-score.** The evidence producers and the blocker
|
|
326
|
+
engine live in the Lisa CLI, which is the single source of truth. When `.lisa/readiness.json` is
|
|
327
|
+
present and readable (parses, matching `schema_version`, carries a `dimensions` array), this group
|
|
328
|
+
**projects** each recorded dimension's status and its operator-facing evidence/reason text, so an
|
|
329
|
+
operator running `/lisa:doctor` through any coding agent sees the same readiness answer the CLI
|
|
330
|
+
gives. When the report is absent, unparseable, or stamped with an unknown `schema_version` — or
|
|
331
|
+
records nothing for a given dimension — that dimension falls back to `SKIP` with the reason it was
|
|
332
|
+
not assessed. Absence means the readiness pass has not run, never that the repository is clean: a
|
|
333
|
+
pass or a fail is never manufactured from a missing report. Run
|
|
334
|
+
`lisa doctor --offline --readiness` to produce the report first.
|
|
335
|
+
|
|
336
|
+
**A standing blocker outranks the recorded status.** Some CLI producers record `WARN` while
|
|
337
|
+
standing a ship blocker — the blocker engine never reads the per-dimension status, so the finding
|
|
338
|
+
flips the repository to `NOT_READY` exactly as a `FAIL` would. A dimension that owns an entry in
|
|
339
|
+
the report's `blockers[]` therefore projects as `FAIL` regardless of its recorded label, and its
|
|
340
|
+
remediation names the blocker ids and repeats the report's `narrowed_claim` (the "IS ready for
|
|
341
|
+
supervised, single-ticket agent work" fallback `readiness-rubric` requires whenever a blocker
|
|
342
|
+
stands). Projected checks also carry the report's `generated_at`/`lisa_version` so a stale report
|
|
343
|
+
cannot read as current truth, and unassessed dimensions carry the CLI's not-established caveat.
|
|
344
|
+
4. **Reuse the shipped verdict ladder and consequence ordering.** No new verdict value and no new
|
|
345
|
+
severity: reuse `READY` / `READY_WITH_WARNINGS` / `NOT_READY`. `READY` requires *positive*
|
|
346
|
+
evidence — every readiness dimension assessed and clean, with no blocker standing. An unassessed
|
|
347
|
+
(`SKIP`) dimension is silence, not health, so any readiness report carrying one tops out at
|
|
348
|
+
`READY_WITH_WARNINGS`; only a standing ship blocker yields `NOT_READY`. Section order stays
|
|
349
|
+
stable; the findings **within** each dimension check order highest-consequence-first.
|
|
350
|
+
5. **Persist to a versioned, relocatable artifact.** Writing the report to `.lisa/readiness.json`
|
|
351
|
+
(`schema_version: 1`, with `verdict`, `blocker_count`, and per-dimension findings) is resolved
|
|
352
|
+
through a single resolver so the location is one line to change. The write is atomic and must
|
|
353
|
+
never fail the run: a write error degrades to a `WARN` check rather than throwing.
|
|
354
|
+
6. **Warn-only, always.** This gates a claim, not a process: readiness never hard-blocks and never
|
|
355
|
+
changes doctor's exit-code semantics (exit 1 iff some check is `FAIL`). Where a surface named here
|
|
356
|
+
is not installed, degrade — state what was assessed, state what was not, and continue.
|
|
357
|
+
|
|
358
|
+
### Upstream Lisa change-history diagnosis
|
|
359
|
+
|
|
360
|
+
A failing or warning check has two possible causes: the project drifted, or **Lisa itself changed
|
|
361
|
+
upstream** since this project last updated. Doctor must distinguish them instead of blaming the
|
|
362
|
+
project by default. Whenever findings need explanation — and always before proposing repairs —
|
|
363
|
+
attribute the finding with real evidence.
|
|
364
|
+
|
|
365
|
+
The attribution procedure itself is shared: it lives in the `lisa-attribute-failure` skill
|
|
366
|
+
(extracted from this section so any failure event can be attributed, not only doctor findings).
|
|
367
|
+
Doctor invokes it per finding:
|
|
368
|
+
|
|
369
|
+
1. **Resolve the version window.** Determine the project's installed Lisa version (the
|
|
370
|
+
`@codyswann/lisa` entry in `package.json`/lockfile, or the plugin version stamp on the active
|
|
371
|
+
runtime) and the latest published version (`npm view @codyswann/lisa version`, or the update
|
|
372
|
+
check's cached result).
|
|
373
|
+
2. **Invoke `lisa-attribute-failure`** with the finding as the failure event: the defect
|
|
374
|
+
description, the implicated template/config paths, the rule/skill/hook in play, and the
|
|
375
|
+
resolved version window. The skill evaluates its three ordered signals — Lisa-managed surface
|
|
376
|
+
ownership, shipped rule/skill/hook behavior, and the upstream change-history window (the
|
|
377
|
+
version-window compare procedure formerly documented inline here, preserved verbatim in that
|
|
378
|
+
skill: pagination/`--slurp` handling, targeted per-SHA diff context, truncation caveats, and
|
|
379
|
+
the bounded explicit-tag fetch fallback) — and returns `lisa` | `project` | `ambiguous` plus
|
|
380
|
+
the cited evidence.
|
|
381
|
+
3. **Map the verdict into the finding.**
|
|
382
|
+
- `lisa` — Lisa changed the contract (a tightened lint rule, a renamed check context, a new
|
|
383
|
+
required config key) or shipped the defective surface. Say so in `Observed:` with the cited
|
|
384
|
+
evidence (commit subject/version or managed-surface proof), and let `Remediation:` point at
|
|
385
|
+
the sanctioned adoption path (e.g. `lisa update` + re-apply, a documented config opt-out)
|
|
386
|
+
rather than hand-editing managed files.
|
|
387
|
+
- `project` — history shows no relevant upstream change and the surface is project-owned: the
|
|
388
|
+
project drifted, so remediate on the project side.
|
|
389
|
+
- `ambiguous` — history was unavailable, truncated, or otherwise inconclusive: report the gap
|
|
390
|
+
as a `WARN`-level observability note with the evidence gap named — never fail the audit
|
|
391
|
+
because history was unavailable or incomplete, and never attribute drift with unverified
|
|
392
|
+
confidence.
|
|
393
|
+
|
|
394
|
+
This diagnosis remains part of doctor's read-only contract: the attribution skill reads Lisa's
|
|
395
|
+
repository, never writes to it, and repair suggestions stay suggestions.
|
|
396
|
+
|
|
397
|
+
## Output contract
|
|
398
|
+
|
|
399
|
+
The final report must:
|
|
400
|
+
|
|
401
|
+
- Separate observed facts from remediation advice.
|
|
402
|
+
- Print every check with one of `PASS`, `WARN`, `FAIL`, or `SKIP`.
|
|
403
|
+
- Emit exactly one overall verdict: `READY`, `READY_WITH_WARNINGS`, or `NOT_READY`.
|
|
404
|
+
- Stay read-only by default.
|
|
405
|
+
|
|
406
|
+
Render the report in grouped sections using the shared `scripts/doctor-report.mjs` contract:
|
|
407
|
+
|
|
408
|
+
- Start with `Overall verdict: <VERDICT>` and one `Counts:` line covering `PASS`, `WARN`, `FAIL`,
|
|
409
|
+
and `SKIP`.
|
|
410
|
+
- Then print each group as `<group-id>. <group-title>`.
|
|
411
|
+
- Under each group, print one line per check as `- <STATUS> <check-id>: <summary>`.
|
|
412
|
+
- When available, print `Observed:` and `Remediation:` lines beneath the check so the report keeps
|
|
413
|
+
facts separate from advice.
|
|
414
|
+
- If a group has no applicable checks yet, render it as a grouped `SKIP` with the reason instead of
|
|
415
|
+
silently omitting the section.
|
|
416
|
+
|
|
417
|
+
The verdict ladder is:
|
|
418
|
+
|
|
419
|
+
- `READY` — no `FAIL` and no `WARN`.
|
|
420
|
+
- `READY_WITH_WARNINGS` — no `FAIL`, but one or more `WARN`.
|
|
421
|
+
- `NOT_READY` — one or more `FAIL`.
|
|
422
|
+
|
|
423
|
+
## Gate configuration
|
|
424
|
+
|
|
425
|
+
```sh
|
|
426
|
+
node scripts/lisa-gates.mjs validate # shape + unknown gate ids
|
|
427
|
+
node scripts/lisa-gates.mjs list --moment=pull-request
|
|
428
|
+
node scripts/lisa-gates.mjs contexts # branch-protection contexts
|
|
429
|
+
node scripts/lisa-gates.mjs skip-jobs # what replaces each skip_jobs token
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
A gate is a **property** — *credential leakage* — not a tool. `gitleaks` is one way to prove
|
|
433
|
+
that property, and which way is the project's choice: each gate names a task in the project's own
|
|
434
|
+
runner, so swapping the tool changes one line of project config and nothing in Lisa.
|
|
435
|
+
|
|
436
|
+
`validate` refuses an unknown gate id rather than ignoring it. A misspelled `credential-leakge`
|
|
437
|
+
would otherwise read as an enabled guarantee and run nothing at all — the same silent-hole shape
|
|
438
|
+
as a skipped required check. Gates a project invents carry an `x-` prefix, which Lisa runs without
|
|
439
|
+
pretending to understand.
|
|
440
|
+
|
|
441
|
+
`skip-jobs` answers the migration off the `skip_jobs` workflow input. Eleven of the token → gate
|
|
442
|
+
pairs cannot be recovered by transforming the name — `lint` is `code-style`, `sg_scan` is
|
|
443
|
+
`structural-rules`, `work_item_traceability` is `traceability` — and being wrong does not break a
|
|
444
|
+
build: it declares the WRONG gate `off`, so a check silently stops running while the configuration
|
|
445
|
+
reads deliberate. Pass `--moment=` to match the moment the caller passes to `quality.yml`, because a
|
|
446
|
+
gate's legal moments are a closed set and a declaration outside it is refused by `validate` — after
|
|
447
|
+
the token has already been deleted.
|
|
448
|
+
|
|
449
|
+
Four of its six answers are refusals, and they are the point. `unmappable` means the job was never
|
|
450
|
+
converted to a gate façade, so keep the token. `partial` means one job behind the token has a gate
|
|
451
|
+
and the others do not, so the declaration alone would leave work running. `inert` means no job
|
|
452
|
+
honours that token at all. `unknown` means nothing matches it — usually a space after a comma, which
|
|
453
|
+
GitHub matches against nothing, so that job has been RUNNING all along. None of them produce a gate
|
|
454
|
+
id, because a confident wrong answer here is worse than no answer.
|
|
455
|
+
|
|
456
|
+
`lisa doctor` reports the same thing per caller workflow and does NOT edit the workflow. `lisa apply`
|
|
457
|
+
runs on postinstall, and an automated rewrite of a caller that gets it wrong is silent; an agent
|
|
458
|
+
performing the edit can read the surrounding code and confirm afterwards that the same checks ran.
|
|
459
|
+
|
|
460
|
+
`contexts` is the value that replaces a hand-transcribed branch-protection list. It is scoped to
|
|
461
|
+
one environment: a gate required before a production deploy is **not** thereby a merge blocker on a
|
|
462
|
+
pull request, and collapsing the two would promote every deploy-time gate into branch protection.
|
|
463
|
+
|
|
464
|
+
When reconciling a ruleset against it, pass `--previous=` with any label retired in the last
|
|
465
|
+
release. Downstream repositories call the shared workflow unpinned, so a renamed job reaches every
|
|
466
|
+
repository before any of them has reconciled — and a required context that never reports leaves
|
|
467
|
+
pull requests waiting indefinitely. The fastest way out of that is deleting the requirement, which
|
|
468
|
+
is how a rename ends up removing a guarantee. Emitting both labels for one release avoids it.
|
|
469
|
+
|
|
470
|
+
### Reconciling against the live ruleset
|
|
471
|
+
|
|
472
|
+
`contexts` says what the repository *should* require. Reconciliation asks whether GitHub agrees.
|
|
473
|
+
|
|
474
|
+
**The comparison also runs without anyone typing it.** A control reachable only by a human reading
|
|
475
|
+
a code block is indistinguishable from one that was never written, so the declaration is held
|
|
476
|
+
against both enforcing surfaces on paths a machine already takes:
|
|
477
|
+
|
|
478
|
+
| surface | who runs it | needs the network |
|
|
479
|
+
| --- | --- | --- |
|
|
480
|
+
| the shipped ruleset template a repository is provisioned from | `lisa doctor` (one operator-readable line) and `lisa doctor --json` → `declarationDrift.templates` | no |
|
|
481
|
+
| the live branch-protection ruleset | `lisa doctor --json` → `declarationDrift.live`, and the `github.declared-checks` check in `lisa health` | yes |
|
|
482
|
+
|
|
483
|
+
Both report one verdict per required context, and the vocabulary is seven values rather than
|
|
484
|
+
matched/unmatched, because the mismatches and an unreadable surface need different actions:
|
|
485
|
+
|
|
486
|
+
- `matched` — declared `required`, and the surface requires it.
|
|
487
|
+
- `declared-not-enforced` — the settings file says it must pass and nothing requires it. The
|
|
488
|
+
declaration blocks nothing.
|
|
489
|
+
- `enforced-declared-off` — the settings file says the property is deliberately not proved here,
|
|
490
|
+
and protection requires it anyway. A contradiction, not a gap.
|
|
491
|
+
- `enforced-undeclared` — protection requires it, a registry gate produces it, and no declaration
|
|
492
|
+
governs it. **Silence is not permission to stop requiring it**; the remedy is to declare the gate.
|
|
493
|
+
- `enforced-declared-optional` — protection requires it while the declaration says optional. Name
|
|
494
|
+
which surface wins.
|
|
495
|
+
- `enforced-not-lisa-owned` — protection requires it and no registry gate produces it. Third-party
|
|
496
|
+
checks are required by construction and declared by nobody; this bucket exists so they can be told
|
|
497
|
+
apart from a Lisa gate that fell out of the settings file, never so they can be removed.
|
|
498
|
+
- `unproven` — the surface could not be read, so no enforcement comparison was made. It is never a
|
|
499
|
+
match and never drift; the operator fixes access/availability and reruns the observation.
|
|
500
|
+
|
|
501
|
+
`enforced-declared-off` and `declared-not-enforced` fail the health check; the two gaps warn. No
|
|
502
|
+
remedy in that vocabulary removes a required context — the type has no such member, so the
|
|
503
|
+
guarantee holds for every caller rather than for the careful ones. A surface this run could not
|
|
504
|
+
read is reported as unproven and is never a match.
|
|
505
|
+
|
|
506
|
+
Reconciliation is **wired**, not something an agent has to remember to run: it is step 5 of
|
|
507
|
+
`scripts/lisa-github-repo-setup.sh`, alongside the settings baseline and the rulesets themselves,
|
|
508
|
+
and it is exposed as `npm run policy:reconcile`. Until #2917 its only callers were the code blocks
|
|
509
|
+
below — prose in this very file — so the declared configuration converged when somebody happened to
|
|
510
|
+
read a document. Run it by hand for the flags:
|
|
511
|
+
|
|
512
|
+
```sh
|
|
513
|
+
node scripts/lisa-reconcile-policy.mjs --dry-run # read-only: what would change
|
|
514
|
+
node scripts/lisa-reconcile-policy.mjs --on-drift=report # report, write nothing
|
|
515
|
+
node scripts/lisa-reconcile-policy.mjs --on-drift=block # exit 1 on any drift, for CI
|
|
516
|
+
node scripts/lisa-reconcile-policy.mjs # honors policy.on_drift
|
|
517
|
+
node scripts/lisa-reconcile-policy.mjs --previous="🧽 Lint" # keep a renamed context required
|
|
518
|
+
node scripts/lisa-reconcile-policy.mjs --prune # also remove EXTRA contexts
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
It reads the live ruleset and repository settings through `gh`, compares them against the derived
|
|
522
|
+
contexts and the `policy` block, and reports three sets: **MISSING** (declared, not live), **EXTRA**
|
|
523
|
+
(live, not declared), **MATCHED**. `--dry-run` never writes, whatever `policy.on_drift` says.
|
|
524
|
+
|
|
525
|
+
Three behaviors need an operator to understand them before reading a report.
|
|
526
|
+
|
|
527
|
+
**1. `UNPROVEN` is not a pass.** If `gh` is missing, unauthenticated, or the API errors — a private
|
|
528
|
+
repository on a plan without rulesets answers `403` — the verdict is `UNPROVEN` and the exit code is
|
|
529
|
+
`2`. It is neither of its neighbours, and the distinction is the same one the secrets preflight
|
|
530
|
+
draws with `unreachable`: reported as clean it is a vacuous green, clean precisely because nothing
|
|
531
|
+
was learned; reported as drift it sends someone to fix a ruleset that may be perfectly correct. The
|
|
532
|
+
drift sets come back `null` rather than empty, because empty is what a clean repository looks like.
|
|
533
|
+
`on_drift` does not soften this — not even `report` — because `on_drift` decides what to do about a
|
|
534
|
+
drift that was *measured*, and here nothing was. Map it to doctor's `WARN`/`FAIL` on the same rule
|
|
535
|
+
as any other unavailable check surface: never `PASS`.
|
|
536
|
+
|
|
537
|
+
**2. An `EXTRA` context is reported, never removed.** Lisa does not own the whole required list.
|
|
538
|
+
Under `repair` the script ADDS what is missing and leaves what is extra alone, naming each one.
|
|
539
|
+
Removing them requires `--prune`, and the right way to clear the list is one at a time: each EXTRA
|
|
540
|
+
context is either an app to keep, or a check that belongs in `.lisa.config.json` — decide which
|
|
541
|
+
before pruning anything.
|
|
542
|
+
|
|
543
|
+
A context posted by an external app no longer HAS to be EXTRA. `SonarCloud Code Analysis`,
|
|
544
|
+
`GitGuardian Security Checks`, and `CodeRabbit` are declarable two ways, and either one makes the
|
|
545
|
+
reconciler treat them as MATCHED rather than as a permanent false alarm:
|
|
546
|
+
|
|
547
|
+
```json
|
|
548
|
+
"gates": {
|
|
549
|
+
"credential-leakage": {
|
|
550
|
+
"pull-request": {
|
|
551
|
+
"level": "required",
|
|
552
|
+
"await": "GitGuardian Security Checks",
|
|
553
|
+
"posted_by": 46505
|
|
554
|
+
}
|
|
555
|
+
}
|
|
556
|
+
},
|
|
557
|
+
"github": {
|
|
558
|
+
"rulesets": {
|
|
559
|
+
"requiredChecks": {
|
|
560
|
+
"quality checks": [{ "context": "🧩 Plugin artifacts match source" }]
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
```
|
|
565
|
+
|
|
566
|
+
An `await` names the gate the signal PROVES, so declaring nothing requires nothing — which is how a
|
|
567
|
+
project that proves credential leakage with a different scanner says so. `posted_by` is the GitHub
|
|
568
|
+
App id allowed to post that context; omit it and the context is required unpinned, GitHub's "any
|
|
569
|
+
source". `requiredChecks` is for a repository-specific check that no gate models; it replaces the
|
|
570
|
+
additive-only `addRequiredChecks`, which is still read but can never express "stop requiring this".
|
|
571
|
+
Both surfaces name the ruleset a repair writes to, so `--ruleset` is needed only for a
|
|
572
|
+
gate-DERIVED context on a repository whose rulesets are ambiguous.
|
|
573
|
+
|
|
574
|
+
**2b. A gate proved OUTSIDE the quality facade names its own check-run chain.** A run-mode gate's
|
|
575
|
+
required context is derived by prefixing the gate's label with the chain of jobs that reach the
|
|
576
|
+
facade. When a project proves one property from a workflow of its own instead, that chain describes
|
|
577
|
+
a route that never reaches the prover, and the derived name is one nothing posts — which does not
|
|
578
|
+
turn a pull request red, it holds it at "Expected — Waiting for status to be reported" for ever.
|
|
579
|
+
Declare the real chain on that moment:
|
|
580
|
+
|
|
581
|
+
```json
|
|
582
|
+
"gates": {
|
|
583
|
+
"e2e-browser": {
|
|
584
|
+
"run": "test:e2e:pr",
|
|
585
|
+
"pull-request": {
|
|
586
|
+
"level": "required",
|
|
587
|
+
"caller_chain": ["🎭 PR Browser Coverage"]
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
```
|
|
592
|
+
|
|
593
|
+
Read the chain off a completed run, never off the YAML: a check run's reported name is the
|
|
594
|
+
`/`-joined chain of the JOB names that reach it, outermost first, and the top workflow's own `name:`
|
|
595
|
+
never appears in it. Take it from
|
|
596
|
+
`gh api repos/OWNER/NAME/commits/SHA/check-runs --paginate --slurp`, or let
|
|
597
|
+
`lisa-gates.mjs verify-contexts --posted=<file>` compare a derivation against what actually posted.
|
|
598
|
+
Either spelling works — `["A", "B"]` or `"A / B"` — and the override replaces the caller's chain for
|
|
599
|
+
that gate only; every other gate keeps deriving exactly what it derived before. It is declared per
|
|
600
|
+
MOMENT, because the same job posts a one-level name on the pull-request path and a two-level one on
|
|
601
|
+
the release path. Declaring it on the whole gate, on an `await`ing moment, at a moment that posts no
|
|
602
|
+
status, or with a blank level is refused by `lisa-gates.mjs validate` — at declaration time, which
|
|
603
|
+
is the last point at which any of those can still fail loudly.
|
|
604
|
+
|
|
605
|
+
**3. Keep both names during a rename.** `--previous=<old label>` requires the old and the new
|
|
606
|
+
context simultaneously for one release. Without it the reconciliation reports the still-live old
|
|
607
|
+
context as EXTRA (and `--prune` would delete it) while in-flight pull requests wait on a context
|
|
608
|
+
that will never report again.
|
|
609
|
+
|
|
610
|
+
Repair writes exactly two things: required contexts on a ruleset, and repository settings. Policy
|
|
611
|
+
carried by the *shape* of a rule — linear history, signed commits, force-push and deletion
|
|
612
|
+
protection, conversation resolution — is compared here and repaired by
|
|
613
|
+
`scripts/lisa-github-rulesets.sh`, which owns rule construction; the reconciler reports those and
|
|
614
|
+
names that script rather than reshaping rules it did not build. When more than one ruleset requires
|
|
615
|
+
status checks it refuses to guess which owns the derived contexts and asks for `--ruleset=<name>`,
|
|
616
|
+
because writing to the wrong one enforces a context under a different ref-name condition.
|
|
617
|
+
|
|
618
|
+
That rule construction is itself config-driven now. `all/github-rulesets/base.json` is deleted; the
|
|
619
|
+
`base` ruleset is generated per project from `policy` — including `policy.ruleset.enforcement`, the
|
|
620
|
+
`policy.ruleset.include_refs` / `exclude_refs` conditions, `policy.ruleset.bypass_actors`, and
|
|
621
|
+
`policy.review.required_approving_review_count`, none of which config could express while the
|
|
622
|
+
template owned them.
|
|
623
|
+
|
|
624
|
+
`policy.review.require_extra_approval_for_unattributed_changes` is declarable for a reason worth
|
|
625
|
+
stating, because its default is not "leave it alone". Measured against the live rulesets API on
|
|
626
|
+
2026-08-25: a `pull_request` rule sent WITHOUT the parameter came back with it `true`; set
|
|
627
|
+
explicitly to `false` it came back `false`; sent again without it, it came back `true`. GitHub
|
|
628
|
+
re-applies its own default on every write that omits the field. So an operator who wants it OFF
|
|
629
|
+
cannot hold it off unless the payload names it, and an operator who wants it ON is recording no
|
|
630
|
+
choice at all — the value is whatever GitHub's default happens to be. Declaring it pins the choice
|
|
631
|
+
and makes it visible to the reconciler; declaring nothing keeps the payload byte-for-byte what it
|
|
632
|
+
was, parameter absent.
|
|
633
|
+
|
|
634
|
+
### A ruleset that governs no branch
|
|
635
|
+
|
|
636
|
+
Reconciliation asks whether the required LIST matches. It never asks whether the ruleset carrying
|
|
637
|
+
that list matches any ref the repository actually has, and GitHub does not ask either: a
|
|
638
|
+
`conditions.ref_name.include` entry is a pattern, not a reference, so `refs/heads/dev` is accepted
|
|
639
|
+
and stays live on a repository whose only branch is `main`. Everything that ruleset requires is then
|
|
640
|
+
required nowhere — the gate still runs and posts its context, and no pull request waits on it.
|
|
641
|
+
|
|
642
|
+
Every surface read that as healthy. `compareRulesets` in `lisa health` compares the include list
|
|
643
|
+
against Lisa's template by string equality, and both say `refs/heads/dev`, therefore no drift; the
|
|
644
|
+
repo-map row parses includes but matches the literal `~DEFAULT_BRANCH` and ORs across rows, so one
|
|
645
|
+
governing ruleset makes the whole answer green. Nothing enumerated the repository's branches.
|
|
646
|
+
|
|
647
|
+
The `github.ruleset-reach` check in `lisa health` now does, and so does
|
|
648
|
+
`scripts/lisa-github-rulesets.sh` at the end of every apply, dry run included. Both load one shipped
|
|
649
|
+
detector, `scripts/lisa-ruleset-reach.mjs`, so the two surfaces cannot disagree about which rulesets
|
|
650
|
+
govern nothing. Not in doctor: doctor makes no network call, and which branches exist is a live
|
|
651
|
+
read — the same split that puts the template half of the declaration comparison in doctor and the
|
|
652
|
+
live half in health.
|
|
653
|
+
|
|
654
|
+
Three answers, never two. A ruleset that matches at least one branch is silent. One that matches
|
|
655
|
+
none is named with the patterns that matched nothing. One this run could not classify — an
|
|
656
|
+
unreadable branch list, a `~DEFAULT_BRANCH` whose default branch could not be resolved, an fnmatch
|
|
657
|
+
bracket expression the detector does not model — is `undetermined` and says so, because an unread
|
|
658
|
+
branch list is not an empty repository and reporting it as one would name every ruleset present.
|
|
659
|
+
|
|
660
|
+
**Report only, and neither obvious repair is Lisa's to make.** Creating the missing branch
|
|
661
|
+
manufactures the very ref the ruleset was written to protect; disabling the ruleset gives up a
|
|
662
|
+
protection somebody chose. An automated actor may narrow a control, never loosen one. Point the
|
|
663
|
+
ruleset at a branch the repository has, or retire it deliberately.
|
|
664
|
+
|
|
665
|
+
## Secrets configuration
|
|
666
|
+
|
|
667
|
+
Run the secrets health checks through the skill that owns the contract, rather than reimplementing
|
|
668
|
+
any part of it here:
|
|
669
|
+
|
|
670
|
+
```sh
|
|
671
|
+
node .claude/skills/lisa-secrets-access/scripts/validate-config.mjs # shape
|
|
672
|
+
node .claude/skills/lisa-secrets-access/scripts/preflight-secrets.mjs # credential readiness
|
|
673
|
+
node .claude/skills/lisa-setup-remote-env/scripts/preflight-tools.mjs # tooling readiness
|
|
674
|
+
node .claude/skills/lisa-secrets-access/scripts/doctor-secrets.mjs # health
|
|
675
|
+
```
|
|
676
|
+
|
|
677
|
+
Run the validator first. It checks only the *shape* of the `secrets`, `remoteEnv`, and
|
|
678
|
+
`automations` blocks — whether a declaration could ever be correct — and catches the failures that
|
|
679
|
+
would otherwise surface somewhere unhelpful: a container failing mid-setup, a scheduled loop that
|
|
680
|
+
never fires, a dispatch naming a surface nobody provisioned. The health check then asks whether the
|
|
681
|
+
credentials actually resolve.
|
|
682
|
+
|
|
683
|
+
The preflight in the middle is the same check the SessionStart hook runs, and it is here for the
|
|
684
|
+
half the hook deliberately cannot do. The hook injects its verdict into an agent's context and
|
|
685
|
+
never blocks — killing a session over a credential it may not need would tax every session for a
|
|
686
|
+
minority need, and a control people route around enforces nothing. Doctor is where the same
|
|
687
|
+
verdict is allowed to be a non-zero exit.
|
|
688
|
+
|
|
689
|
+
It reports three outcomes, and the third carries the weight. `ok` and `missing` are self-evident.
|
|
690
|
+
**`unreachable`** means the provider itself could not be asked — no CLI, no bootstrap token, an API
|
|
691
|
+
that errored — and it is neither of its neighbours. Reported as `ok` it would be a vacuous green,
|
|
692
|
+
clean precisely because nothing was learned. Reported as `missing` it would blame the vault for a
|
|
693
|
+
fault in this machine's access and send someone to grant a credential that was never absent. Both
|
|
694
|
+
fail; they differ in what they tell the reader to fix.
|
|
695
|
+
|
|
696
|
+
The tooling preflight asks the same question about CLIs, and it is a *caller* of
|
|
697
|
+
`planToolchain` rather than a second implementation — that distinction is the point.
|
|
698
|
+
`verify-remote-env.mjs` previously ran its own toolchain loop which never consulted
|
|
699
|
+
`minVersion`, so a container verified clean against a `node` older than the manifest
|
|
700
|
+
demanded while the plan-side check rejected exactly that. One function now answers the
|
|
701
|
+
question everywhere.
|
|
702
|
+
|
|
703
|
+
It needs only two verdicts. A local binary cannot fail to be asked the way a vault can,
|
|
704
|
+
and the analogous trap — a tool present at an unparseable version — already fails closed
|
|
705
|
+
upstream, because an unknown version loses every `minVersion` comparison. What it does add
|
|
706
|
+
is a split credentials have no equivalent for: a missing tool with a pinned, checksummed
|
|
707
|
+
`install` entry is something Lisa can place itself, so it reports an action and exits zero,
|
|
708
|
+
while a tool nothing can provision blocks and exits non-zero.
|
|
709
|
+
|
|
710
|
+
It reports without ever printing a value, and compares two copies of the same credential by digest.
|
|
711
|
+
Map its findings into the doctor's own verdicts: `error` → `FAIL`, `warn` → `WARN`.
|
|
712
|
+
|
|
713
|
+
**A project with no credentials manager is `WARN`, never `FAIL`.** The `env` provider is a supported
|
|
714
|
+
state — the environment *is* the provider. A manager is the preferred path because it gives one
|
|
715
|
+
store, rotation, and an audit trail; it is not a requirement, and doctor must not act as though it
|
|
716
|
+
were.
|
|
717
|
+
|
|
718
|
+
The check worth understanding before triaging its output is the two-store one. A value present in
|
|
719
|
+
both the provider and a local copy is **not a duplicate** — it is two live credentials, one of them
|
|
720
|
+
untracked. Both authenticate, so the difference is invisible from either side, and "tidying up the
|
|
721
|
+
duplicate" deletes a working credential that no record accounts for. Treat a mismatch as
|
|
722
|
+
stop-and-ask, never as something to adjudicate automatically.
|
|
723
|
+
|
|
724
|
+
## Delegation and reuse
|
|
725
|
+
|
|
726
|
+
- Reuse `config-resolution` for config and lifecycle role defaults instead of inventing a second
|
|
727
|
+
schema.
|
|
728
|
+
- Reuse `lisa-secrets-access` for every secrets check. Doctor must never read a keychain, parse a
|
|
729
|
+
`.env`, or invoke a provider CLI itself — one chokepoint is what makes the single-store rule
|
|
730
|
+
enforceable, and a diagnostic that bypasses it is exactly the second reader that creates drift.
|
|
731
|
+
- Reuse the existing `github-project-v2` chokepoint for GitHub Project coordination checks instead
|
|
732
|
+
of inlining bespoke access logic.
|
|
733
|
+
- Reuse ideas from `lisa-wiki-doctor` for grouped verdict rendering where they fit, while keeping
|
|
734
|
+
the Lisa-wide doctor narrower than the wiki-specific migration/readiness workflow.
|
|
735
|
+
|
|
736
|
+
## Rules
|
|
737
|
+
|
|
738
|
+
- Never mutate repository, tracker, or automation state on the default doctor path.
|
|
739
|
+
- Never hardcode tracker/source label names outside the documented defaults plus configured
|
|
740
|
+
overrides from `config-resolution`.
|
|
741
|
+
- Never silently treat an unavailable check surface as success; report `WARN`, `FAIL`, or `SKIP`
|
|
742
|
+
with the explicit missing dependency.
|
|
743
|
+
- Never turn wiki-specific checks into a requirement for non-wiki repos.
|