@codyswann/lisa 2.195.4 → 2.195.7
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/README.md +17 -3
- package/all/copy-contents/gitignore +10 -4
- package/dist/cli/print-update-warning.d.ts +1 -1
- package/dist/cli/print-update-warning.js +2 -2
- package/dist/cli/print-update-warning.js.map +1 -1
- package/dist/cli/update-check.d.ts +6 -0
- package/dist/cli/update-check.d.ts.map +1 -1
- package/dist/cli/update-check.js +3 -3
- package/dist/cli/update-check.js.map +1 -1
- package/dist/cli/update-cmd.d.ts +1 -1
- package/dist/cli/update-cmd.d.ts.map +1 -1
- package/dist/cli/update-cmd.js +8 -7
- package/dist/cli/update-cmd.js.map +1 -1
- package/dist/codex/hooks-installer.d.ts +4 -1
- package/dist/codex/hooks-installer.d.ts.map +1 -1
- package/dist/codex/hooks-installer.js +109 -30
- package/dist/codex/hooks-installer.js.map +1 -1
- package/dist/codex/mcp-installer.d.ts +22 -0
- package/dist/codex/mcp-installer.d.ts.map +1 -0
- package/dist/codex/mcp-installer.js +135 -0
- package/dist/codex/mcp-installer.js.map +1 -0
- package/dist/codex/plugin-marketplace-installer.d.ts +19 -13
- package/dist/codex/plugin-marketplace-installer.d.ts.map +1 -1
- package/dist/codex/plugin-marketplace-installer.js +69 -72
- package/dist/codex/plugin-marketplace-installer.js.map +1 -1
- package/dist/codex/project-hooks-cleanup.d.ts +12 -0
- package/dist/codex/project-hooks-cleanup.d.ts.map +1 -0
- package/dist/codex/project-hooks-cleanup.js +31 -0
- package/dist/codex/project-hooks-cleanup.js.map +1 -0
- package/dist/codex/project-overlay.d.ts +23 -0
- package/dist/codex/project-overlay.d.ts.map +1 -0
- package/dist/codex/project-overlay.js +64 -0
- package/dist/codex/project-overlay.js.map +1 -0
- package/dist/codex/scripts/inject-rules.sh +4 -0
- package/dist/codex/scripts/install-pkgs.sh +4 -0
- package/dist/codex/scripts/setup-jira-cli.sh +5 -1
- package/dist/codex/settings-installer.d.ts.map +1 -1
- package/dist/codex/settings-installer.js +16 -3
- package/dist/codex/settings-installer.js.map +1 -1
- package/dist/codex/skills-installer.d.ts +15 -19
- package/dist/codex/skills-installer.d.ts.map +1 -1
- package/dist/codex/skills-installer.js +47 -140
- package/dist/codex/skills-installer.js.map +1 -1
- package/dist/core/lisa-plugin-selection.d.ts +16 -0
- package/dist/core/lisa-plugin-selection.d.ts.map +1 -0
- package/dist/core/lisa-plugin-selection.js +59 -0
- package/dist/core/lisa-plugin-selection.js.map +1 -0
- package/dist/core/lisa-rules-mirror.d.ts +2 -1
- package/dist/core/lisa-rules-mirror.d.ts.map +1 -1
- package/dist/core/lisa-rules-mirror.js +19 -3
- package/dist/core/lisa-rules-mirror.js.map +1 -1
- package/dist/core/lisa-skill-sources.d.ts.map +1 -1
- package/dist/core/lisa-skill-sources.js +16 -1
- package/dist/core/lisa-skill-sources.js.map +1 -1
- package/dist/core/lisa.d.ts +4 -6
- package/dist/core/lisa.d.ts.map +1 -1
- package/dist/core/lisa.js +12 -38
- package/dist/core/lisa.js.map +1 -1
- package/dist/migrations/ensure-lisa-postinstall.d.ts.map +1 -1
- package/dist/migrations/ensure-lisa-postinstall.js +4 -3
- package/dist/migrations/ensure-lisa-postinstall.js.map +1 -1
- package/dist/opencode/plugin-templates/lisa-session-bootstrap.ts +2 -3
- package/expo/create-only/.github/workflows/deploy.yml +6 -6
- package/npm-package/create-only/.github/workflows/publish-to-npm.yml +2 -1
- package/package.json +2 -3
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +2 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-acceptance-criteria/SKILL.md +71 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-acceptance-criteria/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-agent-design-best-practices/SKILL.md +219 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-agent-design-best-practices/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-analyze-claude-remote/SKILL.md +429 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-analyze-claude-remote/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-atlassian-access/SKILL.md +361 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-atlassian-access/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-atlassian-access/scripts/markdown-to-adf.mjs +214 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-automation-status/SKILL.md +111 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-automation-status/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-bug-triage/SKILL.md +23 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-bug-triage/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-codebase-research/SKILL.md +87 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-codebase-research/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-codify-verification/SKILL.md +162 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-codify-verification/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-confluence-prd-intake/SKILL.md +417 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-confluence-prd-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-confluence-to-tracker/SKILL.md +356 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-confluence-to-tracker/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-confluence-write-prd/SKILL.md +109 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-confluence-write-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-cross-pollinate/SKILL.md +175 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-cross-pollinate/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-debrief/SKILL.md +94 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-debrief/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-debrief-apply/SKILL.md +63 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-debrief-apply/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +336 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-doctor/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +179 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-epic-triage/SKILL.md +28 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-epic-triage/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-exploratory-qa/SKILL.md +91 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-exploratory-qa/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-fix-linter-error/SKILL.md +45 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-fix-linter-error/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-generate-claude-remote-build-script/SKILL.md +224 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-generate-claude-remote-build-script/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-git-commit/SKILL.md +48 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-git-commit/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-git-prune/SKILL.md +35 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-git-prune/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-git-submit-pr/SKILL.md +113 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-git-submit-pr/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-add-journey/SKILL.md +115 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-add-journey/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-build-intake/SKILL.md +446 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-build-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-create/SKILL.md +101 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-create/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-evidence/SKILL.md +110 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-evidence/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-journey/SKILL.md +121 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-journey/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-prd-intake/SKILL.md +432 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-prd-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-project-v2/SKILL.md +227 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-project-v2/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-read-issue/SKILL.md +248 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-read-issue/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-sync/SKILL.md +132 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-sync/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-to-tracker/SKILL.md +339 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-to-tracker/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +330 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-verify/SKILL.md +29 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-verify/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/SKILL.md +339 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-write-prd/SKILL.md +157 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-write-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-implement/SKILL.md +202 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-implement/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-code-complexity/SKILL.md +44 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-code-complexity/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-max-lines/SKILL.md +45 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-max-lines/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-max-lines-per-function/SKILL.md +46 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-max-lines-per-function/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-test-coverage/SKILL.md +44 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-test-coverage/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-tests/SKILL.md +47 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-tests/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-intake/SKILL.md +133 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-intake-explain/SKILL.md +279 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-intake-explain/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jam-access/SKILL.md +52 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jam-access/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-add-journey/SKILL.md +121 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-add-journey/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-build-intake/SKILL.md +368 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-build-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-create/SKILL.md +154 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-create/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-evidence/SKILL.md +90 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-evidence/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-evidence/scripts/post-evidence.sh +180 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/SKILL.md +127 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/scripts/generate-templates.py +233 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/scripts/parse-plan.py +368 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-read-ticket/SKILL.md +198 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-read-ticket/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-read-ticket/scripts/download-attachment.sh +110 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-sync/SKILL.md +108 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-sync/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +317 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-verify/SKILL.md +30 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-verify/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/SKILL.md +267 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jsdoc-best-practices/SKILL.md +432 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jsdoc-best-practices/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +90 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-add-journey/SKILL.md +105 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-add-journey/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +346 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-create/SKILL.md +146 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-create/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-evidence/SKILL.md +103 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-evidence/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-journey/SKILL.md +134 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-journey/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-prd-intake/SKILL.md +383 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-prd-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-read-issue/SKILL.md +200 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-read-issue/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-sync/SKILL.md +127 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-sync/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-to-tracker/SKILL.md +339 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-to-tracker/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +314 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-verify/SKILL.md +51 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-verify/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +292 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-prd/SKILL.md +96 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-monitor/SKILL.md +69 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-monitor/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-nightly-add-test-coverage/SKILL.md +40 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-nightly-add-test-coverage/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-nightly-improve-tests/SKILL.md +29 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-nightly-improve-tests/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-nightly-lower-code-complexity/SKILL.md +28 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-nightly-lower-code-complexity/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-access/SKILL.md +226 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-access/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-prd-intake/SKILL.md +360 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-prd-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-to-tracker/SKILL.md +353 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-to-tracker/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-write-prd/SKILL.md +109 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-write-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-code-review/SKILL.md +83 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-code-review/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-code-simplifier/SKILL.md +76 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-code-simplifier/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-coderabbit/SKILL.md +77 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-coderabbit/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-safety-net-rules/SKILL.md +144 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-safety-net-rules/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-sentry-sdk-setup/SKILL.md +211 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-sentry-sdk-setup/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-sentry-seer/SKILL.md +135 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-sentry-seer/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-skill-creator/SKILL.md +151 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-skill-creator/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-performance-review/SKILL.md +94 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-performance-review/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-plan/SKILL.md +60 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-plan/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-plugin-sync-explain/SKILL.md +53 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-plugin-sync-explain/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-posthog-access/SKILL.md +60 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-posthog-access/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-backlink/SKILL.md +265 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-backlink/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-source-write/SKILL.md +101 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-source-write/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-ticket-coverage/SKILL.md +170 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-ticket-coverage/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-product-walkthrough/SKILL.md +104 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-product-walkthrough/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/SKILL.md +315 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/examples/evidence-card-format.md +21 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/examples/host-project-only.md +22 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/examples/idempotency-verification-harness.md +57 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/examples/public-external-inspiration.md +22 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/examples/unavailable-data-rejection.md +22 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-pull-request-review/SKILL.md +84 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-pull-request-review/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-quality-review/SKILL.md +54 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-quality-review/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-queue-status/SKILL.md +133 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-queue-status/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +1030 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-reproduce-bug/SKILL.md +96 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-reproduce-bug/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-research/SKILL.md +68 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-research/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-review-implementation/SKILL.md +209 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-review-implementation/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-review-local/SKILL.md +88 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-review-local/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-root-cause-analysis/SKILL.md +155 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-root-cause-analysis/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-security-review/SKILL.md +57 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-security-review/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-security-zap-scan/SKILL.md +33 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-security-zap-scan/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sentry-access/SKILL.md +56 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sentry-access/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-atlassian/SKILL.md +347 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-atlassian/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-automations/SKILL.md +103 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-automations/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-confluence/SKILL.md +254 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-confluence/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-github/SKILL.md +268 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-github/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-jira/SKILL.md +198 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-jira/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +251 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-notion/SKILL.md +316 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-notion/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sonarcloud-access/SKILL.md +71 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sonarcloud-access/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-spec-conformance/SKILL.md +159 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-spec-conformance/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sync-down/SKILL.md +171 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sync-down/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-task-decomposition/SKILL.md +127 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-task-decomposition/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-task-triage/SKILL.md +23 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-task-triage/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tdd-implementation/SKILL.md +86 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tdd-implementation/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tear-down-automations/SKILL.md +34 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tear-down-automations/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-test-strategy/SKILL.md +63 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-test-strategy/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-ticket-triage/SKILL.md +186 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-ticket-triage/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-add-journey/SKILL.md +27 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-add-journey/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-build-intake/SKILL.md +86 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-build-intake/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-create/SKILL.md +27 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-create/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-evidence/SKILL.md +53 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-evidence/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-journey/SKILL.md +27 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-journey/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-read/SKILL.md +28 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-read/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-source-artifacts/SKILL.md +107 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-source-artifacts/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-sync/SKILL.md +65 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-sync/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-validate/SKILL.md +37 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-validate/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-verify/SKILL.md +29 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-verify/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-write/SKILL.md +54 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-write/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-usage-accounting/SKILL.md +170 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-usage-accounting/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-use-the-product/SKILL.md +86 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-use-the-product/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-validate-tracker-mapping/SKILL.md +195 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-validate-tracker-mapping/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verification-lifecycle/SKILL.md +365 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verification-lifecycle/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verify/SKILL.md +52 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verify/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verify-prd/SKILL.md +392 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verify-prd/agents/openai.yaml +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-wiki-install/SKILL.md +101 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-wiki-install/agents/openai.yaml +4 -0
- package/plugins/lisa/hooks/inject-rules.sh +3 -2
- package/plugins/lisa/hooks/install-pkgs.sh +4 -45
- package/plugins/lisa/hooks/setup-jira-cli.sh +4 -12
- package/plugins/lisa/skills/lisa-setup-linear/SKILL.md +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-setup-linear/SKILL.md +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-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/hooks/inject-rules.sh +3 -2
- package/plugins/lisa-copilot/hooks/install-pkgs.sh +4 -45
- package/plugins/lisa-copilot/hooks/setup-jira-cli.sh +4 -12
- package/plugins/lisa-copilot/skills/lisa-setup-linear/SKILL.md +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/install-pkgs.sh +4 -45
- package/plugins/lisa-cursor/hooks/setup-jira-cli.sh +4 -12
- package/plugins/lisa-cursor/skills/lisa-setup-linear/SKILL.md +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +2 -2
- package/plugins/lisa-expo/.codex-plugin/skills/add-app-clip/SKILL.md +280 -0
- package/plugins/lisa-expo/.codex-plugin/skills/add-app-clip/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/add-app-clip/references/native-module.md +96 -0
- package/plugins/lisa-expo/.codex-plugin/skills/apollo-client/SKILL.md +238 -0
- package/plugins/lisa-expo/.codex-plugin/skills/apollo-client/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/apollo-client/references/mutation-patterns.md +360 -0
- package/plugins/lisa-expo/.codex-plugin/skills/atomic-design-gluestack/SKILL.md +367 -0
- package/plugins/lisa-expo/.codex-plugin/skills/atomic-design-gluestack/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/atomic-design-gluestack/references/atomic-levels.md +417 -0
- package/plugins/lisa-expo/.codex-plugin/skills/atomic-design-gluestack/references/folder-structure.md +257 -0
- package/plugins/lisa-expo/.codex-plugin/skills/atomic-design-gluestack/references/gluestack-mapping.md +233 -0
- package/plugins/lisa-expo/.codex-plugin/skills/atomic-design-gluestack/scripts/test_validate_atomic_structure.py +240 -0
- package/plugins/lisa-expo/.codex-plugin/skills/atomic-design-gluestack/scripts/validate_atomic_structure.py +438 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/SKILL.md +321 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/animations.md +220 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/controls.md +272 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/form-sheet.md +253 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/gradients.md +106 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/icons.md +213 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/media.md +198 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/route-structure.md +229 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/search.md +248 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/storage.md +121 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/tabs.md +433 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/toolbar-and-headers.md +284 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/visual-effects.md +197 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/webgpu-three.md +605 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/references/zoom-transitions.md +158 -0
- package/plugins/lisa-expo/.codex-plugin/skills/container-view-pattern/SKILL.md +299 -0
- package/plugins/lisa-expo/.codex-plugin/skills/container-view-pattern/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/container-view-pattern/references/examples.md +749 -0
- package/plugins/lisa-expo/.codex-plugin/skills/container-view-pattern/references/patterns.md +318 -0
- package/plugins/lisa-expo/.codex-plugin/skills/container-view-pattern/scripts/create_component.py +200 -0
- package/plugins/lisa-expo/.codex-plugin/skills/container-view-pattern/scripts/validate_component.py +209 -0
- package/plugins/lisa-expo/.codex-plugin/skills/cross-platform-compatibility/SKILL.md +268 -0
- package/plugins/lisa-expo/.codex-plugin/skills/cross-platform-compatibility/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/cross-platform-compatibility/references/common-issues.md +619 -0
- package/plugins/lisa-expo/.codex-plugin/skills/cross-platform-compatibility/references/file-extensions.md +340 -0
- package/plugins/lisa-expo/.codex-plugin/skills/cross-platform-compatibility/references/platform-api.md +276 -0
- package/plugins/lisa-expo/.codex-plugin/skills/cross-platform-compatibility/scripts/validate_cross_platform.py +416 -0
- package/plugins/lisa-expo/.codex-plugin/skills/directory-structure/SKILL.md +214 -0
- package/plugins/lisa-expo/.codex-plugin/skills/directory-structure/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/directory-structure/scripts/validate_structure.py +454 -0
- package/plugins/lisa-expo/.codex-plugin/skills/e2e-coverage-gaps/SKILL.md +105 -0
- package/plugins/lisa-expo/.codex-plugin/skills/e2e-coverage-gaps/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/eas-update-insights/SKILL.md +228 -0
- package/plugins/lisa-expo/.codex-plugin/skills/eas-update-insights/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/eas-update-insights/references/channel-insights-schema.md +47 -0
- package/plugins/lisa-expo/.codex-plugin/skills/eas-update-insights/references/update-insights-schema.md +69 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-api-routes/SKILL.md +369 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-api-routes/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-brownfield/SKILL.md +54 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-brownfield/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-brownfield/references/brownfield-integrated.md +526 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-brownfield/references/brownfield-isolated.md +402 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-brownfield/references/comparison.md +63 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-brownfield/references/troubleshooting.md +88 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-cicd-workflows/SKILL.md +92 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-cicd-workflows/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-cicd-workflows/scripts/fetch.js +113 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-cicd-workflows/scripts/package.json +11 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-cicd-workflows/scripts/validate.js +85 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-deployment/SKILL.md +193 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-deployment/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-deployment/references/app-store-metadata.md +479 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-deployment/references/ios-app-store.md +355 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-deployment/references/play-store.md +264 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-deployment/references/testflight.md +58 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-deployment/references/workflows.md +200 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-dev-client/SKILL.md +164 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-dev-client/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-env-config/SKILL.md +309 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-env-config/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-env-config/references/validation-patterns.md +417 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/SKILL.md +141 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/references/config-plugin.md +90 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/references/create-expo-module.md +206 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/references/lifecycle.md +127 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/references/module-config.md +48 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/references/native-module.md +286 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/references/native-view.md +171 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-router-best-practices/SKILL.md +431 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-router-best-practices/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-router-best-practices/references/official-docs.md +290 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-router-best-practices/scripts/generate-route.py +171 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-tailwind-setup/SKILL.md +480 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-tailwind-setup/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-ui-jetpack-compose/SKILL.md +40 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-ui-jetpack-compose/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-ui-swift-ui/SKILL.md +39 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-ui-swift-ui/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/gluestack-nativewind/SKILL.md +419 -0
- package/plugins/lisa-expo/.codex-plugin/skills/gluestack-nativewind/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/gluestack-nativewind/references/color-tokens.md +343 -0
- package/plugins/lisa-expo/.codex-plugin/skills/gluestack-nativewind/references/component-mapping.md +307 -0
- package/plugins/lisa-expo/.codex-plugin/skills/gluestack-nativewind/references/spacing-scale.md +300 -0
- package/plugins/lisa-expo/.codex-plugin/skills/gluestack-nativewind/scripts/test_validate_styling.py +240 -0
- package/plugins/lisa-expo/.codex-plugin/skills/gluestack-nativewind/scripts/validate_styling.py +424 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-add-journey/SKILL.md +126 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-add-journey/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-create/SKILL.md +161 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-create/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-evidence/SKILL.md +78 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-evidence/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-evidence/scripts/post-evidence.sh +180 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-journey/SKILL.md +190 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-journey/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-journey/scripts/generate-templates.py +281 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-journey/scripts/parse-plan.py +368 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-verify/SKILL.md +27 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-verify/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/lisa-e2e-coverage-gaps/SKILL.md +13 -0
- package/plugins/lisa-expo/.codex-plugin/skills/lisa-e2e-coverage-gaps/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/local-state/SKILL.md +362 -0
- package/plugins/lisa-expo/.codex-plugin/skills/local-state/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/local-state/references/async-storage.md +505 -0
- package/plugins/lisa-expo/.codex-plugin/skills/local-state/references/persistence-patterns.md +711 -0
- package/plugins/lisa-expo/.codex-plugin/skills/local-state/references/reactive-variables.md +446 -0
- package/plugins/lisa-expo/.codex-plugin/skills/native-data-fetching/SKILL.md +507 -0
- package/plugins/lisa-expo/.codex-plugin/skills/native-data-fetching/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/native-data-fetching/references/expo-router-loaders.md +344 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-browser-uat/SKILL.md +124 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-browser-uat/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-check-logs/SKILL.md +217 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-check-logs/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-db-ops/SKILL.md +123 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-db-ops/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-deploy/SKILL.md +123 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-deploy/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-monitor-errors/SKILL.md +99 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-monitor-errors/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-performance/SKILL.md +165 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-performance/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-run-local/SKILL.md +169 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-run-local/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-verify-health/SKILL.md +101 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-verify-health/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/owasp-zap/SKILL.md +61 -0
- package/plugins/lisa-expo/.codex-plugin/skills/owasp-zap/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/play-store-access/SKILL.md +226 -0
- package/plugins/lisa-expo/.codex-plugin/skills/play-store-access/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/playwright-ci-debugging/SKILL.md +140 -0
- package/plugins/lisa-expo/.codex-plugin/skills/playwright-ci-debugging/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/playwright-selectors/SKILL.md +455 -0
- package/plugins/lisa-expo/.codex-plugin/skills/playwright-selectors/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/reduce-complexity/SKILL.md +251 -0
- package/plugins/lisa-expo/.codex-plugin/skills/reduce-complexity/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/reduce-complexity/references/extraction-strategies.md +456 -0
- package/plugins/lisa-expo/.codex-plugin/skills/reduce-complexity/references/refactoring-patterns.md +557 -0
- package/plugins/lisa-expo/.codex-plugin/skills/testing-library/SKILL.md +314 -0
- package/plugins/lisa-expo/.codex-plugin/skills/testing-library/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/testing-library/references/async-patterns.md +420 -0
- package/plugins/lisa-expo/.codex-plugin/skills/testing-library/references/expo-router-testing.md +556 -0
- package/plugins/lisa-expo/.codex-plugin/skills/testing-library/references/mocking-patterns.md +590 -0
- package/plugins/lisa-expo/.codex-plugin/skills/testing-library/references/query-priority.md +291 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/SKILL.md +134 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/references/expo-av-to-audio.md +132 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/references/expo-av-to-video.md +160 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/references/native-tabs.md +124 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/references/new-architecture.md +79 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/references/react-19.md +79 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/references/react-compiler.md +59 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/references/react-navigation-to-expo-router.md +61 -0
- package/plugins/lisa-expo/.codex-plugin/skills/use-dom/SKILL.md +417 -0
- package/plugins/lisa-expo/.codex-plugin/skills/use-dom/agents/openai.yaml +4 -0
- package/plugins/lisa-expo/skills/building-native-ui/SKILL.md +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-agy/skills/building-native-ui/SKILL.md +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/skills/building-native-ui/SKILL.md +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/skills/building-native-ui/SKILL.md +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +2 -2
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/e2e-coverage-gaps/SKILL.md +105 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/e2e-coverage-gaps/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-auth/SKILL.md +368 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-auth/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-build-and-deploy/SKILL.md +198 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-build-and-deploy/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-caching/SKILL.md +265 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-caching/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-component-model/SKILL.md +87 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-component-model/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-config-yaml/SKILL.md +283 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-config-yaml/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-operations/SKILL.md +239 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-operations/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-realtime/SKILL.md +187 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-realtime/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-resources/SKILL.md +142 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-resources/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-rest-queries/SKILL.md +403 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-rest-queries/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-schema-graphql/SKILL.md +123 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-schema-graphql/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-testing/SKILL.md +254 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-testing/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/lisa-e2e-coverage-gaps/SKILL.md +13 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/lisa-e2e-coverage-gaps/agents/openai.yaml +4 -0
- package/plugins/lisa-harper-fabric/hooks/block-generated-artifact-edits.sh +42 -24
- package/plugins/lisa-harper-fabric/hooks/enforce-config-extensions.mjs +12 -14
- package/plugins/lisa-harper-fabric/hooks/enforce-config-extensions.sh +30 -3
- package/plugins/lisa-harper-fabric/hooks/inject-rules.sh +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-copilot/hooks/block-generated-artifact-edits.sh +42 -24
- package/plugins/lisa-harper-fabric-copilot/hooks/enforce-config-extensions.mjs +12 -14
- package/plugins/lisa-harper-fabric-copilot/hooks/enforce-config-extensions.sh +30 -3
- package/plugins/lisa-harper-fabric-copilot/hooks/inject-rules.sh +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/hooks/block-generated-artifact-edits.sh +42 -24
- package/plugins/lisa-harper-fabric-cursor/hooks/enforce-config-extensions.mjs +12 -14
- package/plugins/lisa-harper-fabric-cursor/hooks/enforce-config-extensions.sh +30 -3
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +2 -2
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-graphql/SKILL.md +176 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-graphql/agents/openai.yaml +4 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-graphql/references/advanced-features.md +527 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-graphql/references/project-patterns.md +531 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-graphql/references/quick-start.md +257 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-graphql/references/resolvers-mutations.md +413 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-graphql/references/types-scalars.md +513 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-rules/SKILL.md +565 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-rules/agents/openai.yaml +4 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/typeorm-patterns/SKILL.md +275 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/typeorm-patterns/agents/openai.yaml +4 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/typeorm-patterns/references/configuration-patterns.md +487 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/typeorm-patterns/references/entity-patterns.md +450 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/typeorm-patterns/references/observability-patterns.md +536 -0
- package/plugins/lisa-nestjs/skills/typeorm-patterns/references/configuration-patterns.md +5 -5
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/skills/typeorm-patterns/references/configuration-patterns.md +5 -5
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/skills/typeorm-patterns/references/configuration-patterns.md +5 -5
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/skills/typeorm-patterns/references/configuration-patterns.md +5 -5
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +2 -2
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-repo-topic/SKILL.md +13 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-repo-topic/agents/openai.yaml +4 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-staff-slack/SKILL.md +13 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-staff-slack/agents/openai.yaml +4 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-staff-telegram/SKILL.md +13 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-staff-telegram/agents/openai.yaml +4 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-repo-topic/SKILL.md +163 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-repo-topic/agents/openai.yaml +4 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-repo-topic/references/repo-topic-config.md +185 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-staff/SKILL.md +175 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-staff/agents/openai.yaml +4 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-staff/references/platform-routing.md +123 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-staff/references/prompts.md +78 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-setup/SKILL.md +141 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-setup/agents/openai.yaml +4 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-setup-openclaw/SKILL.md +13 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-setup-openclaw/agents/openai.yaml +4 -0
- 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-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +2 -2
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-accessibility/SKILL.md +135 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-accessibility/agents/openai.yaml +4 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-asset-pipeline/SKILL.md +222 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-asset-pipeline/agents/openai.yaml +4 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-asset-sourcing/SKILL.md +151 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-asset-sourcing/agents/openai.yaml +4 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-build-deploy/SKILL.md +153 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-build-deploy/agents/openai.yaml +4 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-i18n/SKILL.md +122 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-i18n/agents/openai.yaml +4 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-project-structure/SKILL.md +89 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-project-structure/agents/openai.yaml +4 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-services/SKILL.md +208 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-services/agents/openai.yaml +4 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-testing/SKILL.md +192 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-testing/agents/openai.yaml +4 -0
- package/plugins/lisa-phaser/hooks/inject-rules.sh +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-copilot/hooks/inject-rules.sh +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +2 -2
- package/plugins/lisa-rails/.codex-plugin/skills/action-controller-best-practices/SKILL.md +374 -0
- package/plugins/lisa-rails/.codex-plugin/skills/action-controller-best-practices/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/action-view-best-practices/SKILL.md +335 -0
- package/plugins/lisa-rails/.codex-plugin/skills/action-view-best-practices/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/active-record-model-best-practices/SKILL.md +166 -0
- package/plugins/lisa-rails/.codex-plugin/skills/active-record-model-best-practices/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/e2e-coverage-gaps/SKILL.md +105 -0
- package/plugins/lisa-rails/.codex-plugin/skills/e2e-coverage-gaps/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/fix-linter-error/SKILL.md +45 -0
- package/plugins/lisa-rails/.codex-plugin/skills/fix-linter-error/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-code-complexity/SKILL.md +48 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-code-complexity/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-max-lines/SKILL.md +46 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-max-lines/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-max-lines-per-function/SKILL.md +46 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-max-lines-per-function/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-test-coverage/SKILL.md +45 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-test-coverage/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-add-journey/SKILL.md +65 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-add-journey/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-create/SKILL.md +100 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-create/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-evidence/SKILL.md +70 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-evidence/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-evidence/scripts/post-evidence.sh +180 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-journey/SKILL.md +64 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-journey/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-verify/SKILL.md +26 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-verify/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/lisa-e2e-coverage-gaps/SKILL.md +13 -0
- package/plugins/lisa-rails/.codex-plugin/skills/lisa-e2e-coverage-gaps/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-check-logs/SKILL.md +191 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-check-logs/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-deploy/SKILL.md +153 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-deploy/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-run-local/SKILL.md +169 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-run-local/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-verify-jobs/SKILL.md +157 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-verify-jobs/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-verify-telemetry/SKILL.md +197 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-verify-telemetry/agents/openai.yaml +4 -0
- package/plugins/lisa-rails/hooks/inject-rules.sh +2 -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-copilot/hooks/inject-rules.sh +2 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- 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-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +2 -2
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-add-ingest/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-add-ingest/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-add-role/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-add-role/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-ingest/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-ingest/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-lint/SKILL.md +11 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-lint/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-migrate/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-migrate/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-onboard-me/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-onboard-me/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-query/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-query/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-setup/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-setup/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-setup-wiki/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-setup-wiki/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-status/SKILL.md +12 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-status/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-add-ingest/SKILL.md +34 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-add-ingest/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-add-role/SKILL.md +30 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-add-role/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-confluence/SKILL.md +25 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-confluence/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-docs/SKILL.md +30 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-docs/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-git/SKILL.md +25 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-git/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-jira/SKILL.md +28 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-jira/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-memory/SKILL.md +28 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-memory/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-notion/SKILL.md +25 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-notion/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-roles/SKILL.md +22 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-roles/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-slack/SKILL.md +30 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-slack/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-web/SKILL.md +23 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-web/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-doctor/SKILL.md +47 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-doctor/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-ingest/SKILL.md +99 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-ingest/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-lint/SKILL.md +32 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-lint/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-migrate/SKILL.md +43 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-migrate/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-onboard-me/SKILL.md +33 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-onboard-me/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-query/SKILL.md +36 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-query/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-setup/SKILL.md +75 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-setup/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-setup-automations/SKILL.md +83 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-setup-automations/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-status/SKILL.md +47 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-status/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-tear-down-automations/SKILL.md +34 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-tear-down-automations/agents/openai.yaml +4 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-usage/SKILL.md +50 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-usage/agents/openai.yaml +4 -0
- 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/src/base/hooks/inject-rules.sh +3 -2
- package/plugins/src/base/hooks/install-pkgs.sh +4 -45
- package/plugins/src/base/hooks/setup-jira-cli.sh +4 -12
- package/plugins/src/base/skills/lisa-setup-linear/SKILL.md +1 -1
- package/plugins/src/expo/skills/building-native-ui/SKILL.md +1 -1
- package/plugins/src/harper-fabric/hooks/block-generated-artifact-edits.sh +42 -24
- package/plugins/src/harper-fabric/hooks/enforce-config-extensions.mjs +12 -14
- package/plugins/src/harper-fabric/hooks/enforce-config-extensions.sh +30 -3
- package/plugins/src/harper-fabric/hooks/inject-rules.sh +1 -1
- package/plugins/src/nestjs/skills/typeorm-patterns/references/configuration-patterns.md +5 -5
- package/plugins/src/phaser/hooks/inject-rules.sh +1 -1
- package/plugins/src/rails/hooks/inject-rules.sh +2 -1
- package/scripts/clean-dist.mjs +7 -0
- package/scripts/generate-codex-plugin-artifacts.mjs +311 -20
- package/scripts/install-claude-plugins.sh +53 -40
- package/typescript/package-lisa/package.lisa.json +1 -1
- package/.agents/plugins/marketplace.json +0 -128
- package/dist/codex/lisa-plugin-detection.d.ts +0 -68
- package/dist/codex/lisa-plugin-detection.d.ts.map +0 -1
- package/dist/codex/lisa-plugin-detection.js +0 -139
- package/dist/codex/lisa-plugin-detection.js.map +0 -1
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: phaser-asset-pipeline
|
|
3
|
+
description: "setting up or changing the…"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Phaser 4 Asset Pipeline
|
|
7
|
+
|
|
8
|
+
## Where the raw art comes from (read this first)
|
|
9
|
+
|
|
10
|
+
This skill **packs** raw art; it does not conjure it. The inputs under
|
|
11
|
+
`assets/src/**` are **real, licensed source art you sourced first** — they do not
|
|
12
|
+
magically pre-exist, and they are not procedural `generateTexture` rectangles.
|
|
13
|
+
Before you can pack anything, use **[[phaser-asset-sourcing]]**: it covers where
|
|
14
|
+
game art comes from (curated CC0 packs like Kenney and Ninja Adventure → deriving
|
|
15
|
+
CC0 art → asking the human), the strict CC0-or-equivalent license gate with
|
|
16
|
+
`assets/LICENSES.md` evidence, provenance via a committed ingest script, and why
|
|
17
|
+
`generateTexture` placeholders are tracked art debt rather than a finished state.
|
|
18
|
+
The rule of thumb: **source → `assets/src` → pack (this skill) → typed keys.**
|
|
19
|
+
|
|
20
|
+
## Overview
|
|
21
|
+
|
|
22
|
+
The pipeline turns committed source art into runtime form — it is a build step,
|
|
23
|
+
not a substitute for having art. Raw source art lives in `assets/src/**` (PNGs,
|
|
24
|
+
audio, font sources); a build step packs it into `public/assets/**` (atlases,
|
|
25
|
+
audio sprites, bitmap fonts) and **codegens typed key constants into
|
|
26
|
+
`src/assets.ts`**. The payoff: a missing or renamed asset is a **compile error**,
|
|
27
|
+
not a green square or silent-missing audio at runtime. No raw string asset /
|
|
28
|
+
scene / event keys anywhere — they all come from the generated module (the
|
|
29
|
+
official `loading-assets` skill covers loading those keys at runtime).
|
|
30
|
+
|
|
31
|
+
## Layout
|
|
32
|
+
|
|
33
|
+
| Path | Role |
|
|
34
|
+
| --- | --- |
|
|
35
|
+
| `assets/src/sprites/**` | Raw individual PNGs — the art source of truth (sourced per [[phaser-asset-sourcing]]) |
|
|
36
|
+
| `assets/src/audio/**` | Raw audio clips (wav/ogg sources) |
|
|
37
|
+
| `assets/src/fonts/**` | Font sources for BMFont generation |
|
|
38
|
+
| `assets/LICENSES.md` | License evidence per source pack (CC0 quote + evidence URL) — see [[phaser-asset-sourcing]] |
|
|
39
|
+
| `scripts/ingest-assets.mjs` | The provenance record — how each frame was carved from its source pack into `assets/src` (re-runnable) |
|
|
40
|
+
| `public/assets/**` | **Generated** packed output (atlases, audiosprites, fonts, `pack.json`) — git-ignored or committed as a build artifact |
|
|
41
|
+
| `src/assets.ts` | **Generated** typed key constants — never edited by hand |
|
|
42
|
+
| `scripts/pack-assets.mjs` | The pipeline driver (runs the three packers + codegen) |
|
|
43
|
+
|
|
44
|
+
## Step 1: texture atlases with free-tex-packer-core
|
|
45
|
+
|
|
46
|
+
`free-tex-packer-core` packs many PNGs into atlas pages plus a JSON manifest, in
|
|
47
|
+
a Node script (no GUI, runs in CI):
|
|
48
|
+
|
|
49
|
+
```js
|
|
50
|
+
// scripts/pack-assets.mjs (excerpt)
|
|
51
|
+
import { packAsync } from "free-tex-packer-core";
|
|
52
|
+
import { glob } from "glob";
|
|
53
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
54
|
+
|
|
55
|
+
const images = await Promise.all(
|
|
56
|
+
(await glob("assets/src/sprites/**/*.png")).map(async p => ({
|
|
57
|
+
path: p.replace("assets/src/sprites/", ""), contents: await readFile(p),
|
|
58
|
+
})));
|
|
59
|
+
|
|
60
|
+
const files = await packAsync(images, {
|
|
61
|
+
textureName: "game", width: 4096, height: 4096,
|
|
62
|
+
packer: "MaxRectsPacker", packerMethod: "Smart", // see gotcha below
|
|
63
|
+
padding: 2, extrude: 1, // 1px extrude kills bleeding at integer scales
|
|
64
|
+
allowRotation: false, allowTrim: false, // pixel-art-safe (see below)
|
|
65
|
+
detectIdentical: true,
|
|
66
|
+
exporter: "JsonHash", removeFileExtension: true, prependFolderName: true,
|
|
67
|
+
});
|
|
68
|
+
for (const f of files) await writeFile(`public/assets/atlases/${f.name}`, f.buffer ?? f.content);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
The frame names in the manifest become the atlas frame keys you reference as
|
|
72
|
+
generated constants. Atlas everything that renders together — loose images break
|
|
73
|
+
sprite batching (the official `loading-assets` skill). Full-screen backdrops and
|
|
74
|
+
parallax layers are the exception: copy them verbatim into `public/assets/images`
|
|
75
|
+
and `load.image` them — they would bloat an atlas. Even this exception keeps the
|
|
76
|
+
no-raw-string promise: the codegen step emits one generated constant per copied
|
|
77
|
+
image (the `Img` record below), and the loader derives the file path from the
|
|
78
|
+
key in exactly one place — a call site never spells out a path string.
|
|
79
|
+
|
|
80
|
+
**Packer gotcha (verified in the reference implementation):** use
|
|
81
|
+
`packer: "MaxRectsPacker"` with `packerMethod: "Smart"`. The other packer methods
|
|
82
|
+
produce degenerate single-row *strip* atlases that waste enormous texture space
|
|
83
|
+
and can blow past the max texture size. **For pixel art**, set `allowTrim: false`
|
|
84
|
+
and `allowRotation: false`: trimming makes animation frames different sizes so
|
|
85
|
+
anchors swim between frames, and rotation makes Phaser frame-flipping non-trivial.
|
|
86
|
+
Add `extrude: 1` to stop edge bleeding when the game renders at integer scales.
|
|
87
|
+
Keep inputs **sorted** and emit **no timestamps** so the packed output is
|
|
88
|
+
deterministic and can be committed + `git diff --exit-code`-checked in CI.
|
|
89
|
+
|
|
90
|
+
## Step 2: audio sprites with audiosprite
|
|
91
|
+
|
|
92
|
+
`audiosprite` concatenates short SFX into one file (in multiple codecs) plus a
|
|
93
|
+
JSON map of `{ start, end }` per clip — one request, one decode, instead of dozens:
|
|
94
|
+
|
|
95
|
+
```jsonc
|
|
96
|
+
// package.json script
|
|
97
|
+
"pack:audio": "audiosprite --output public/assets/audio/sfx --export ogg,m4a --format howler2 assets/src/audio/*.wav"
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Provide at least two codecs (`ogg` + `m4a`) so every browser can play one. Load
|
|
101
|
+
with `this.load.audioSprite(Audio.Sfx, "audio/sfx.json")` and play by sprite key.
|
|
102
|
+
|
|
103
|
+
## Step 3: bitmap fonts with BMFont
|
|
104
|
+
|
|
105
|
+
`BitmapText` is the performant choice for high-churn text (scores, timers) —
|
|
106
|
+
the official `loading-assets` skill / [[phaser-i18n]]. Generate the `.fnt` (XML/JSON) + PNG page
|
|
107
|
+
from a font source with a BMFont tool (`msdf-bmfont-xml` or the `bmfont` CLI) in
|
|
108
|
+
the same script:
|
|
109
|
+
|
|
110
|
+
```jsonc
|
|
111
|
+
"pack:font": "msdf-bmfont -o public/assets/fonts/ui --font-size 42 --texture-size 1024 1024 assets/src/fonts/ui.ttf"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
Load with `this.load.bitmapFont(Font.UI, "fonts/ui.png", "fonts/ui.fnt")`.
|
|
115
|
+
|
|
116
|
+
## Step 4: codegen typed keys into `src/assets.ts`
|
|
117
|
+
|
|
118
|
+
After packing, walk the generated manifests and emit `as const` key maps. This is
|
|
119
|
+
the step that turns runtime failures into compile failures:
|
|
120
|
+
|
|
121
|
+
```js
|
|
122
|
+
// scripts/pack-assets.mjs (codegen excerpt)
|
|
123
|
+
const atlas = JSON.parse(await readFile("public/assets/atlases/game.json", "utf8"));
|
|
124
|
+
const frames = Object.keys(atlas.frames); // raw keys, e.g. "player/idle"
|
|
125
|
+
const sfx = Object.keys(JSON.parse(await readFile("public/assets/audio/sfx.json","utf8")).spritemap);
|
|
126
|
+
const images = (await readdir("public/assets/images", { recursive: true }))
|
|
127
|
+
.filter(f => f.endsWith(".png")).sort(); // standalone backdrops/parallax layers
|
|
128
|
+
|
|
129
|
+
const out = `// AUTO-GENERATED by scripts/pack-assets.mjs — do not edit.
|
|
130
|
+
export const Tex = { GameAtlas: "game" } as const;
|
|
131
|
+
export const Frame = { ${frames.map(k => `${toIdent(k)}: "${k}"`).join(", ")} } as const;
|
|
132
|
+
export const Img = { ${images.map(p => `${toIdent(p)}: "img-${p.replace(/\.png$/u, "")}"`).join(", ")} } as const;
|
|
133
|
+
export const Audio = { Sfx: "sfx" } as const;
|
|
134
|
+
export const Sfx = { ${sfx.map(s => `${toIdent(s)}: "${s}"`).join(", ")} } as const;
|
|
135
|
+
export const Font = { UI: "ui" } as const;
|
|
136
|
+
export const SceneKeys = { Boot:"Boot", Preloader:"Preloader", MainMenu:"MainMenu", Game:"Game" } as const;
|
|
137
|
+
export const GameEvent = { ScoreChanged:"score-changed", EnemyDied:"enemy-died" } as const;
|
|
138
|
+
`;
|
|
139
|
+
await writeFile("src/assets.ts", out);
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Scenes import `Tex`, `Frame`, `Img`, `Sfx`, `Font`, `SceneKeys`, `GameEvent` —
|
|
143
|
+
never an inline string. Rename art, re-run the pipeline, and every now-stale
|
|
144
|
+
reference fails `bun run typecheck` immediately. (Scene/event keys are kept in
|
|
145
|
+
the same generated module so they share the no-raw-string discipline; edit them
|
|
146
|
+
via the codegen template, not by hand.)
|
|
147
|
+
|
|
148
|
+
**Animation keys are the one deliberately hand-authored layer.** Codegen cannot
|
|
149
|
+
know how frames group into cycles, so animation keys live in a hand-written
|
|
150
|
+
`as const` record (e.g. `AnimKeys` / `FxAnims`) whose frame sequences are built
|
|
151
|
+
from the generated `Frame` constants — and the contract test below proves every
|
|
152
|
+
frame those definitions reference exists in the committed atlases. The typed-key
|
|
153
|
+
guarantee is therefore: **generated** constants for textures, frames, images,
|
|
154
|
+
audio, and fonts; **hand-authored typed constants + contract-test coverage** for
|
|
155
|
+
animation keys. Nothing is a raw inline string either way.
|
|
156
|
+
|
|
157
|
+
## Step 5: wire into the build
|
|
158
|
+
|
|
159
|
+
The pipeline runs before dev and before build so generated output is never stale:
|
|
160
|
+
|
|
161
|
+
```jsonc
|
|
162
|
+
// package.json
|
|
163
|
+
"scripts": {
|
|
164
|
+
"assets": "node scripts/pack-assets.mjs",
|
|
165
|
+
"predev": "bun run assets",
|
|
166
|
+
"prebuild": "bun run assets",
|
|
167
|
+
"dev": "vite",
|
|
168
|
+
"build": "vite build"
|
|
169
|
+
}
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
For fast iteration, a `--watch` mode on the pack script re-packs changed source
|
|
173
|
+
art. In CI the pack step runs once before `vite build`; the build then hashes the
|
|
174
|
+
generated files for immutable caching ([[phaser-build-deploy]]).
|
|
175
|
+
|
|
176
|
+
## Project conventions
|
|
177
|
+
|
|
178
|
+
- `assets/src/**` is the source of truth; `public/assets/**` and `src/assets.ts`
|
|
179
|
+
are generated — treat them as build output (re-runnable, not hand-edited).
|
|
180
|
+
- One atlas per render group, one audiosprite per SFX set, BMFont for hot text.
|
|
181
|
+
- A **contract test** asserts every frame name the game *derives by convention*
|
|
182
|
+
(e.g. `battlerWalkFrame(ref, dir, n)`, FX-strip frame lists, per-speaker
|
|
183
|
+
portrait keys) resolves to a real entry in the committed atlas JSON under
|
|
184
|
+
`public/assets`. The other constants in `src/assets.ts` (`SceneKeys`,
|
|
185
|
+
`GameEvent`, `Font`, `Audio`, standalone `Img` entries) are plain generated
|
|
186
|
+
literals already enforced by TypeScript at every use site, so they don't need
|
|
187
|
+
a runtime check — only names built at runtime from a pattern can go stale
|
|
188
|
+
silently without one. This keeps that narrower guarantee honest: a renamed or
|
|
189
|
+
missing frame fails a headless Vitest assertion instead of rendering a silent
|
|
190
|
+
black square. The test reads the packed JSON directly — zero Phaser
|
|
191
|
+
([[phaser-testing]]):
|
|
192
|
+
|
|
193
|
+
```ts
|
|
194
|
+
const frames = new Set(Object.keys(
|
|
195
|
+
JSON.parse(readFileSync("public/assets/atlases/battlers.json", "utf8")).frames));
|
|
196
|
+
for (const ref of BATTLER_REFS)
|
|
197
|
+
for (const dir of DIRS) {
|
|
198
|
+
expect(frames).toContain(battlerIdleFrame(ref, dir));
|
|
199
|
+
expect(frames).toContain(battlerAttackFrame(ref, dir));
|
|
200
|
+
for (let n = 0; n < WALK_FRAME_COUNT; n++)
|
|
201
|
+
expect(frames).toContain(battlerWalkFrame(ref, dir, n));
|
|
202
|
+
}
|
|
203
|
+
// ...and one loop per remaining derived family (FX-strip frame lists,
|
|
204
|
+
// per-speaker portrait keys, …) — the test is only done when EVERY name the
|
|
205
|
+
// game can derive at runtime has been asserted against the committed atlas.
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
- Ship a `--check` mode on the pack script: it re-packs into a temp staging area
|
|
209
|
+
and exits non-zero if any committed output under `public/assets` — atlases,
|
|
210
|
+
standalone images, audio, fonts alike — or `src/assets.ts` is stale, so CI
|
|
211
|
+
proves the committed artifacts (and every generated key they back) are current.
|
|
212
|
+
- The generated `src/assets.ts` is the single source of asset/scene/event keys —
|
|
213
|
+
the no-raw-string-keys rule depends on it existing.
|
|
214
|
+
|
|
215
|
+
## Verification
|
|
216
|
+
|
|
217
|
+
The pipeline is verified by deleting a source PNG and re-running `bun run assets`:
|
|
218
|
+
the corresponding generated constant disappears and `bun run typecheck` fails at
|
|
219
|
+
every use site (proving keys are compile-checked). Then boot the game and confirm
|
|
220
|
+
the atlas/audiosprite/font load with no `FILE_LOAD_ERROR` and render/play
|
|
221
|
+
correctly.
|
|
222
|
+
</content>
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: phaser-asset-sourcing
|
|
3
|
+
description: "a Phaser 4 game needs actual…"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Phaser 4 Asset Sourcing
|
|
7
|
+
|
|
8
|
+
## Why this skill exists
|
|
9
|
+
|
|
10
|
+
The `phaser-asset-pipeline` skill is **packing-only**: it assumes raw art already
|
|
11
|
+
sits in `assets/src` and turns it into atlases + typed keys. It never says where
|
|
12
|
+
that art comes from. Left to fill the gap, agents reach for the path of least
|
|
13
|
+
resistance — `this.add.graphics().generateTexture(...)` white rectangles — and
|
|
14
|
+
ship a wireframe that *typechecks and boots* but looks like programmer art.
|
|
15
|
+
|
|
16
|
+
**Procedural placeholders are art debt, not an art strategy.** A shipped game
|
|
17
|
+
needs real, licensed, cohesive assets. This skill is the missing step: how to
|
|
18
|
+
**get** the art before you pack it. Read it *before* `phaser-asset-pipeline`.
|
|
19
|
+
|
|
20
|
+
## The sourcing decision, in priority order
|
|
21
|
+
|
|
22
|
+
Work top-down. Only fall to the next tier when the one above genuinely can't
|
|
23
|
+
serve the need.
|
|
24
|
+
|
|
25
|
+
### 1. Curated CC0 sources (default — reach here first)
|
|
26
|
+
|
|
27
|
+
Real, cohesive, commercially-usable art exists for free under CC0. These are the
|
|
28
|
+
recommended starting points; all are CC0 or CC0-equivalent (verify per pack —
|
|
29
|
+
see the license gate below):
|
|
30
|
+
|
|
31
|
+
- **[Kenney.nl](https://kenney.nl/assets)** — hundreds of packs (top-down,
|
|
32
|
+
platformer, UI, tiles, isometric, audio), **all CC0**. The single best
|
|
33
|
+
first stop for cohesive, atlas-friendly art.
|
|
34
|
+
- **Pixel-boy & AAA — [Ninja Adventure Asset Pack](https://pixel-boy.itch.io/ninja-adventure-asset-pack)**
|
|
35
|
+
— a full CC0 JRPG kit: characters with directional idle/walk/attack strips,
|
|
36
|
+
monsters, tilesets, UI, portraits, FX, and music. Ideal for top-down /
|
|
37
|
+
RPG-shaped games (this is what the reference implementation uses).
|
|
38
|
+
- **ansimuz (Luis Zuno) — [CC0 packs](https://ansimuz.itch.io/)** — parallax
|
|
39
|
+
backdrops, environments, effects. Check each pack's license: the base packs
|
|
40
|
+
are typically CC0; some have paid add-ons that are **not**.
|
|
41
|
+
- **[OpenGameArt.org](https://opengameart.org/)**, **filtered to CC0**
|
|
42
|
+
(`CC0` in the license facet). Great breadth; licenses are per-submission, so
|
|
43
|
+
you MUST verify each asset individually — OGA also hosts CC-BY, CC-BY-SA, and
|
|
44
|
+
GPL art that the license gate rejects.
|
|
45
|
+
- **[itch.io](https://itch.io/game-assets/assets-cc0)** game assets filtered to
|
|
46
|
+
the CC0 license.
|
|
47
|
+
|
|
48
|
+
Prefer one or two packs with a shared visual language over a magpie mix — a
|
|
49
|
+
single Kenney pack reads more cohesive than ten sources stitched together (the
|
|
50
|
+
art-director persona will flag the mismatch otherwise).
|
|
51
|
+
|
|
52
|
+
### 2. Deriving / editing CC0 art (allowed freely)
|
|
53
|
+
|
|
54
|
+
CC0 waives all rights, so you may recolor, crop, re-slice, retag, upscale
|
|
55
|
+
(nearest-neighbor for pixel art), and recombine freely. This is usually how a
|
|
56
|
+
pack becomes *this game's* assets: slice a sprite sheet into per-frame PNGs,
|
|
57
|
+
rename frames to your content refs, restitch strips. Record exactly how in the
|
|
58
|
+
ingest script (below) so the derivation is reproducible.
|
|
59
|
+
|
|
60
|
+
### 3. Ask the human (bespoke quality, paid tools, commissioning)
|
|
61
|
+
|
|
62
|
+
When the art bible demands a bespoke look no CC0 pack delivers — a signature
|
|
63
|
+
character, a specific illustrated style, licensed audio — **stop and ask the
|
|
64
|
+
human**. Do not silently downgrade to placeholders and do not buy/commission on
|
|
65
|
+
your own. Surface the decision:
|
|
66
|
+
|
|
67
|
+
> "The art direction calls for `<X>`. No CC0 source covers it. Options: (a) adapt
|
|
68
|
+
> the closest CC0 pack `<Y>` and accept the style delta, (b) you provide/approve
|
|
69
|
+
> a paid pack or commission, (c) ship a tracked `generateTexture` placeholder
|
|
70
|
+
> against issue `#NNN` until real art lands. Which?"
|
|
71
|
+
|
|
72
|
+
Paid assets, CC-BY with attribution, or any non-CC0 license are allowed **only
|
|
73
|
+
with explicit human approval**, recorded in `assets/LICENSES.md` with the terms.
|
|
74
|
+
|
|
75
|
+
## Hard rules
|
|
76
|
+
|
|
77
|
+
### License gate — CC0 or equivalent only
|
|
78
|
+
|
|
79
|
+
- **Accept**: CC0 1.0, public domain dedication, or an explicit "use freely in
|
|
80
|
+
commercial games, no attribution required" grant equivalent to CC0.
|
|
81
|
+
- **Reject** (unless the human explicitly approves and the terms are recorded):
|
|
82
|
+
CC-BY (attribution burden), CC-BY-SA / GPL (copyleft — forces your project's
|
|
83
|
+
license), CC-NC (no commercial), "free for personal use", and anything
|
|
84
|
+
unlicensed or license-unknown.
|
|
85
|
+
- For **every** pack, record in `assets/LICENSES.md`: the pack name, author,
|
|
86
|
+
source URL, the exact license, a **verbatim license quote**, and the
|
|
87
|
+
**evidence URL** where that quote lives (the itch page, the in-pack
|
|
88
|
+
`LICENSE.txt`, the OGA submission). "It looked free" is not evidence.
|
|
89
|
+
|
|
90
|
+
```md
|
|
91
|
+
| Pack | Author | Source | License | Evidence |
|
|
92
|
+
|------|--------|--------|---------|----------|
|
|
93
|
+
| Ninja Adventure – Asset Pack | Pixel-boy & AAA | https://pixel-boy.itch.io/ninja-adventure-asset-pack | CC0 1.0 | In-pack `LICENSE.txt` (full CC0 text); itch page "Creative Commons Zero v1.0 Universal" |
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
### Provenance — the source must be reproducible
|
|
97
|
+
|
|
98
|
+
The packs themselves are often large and need not be committed, but **how you
|
|
99
|
+
got from a pack to `assets/src` must be**. Two acceptable patterns:
|
|
100
|
+
|
|
101
|
+
- **Committed ingest script** (`scripts/ingest-assets.mjs`) that records, per
|
|
102
|
+
frame, which pack / file / cell it came from and re-slices deterministically.
|
|
103
|
+
Re-running it against a fresh download reproduces `assets/src` byte-for-byte.
|
|
104
|
+
This is the provenance record — it documents the source layout (e.g. "Ninja
|
|
105
|
+
Adventure character `Idle.png` is 64×16 = 4 direction cells; `Walk.png` is
|
|
106
|
+
64×64 = 4 direction columns × 4 walk rows") and doubles as the derivation log.
|
|
107
|
+
- **Committed raw sources** under `assets/src` directly, when the art is small,
|
|
108
|
+
hand-authored, or already per-frame.
|
|
109
|
+
|
|
110
|
+
Either way: `assets/LICENSES.md` + a reproducible path from source to
|
|
111
|
+
`assets/src`. Adding art from a **new** source requires both, every time.
|
|
112
|
+
|
|
113
|
+
### Procedural `generateTexture` placeholders are TRACKED ART DEBT
|
|
114
|
+
|
|
115
|
+
A scene MAY ship `generateTexture` / `graphics`-drawn placeholder art **only**
|
|
116
|
+
when it is tracked by a linked art-debt issue. It is never the finished state,
|
|
117
|
+
and it is never described as a best practice. In particular:
|
|
118
|
+
|
|
119
|
+
- **Never** write comments like "zero binary assets, zero licensing risk" as if
|
|
120
|
+
placeholders were the goal. They are a temporary stand-in, and that framing is
|
|
121
|
+
exactly what produced wireframe games.
|
|
122
|
+
- Keep a visible ledger of the debt (e.g. a `LEGACY_GENERATED_TEXTURE_KEYS` map
|
|
123
|
+
in the pack script, or a checklist in the issue) and delete each entry the
|
|
124
|
+
moment the real asset lands.
|
|
125
|
+
- The art-director persona treats a placeholder-only scene as a **blocking**
|
|
126
|
+
finding (see its review checklist).
|
|
127
|
+
|
|
128
|
+
### Characters get real animation
|
|
129
|
+
|
|
130
|
+
Static single-frame sprites are a placeholder smell. A character/creature ships
|
|
131
|
+
at minimum an **idle** and a **walk** cycle; most CC0 character packs already
|
|
132
|
+
provide directional idle/walk/attack strips, so there is no excuse to ship a
|
|
133
|
+
frozen frame. Name frames so the pipeline and the official **`animations`**
|
|
134
|
+
skill can build the animation from them (e.g. `<ref>/walk-<dir>-<n>`), and drive
|
|
135
|
+
them with `anims.create` / `anims.play`, not a static texture. The asset-pipeline
|
|
136
|
+
skill covers frame naming; the official `animations` skill covers playback.
|
|
137
|
+
|
|
138
|
+
## Verification
|
|
139
|
+
|
|
140
|
+
- Every entry in `assets/LICENSES.md` is CC0-or-equivalent (or human-approved
|
|
141
|
+
with terms recorded) and carries a verbatim quote + evidence URL.
|
|
142
|
+
- `assets/src` is reproducible from a committed ingest script or is itself
|
|
143
|
+
committed raw source.
|
|
144
|
+
- No scene ships `generateTexture` placeholder art without a linked art-debt
|
|
145
|
+
issue; the debt ledger matches reality.
|
|
146
|
+
- Characters render with a playing idle/walk animation, not a static frame —
|
|
147
|
+
confirm in the **real browser** (the art-director persona reviews rendered
|
|
148
|
+
screenshots, not code).
|
|
149
|
+
|
|
150
|
+
Once the art exists in `assets/src`, hand off to **`phaser-asset-pipeline`** to
|
|
151
|
+
pack it and codegen the typed keys.
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: phaser-build-deploy
|
|
3
|
+
description: "configuring the production…"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Phaser 4 Build and Deploy
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
The game ships as static files built by **Vite** (with TypeScript 6, `phaser`
|
|
11
|
+
pinned `^4.2.0`). A good prod build does four things: split the large `phaser`
|
|
12
|
+
vendor chunk so app code can change without re-downloading the engine, minify
|
|
13
|
+
hard, content-hash everything for immutable caching, and register a PWA service
|
|
14
|
+
worker that precaches game assets. A bundle-size budget keeps the result honest.
|
|
15
|
+
The asset pipeline ([[phaser-asset-pipeline]]) runs first; this skill packages
|
|
16
|
+
its output.
|
|
17
|
+
|
|
18
|
+
## Vite production config
|
|
19
|
+
|
|
20
|
+
```ts
|
|
21
|
+
// vite.config.ts
|
|
22
|
+
import { defineConfig } from "vite";
|
|
23
|
+
import { VitePWA } from "vite-plugin-pwa";
|
|
24
|
+
|
|
25
|
+
export default defineConfig({
|
|
26
|
+
base: process.env.BASE_PATH ?? "/", // "/" for root domains, "/repo/" for project pages
|
|
27
|
+
build: {
|
|
28
|
+
target: "es2022",
|
|
29
|
+
assetsInlineLimit: 0, // never inline game assets — keep them cacheable files
|
|
30
|
+
minify: "terser",
|
|
31
|
+
terserOptions: { compress: { passes: 2, drop_console: true }, format: { comments: false } },
|
|
32
|
+
rollupOptions: {
|
|
33
|
+
output: {
|
|
34
|
+
// Vite 8's rolldown bundler requires the FUNCTION form (the object form
|
|
35
|
+
// `{ phaser: ["phaser"] }` throws "manualChunks is not a function").
|
|
36
|
+
manualChunks: id =>
|
|
37
|
+
id.includes("node_modules/phaser") ? "phaser" : undefined,
|
|
38
|
+
entryFileNames: "assets/[name]-[hash].js", // content hash on everything
|
|
39
|
+
chunkFileNames: "assets/[name]-[hash].js",
|
|
40
|
+
assetFileNames: "assets/[name]-[hash][extname]",
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
The `manualChunks` function is the single highest-value line: Phaser is hundreds
|
|
48
|
+
of KB and rarely changes, so isolating it means a gameplay tweak only busts the
|
|
49
|
+
small app chunk. Use the **function** form — Vite 8 ships the rolldown bundler,
|
|
50
|
+
which requires it (the classic object form throws `manualChunks is not a
|
|
51
|
+
function`). Two-pass terser squeezes meaningfully more than one.
|
|
52
|
+
|
|
53
|
+
## Asset hashing and immutable caching
|
|
54
|
+
|
|
55
|
+
Every emitted file carries a content hash, so it can be cached forever and a
|
|
56
|
+
change produces a new filename (cache-busted automatically):
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
/assets/index-3f2a.js Cache-Control: public, max-age=31536000, immutable
|
|
60
|
+
/assets/phaser-9b1c.js Cache-Control: public, max-age=31536000, immutable
|
|
61
|
+
/index.html Cache-Control: no-cache (must revalidate to pick up new hashes)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`index.html` is the only file served `no-cache` — it points at the hashed assets,
|
|
65
|
+
so revalidating it is enough to roll the whole app forward. Game assets under
|
|
66
|
+
`public/assets/**` ([[phaser-asset-pipeline]]) are hashed by the PWA precache
|
|
67
|
+
manifest below even though Vite copies them verbatim.
|
|
68
|
+
|
|
69
|
+
## Base path per host
|
|
70
|
+
|
|
71
|
+
`base` must match where the game is served:
|
|
72
|
+
|
|
73
|
+
- Root domain / custom domain → `base: "/"`.
|
|
74
|
+
- GitHub Pages project site → `base: "/<repo>/"`.
|
|
75
|
+
- Subpath behind a reverse proxy → that subpath.
|
|
76
|
+
|
|
77
|
+
A wrong `base` is the classic "works on `bun run dev`, blank canvas on deploy"
|
|
78
|
+
bug — assets 404 because the URLs are absolute to the wrong root. Drive it from an
|
|
79
|
+
env var so the same build config serves every host.
|
|
80
|
+
|
|
81
|
+
## PWA: vite-plugin-pwa (on by default)
|
|
82
|
+
|
|
83
|
+
The PWA is on by default: install-to-home-screen, offline play, and auto-update.
|
|
84
|
+
`registerType: "autoUpdate"` ships new versions without a manual prompt; the
|
|
85
|
+
critical part is extending `globPatterns` to precache **game assets** (atlases,
|
|
86
|
+
audio sprites, fonts) — the Workbox default only catches JS/CSS/HTML and would
|
|
87
|
+
leave a "installed but can't load its art offline" game.
|
|
88
|
+
|
|
89
|
+
```ts
|
|
90
|
+
VitePWA({
|
|
91
|
+
registerType: "autoUpdate",
|
|
92
|
+
includeAssets: ["favicon.svg"],
|
|
93
|
+
workbox: {
|
|
94
|
+
globPatterns: ["**/*.{js,css,html,png,jpg,svg,webp,woff2,json,fnt,mp3,m4a,ogg}"],
|
|
95
|
+
// critically include packed game assets:
|
|
96
|
+
globDirectory: "dist",
|
|
97
|
+
additionalManifestEntries: [], // or widen globPatterns to assets/**/*.{png,json,fnt,ogg,m4a}
|
|
98
|
+
maximumFileSizeToCacheInBytes: 8 * 1024 * 1024, // raise above default 2MB for atlas pages
|
|
99
|
+
},
|
|
100
|
+
manifest: { name: "Game", short_name: "Game", display: "fullscreen", orientation: "landscape",
|
|
101
|
+
background_color: "#000000", theme_color: "#000000", icons: [/* 192/512 */] },
|
|
102
|
+
})
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Set `maximumFileSizeToCacheInBytes` above the default 2 MB or large atlas pages
|
|
106
|
+
silently fall out of the precache.
|
|
107
|
+
|
|
108
|
+
## Bundle-size budget
|
|
109
|
+
|
|
110
|
+
A byte budget, checked after `bun run build`, fails the PR when a stray dependency
|
|
111
|
+
or an un-split engine chunk bloats the download. This is the same budget the
|
|
112
|
+
bundle-size gate in [[phaser-testing]] enforces in CI.
|
|
113
|
+
|
|
114
|
+
```jsonc
|
|
115
|
+
// size-limit config (or a custom post-build check)
|
|
116
|
+
[
|
|
117
|
+
{ "name": "app", "path": "dist/assets/index-*.js", "limit": "60 kB" },
|
|
118
|
+
{ "name": "phaser", "path": "dist/assets/phaser-*.js", "limit": "400 kB" }
|
|
119
|
+
]
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Separate budgets per chunk catch the right regressions: app growth from your code
|
|
123
|
+
vs. an accidental second copy of a big dependency landing in the phaser chunk.
|
|
124
|
+
|
|
125
|
+
## Static deploy
|
|
126
|
+
|
|
127
|
+
Output is plain static files in `dist/` — host on any static CDN (GitHub Pages,
|
|
128
|
+
Netlify, Cloudflare Pages, S3+CloudFront). Requirements: serve over HTTPS (PWA +
|
|
129
|
+
Web Audio expect a secure context), set the cache headers above (immutable for
|
|
130
|
+
hashed assets, no-cache for `index.html`), and for client-routed builds add an
|
|
131
|
+
SPA fallback to `index.html`. Build with the host's base path:
|
|
132
|
+
|
|
133
|
+
```bash
|
|
134
|
+
BASE_PATH=/my-game/ bun run build # then publish dist/
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Project conventions
|
|
138
|
+
|
|
139
|
+
- Run the asset pipeline before the build (`prebuild`) so `public/assets/**` and
|
|
140
|
+
`src/assets.ts` are current ([[phaser-asset-pipeline]]).
|
|
141
|
+
- `phaser` is always its own manualChunk; never let it merge into the app chunk.
|
|
142
|
+
- `base` comes from an env var, never hardcoded to one host.
|
|
143
|
+
- The bundle-size budget is committed and CI-gated ([[phaser-testing]]).
|
|
144
|
+
- Build pins: `phaser ^4.2.0`, Vite, TypeScript 6.
|
|
145
|
+
|
|
146
|
+
## Verification
|
|
147
|
+
|
|
148
|
+
Verified by `bun run build` succeeding under the size budget, then `bun run
|
|
149
|
+
preview` (served at the deploy `base`) booting the game with no 404s and no
|
|
150
|
+
console errors. Confirm the PWA registers (Application → Service Workers), load
|
|
151
|
+
once online then go offline and reload to confirm assets are precached, and
|
|
152
|
+
confirm a redeploy auto-updates clients without a manual cache clear.
|
|
153
|
+
</content>
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: phaser-i18n
|
|
3
|
+
description: "localizing a Phaser 4 game — a…"
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Phaser 4 Internationalization
|
|
7
|
+
|
|
8
|
+
## Overview
|
|
9
|
+
|
|
10
|
+
No user-facing string is hardcoded in a scene. All player-visible text comes from
|
|
11
|
+
a **typed string catalog** keyed by typed constants, so a missing or misspelled
|
|
12
|
+
key is a compile error and every string has a home for translation. The catalog
|
|
13
|
+
is a small typed wrapper (no heavy dependency required); locale switching
|
|
14
|
+
re-renders any open text. Announced strings ([[phaser-accessibility]]) and
|
|
15
|
+
service messages ([[phaser-services]]) draw from the same catalog.
|
|
16
|
+
|
|
17
|
+
## The typed catalog
|
|
18
|
+
|
|
19
|
+
One module owns the locales and the lookup. The key type is derived from the
|
|
20
|
+
default locale so every locale must cover the same keys:
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
// src/i18n/catalog.ts
|
|
24
|
+
const en = {
|
|
25
|
+
"menu.play": "Play",
|
|
26
|
+
"menu.settings": "Settings",
|
|
27
|
+
"hud.score": "Score: {score}",
|
|
28
|
+
"result.cleared": "Level {level} cleared!",
|
|
29
|
+
"lives": "{n} life|{n} lives", // singular|plural
|
|
30
|
+
} as const;
|
|
31
|
+
|
|
32
|
+
const es: Record<keyof typeof en, string> = {
|
|
33
|
+
"menu.play": "Jugar", "menu.settings": "Ajustes",
|
|
34
|
+
"hud.score": "Puntos: {score}", "result.cleared": "¡Nivel {level} superado!",
|
|
35
|
+
"lives": "{n} vida|{n} vidas",
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export type StringKey = keyof typeof en;
|
|
39
|
+
const locales = { en, es } as const;
|
|
40
|
+
export type Locale = keyof typeof locales;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## The `t()` function: interpolation + pluralization
|
|
44
|
+
|
|
45
|
+
```ts
|
|
46
|
+
// src/i18n/i18n.ts
|
|
47
|
+
let current: Locale = "en";
|
|
48
|
+
export function setLocale(l: Locale) { current = l; EventCenter.emit(GameEvent.LocaleChanged); }
|
|
49
|
+
export function getLocale() { return current; }
|
|
50
|
+
|
|
51
|
+
export function t(key: StringKey, params?: Record<string, string | number>): string {
|
|
52
|
+
let s = (locales[current][key] ?? locales.en[key]) as string; // fall back to en, never crash
|
|
53
|
+
if (s.includes("|") && params && "n" in params) // pick plural form
|
|
54
|
+
s = (Number(params.n) === 1 ? s.split("|")[0] : s.split("|")[1]);
|
|
55
|
+
return s.replace(/\{(\w+)\}/g, (_, k) => String(params?.[k] ?? `{${k}}`));
|
|
56
|
+
}
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Usage is always `t(...)` with a typed key — never a raw string in a scene:
|
|
60
|
+
|
|
61
|
+
```ts
|
|
62
|
+
this.add.bitmapText(x, y, Font.UI, t("hud.score", { score: 0 }));
|
|
63
|
+
this.announce(t("result.cleared", { level })); // [[phaser-accessibility]] live region
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
The plural/interpolation rules are pure functions — put them in `src/logic/**`
|
|
67
|
+
so Vitest covers them ([[phaser-testing]]).
|
|
68
|
+
|
|
69
|
+
## Locale switching at runtime
|
|
70
|
+
|
|
71
|
+
Changing language must update text that is already on screen. Emit a
|
|
72
|
+
`LocaleChanged` event on the EventsCenter ([[phaser-services]]); each scene with
|
|
73
|
+
visible text subscribes and re-applies `t()` to its labels, then removes the
|
|
74
|
+
listener in `shutdown` (the on/off discipline).
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
create() {
|
|
78
|
+
const refresh = () => this.scoreText.setText(t("hud.score", { score: this.score }));
|
|
79
|
+
EventCenter.on(GameEvent.LocaleChanged, refresh);
|
|
80
|
+
this.events.once(Phaser.Scenes.Events.SHUTDOWN, () => EventCenter.off(GameEvent.LocaleChanged, refresh));
|
|
81
|
+
}
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Persist the chosen locale via SaveService and apply it on boot; default from
|
|
85
|
+
`navigator.language` when there is no saved choice.
|
|
86
|
+
|
|
87
|
+
## BitmapText vs Text — the localization trade-off
|
|
88
|
+
|
|
89
|
+
The performance advice "use BitmapText for hot text" (the official `game-object-components` skill)
|
|
90
|
+
collides with i18n: a bitmap font only contains the glyphs it was generated with.
|
|
91
|
+
|
|
92
|
+
- **BitmapText** — fastest, but the BMFont must include every glyph the locale
|
|
93
|
+
needs. Fine for digits/Latin HUD; generate per-script font pages
|
|
94
|
+
([[phaser-asset-pipeline]]) if you ship CJK/Cyrillic/etc. via BitmapText.
|
|
95
|
+
- **Text** (canvas) — renders any glyph the loaded web font supports, handles
|
|
96
|
+
diacritics and combining marks, and is the safe choice for arbitrary
|
|
97
|
+
translated body text and user-generated content. Cost is rasterization per
|
|
98
|
+
change, so it is for static/low-churn strings.
|
|
99
|
+
|
|
100
|
+
Rule of thumb: BitmapText for high-churn numeric/short HUD with a covered glyph
|
|
101
|
+
set; Text for translated prose and any locale whose script the bitmap font does
|
|
102
|
+
not include. For RTL locales (Arabic/Hebrew), use canvas `Text` with
|
|
103
|
+
`rtl: true`/right alignment and lay out mirrored — BitmapText does not shape RTL.
|
|
104
|
+
|
|
105
|
+
## Project conventions
|
|
106
|
+
|
|
107
|
+
- Every player-facing string is a `t(StringKey, …)` call — no inline literals in
|
|
108
|
+
scenes/entities (this mirrors the no-raw-string-keys discipline).
|
|
109
|
+
- The default locale defines the key type; other locales must satisfy it
|
|
110
|
+
(compile error on a missing key).
|
|
111
|
+
- Interpolation/plural logic lives in `src/logic/**`; the catalog and `t()` live
|
|
112
|
+
in `src/i18n/**`.
|
|
113
|
+
- Locale persists via SaveService and is announced through the live region for
|
|
114
|
+
screen-reader users ([[phaser-accessibility]]).
|
|
115
|
+
|
|
116
|
+
## Verification
|
|
117
|
+
|
|
118
|
+
Verified by switching locale at runtime and confirming on-screen text updates
|
|
119
|
+
live (no reload), a missing key fails `bun run typecheck`, and pluralization unit
|
|
120
|
+
tests pass for n=0/1/many. For non-Latin locales, confirm glyphs render (no tofu
|
|
121
|
+
boxes) — that is the signal you need a per-script BMFont page or canvas Text.
|
|
122
|
+
</content>
|