@codyswann/lisa 4.74.8 → 4.75.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +60 -0
- package/all/copy-overwrite/scripts/lib/npm-update-cancel-origin.mjs +4 -2
- package/all/copy-overwrite/scripts/lib/npm-update-checkpoint-codec.mjs +141 -0
- package/all/copy-overwrite/scripts/lib/npm-update-checkpoint.mjs +162 -116
- package/all/copy-overwrite/scripts/lib/npm-update-helper-inventory.mjs +1 -0
- package/all/copy-overwrite/scripts/lib/npm-update-recovery.mjs +9 -60
- package/all/copy-overwrite/scripts/npm-updater-helper-graph.json +18 -6
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +20 -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 +739 -11
- 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
- package/scripts/two-channel-couplings.json +1 -1
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Refuse an outbound tracker write whose title or body names a host project.
|
|
3
|
+
*
|
|
4
|
+
* WHY THIS EXISTS AS A HOOK AND NOT AS MORE PROSE
|
|
5
|
+
*
|
|
6
|
+
* The rule lives in `.claude/rules/PROJECT_RULES.md`, it is repeated in every
|
|
7
|
+
* agent brief, and agents break it anyway. Measured across the full tracker on
|
|
8
|
+
* 2026-09-03 — 193 open issues, 1,461 closed, 1,991 merged pull requests — 513
|
|
9
|
+
* items carried a host identity. The daily rate over the preceding week ran
|
|
10
|
+
* between 1.8% and 28.5% and never reached zero, and the items filed on the day
|
|
11
|
+
* of the count were filed by agents whose briefs carried the rule. Instruction
|
|
12
|
+
* is not reaching the moment of writing, so the check belongs on the write path.
|
|
13
|
+
*
|
|
14
|
+
* This repository is public and `dist/` is in the npm `files` allowlist, so a
|
|
15
|
+
* name written into an issue body is published on github.com AND shipped to
|
|
16
|
+
* every consumer of the package. There is no quiet version of this mistake.
|
|
17
|
+
*
|
|
18
|
+
* WHAT IT IS NOT
|
|
19
|
+
*
|
|
20
|
+
* **This reduces the rate. It does not close the class.** The detector is a
|
|
21
|
+
* curated denylist: a name variant nobody has added — a new spelling, a legal
|
|
22
|
+
* entity, a tracker-site slug, an email domain, an acronym — is invisible to it.
|
|
23
|
+
* One organisation's name in running prose reached three separate issue bodies
|
|
24
|
+
* and was matched by no pattern used during the audit; it is caught today only
|
|
25
|
+
* because a person put that spelling in the list by hand. Read a green result as
|
|
26
|
+
* "none of the known names appeared", never as "this text is clean".
|
|
27
|
+
*
|
|
28
|
+
* WHERE IT LOOKS, AND WHY THAT MATTERS MORE THAN THE MATCHER
|
|
29
|
+
*
|
|
30
|
+
* The convention in this repository is `--body-file <path>`; the text never
|
|
31
|
+
* appears in the command string. A guard that inspects only argv therefore sees
|
|
32
|
+
* nothing and reports clean on every real call — that is #3484's defect, and
|
|
33
|
+
* repeating it here would ship a guard that runs and never bites. So this reads
|
|
34
|
+
* the referenced file, and the title, which is what appears in every listing and
|
|
35
|
+
* notification.
|
|
36
|
+
*
|
|
37
|
+
* WHY THIS IS NOT MATERIALIZED INTO HOST PROJECTS
|
|
38
|
+
*
|
|
39
|
+
* The five sibling PreToolUse guards are copied into host projects through
|
|
40
|
+
* `all/copy-overwrite/scripts/lisa-hooks/`. This one deliberately is not, and
|
|
41
|
+
* the omission is a scope decision rather than an oversight.
|
|
42
|
+
*
|
|
43
|
+
* The denylist holds the names of host projects — the very repositories that
|
|
44
|
+
* install Lisa. Shipped into host project X, this guard would refuse every
|
|
45
|
+
* issue in which X writes its own name, which is normal and correct writing
|
|
46
|
+
* there. The rule it enforces is Lisa's: **this** repository is public and
|
|
47
|
+
* `dist/` ships to npm, so **this** repository may not name its hosts. A host
|
|
48
|
+
* naming itself carries none of that.
|
|
49
|
+
*
|
|
50
|
+
* So the parity obligation is satisfied across every agent surface OF THIS
|
|
51
|
+
* REPOSITORY — Claude, Codex, Cursor, Antigravity, Copilot all register it —
|
|
52
|
+
* and stops at the boundary where the rule itself stops applying. Anyone
|
|
53
|
+
* tempted to add it to `plugins/materialized-artifacts.json` should have a
|
|
54
|
+
* reason why a host project should be refused its own name.
|
|
55
|
+
*
|
|
56
|
+
* FAILING OPEN, LOUDLY
|
|
57
|
+
*
|
|
58
|
+
* When the denylist cannot be loaded this permits the write and says so on
|
|
59
|
+
* stderr. Failing closed would block every tracker write on a machine without a
|
|
60
|
+
* built `dist/`; failing open silently is worse than either, because a guard
|
|
61
|
+
* that is quietly absent is indistinguishable from a guard that passes. Same
|
|
62
|
+
* reasoning as `block-direct-issue-create.sh`'s interpreter probe.
|
|
63
|
+
* @module hooks/block-host-name-leak
|
|
64
|
+
*/
|
|
65
|
+
import { existsSync, readFileSync, realpathSync } from "node:fs";
|
|
66
|
+
import path from "node:path";
|
|
67
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
68
|
+
|
|
69
|
+
/** Claude Code's refusal code. Every other non-zero exit is a hook error. */
|
|
70
|
+
const EXIT_BLOCKED = 2;
|
|
71
|
+
/** Permit the command. */
|
|
72
|
+
const EXIT_ALLOWED = 0;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Where the compiled detector may live, relative to the governed project.
|
|
76
|
+
*
|
|
77
|
+
* Inside this repository it is the local build; inside a host project it is the
|
|
78
|
+
* installed package. The plugin directory itself is NOT a candidate — it ships
|
|
79
|
+
* `hooks/`, `skills/` and `scripts/` and no `dist/`, so a hook that looked
|
|
80
|
+
* beside itself would find nothing and stand down everywhere.
|
|
81
|
+
*/
|
|
82
|
+
const DETECTOR_PATHS = [
|
|
83
|
+
"dist/core/downstream-references.js",
|
|
84
|
+
"node_modules/@codyswann/lisa/dist/core/downstream-references.js",
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
/** Sub-commands that publish text people read. */
|
|
88
|
+
const WRITE_VERBS = new Set(["create", "comment", "edit"]);
|
|
89
|
+
/** The `gh` nouns whose writes carry prose. */
|
|
90
|
+
const WRITE_NOUNS = new Set(["issue", "pr"]);
|
|
91
|
+
/** HTTP methods that change tracker state. */
|
|
92
|
+
const MUTATING_METHODS = new Set(["POST", "PATCH", "PUT"]);
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Flags whose value is a path to read.
|
|
96
|
+
*
|
|
97
|
+
* `-F` is `--body-file`'s short form on `gh issue`/`gh pr`, and on `gh api` it
|
|
98
|
+
* is `--field`, which may itself carry `@path`. Both are handled — reading a
|
|
99
|
+
* file that turns out to be a literal costs nothing, missing one costs the
|
|
100
|
+
* guard.
|
|
101
|
+
*/
|
|
102
|
+
const FILE_FLAGS = new Set(["--body-file", "-F", "--input"]);
|
|
103
|
+
/** Flags whose value is literal text people will read. */
|
|
104
|
+
const TEXT_FLAGS = new Set([
|
|
105
|
+
"--title",
|
|
106
|
+
"-t",
|
|
107
|
+
"--body",
|
|
108
|
+
"-b",
|
|
109
|
+
"--message",
|
|
110
|
+
"-m",
|
|
111
|
+
]);
|
|
112
|
+
/** `gh api` field flags: `key=value`, or `key=@path` to read a file. */
|
|
113
|
+
const FIELD_FLAGS = new Set(["-f", "--field", "--raw-field"]);
|
|
114
|
+
/** Field names whose value is published prose rather than metadata. */
|
|
115
|
+
const PROSE_FIELDS = new Set(["body", "title", "text", "message"]);
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Vendor endpoints quoted from guard source, which are not host identities.
|
|
119
|
+
*
|
|
120
|
+
* These appear in this repository's own prose when documenting the access
|
|
121
|
+
* layer. Left unguarded they would be a standing false positive, and a guard
|
|
122
|
+
* with false positives is a guard someone turns off.
|
|
123
|
+
*/
|
|
124
|
+
const ENDPOINT_ALLOWANCES = [
|
|
125
|
+
"api.linear.app",
|
|
126
|
+
"mcp.linear.app",
|
|
127
|
+
"api.github.com",
|
|
128
|
+
"api.atlassian.com",
|
|
129
|
+
];
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Split a command line into argv, honouring single and double quotes.
|
|
133
|
+
*
|
|
134
|
+
* Deliberately not a shell: it does not expand variables, globs or command
|
|
135
|
+
* substitution. Those would let the guard's own reading diverge from what the
|
|
136
|
+
* shell will actually run, and a guard that models the shell imperfectly is
|
|
137
|
+
* worse than one that reads tokens plainly.
|
|
138
|
+
* @param command - The raw command string.
|
|
139
|
+
* @returns The tokens, quotes stripped.
|
|
140
|
+
*/
|
|
141
|
+
export function tokenize(command) {
|
|
142
|
+
const tokens = [];
|
|
143
|
+
let current = "";
|
|
144
|
+
let quote = "";
|
|
145
|
+
let started = false;
|
|
146
|
+
for (const char of command) {
|
|
147
|
+
if (quote !== "") {
|
|
148
|
+
if (char === quote) quote = "";
|
|
149
|
+
else current += char;
|
|
150
|
+
started = true;
|
|
151
|
+
} else if (char === '"' || char === "'") {
|
|
152
|
+
quote = char;
|
|
153
|
+
started = true;
|
|
154
|
+
} else if (/\s/u.test(char)) {
|
|
155
|
+
if (started) tokens.push(current);
|
|
156
|
+
current = "";
|
|
157
|
+
started = false;
|
|
158
|
+
} else {
|
|
159
|
+
current += char;
|
|
160
|
+
started = true;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
if (started) tokens.push(current);
|
|
164
|
+
return tokens;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Whether these tokens are a `gh` call that publishes tracker text.
|
|
169
|
+
*
|
|
170
|
+
* Reads (`view`, `list`, `status`) and non-tracker writes (`gh label create`)
|
|
171
|
+
* are not writes of prose and do not fire.
|
|
172
|
+
* @param tokens - Command tokens.
|
|
173
|
+
* @returns True when the command publishes text.
|
|
174
|
+
*/
|
|
175
|
+
export function isOutboundTrackerWrite(tokens) {
|
|
176
|
+
const gh = tokens.indexOf("gh");
|
|
177
|
+
if (gh === -1) return false;
|
|
178
|
+
const rest = tokens.slice(gh + 1).filter(token => !token.startsWith("-"));
|
|
179
|
+
const [noun, verb] = rest;
|
|
180
|
+
if (noun === "api") return isMutatingApiCall(tokens);
|
|
181
|
+
return WRITE_NOUNS.has(noun ?? "") && WRITE_VERBS.has(verb ?? "");
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Whether a `gh api` call mutates.
|
|
186
|
+
*
|
|
187
|
+
* `gh api` defaults to GET, and to POST when any field flag is present — so a
|
|
188
|
+
* field flag alone makes it a write even with no explicit method.
|
|
189
|
+
* @param tokens - Command tokens.
|
|
190
|
+
* @returns True when the call changes state.
|
|
191
|
+
*/
|
|
192
|
+
function isMutatingApiCall(tokens) {
|
|
193
|
+
const method = tokens.findIndex(
|
|
194
|
+
token => token === "-X" || token === "--method"
|
|
195
|
+
);
|
|
196
|
+
if (method !== -1) {
|
|
197
|
+
return MUTATING_METHODS.has((tokens[method + 1] ?? "").toUpperCase());
|
|
198
|
+
}
|
|
199
|
+
return tokens.some(token => FIELD_FLAGS.has(token));
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* The value a flag carries, in either `--flag value` or `--flag=value` form.
|
|
204
|
+
* @param tokens - Command tokens.
|
|
205
|
+
* @param index - Index of the flag token.
|
|
206
|
+
* @returns The value, or an empty string.
|
|
207
|
+
*/
|
|
208
|
+
function valueAt(tokens, index) {
|
|
209
|
+
const token = tokens[index] ?? "";
|
|
210
|
+
const equals = token.indexOf("=");
|
|
211
|
+
if (equals !== -1 && token.startsWith("-")) return token.slice(equals + 1);
|
|
212
|
+
return tokens[index + 1] ?? "";
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Read a file the command names, if it is readable.
|
|
217
|
+
* @param candidate - Path as written on the command line.
|
|
218
|
+
* @param cwd - Directory the command runs in.
|
|
219
|
+
* @returns The contents, or an empty string.
|
|
220
|
+
*/
|
|
221
|
+
function readIfPresent(candidate, cwd) {
|
|
222
|
+
if (candidate === "" || candidate === "-") return "";
|
|
223
|
+
const resolved = path.isAbsolute(candidate)
|
|
224
|
+
? candidate
|
|
225
|
+
: path.join(cwd, candidate);
|
|
226
|
+
if (!existsSync(resolved)) return "";
|
|
227
|
+
try {
|
|
228
|
+
return readFileSync(resolved, "utf-8");
|
|
229
|
+
} catch {
|
|
230
|
+
return "";
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Every piece of text this command would publish, labelled by where it came
|
|
236
|
+
* from so the refusal can point at the thing to edit.
|
|
237
|
+
* @param tokens - Command tokens.
|
|
238
|
+
* @param cwd - Directory the command runs in.
|
|
239
|
+
* @returns Sources of publishable text.
|
|
240
|
+
*/
|
|
241
|
+
export function publishableText(tokens, cwd) {
|
|
242
|
+
return tokens.flatMap((token, index) => {
|
|
243
|
+
const bare = token.startsWith("-") ? token.split("=")[0] : token;
|
|
244
|
+
if (TEXT_FLAGS.has(bare)) {
|
|
245
|
+
return [{ origin: bare, text: valueAt(tokens, index) }];
|
|
246
|
+
}
|
|
247
|
+
if (FILE_FLAGS.has(bare)) {
|
|
248
|
+
const file = valueAt(tokens, index).replace(/^@/u, "");
|
|
249
|
+
return [{ origin: file, text: readIfPresent(file, cwd) }];
|
|
250
|
+
}
|
|
251
|
+
if (FIELD_FLAGS.has(bare))
|
|
252
|
+
return [fieldSource(valueAt(tokens, index), cwd)];
|
|
253
|
+
return [];
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
/**
|
|
258
|
+
* One `gh api` field, which may be literal or a file reference.
|
|
259
|
+
* @param assignment - The raw `key=value` token.
|
|
260
|
+
* @param cwd - Directory the command runs in.
|
|
261
|
+
* @returns A text source; empty when the field is not prose.
|
|
262
|
+
*/
|
|
263
|
+
function fieldSource(assignment, cwd) {
|
|
264
|
+
const split = assignment.indexOf("=");
|
|
265
|
+
if (split === -1) return { origin: "", text: "" };
|
|
266
|
+
const key = assignment.slice(0, split);
|
|
267
|
+
const value = assignment.slice(split + 1);
|
|
268
|
+
if (!PROSE_FIELDS.has(key)) return { origin: "", text: "" };
|
|
269
|
+
if (value.startsWith("@")) {
|
|
270
|
+
const file = value.slice(1);
|
|
271
|
+
return { origin: file, text: readIfPresent(file, cwd) };
|
|
272
|
+
}
|
|
273
|
+
return { origin: key, text: value };
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Whether a matched span sits inside a vendor endpoint rather than a name.
|
|
278
|
+
* @param line - The line the match came from.
|
|
279
|
+
* @param match - The matched span.
|
|
280
|
+
* @returns True when the match is an allowed endpoint.
|
|
281
|
+
*/
|
|
282
|
+
function isEndpoint(line, match) {
|
|
283
|
+
return ENDPOINT_ALLOWANCES.some(
|
|
284
|
+
endpoint =>
|
|
285
|
+
endpoint.includes(match.toLowerCase()) && line.includes(endpoint)
|
|
286
|
+
);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Load the compiled detector from the governed project.
|
|
291
|
+
* @param projectDir - The project the command runs in.
|
|
292
|
+
* @returns The detector module, or undefined when it cannot be found.
|
|
293
|
+
*/
|
|
294
|
+
async function loadDetector(projectDir) {
|
|
295
|
+
for (const candidate of DETECTOR_PATHS) {
|
|
296
|
+
const resolved = path.join(projectDir, candidate);
|
|
297
|
+
if (!existsSync(resolved)) continue;
|
|
298
|
+
try {
|
|
299
|
+
return await import(pathToFileURL(resolved).href);
|
|
300
|
+
} catch {
|
|
301
|
+
return undefined;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
return undefined;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Every host-name violation in one text source.
|
|
309
|
+
* @param source - The labelled text.
|
|
310
|
+
* @param detector - The loaded detector module.
|
|
311
|
+
* @returns Findings, each naming its origin and line.
|
|
312
|
+
*/
|
|
313
|
+
function findingsIn(source, detector) {
|
|
314
|
+
if (source.text === "") return [];
|
|
315
|
+
const lines = source.text.split("\n");
|
|
316
|
+
return detector
|
|
317
|
+
.findDownstreamReferences(source.text)
|
|
318
|
+
.filter(hit => !isEndpoint(lines[hit.line - 1] ?? "", hit.match))
|
|
319
|
+
.map(hit => ({ ...hit, origin: source.origin }));
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Render the refusal an agent will act on.
|
|
324
|
+
* @param findings - Every violation found.
|
|
325
|
+
* @returns The message body.
|
|
326
|
+
*/
|
|
327
|
+
export function formatRefusal(findings) {
|
|
328
|
+
const located = findings
|
|
329
|
+
.map(hit => ` ${hit.origin}:${hit.line} — "${hit.match}" (${hit.reason})`)
|
|
330
|
+
.join("\n");
|
|
331
|
+
return `BLOCKED: this tracker write names a host project.
|
|
332
|
+
|
|
333
|
+
${located}
|
|
334
|
+
|
|
335
|
+
WHY: this repository is public and \`dist/\` ships to npm, so a host identity in
|
|
336
|
+
an issue body is published twice — on github.com and to every consumer of the
|
|
337
|
+
package. See the "Never name a downstream project" rule.
|
|
338
|
+
|
|
339
|
+
FIX: write the evidence, not the identity. "a caller repo in the portfolio",
|
|
340
|
+
"repo A" / "repo B" where two are contrasted, \`<ticket>\` for a real ticket id.
|
|
341
|
+
The argument never depends on which named client proved it — if it seems to,
|
|
342
|
+
the argument is the thing to fix.
|
|
343
|
+
|
|
344
|
+
SCOPE: this checks a curated list of known names. It is a rate reduction, not a
|
|
345
|
+
closed class — a spelling nobody has added is invisible to it, so a clean result
|
|
346
|
+
means "no known name appeared", not "this text is safe".`;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Evaluate one command.
|
|
351
|
+
* @param command - The command string.
|
|
352
|
+
* @param projectDir - The project the command runs in.
|
|
353
|
+
* @returns The exit code and any message.
|
|
354
|
+
*/
|
|
355
|
+
export async function evaluate(command, projectDir) {
|
|
356
|
+
const tokens = tokenize(command);
|
|
357
|
+
if (!isOutboundTrackerWrite(tokens)) return { code: EXIT_ALLOWED };
|
|
358
|
+
const detector = await loadDetector(projectDir);
|
|
359
|
+
if (detector === undefined) {
|
|
360
|
+
return {
|
|
361
|
+
code: EXIT_ALLOWED,
|
|
362
|
+
warning:
|
|
363
|
+
"block-host-name-leak: host-name denylist not found (no built dist/ or installed package); host-identity enforcement is NOT active",
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
const findings = publishableText(tokens, projectDir).flatMap(source =>
|
|
367
|
+
findingsIn(source, detector)
|
|
368
|
+
);
|
|
369
|
+
if (findings.length === 0) return { code: EXIT_ALLOWED };
|
|
370
|
+
return { code: EXIT_BLOCKED, message: formatRefusal(findings) };
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/** Entry point: `node block-host-name-leak.mjs <command> [projectDir]`. */
|
|
374
|
+
async function main() {
|
|
375
|
+
const [, , command = "", projectDir = process.cwd()] = process.argv;
|
|
376
|
+
if (command === "") process.exit(EXIT_ALLOWED);
|
|
377
|
+
const result = await evaluate(command, projectDir);
|
|
378
|
+
if (result.warning !== undefined) process.stderr.write(`${result.warning}\n`);
|
|
379
|
+
if (result.message !== undefined) process.stderr.write(`${result.message}\n`);
|
|
380
|
+
process.exit(result.code);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Whether this module is the process entry point.
|
|
385
|
+
*
|
|
386
|
+
* Both sides are realpath'd: comparing `fileURLToPath(import.meta.url)` against
|
|
387
|
+
* `process.argv[1]` disagrees whenever the checkout is reached through a
|
|
388
|
+
* symlink — a git worktree, or any `/tmp` path on macOS, `/tmp` being a symlink
|
|
389
|
+
* to `/private/tmp` — because `import.meta.url` is the REAL path while
|
|
390
|
+
* `argv[1]` is whatever the caller typed. Comparing basenames, which an earlier
|
|
391
|
+
* draft of this file did, matches any file that happens to share a name.
|
|
392
|
+
*
|
|
393
|
+
* The one implementation lives at `scripts/lib/invoked-as-script.mjs`. This
|
|
394
|
+
* file cannot import it: it is materialized into every plugin payload, where
|
|
395
|
+
* there is no `./lib/` to import from — the same accommodation
|
|
396
|
+
* `inject-resolved-config.mjs` and `threshold-ratchet.mjs` make.
|
|
397
|
+
* @param {string} moduleUrl The caller's own `import.meta.url`.
|
|
398
|
+
* @param {string | undefined} [argv1] Entry path; defaults to `process.argv[1]`.
|
|
399
|
+
* @returns {boolean} Whether the caller should run its CLI body.
|
|
400
|
+
*/
|
|
401
|
+
export function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
|
|
402
|
+
if (!argv1) return false;
|
|
403
|
+
try {
|
|
404
|
+
return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
|
|
405
|
+
} catch {
|
|
406
|
+
return false;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
if (invokedAsScript(import.meta.url)) {
|
|
411
|
+
await main();
|
|
412
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# PreToolUse hook for Bash: refuse an outbound tracker write that names a host
|
|
3
|
+
# project.
|
|
4
|
+
#
|
|
5
|
+
# The classification lives in block-host-name-leak.mjs beside this file, because
|
|
6
|
+
# the detector it must consult is compiled JavaScript (`dist/core/`) and calling
|
|
7
|
+
# it from Node is the only way to keep ONE denylist. A bash reimplementation of
|
|
8
|
+
# the matcher would be a second copy of the thing the guard exists to protect,
|
|
9
|
+
# and copies drift.
|
|
10
|
+
#
|
|
11
|
+
# This wrapper does three things and nothing else: probe its interpreters,
|
|
12
|
+
# unwrap the Claude hook envelope, and hand the command string to Node.
|
|
13
|
+
#
|
|
14
|
+
# FAILING OPEN, LOUDLY
|
|
15
|
+
#
|
|
16
|
+
# Claude Code treats exit 2 as a refusal and every OTHER non-zero exit as a
|
|
17
|
+
# non-blocking hook error — meaning the command runs. Under `set -euo pipefail`
|
|
18
|
+
# an absent jq exits 127, so an unguarded probe would permit exactly what this
|
|
19
|
+
# exists to stop. Degrading to "allow" is correct: a hook that cannot read its
|
|
20
|
+
# input cannot tell a tracker write from a directory listing, and failing closed
|
|
21
|
+
# would block every Bash call on a machine missing an interpreter. Announcing it
|
|
22
|
+
# is mandatory, because a guard that is silently absent reads exactly like a
|
|
23
|
+
# guard that is passing. Same reasoning as block-direct-issue-create.sh.
|
|
24
|
+
set -euo pipefail
|
|
25
|
+
|
|
26
|
+
input="$(cat)"
|
|
27
|
+
|
|
28
|
+
for required in jq node; do
|
|
29
|
+
if ! command -v "$required" >/dev/null 2>&1; then
|
|
30
|
+
printf 'block-host-name-leak: %s not found; host-identity enforcement is NOT active\n' \
|
|
31
|
+
"$required" >&2
|
|
32
|
+
exit 0
|
|
33
|
+
fi
|
|
34
|
+
done
|
|
35
|
+
|
|
36
|
+
tool_name="$(printf '%s' "$input" | jq -r '.tool_name // empty' 2>/dev/null || true)"
|
|
37
|
+
if [ "$tool_name" != "Bash" ]; then
|
|
38
|
+
exit 0
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
command_str="$(printf '%s' "$input" | jq -r '.tool_input.command // empty' 2>/dev/null || true)"
|
|
42
|
+
if [ -z "$command_str" ]; then
|
|
43
|
+
exit 0
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
project_dir="${CLAUDE_PROJECT_DIR:-}"
|
|
47
|
+
if [ -z "$project_dir" ]; then
|
|
48
|
+
project_dir="$PWD"
|
|
49
|
+
fi
|
|
50
|
+
|
|
51
|
+
hook_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
52
|
+
classifier="$hook_dir/block-host-name-leak.mjs"
|
|
53
|
+
if [ ! -r "$classifier" ]; then
|
|
54
|
+
printf 'block-host-name-leak: classifier missing at %s; host-identity enforcement is NOT active\n' \
|
|
55
|
+
"$classifier" >&2
|
|
56
|
+
exit 0
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
status=0
|
|
60
|
+
node "$classifier" "$command_str" "$project_dir" || status=$?
|
|
61
|
+
exit "$status"
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# This file is managed by Lisa and IS replaced on each `lisa` run.
|
|
3
|
+
# Do not edit directly — durable changes belong upstream in Lisa.
|
|
4
|
+
|
|
5
|
+
# PreToolUse hook: refuse agent writes to the session-instruction files.
|
|
6
|
+
#
|
|
7
|
+
# `AGENTS.md`, `CLAUDE.md`, and `.github/copilot-instructions.md` are the files
|
|
8
|
+
# every agent loads at session start. They are human-authored and curated on
|
|
9
|
+
# purpose — Lisa's own contract says so in two places:
|
|
10
|
+
# - plugins/src/base/rules/reference/project-learnings.md
|
|
11
|
+
# - plugins/src/base/skills/lisa-debrief-apply/SKILL.md ("CLAUDE.md is
|
|
12
|
+
# human-authored ... apply never writes to any of the three")
|
|
13
|
+
#
|
|
14
|
+
# Nothing enforced it, so agents appended their own findings anyway: one fleet
|
|
15
|
+
# repo reached 949 lines of ticket-keyed trap dumps in `AGENTS.md` while its
|
|
16
|
+
# learnings ledger held 22. Every one of those lines is charged to the context
|
|
17
|
+
# of every later session in that project, forever. Prose did not hold; this is
|
|
18
|
+
# the executable control that does.
|
|
19
|
+
#
|
|
20
|
+
# Blocked signatures:
|
|
21
|
+
# 1. Write / Edit / MultiEdit / NotebookEdit whose target basename is one of
|
|
22
|
+
# the instruction files;
|
|
23
|
+
# 2. Bash output redirection (`>`, `>>`), `tee`, or `sed -i` aimed at one.
|
|
24
|
+
# Reads (`cat AGENTS.md`, `rg pattern AGENTS.md`) never fire.
|
|
25
|
+
#
|
|
26
|
+
# Exemptions (allowed):
|
|
27
|
+
# - `LISA_ALLOW_INSTRUCTION_FILE_WRITE` set in the operator's runtime config.
|
|
28
|
+
# This cooperative override does not authenticate conversation approval;
|
|
29
|
+
# - Edit/MultiEdit replacing only bounded `<!-- LISA_` regions on both sides;
|
|
30
|
+
# - paths under `node_modules/` or `dist/` — vendored copies, not the host's.
|
|
31
|
+
set -euo pipefail
|
|
32
|
+
|
|
33
|
+
input="$(cat)"
|
|
34
|
+
|
|
35
|
+
# Evaluate once per tool call when this guard is registered on both channels.
|
|
36
|
+
#
|
|
37
|
+
# Lisa reaches an agent through the repository dispatcher AND the plugin
|
|
38
|
+
# manifest, and where both are live the harness runs this guard twice for one
|
|
39
|
+
# tool call. `guard-dedupe.bash` short-circuits the second run ONLY when a
|
|
40
|
+
# byte-identical copy already ALLOWED this exact payload on this exact tool
|
|
41
|
+
# call; a differing vintage, a refusal, and a host with one channel all
|
|
42
|
+
# evaluate exactly as before. Nothing is de-registered by it
|
|
43
|
+
# (CodySwannGT/lisa#3814).
|
|
44
|
+
#
|
|
45
|
+
# Absent library means no dedupe, which is the pre-existing behaviour, so an
|
|
46
|
+
# older channel copy that predates it is unaffected.
|
|
47
|
+
lisa_guard_hook_dir="${BASH_SOURCE[0]%/*}"
|
|
48
|
+
lisa_guard_dedupe_lib="$lisa_guard_hook_dir/guard-dedupe.bash"
|
|
49
|
+
if [ -r "$lisa_guard_dedupe_lib" ]; then
|
|
50
|
+
# shellcheck source=guard-dedupe.bash
|
|
51
|
+
. "$lisa_guard_dedupe_lib"
|
|
52
|
+
trap 'lisa_guard_dedupe_record $?' EXIT
|
|
53
|
+
lisa_guard_dedupe block-instruction-file-edits "$input" \
|
|
54
|
+
"$lisa_guard_hook_dir/parity-safety-net-heredoc.py"
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
command -v jq >/dev/null 2>&1 || exit 0
|
|
58
|
+
|
|
59
|
+
# Existing operator-configured override. This hook sees tool payloads, not the
|
|
60
|
+
# conversation; the environment variable is not proof of who approved an edit.
|
|
61
|
+
if [ -n "${LISA_ALLOW_INSTRUCTION_FILE_WRITE:-}" ]; then
|
|
62
|
+
exit 0
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
tool_name="$(printf '%s' "$input" | jq -r '.tool_name // empty')"
|
|
66
|
+
[ -n "$tool_name" ] || exit 0
|
|
67
|
+
|
|
68
|
+
# Lisa's own bounded bridges write marked regions — the agy project-learnings
|
|
69
|
+
# bridge and cross-pollinate's rule section. The premise of their exemption, as
|
|
70
|
+
# originally stated, is that they "replace in place and cannot grow the file".
|
|
71
|
+
# This enforces that premise rather than trusting it.
|
|
72
|
+
#
|
|
73
|
+
# Both sides have to be a marked region and nothing else:
|
|
74
|
+
#
|
|
75
|
+
# - old_string bounded proves the region really is on disk. Scanning the whole
|
|
76
|
+
# payload was trivially forgeable — any caller could put `<!-- LISA_` in the
|
|
77
|
+
# content it was WRITING and walk past the guard.
|
|
78
|
+
# - new_string bounded is what makes it a replacement rather than an append.
|
|
79
|
+
# old_string alone does not authorize anything: a caller can read a genuine
|
|
80
|
+
# marked region, echo it back verbatim, and still smuggle unbounded prose in
|
|
81
|
+
# after the closing marker. Requiring the written text to be exactly one
|
|
82
|
+
# marked region — whitespace aside — leaves nowhere to put it.
|
|
83
|
+
#
|
|
84
|
+
# Every edit in a MultiEdit must qualify; one unbounded edit taints the batch.
|
|
85
|
+
# Write is absent by construction: it has no old_string and clobbers the whole
|
|
86
|
+
# file, which is precisely the unbounded case.
|
|
87
|
+
case "$tool_name" in
|
|
88
|
+
Edit | MultiEdit)
|
|
89
|
+
if printf '%s' "$input" |
|
|
90
|
+
jq -e '
|
|
91
|
+
# Exactly ONE marked region and nothing else. The inner
|
|
92
|
+
# `(?!<!-- LISA_)` is what makes it one: a plain `[\s\S]*` anchors only
|
|
93
|
+
# the FIRST opening marker and the LAST closing marker, so
|
|
94
|
+
# `region + prose + region` satisfies it and the prose between the two
|
|
95
|
+
# regions rides along outside any marked block.
|
|
96
|
+
def bounded:
|
|
97
|
+
type == "string"
|
|
98
|
+
and test("^\\s*<!-- LISA_[A-Z_]+ -->(?:(?!<!-- LISA_)[\\s\\S])*<!-- LISA_[A-Z_]+ -->\\s*$");
|
|
99
|
+
def replacement_pairs:
|
|
100
|
+
if .tool_input.edits? then [.tool_input.edits[]?]
|
|
101
|
+
else [.tool_input] end;
|
|
102
|
+
replacement_pairs
|
|
103
|
+
| length > 0
|
|
104
|
+
and all(.[]; (.old_string | bounded) and (.new_string | bounded))
|
|
105
|
+
' >/dev/null 2>&1; then
|
|
106
|
+
exit 0
|
|
107
|
+
fi
|
|
108
|
+
;;
|
|
109
|
+
esac
|
|
110
|
+
|
|
111
|
+
# Basename match, case-insensitively: `agents.md` and `AGENTS.md` are the same
|
|
112
|
+
# file on the macOS checkouts this fleet runs on.
|
|
113
|
+
is_instruction_file() {
|
|
114
|
+
local candidate="$1"
|
|
115
|
+
case "$candidate" in
|
|
116
|
+
*/node_modules/* | node_modules/* | */dist/* | dist/*) return 1 ;;
|
|
117
|
+
esac
|
|
118
|
+
local base="${candidate##*/}"
|
|
119
|
+
case "$(printf '%s' "$base" | tr '[:upper:]' '[:lower:]')" in
|
|
120
|
+
agents.md | claude.md | copilot-instructions.md) return 0 ;;
|
|
121
|
+
esac
|
|
122
|
+
return 1
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
refuse() {
|
|
126
|
+
local target="$1"
|
|
127
|
+
cat >&2 <<EOF
|
|
128
|
+
BLOCKED: refusing to write \`$target\`.
|
|
129
|
+
|
|
130
|
+
WHY: this session-instruction file is loaded into future agent sessions.
|
|
131
|
+
Appending incidental findings makes every later session carry those notes.
|
|
132
|
+
This hook checks write patterns; it cannot read or authenticate conversation approval.
|
|
133
|
+
|
|
134
|
+
If an operator already requested a standing-rule edit, that authorization is
|
|
135
|
+
enough for the requested change. Use the relevant topic file in \`.agents/rules/\`
|
|
136
|
+
when no other destination was specified. All six supported agents read that
|
|
137
|
+
directory through the existing \`AGENTS.md\` pointer. Edit it directly; do not
|
|
138
|
+
require learning capture, another ticket, or repeated approval for the same ruling.
|
|
139
|
+
|
|
140
|
+
If the operator explicitly named this guarded file, preserve that target and
|
|
141
|
+
use the runtime's authorized edit path, or report this remaining restriction.
|
|
142
|
+
Do not silently move the edit, switch tools to evade this refusal, or set an
|
|
143
|
+
override yourself. The existing operator-configured
|
|
144
|
+
\`LISA_ALLOW_INSTRUCTION_FILE_WRITE=1\` escape hatch is not proof of consent.
|
|
145
|
+
|
|
146
|
+
For an agent's own finding, first decide whether it is worth maintaining.
|
|
147
|
+
Decline one-off trivia and unnecessary rules. Durable project knowledge can
|
|
148
|
+
use \`/lisa:persist-learning\`; procedural knowledge belongs with its SKILL.md;
|
|
149
|
+
background belongs in existing project documentation. Use
|
|
150
|
+
\`/lisa:cross-pollinate\` only for a material, reusable upstream improvement.
|
|
151
|
+
EOF
|
|
152
|
+
exit 2
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
case "$tool_name" in
|
|
156
|
+
Write | Edit | MultiEdit | NotebookEdit | Update)
|
|
157
|
+
# `file_path` covers Write/Edit; `edits[].file_path` covers the MultiEdit
|
|
158
|
+
# shapes that carry a path per edit; `notebook_path` covers NotebookEdit.
|
|
159
|
+
paths="$(printf '%s' "$input" | jq -r '
|
|
160
|
+
[ .tool_input.file_path?,
|
|
161
|
+
.tool_input.path?,
|
|
162
|
+
.tool_input.notebook_path?,
|
|
163
|
+
(.tool_input.edits? // [] | .[].file_path?)
|
|
164
|
+
] | map(select(. != null and . != "")) | .[]' 2>/dev/null || true)"
|
|
165
|
+
while IFS= read -r candidate; do
|
|
166
|
+
[ -n "$candidate" ] || continue
|
|
167
|
+
if is_instruction_file "$candidate"; then
|
|
168
|
+
refuse "$candidate"
|
|
169
|
+
fi
|
|
170
|
+
done <<EOF
|
|
171
|
+
$paths
|
|
172
|
+
EOF
|
|
173
|
+
;;
|
|
174
|
+
Bash)
|
|
175
|
+
command_str="$(printf '%s' "$input" | jq -r '.tool_input.command // empty')"
|
|
176
|
+
[ -n "$command_str" ] || exit 0
|
|
177
|
+
# Fast path: no instruction filename mentioned means nothing to classify.
|
|
178
|
+
if ! printf '%s' "$command_str" |
|
|
179
|
+
grep -Eqi '(agents|claude|copilot-instructions)\.md'; then
|
|
180
|
+
exit 0
|
|
181
|
+
fi
|
|
182
|
+
# Literal printf/echo arguments are content. The shared projection keeps
|
|
183
|
+
# the real redirect target, and leaves executable/ambiguous syntax intact.
|
|
184
|
+
if [[ "$command_str" =~ ^[[:blank:]]*(printf|echo)[[:blank:]] ]] \
|
|
185
|
+
&& command -v python3 >/dev/null 2>&1; then
|
|
186
|
+
if display_projection="$(printf '%s' "$command_str" | python3 \
|
|
187
|
+
"$lisa_guard_hook_dir/parity-safety-net-heredoc.py" --literal-display 2>/dev/null)"; then
|
|
188
|
+
command_str="$display_projection"
|
|
189
|
+
fi
|
|
190
|
+
fi
|
|
191
|
+
# Write signatures only. A bare mention (`cat AGENTS.md`, `rg x AGENTS.md`)
|
|
192
|
+
# is a read and must stay allowed — the filename has to appear as the target
|
|
193
|
+
# of a redirection, a tee, or an in-place sed.
|
|
194
|
+
# `>>?\|?` covers `>`, `>>`, and the noclobber override `>|`. The bare-`>`
|
|
195
|
+
# branch already catches explicit fd forms such as `1>` / `2>>` because the
|
|
196
|
+
# pattern is unanchored and matches the `>` inside them; `>|` was the real
|
|
197
|
+
# gap, since `|` is excluded by the target class and so terminated the match.
|
|
198
|
+
write_target='[^ |;&]*(agents|claude|copilot-instructions)\.md'
|
|
199
|
+
if printf '%s' "$command_str" |
|
|
200
|
+
grep -Eqi ">>?\|?[[:space:]]*['\"]?$write_target|tee([[:space:]]+-[a-z]+)*[[:space:]]+['\"]?$write_target|sed[[:space:]]+[^|;&]*-i[^|;&]*$write_target"; then
|
|
201
|
+
refuse "$(printf '%s' "$command_str" |
|
|
202
|
+
grep -Eoi "$write_target" | head -1)"
|
|
203
|
+
fi
|
|
204
|
+
;;
|
|
205
|
+
esac
|
|
206
|
+
|
|
207
|
+
exit 0
|