@codyswann/lisa 4.74.8 → 4.75.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +60 -0
- package/all/copy-overwrite/scripts/lib/npm-update-cancel-origin.mjs +4 -2
- package/all/copy-overwrite/scripts/lib/npm-update-checkpoint-codec.mjs +141 -0
- package/all/copy-overwrite/scripts/lib/npm-update-checkpoint.mjs +162 -116
- package/all/copy-overwrite/scripts/lib/npm-update-helper-inventory.mjs +1 -0
- package/all/copy-overwrite/scripts/lib/npm-update-recovery.mjs +9 -60
- package/all/copy-overwrite/scripts/npm-updater-helper-graph.json +18 -6
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +20 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/lisa-skill-sources.d.ts +3 -3
- package/dist/core/lisa-skill-sources.d.ts.map +1 -1
- package/dist/core/lisa-skill-sources.js +3 -2
- package/dist/core/lisa-skill-sources.js.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +739 -11
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +4 -4
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-cdk-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-cdk-devin/skills/setup-aws-accounts/SKILL.md +292 -0
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-devin/.claude-plugin/plugin.json +8 -0
- package/plugins/lisa-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-devin/.mcp.json +8 -0
- package/plugins/lisa-devin/agents/architecture-specialist.md +32 -0
- package/plugins/lisa-devin/agents/bug-fixer.md +43 -0
- package/plugins/lisa-devin/agents/builder.md +44 -0
- package/plugins/lisa-devin/agents/confluence-prd-intake.md +65 -0
- package/plugins/lisa-devin/agents/debug-specialist.md +34 -0
- package/plugins/lisa-devin/agents/eval-specialist.md +33 -0
- package/plugins/lisa-devin/agents/git-history-analyzer.md +183 -0
- package/plugins/lisa-devin/agents/github-agent.md +155 -0
- package/plugins/lisa-devin/agents/github-build-intake.md +64 -0
- package/plugins/lisa-devin/agents/github-prd-intake.md +66 -0
- package/plugins/lisa-devin/agents/jira-agent.md +135 -0
- package/plugins/lisa-devin/agents/jira-build-intake.md +64 -0
- package/plugins/lisa-devin/agents/learner.md +85 -0
- package/plugins/lisa-devin/agents/learning-judge.md +119 -0
- package/plugins/lisa-devin/agents/learnings-synthesizer.md +155 -0
- package/plugins/lisa-devin/agents/linear-agent.md +138 -0
- package/plugins/lisa-devin/agents/linear-build-intake.md +64 -0
- package/plugins/lisa-devin/agents/linear-prd-intake.md +66 -0
- package/plugins/lisa-devin/agents/notion-prd-intake.md +63 -0
- package/plugins/lisa-devin/agents/performance-specialist.md +26 -0
- package/plugins/lisa-devin/agents/pr-mining-specialist.md +85 -0
- package/plugins/lisa-devin/agents/product-specialist.md +30 -0
- package/plugins/lisa-devin/agents/quality-specialist.md +30 -0
- package/plugins/lisa-devin/agents/security-specialist.md +43 -0
- package/plugins/lisa-devin/agents/skill-evaluator.md +205 -0
- package/plugins/lisa-devin/agents/spec-conformance-specialist.md +56 -0
- package/plugins/lisa-devin/agents/test-specialist.md +32 -0
- package/plugins/lisa-devin/agents/tracker-mining-specialist.md +85 -0
- package/plugins/lisa-devin/agents/verification-specialist.md +145 -0
- package/plugins/lisa-devin/hooks/auto-update.mjs +824 -0
- package/plugins/lisa-devin/hooks/auto-update.sh +31 -0
- package/plugins/lisa-devin/hooks/block-blind-automerge.sh +1242 -0
- package/plugins/lisa-devin/hooks/block-direct-issue-create.sh +2603 -0
- package/plugins/lisa-devin/hooks/block-host-name-leak.mjs +412 -0
- package/plugins/lisa-devin/hooks/block-host-name-leak.sh +61 -0
- package/plugins/lisa-devin/hooks/block-instruction-file-edits.sh +207 -0
- package/plugins/lisa-devin/hooks/block-managed-file-edits.sh +1175 -0
- package/plugins/lisa-devin/hooks/block-no-verify.sh +2288 -0
- package/plugins/lisa-devin/hooks/block-shell-json-parsing.sh +263 -0
- package/plugins/lisa-devin/hooks/cleanup-stale-worktrees.sh +122 -0
- package/plugins/lisa-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-devin/hooks/discharge-work-item-gates.sh +90 -0
- package/plugins/lisa-devin/hooks/enforce-verification-gate.sh +506 -0
- package/plugins/lisa-devin/hooks/enforcement-vintage-npm.mjs +320 -0
- package/plugins/lisa-devin/hooks/enforcement-vintage.mjs +472 -0
- package/plugins/lisa-devin/hooks/enforcement-vintage.sh +48 -0
- package/plugins/lisa-devin/hooks/failure-signature-index.mjs +717 -0
- package/plugins/lisa-devin/hooks/failure-signature-index.sh +26 -0
- package/plugins/lisa-devin/hooks/guard-dedupe.bash +374 -0
- package/plugins/lisa-devin/hooks/inject-resolved-config.mjs +903 -0
- package/plugins/lisa-devin/hooks/inject-resolved-config.sh +107 -0
- package/plugins/lisa-devin/hooks/inject-rules.sh +49 -0
- package/plugins/lisa-devin/hooks/install-pkgs.sh +84 -0
- package/plugins/lisa-devin/hooks/operational-hazards.mjs +736 -0
- package/plugins/lisa-devin/hooks/operational-hazards.sh +28 -0
- package/plugins/lisa-devin/hooks/parity-safety-net-heredoc.py +1004 -0
- package/plugins/lisa-devin/hooks/parity-safety-net.sh +3275 -0
- package/plugins/lisa-devin/hooks/secrets-preflight.sh +72 -0
- package/plugins/lisa-devin/hooks/setup-jira-cli.sh +205 -0
- package/plugins/lisa-devin/hooks/shell-write-nudge.sh +86 -0
- package/plugins/lisa-devin/hooks/sonar-secrets.sh +205 -0
- package/plugins/lisa-devin/hooks/threshold-ratchet-compare.mjs +518 -0
- package/plugins/lisa-devin/hooks/threshold-ratchet-families.mjs +543 -0
- package/plugins/lisa-devin/hooks/threshold-ratchet.mjs +568 -0
- package/plugins/lisa-devin/hooks/threshold-ratchet.sh +22 -0
- package/plugins/lisa-devin/hooks/withdrawn-rulings.mjs +600 -0
- package/plugins/lisa-devin/hooks/withdrawn-rulings.sh +24 -0
- package/plugins/lisa-devin/hooks/worktree-binding-guard.mjs +1383 -0
- package/plugins/lisa-devin/hooks/worktree-binding-guard.sh +79 -0
- package/plugins/lisa-devin/hooks.json +247 -0
- package/plugins/lisa-devin/rules/eager/00-rule-index.md +82 -0
- package/plugins/lisa-devin/rules/eager/base-rules.md +85 -0
- package/plugins/lisa-devin/rules/eager/coding-philosophy.md +27 -0
- package/plugins/lisa-devin/rules/eager/config-resolution.md +37 -0
- package/plugins/lisa-devin/rules/eager/do-it-now.md +11 -0
- package/plugins/lisa-devin/rules/eager/empirical-inquiry.md +24 -0
- package/plugins/lisa-devin/rules/eager/falsifiable-checks.md +48 -0
- package/plugins/lisa-devin/rules/eager/history-audit.md +27 -0
- package/plugins/lisa-devin/rules/eager/integration-access-layer.md +19 -0
- package/plugins/lisa-devin/rules/eager/intent-routing.md +18 -0
- package/plugins/lisa-devin/rules/eager/learnings-ladder.md +18 -0
- package/plugins/lisa-devin/rules/eager/local-ci-first.md +15 -0
- package/plugins/lisa-devin/rules/eager/measurement-integrity.md +18 -0
- package/plugins/lisa-devin/rules/eager/never-name-a-downstream-project.md +9 -0
- package/plugins/lisa-devin/rules/eager/not-blocked-just-waiting.md +13 -0
- package/plugins/lisa-devin/rules/eager/operational-hazards.md +50 -0
- package/plugins/lisa-devin/rules/eager/report-actionability.md +26 -0
- package/plugins/lisa-devin/rules/eager/security-audit-handling.md +40 -0
- package/plugins/lisa-devin/rules/eager/session-status-updates.md +20 -0
- package/plugins/lisa-devin/rules/eager/settled-decisions.md +75 -0
- package/plugins/lisa-devin/rules/eager/stale-state-claims.md +26 -0
- package/plugins/lisa-devin/rules/eager/tool-access-gate.md +23 -0
- package/plugins/lisa-devin/rules/eager/tracked-work.md +9 -0
- package/plugins/lisa-devin/rules/eager/upstream-to-lisa.md +14 -0
- package/plugins/lisa-devin/rules/eager/verification.md +33 -0
- package/plugins/lisa-devin/rules/eager/wiki-knowledge-source.md +13 -0
- package/plugins/lisa-devin/rules/eager/withdrawn-rulings.md +102 -0
- package/plugins/lisa-devin/rules/reference/automation-runbook-contract.md +355 -0
- package/plugins/lisa-devin/rules/reference/base-rules.md +136 -0
- package/plugins/lisa-devin/rules/reference/bdd-e2e-coverage.md +301 -0
- package/plugins/lisa-devin/rules/reference/blocker-containment.md +165 -0
- package/plugins/lisa-devin/rules/reference/claim-archaeology.md +184 -0
- package/plugins/lisa-devin/rules/reference/claim-evidence-mapping.md +362 -0
- package/plugins/lisa-devin/rules/reference/claim-time-guards.md +135 -0
- package/plugins/lisa-devin/rules/reference/coding-philosophy.md +428 -0
- package/plugins/lisa-devin/rules/reference/config-resolution.md +1225 -0
- package/plugins/lisa-devin/rules/reference/control-reachability.md +166 -0
- package/plugins/lisa-devin/rules/reference/convergent-review.md +145 -0
- package/plugins/lisa-devin/rules/reference/credential-substrate-precedence.md +249 -0
- package/plugins/lisa-devin/rules/reference/dependency-decision-records.md +177 -0
- package/plugins/lisa-devin/rules/reference/dependency-internalization-kit.md +244 -0
- package/plugins/lisa-devin/rules/reference/dependency-trust-classes.md +291 -0
- package/plugins/lisa-devin/rules/reference/deployed-state-readback.md +142 -0
- package/plugins/lisa-devin/rules/reference/derived-branch-plan.md +214 -0
- package/plugins/lisa-devin/rules/reference/design-source-of-truth.md +260 -0
- package/plugins/lisa-devin/rules/reference/design-value-binding.md +311 -0
- package/plugins/lisa-devin/rules/reference/do-it-now.md +19 -0
- package/plugins/lisa-devin/rules/reference/documentation-source-paths.md +31 -0
- package/plugins/lisa-devin/rules/reference/empirical-inquiry.md +28 -0
- package/plugins/lisa-devin/rules/reference/factory-model.md +111 -0
- package/plugins/lisa-devin/rules/reference/falsifiable-checks.md +275 -0
- package/plugins/lisa-devin/rules/reference/history-audit.md +42 -0
- package/plugins/lisa-devin/rules/reference/integration-access-layer.md +89 -0
- package/plugins/lisa-devin/rules/reference/intent-routing.md +428 -0
- package/plugins/lisa-devin/rules/reference/leaf-only-lifecycle.md +227 -0
- package/plugins/lisa-devin/rules/reference/learnings-ladder.md +41 -0
- package/plugins/lisa-devin/rules/reference/local-ci-first.md +34 -0
- package/plugins/lisa-devin/rules/reference/measurement-integrity.md +119 -0
- package/plugins/lisa-devin/rules/reference/never-name-a-downstream-project.md +37 -0
- package/plugins/lisa-devin/rules/reference/not-blocked-just-waiting.md +41 -0
- package/plugins/lisa-devin/rules/reference/observability-audit.md +146 -0
- package/plugins/lisa-devin/rules/reference/operational-hazards.md +115 -0
- package/plugins/lisa-devin/rules/reference/prd-definition-of-ready.md +118 -0
- package/plugins/lisa-devin/rules/reference/prd-lifecycle-rollup.md +192 -0
- package/plugins/lisa-devin/rules/reference/pre-flight-autofill.md +250 -0
- package/plugins/lisa-devin/rules/reference/project-learnings.md +159 -0
- package/plugins/lisa-devin/rules/reference/promotion-contract.md +148 -0
- package/plugins/lisa-devin/rules/reference/readiness-rubric.md +242 -0
- package/plugins/lisa-devin/rules/reference/ready-role-filing.md +212 -0
- package/plugins/lisa-devin/rules/reference/rejection-detection.md +308 -0
- package/plugins/lisa-devin/rules/reference/repo-scope-split.md +119 -0
- package/plugins/lisa-devin/rules/reference/report-actionability.md +61 -0
- package/plugins/lisa-devin/rules/reference/reset-seed-coverage.md +286 -0
- package/plugins/lisa-devin/rules/reference/security-audit-handling.md +55 -0
- package/plugins/lisa-devin/rules/reference/session-status-updates.md +111 -0
- package/plugins/lisa-devin/rules/reference/settled-decisions.md +39 -0
- package/plugins/lisa-devin/rules/reference/stale-state-claims.md +88 -0
- package/plugins/lisa-devin/rules/reference/tool-access-gate.md +114 -0
- package/plugins/lisa-devin/rules/reference/tracked-work.md +49 -0
- package/plugins/lisa-devin/rules/reference/upstream-to-lisa.md +26 -0
- package/plugins/lisa-devin/rules/reference/usage-accounting.md +261 -0
- package/plugins/lisa-devin/rules/reference/verification.md +278 -0
- package/plugins/lisa-devin/rules/reference/wiki-knowledge-source.md +37 -0
- package/plugins/lisa-devin/rules/reference/withdrawn-rulings.md +148 -0
- package/plugins/lisa-devin/rules/reference/work-item-definition-of-ready.md +177 -0
- package/plugins/lisa-devin/rules/reference/work-item-trailer-definition.md +129 -0
- package/plugins/lisa-devin/scripts/automation-run-record.mjs +678 -0
- package/plugins/lisa-devin/scripts/automation-status-claude-adapter.mjs +804 -0
- package/plugins/lisa-devin/scripts/automation-status-codex-adapter.mjs +1081 -0
- package/plugins/lisa-devin/scripts/automation-status-contract-drift.mjs +392 -0
- package/plugins/lisa-devin/scripts/automation-status-expected-fleet.mjs +508 -0
- package/plugins/lisa-devin/scripts/automation-status-report.mjs +200 -0
- package/plugins/lisa-devin/scripts/automation-status-run-history.mjs +216 -0
- package/plugins/lisa-devin/scripts/automation-status-unrecorded-runs.mjs +127 -0
- package/plugins/lisa-devin/scripts/blocker-edge-resolution.mjs +150 -0
- package/plugins/lisa-devin/scripts/cross-pollinate.mjs +763 -0
- package/plugins/lisa-devin/scripts/design-bindings-probe.mjs +713 -0
- package/plugins/lisa-devin/scripts/design-intake-gate.mjs +470 -0
- package/plugins/lisa-devin/scripts/design-source-gate.mjs +610 -0
- package/plugins/lisa-devin/scripts/design-variable-ids.mjs +567 -0
- package/plugins/lisa-devin/scripts/doctor-report.mjs +635 -0
- package/plugins/lisa-devin/scripts/install-remote-agent-aws.mjs +443 -0
- package/plugins/lisa-devin/scripts/intake-blocker-reprobe.mjs +1065 -0
- package/plugins/lisa-devin/scripts/intake-prework-denominator.mjs +249 -0
- package/plugins/lisa-devin/scripts/lifecycle-label-trust.mjs +593 -0
- package/plugins/lisa-devin/scripts/linear-state-write-target.mjs +362 -0
- package/plugins/lisa-devin/scripts/plugin-sync-explain.mjs +654 -0
- package/plugins/lisa-devin/scripts/pr-arming-sweep.mjs +561 -0
- package/plugins/lisa-devin/scripts/project-ideation-idempotency-harness.mjs +338 -0
- package/plugins/lisa-devin/scripts/qa-signal-lifecycle.mjs +523 -0
- package/plugins/lisa-devin/scripts/queue-contract-resolution.mjs +583 -0
- package/plugins/lisa-devin/scripts/queue-health-classification.mjs +157 -0
- package/plugins/lisa-devin/scripts/queue-status-build-readers.mjs +561 -0
- package/plugins/lisa-devin/scripts/queue-status-prd-readers.mjs +452 -0
- package/plugins/lisa-devin/scripts/remote-agent-aws-setup.sh +677 -0
- package/plugins/lisa-devin/scripts/repo-scope-vocabulary-audit.mjs +458 -0
- package/plugins/lisa-devin/scripts/resolve-lifecycle-role.mjs +347 -0
- package/plugins/lisa-devin/scripts/rollup-blocker-classification.mjs +616 -0
- package/plugins/lisa-devin/scripts/scoping-label-audit.mjs +474 -0
- package/plugins/lisa-devin/skills/lisa-acceptance-criteria/SKILL.md +73 -0
- package/plugins/lisa-devin/skills/lisa-agent-design-best-practices/SKILL.md +242 -0
- package/plugins/lisa-devin/skills/lisa-agent-ready/SKILL.md +271 -0
- package/plugins/lisa-devin/skills/lisa-analyze-claude-remote/SKILL.md +434 -0
- package/plugins/lisa-devin/skills/lisa-atlassian-access/SKILL.md +469 -0
- package/plugins/lisa-devin/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs +236 -0
- package/plugins/lisa-devin/skills/lisa-attribute-failure/SKILL.md +142 -0
- package/plugins/lisa-devin/skills/lisa-automation-status/SKILL.md +149 -0
- package/plugins/lisa-devin/skills/lisa-bug-triage/SKILL.md +23 -0
- package/plugins/lisa-devin/skills/lisa-capability-drift/SKILL.md +71 -0
- package/plugins/lisa-devin/skills/lisa-codebase-research/SKILL.md +87 -0
- package/plugins/lisa-devin/skills/lisa-codify-verification/SKILL.md +213 -0
- package/plugins/lisa-devin/skills/lisa-confluence-prd-intake/SKILL.md +417 -0
- package/plugins/lisa-devin/skills/lisa-confluence-to-tracker/SKILL.md +469 -0
- package/plugins/lisa-devin/skills/lisa-confluence-write-prd/SKILL.md +111 -0
- package/plugins/lisa-devin/skills/lisa-cross-pollinate/SKILL.md +175 -0
- package/plugins/lisa-devin/skills/lisa-debrief/SKILL.md +96 -0
- package/plugins/lisa-devin/skills/lisa-debrief-apply/SKILL.md +106 -0
- package/plugins/lisa-devin/skills/lisa-delivery-effectiveness/SKILL.md +62 -0
- package/plugins/lisa-devin/skills/lisa-design-intake/SKILL.md +198 -0
- package/plugins/lisa-devin/skills/lisa-detect-tooling/SKILL.md +110 -0
- package/plugins/lisa-devin/skills/lisa-detect-tooling/scripts/commands.mjs +479 -0
- package/plugins/lisa-devin/skills/lisa-detect-tooling/scripts/detect-tooling.mjs +658 -0
- package/plugins/lisa-devin/skills/lisa-doctor/SKILL.md +743 -0
- package/plugins/lisa-devin/skills/lisa-drive-pr-to-merge/SKILL.md +1587 -0
- package/plugins/lisa-devin/skills/lisa-epic-triage/SKILL.md +28 -0
- package/plugins/lisa-devin/skills/lisa-evaluation-suite/SKILL.md +63 -0
- package/plugins/lisa-devin/skills/lisa-exploratory-qa/SKILL.md +185 -0
- package/plugins/lisa-devin/skills/lisa-fix-linter-error/SKILL.md +45 -0
- package/plugins/lisa-devin/skills/lisa-generate-claude-remote-build-script/SKILL.md +235 -0
- package/plugins/lisa-devin/skills/lisa-git-commit/SKILL.md +53 -0
- package/plugins/lisa-devin/skills/lisa-git-prune/SKILL.md +35 -0
- package/plugins/lisa-devin/skills/lisa-git-submit-pr/SKILL.md +170 -0
- package/plugins/lisa-devin/skills/lisa-github-add-journey/SKILL.md +118 -0
- package/plugins/lisa-devin/skills/lisa-github-build-intake/SKILL.md +745 -0
- package/plugins/lisa-devin/skills/lisa-github-claim/SKILL.md +27 -0
- package/plugins/lisa-devin/skills/lisa-github-create/SKILL.md +105 -0
- package/plugins/lisa-devin/skills/lisa-github-evidence/SKILL.md +120 -0
- package/plugins/lisa-devin/skills/lisa-github-journey/SKILL.md +134 -0
- package/plugins/lisa-devin/skills/lisa-github-prd-intake/SKILL.md +424 -0
- package/plugins/lisa-devin/skills/lisa-github-project-v2/SKILL.md +227 -0
- package/plugins/lisa-devin/skills/lisa-github-read-issue/SKILL.md +305 -0
- package/plugins/lisa-devin/skills/lisa-github-sync/SKILL.md +201 -0
- package/plugins/lisa-devin/skills/lisa-github-to-tracker/SKILL.md +456 -0
- package/plugins/lisa-devin/skills/lisa-github-validate-issue/SKILL.md +598 -0
- package/plugins/lisa-devin/skills/lisa-github-verify/SKILL.md +60 -0
- package/plugins/lisa-devin/skills/lisa-github-write-issue/SKILL.md +531 -0
- package/plugins/lisa-devin/skills/lisa-github-write-prd/SKILL.md +156 -0
- package/plugins/lisa-devin/skills/lisa-health/SKILL.md +142 -0
- package/plugins/lisa-devin/skills/lisa-health-drift-cron/SKILL.md +80 -0
- package/plugins/lisa-devin/skills/lisa-implement/SKILL.md +372 -0
- package/plugins/lisa-devin/skills/lisa-improve-code-complexity/SKILL.md +44 -0
- package/plugins/lisa-devin/skills/lisa-improve-harness/SKILL.md +487 -0
- package/plugins/lisa-devin/skills/lisa-improve-max-lines/SKILL.md +45 -0
- package/plugins/lisa-devin/skills/lisa-improve-max-lines-per-function/SKILL.md +46 -0
- package/plugins/lisa-devin/skills/lisa-improve-test-coverage/SKILL.md +47 -0
- package/plugins/lisa-devin/skills/lisa-improve-tests/SKILL.md +50 -0
- package/plugins/lisa-devin/skills/lisa-intake/SKILL.md +208 -0
- package/plugins/lisa-devin/skills/lisa-intake-explain/SKILL.md +279 -0
- package/plugins/lisa-devin/skills/lisa-jam-access/SKILL.md +128 -0
- package/plugins/lisa-devin/skills/lisa-jira-add-journey/SKILL.md +139 -0
- package/plugins/lisa-devin/skills/lisa-jira-build-intake/SKILL.md +556 -0
- package/plugins/lisa-devin/skills/lisa-jira-claim/SKILL.md +27 -0
- package/plugins/lisa-devin/skills/lisa-jira-create/SKILL.md +157 -0
- package/plugins/lisa-devin/skills/lisa-jira-evidence/SKILL.md +106 -0
- package/plugins/lisa-devin/skills/lisa-jira-evidence/scripts/post-evidence.sh +262 -0
- package/plugins/lisa-devin/skills/lisa-jira-journey/SKILL.md +168 -0
- package/plugins/lisa-devin/skills/lisa-jira-journey/scripts/generate-templates.py +239 -0
- package/plugins/lisa-devin/skills/lisa-jira-journey/scripts/parse-plan.py +570 -0
- package/plugins/lisa-devin/skills/lisa-jira-read-ticket/SKILL.md +199 -0
- package/plugins/lisa-devin/skills/lisa-jira-read-ticket/scripts/download-attachment.sh +211 -0
- package/plugins/lisa-devin/skills/lisa-jira-sync/SKILL.md +117 -0
- package/plugins/lisa-devin/skills/lisa-jira-validate-ticket/SKILL.md +525 -0
- package/plugins/lisa-devin/skills/lisa-jira-verify/SKILL.md +61 -0
- package/plugins/lisa-devin/skills/lisa-jira-write-ticket/SKILL.md +440 -0
- package/plugins/lisa-devin/skills/lisa-jsdoc-best-practices/SKILL.md +491 -0
- package/plugins/lisa-devin/skills/lisa-kane-browser/SKILL.md +80 -0
- package/plugins/lisa-devin/skills/lisa-learnings-audit/SKILL.md +490 -0
- package/plugins/lisa-devin/skills/lisa-linear-access/SKILL.md +483 -0
- package/plugins/lisa-devin/skills/lisa-linear-add-journey/SKILL.md +109 -0
- package/plugins/lisa-devin/skills/lisa-linear-build-intake/SKILL.md +548 -0
- package/plugins/lisa-devin/skills/lisa-linear-claim/SKILL.md +28 -0
- package/plugins/lisa-devin/skills/lisa-linear-create/SKILL.md +150 -0
- package/plugins/lisa-devin/skills/lisa-linear-evidence/SKILL.md +124 -0
- package/plugins/lisa-devin/skills/lisa-linear-journey/SKILL.md +147 -0
- package/plugins/lisa-devin/skills/lisa-linear-prd-intake/SKILL.md +411 -0
- package/plugins/lisa-devin/skills/lisa-linear-read-issue/SKILL.md +201 -0
- package/plugins/lisa-devin/skills/lisa-linear-sync/SKILL.md +164 -0
- package/plugins/lisa-devin/skills/lisa-linear-to-tracker/SKILL.md +454 -0
- package/plugins/lisa-devin/skills/lisa-linear-validate-issue/SKILL.md +504 -0
- package/plugins/lisa-devin/skills/lisa-linear-verify/SKILL.md +65 -0
- package/plugins/lisa-devin/skills/lisa-linear-write-issue/SKILL.md +448 -0
- package/plugins/lisa-devin/skills/lisa-linear-write-prd/SKILL.md +98 -0
- package/plugins/lisa-devin/skills/lisa-monitor/SKILL.md +224 -0
- package/plugins/lisa-devin/skills/lisa-nightly-add-test-coverage/SKILL.md +40 -0
- package/plugins/lisa-devin/skills/lisa-nightly-improve-tests/SKILL.md +29 -0
- package/plugins/lisa-devin/skills/lisa-nightly-lower-code-complexity/SKILL.md +42 -0
- package/plugins/lisa-devin/skills/lisa-notion-access/SKILL.md +301 -0
- package/plugins/lisa-devin/skills/lisa-notion-prd-intake/SKILL.md +360 -0
- package/plugins/lisa-devin/skills/lisa-notion-to-tracker/SKILL.md +467 -0
- package/plugins/lisa-devin/skills/lisa-notion-write-prd/SKILL.md +111 -0
- package/plugins/lisa-devin/skills/lisa-parity-code-review/SKILL.md +83 -0
- package/plugins/lisa-devin/skills/lisa-parity-code-simplifier/SKILL.md +76 -0
- package/plugins/lisa-devin/skills/lisa-parity-coderabbit/SKILL.md +87 -0
- package/plugins/lisa-devin/skills/lisa-parity-sentry-sdk-setup/SKILL.md +375 -0
- package/plugins/lisa-devin/skills/lisa-parity-sentry-seer/SKILL.md +168 -0
- package/plugins/lisa-devin/skills/lisa-parity-skill-creator/SKILL.md +155 -0
- package/plugins/lisa-devin/skills/lisa-performance-review/SKILL.md +94 -0
- package/plugins/lisa-devin/skills/lisa-persist-learning/SKILL.md +247 -0
- package/plugins/lisa-devin/skills/lisa-plan/SKILL.md +64 -0
- package/plugins/lisa-devin/skills/lisa-plugin-sync-explain/SKILL.md +53 -0
- package/plugins/lisa-devin/skills/lisa-posthog-access/SKILL.md +140 -0
- package/plugins/lisa-devin/skills/lisa-prd-backlink/SKILL.md +274 -0
- package/plugins/lisa-devin/skills/lisa-prd-source-write/SKILL.md +104 -0
- package/plugins/lisa-devin/skills/lisa-prd-ticket-coverage/SKILL.md +187 -0
- package/plugins/lisa-devin/skills/lisa-product-walkthrough/SKILL.md +106 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/SKILL.md +417 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/examples/evidence-card-format.md +21 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/examples/host-project-only.md +22 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/examples/idempotency-verification-harness.md +57 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/examples/public-external-inspiration.md +22 -0
- package/plugins/lisa-devin/skills/lisa-project-ideation/examples/unavailable-data-rejection.md +22 -0
- package/plugins/lisa-devin/skills/lisa-pull-request-review/SKILL.md +132 -0
- package/plugins/lisa-devin/skills/lisa-quality-review/SKILL.md +63 -0
- package/plugins/lisa-devin/skills/lisa-queue-status/SKILL.md +215 -0
- package/plugins/lisa-devin/skills/lisa-remote-dispatch/SKILL.md +109 -0
- package/plugins/lisa-devin/skills/lisa-remote-dispatch/scripts/dispatch.mjs +535 -0
- package/plugins/lisa-devin/skills/lisa-repair-intake/SKILL.md +1621 -0
- package/plugins/lisa-devin/skills/lisa-reproduce-bug/SKILL.md +75 -0
- package/plugins/lisa-devin/skills/lisa-research/SKILL.md +92 -0
- package/plugins/lisa-devin/skills/lisa-review-implementation/SKILL.md +209 -0
- package/plugins/lisa-devin/skills/lisa-review-local/SKILL.md +141 -0
- package/plugins/lisa-devin/skills/lisa-rework-triage/SKILL.md +206 -0
- package/plugins/lisa-devin/skills/lisa-root-cause-analysis/SKILL.md +135 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/SKILL.md +430 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/aws-bootstrap.mjs +433 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/bootstrap-store.mjs +288 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/doctor-secrets.mjs +273 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/envfile.mjs +80 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/inspect-vault.mjs +142 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/materialize-secrets.mjs +1085 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/note-format.mjs +179 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/owner.mjs +96 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/preflight-secrets.mjs +342 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/prompt-secret.mjs +79 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/providers.mjs +805 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/publish-aws-bootstrap.mjs +680 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/read-secret-note.mjs +105 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/resolve-expo-token.mjs +90 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/resolve-secret.mjs +285 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/rotate-secret.mjs +297 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/routing-floor.mjs +153 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/surfaces.mjs +480 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/sync-secret-to-ci.mjs +510 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/tools-from-notes.mjs +63 -0
- package/plugins/lisa-devin/skills/lisa-secrets-access/scripts/validate-config.mjs +550 -0
- package/plugins/lisa-devin/skills/lisa-security-review/SKILL.md +124 -0
- package/plugins/lisa-devin/skills/lisa-security-zap-scan/SKILL.md +53 -0
- package/plugins/lisa-devin/skills/lisa-sentry-access/SKILL.md +140 -0
- package/plugins/lisa-devin/skills/lisa-setup-atlassian/SKILL.md +407 -0
- package/plugins/lisa-devin/skills/lisa-setup-automations/SKILL.md +430 -0
- package/plugins/lisa-devin/skills/lisa-setup-automations/scripts/generate-workflow.mjs +288 -0
- package/plugins/lisa-devin/skills/lisa-setup-confluence/SKILL.md +254 -0
- package/plugins/lisa-devin/skills/lisa-setup-github/SKILL.md +319 -0
- package/plugins/lisa-devin/skills/lisa-setup-github-repo/SKILL.md +128 -0
- package/plugins/lisa-devin/skills/lisa-setup-jira/SKILL.md +198 -0
- package/plugins/lisa-devin/skills/lisa-setup-kane/SKILL.md +96 -0
- package/plugins/lisa-devin/skills/lisa-setup-linear/SKILL.md +375 -0
- package/plugins/lisa-devin/skills/lisa-setup-local-env/SKILL.md +95 -0
- package/plugins/lisa-devin/skills/lisa-setup-local-env/scripts/local-env.mjs +196 -0
- package/plugins/lisa-devin/skills/lisa-setup-notion/SKILL.md +376 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-aws/SKILL.md +149 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/SKILL.md +382 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/assets/materialized-env-authority.mjs +262 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/assets/session-start.sh +87 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/assets/setup.sh +216 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/environment.mjs +227 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/preflight-tools.mjs +378 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +1632 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/tool-floor.mjs +94 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/toolchain.mjs +448 -0
- package/plugins/lisa-devin/skills/lisa-setup-remote-env/scripts/verify-remote-env.mjs +250 -0
- package/plugins/lisa-devin/skills/lisa-setup-sonar/SKILL.md +153 -0
- package/plugins/lisa-devin/skills/lisa-setup-workstation/SKILL.md +143 -0
- package/plugins/lisa-devin/skills/lisa-setup-workstation/scripts/bounded-child.mjs +168 -0
- package/plugins/lisa-devin/skills/lisa-setup-workstation/scripts/catalogue.mjs +293 -0
- package/plugins/lisa-devin/skills/lisa-setup-workstation/scripts/cli.mjs +333 -0
- package/plugins/lisa-devin/skills/lisa-setup-workstation/scripts/workstation.mjs +511 -0
- package/plugins/lisa-devin/skills/lisa-sonarcloud-access/SKILL.md +202 -0
- package/plugins/lisa-devin/skills/lisa-spec-conformance/SKILL.md +205 -0
- package/plugins/lisa-devin/skills/lisa-starter-sync/SKILL.md +35 -0
- package/plugins/lisa-devin/skills/lisa-sync-down/SKILL.md +209 -0
- package/plugins/lisa-devin/skills/lisa-task-decomposition/SKILL.md +195 -0
- package/plugins/lisa-devin/skills/lisa-task-triage/SKILL.md +23 -0
- package/plugins/lisa-devin/skills/lisa-tdd-implementation/SKILL.md +91 -0
- package/plugins/lisa-devin/skills/lisa-tear-down-automations/SKILL.md +85 -0
- package/plugins/lisa-devin/skills/lisa-test-strategy/SKILL.md +66 -0
- package/plugins/lisa-devin/skills/lisa-ticket-triage/SKILL.md +214 -0
- package/plugins/lisa-devin/skills/lisa-track/SKILL.md +129 -0
- package/plugins/lisa-devin/skills/lisa-tracker-add-journey/SKILL.md +28 -0
- package/plugins/lisa-devin/skills/lisa-tracker-build-intake/SKILL.md +134 -0
- package/plugins/lisa-devin/skills/lisa-tracker-claim/SKILL.md +35 -0
- package/plugins/lisa-devin/skills/lisa-tracker-create/SKILL.md +28 -0
- package/plugins/lisa-devin/skills/lisa-tracker-evidence/SKILL.md +63 -0
- package/plugins/lisa-devin/skills/lisa-tracker-journey/SKILL.md +27 -0
- package/plugins/lisa-devin/skills/lisa-tracker-read/SKILL.md +28 -0
- package/plugins/lisa-devin/skills/lisa-tracker-source-artifacts/SKILL.md +111 -0
- package/plugins/lisa-devin/skills/lisa-tracker-sync/SKILL.md +150 -0
- package/plugins/lisa-devin/skills/lisa-tracker-validate/SKILL.md +37 -0
- package/plugins/lisa-devin/skills/lisa-tracker-verify/SKILL.md +29 -0
- package/plugins/lisa-devin/skills/lisa-tracker-write/SKILL.md +55 -0
- package/plugins/lisa-devin/skills/lisa-usage-accounting/SKILL.md +205 -0
- package/plugins/lisa-devin/skills/lisa-usage-accounting/references/effectiveness.md +63 -0
- package/plugins/lisa-devin/skills/lisa-use-the-product/SKILL.md +86 -0
- package/plugins/lisa-devin/skills/lisa-validate-tracker-mapping/SKILL.md +467 -0
- package/plugins/lisa-devin/skills/lisa-verification-lifecycle/SKILL.md +384 -0
- package/plugins/lisa-devin/skills/lisa-verify/SKILL.md +55 -0
- package/plugins/lisa-devin/skills/lisa-verify-prd/SKILL.md +394 -0
- package/plugins/lisa-devin/skills/lisa-verify-workflow-change/SKILL.md +154 -0
- package/plugins/lisa-devin/skills/lisa-wiki-install/SKILL.md +101 -0
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-expo-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-expo-devin/.mcp.json +8 -0
- package/plugins/lisa-expo-devin/THIRD-PARTY-NOTICES.md +84 -0
- package/plugins/lisa-expo-devin/agents/ops-specialist.md +124 -0
- package/plugins/lisa-expo-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-expo-devin/hooks/register-maestro-mcp.sh +84 -0
- package/plugins/lisa-expo-devin/hooks.json +14 -0
- package/plugins/lisa-expo-devin/skills/add-app-clip/SKILL.md +280 -0
- package/plugins/lisa-expo-devin/skills/add-app-clip/references/native-module.md +96 -0
- package/plugins/lisa-expo-devin/skills/apollo-client/SKILL.md +238 -0
- package/plugins/lisa-expo-devin/skills/apollo-client/references/mutation-patterns.md +360 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/SKILL.md +369 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/references/atomic-levels.md +417 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/references/folder-structure.md +257 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/references/gluestack-mapping.md +233 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/scripts/test_validate_atomic_structure.py +240 -0
- package/plugins/lisa-expo-devin/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +438 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/SKILL.md +321 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/animations.md +220 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/controls.md +272 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/form-sheet.md +253 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/gradients.md +106 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/icons.md +213 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/media.md +198 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/route-structure.md +229 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/search.md +248 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/storage.md +121 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/tabs.md +433 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/toolbar-and-headers.md +284 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/visual-effects.md +197 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/webgpu-three.md +605 -0
- package/plugins/lisa-expo-devin/skills/building-native-ui/references/zoom-transitions.md +158 -0
- package/plugins/lisa-expo-devin/skills/container-view-pattern/SKILL.md +355 -0
- package/plugins/lisa-expo-devin/skills/container-view-pattern/references/examples.md +749 -0
- package/plugins/lisa-expo-devin/skills/container-view-pattern/references/patterns.md +318 -0
- package/plugins/lisa-expo-devin/skills/container-view-pattern/scripts/create_component.py +200 -0
- package/plugins/lisa-expo-devin/skills/container-view-pattern/scripts/validate_component.py +332 -0
- package/plugins/lisa-expo-devin/skills/cross-platform-compatibility/SKILL.md +268 -0
- package/plugins/lisa-expo-devin/skills/cross-platform-compatibility/references/common-issues.md +619 -0
- package/plugins/lisa-expo-devin/skills/cross-platform-compatibility/references/file-extensions.md +340 -0
- package/plugins/lisa-expo-devin/skills/cross-platform-compatibility/references/platform-api.md +276 -0
- package/plugins/lisa-expo-devin/skills/cross-platform-compatibility/scripts/validate_cross_platform.py +416 -0
- package/plugins/lisa-expo-devin/skills/directory-structure/SKILL.md +214 -0
- package/plugins/lisa-expo-devin/skills/directory-structure/scripts/validate_structure.py +454 -0
- package/plugins/lisa-expo-devin/skills/e2e-coverage-gaps/SKILL.md +117 -0
- package/plugins/lisa-expo-devin/skills/eas-update-insights/SKILL.md +228 -0
- package/plugins/lisa-expo-devin/skills/eas-update-insights/references/channel-insights-schema.md +47 -0
- package/plugins/lisa-expo-devin/skills/eas-update-insights/references/update-insights-schema.md +69 -0
- package/plugins/lisa-expo-devin/skills/expo-api-routes/SKILL.md +369 -0
- package/plugins/lisa-expo-devin/skills/expo-brownfield/SKILL.md +54 -0
- package/plugins/lisa-expo-devin/skills/expo-brownfield/references/brownfield-integrated.md +526 -0
- package/plugins/lisa-expo-devin/skills/expo-brownfield/references/brownfield-isolated.md +402 -0
- package/plugins/lisa-expo-devin/skills/expo-brownfield/references/comparison.md +63 -0
- package/plugins/lisa-expo-devin/skills/expo-brownfield/references/troubleshooting.md +88 -0
- package/plugins/lisa-expo-devin/skills/expo-cicd-workflows/SKILL.md +92 -0
- package/plugins/lisa-expo-devin/skills/expo-cicd-workflows/scripts/fetch.js +113 -0
- package/plugins/lisa-expo-devin/skills/expo-cicd-workflows/scripts/package.json +11 -0
- package/plugins/lisa-expo-devin/skills/expo-cicd-workflows/scripts/validate.js +85 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/SKILL.md +193 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/references/app-store-metadata.md +479 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/references/ios-app-store.md +355 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/references/play-store.md +264 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/references/testflight.md +58 -0
- package/plugins/lisa-expo-devin/skills/expo-deployment/references/workflows.md +200 -0
- package/plugins/lisa-expo-devin/skills/expo-dev-client/SKILL.md +164 -0
- package/plugins/lisa-expo-devin/skills/expo-env-config/SKILL.md +309 -0
- package/plugins/lisa-expo-devin/skills/expo-env-config/references/validation-patterns.md +417 -0
- package/plugins/lisa-expo-devin/skills/expo-module/SKILL.md +141 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/config-plugin.md +90 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/create-expo-module.md +206 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/lifecycle.md +127 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/module-config.md +48 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/native-module.md +286 -0
- package/plugins/lisa-expo-devin/skills/expo-module/references/native-view.md +171 -0
- package/plugins/lisa-expo-devin/skills/expo-router-best-practices/SKILL.md +432 -0
- package/plugins/lisa-expo-devin/skills/expo-router-best-practices/references/official-docs.md +290 -0
- package/plugins/lisa-expo-devin/skills/expo-router-best-practices/references/static-export-verification.md +54 -0
- package/plugins/lisa-expo-devin/skills/expo-router-best-practices/scripts/generate-route.py +171 -0
- package/plugins/lisa-expo-devin/skills/expo-tailwind-setup/SKILL.md +487 -0
- package/plugins/lisa-expo-devin/skills/expo-ui-jetpack-compose/SKILL.md +40 -0
- package/plugins/lisa-expo-devin/skills/expo-ui-swift-ui/SKILL.md +39 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/SKILL.md +419 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/references/color-tokens.md +343 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/references/component-mapping.md +307 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/references/spacing-scale.md +300 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/scripts/test_validate_styling.py +240 -0
- package/plugins/lisa-expo-devin/skills/gluestack-nativewind/scripts/validate_styling.py +424 -0
- package/plugins/lisa-expo-devin/skills/jira-add-journey/SKILL.md +140 -0
- package/plugins/lisa-expo-devin/skills/jira-create/SKILL.md +161 -0
- package/plugins/lisa-expo-devin/skills/jira-evidence/SKILL.md +84 -0
- package/plugins/lisa-expo-devin/skills/jira-evidence/scripts/post-evidence.sh +262 -0
- package/plugins/lisa-expo-devin/skills/jira-journey/SKILL.md +196 -0
- package/plugins/lisa-expo-devin/skills/jira-journey/scripts/generate-templates.py +281 -0
- package/plugins/lisa-expo-devin/skills/jira-journey/scripts/parse-plan.py +400 -0
- package/plugins/lisa-expo-devin/skills/jira-verify/SKILL.md +27 -0
- package/plugins/lisa-expo-devin/skills/local-state/SKILL.md +362 -0
- package/plugins/lisa-expo-devin/skills/local-state/references/async-storage.md +505 -0
- package/plugins/lisa-expo-devin/skills/local-state/references/persistence-patterns.md +711 -0
- package/plugins/lisa-expo-devin/skills/local-state/references/reactive-variables.md +446 -0
- package/plugins/lisa-expo-devin/skills/maestro-mcp-setup/SKILL.md +144 -0
- package/plugins/lisa-expo-devin/skills/native-data-fetching/SKILL.md +507 -0
- package/plugins/lisa-expo-devin/skills/native-data-fetching/references/expo-router-loaders.md +344 -0
- package/plugins/lisa-expo-devin/skills/ops-browser-uat/SKILL.md +124 -0
- package/plugins/lisa-expo-devin/skills/ops-check-logs/SKILL.md +217 -0
- package/plugins/lisa-expo-devin/skills/ops-db-ops/SKILL.md +214 -0
- package/plugins/lisa-expo-devin/skills/ops-deploy/SKILL.md +123 -0
- package/plugins/lisa-expo-devin/skills/ops-monitor-errors/SKILL.md +99 -0
- package/plugins/lisa-expo-devin/skills/ops-performance/SKILL.md +165 -0
- package/plugins/lisa-expo-devin/skills/ops-run-local/SKILL.md +169 -0
- package/plugins/lisa-expo-devin/skills/ops-verify-health/SKILL.md +101 -0
- package/plugins/lisa-expo-devin/skills/owasp-zap/SKILL.md +61 -0
- package/plugins/lisa-expo-devin/skills/play-store-access/SKILL.md +226 -0
- package/plugins/lisa-expo-devin/skills/playwright-ci-debugging/SKILL.md +140 -0
- package/plugins/lisa-expo-devin/skills/playwright-selectors/SKILL.md +496 -0
- package/plugins/lisa-expo-devin/skills/reduce-complexity/SKILL.md +251 -0
- package/plugins/lisa-expo-devin/skills/reduce-complexity/references/extraction-strategies.md +456 -0
- package/plugins/lisa-expo-devin/skills/reduce-complexity/references/refactoring-patterns.md +557 -0
- package/plugins/lisa-expo-devin/skills/testing-library/SKILL.md +314 -0
- package/plugins/lisa-expo-devin/skills/testing-library/references/async-patterns.md +420 -0
- package/plugins/lisa-expo-devin/skills/testing-library/references/expo-router-testing.md +556 -0
- package/plugins/lisa-expo-devin/skills/testing-library/references/mocking-patterns.md +612 -0
- package/plugins/lisa-expo-devin/skills/testing-library/references/query-priority.md +291 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/SKILL.md +134 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/expo-av-to-audio.md +132 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/expo-av-to-video.md +160 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/native-tabs.md +124 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/new-architecture.md +79 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/react-19.md +79 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/react-compiler.md +59 -0
- package/plugins/lisa-expo-devin/skills/upgrading-expo/references/react-navigation-to-expo-router.md +61 -0
- package/plugins/lisa-expo-devin/skills/use-dom/SKILL.md +417 -0
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-harper-fabric-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-harper-fabric-devin/generated-artifact-globs.txt +5 -0
- package/plugins/lisa-harper-fabric-devin/hooks/block-generated-artifact-edits.sh +141 -0
- package/plugins/lisa-harper-fabric-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-harper-fabric-devin/hooks/enforce-config-extensions.mjs +196 -0
- package/plugins/lisa-harper-fabric-devin/hooks/enforce-config-extensions.sh +46 -0
- package/plugins/lisa-harper-fabric-devin/hooks/inject-rules.sh +27 -0
- package/plugins/lisa-harper-fabric-devin/hooks.json +36 -0
- package/plugins/lisa-harper-fabric-devin/rules/eager/harper-fabric.md +31 -0
- package/plugins/lisa-harper-fabric-devin/rules/reference/harper-fabric.md +52 -0
- package/plugins/lisa-harper-fabric-devin/skills/e2e-coverage-gaps/SKILL.md +117 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-auth/SKILL.md +368 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-build-and-deploy/SKILL.md +198 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-caching/SKILL.md +265 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-component-model/SKILL.md +87 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-config-yaml/SKILL.md +283 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-operations/SKILL.md +239 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-realtime/SKILL.md +187 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-resources/SKILL.md +142 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-rest-queries/SKILL.md +403 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-schema-graphql/SKILL.md +123 -0
- package/plugins/lisa-harper-fabric-devin/skills/harper-testing/SKILL.md +254 -0
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-nestjs-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-nestjs-devin/hooks/block-migration-edits.sh +125 -0
- package/plugins/lisa-nestjs-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-nestjs-devin/hooks/lisa-edit-gate.sh +152 -0
- package/plugins/lisa-nestjs-devin/hooks.json +15 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/SKILL.md +176 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/references/advanced-features.md +527 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/references/project-patterns.md +531 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/references/quick-start.md +257 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/references/resolvers-mutations.md +413 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-graphql/references/types-scalars.md +513 -0
- package/plugins/lisa-nestjs-devin/skills/nestjs-rules/SKILL.md +560 -0
- package/plugins/lisa-nestjs-devin/skills/typeorm-patterns/SKILL.md +275 -0
- package/plugins/lisa-nestjs-devin/skills/typeorm-patterns/references/configuration-patterns.md +487 -0
- package/plugins/lisa-nestjs-devin/skills/typeorm-patterns/references/entity-patterns.md +450 -0
- package/plugins/lisa-nestjs-devin/skills/typeorm-patterns/references/observability-patterns.md +536 -0
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-devin/.claude-plugin/plugin.json +8 -0
- package/plugins/lisa-openclaw-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-connect-repo-topic/SKILL.md +163 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +185 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-connect-staff/SKILL.md +175 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-connect-staff/references/platform-routing.md +123 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-connect-staff/references/prompts.md +78 -0
- package/plugins/lisa-openclaw-devin/skills/lisa-openclaw-setup/SKILL.md +141 -0
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-phaser-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-phaser-devin/agents/accessibility-advocate.md +55 -0
- package/plugins/lisa-phaser-devin/agents/art-director.md +90 -0
- package/plugins/lisa-phaser-devin/agents/audio-director.md +65 -0
- package/plugins/lisa-phaser-devin/agents/combat-designer.md +61 -0
- package/plugins/lisa-phaser-devin/agents/economy-designer.md +59 -0
- package/plugins/lisa-phaser-devin/agents/game-designer.md +62 -0
- package/plugins/lisa-phaser-devin/agents/game-feel-specialist.md +56 -0
- package/plugins/lisa-phaser-devin/agents/level-designer.md +59 -0
- package/plugins/lisa-phaser-devin/agents/localization-manager.md +61 -0
- package/plugins/lisa-phaser-devin/agents/marketing-strategist.md +59 -0
- package/plugins/lisa-phaser-devin/agents/monetization-designer.md +59 -0
- package/plugins/lisa-phaser-devin/agents/narrative-designer.md +56 -0
- package/plugins/lisa-phaser-devin/agents/onboarding-advocate.md +59 -0
- package/plugins/lisa-phaser-devin/agents/player-advocate.md +57 -0
- package/plugins/lisa-phaser-devin/agents/producer.md +61 -0
- package/plugins/lisa-phaser-devin/agents/product-analyst.md +62 -0
- package/plugins/lisa-phaser-devin/agents/publisher.md +59 -0
- package/plugins/lisa-phaser-devin/agents/qa-playtester.md +57 -0
- package/plugins/lisa-phaser-devin/agents/target-player.md +52 -0
- package/plugins/lisa-phaser-devin/agents/ux-ui-designer.md +60 -0
- package/plugins/lisa-phaser-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-phaser-devin/hooks/inject-rules.sh +27 -0
- package/plugins/lisa-phaser-devin/hooks.json +14 -0
- package/plugins/lisa-phaser-devin/rules/eager/phaser.md +44 -0
- package/plugins/lisa-phaser-devin/rules/reference/phaser.md +184 -0
- package/plugins/lisa-phaser-devin/skills/phaser-accessibility/SKILL.md +135 -0
- package/plugins/lisa-phaser-devin/skills/phaser-asset-pipeline/SKILL.md +222 -0
- package/plugins/lisa-phaser-devin/skills/phaser-asset-sourcing/SKILL.md +151 -0
- package/plugins/lisa-phaser-devin/skills/phaser-build-deploy/SKILL.md +153 -0
- package/plugins/lisa-phaser-devin/skills/phaser-i18n/SKILL.md +122 -0
- package/plugins/lisa-phaser-devin/skills/phaser-project-structure/SKILL.md +89 -0
- package/plugins/lisa-phaser-devin/skills/phaser-services/SKILL.md +208 -0
- package/plugins/lisa-phaser-devin/skills/phaser-testing/SKILL.md +192 -0
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-rails-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-rails-devin/agents/ops-specialist.md +226 -0
- package/plugins/lisa-rails-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-rails-devin/hooks/inject-rules.sh +40 -0
- package/plugins/lisa-rails-devin/hooks/lisa-edit-gate.sh +152 -0
- package/plugins/lisa-rails-devin/hooks/rubocop-on-edit.sh +101 -0
- package/plugins/lisa-rails-devin/hooks/sg-scan-on-edit.sh +97 -0
- package/plugins/lisa-rails-devin/hooks.json +29 -0
- package/plugins/lisa-rails-devin/rules/eager/rails-conventions.md +23 -0
- package/plugins/lisa-rails-devin/rules/reference/rails-conventions.md +176 -0
- package/plugins/lisa-rails-devin/skills/action-controller-best-practices/SKILL.md +374 -0
- package/plugins/lisa-rails-devin/skills/action-view-best-practices/SKILL.md +335 -0
- package/plugins/lisa-rails-devin/skills/active-record-model-best-practices/SKILL.md +166 -0
- package/plugins/lisa-rails-devin/skills/e2e-coverage-gaps/SKILL.md +117 -0
- package/plugins/lisa-rails-devin/skills/fix-linter-error/SKILL.md +45 -0
- package/plugins/lisa-rails-devin/skills/improve-code-complexity/SKILL.md +51 -0
- package/plugins/lisa-rails-devin/skills/improve-max-lines/SKILL.md +46 -0
- package/plugins/lisa-rails-devin/skills/improve-max-lines-per-function/SKILL.md +46 -0
- package/plugins/lisa-rails-devin/skills/improve-test-coverage/SKILL.md +48 -0
- package/plugins/lisa-rails-devin/skills/jira-add-journey/SKILL.md +79 -0
- package/plugins/lisa-rails-devin/skills/jira-create/SKILL.md +100 -0
- package/plugins/lisa-rails-devin/skills/jira-evidence/SKILL.md +76 -0
- package/plugins/lisa-rails-devin/skills/jira-evidence/scripts/post-evidence.sh +262 -0
- package/plugins/lisa-rails-devin/skills/jira-journey/SKILL.md +65 -0
- package/plugins/lisa-rails-devin/skills/jira-verify/SKILL.md +26 -0
- package/plugins/lisa-rails-devin/skills/ops-check-logs/SKILL.md +191 -0
- package/plugins/lisa-rails-devin/skills/ops-deploy/SKILL.md +153 -0
- package/plugins/lisa-rails-devin/skills/ops-run-local/SKILL.md +169 -0
- package/plugins/lisa-rails-devin/skills/ops-verify-jobs/SKILL.md +157 -0
- package/plugins/lisa-rails-devin/skills/ops-verify-telemetry/SKILL.md +226 -0
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-devin/.claude-plugin/plugin.json +11 -0
- package/plugins/lisa-typescript-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-typescript-devin/hooks/block-suppress-directives.sh +141 -0
- package/plugins/lisa-typescript-devin/hooks/devin-tool-name-shim.sh +30 -0
- package/plugins/lisa-typescript-devin/hooks/format-on-edit.sh +102 -0
- package/plugins/lisa-typescript-devin/hooks/lint-on-edit.sh +117 -0
- package/plugins/lisa-typescript-devin/hooks/lisa-edit-gate.sh +152 -0
- package/plugins/lisa-typescript-devin/hooks/sg-scan-on-edit.sh +94 -0
- package/plugins/lisa-typescript-devin/hooks.json +34 -0
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-devin/.claude-plugin/plugin.json +8 -0
- package/plugins/lisa-wiki-devin/.devin-plugin/plugin.json +8 -0
- package/plugins/lisa-wiki-devin/ci/lisa-wiki-validate.yml +33 -0
- package/plugins/lisa-wiki-devin/schema/lisa-wiki-config.schema.json +162 -0
- package/plugins/lisa-wiki-devin/schema/wiki-structure.schema.json +51 -0
- package/plugins/lisa-wiki-devin/scripts/_wiki-lib.mjs +204 -0
- package/plugins/lisa-wiki-devin/scripts/diff-guard.mjs +117 -0
- package/plugins/lisa-wiki-devin/scripts/ensure-gitignore.mjs +131 -0
- package/plugins/lisa-wiki-devin/scripts/ensure-wiki.mjs +268 -0
- package/plugins/lisa-wiki-devin/scripts/ingest-git.mjs +198 -0
- package/plugins/lisa-wiki-devin/scripts/ingest-memory.mjs +135 -0
- package/plugins/lisa-wiki-devin/scripts/ingest-roles.mjs +95 -0
- package/plugins/lisa-wiki-devin/scripts/ingest_slack_channel.py +361 -0
- package/plugins/lisa-wiki-devin/scripts/lib/bounded-child.mjs +159 -0
- package/plugins/lisa-wiki-devin/scripts/lint-wiki.mjs +513 -0
- package/plugins/lisa-wiki-devin/scripts/mcp-doctor.mjs +72 -0
- package/plugins/lisa-wiki-devin/scripts/render-contract.mjs +107 -0
- package/plugins/lisa-wiki-devin/scripts/rewrite-refs.mjs +144 -0
- package/plugins/lisa-wiki-devin/scripts/slack_oauth_user.py +179 -0
- package/plugins/lisa-wiki-devin/scripts/validate-config.mjs +321 -0
- package/plugins/lisa-wiki-devin/scripts/verify-migration.mjs +203 -0
- package/plugins/lisa-wiki-devin/scripts/verify-wiki-safety.mjs +126 -0
- package/plugins/lisa-wiki-devin/scripts/wiki-safety.mjs +378 -0
- package/plugins/lisa-wiki-devin/scripts/wiki-status.mjs +345 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-add-ingest/SKILL.md +34 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-add-role/SKILL.md +35 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-confluence/SKILL.md +25 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-docs/SKILL.md +30 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-git/SKILL.md +25 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-jira/SKILL.md +28 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-memory/SKILL.md +28 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-notion/SKILL.md +25 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-roles/SKILL.md +22 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-slack/SKILL.md +30 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-connector-web/SKILL.md +23 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-doctor/SKILL.md +47 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-ingest/SKILL.md +106 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-lint/SKILL.md +32 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-migrate/SKILL.md +43 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-onboard-me/SKILL.md +33 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-query/SKILL.md +40 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-setup/SKILL.md +75 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-setup-automations/SKILL.md +83 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-status/SKILL.md +47 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-tear-down-automations/SKILL.md +34 -0
- package/plugins/lisa-wiki-devin/skills/lisa-wiki-usage/SKILL.md +50 -0
- package/plugins/lisa-wiki-devin/templates/agents/role-agent.claude.md +16 -0
- package/plugins/lisa-wiki-devin/templates/agents/role-agent.codex.toml +15 -0
- package/plugins/lisa-wiki-devin/templates/index.md +17 -0
- package/plugins/lisa-wiki-devin/templates/llm-wiki-contract.md +72 -0
- package/plugins/lisa-wiki-devin/templates/log.md +8 -0
- package/plugins/lisa-wiki-devin/templates/page-types/architecture.md +18 -0
- package/plugins/lisa-wiki-devin/templates/page-types/concept.md +18 -0
- package/plugins/lisa-wiki-devin/templates/page-types/decision.md +18 -0
- package/plugins/lisa-wiki-devin/templates/page-types/entity.md +19 -0
- package/plugins/lisa-wiki-devin/templates/page-types/open-question.md +18 -0
- package/plugins/lisa-wiki-devin/templates/page-types/playbook.md +18 -0
- package/plugins/lisa-wiki-devin/templates/page-types/project.md +19 -0
- package/plugins/lisa-wiki-devin/templates/page-types/requirement.md +19 -0
- package/plugins/lisa-wiki-devin/templates/page-types/staff.md +26 -0
- package/plugins/lisa-wiki-devin/templates/start-here.md +24 -0
- package/plugins/lisa-wiki-devin/templates/state-readme.md +20 -0
- package/plugins/lisa-wiki-devin/templates/wrapper-gitignore.txt +19 -0
- package/scripts/build-plugins.sh +2 -2
- package/scripts/deployed-guard-advice.mjs +1 -0
- package/scripts/generate-devin-plugin-artifacts.mjs +263 -0
- package/scripts/lib/hook-registration-audit.mjs +3 -1
- package/scripts/lib/per-agent-hook-filter.mjs +174 -5
- package/scripts/lib/plugin-rule-citations.mjs +2 -2
- package/scripts/two-channel-couplings.json +1 -1
|
@@ -0,0 +1,677 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Vendor-neutral AWS CLI bootstrap for remote coding environments. This is the
|
|
3
|
+
# source copied into every generated Lisa agent plugin.
|
|
4
|
+
#
|
|
5
|
+
# Required secret:
|
|
6
|
+
# LISA_AWS_BOOTSTRAP_JSON The complete remote-agent bootstrap bundle, as one
|
|
7
|
+
# JSON value. cdkstarter's IAM kit emits it, but this
|
|
8
|
+
# script neither knows nor cares which store it came
|
|
9
|
+
# from — resolve it through lisa-secrets-access like
|
|
10
|
+
# any other secret. Note that a project whose
|
|
11
|
+
# provider is AWS Secrets Manager cannot keep it
|
|
12
|
+
# there: reading it would need the very credential it
|
|
13
|
+
# contains.
|
|
14
|
+
# Optional plain variables:
|
|
15
|
+
# LISA_REMOTE_AGENT claude | codex | cursor | copilot | agy | opencode
|
|
16
|
+
# LISA_AWS_PROFILE_NAMESPACE
|
|
17
|
+
# The project component every written profile is
|
|
18
|
+
# scoped by. Falls back to the bundle's `namespace`
|
|
19
|
+
# (or `project`), then to `<owner>-<repo>` from the
|
|
20
|
+
# git origin remote. Required when none resolves.
|
|
21
|
+
# LISA_AWS_DEFAULT_PROFILE Stage selected as the default. Defaults to dev,
|
|
22
|
+
# then the first stage in the bundle.
|
|
23
|
+
# LISA_AWS_EXPECTED_ACCOUNT_ID
|
|
24
|
+
# Operator-declared account for the default stage.
|
|
25
|
+
# Checked against the bundle before anything is
|
|
26
|
+
# written, and against the live identity after.
|
|
27
|
+
# LISA_AWS_VERIFY_ALL_PROFILES
|
|
28
|
+
# 1 to prove every stage's account, not just the
|
|
29
|
+
# default's.
|
|
30
|
+
# LISA_AWS_VERIFY_OBSERVER_READS
|
|
31
|
+
# 1 to prove the ALLOW side of every observer-only
|
|
32
|
+
# profile: one representative read per observability
|
|
33
|
+
# surface must succeed. A role that can read nothing
|
|
34
|
+
# fails here instead of at verification time.
|
|
35
|
+
# LISA_AWS_CLAIM_DEFAULT_PROFILE
|
|
36
|
+
# 1 to take over a `[default]` this project does not
|
|
37
|
+
# already own. Off by default: silently repointing
|
|
38
|
+
# `default` is how one tenant's commands end up in
|
|
39
|
+
# another tenant's account.
|
|
40
|
+
# LISA_AWS_PRUNE_LEGACY_PROFILES
|
|
41
|
+
# 1 to delete the unnamespaced profiles an earlier
|
|
42
|
+
# Lisa bootstrap wrote. Off by default; they are
|
|
43
|
+
# reported either way, never silently orphaned.
|
|
44
|
+
# LISA_AWS_SKIP_VERIFY Set to 1 only for an offline image build.
|
|
45
|
+
|
|
46
|
+
set -euo pipefail
|
|
47
|
+
umask 077
|
|
48
|
+
|
|
49
|
+
# Profiles are scoped `<namespace>-agent-<stage>`, matching the convention every
|
|
50
|
+
# other profile on a multi-organisation workstation already follows. The old
|
|
51
|
+
# name is retained only so an earlier bootstrap's output can be recognised and
|
|
52
|
+
# migrated rather than left behind unexplained.
|
|
53
|
+
BOOTSTRAP_PROFILE_SUFFIX="-agent-bootstrap"
|
|
54
|
+
LEGACY_BOOTSTRAP_PROFILE="lisa-remote-agent-bootstrap"
|
|
55
|
+
AWS_CLI_VERSION="2.36.2"
|
|
56
|
+
|
|
57
|
+
fail() {
|
|
58
|
+
echo "remote-agent-aws-setup: $*" >&2
|
|
59
|
+
exit 1
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
need() {
|
|
63
|
+
command -v "$1" >/dev/null 2>&1
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
as_root() {
|
|
67
|
+
if [ "$(id -u)" = "0" ]; then
|
|
68
|
+
"$@"
|
|
69
|
+
elif need sudo; then
|
|
70
|
+
sudo "$@"
|
|
71
|
+
else
|
|
72
|
+
fail "root access is required to install $1"
|
|
73
|
+
fi
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
install_base_tools() {
|
|
77
|
+
need curl && need unzip && need jq && need gpg && return 0
|
|
78
|
+
|
|
79
|
+
if need apt-get; then
|
|
80
|
+
as_root apt-get update -y
|
|
81
|
+
as_root apt-get install -y curl unzip jq gnupg
|
|
82
|
+
elif need dnf; then
|
|
83
|
+
as_root dnf install -y curl unzip jq gnupg2
|
|
84
|
+
elif need yum; then
|
|
85
|
+
as_root yum install -y curl unzip jq gnupg2
|
|
86
|
+
else
|
|
87
|
+
fail "install curl, unzip, jq, and gpg in the remote image before running this script"
|
|
88
|
+
fi
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
install_aws_cli() {
|
|
92
|
+
need aws && return 0
|
|
93
|
+
|
|
94
|
+
local architecture aws_architecture temporary_directory
|
|
95
|
+
architecture="$(uname -m)"
|
|
96
|
+
case "$architecture" in
|
|
97
|
+
x86_64 | amd64) aws_architecture="x86_64" ;;
|
|
98
|
+
aarch64 | arm64) aws_architecture="aarch64" ;;
|
|
99
|
+
*) fail "unsupported AWS CLI architecture: $architecture" ;;
|
|
100
|
+
esac
|
|
101
|
+
|
|
102
|
+
temporary_directory="$(mktemp -d)"
|
|
103
|
+
trap 'rm -rf "${temporary_directory:-}"' EXIT
|
|
104
|
+
local installer_url
|
|
105
|
+
installer_url="https://awscli.amazonaws.com/awscli-exe-linux-${aws_architecture}-${AWS_CLI_VERSION}.zip"
|
|
106
|
+
curl -fsSL \
|
|
107
|
+
"$installer_url" \
|
|
108
|
+
-o "$temporary_directory/awscliv2.zip"
|
|
109
|
+
curl -fsSL "$installer_url.sig" -o "$temporary_directory/awscliv2.sig"
|
|
110
|
+
cat >"$temporary_directory/aws-cli-public-key.asc" <<'AWS_CLI_PUBLIC_KEY'
|
|
111
|
+
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
|
112
|
+
|
|
113
|
+
mQINBF2Cr7UBEADJZHcgusOJl7ENSyumXh85z0TRV0xJorM2B/JL0kHOyigQluUG
|
|
114
|
+
ZMLhENaG0bYatdrKP+3H91lvK050pXwnO/R7fB/FSTouki4ciIx5OuLlnJZIxSzx
|
|
115
|
+
PqGl0mkxImLNbGWoi6Lto0LYxqHN2iQtzlwTVmq9733zd3XfcXrZ3+LblHAgEt5G
|
|
116
|
+
TfNxEKJ8soPLyWmwDH6HWCnjZ/aIQRBTIQ05uVeEoYxSh6wOai7ss/KveoSNBbYz
|
|
117
|
+
gbdzoqI2Y8cgH2nbfgp3DSasaLZEdCSsIsK1u05CinE7k2qZ7KgKAUIcT/cR/grk
|
|
118
|
+
C6VwsnDU0OUCideXcQ8WeHutqvgZH1JgKDbznoIzeQHJD238GEu+eKhRHcz8/jeG
|
|
119
|
+
94zkcgJOz3KbZGYMiTh277Fvj9zzvZsbMBCedV1BTg3TqgvdX4bdkhf5cH+7NtWO
|
|
120
|
+
lrFj6UwAsGukBTAOxC0l/dnSmZhJ7Z1KmEWilro/gOrjtOxqRQutlIqG22TaqoPG
|
|
121
|
+
fYVN+en3Zwbt97kcgZDwqbuykNt64oZWc4XKCa3mprEGC3IbJTBFqglXmZ7l9ywG
|
|
122
|
+
EEUJYOlb2XrSuPWml39beWdKM8kzr1OjnlOm6+lpTRCBfo0wa9F8YZRhHPAkwKkX
|
|
123
|
+
XDeOGpWRj4ohOx0d2GWkyV5xyN14p2tQOCdOODmz80yUTgRpPVQUtOEhXQARAQAB
|
|
124
|
+
tCFBV1MgQ0xJIFRlYW0gPGF3cy1jbGlAYW1hem9uLmNvbT6JAlQEEwEIAD4CGwMF
|
|
125
|
+
CwkIBwIGFQoJCAsCBBYCAwECHgECF4AWIQT7Xbd/1cEYuAURraimMQrMRnJHXAUC
|
|
126
|
+
akV0ygUJDqP4lQAKCRCmMQrMRnJHXFHjD/9eyZLYcKuQOlLvtqSDtUBiEZf6ZZjM
|
|
127
|
+
i3ygYH8rJNtuToUH+HvSpe819urJCquXhDrlK6N+aqW0hCLtNABJG/vsafIgvIYJ
|
|
128
|
+
hSGgpgtNnQyMV1jViRWqPjbouw8OkYKBThUfT1i2Y+wn58ifs6ODBCmTexWtXspA
|
|
129
|
+
Si+Gt49xDOW0APmbOPnI+a4HJW6tVEo6MWS0WjzpiBayR3d1A4pt4YrPfSdDgpLo
|
|
130
|
+
h2SLQqlRqvvVZJaWBjhkErNFpfsBA06sDcPEOb0G8LBUbR4WOcdvhe5LubJbZuxC
|
|
131
|
+
AG9kNPCVeQP1ixwjgjXKysaxeQ6rv0VzIQgRp6tLVLWhy6AKDNvLjFSsmXZ1Wl08
|
|
132
|
+
Y/RlOHXlzLuQMRE6sR1wOdRxc9TsrNWTGiBK65cvSWOy03JeBkQQ8pesqltiyxI9
|
|
133
|
+
U21kkgiXtTSKNGfKK8pO27D81YANhRqPK7iTp6kuFiY2WtOg90KTMNlIT+Ff85Y2
|
|
134
|
+
b1rHj6Z0SrCkJujhWk3IBPic/wJgz01LEc/OAdUPlby90RJZcIBhSlWhT7mXnXIO
|
|
135
|
+
c0HWlNQrns2s3CTyYwZSiSlYe9ApeLwhjDo8NhbFuCAy61l6O5UsR4AfZxx/rGKv
|
|
136
|
+
2wFb1/RN/P4gNe6vmxZAPjR0AQcwD3tc2McimOLr/22kmPz8IH3I0X7WoSFr0Biz
|
|
137
|
+
E91G7bb0hOb/cA==
|
|
138
|
+
=knv7
|
|
139
|
+
-----END PGP PUBLIC KEY BLOCK-----
|
|
140
|
+
AWS_CLI_PUBLIC_KEY
|
|
141
|
+
mkdir -m 700 "$temporary_directory/gnupg"
|
|
142
|
+
gpg --batch --homedir "$temporary_directory/gnupg" \
|
|
143
|
+
--import "$temporary_directory/aws-cli-public-key.asc" >/dev/null 2>&1
|
|
144
|
+
gpg --batch --homedir "$temporary_directory/gnupg" \
|
|
145
|
+
--verify "$temporary_directory/awscliv2.sig" \
|
|
146
|
+
"$temporary_directory/awscliv2.zip"
|
|
147
|
+
unzip -q "$temporary_directory/awscliv2.zip" -d "$temporary_directory"
|
|
148
|
+
as_root "$temporary_directory/aws/install" \
|
|
149
|
+
--install-dir /usr/local/aws-cli \
|
|
150
|
+
--bin-dir /usr/local/bin
|
|
151
|
+
rm -rf "$temporary_directory"
|
|
152
|
+
trap - EXIT
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
remove_profile_setting() {
|
|
156
|
+
local credentials_file profile setting temporary_file
|
|
157
|
+
credentials_file="$1"
|
|
158
|
+
profile="$2"
|
|
159
|
+
setting="$3"
|
|
160
|
+
[ -f "$credentials_file" ] || return 0
|
|
161
|
+
|
|
162
|
+
temporary_file="$(mktemp "${credentials_file}.XXXXXX")"
|
|
163
|
+
awk -v profile="$profile" -v setting="$setting" '
|
|
164
|
+
/^\[[^]]+\][[:space:]]*$/ {
|
|
165
|
+
section = $0
|
|
166
|
+
sub(/^\[/, "", section)
|
|
167
|
+
sub(/\][[:space:]]*$/, "", section)
|
|
168
|
+
in_profile = section == profile
|
|
169
|
+
}
|
|
170
|
+
!(in_profile && $0 ~ "^[[:space:]]*" setting "[[:space:]]*=") { print }
|
|
171
|
+
' "$credentials_file" >"$temporary_file"
|
|
172
|
+
chmod 600 "$temporary_file"
|
|
173
|
+
mv "$temporary_file" "$credentials_file"
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
# Delete one whole ini section, header and body, from an AWS shared-config file.
|
|
177
|
+
#
|
|
178
|
+
# Used only for the migration path: profiles a PREVIOUS Lisa bootstrap wrote
|
|
179
|
+
# under the old unnamespaced convention. Sections this script never wrote are
|
|
180
|
+
# never candidates — see legacy_profile_sections, which identifies ours by the
|
|
181
|
+
# retired source_profile name rather than by guessing from the profile name.
|
|
182
|
+
remove_profile_section() {
|
|
183
|
+
local file section temporary_file
|
|
184
|
+
file="$1"
|
|
185
|
+
section="$2"
|
|
186
|
+
[ -f "$file" ] || return 0
|
|
187
|
+
|
|
188
|
+
temporary_file="$(mktemp "${file}.XXXXXX")"
|
|
189
|
+
awk -v section="$section" '
|
|
190
|
+
/^\[[^]]*\][[:space:]]*$/ {
|
|
191
|
+
current = $0
|
|
192
|
+
sub(/^\[[[:space:]]*/, "", current)
|
|
193
|
+
sub(/[[:space:]]*\][[:space:]]*$/, "", current)
|
|
194
|
+
in_section = current == section
|
|
195
|
+
if (in_section) next
|
|
196
|
+
}
|
|
197
|
+
!in_section { print }
|
|
198
|
+
' "$file" >"$temporary_file"
|
|
199
|
+
chmod 600 "$temporary_file"
|
|
200
|
+
mv "$temporary_file" "$file"
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
# Read one setting out of one ini section, or print nothing.
|
|
204
|
+
profile_setting_value() {
|
|
205
|
+
local file section setting
|
|
206
|
+
file="$1"
|
|
207
|
+
section="$2"
|
|
208
|
+
setting="$3"
|
|
209
|
+
[ -f "$file" ] || return 0
|
|
210
|
+
|
|
211
|
+
awk -v section="$section" -v setting="$setting" '
|
|
212
|
+
/^\[[^]]*\][[:space:]]*$/ {
|
|
213
|
+
current = $0
|
|
214
|
+
sub(/^\[[[:space:]]*/, "", current)
|
|
215
|
+
sub(/[[:space:]]*\][[:space:]]*$/, "", current)
|
|
216
|
+
in_section = current == section
|
|
217
|
+
next
|
|
218
|
+
}
|
|
219
|
+
in_section && $0 ~ "^[[:space:]]*" setting "[[:space:]]*=" {
|
|
220
|
+
sub(/^[^=]*=[[:space:]]*/, "")
|
|
221
|
+
sub(/[[:space:]]*$/, "")
|
|
222
|
+
print
|
|
223
|
+
exit
|
|
224
|
+
}
|
|
225
|
+
' "$file"
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
# Every section written by the OLD, unnamespaced convention.
|
|
229
|
+
#
|
|
230
|
+
# Identified by the retired bootstrap profile name, which only Lisa ever wrote,
|
|
231
|
+
# so an operator's own `[profile dev]` can never be mistaken for ours.
|
|
232
|
+
legacy_profile_sections() {
|
|
233
|
+
local file
|
|
234
|
+
file="$1"
|
|
235
|
+
[ -f "$file" ] || return 0
|
|
236
|
+
|
|
237
|
+
awk -v bootstrap="$LEGACY_BOOTSTRAP_PROFILE" '
|
|
238
|
+
/^\[[^]]*\][[:space:]]*$/ {
|
|
239
|
+
current = $0
|
|
240
|
+
sub(/^\[[[:space:]]*/, "", current)
|
|
241
|
+
sub(/[[:space:]]*\][[:space:]]*$/, "", current)
|
|
242
|
+
section = current
|
|
243
|
+
next
|
|
244
|
+
}
|
|
245
|
+
$0 ~ "^[[:space:]]*source_profile[[:space:]]*=" {
|
|
246
|
+
value = $0
|
|
247
|
+
sub(/^[^=]*=[[:space:]]*/, "", value)
|
|
248
|
+
sub(/[[:space:]]*$/, "", value)
|
|
249
|
+
if (value == bootstrap && section != "") print section
|
|
250
|
+
}
|
|
251
|
+
' "$file"
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
sanitize_session_name() {
|
|
255
|
+
local candidate
|
|
256
|
+
candidate="$(printf '%s' "${LISA_REMOTE_AGENT:-remote-agent}" \
|
|
257
|
+
| sed 's/[^A-Za-z0-9_+=,.@-]/-/g' \
|
|
258
|
+
| cut -c1-64)"
|
|
259
|
+
[ "${#candidate}" -ge 2 ] || candidate="remote-agent"
|
|
260
|
+
printf '%s\n' "$candidate"
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
# Reduce any project identifier to the safe, stable component of a profile name.
|
|
264
|
+
sanitize_namespace() {
|
|
265
|
+
printf '%s' "$1" \
|
|
266
|
+
| tr '[:upper:]' '[:lower:]' \
|
|
267
|
+
| sed -e 's/[^a-z0-9]\{1,\}/-/g' -e 's/^-*//' -e 's/-*$//' \
|
|
268
|
+
| cut -c1-48
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
# `<owner>-<repository>` for the checkout this script was run from.
|
|
272
|
+
#
|
|
273
|
+
# The forge owner is what makes the result distinguishing: two organisations
|
|
274
|
+
# routinely have a repository of the same NAME, which is the collision this
|
|
275
|
+
# whole change exists to remove, and they cannot share an owner.
|
|
276
|
+
namespace_from_git() {
|
|
277
|
+
need git || return 0
|
|
278
|
+
|
|
279
|
+
local url slug
|
|
280
|
+
url="$(git config --get remote.origin.url 2>/dev/null || true)"
|
|
281
|
+
[ -n "$url" ] || return 0
|
|
282
|
+
url="${url%.git}"
|
|
283
|
+
url="${url%/}"
|
|
284
|
+
slug="$(printf '%s' "$url" \
|
|
285
|
+
| sed -e 's#^[a-zA-Z0-9+.-]*://##' -e 's#^[^@/]*@##' -e 's#^[^/:]*[:/]##')"
|
|
286
|
+
printf '%s' "$slug" | tr '/' '-'
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
# The project component every profile this script writes is scoped by.
|
|
290
|
+
#
|
|
291
|
+
# Bare stage names (`dev`, `production`) name a stage but not an OWNER. On a
|
|
292
|
+
# workstation carrying more than one organisation two bundles then write the
|
|
293
|
+
# same names into the same shared `~/.aws/config`, the last bootstrap wins, and
|
|
294
|
+
# every later command resolves another tenant's account while reporting success.
|
|
295
|
+
# Nothing about the resulting profile is malformed, so no check on the profile
|
|
296
|
+
# can catch it; only a name that carries the owner can prevent it.
|
|
297
|
+
# Prints `<namespace>\t<where it came from>`. Both halves are returned together
|
|
298
|
+
# because this runs in a command substitution: a variable assigned inside a
|
|
299
|
+
# subshell never reaches the caller, and reporting the wrong provenance is how
|
|
300
|
+
# an operator ends up unable to explain why their profiles are named what they
|
|
301
|
+
# are named.
|
|
302
|
+
resolve_namespace() {
|
|
303
|
+
local candidate sanitized namespace_source
|
|
304
|
+
namespace_source="LISA_AWS_PROFILE_NAMESPACE"
|
|
305
|
+
candidate="${LISA_AWS_PROFILE_NAMESPACE:-}"
|
|
306
|
+
if [ -z "$candidate" ]; then
|
|
307
|
+
namespace_source="the bootstrap bundle"
|
|
308
|
+
candidate="$(printf '%s' "$bootstrap_json" | jq -r '.namespace // .project // empty')"
|
|
309
|
+
fi
|
|
310
|
+
if [ -z "$candidate" ]; then
|
|
311
|
+
namespace_source="git remote origin"
|
|
312
|
+
candidate="$(namespace_from_git)"
|
|
313
|
+
fi
|
|
314
|
+
[ -n "$candidate" ] || fail \
|
|
315
|
+
"cannot determine which project these AWS profiles belong to. Set LISA_AWS_PROFILE_NAMESPACE (for example the repository slug), add a \"namespace\" to the bootstrap bundle, or run this from a checkout with an origin remote. Unnamespaced profiles collide across organisations on a shared workstation."
|
|
316
|
+
|
|
317
|
+
sanitized="$(sanitize_namespace "$candidate")"
|
|
318
|
+
printf '%s' "$sanitized" | grep -qE '^[a-z0-9][a-z0-9-]{1,47}$' || fail \
|
|
319
|
+
"profile namespace from ${namespace_source} (\"${candidate}\") does not reduce to a usable name; set LISA_AWS_PROFILE_NAMESPACE to two or more alphanumeric characters"
|
|
320
|
+
printf '%s\t%s\n' "$sanitized" "$namespace_source"
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
# Prove which ACCOUNT a profile reaches, not merely that it authenticates.
|
|
324
|
+
#
|
|
325
|
+
# `sts:GetCallerIdentity` succeeding proves the credentials work. It says
|
|
326
|
+
# nothing about whose account they work in, and the old code never looked at
|
|
327
|
+
# what it returned — a lookup whose success was read as the answer. Comparing
|
|
328
|
+
# the returned account against the one named in the role ARN just configured is
|
|
329
|
+
# what turns a liveness probe into an identity check.
|
|
330
|
+
assert_profile_account() {
|
|
331
|
+
local profile expected stage identity actual
|
|
332
|
+
profile="$1"
|
|
333
|
+
expected="$2"
|
|
334
|
+
stage="$3"
|
|
335
|
+
|
|
336
|
+
identity="$(AWS_PAGER="" aws sts get-caller-identity --profile "$profile" --output json)" || fail \
|
|
337
|
+
"sts:GetCallerIdentity failed for profile ${profile} (stage ${stage})"
|
|
338
|
+
actual="$(printf '%s' "$identity" | jq -r '.Account // empty')"
|
|
339
|
+
[ -n "$actual" ] || fail \
|
|
340
|
+
"sts:GetCallerIdentity returned no account id for profile ${profile} (stage ${stage}); cannot prove which account it reached"
|
|
341
|
+
[ "$actual" = "$expected" ] || fail \
|
|
342
|
+
"profile ${profile} (stage ${stage}) resolved to AWS account ${actual}, but this project expects ${expected}. The credentials authenticate; they are not this project's account. Refusing to report ready."
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
# What an observer-only role must be able to READ.
|
|
346
|
+
#
|
|
347
|
+
# "Observer-only" was defined entirely by what it must not do, and the proof
|
|
348
|
+
# prescribed for it tested only the deny side. A role that can read NOTHING
|
|
349
|
+
# passes a deny-side check perfectly, so the read surface of a headless verifier
|
|
350
|
+
# was being discovered one `AccessDenied` at a time, mid-verification, and
|
|
351
|
+
# granted one ticket at a time. Three consecutive incidents in one consumer had
|
|
352
|
+
# that exact shape: instance discovery, alarm reads, and pipeline definition
|
|
353
|
+
# reads — none of those services appeared in the shipped starter policy at all,
|
|
354
|
+
# because that policy enumerated the services the stack happened to deploy
|
|
355
|
+
# rather than answering "what must a verifier be able to read?".
|
|
356
|
+
#
|
|
357
|
+
# So the surfaces below are derived from the ROLE'S PURPOSE, not from any one
|
|
358
|
+
# stack's topology. Each row is a surface, the read that represents it, and the
|
|
359
|
+
# question an observer cannot answer without it. Every action is read-only:
|
|
360
|
+
# widening the allow side generously is far cheaper than rediscovering it by
|
|
361
|
+
# denial, and it grants no write anywhere.
|
|
362
|
+
#
|
|
363
|
+
# Each probe takes no resource name, which is what lets it run against a fresh
|
|
364
|
+
# account with nothing deployed — these ask an IAM question, not an inventory
|
|
365
|
+
# one, and an empty result is a pass. The limitation that buys: a surface whose
|
|
366
|
+
# list action is granted while its detail action is not still passes here. That
|
|
367
|
+
# is exactly incident three, where the role could list pipeline executions but
|
|
368
|
+
# could not read the pipeline definition, so the table names both halves in the
|
|
369
|
+
# question column and the docs state the requirement; the probe proves the
|
|
370
|
+
# surface is reachable, not that every action on it is granted.
|
|
371
|
+
OBSERVER_READ_SURFACES=$(
|
|
372
|
+
cat <<'SURFACES'
|
|
373
|
+
deployment stacks cloudformation describe-stacks what is deployed, and did the last change apply or roll back
|
|
374
|
+
compute inventory ec2 describe-instances what is actually running, and is it healthy
|
|
375
|
+
alarm state cloudwatch describe-alarms is anything alarming right now, and since when
|
|
376
|
+
delivery pipelines codepipeline list-pipelines what the pipeline does and where this change stopped, definition as well as executions
|
|
377
|
+
builds codebuild list-projects did the build run, and what did it say
|
|
378
|
+
functions lambda list-functions is the handler deployed, and at which version
|
|
379
|
+
logs logs describe-log-groups what it printed when it failed
|
|
380
|
+
http endpoints apigateway get-rest-apis is the endpoint published and reachable
|
|
381
|
+
queues sqs list-queues is work backing up or dead-lettering
|
|
382
|
+
workflows stepfunctions list-state-machines did the orchestrated run complete or stall
|
|
383
|
+
SURFACES
|
|
384
|
+
)
|
|
385
|
+
|
|
386
|
+
# Stages whose profile is observer-only, per the contract's own words.
|
|
387
|
+
#
|
|
388
|
+
# The bootstrap bundle carries no observer field today, so this reads one if a
|
|
389
|
+
# bundle supplies it and otherwise falls back to the definition the contract
|
|
390
|
+
# already states in prose: dev and staging may repair, production and shared are
|
|
391
|
+
# observer-only. Deriving it is what makes "observer" exist anywhere other than
|
|
392
|
+
# a sentence in a document — until now nothing in the data or the code could
|
|
393
|
+
# answer which profiles the word applied to.
|
|
394
|
+
is_observer_stage() {
|
|
395
|
+
local stage declared
|
|
396
|
+
stage="$1"
|
|
397
|
+
# `has` rather than `.observer // empty`: jq's alternative operator treats
|
|
398
|
+
# `false` as absent, so a stage that explicitly declared itself NOT an
|
|
399
|
+
# observer fell through to the name-based default and was probed anyway —
|
|
400
|
+
# the declaration was accepted only when it agreed with the guess.
|
|
401
|
+
declared="$(printf '%s' "$profiles_json" | jq -r --arg s "$stage" '
|
|
402
|
+
.[$s] | if type == "object" and has("observer") then (.observer | tostring) else empty end
|
|
403
|
+
')"
|
|
404
|
+
if [ -n "$declared" ]; then
|
|
405
|
+
[ "$declared" = "true" ]
|
|
406
|
+
return
|
|
407
|
+
fi
|
|
408
|
+
case "$stage" in
|
|
409
|
+
production | shared) return 0 ;;
|
|
410
|
+
*) return 1 ;;
|
|
411
|
+
esac
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
# Prove the ALLOW side of an observer profile.
|
|
415
|
+
#
|
|
416
|
+
# Reports every surface it could not read rather than stopping at the first,
|
|
417
|
+
# because an operator repairing a policy wants the whole list — the same reason
|
|
418
|
+
# the toolchain planner reports every unresolvable tool at once. One ticket, not
|
|
419
|
+
# three in a row.
|
|
420
|
+
#
|
|
421
|
+
# Denied and unreachable are kept apart. A read that fails because the service
|
|
422
|
+
# could not be reached says nothing about the policy, and folding it into
|
|
423
|
+
# "denied" would send someone to widen a policy that was already correct; a pass
|
|
424
|
+
# is never claimed from either.
|
|
425
|
+
assert_observer_reads() {
|
|
426
|
+
local profile stage denied unreachable surface probe question output status
|
|
427
|
+
profile="$1"
|
|
428
|
+
stage="$2"
|
|
429
|
+
denied=""
|
|
430
|
+
unreachable=""
|
|
431
|
+
|
|
432
|
+
while IFS="$(printf '\t')" read -r surface probe question; do
|
|
433
|
+
[ -n "$surface" ] || continue
|
|
434
|
+
set +e
|
|
435
|
+
output="$(AWS_PAGER="" aws --profile "$profile" $probe 2>&1)"
|
|
436
|
+
status=$?
|
|
437
|
+
set -e
|
|
438
|
+
[ "$status" -eq 0 ] && continue
|
|
439
|
+
case "$output" in
|
|
440
|
+
*AccessDenied* | *UnauthorizedOperation* | *not\ authorized*)
|
|
441
|
+
denied="${denied}
|
|
442
|
+
${surface} — \`aws ${probe}\` was denied, so this role cannot answer: ${question}"
|
|
443
|
+
;;
|
|
444
|
+
*)
|
|
445
|
+
unreachable="${unreachable}
|
|
446
|
+
${surface} — \`aws ${probe}\` did not return an authorization answer at all: ${output}"
|
|
447
|
+
;;
|
|
448
|
+
esac
|
|
449
|
+
done <<<"$OBSERVER_READ_SURFACES"
|
|
450
|
+
|
|
451
|
+
if [ -n "$unreachable" ]; then
|
|
452
|
+
fail "profile ${profile} (stage ${stage}) could not be checked against the observer read surface, so nothing about its permissions was proved:${unreachable}"
|
|
453
|
+
fi
|
|
454
|
+
if [ -n "$denied" ]; then
|
|
455
|
+
fail "profile ${profile} (stage ${stage}) is observer-only but cannot read the surfaces an observer exists to read. Widen the role's read-only policy to cover them; every action below is read-only and none grants a write:${denied}"
|
|
456
|
+
fi
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
# Who currently owns `[default]`.
|
|
460
|
+
#
|
|
461
|
+
# `default` is the one name that cannot be namespaced, so it is the one place
|
|
462
|
+
# two projects still contend. Taking it over silently is the whole defect in
|
|
463
|
+
# miniature: every unqualified `aws` command would change accounts with nothing
|
|
464
|
+
# said. An inert `[default]` holding only region/output is not a claim on it,
|
|
465
|
+
# and a container that ships one must still be able to bootstrap.
|
|
466
|
+
default_profile_owner() {
|
|
467
|
+
local source_value setting
|
|
468
|
+
source_value="$(profile_setting_value "$config_file" "default" "source_profile")"
|
|
469
|
+
if [ "$source_value" = "$BOOTSTRAP_PROFILE" ]; then
|
|
470
|
+
printf 'ours\n'
|
|
471
|
+
return 0
|
|
472
|
+
fi
|
|
473
|
+
if [ "$source_value" = "$LEGACY_BOOTSTRAP_PROFILE" ]; then
|
|
474
|
+
printf 'legacy\n'
|
|
475
|
+
return 0
|
|
476
|
+
fi
|
|
477
|
+
case "$source_value" in
|
|
478
|
+
*"$BOOTSTRAP_PROFILE_SUFFIX")
|
|
479
|
+
printf 'another Lisa project\n'
|
|
480
|
+
return 0
|
|
481
|
+
;;
|
|
482
|
+
esac
|
|
483
|
+
for setting in role_arn credential_process sso_start_url sso_session aws_access_key_id; do
|
|
484
|
+
if [ -n "$(profile_setting_value "$config_file" "default" "$setting")" ]; then
|
|
485
|
+
printf 'this workstation operator\n'
|
|
486
|
+
return 0
|
|
487
|
+
fi
|
|
488
|
+
done
|
|
489
|
+
if [ -n "$(profile_setting_value "$credentials_file" "default" "aws_access_key_id")" ]; then
|
|
490
|
+
printf 'this workstation operator\n'
|
|
491
|
+
return 0
|
|
492
|
+
fi
|
|
493
|
+
printf 'unclaimed\n'
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
install_base_tools
|
|
497
|
+
install_aws_cli
|
|
498
|
+
|
|
499
|
+
[ -z "${AWS_ACCESS_KEY_ID:-}" ] || fail \
|
|
500
|
+
"do not set AWS_ACCESS_KEY_ID directly; set only LISA_AWS_BOOTSTRAP_JSON so role profiles cannot be bypassed"
|
|
501
|
+
[ -z "${AWS_SECRET_ACCESS_KEY:-}" ] || fail \
|
|
502
|
+
"do not set AWS_SECRET_ACCESS_KEY directly; set only LISA_AWS_BOOTSTRAP_JSON so role profiles cannot be bypassed"
|
|
503
|
+
|
|
504
|
+
bootstrap_json="${LISA_AWS_BOOTSTRAP_JSON:-}"
|
|
505
|
+
[ -n "$bootstrap_json" ] || fail "LISA_AWS_BOOTSTRAP_JSON is required"
|
|
506
|
+
|
|
507
|
+
printf '%s' "$bootstrap_json" | jq -e '
|
|
508
|
+
type == "object" and
|
|
509
|
+
(.accessKeyId | type == "string" and length > 0) and
|
|
510
|
+
(.secretAccessKey | type == "string" and length > 0) and
|
|
511
|
+
(.externalId | type == "string" and length > 0) and
|
|
512
|
+
(.profiles | (type == "object" or type == "string"))
|
|
513
|
+
' >/dev/null || fail "LISA_AWS_BOOTSTRAP_JSON is not a valid remote-agent bootstrap bundle"
|
|
514
|
+
|
|
515
|
+
access_key_id="$(printf '%s' "$bootstrap_json" | jq -er '.accessKeyId')"
|
|
516
|
+
secret_access_key="$(printf '%s' "$bootstrap_json" | jq -er '.secretAccessKey')"
|
|
517
|
+
external_id="$(printf '%s' "$bootstrap_json" | jq -er '.externalId')"
|
|
518
|
+
session_token="$(printf '%s' "$bootstrap_json" | jq -r '.sessionToken // empty')"
|
|
519
|
+
profiles_json="$(printf '%s' "$bootstrap_json" | jq -c '
|
|
520
|
+
if (.profiles | type) == "string" then
|
|
521
|
+
.profiles | fromjson
|
|
522
|
+
else
|
|
523
|
+
.profiles
|
|
524
|
+
end
|
|
525
|
+
')"
|
|
526
|
+
|
|
527
|
+
namespace_resolution="$(resolve_namespace)"
|
|
528
|
+
PROFILE_NAMESPACE="${namespace_resolution%%$'\t'*}"
|
|
529
|
+
namespace_source="${namespace_resolution#*$'\t'}"
|
|
530
|
+
BOOTSTRAP_PROFILE="${PROFILE_NAMESPACE}${BOOTSTRAP_PROFILE_SUFFIX}"
|
|
531
|
+
|
|
532
|
+
# The role ARN carries the account the role lives in, so every bundle already
|
|
533
|
+
# declares an expected account per stage whether or not it says so explicitly.
|
|
534
|
+
# Requiring the full ARN shape is what makes that field readable at all.
|
|
535
|
+
printf '%s' "$profiles_json" | jq -e --arg bootstrap_profile "$BOOTSTRAP_PROFILE" '
|
|
536
|
+
type == "object" and length > 0 and
|
|
537
|
+
all(to_entries[];
|
|
538
|
+
(.key != $bootstrap_profile) and
|
|
539
|
+
(.key != "bootstrap") and
|
|
540
|
+
(.key | test("^[A-Za-z0-9_-]+$")) and
|
|
541
|
+
(.value.roleArn | type == "string" and test("^arn:aws:iam::[0-9]{12}:role/.+")) and
|
|
542
|
+
(.value.region | type == "string" and length > 0)
|
|
543
|
+
)
|
|
544
|
+
' >/dev/null || fail "bootstrap profiles must map safe names (not \"bootstrap\") to a full arn:aws:iam::<account>:role/<name> roleArn and a region"
|
|
545
|
+
|
|
546
|
+
# An explicitly declared account that disagrees with the role ARN is a bundle
|
|
547
|
+
# that cannot be believed. Fail here, before anything is written, naming both.
|
|
548
|
+
while IFS="$(printf '\t')" read -r stage declared_account arn_account; do
|
|
549
|
+
[ "$declared_account" = "$arn_account" ] || fail \
|
|
550
|
+
"bundle stage ${stage} declares expectedAccountId ${declared_account} but its roleArn names account ${arn_account}"
|
|
551
|
+
done < <(printf '%s' "$profiles_json" | jq -r '
|
|
552
|
+
to_entries[]
|
|
553
|
+
| select(.value.expectedAccountId != null)
|
|
554
|
+
| [.key, (.value.expectedAccountId | tostring), (.value.roleArn | split(":")[4])]
|
|
555
|
+
| @tsv
|
|
556
|
+
')
|
|
557
|
+
|
|
558
|
+
default_stage="${LISA_AWS_DEFAULT_PROFILE:-dev}"
|
|
559
|
+
if ! printf '%s' "$profiles_json" | jq -e --arg stage "$default_stage" 'has($stage)' >/dev/null; then
|
|
560
|
+
default_stage="$(printf '%s' "$profiles_json" | jq -r 'keys[0]')"
|
|
561
|
+
fi
|
|
562
|
+
|
|
563
|
+
default_role_arn="$(printf '%s' "$profiles_json" | jq -er --arg stage "$default_stage" '.[$stage].roleArn')"
|
|
564
|
+
default_region="$(printf '%s' "$profiles_json" | jq -er --arg stage "$default_stage" '.[$stage].region')"
|
|
565
|
+
default_expected_account="$(printf '%s' "$profiles_json" | jq -er --arg stage "$default_stage" '
|
|
566
|
+
(.[$stage].expectedAccountId // (.[$stage].roleArn | split(":")[4])) | tostring
|
|
567
|
+
')"
|
|
568
|
+
|
|
569
|
+
if [ -n "${LISA_AWS_EXPECTED_ACCOUNT_ID:-}" ] \
|
|
570
|
+
&& [ "$LISA_AWS_EXPECTED_ACCOUNT_ID" != "$default_expected_account" ]; then
|
|
571
|
+
fail "LISA_AWS_EXPECTED_ACCOUNT_ID is ${LISA_AWS_EXPECTED_ACCOUNT_ID} but the bundle's ${default_stage} role is in account ${default_expected_account}"
|
|
572
|
+
fi
|
|
573
|
+
|
|
574
|
+
credentials_file="${AWS_SHARED_CREDENTIALS_FILE:-$HOME/.aws/credentials}"
|
|
575
|
+
config_file="${AWS_CONFIG_FILE:-$HOME/.aws/config}"
|
|
576
|
+
mkdir -p "$HOME/.aws" "$(dirname "$credentials_file")" "$(dirname "$config_file")"
|
|
577
|
+
chmod 700 "$HOME/.aws"
|
|
578
|
+
|
|
579
|
+
profile_names="$(printf '%s' "$profiles_json" \
|
|
580
|
+
| jq -r --arg namespace "$PROFILE_NAMESPACE" 'keys | map($namespace + "-agent-" + .) | join(", ")')"
|
|
581
|
+
|
|
582
|
+
# Migration: the previous convention's profiles are still on this workstation.
|
|
583
|
+
#
|
|
584
|
+
# They are reported rather than removed, because deleting a profile an operator
|
|
585
|
+
# may still be using is its own silent surprise. Pruning is opt-in and says
|
|
586
|
+
# exactly what it removed.
|
|
587
|
+
legacy_sections="$(legacy_profile_sections "$config_file")"
|
|
588
|
+
legacy_names=""
|
|
589
|
+
if [ -n "$legacy_sections" ]; then
|
|
590
|
+
legacy_names="$(printf '%s\n' "$legacy_sections" | sed 's/^profile //' | paste -sd ',' - | sed 's/,/, /g')"
|
|
591
|
+
if [ "${LISA_AWS_PRUNE_LEGACY_PROFILES:-0}" = "1" ]; then
|
|
592
|
+
printf '%s\n' "$legacy_sections" | while IFS= read -r section; do
|
|
593
|
+
[ -n "$section" ] || continue
|
|
594
|
+
remove_profile_section "$config_file" "$section"
|
|
595
|
+
done
|
|
596
|
+
remove_profile_section "$config_file" "profile ${LEGACY_BOOTSTRAP_PROFILE}"
|
|
597
|
+
remove_profile_section "$credentials_file" "$LEGACY_BOOTSTRAP_PROFILE"
|
|
598
|
+
fi
|
|
599
|
+
fi
|
|
600
|
+
|
|
601
|
+
default_owner="$(default_profile_owner)"
|
|
602
|
+
case "$default_owner" in
|
|
603
|
+
ours | legacy | unclaimed) ;;
|
|
604
|
+
*)
|
|
605
|
+
[ "${LISA_AWS_CLAIM_DEFAULT_PROFILE:-0}" = "1" ] || fail \
|
|
606
|
+
"refusing to overwrite the [default] AWS profile in ${config_file}: it belongs to ${default_owner}, not to ${PROFILE_NAMESPACE}. Overwriting it would silently repoint every unqualified aws command at this project's accounts. Use the named profiles instead (${profile_names}), or set LISA_AWS_CLAIM_DEFAULT_PROFILE=1 to take it over deliberately."
|
|
607
|
+
;;
|
|
608
|
+
esac
|
|
609
|
+
|
|
610
|
+
aws configure set aws_access_key_id "$access_key_id" --profile "$BOOTSTRAP_PROFILE"
|
|
611
|
+
aws configure set aws_secret_access_key "$secret_access_key" --profile "$BOOTSTRAP_PROFILE"
|
|
612
|
+
if [ -n "$session_token" ]; then
|
|
613
|
+
aws configure set aws_session_token "$session_token" --profile "$BOOTSTRAP_PROFILE"
|
|
614
|
+
else
|
|
615
|
+
remove_profile_setting \
|
|
616
|
+
"$credentials_file" \
|
|
617
|
+
"$BOOTSTRAP_PROFILE" \
|
|
618
|
+
"aws_session_token"
|
|
619
|
+
fi
|
|
620
|
+
|
|
621
|
+
session_name="$(sanitize_session_name)"
|
|
622
|
+
while IFS="$(printf '\t')" read -r stage role_arn region; do
|
|
623
|
+
profile_name="${PROFILE_NAMESPACE}-agent-${stage}"
|
|
624
|
+
aws configure set role_arn "$role_arn" --profile "$profile_name"
|
|
625
|
+
aws configure set source_profile "$BOOTSTRAP_PROFILE" --profile "$profile_name"
|
|
626
|
+
aws configure set external_id "$external_id" --profile "$profile_name"
|
|
627
|
+
aws configure set role_session_name "$session_name" --profile "$profile_name"
|
|
628
|
+
aws configure set region "$region" --profile "$profile_name"
|
|
629
|
+
done < <(printf '%s' "$profiles_json" | jq -r 'to_entries[] | [.key, .value.roleArn, .value.region] | @tsv')
|
|
630
|
+
|
|
631
|
+
default_profile="${PROFILE_NAMESPACE}-agent-${default_stage}"
|
|
632
|
+
aws configure set role_arn "$default_role_arn" --profile default
|
|
633
|
+
aws configure set source_profile "$BOOTSTRAP_PROFILE" --profile default
|
|
634
|
+
aws configure set external_id "$external_id" --profile default
|
|
635
|
+
aws configure set role_session_name "$session_name" --profile default
|
|
636
|
+
aws configure set region "$default_region" --profile default
|
|
637
|
+
|
|
638
|
+
chmod 600 "$credentials_file" "$config_file"
|
|
639
|
+
|
|
640
|
+
if [ "${LISA_AWS_SKIP_VERIFY:-0}" != "1" ]; then
|
|
641
|
+
if [ "${LISA_AWS_VERIFY_ALL_PROFILES:-0}" = "1" ]; then
|
|
642
|
+
while IFS="$(printf '\t')" read -r stage expected_account; do
|
|
643
|
+
assert_profile_account "${PROFILE_NAMESPACE}-agent-${stage}" "$expected_account" "$stage"
|
|
644
|
+
done < <(printf '%s' "$profiles_json" | jq -r '
|
|
645
|
+
to_entries[]
|
|
646
|
+
| [.key, ((.value.expectedAccountId // (.value.roleArn | split(":")[4])) | tostring)]
|
|
647
|
+
| @tsv
|
|
648
|
+
')
|
|
649
|
+
else
|
|
650
|
+
assert_profile_account "$default_profile" "$default_expected_account" "$default_stage"
|
|
651
|
+
fi
|
|
652
|
+
# Ordered after the account assertions on purpose, and it is the ordering that
|
|
653
|
+
# makes either half mean anything. `AccessDenied` is what an unassumed role, a
|
|
654
|
+
# misconfigured profile and a correctly-scoped observer all return, so a
|
|
655
|
+
# boundary check run before identity is bound passes on a credential that
|
|
656
|
+
# reached the wrong account entirely — the same class of vacuous pass this
|
|
657
|
+
# script already refuses for `sts:GetCallerIdentity`. Binding the profile to
|
|
658
|
+
# its expected account first is what turns the reads below into a statement
|
|
659
|
+
# about THIS role.
|
|
660
|
+
if [ "${LISA_AWS_VERIFY_OBSERVER_READS:-0}" = "1" ]; then
|
|
661
|
+
while IFS= read -r stage; do
|
|
662
|
+
[ -n "$stage" ] || continue
|
|
663
|
+
is_observer_stage "$stage" || continue
|
|
664
|
+
assert_observer_reads "${PROFILE_NAMESPACE}-agent-${stage}" "$stage"
|
|
665
|
+
done < <(printf '%s' "$profiles_json" | jq -r 'keys[]')
|
|
666
|
+
fi
|
|
667
|
+
fi
|
|
668
|
+
|
|
669
|
+
if [ -n "$legacy_names" ]; then
|
|
670
|
+
if [ "${LISA_AWS_PRUNE_LEGACY_PROFILES:-0}" = "1" ]; then
|
|
671
|
+
echo "remote-agent-aws-setup: removed unnamespaced profiles left by an earlier bootstrap: ${legacy_names}" >&2
|
|
672
|
+
else
|
|
673
|
+
echo "remote-agent-aws-setup: ${config_file} still contains unnamespaced profiles written by an earlier Lisa bootstrap: ${legacy_names}. They name a stage but no owner, so on a workstation carrying more than one organisation they can resolve to another tenant's account. Review them, or re-run with LISA_AWS_PRUNE_LEGACY_PROFILES=1 to delete the ones Lisa wrote." >&2
|
|
674
|
+
fi
|
|
675
|
+
fi
|
|
676
|
+
|
|
677
|
+
echo "remote-agent-aws-setup: ready (${session_name}; namespace=${PROFILE_NAMESPACE} via ${namespace_source}; default=${default_profile} in account ${default_expected_account}; profiles=${profile_names})"
|