@codyswann/lisa 4.74.9 → 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/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 +730 -5
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +4 -4
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-cdk-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-cdk-devin/skills/setup-aws-accounts/SKILL.md +292 -0
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-devin/.claude-plugin/plugin.json +8 -0
- package/plugins/lisa-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-devin/.mcp.json +8 -0
- package/plugins/lisa-devin/agents/architecture-specialist.md +32 -0
- package/plugins/lisa-devin/agents/bug-fixer.md +43 -0
- package/plugins/lisa-devin/agents/builder.md +44 -0
- package/plugins/lisa-devin/agents/confluence-prd-intake.md +65 -0
- package/plugins/lisa-devin/agents/debug-specialist.md +34 -0
- package/plugins/lisa-devin/agents/eval-specialist.md +33 -0
- package/plugins/lisa-devin/agents/git-history-analyzer.md +183 -0
- package/plugins/lisa-devin/agents/github-agent.md +155 -0
- package/plugins/lisa-devin/agents/github-build-intake.md +64 -0
- package/plugins/lisa-devin/agents/github-prd-intake.md +66 -0
- package/plugins/lisa-devin/agents/jira-agent.md +135 -0
- package/plugins/lisa-devin/agents/jira-build-intake.md +64 -0
- package/plugins/lisa-devin/agents/learner.md +85 -0
- package/plugins/lisa-devin/agents/learning-judge.md +119 -0
- package/plugins/lisa-devin/agents/learnings-synthesizer.md +155 -0
- package/plugins/lisa-devin/agents/linear-agent.md +138 -0
- package/plugins/lisa-devin/agents/linear-build-intake.md +64 -0
- package/plugins/lisa-devin/agents/linear-prd-intake.md +66 -0
- package/plugins/lisa-devin/agents/notion-prd-intake.md +63 -0
- package/plugins/lisa-devin/agents/performance-specialist.md +26 -0
- package/plugins/lisa-devin/agents/pr-mining-specialist.md +85 -0
- package/plugins/lisa-devin/agents/product-specialist.md +30 -0
- package/plugins/lisa-devin/agents/quality-specialist.md +30 -0
- package/plugins/lisa-devin/agents/security-specialist.md +43 -0
- package/plugins/lisa-devin/agents/skill-evaluator.md +205 -0
- package/plugins/lisa-devin/agents/spec-conformance-specialist.md +56 -0
- package/plugins/lisa-devin/agents/test-specialist.md +32 -0
- package/plugins/lisa-devin/agents/tracker-mining-specialist.md +85 -0
- package/plugins/lisa-devin/agents/verification-specialist.md +145 -0
- package/plugins/lisa-devin/hooks/auto-update.mjs +824 -0
- package/plugins/lisa-devin/hooks/auto-update.sh +31 -0
- package/plugins/lisa-devin/hooks/block-blind-automerge.sh +1242 -0
- package/plugins/lisa-devin/hooks/block-direct-issue-create.sh +2603 -0
- package/plugins/lisa-devin/hooks/block-host-name-leak.mjs +412 -0
- package/plugins/lisa-devin/hooks/block-host-name-leak.sh +61 -0
- package/plugins/lisa-devin/hooks/block-instruction-file-edits.sh +207 -0
- package/plugins/lisa-devin/hooks/block-managed-file-edits.sh +1175 -0
- package/plugins/lisa-devin/hooks/block-no-verify.sh +2288 -0
- package/plugins/lisa-devin/hooks/block-shell-json-parsing.sh +263 -0
- package/plugins/lisa-devin/hooks/cleanup-stale-worktrees.sh +122 -0
- package/plugins/lisa-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-devin/hooks/discharge-work-item-gates.sh +90 -0
- package/plugins/lisa-devin/hooks/enforce-verification-gate.sh +506 -0
- package/plugins/lisa-devin/hooks/enforcement-vintage-npm.mjs +320 -0
- package/plugins/lisa-devin/hooks/enforcement-vintage.mjs +472 -0
- package/plugins/lisa-devin/hooks/enforcement-vintage.sh +48 -0
- package/plugins/lisa-devin/hooks/failure-signature-index.mjs +717 -0
- package/plugins/lisa-devin/hooks/failure-signature-index.sh +26 -0
- package/plugins/lisa-devin/hooks/guard-dedupe.bash +374 -0
- package/plugins/lisa-devin/hooks/inject-resolved-config.mjs +903 -0
- package/plugins/lisa-devin/hooks/inject-resolved-config.sh +107 -0
- package/plugins/lisa-devin/hooks/inject-rules.sh +49 -0
- package/plugins/lisa-devin/hooks/install-pkgs.sh +84 -0
- package/plugins/lisa-devin/hooks/operational-hazards.mjs +736 -0
- package/plugins/lisa-devin/hooks/operational-hazards.sh +28 -0
- package/plugins/lisa-devin/hooks/parity-safety-net-heredoc.py +1004 -0
- package/plugins/lisa-devin/hooks/parity-safety-net.sh +3275 -0
- package/plugins/lisa-devin/hooks/secrets-preflight.sh +72 -0
- package/plugins/lisa-devin/hooks/setup-jira-cli.sh +205 -0
- package/plugins/lisa-devin/hooks/shell-write-nudge.sh +86 -0
- package/plugins/lisa-devin/hooks/sonar-secrets.sh +205 -0
- package/plugins/lisa-devin/hooks/threshold-ratchet-compare.mjs +518 -0
- package/plugins/lisa-devin/hooks/threshold-ratchet-families.mjs +543 -0
- package/plugins/lisa-devin/hooks/threshold-ratchet.mjs +568 -0
- package/plugins/lisa-devin/hooks/threshold-ratchet.sh +22 -0
- package/plugins/lisa-devin/hooks/withdrawn-rulings.mjs +600 -0
- package/plugins/lisa-devin/hooks/withdrawn-rulings.sh +24 -0
- package/plugins/lisa-devin/hooks/worktree-binding-guard.mjs +1383 -0
- package/plugins/lisa-devin/hooks/worktree-binding-guard.sh +79 -0
- package/plugins/lisa-devin/hooks.json +247 -0
- package/plugins/lisa-devin/rules/eager/00-rule-index.md +82 -0
- package/plugins/lisa-devin/rules/eager/base-rules.md +85 -0
- package/plugins/lisa-devin/rules/eager/coding-philosophy.md +27 -0
- package/plugins/lisa-devin/rules/eager/config-resolution.md +37 -0
- package/plugins/lisa-devin/rules/eager/do-it-now.md +11 -0
- package/plugins/lisa-devin/rules/eager/empirical-inquiry.md +24 -0
- package/plugins/lisa-devin/rules/eager/falsifiable-checks.md +48 -0
- package/plugins/lisa-devin/rules/eager/history-audit.md +27 -0
- package/plugins/lisa-devin/rules/eager/integration-access-layer.md +19 -0
- package/plugins/lisa-devin/rules/eager/intent-routing.md +18 -0
- package/plugins/lisa-devin/rules/eager/learnings-ladder.md +18 -0
- package/plugins/lisa-devin/rules/eager/local-ci-first.md +15 -0
- package/plugins/lisa-devin/rules/eager/measurement-integrity.md +18 -0
- package/plugins/lisa-devin/rules/eager/never-name-a-downstream-project.md +9 -0
- package/plugins/lisa-devin/rules/eager/not-blocked-just-waiting.md +13 -0
- package/plugins/lisa-devin/rules/eager/operational-hazards.md +50 -0
- package/plugins/lisa-devin/rules/eager/report-actionability.md +26 -0
- package/plugins/lisa-devin/rules/eager/security-audit-handling.md +40 -0
- package/plugins/lisa-devin/rules/eager/session-status-updates.md +20 -0
- package/plugins/lisa-devin/rules/eager/settled-decisions.md +75 -0
- package/plugins/lisa-devin/rules/eager/stale-state-claims.md +26 -0
- package/plugins/lisa-devin/rules/eager/tool-access-gate.md +23 -0
- package/plugins/lisa-devin/rules/eager/tracked-work.md +9 -0
- package/plugins/lisa-devin/rules/eager/upstream-to-lisa.md +14 -0
- package/plugins/lisa-devin/rules/eager/verification.md +33 -0
- package/plugins/lisa-devin/rules/eager/wiki-knowledge-source.md +13 -0
- package/plugins/lisa-devin/rules/eager/withdrawn-rulings.md +102 -0
- package/plugins/lisa-devin/rules/reference/automation-runbook-contract.md +355 -0
- package/plugins/lisa-devin/rules/reference/base-rules.md +136 -0
- package/plugins/lisa-devin/rules/reference/bdd-e2e-coverage.md +301 -0
- package/plugins/lisa-devin/rules/reference/blocker-containment.md +165 -0
- package/plugins/lisa-devin/rules/reference/claim-archaeology.md +184 -0
- package/plugins/lisa-devin/rules/reference/claim-evidence-mapping.md +362 -0
- package/plugins/lisa-devin/rules/reference/claim-time-guards.md +135 -0
- package/plugins/lisa-devin/rules/reference/coding-philosophy.md +428 -0
- package/plugins/lisa-devin/rules/reference/config-resolution.md +1225 -0
- package/plugins/lisa-devin/rules/reference/control-reachability.md +166 -0
- package/plugins/lisa-devin/rules/reference/convergent-review.md +145 -0
- package/plugins/lisa-devin/rules/reference/credential-substrate-precedence.md +249 -0
- package/plugins/lisa-devin/rules/reference/dependency-decision-records.md +177 -0
- package/plugins/lisa-devin/rules/reference/dependency-internalization-kit.md +244 -0
- package/plugins/lisa-devin/rules/reference/dependency-trust-classes.md +291 -0
- package/plugins/lisa-devin/rules/reference/deployed-state-readback.md +142 -0
- package/plugins/lisa-devin/rules/reference/derived-branch-plan.md +214 -0
- package/plugins/lisa-devin/rules/reference/design-source-of-truth.md +260 -0
- package/plugins/lisa-devin/rules/reference/design-value-binding.md +311 -0
- package/plugins/lisa-devin/rules/reference/do-it-now.md +19 -0
- package/plugins/lisa-devin/rules/reference/documentation-source-paths.md +31 -0
- package/plugins/lisa-devin/rules/reference/empirical-inquiry.md +28 -0
- package/plugins/lisa-devin/rules/reference/factory-model.md +111 -0
- package/plugins/lisa-devin/rules/reference/falsifiable-checks.md +275 -0
- package/plugins/lisa-devin/rules/reference/history-audit.md +42 -0
- package/plugins/lisa-devin/rules/reference/integration-access-layer.md +89 -0
- package/plugins/lisa-devin/rules/reference/intent-routing.md +428 -0
- package/plugins/lisa-devin/rules/reference/leaf-only-lifecycle.md +227 -0
- package/plugins/lisa-devin/rules/reference/learnings-ladder.md +41 -0
- package/plugins/lisa-devin/rules/reference/local-ci-first.md +34 -0
- package/plugins/lisa-devin/rules/reference/measurement-integrity.md +119 -0
- package/plugins/lisa-devin/rules/reference/never-name-a-downstream-project.md +37 -0
- package/plugins/lisa-devin/rules/reference/not-blocked-just-waiting.md +41 -0
- package/plugins/lisa-devin/rules/reference/observability-audit.md +146 -0
- package/plugins/lisa-devin/rules/reference/operational-hazards.md +115 -0
- package/plugins/lisa-devin/rules/reference/prd-definition-of-ready.md +118 -0
- package/plugins/lisa-devin/rules/reference/prd-lifecycle-rollup.md +192 -0
- package/plugins/lisa-devin/rules/reference/pre-flight-autofill.md +250 -0
- package/plugins/lisa-devin/rules/reference/project-learnings.md +159 -0
- package/plugins/lisa-devin/rules/reference/promotion-contract.md +148 -0
- package/plugins/lisa-devin/rules/reference/readiness-rubric.md +242 -0
- package/plugins/lisa-devin/rules/reference/ready-role-filing.md +212 -0
- package/plugins/lisa-devin/rules/reference/rejection-detection.md +308 -0
- package/plugins/lisa-devin/rules/reference/repo-scope-split.md +119 -0
- package/plugins/lisa-devin/rules/reference/report-actionability.md +61 -0
- package/plugins/lisa-devin/rules/reference/reset-seed-coverage.md +286 -0
- package/plugins/lisa-devin/rules/reference/security-audit-handling.md +55 -0
- package/plugins/lisa-devin/rules/reference/session-status-updates.md +111 -0
- package/plugins/lisa-devin/rules/reference/settled-decisions.md +39 -0
- package/plugins/lisa-devin/rules/reference/stale-state-claims.md +88 -0
- package/plugins/lisa-devin/rules/reference/tool-access-gate.md +114 -0
- package/plugins/lisa-devin/rules/reference/tracked-work.md +49 -0
- package/plugins/lisa-devin/rules/reference/upstream-to-lisa.md +26 -0
- package/plugins/lisa-devin/rules/reference/usage-accounting.md +261 -0
- package/plugins/lisa-devin/rules/reference/verification.md +278 -0
- package/plugins/lisa-devin/rules/reference/wiki-knowledge-source.md +37 -0
- package/plugins/lisa-devin/rules/reference/withdrawn-rulings.md +148 -0
- package/plugins/lisa-devin/rules/reference/work-item-definition-of-ready.md +177 -0
- package/plugins/lisa-devin/rules/reference/work-item-trailer-definition.md +129 -0
- package/plugins/lisa-devin/scripts/automation-run-record.mjs +678 -0
- package/plugins/lisa-devin/scripts/automation-status-claude-adapter.mjs +804 -0
- package/plugins/lisa-devin/scripts/automation-status-codex-adapter.mjs +1081 -0
- package/plugins/lisa-devin/scripts/automation-status-contract-drift.mjs +392 -0
- package/plugins/lisa-devin/scripts/automation-status-expected-fleet.mjs +508 -0
- package/plugins/lisa-devin/scripts/automation-status-report.mjs +200 -0
- package/plugins/lisa-devin/scripts/automation-status-run-history.mjs +216 -0
- package/plugins/lisa-devin/scripts/automation-status-unrecorded-runs.mjs +127 -0
- package/plugins/lisa-devin/scripts/blocker-edge-resolution.mjs +150 -0
- package/plugins/lisa-devin/scripts/cross-pollinate.mjs +763 -0
- package/plugins/lisa-devin/scripts/design-bindings-probe.mjs +713 -0
- package/plugins/lisa-devin/scripts/design-intake-gate.mjs +470 -0
- package/plugins/lisa-devin/scripts/design-source-gate.mjs +610 -0
- package/plugins/lisa-devin/scripts/design-variable-ids.mjs +567 -0
- package/plugins/lisa-devin/scripts/doctor-report.mjs +635 -0
- package/plugins/lisa-devin/scripts/install-remote-agent-aws.mjs +443 -0
- package/plugins/lisa-devin/scripts/intake-blocker-reprobe.mjs +1065 -0
- package/plugins/lisa-devin/scripts/intake-prework-denominator.mjs +249 -0
- package/plugins/lisa-devin/scripts/lifecycle-label-trust.mjs +593 -0
- package/plugins/lisa-devin/scripts/linear-state-write-target.mjs +362 -0
- package/plugins/lisa-devin/scripts/plugin-sync-explain.mjs +654 -0
- package/plugins/lisa-devin/scripts/pr-arming-sweep.mjs +561 -0
- package/plugins/lisa-devin/scripts/project-ideation-idempotency-harness.mjs +338 -0
- package/plugins/lisa-devin/scripts/qa-signal-lifecycle.mjs +523 -0
- package/plugins/lisa-devin/scripts/queue-contract-resolution.mjs +583 -0
- package/plugins/lisa-devin/scripts/queue-health-classification.mjs +157 -0
- package/plugins/lisa-devin/scripts/queue-status-build-readers.mjs +561 -0
- package/plugins/lisa-devin/scripts/queue-status-prd-readers.mjs +452 -0
- package/plugins/lisa-devin/scripts/remote-agent-aws-setup.sh +677 -0
- package/plugins/lisa-devin/scripts/repo-scope-vocabulary-audit.mjs +458 -0
- package/plugins/lisa-devin/scripts/resolve-lifecycle-role.mjs +347 -0
- package/plugins/lisa-devin/scripts/rollup-blocker-classification.mjs +616 -0
- package/plugins/lisa-devin/scripts/scoping-label-audit.mjs +474 -0
- package/plugins/lisa-devin/skills/lisa-acceptance-criteria/SKILL.md +73 -0
- package/plugins/lisa-devin/skills/lisa-agent-design-best-practices/SKILL.md +242 -0
- package/plugins/lisa-devin/skills/lisa-agent-ready/SKILL.md +271 -0
- package/plugins/lisa-devin/skills/lisa-analyze-claude-remote/SKILL.md +434 -0
- package/plugins/lisa-devin/skills/lisa-atlassian-access/SKILL.md +469 -0
- package/plugins/lisa-devin/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs +236 -0
- package/plugins/lisa-devin/skills/lisa-attribute-failure/SKILL.md +142 -0
- package/plugins/lisa-devin/skills/lisa-automation-status/SKILL.md +149 -0
- package/plugins/lisa-devin/skills/lisa-bug-triage/SKILL.md +23 -0
- package/plugins/lisa-devin/skills/lisa-capability-drift/SKILL.md +71 -0
- package/plugins/lisa-devin/skills/lisa-codebase-research/SKILL.md +87 -0
- package/plugins/lisa-devin/skills/lisa-codify-verification/SKILL.md +213 -0
- package/plugins/lisa-devin/skills/lisa-confluence-prd-intake/SKILL.md +417 -0
- package/plugins/lisa-devin/skills/lisa-confluence-to-tracker/SKILL.md +469 -0
- package/plugins/lisa-devin/skills/lisa-confluence-write-prd/SKILL.md +111 -0
- package/plugins/lisa-devin/skills/lisa-cross-pollinate/SKILL.md +175 -0
- package/plugins/lisa-devin/skills/lisa-debrief/SKILL.md +96 -0
- package/plugins/lisa-devin/skills/lisa-debrief-apply/SKILL.md +106 -0
- package/plugins/lisa-devin/skills/lisa-delivery-effectiveness/SKILL.md +62 -0
- package/plugins/lisa-devin/skills/lisa-design-intake/SKILL.md +198 -0
- package/plugins/lisa-devin/skills/lisa-detect-tooling/SKILL.md +110 -0
- package/plugins/lisa-devin/skills/lisa-detect-tooling/scripts/commands.mjs +479 -0
- package/plugins/lisa-devin/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +658 -0
- package/plugins/lisa-devin/skills/lisa-doctor/SKILL.md +743 -0
- package/plugins/lisa-devin/skills/lisa-drive-pr-to-merge/SKILL.md +1587 -0
- package/plugins/lisa-devin/skills/lisa-epic-triage/SKILL.md +28 -0
- package/plugins/lisa-devin/skills/lisa-evaluation-suite/SKILL.md +63 -0
- package/plugins/lisa-devin/skills/lisa-exploratory-qa/SKILL.md +185 -0
- package/plugins/lisa-devin/skills/lisa-fix-linter-error/SKILL.md +45 -0
- package/plugins/lisa-devin/skills/lisa-generate-claude-remote-build-script/SKILL.md +235 -0
- package/plugins/lisa-devin/skills/lisa-git-commit/SKILL.md +53 -0
- package/plugins/lisa-devin/skills/lisa-git-prune/SKILL.md +35 -0
- package/plugins/lisa-devin/skills/lisa-git-submit-pr/SKILL.md +170 -0
- package/plugins/lisa-devin/skills/lisa-github-add-journey/SKILL.md +118 -0
- package/plugins/lisa-devin/skills/lisa-github-build-intake/SKILL.md +745 -0
- package/plugins/lisa-devin/skills/lisa-github-claim/SKILL.md +27 -0
- package/plugins/lisa-devin/skills/lisa-github-create/SKILL.md +105 -0
- package/plugins/lisa-devin/skills/lisa-github-evidence/SKILL.md +120 -0
- package/plugins/lisa-devin/skills/lisa-github-journey/SKILL.md +134 -0
- package/plugins/lisa-devin/skills/lisa-github-prd-intake/SKILL.md +424 -0
- package/plugins/lisa-devin/skills/lisa-github-project-v2/SKILL.md +227 -0
- package/plugins/lisa-devin/skills/lisa-github-read-issue/SKILL.md +305 -0
- package/plugins/lisa-devin/skills/lisa-github-sync/SKILL.md +201 -0
- package/plugins/lisa-devin/skills/lisa-github-to-tracker/SKILL.md +456 -0
- package/plugins/lisa-devin/skills/lisa-github-validate-issue/SKILL.md +598 -0
- package/plugins/lisa-devin/skills/lisa-github-verify/SKILL.md +60 -0
- package/plugins/lisa-devin/skills/lisa-github-write-issue/SKILL.md +531 -0
- package/plugins/lisa-devin/skills/lisa-github-write-prd/SKILL.md +156 -0
- package/plugins/lisa-devin/skills/lisa-health/SKILL.md +142 -0
- package/plugins/lisa-devin/skills/lisa-health-drift-cron/SKILL.md +80 -0
- package/plugins/lisa-devin/skills/lisa-implement/SKILL.md +372 -0
- package/plugins/lisa-devin/skills/lisa-improve-code-complexity/SKILL.md +44 -0
- package/plugins/lisa-devin/skills/lisa-improve-harness/SKILL.md +487 -0
- package/plugins/lisa-devin/skills/lisa-improve-max-lines/SKILL.md +45 -0
- package/plugins/lisa-devin/skills/lisa-improve-max-lines-per-function/SKILL.md +46 -0
- package/plugins/lisa-devin/skills/lisa-improve-test-coverage/SKILL.md +47 -0
- package/plugins/lisa-devin/skills/lisa-improve-tests/SKILL.md +50 -0
- package/plugins/lisa-devin/skills/lisa-intake/SKILL.md +208 -0
- package/plugins/lisa-devin/skills/lisa-intake-explain/SKILL.md +279 -0
- package/plugins/lisa-devin/skills/lisa-jam-access/SKILL.md +128 -0
- package/plugins/lisa-devin/skills/lisa-jira-add-journey/SKILL.md +139 -0
- package/plugins/lisa-devin/skills/lisa-jira-build-intake/SKILL.md +556 -0
- package/plugins/lisa-devin/skills/lisa-jira-claim/SKILL.md +27 -0
- package/plugins/lisa-devin/skills/lisa-jira-create/SKILL.md +157 -0
- package/plugins/lisa-devin/skills/lisa-jira-evidence/SKILL.md +106 -0
- package/plugins/lisa-devin/skills/lisa-jira-evidence/scripts/post-evidence.sh +262 -0
- package/plugins/lisa-devin/skills/lisa-jira-journey/SKILL.md +168 -0
- package/plugins/lisa-devin/skills/lisa-jira-journey/scripts/generate-templates.py +239 -0
- package/plugins/lisa-devin/skills/lisa-jira-journey/scripts/parse-plan.py +570 -0
- package/plugins/lisa-devin/skills/lisa-jira-read-ticket/SKILL.md +199 -0
- package/plugins/lisa-devin/skills/lisa-jira-read-ticket/scripts/download-attachment.sh +211 -0
- package/plugins/lisa-devin/skills/lisa-jira-sync/SKILL.md +117 -0
- package/plugins/lisa-devin/skills/lisa-jira-validate-ticket/SKILL.md +525 -0
- package/plugins/lisa-devin/skills/lisa-jira-verify/SKILL.md +61 -0
- package/plugins/lisa-devin/skills/lisa-jira-write-ticket/SKILL.md +440 -0
- package/plugins/lisa-devin/skills/lisa-jsdoc-best-practices/SKILL.md +491 -0
- package/plugins/lisa-devin/skills/lisa-kane-browser/SKILL.md +80 -0
- package/plugins/lisa-devin/skills/lisa-learnings-audit/SKILL.md +490 -0
- package/plugins/lisa-devin/skills/lisa-linear-access/SKILL.md +483 -0
- package/plugins/lisa-devin/skills/lisa-linear-add-journey/SKILL.md +109 -0
- package/plugins/lisa-devin/skills/lisa-linear-build-intake/SKILL.md +548 -0
- package/plugins/lisa-devin/skills/lisa-linear-claim/SKILL.md +28 -0
- package/plugins/lisa-devin/skills/lisa-linear-create/SKILL.md +150 -0
- package/plugins/lisa-devin/skills/lisa-linear-evidence/SKILL.md +124 -0
- package/plugins/lisa-devin/skills/lisa-linear-journey/SKILL.md +147 -0
- package/plugins/lisa-devin/skills/lisa-linear-prd-intake/SKILL.md +411 -0
- package/plugins/lisa-devin/skills/lisa-linear-read-issue/SKILL.md +201 -0
- package/plugins/lisa-devin/skills/lisa-linear-sync/SKILL.md +164 -0
- package/plugins/lisa-devin/skills/lisa-linear-to-tracker/SKILL.md +454 -0
- package/plugins/lisa-devin/skills/lisa-linear-validate-issue/SKILL.md +504 -0
- package/plugins/lisa-devin/skills/lisa-linear-verify/SKILL.md +65 -0
- package/plugins/lisa-devin/skills/lisa-linear-write-issue/SKILL.md +448 -0
- package/plugins/lisa-devin/skills/lisa-linear-write-prd/SKILL.md +98 -0
- package/plugins/lisa-devin/skills/lisa-monitor/SKILL.md +224 -0
- package/plugins/lisa-devin/skills/lisa-nightly-add-test-coverage/SKILL.md +40 -0
- package/plugins/lisa-devin/skills/lisa-nightly-improve-tests/SKILL.md +29 -0
- package/plugins/lisa-devin/skills/lisa-nightly-lower-code-complexity/SKILL.md +42 -0
- package/plugins/lisa-devin/skills/lisa-notion-access/SKILL.md +301 -0
- package/plugins/lisa-devin/skills/lisa-notion-prd-intake/SKILL.md +360 -0
- package/plugins/lisa-devin/skills/lisa-notion-to-tracker/SKILL.md +467 -0
- package/plugins/lisa-devin/skills/lisa-notion-write-prd/SKILL.md +111 -0
- package/plugins/lisa-devin/skills/lisa-parity-code-review/SKILL.md +83 -0
- package/plugins/lisa-devin/skills/lisa-parity-code-simplifier/SKILL.md +76 -0
- package/plugins/lisa-devin/skills/lisa-parity-coderabbit/SKILL.md +87 -0
- package/plugins/lisa-devin/skills/lisa-parity-sentry-sdk-setup/SKILL.md +375 -0
- package/plugins/lisa-devin/skills/lisa-parity-sentry-seer/SKILL.md +168 -0
- package/plugins/lisa-devin/skills/lisa-parity-skill-creator/SKILL.md +155 -0
- package/plugins/lisa-devin/skills/lisa-performance-review/SKILL.md +94 -0
- package/plugins/lisa-devin/skills/lisa-persist-learning/SKILL.md +247 -0
- package/plugins/lisa-devin/skills/lisa-plan/SKILL.md +64 -0
- package/plugins/lisa-devin/skills/lisa-plugin-sync-explain/SKILL.md +53 -0
- package/plugins/lisa-devin/skills/lisa-posthog-access/SKILL.md +140 -0
- package/plugins/lisa-devin/skills/lisa-prd-backlink/SKILL.md +274 -0
- package/plugins/lisa-devin/skills/lisa-prd-source-write/SKILL.md +104 -0
- package/plugins/lisa-devin/skills/lisa-prd-ticket-coverage/SKILL.md +187 -0
- package/plugins/lisa-devin/skills/lisa-product-walkthrough/SKILL.md +106 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/SKILL.md +417 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/examples/evidence-card-format.md +21 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/examples/host-project-only.md +22 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/examples/idempotency-verification-harness.md +57 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/examples/public-external-inspiration.md +22 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/examples/unavailable-data-rejection.md +22 -0
- package/plugins/lisa-devin/skills/lisa-pull-request-review/SKILL.md +132 -0
- package/plugins/lisa-devin/skills/lisa-quality-review/SKILL.md +63 -0
- package/plugins/lisa-devin/skills/lisa-queue-status/SKILL.md +215 -0
- package/plugins/lisa-devin/skills/lisa-remote-dispatch/SKILL.md +109 -0
- package/plugins/lisa-devin/skills/lisa-remote-dispatch/scripts/dispatch.mjs +535 -0
- package/plugins/lisa-devin/skills/lisa-repair-intake/SKILL.md +1621 -0
- package/plugins/lisa-devin/skills/lisa-reproduce-bug/SKILL.md +75 -0
- package/plugins/lisa-devin/skills/lisa-research/SKILL.md +92 -0
- package/plugins/lisa-devin/skills/lisa-review-implementation/SKILL.md +209 -0
- package/plugins/lisa-devin/skills/lisa-review-local/SKILL.md +141 -0
- package/plugins/lisa-devin/skills/lisa-rework-triage/SKILL.md +206 -0
- package/plugins/lisa-devin/skills/lisa-root-cause-analysis/SKILL.md +135 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/SKILL.md +430 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/aws-bootstrap.mjs +433 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/bootstrap-store.mjs +288 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +273 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/envfile.mjs +80 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/inspect-vault.mjs +142 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +1085 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/note-format.mjs +179 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/owner.mjs +96 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/preflight-secrets.mjs +342 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/prompt-secret.mjs +79 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/providers.mjs +805 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +680 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/read-secret-note.mjs +105 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/resolve-expo-token.mjs +90 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/resolve-secret.mjs +285 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/rotate-secret.mjs +297 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/routing-floor.mjs +153 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/surfaces.mjs +480 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +510 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/tools-from-notes.mjs +63 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/validate-config.mjs +550 -0
- package/plugins/lisa-devin/skills/lisa-security-review/SKILL.md +124 -0
- package/plugins/lisa-devin/skills/lisa-security-zap-scan/SKILL.md +53 -0
- package/plugins/lisa-devin/skills/lisa-sentry-access/SKILL.md +140 -0
- package/plugins/lisa-devin/skills/lisa-setup-atlassian/SKILL.md +407 -0
- package/plugins/lisa-devin/skills/lisa-setup-automations/SKILL.md +430 -0
- package/plugins/lisa-devin/skills/lisa-setup-automations/scripts/generate-workflow.mjs +288 -0
- package/plugins/lisa-devin/skills/lisa-setup-confluence/SKILL.md +254 -0
- package/plugins/lisa-devin/skills/lisa-setup-github/SKILL.md +319 -0
- package/plugins/lisa-devin/skills/lisa-setup-github-repo/SKILL.md +128 -0
- package/plugins/lisa-devin/skills/lisa-setup-jira/SKILL.md +198 -0
- package/plugins/lisa-devin/skills/lisa-setup-kane/SKILL.md +96 -0
- package/plugins/lisa-devin/skills/lisa-setup-linear/SKILL.md +375 -0
- package/plugins/lisa-devin/skills/lisa-setup-local-env/SKILL.md +95 -0
- package/plugins/lisa-devin/skills/lisa-setup-local-env/scripts/local-env.mjs +196 -0
- package/plugins/lisa-devin/skills/lisa-setup-notion/SKILL.md +376 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-aws/SKILL.md +149 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/SKILL.md +382 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/assets/materialized-env-authority.mjs +262 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/assets/session-start.sh +87 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/assets/setup.sh +216 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/environment.mjs +227 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/preflight-tools.mjs +378 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +1632 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/tool-floor.mjs +94 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/toolchain.mjs +448 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs +250 -0
- package/plugins/lisa-devin/skills/lisa-setup-sonar/SKILL.md +153 -0
- package/plugins/lisa-devin/skills/lisa-setup-workstation/SKILL.md +143 -0
- package/plugins/lisa-devin/skills/lisa-setup-workstation/scripts/bounded-child.mjs +168 -0
- package/plugins/lisa-devin/skills/lisa-setup-workstation/scripts/catalogue.mjs +293 -0
- package/plugins/lisa-devin/skills/lisa-setup-workstation/scripts/cli.mjs +333 -0
- package/plugins/lisa-devin/skills/lisa-setup-workstation/scripts/workstation.mjs +511 -0
- package/plugins/lisa-devin/skills/lisa-sonarcloud-access/SKILL.md +202 -0
- package/plugins/lisa-devin/skills/lisa-spec-conformance/SKILL.md +205 -0
- package/plugins/lisa-devin/skills/lisa-starter-sync/SKILL.md +35 -0
- package/plugins/lisa-devin/skills/lisa-sync-down/SKILL.md +209 -0
- package/plugins/lisa-devin/skills/lisa-task-decomposition/SKILL.md +195 -0
- package/plugins/lisa-devin/skills/lisa-task-triage/SKILL.md +23 -0
- package/plugins/lisa-devin/skills/lisa-tdd-implementation/SKILL.md +91 -0
- package/plugins/lisa-devin/skills/lisa-tear-down-automations/SKILL.md +85 -0
- package/plugins/lisa-devin/skills/lisa-test-strategy/SKILL.md +66 -0
- package/plugins/lisa-devin/skills/lisa-ticket-triage/SKILL.md +214 -0
- package/plugins/lisa-devin/skills/lisa-track/SKILL.md +129 -0
- package/plugins/lisa-devin/skills/lisa-tracker-add-journey/SKILL.md +28 -0
- package/plugins/lisa-devin/skills/lisa-tracker-build-intake/SKILL.md +134 -0
- package/plugins/lisa-devin/skills/lisa-tracker-claim/SKILL.md +35 -0
- package/plugins/lisa-devin/skills/lisa-tracker-create/SKILL.md +28 -0
- package/plugins/lisa-devin/skills/lisa-tracker-evidence/SKILL.md +63 -0
- package/plugins/lisa-devin/skills/lisa-tracker-journey/SKILL.md +27 -0
- package/plugins/lisa-devin/skills/lisa-tracker-read/SKILL.md +28 -0
- package/plugins/lisa-devin/skills/lisa-tracker-source-artifacts/SKILL.md +111 -0
- package/plugins/lisa-devin/skills/lisa-tracker-sync/SKILL.md +150 -0
- package/plugins/lisa-devin/skills/lisa-tracker-validate/SKILL.md +37 -0
- package/plugins/lisa-devin/skills/lisa-tracker-verify/SKILL.md +29 -0
- package/plugins/lisa-devin/skills/lisa-tracker-write/SKILL.md +55 -0
- package/plugins/lisa-devin/skills/lisa-usage-accounting/SKILL.md +205 -0
- package/plugins/lisa-devin/skills/lisa-usage-accounting/references/effectiveness.md +63 -0
- package/plugins/lisa-devin/skills/lisa-use-the-product/SKILL.md +86 -0
- package/plugins/lisa-devin/skills/lisa-validate-tracker-mapping/SKILL.md +467 -0
- package/plugins/lisa-devin/skills/lisa-verification-lifecycle/SKILL.md +384 -0
- package/plugins/lisa-devin/skills/lisa-verify/SKILL.md +55 -0
- package/plugins/lisa-devin/skills/lisa-verify-prd/SKILL.md +394 -0
- package/plugins/lisa-devin/skills/lisa-verify-workflow-change/SKILL.md +154 -0
- package/plugins/lisa-devin/skills/lisa-wiki-install/SKILL.md +101 -0
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-expo-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-expo-devin/.mcp.json +8 -0
- package/plugins/lisa-expo-devin/THIRD-PARTY-NOTICES.md +84 -0
- package/plugins/lisa-expo-devin/agents/ops-specialist.md +124 -0
- package/plugins/lisa-expo-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-expo-devin/hooks/register-maestro-mcp.sh +84 -0
- package/plugins/lisa-expo-devin/hooks.json +14 -0
- package/plugins/lisa-expo-devin/skills/add-app-clip/SKILL.md +280 -0
- package/plugins/lisa-expo-devin/skills/add-app-clip/references/native-module.md +96 -0
- package/plugins/lisa-expo-devin/skills/apollo-client/SKILL.md +238 -0
- package/plugins/lisa-expo-devin/skills/apollo-client/references/mutation-patterns.md +360 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/SKILL.md +369 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/references/atomic-levels.md +417 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/references/folder-structure.md +257 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/references/gluestack-mapping.md +233 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/scripts/test_validate_atomic_structure.py +240 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +438 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/SKILL.md +321 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/animations.md +220 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/controls.md +272 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/form-sheet.md +253 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/gradients.md +106 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/icons.md +213 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/media.md +198 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/route-structure.md +229 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/search.md +248 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/storage.md +121 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/tabs.md +433 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/toolbar-and-headers.md +284 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/visual-effects.md +197 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/webgpu-three.md +605 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/zoom-transitions.md +158 -0
- package/plugins/lisa-expo-devin/skills/container-view-pattern/SKILL.md +355 -0
- package/plugins/lisa-expo-devin/skills/container-view-pattern/references/examples.md +749 -0
- package/plugins/lisa-expo-devin/skills/container-view-pattern/references/patterns.md +318 -0
- package/plugins/lisa-expo-devin/skills/container-view-pattern/scripts/create_component.py +200 -0
- package/plugins/lisa-expo-devin/skills/container-view-pattern/scripts/validate_component.py +332 -0
- package/plugins/lisa-expo-devin/skills/cross-platform-compatibility/SKILL.md +268 -0
- package/plugins/lisa-expo-devin/skills/cross-platform-compatibility/references/common-issues.md +619 -0
- package/plugins/lisa-expo-devin/skills/cross-platform-compatibility/references/file-extensions.md +340 -0
- package/plugins/lisa-expo-devin/skills/cross-platform-compatibility/references/platform-api.md +276 -0
- package/plugins/lisa-expo-devin/skills/cross-platform-compatibility/scripts/validate_cross_platform.py +416 -0
- package/plugins/lisa-expo-devin/skills/directory-structure/SKILL.md +214 -0
- package/plugins/lisa-expo-devin/skills/directory-structure/scripts/validate_structure.py +454 -0
- package/plugins/lisa-expo-devin/skills/e2e-coverage-gaps/SKILL.md +117 -0
- package/plugins/lisa-expo-devin/skills/eas-update-insights/SKILL.md +228 -0
- package/plugins/lisa-expo-devin/skills/eas-update-insights/references/channel-insights-schema.md +47 -0
- package/plugins/lisa-expo-devin/skills/eas-update-insights/references/update-insights-schema.md +69 -0
- package/plugins/lisa-expo-devin/skills/expo-api-routes/SKILL.md +369 -0
- package/plugins/lisa-expo-devin/skills/expo-brownfield/SKILL.md +54 -0
- package/plugins/lisa-expo-devin/skills/expo-brownfield/references/brownfield-integrated.md +526 -0
- package/plugins/lisa-expo-devin/skills/expo-brownfield/references/brownfield-isolated.md +402 -0
- package/plugins/lisa-expo-devin/skills/expo-brownfield/references/comparison.md +63 -0
- package/plugins/lisa-expo-devin/skills/expo-brownfield/references/troubleshooting.md +88 -0
- package/plugins/lisa-expo-devin/skills/expo-cicd-workflows/SKILL.md +92 -0
- package/plugins/lisa-expo-devin/skills/expo-cicd-workflows/scripts/fetch.js +113 -0
- package/plugins/lisa-expo-devin/skills/expo-cicd-workflows/scripts/package.json +11 -0
- package/plugins/lisa-expo-devin/skills/expo-cicd-workflows/scripts/validate.js +85 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/SKILL.md +193 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/references/app-store-metadata.md +479 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/references/ios-app-store.md +355 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/references/play-store.md +264 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/references/testflight.md +58 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/references/workflows.md +200 -0
- package/plugins/lisa-expo-devin/skills/expo-dev-client/SKILL.md +164 -0
- package/plugins/lisa-expo-devin/skills/expo-env-config/SKILL.md +309 -0
- package/plugins/lisa-expo-devin/skills/expo-env-config/references/validation-patterns.md +417 -0
- package/plugins/lisa-expo-devin/skills/expo-module/SKILL.md +141 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/config-plugin.md +90 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/create-expo-module.md +206 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/lifecycle.md +127 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/module-config.md +48 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/native-module.md +286 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/native-view.md +171 -0
- package/plugins/lisa-expo-devin/skills/expo-router-best-practices/SKILL.md +432 -0
- package/plugins/lisa-expo-devin/skills/expo-router-best-practices/references/official-docs.md +290 -0
- package/plugins/lisa-expo-devin/skills/expo-router-best-practices/references/static-export-verification.md +54 -0
- package/plugins/lisa-expo-devin/skills/expo-router-best-practices/scripts/generate-route.py +171 -0
- package/plugins/lisa-expo-devin/skills/expo-tailwind-setup/SKILL.md +487 -0
- package/plugins/lisa-expo-devin/skills/expo-ui-jetpack-compose/SKILL.md +40 -0
- package/plugins/lisa-expo-devin/skills/expo-ui-swift-ui/SKILL.md +39 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/SKILL.md +419 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/references/color-tokens.md +343 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/references/component-mapping.md +307 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/references/spacing-scale.md +300 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/scripts/test_validate_styling.py +240 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/scripts/validate_styling.py +424 -0
- package/plugins/lisa-expo-devin/skills/jira-add-journey/SKILL.md +140 -0
- package/plugins/lisa-expo-devin/skills/jira-create/SKILL.md +161 -0
- package/plugins/lisa-expo-devin/skills/jira-evidence/SKILL.md +84 -0
- package/plugins/lisa-expo-devin/skills/jira-evidence/scripts/post-evidence.sh +262 -0
- package/plugins/lisa-expo-devin/skills/jira-journey/SKILL.md +196 -0
- package/plugins/lisa-expo-devin/skills/jira-journey/scripts/generate-templates.py +281 -0
- package/plugins/lisa-expo-devin/skills/jira-journey/scripts/parse-plan.py +400 -0
- package/plugins/lisa-expo-devin/skills/jira-verify/SKILL.md +27 -0
- package/plugins/lisa-expo-devin/skills/local-state/SKILL.md +362 -0
- package/plugins/lisa-expo-devin/skills/local-state/references/async-storage.md +505 -0
- package/plugins/lisa-expo-devin/skills/local-state/references/persistence-patterns.md +711 -0
- package/plugins/lisa-expo-devin/skills/local-state/references/reactive-variables.md +446 -0
- package/plugins/lisa-expo-devin/skills/maestro-mcp-setup/SKILL.md +144 -0
- package/plugins/lisa-expo-devin/skills/native-data-fetching/SKILL.md +507 -0
- package/plugins/lisa-expo-devin/skills/native-data-fetching/references/expo-router-loaders.md +344 -0
- package/plugins/lisa-expo-devin/skills/ops-browser-uat/SKILL.md +124 -0
- package/plugins/lisa-expo-devin/skills/ops-check-logs/SKILL.md +217 -0
- package/plugins/lisa-expo-devin/skills/ops-db-ops/SKILL.md +214 -0
- package/plugins/lisa-expo-devin/skills/ops-deploy/SKILL.md +123 -0
- package/plugins/lisa-expo-devin/skills/ops-monitor-errors/SKILL.md +99 -0
- package/plugins/lisa-expo-devin/skills/ops-performance/SKILL.md +165 -0
- package/plugins/lisa-expo-devin/skills/ops-run-local/SKILL.md +169 -0
- package/plugins/lisa-expo-devin/skills/ops-verify-health/SKILL.md +101 -0
- package/plugins/lisa-expo-devin/skills/owasp-zap/SKILL.md +61 -0
- package/plugins/lisa-expo-devin/skills/play-store-access/SKILL.md +226 -0
- package/plugins/lisa-expo-devin/skills/playwright-ci-debugging/SKILL.md +140 -0
- package/plugins/lisa-expo-devin/skills/playwright-selectors/SKILL.md +496 -0
- package/plugins/lisa-expo-devin/skills/reduce-complexity/SKILL.md +251 -0
- package/plugins/lisa-expo-devin/skills/reduce-complexity/references/extraction-strategies.md +456 -0
- package/plugins/lisa-expo-devin/skills/reduce-complexity/references/refactoring-patterns.md +557 -0
- package/plugins/lisa-expo-devin/skills/testing-library/SKILL.md +314 -0
- package/plugins/lisa-expo-devin/skills/testing-library/references/async-patterns.md +420 -0
- package/plugins/lisa-expo-devin/skills/testing-library/references/expo-router-testing.md +556 -0
- package/plugins/lisa-expo-devin/skills/testing-library/references/mocking-patterns.md +612 -0
- package/plugins/lisa-expo-devin/skills/testing-library/references/query-priority.md +291 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/SKILL.md +134 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/expo-av-to-audio.md +132 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/expo-av-to-video.md +160 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/native-tabs.md +124 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/new-architecture.md +79 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/react-19.md +79 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/react-compiler.md +59 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/react-navigation-to-expo-router.md +61 -0
- package/plugins/lisa-expo-devin/skills/use-dom/SKILL.md +417 -0
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-harper-fabric-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-harper-fabric-devin/generated-artifact-globs.txt +5 -0
- package/plugins/lisa-harper-fabric-devin/hooks/block-generated-artifact-edits.sh +141 -0
- package/plugins/lisa-harper-fabric-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-harper-fabric-devin/hooks/enforce-config-extensions.mjs +196 -0
- package/plugins/lisa-harper-fabric-devin/hooks/enforce-config-extensions.sh +46 -0
- package/plugins/lisa-harper-fabric-devin/hooks/inject-rules.sh +27 -0
- package/plugins/lisa-harper-fabric-devin/hooks.json +36 -0
- package/plugins/lisa-harper-fabric-devin/rules/eager/harper-fabric.md +31 -0
- package/plugins/lisa-harper-fabric-devin/rules/reference/harper-fabric.md +52 -0
- package/plugins/lisa-harper-fabric-devin/skills/e2e-coverage-gaps/SKILL.md +117 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-auth/SKILL.md +368 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-build-and-deploy/SKILL.md +198 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-caching/SKILL.md +265 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-component-model/SKILL.md +87 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-config-yaml/SKILL.md +283 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-operations/SKILL.md +239 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-realtime/SKILL.md +187 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-resources/SKILL.md +142 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-rest-queries/SKILL.md +403 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-schema-graphql/SKILL.md +123 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-testing/SKILL.md +254 -0
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-nestjs-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-nestjs-devin/hooks/block-migration-edits.sh +125 -0
- package/plugins/lisa-nestjs-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-nestjs-devin/hooks/lisa-edit-gate.sh +152 -0
- package/plugins/lisa-nestjs-devin/hooks.json +15 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/SKILL.md +176 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/references/advanced-features.md +527 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/references/project-patterns.md +531 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/references/quick-start.md +257 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/references/resolvers-mutations.md +413 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/references/types-scalars.md +513 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-rules/SKILL.md +560 -0
- package/plugins/lisa-nestjs-devin/skills/typeorm-patterns/SKILL.md +275 -0
- package/plugins/lisa-nestjs-devin/skills/typeorm-patterns/references/configuration-patterns.md +487 -0
- package/plugins/lisa-nestjs-devin/skills/typeorm-patterns/references/entity-patterns.md +450 -0
- package/plugins/lisa-nestjs-devin/skills/typeorm-patterns/references/observability-patterns.md +536 -0
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-devin/.claude-plugin/plugin.json +8 -0
- package/plugins/lisa-openclaw-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-connect-repo-topic/SKILL.md +163 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +185 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-connect-staff/SKILL.md +175 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-connect-staff/references/platform-routing.md +123 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-connect-staff/references/prompts.md +78 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-setup/SKILL.md +141 -0
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-phaser-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-phaser-devin/agents/accessibility-advocate.md +55 -0
- package/plugins/lisa-phaser-devin/agents/art-director.md +90 -0
- package/plugins/lisa-phaser-devin/agents/audio-director.md +65 -0
- package/plugins/lisa-phaser-devin/agents/combat-designer.md +61 -0
- package/plugins/lisa-phaser-devin/agents/economy-designer.md +59 -0
- package/plugins/lisa-phaser-devin/agents/game-designer.md +62 -0
- package/plugins/lisa-phaser-devin/agents/game-feel-specialist.md +56 -0
- package/plugins/lisa-phaser-devin/agents/level-designer.md +59 -0
- package/plugins/lisa-phaser-devin/agents/localization-manager.md +61 -0
- package/plugins/lisa-phaser-devin/agents/marketing-strategist.md +59 -0
- package/plugins/lisa-phaser-devin/agents/monetization-designer.md +59 -0
- package/plugins/lisa-phaser-devin/agents/narrative-designer.md +56 -0
- package/plugins/lisa-phaser-devin/agents/onboarding-advocate.md +59 -0
- package/plugins/lisa-phaser-devin/agents/player-advocate.md +57 -0
- package/plugins/lisa-phaser-devin/agents/producer.md +61 -0
- package/plugins/lisa-phaser-devin/agents/product-analyst.md +62 -0
- package/plugins/lisa-phaser-devin/agents/publisher.md +59 -0
- package/plugins/lisa-phaser-devin/agents/qa-playtester.md +57 -0
- package/plugins/lisa-phaser-devin/agents/target-player.md +52 -0
- package/plugins/lisa-phaser-devin/agents/ux-ui-designer.md +60 -0
- package/plugins/lisa-phaser-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-phaser-devin/hooks/inject-rules.sh +27 -0
- package/plugins/lisa-phaser-devin/hooks.json +14 -0
- package/plugins/lisa-phaser-devin/rules/eager/phaser.md +44 -0
- package/plugins/lisa-phaser-devin/rules/reference/phaser.md +184 -0
- package/plugins/lisa-phaser-devin/skills/phaser-accessibility/SKILL.md +135 -0
- package/plugins/lisa-phaser-devin/skills/phaser-asset-pipeline/SKILL.md +222 -0
- package/plugins/lisa-phaser-devin/skills/phaser-asset-sourcing/SKILL.md +151 -0
- package/plugins/lisa-phaser-devin/skills/phaser-build-deploy/SKILL.md +153 -0
- package/plugins/lisa-phaser-devin/skills/phaser-i18n/SKILL.md +122 -0
- package/plugins/lisa-phaser-devin/skills/phaser-project-structure/SKILL.md +89 -0
- package/plugins/lisa-phaser-devin/skills/phaser-services/SKILL.md +208 -0
- package/plugins/lisa-phaser-devin/skills/phaser-testing/SKILL.md +192 -0
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-rails-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-rails-devin/agents/ops-specialist.md +226 -0
- package/plugins/lisa-rails-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-rails-devin/hooks/inject-rules.sh +40 -0
- package/plugins/lisa-rails-devin/hooks/lisa-edit-gate.sh +152 -0
- package/plugins/lisa-rails-devin/hooks/rubocop-on-edit.sh +101 -0
- package/plugins/lisa-rails-devin/hooks/sg-scan-on-edit.sh +97 -0
- package/plugins/lisa-rails-devin/hooks.json +29 -0
- package/plugins/lisa-rails-devin/rules/eager/rails-conventions.md +23 -0
- package/plugins/lisa-rails-devin/rules/reference/rails-conventions.md +176 -0
- package/plugins/lisa-rails-devin/skills/action-controller-best-practices/SKILL.md +374 -0
- package/plugins/lisa-rails-devin/skills/action-view-best-practices/SKILL.md +335 -0
- package/plugins/lisa-rails-devin/skills/active-record-model-best-practices/SKILL.md +166 -0
- package/plugins/lisa-rails-devin/skills/e2e-coverage-gaps/SKILL.md +117 -0
- package/plugins/lisa-rails-devin/skills/fix-linter-error/SKILL.md +45 -0
- package/plugins/lisa-rails-devin/skills/improve-code-complexity/SKILL.md +51 -0
- package/plugins/lisa-rails-devin/skills/improve-max-lines/SKILL.md +46 -0
- package/plugins/lisa-rails-devin/skills/improve-max-lines-per-function/SKILL.md +46 -0
- package/plugins/lisa-rails-devin/skills/improve-test-coverage/SKILL.md +48 -0
- package/plugins/lisa-rails-devin/skills/jira-add-journey/SKILL.md +79 -0
- package/plugins/lisa-rails-devin/skills/jira-create/SKILL.md +100 -0
- package/plugins/lisa-rails-devin/skills/jira-evidence/SKILL.md +76 -0
- package/plugins/lisa-rails-devin/skills/jira-evidence/scripts/post-evidence.sh +262 -0
- package/plugins/lisa-rails-devin/skills/jira-journey/SKILL.md +65 -0
- package/plugins/lisa-rails-devin/skills/jira-verify/SKILL.md +26 -0
- package/plugins/lisa-rails-devin/skills/ops-check-logs/SKILL.md +191 -0
- package/plugins/lisa-rails-devin/skills/ops-deploy/SKILL.md +153 -0
- package/plugins/lisa-rails-devin/skills/ops-run-local/SKILL.md +169 -0
- package/plugins/lisa-rails-devin/skills/ops-verify-jobs/SKILL.md +157 -0
- package/plugins/lisa-rails-devin/skills/ops-verify-telemetry/SKILL.md +226 -0
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-typescript-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-typescript-devin/hooks/block-suppress-directives.sh +141 -0
- package/plugins/lisa-typescript-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-typescript-devin/hooks/format-on-edit.sh +102 -0
- package/plugins/lisa-typescript-devin/hooks/lint-on-edit.sh +117 -0
- package/plugins/lisa-typescript-devin/hooks/lisa-edit-gate.sh +152 -0
- package/plugins/lisa-typescript-devin/hooks/sg-scan-on-edit.sh +94 -0
- package/plugins/lisa-typescript-devin/hooks.json +34 -0
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-devin/.claude-plugin/plugin.json +8 -0
- package/plugins/lisa-wiki-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-wiki-devin/ci/lisa-wiki-validate.yml +33 -0
- package/plugins/lisa-wiki-devin/schema/lisa-wiki-config.schema.json +162 -0
- package/plugins/lisa-wiki-devin/schema/wiki-structure.schema.json +51 -0
- package/plugins/lisa-wiki-devin/scripts/_wiki-lib.mjs +204 -0
- package/plugins/lisa-wiki-devin/scripts/diff-guard.mjs +117 -0
- package/plugins/lisa-wiki-devin/scripts/ensure-gitignore.mjs +131 -0
- package/plugins/lisa-wiki-devin/scripts/ensure-wiki.mjs +268 -0
- package/plugins/lisa-wiki-devin/scripts/ingest-git.mjs +198 -0
- package/plugins/lisa-wiki-devin/scripts/ingest-memory.mjs +135 -0
- package/plugins/lisa-wiki-devin/scripts/ingest-roles.mjs +95 -0
- package/plugins/lisa-wiki-devin/scripts/ingest_slack_channel.py +361 -0
- package/plugins/lisa-wiki-devin/scripts/lib/bounded-child.mjs +159 -0
- package/plugins/lisa-wiki-devin/scripts/lint-wiki.mjs +513 -0
- package/plugins/lisa-wiki-devin/scripts/mcp-doctor.mjs +72 -0
- package/plugins/lisa-wiki-devin/scripts/render-contract.mjs +107 -0
- package/plugins/lisa-wiki-devin/scripts/rewrite-refs.mjs +144 -0
- package/plugins/lisa-wiki-devin/scripts/slack_oauth_user.py +179 -0
- package/plugins/lisa-wiki-devin/scripts/validate-config.mjs +321 -0
- package/plugins/lisa-wiki-devin/scripts/verify-migration.mjs +203 -0
- package/plugins/lisa-wiki-devin/scripts/verify-wiki-safety.mjs +126 -0
- package/plugins/lisa-wiki-devin/scripts/wiki-safety.mjs +378 -0
- package/plugins/lisa-wiki-devin/scripts/wiki-status.mjs +345 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-add-ingest/SKILL.md +34 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-add-role/SKILL.md +35 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-confluence/SKILL.md +25 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-docs/SKILL.md +30 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-git/SKILL.md +25 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-jira/SKILL.md +28 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-memory/SKILL.md +28 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-notion/SKILL.md +25 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-roles/SKILL.md +22 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-slack/SKILL.md +30 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-web/SKILL.md +23 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-doctor/SKILL.md +47 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-ingest/SKILL.md +106 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-lint/SKILL.md +32 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-migrate/SKILL.md +43 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-onboard-me/SKILL.md +33 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-query/SKILL.md +40 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-setup/SKILL.md +75 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-setup-automations/SKILL.md +83 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-status/SKILL.md +47 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-tear-down-automations/SKILL.md +34 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-usage/SKILL.md +50 -0
- package/plugins/lisa-wiki-devin/templates/agents/role-agent.claude.md +16 -0
- package/plugins/lisa-wiki-devin/templates/agents/role-agent.codex.toml +15 -0
- package/plugins/lisa-wiki-devin/templates/index.md +17 -0
- package/plugins/lisa-wiki-devin/templates/llm-wiki-contract.md +72 -0
- package/plugins/lisa-wiki-devin/templates/log.md +8 -0
- package/plugins/lisa-wiki-devin/templates/page-types/architecture.md +18 -0
- package/plugins/lisa-wiki-devin/templates/page-types/concept.md +18 -0
- package/plugins/lisa-wiki-devin/templates/page-types/decision.md +18 -0
- package/plugins/lisa-wiki-devin/templates/page-types/entity.md +19 -0
- package/plugins/lisa-wiki-devin/templates/page-types/open-question.md +18 -0
- package/plugins/lisa-wiki-devin/templates/page-types/playbook.md +18 -0
- package/plugins/lisa-wiki-devin/templates/page-types/project.md +19 -0
- package/plugins/lisa-wiki-devin/templates/page-types/requirement.md +19 -0
- package/plugins/lisa-wiki-devin/templates/page-types/staff.md +26 -0
- package/plugins/lisa-wiki-devin/templates/start-here.md +24 -0
- package/plugins/lisa-wiki-devin/templates/state-readme.md +20 -0
- package/plugins/lisa-wiki-devin/templates/wrapper-gitignore.txt +19 -0
- package/scripts/build-plugins.sh +2 -2
- package/scripts/deployed-guard-advice.mjs +1 -0
- package/scripts/generate-devin-plugin-artifacts.mjs +263 -0
- package/scripts/lib/hook-registration-audit.mjs +3 -1
- package/scripts/lib/per-agent-hook-filter.mjs +174 -5
- package/scripts/lib/plugin-rule-citations.mjs +2 -2
|
@@ -0,0 +1,658 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Find the command-line tools a project needs but never declares.
|
|
4
|
+
*
|
|
5
|
+
* Lisa provisions tooling through several unrelated mechanisms — npm
|
|
6
|
+
* devDependencies from a stack template, MCP servers, a dedicated installer for
|
|
7
|
+
* Sonar, and the pinned `remoteEnv.tools` manifest. Only the last one puts a
|
|
8
|
+
* binary on PATH, and nothing populates it. So a project can ship npm scripts
|
|
9
|
+
* that invoke `maestro`, wire an MCP server whose CLI it also shells out to, and
|
|
10
|
+
* declare Playwright coverage thresholds, while the manifest that actually
|
|
11
|
+
* provisions binaries stays empty and every one of those fails at the moment of
|
|
12
|
+
* use rather than at setup.
|
|
13
|
+
*
|
|
14
|
+
* This program only ever *proposes*. It writes nothing, installs nothing, and
|
|
15
|
+
* emits manifest entries with the fields a human still has to fill — a pinned
|
|
16
|
+
* version, a URL, a checksum. That boundary is the point: a tool should reach a
|
|
17
|
+
* machine because someone reviewed a pinned entry, never because a detector was
|
|
18
|
+
* confident. Detection is evidence; the manifest is the decision.
|
|
19
|
+
*
|
|
20
|
+
* Usage:
|
|
21
|
+
* detect-tooling.mjs [--json]
|
|
22
|
+
* @module detect-tooling
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
import {
|
|
26
|
+
existsSync,
|
|
27
|
+
readFileSync,
|
|
28
|
+
readdirSync,
|
|
29
|
+
statSync,
|
|
30
|
+
realpathSync,
|
|
31
|
+
} from "node:fs";
|
|
32
|
+
import { fileURLToPath } from "node:url";
|
|
33
|
+
import { join } from "node:path";
|
|
34
|
+
|
|
35
|
+
import { commandsIn } from "./commands.mjs";
|
|
36
|
+
|
|
37
|
+
/** The tool named by the Expo template's scripts and its flows directory. */
|
|
38
|
+
const MAESTRO = "maestro";
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Tools Lisa or its templates invoke, and how to recognise a need for them.
|
|
42
|
+
*
|
|
43
|
+
* Deliberately conservative. A false positive costs a human a moment's review;
|
|
44
|
+
* a false negative is the failure this exists to prevent, so the signals are
|
|
45
|
+
* ones that only appear when the tool is genuinely used.
|
|
46
|
+
*/
|
|
47
|
+
const KNOWN_TOOLS = Object.freeze({
|
|
48
|
+
[MAESTRO]: {
|
|
49
|
+
// A flows directory is the artifact maestro consumes; its presence is
|
|
50
|
+
// usage, where a synced threshold default is not.
|
|
51
|
+
artifacts: ".maestro",
|
|
52
|
+
why: "Expo's template ships npm scripts that invoke `maestro`, and nothing installs the binary.",
|
|
53
|
+
mcpFallback: MAESTRO,
|
|
54
|
+
},
|
|
55
|
+
gh: {
|
|
56
|
+
why: "The work-item guardrails shell out to `gh` for every tracker read.",
|
|
57
|
+
},
|
|
58
|
+
bws: {
|
|
59
|
+
why: "The Bitwarden CLI is how every secret is resolved.",
|
|
60
|
+
},
|
|
61
|
+
"sonar-scanner": {
|
|
62
|
+
why: "Sonar analysis runs a scanner binary, which the Sonar installer configures but does not place on PATH.",
|
|
63
|
+
},
|
|
64
|
+
playwright: {
|
|
65
|
+
why: "Playwright drives browser E2E and its coverage thresholds are configured.",
|
|
66
|
+
viaNpm: "@playwright/test",
|
|
67
|
+
},
|
|
68
|
+
linear: {
|
|
69
|
+
why: "Linear reaches a container through lisa-linear-access with LINEAR_API_KEY; only the MCP path needs browser OAuth, and there is no official CLI to pin.",
|
|
70
|
+
mcpFallback: "linear-server",
|
|
71
|
+
// No official Linear CLI exists, so no proposal can name one. Kept even
|
|
72
|
+
// though the substrate allowlist normally removes Linear before this
|
|
73
|
+
// point: a second signal reaching here must not resurrect a binary that
|
|
74
|
+
// does not exist.
|
|
75
|
+
noCli: true,
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Read a JSON file, treating absence or damage as "no signal".
|
|
81
|
+
*
|
|
82
|
+
* A detector that throws on a malformed config is worse than one that misses a
|
|
83
|
+
* signal: it blocks the very command an operator runs to find out what is wrong.
|
|
84
|
+
* @param {string} path File to read.
|
|
85
|
+
* @returns {object|null} Parsed contents, or null.
|
|
86
|
+
*/
|
|
87
|
+
function readJson(path) {
|
|
88
|
+
if (!existsSync(path)) return null;
|
|
89
|
+
try {
|
|
90
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
91
|
+
} catch {
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Tools named by npm scripts, which is the strongest signal there is.
|
|
98
|
+
*
|
|
99
|
+
* A script that runs `maestro test` is a project stating it needs Maestro, in
|
|
100
|
+
* executable form. Word-boundary matched so `maestro:test` as a script *name*
|
|
101
|
+
* does not count while `maestro test` as its body does — the name is a label,
|
|
102
|
+
* the body is a dependency.
|
|
103
|
+
* @param {object|null} pkg Parsed package.json.
|
|
104
|
+
* @returns {Map<string, string>} Tool name to the script that proves it.
|
|
105
|
+
*/
|
|
106
|
+
export function toolsFromScripts(pkg) {
|
|
107
|
+
const found = new Map();
|
|
108
|
+
const scripts = pkg?.scripts ?? {};
|
|
109
|
+
for (const [name, body] of Object.entries(scripts)) {
|
|
110
|
+
if (typeof body !== "string") continue;
|
|
111
|
+
for (const tool of Object.keys(KNOWN_TOOLS)) {
|
|
112
|
+
const pattern = new RegExp(`(^|[\\s;&|(])${tool}(\\s|$)`, "u");
|
|
113
|
+
if (pattern.test(body) && !found.has(tool)) {
|
|
114
|
+
found.set(tool, `npm script "${name}": ${body.trim().slice(0, 60)}`);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return found;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** Where git hooks live, strongest signal first. */
|
|
122
|
+
const HOOK_DIRECTORIES = [".husky", join(".git", "hooks")];
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Coding agents, which a PROJECT manifest must never try to provision.
|
|
126
|
+
*
|
|
127
|
+
* A hook that shells out to `claude` is real evidence of a real dependency, but
|
|
128
|
+
* `remoteEnv.tools` is the wrong place to answer it: agents belong to the
|
|
129
|
+
* machine, not the checkout, and each is installed by its vendor's own method
|
|
130
|
+
* into a version directory it manages itself. Pinning one as a release archive
|
|
131
|
+
* would fight the self-updater that owns that directory.
|
|
132
|
+
*
|
|
133
|
+
* That layer is `lisa-setup-workstation`. Named here rather than imported from
|
|
134
|
+
* it, because a detector that stops working when a sibling skill is absent is
|
|
135
|
+
* worse than one carrying six strings.
|
|
136
|
+
*
|
|
137
|
+
* Deliberately NOT extended to `gh`, `bws`, `aws` or `sonar`: those genuinely
|
|
138
|
+
* belong in a project manifest, and `gh` going undeclared is the incident this
|
|
139
|
+
* skill was written after.
|
|
140
|
+
*/
|
|
141
|
+
const WORKSTATION_PROVISIONED = new Set([
|
|
142
|
+
"claude",
|
|
143
|
+
"codex",
|
|
144
|
+
"cursor-agent",
|
|
145
|
+
"opencode",
|
|
146
|
+
"agy",
|
|
147
|
+
"copilot",
|
|
148
|
+
]);
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Tools a git hook runs — the strongest signal a project can give.
|
|
152
|
+
*
|
|
153
|
+
* Stronger than an npm script, because a hook runs on EVERY commit and push
|
|
154
|
+
* whether anyone asked or not. A container missing one of these cannot commit at
|
|
155
|
+
* all; the failure arrives mid-task, unattended, at the moment of use.
|
|
156
|
+
*
|
|
157
|
+
* The worst shape is the guarded one. This repository's pre-commit hook wraps
|
|
158
|
+
* its secret scan in `command -v gitleaks`, so on a machine without gitleaks the
|
|
159
|
+
* scan is SKIPPED SILENTLY — the hook passes, the commit succeeds, and nothing
|
|
160
|
+
* was scanned. A guard makes the absence invisible exactly where it matters
|
|
161
|
+
* most, which is why a probed name counts as evidence rather than being read as
|
|
162
|
+
* "optional".
|
|
163
|
+
* @param {string} cwd Project root.
|
|
164
|
+
* @returns {Map<string, string>} Tool name to the hook that proves it.
|
|
165
|
+
*/
|
|
166
|
+
export function toolsFromGitHooks(cwd) {
|
|
167
|
+
const found = new Map();
|
|
168
|
+
for (const directory of HOOK_DIRECTORIES) {
|
|
169
|
+
const full = join(cwd, directory);
|
|
170
|
+
let names = [];
|
|
171
|
+
try {
|
|
172
|
+
names = readdirSync(full);
|
|
173
|
+
} catch {
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
for (const name of names.sort()) {
|
|
177
|
+
// `.sample` files ship with git and run nothing.
|
|
178
|
+
if (name.endsWith(".sample")) continue;
|
|
179
|
+
let body;
|
|
180
|
+
try {
|
|
181
|
+
body = readFileSync(join(full, name), "utf8");
|
|
182
|
+
} catch {
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
for (const tool of commandsIn(body)) {
|
|
186
|
+
if (!found.has(tool)) found.set(tool, `git hook ${directory}/${name}`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return found;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
/**
|
|
194
|
+
* Tools an npm script invokes, discovered rather than matched against a list.
|
|
195
|
+
*
|
|
196
|
+
* `toolsFromScripts` answers "which of the tools I already know about appear
|
|
197
|
+
* here". This answers the open question — what does this project actually RUN —
|
|
198
|
+
* which is the one that finds a tool nobody thought to add. An Expo project
|
|
199
|
+
* invoking `eas` from eight scripts produced nothing under the old shape,
|
|
200
|
+
* because `eas` was not in `KNOWN_TOOLS`.
|
|
201
|
+
* @param {object|null} pkg Parsed package.json.
|
|
202
|
+
* @returns {Map<string, string>} Tool name to the script that proves it.
|
|
203
|
+
*/
|
|
204
|
+
export function toolsDiscoveredInScripts(pkg) {
|
|
205
|
+
const found = new Map();
|
|
206
|
+
for (const [name, body] of Object.entries(pkg?.scripts ?? {})) {
|
|
207
|
+
if (typeof body !== "string") continue;
|
|
208
|
+
for (const tool of commandsIn(body)) {
|
|
209
|
+
if (found.has(tool)) continue;
|
|
210
|
+
found.set(tool, `npm script "${name}": ${body.trim().slice(0, 60)}`);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return found;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Whether the package manager already puts this binary on the local path.
|
|
218
|
+
*
|
|
219
|
+
* A dependency's binary lands in `node_modules/.bin`, where npm scripts resolve
|
|
220
|
+
* it without it ever being on PATH. Proposing a manifest entry for one is noise,
|
|
221
|
+
* and noise is how a detector teaches people to skim it.
|
|
222
|
+
*
|
|
223
|
+
* Only meaningful once dependencies are installed, which is why
|
|
224
|
+
* `dependenciesInstalled` exists rather than this quietly returning false on a
|
|
225
|
+
* fresh clone and over-proposing every dev tool in the project.
|
|
226
|
+
* @param {string} cwd Project root.
|
|
227
|
+
* @param {string} tool Tool name.
|
|
228
|
+
* @returns {boolean} Whether npm already provides it.
|
|
229
|
+
*/
|
|
230
|
+
export function providedByNodeModules(cwd, tool) {
|
|
231
|
+
return existsSync(join(cwd, "node_modules", ".bin", tool));
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Whether `node_modules` is populated, so its absence can be reported.
|
|
236
|
+
* @param {string} cwd Project root.
|
|
237
|
+
* @returns {boolean} Whether dependencies are installed.
|
|
238
|
+
*/
|
|
239
|
+
export function dependenciesInstalled(cwd) {
|
|
240
|
+
return existsSync(join(cwd, "node_modules", ".bin"));
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* MCP servers that are access substrates rather than evidence for a CLI.
|
|
245
|
+
*
|
|
246
|
+
* Linear is the important case: Lisa's `lisa-linear-access` skill owns the
|
|
247
|
+
* headless path through `LINEAR_API_KEY` + GraphQL. There is no official Linear
|
|
248
|
+
* CLI to pin, and the unrelated `linear` npm package is not a tracker binary.
|
|
249
|
+
* Treating the MCP server as CLI evidence would push operators toward an
|
|
250
|
+
* arbitrary third-party executable instead of the access-layer contract.
|
|
251
|
+
*/
|
|
252
|
+
/** Prefix marking evidence that shows a path is missing, not what fills it. */
|
|
253
|
+
const MCP_EVIDENCE = "MCP";
|
|
254
|
+
|
|
255
|
+
/** What to ask when the only evidence is an MCP-only integration. */
|
|
256
|
+
const REMOTE_PATH_QUESTION =
|
|
257
|
+
"no manifest entry proposed — confirm how this reaches a container: a CLI, " +
|
|
258
|
+
"a key-authenticated API call, or deliberately local-only";
|
|
259
|
+
|
|
260
|
+
const MCP_ACCESS_LAYER_SUBSTRATES = Object.freeze({
|
|
261
|
+
"linear-server":
|
|
262
|
+
"lisa-linear-access uses LINEAR_API_KEY in headless sessions",
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
/**
|
|
266
|
+
* Integrations wired only as an MCP server — the weakest signal here, and the
|
|
267
|
+
* easiest to over-read.
|
|
268
|
+
*
|
|
269
|
+
* True: an MCP server that authenticates interactively cannot authenticate in a
|
|
270
|
+
* container, so THAT path does not survive the trip.
|
|
271
|
+
*
|
|
272
|
+
* Not implied: that the integration is unavailable, or that a CLI is the
|
|
273
|
+
* answer. Linear proves both halves — its MCP server needs browser OAuth, and
|
|
274
|
+
* its GraphQL API is key-authenticated, so `lisa-linear-access` already reaches
|
|
275
|
+
* it headlessly with LINEAR_API_KEY and there is no official CLI to pin at all.
|
|
276
|
+
* A server whose access layer owns headless auth is skipped entirely.
|
|
277
|
+
*
|
|
278
|
+
* For anything else, this raises a QUESTION rather than asserting a need: this
|
|
279
|
+
* integration has no remote path as configured, confirm it has one. The answer
|
|
280
|
+
* may be a CLI, may be a direct API call, and may be "local-only on purpose".
|
|
281
|
+
* @param {object|null} mcp Parsed .mcp.json.
|
|
282
|
+
* @returns {Map<string, string>} Tool name to the server that implies it.
|
|
283
|
+
*/
|
|
284
|
+
export function toolsFromMcp(mcp) {
|
|
285
|
+
const found = new Map();
|
|
286
|
+
const servers = Object.keys(mcp?.mcpServers ?? {});
|
|
287
|
+
for (const [tool, meta] of Object.entries(KNOWN_TOOLS)) {
|
|
288
|
+
if (!meta.mcpFallback) continue;
|
|
289
|
+
const server = servers.find(name => name.includes(meta.mcpFallback));
|
|
290
|
+
if (
|
|
291
|
+
server &&
|
|
292
|
+
Object.keys(MCP_ACCESS_LAYER_SUBSTRATES).some(substrate =>
|
|
293
|
+
server.includes(substrate)
|
|
294
|
+
)
|
|
295
|
+
) {
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
if (server) {
|
|
299
|
+
found.set(
|
|
300
|
+
tool,
|
|
301
|
+
`${MCP_EVIDENCE} server "${server}" — an interactively authenticated ` +
|
|
302
|
+
`MCP server has no remote path; confirm this integration has one`
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
return found;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Tools named in credential usage notes.
|
|
311
|
+
*
|
|
312
|
+
* A note explaining what a token is *for* usually names the program that
|
|
313
|
+
* consumes it, and those notes are already readable without touching a value —
|
|
314
|
+
* `read-secret-note.mjs` exists precisely so an agent can learn a credential's
|
|
315
|
+
* blast radius safely. That makes them a first-class detection input rather than
|
|
316
|
+
* a clever trick.
|
|
317
|
+
* @param {object|null} notes Parsed secret-notes.json.
|
|
318
|
+
* @returns {Map<string, string>} Tool name to the credential that names it.
|
|
319
|
+
*/
|
|
320
|
+
export function toolsFromSecretNotes(notes) {
|
|
321
|
+
const found = new Map();
|
|
322
|
+
const entries = Object.entries(notes?.notes ?? notes ?? {});
|
|
323
|
+
for (const [secret, note] of entries) {
|
|
324
|
+
const text = typeof note === "string" ? note : JSON.stringify(note ?? "");
|
|
325
|
+
for (const tool of Object.keys(KNOWN_TOOLS)) {
|
|
326
|
+
const pattern = new RegExp(
|
|
327
|
+
`(^|[^A-Za-z0-9-])${tool}([^A-Za-z0-9-]|$)`,
|
|
328
|
+
"iu"
|
|
329
|
+
);
|
|
330
|
+
if (pattern.test(text) && !found.has(tool)) {
|
|
331
|
+
found.set(tool, `usage note on credential "${secret}"`);
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
return found;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Whether anything in the project actually reaches for this tool.
|
|
340
|
+
*
|
|
341
|
+
* Corroboration for a threshold, which on its own says only that a default was
|
|
342
|
+
* synced. Two independent witnesses: a script that names the binary, or the
|
|
343
|
+
* directory of artifacts the tool consumes.
|
|
344
|
+
* @param {string} tool Tool name.
|
|
345
|
+
* @param {object|null} pkg Parsed package.json.
|
|
346
|
+
* @param {string} cwd Project root.
|
|
347
|
+
* @returns {boolean} Whether the project uses it.
|
|
348
|
+
*/
|
|
349
|
+
function usedByProject(tool, pkg, cwd) {
|
|
350
|
+
const invoked = [...toolsFromScripts(pkg).keys()].includes(tool);
|
|
351
|
+
if (invoked) return true;
|
|
352
|
+
const artifacts = KNOWN_TOOLS[tool]?.artifacts;
|
|
353
|
+
if (!artifacts) return false;
|
|
354
|
+
// A DIRECTORY, not merely an entry with that name. `existsSync` is true for a
|
|
355
|
+
// regular file too, so a stray `.maestro` note or editor artifact would have
|
|
356
|
+
// corroborated the threshold and reintroduced the 300MB proposal this check
|
|
357
|
+
// exists to prevent — a false positive arriving through the very guard added
|
|
358
|
+
// to stop one.
|
|
359
|
+
try {
|
|
360
|
+
return statSync(join(cwd, artifacts)).isDirectory();
|
|
361
|
+
} catch {
|
|
362
|
+
return false;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Tools a project's quality configuration CORROBORATES — never establishes.
|
|
368
|
+
*
|
|
369
|
+
* A threshold is not usage. `quality.e2eCoverage` defaults are synced into
|
|
370
|
+
* every project by `src/sync/registry.ts`, so this repository carries a
|
|
371
|
+
* `maestro` entry while having no `.maestro` directory and no script that
|
|
372
|
+
* invokes it. Treating that as evidence proposed pinning a 300MB JVM
|
|
373
|
+
* application into a container for a tool nothing runs.
|
|
374
|
+
*
|
|
375
|
+
* Evidence that a tool is CONFIGURED is not evidence that it is NEEDED — the
|
|
376
|
+
* same mistake as proposing a binary npm already provides. So a threshold only
|
|
377
|
+
* counts when something corroborates it: a script that invokes the tool, or the
|
|
378
|
+
* artifacts it consumes. In a real Expo project the script signal fires and
|
|
379
|
+
* this adds nothing; in a project that merely inherited the defaults, it
|
|
380
|
+
* correctly stays quiet.
|
|
381
|
+
* @param {object|null} config Parsed .lisa.config.json.
|
|
382
|
+
* @param {object|null} [pkg] Parsed package.json, for corroboration.
|
|
383
|
+
* @param {string} [cwd] Project root, for artifact corroboration.
|
|
384
|
+
* @returns {Map<string, string>} Tool name to the setting that implies it.
|
|
385
|
+
*/
|
|
386
|
+
export function toolsFromQuality(config, pkg = null, cwd = process.cwd()) {
|
|
387
|
+
const found = new Map();
|
|
388
|
+
for (const runner of Object.keys(config?.quality?.e2eCoverage ?? {})) {
|
|
389
|
+
if (!Object.hasOwn(KNOWN_TOOLS, runner)) continue;
|
|
390
|
+
if (!usedByProject(runner, pkg, cwd)) continue;
|
|
391
|
+
found.set(
|
|
392
|
+
runner,
|
|
393
|
+
`quality.e2eCoverage.${runner} is configured, and the project uses it`
|
|
394
|
+
);
|
|
395
|
+
}
|
|
396
|
+
if (config?.quality?.sonar || config?.sonar) {
|
|
397
|
+
found.set("sonar-scanner", "Sonar analysis is configured");
|
|
398
|
+
}
|
|
399
|
+
return found;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Everything already declared, by name, so proposals exclude them.
|
|
404
|
+
* @param {object|null} config Parsed .lisa.config.json.
|
|
405
|
+
* @returns {Set<string>} Declared tool names.
|
|
406
|
+
*/
|
|
407
|
+
export function declaredTools(config, surface = "remote") {
|
|
408
|
+
const tools = config?.remoteEnv?.tools ?? {};
|
|
409
|
+
const applies = tool => {
|
|
410
|
+
const surfaces = tool.surfaces;
|
|
411
|
+
if (!Array.isArray(surfaces) || surfaces.length === 0) return true;
|
|
412
|
+
return surfaces.includes(surface);
|
|
413
|
+
};
|
|
414
|
+
// Filtered by surface, because a declaration that applies somewhere else is
|
|
415
|
+
// not coverage here. A local-only `require` entry would otherwise suppress
|
|
416
|
+
// the proposal for a tool genuinely missing from the remote manifest — the
|
|
417
|
+
// detector reporting "already declared" about the one surface where it is
|
|
418
|
+
// not.
|
|
419
|
+
return new Set(
|
|
420
|
+
[...(tools.require ?? []), ...(tools.install ?? [])]
|
|
421
|
+
.filter(applies)
|
|
422
|
+
.map(tool => tool.name)
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
/**
|
|
427
|
+
* Whether a tool already reaches this project as an npm dependency.
|
|
428
|
+
*
|
|
429
|
+
* A package that declares `@playwright/test` gets the `playwright` binary in
|
|
430
|
+
* `node_modules/.bin`, and its npm scripts resolve it from there. It never
|
|
431
|
+
* needs to be on PATH, so proposing a manifest entry for it is noise — and
|
|
432
|
+
* noise is how a detector teaches people to skim it, which is the one failure
|
|
433
|
+
* this skill's own documentation warns about.
|
|
434
|
+
*
|
|
435
|
+
* Only the CLI is covered by this. Anything else the tool needs at runtime —
|
|
436
|
+
* Playwright's browsers, for instance — is a separate concern that a package
|
|
437
|
+
* manager does not solve and this function does not claim to.
|
|
438
|
+
* @param {object|null} pkg Parsed package.json.
|
|
439
|
+
* @param {string} tool Tool name.
|
|
440
|
+
* @returns {boolean} Whether npm already provides the binary.
|
|
441
|
+
*/
|
|
442
|
+
export function satisfiedByNpm(pkg, tool) {
|
|
443
|
+
const viaNpm = KNOWN_TOOLS[tool]?.viaNpm;
|
|
444
|
+
if (!viaNpm) return false;
|
|
445
|
+
const declared = {
|
|
446
|
+
...pkg?.dependencies,
|
|
447
|
+
...pkg?.devDependencies,
|
|
448
|
+
};
|
|
449
|
+
return Object.hasOwn(declared, viaNpm);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
/**
|
|
453
|
+
* Collect every signal and subtract what the manifest already covers.
|
|
454
|
+
* @param {string} [cwd] Project root.
|
|
455
|
+
* @returns {Array<{name: string, why: string, evidence: string[]}>} Proposals.
|
|
456
|
+
*/
|
|
457
|
+
export function detectTooling(cwd = process.cwd()) {
|
|
458
|
+
const config = readJson(join(cwd, ".lisa.config.json"));
|
|
459
|
+
const pkg = readJson(join(cwd, "package.json"));
|
|
460
|
+
const mcp = readJson(join(cwd, ".mcp.json"));
|
|
461
|
+
const notes = readJson(join(cwd, ".lisa", "secret-notes.json"));
|
|
462
|
+
|
|
463
|
+
const declared = declaredTools(config);
|
|
464
|
+
// Curated signals carry a vetted `why`. Discovered ones carry only the fact
|
|
465
|
+
// that the project runs the thing — weaker prose, identical standing as
|
|
466
|
+
// evidence, and the only kind that can find a tool nobody listed.
|
|
467
|
+
const hooks = toolsFromGitHooks(cwd);
|
|
468
|
+
const signals = [
|
|
469
|
+
hooks,
|
|
470
|
+
toolsFromScripts(pkg),
|
|
471
|
+
toolsDiscoveredInScripts(pkg),
|
|
472
|
+
toolsFromMcp(mcp),
|
|
473
|
+
toolsFromSecretNotes(notes),
|
|
474
|
+
toolsFromQuality(config, pkg, cwd),
|
|
475
|
+
];
|
|
476
|
+
|
|
477
|
+
const merged = new Map();
|
|
478
|
+
for (const signal of signals) {
|
|
479
|
+
for (const [tool, evidence] of signal) {
|
|
480
|
+
if (declared.has(tool)) continue;
|
|
481
|
+
// Already provided by the package manager, so there is nothing to pin.
|
|
482
|
+
if (satisfiedByNpm(pkg, tool)) continue;
|
|
483
|
+
if (providedByNodeModules(cwd, tool)) continue;
|
|
484
|
+
// Real dependency, wrong manifest — the workstation layer owns it.
|
|
485
|
+
if (WORKSTATION_PROVISIONED.has(tool)) continue;
|
|
486
|
+
const entry = merged.get(tool) ?? { evidence: [] };
|
|
487
|
+
if (!entry.evidence.includes(evidence)) entry.evidence.push(evidence);
|
|
488
|
+
merged.set(tool, entry);
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
return [...merged.entries()]
|
|
493
|
+
.map(([name, entry]) => ({
|
|
494
|
+
name,
|
|
495
|
+
why: KNOWN_TOOLS[name]?.why ?? discoveredWhy(name, hooks.has(name)),
|
|
496
|
+
evidence: entry.evidence,
|
|
497
|
+
// Says which vocabulary the `why` came from, so a reader can weigh it.
|
|
498
|
+
// A curated entry has been thought about; a discovered one has only been
|
|
499
|
+
// observed.
|
|
500
|
+
source: Object.hasOwn(KNOWN_TOOLS, name) ? "curated" : "discovered",
|
|
501
|
+
}))
|
|
502
|
+
.sort((a, b) => a.name.localeCompare(b.name));
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
/**
|
|
506
|
+
* The `why` for a tool nobody wrote prose for.
|
|
507
|
+
*
|
|
508
|
+
* Every proposal must carry one — a proposal without a reason is an assertion,
|
|
509
|
+
* and this program's whole boundary is that it asserts nothing. So a discovered
|
|
510
|
+
* tool states the observation plainly rather than borrowing confidence it has
|
|
511
|
+
* not earned.
|
|
512
|
+
* @param {string} name Tool name.
|
|
513
|
+
* @param {boolean} fromHook Whether a git hook runs it.
|
|
514
|
+
* @returns {string} A reason a reader can check.
|
|
515
|
+
*/
|
|
516
|
+
export function discoveredWhy(name, fromHook) {
|
|
517
|
+
return fromHook
|
|
518
|
+
? `A git hook runs \`${name}\` on every commit or push, and nothing ` +
|
|
519
|
+
`declares it — a machine without it fails at commit time, or skips the ` +
|
|
520
|
+
`check silently if the hook guards it.`
|
|
521
|
+
: `An npm script invokes \`${name}\`, and nothing puts it on PATH.`;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
/**
|
|
525
|
+
* The manifest entries an operator can paste, with the parts only they supply.
|
|
526
|
+
*
|
|
527
|
+
* A release archive is proposed as a `platforms` map rather than a single URL
|
|
528
|
+
* plus `surfaces: ["remote"]`. The old shape could express only one artifact, so
|
|
529
|
+
* keeping a Linux binary off a laptop meant excluding the tool from laptops
|
|
530
|
+
* altogether — which is how `bws` and `gh` came to be required on a developer
|
|
531
|
+
* machine and installable only in a container.
|
|
532
|
+
* @param {{name: string}} proposal One detected tool.
|
|
533
|
+
* @returns {{install: object[], require: object[]}} Manifest skeletons.
|
|
534
|
+
*/
|
|
535
|
+
export function proposedEntries(proposal) {
|
|
536
|
+
// Whether a binary can be proposed is a fact about the TOOL, not about how it
|
|
537
|
+
// was detected. Keying this on "the evidence was an MCP server" suppressed
|
|
538
|
+
// exactly the wrong case: the substrate allowlist already removes Linear
|
|
539
|
+
// before it becomes evidence, so the only tools reaching that branch were
|
|
540
|
+
// ones like Maestro that genuinely do have a CLI — the binary the Expo
|
|
541
|
+
// template invokes and nothing installs.
|
|
542
|
+
//
|
|
543
|
+
// So the question is asked only where there is no pinnable CLI to name.
|
|
544
|
+
if (KNOWN_TOOLS[proposal.name]?.noCli) {
|
|
545
|
+
return { install: [], require: [], question: REMOTE_PATH_QUESTION };
|
|
546
|
+
}
|
|
547
|
+
const viaNpm = KNOWN_TOOLS[proposal.name]?.viaNpm;
|
|
548
|
+
if (viaNpm) {
|
|
549
|
+
// npm resolves per platform, so one entry serves every surface.
|
|
550
|
+
return {
|
|
551
|
+
install: [
|
|
552
|
+
{
|
|
553
|
+
name: proposal.name,
|
|
554
|
+
install: "npm-global",
|
|
555
|
+
package: viaNpm,
|
|
556
|
+
version: "<pin>",
|
|
557
|
+
},
|
|
558
|
+
],
|
|
559
|
+
require: [],
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
// A release archive is built for one platform, so every platform the project
|
|
563
|
+
// is developed or built on needs its own block — with its own install method,
|
|
564
|
+
// because a vendor may ship a tarball for one and a zip for another, as gh
|
|
565
|
+
// does. Both containers and laptops are proposed: a tool the manifest can
|
|
566
|
+
// only install remotely is one every developer installs by hand or does
|
|
567
|
+
// without.
|
|
568
|
+
//
|
|
569
|
+
// The placeholders stay unresolved on purpose. A guessed URL is an artifact
|
|
570
|
+
// the checksum cannot vouch for, which is the one property that makes a
|
|
571
|
+
// pinned entry worth reviewing.
|
|
572
|
+
const archive = platform => ({
|
|
573
|
+
install:
|
|
574
|
+
"<release-tar | release-zip | release-tree — tree when the archive is a directory whose entry point loads its own siblings>",
|
|
575
|
+
url: `<release url for this exact version, for ${platform}>`,
|
|
576
|
+
sha256: `<sha256 published with the ${platform} release>`,
|
|
577
|
+
});
|
|
578
|
+
return {
|
|
579
|
+
install: [
|
|
580
|
+
{
|
|
581
|
+
name: proposal.name,
|
|
582
|
+
version: "<pin>",
|
|
583
|
+
platforms: {
|
|
584
|
+
"linux-x64": archive("linux-x64"),
|
|
585
|
+
"darwin-arm64": archive("darwin-arm64"),
|
|
586
|
+
},
|
|
587
|
+
},
|
|
588
|
+
],
|
|
589
|
+
require: [],
|
|
590
|
+
};
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
/**
|
|
594
|
+
* Whether this module is the one node was asked to run.
|
|
595
|
+
*
|
|
596
|
+
* Both sides are realpath'd: a raw URL comparison answers "no" through a
|
|
597
|
+
* symlinked checkout, a git worktree, or a /tmp path on macOS, so the module
|
|
598
|
+
* loads, runs nothing and exits 0 — a silent no-op that reads as success.
|
|
599
|
+
*
|
|
600
|
+
* A local copy rather than an import: plugin payload scripts ship standalone,
|
|
601
|
+
* with no `lib/` sibling to import from once installed.
|
|
602
|
+
* @param {string} moduleUrl - The caller's own `import.meta.url`.
|
|
603
|
+
* @param {string | undefined} [argv1] - Entry path; defaults to `process.argv[1]`.
|
|
604
|
+
* @returns {boolean} Whether the caller should run its CLI body.
|
|
605
|
+
*/
|
|
606
|
+
function invokedAsScript(moduleUrl, argv1 = process.argv[1]) {
|
|
607
|
+
if (!argv1) return false;
|
|
608
|
+
try {
|
|
609
|
+
return realpathSync(argv1) === realpathSync(fileURLToPath(moduleUrl));
|
|
610
|
+
} catch {
|
|
611
|
+
return false;
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
if (invokedAsScript(import.meta.url)) {
|
|
616
|
+
const proposals = detectTooling();
|
|
617
|
+
if (process.argv.includes("--json")) {
|
|
618
|
+
console.log(JSON.stringify(proposals, null, 2));
|
|
619
|
+
} else if (proposals.length === 0) {
|
|
620
|
+
console.log(
|
|
621
|
+
"Every tool this project appears to use is already declared in remoteEnv.tools."
|
|
622
|
+
);
|
|
623
|
+
} else {
|
|
624
|
+
console.log(
|
|
625
|
+
`${proposals.length} tool(s) look required but are not declared:\n`
|
|
626
|
+
);
|
|
627
|
+
if (!dependenciesInstalled(process.cwd())) {
|
|
628
|
+
// Without node_modules there is no way to tell a tool that needs PATH
|
|
629
|
+
// from one npm already provides, so every dev dependency looks missing.
|
|
630
|
+
// Said out loud rather than silently over-proposing.
|
|
631
|
+
console.log(
|
|
632
|
+
"note: dependencies are not installed, so binaries npm would provide " +
|
|
633
|
+
"cannot be\n excluded. Run the install first for a shorter, " +
|
|
634
|
+
"more accurate list.\n"
|
|
635
|
+
);
|
|
636
|
+
}
|
|
637
|
+
for (const proposal of proposals) {
|
|
638
|
+
console.log(` ${proposal.name} [${proposal.source}]`);
|
|
639
|
+
console.log(` why: ${proposal.why}`);
|
|
640
|
+
for (const evidence of proposal.evidence) {
|
|
641
|
+
console.log(` evidence: ${evidence}`);
|
|
642
|
+
}
|
|
643
|
+
const entries = proposedEntries(proposal);
|
|
644
|
+
if (entries.question) console.log(` ${entries.question}`);
|
|
645
|
+
for (const entry of entries.install) {
|
|
646
|
+
console.log(` tools.install: ${JSON.stringify(entry)}`);
|
|
647
|
+
}
|
|
648
|
+
for (const entry of entries.require) {
|
|
649
|
+
console.log(` tools.require: ${JSON.stringify(entry)}`);
|
|
650
|
+
}
|
|
651
|
+
console.log("");
|
|
652
|
+
}
|
|
653
|
+
console.log(
|
|
654
|
+
"Nothing has been written or installed. Confirm each entry, supply the\n" +
|
|
655
|
+
"pin and checksum, and add it to remoteEnv.tools in .lisa.config.json."
|
|
656
|
+
);
|
|
657
|
+
}
|
|
658
|
+
}
|