@codyswann/lisa 4.72.1 → 4.72.3
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/all/copy-overwrite/scripts/lisa-hooks/worktree-binding-guard.mjs +225 -33
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +6 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +9 -5
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +4 -4
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-acceptance-criteria/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-agent-design-best-practices/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-agent-ready/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-analyze-claude-remote/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-atlassian-access/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-attribute-failure/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-automation-status/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-bug-triage/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-capability-drift/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-codebase-research/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-codify-verification/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-confluence-prd-intake/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-confluence-to-tracker/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-confluence-write-prd/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-cross-pollinate/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-debrief/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-debrief-apply/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-delivery-effectiveness/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-design-intake/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-detect-tooling/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-doctor/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-epic-triage/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-evaluation-suite/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-exploratory-qa/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-fix-linter-error/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-generate-claude-remote-build-script/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-git-commit/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-git-prune/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-git-submit-pr/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-add-journey/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-build-intake/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-claim/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-create/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-evidence/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-journey/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-prd-intake/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-project-v2/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-read-issue/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-sync/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-to-tracker/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-verify/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-write-prd/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-health/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-health-drift-cron/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-implement/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-code-complexity/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-harness/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-max-lines/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-max-lines-per-function/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-test-coverage/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-improve-tests/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-intake/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-intake-explain/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jam-access/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-add-journey/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-build-intake/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-claim/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-create/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-evidence/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-read-ticket/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-sync/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-verify/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jsdoc-best-practices/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-kane-browser/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-learnings-audit/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-access/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-add-journey/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-claim/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-create/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-evidence/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-journey/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-prd-intake/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-read-issue/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-sync/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-to-tracker/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-verify/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-prd/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-monitor/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-nightly-add-test-coverage/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-nightly-improve-tests/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-nightly-lower-code-complexity/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-access/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-prd-intake/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-to-tracker/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-notion-write-prd/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-code-review/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-code-simplifier/SKILL.md +3 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-code-simplifier/agents/openai.yaml +2 -2
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-coderabbit/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-sentry-sdk-setup/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-sentry-seer/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-parity-skill-creator/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-performance-review/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-persist-learning/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-plan/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-plugin-sync-explain/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-posthog-access/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-backlink/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-source-write/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-prd-ticket-coverage/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-product-walkthrough/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-pull-request-review/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-quality-review/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-queue-status/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-remote-dispatch/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-reproduce-bug/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-research/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-review-implementation/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-review-local/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-rework-triage/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-root-cause-analysis/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-security-review/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-security-zap-scan/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sentry-access/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-atlassian/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-automations/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-confluence/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-github/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-github-repo/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-jira/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-kane/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-linear/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-local-env/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-notion/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-aws/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-sonar/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sonarcloud-access/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-spec-conformance/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-starter-sync/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-sync-down/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-task-decomposition/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-task-triage/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tdd-implementation/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tear-down-automations/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-test-strategy/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-ticket-triage/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-track/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-add-journey/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-build-intake/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-claim/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-create/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-evidence/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-journey/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-read/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-source-artifacts/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-sync/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-validate/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-verify/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-tracker-write/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-usage-accounting/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-use-the-product/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-validate-tracker-mapping/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verification-lifecycle/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verify/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verify-prd/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-verify-workflow-change/SKILL.md +2 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-wiki-install/SKILL.md +2 -0
- package/plugins/lisa/hooks/worktree-binding-guard.mjs +225 -33
- package/plugins/lisa/rules/reference/design-source-of-truth.md +1 -1
- package/plugins/lisa/rules/reference/rejection-detection.md +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/skills/lisa-setup-aws/SKILL.md +3 -1
- package/plugins/lisa-cdk/.codex-plugin/skills/lisa-setup-aws/agents/openai.yaml +2 -2
- package/plugins/lisa-cdk/.codex-plugin/skills/setup-aws-accounts/SKILL.md +2 -0
- 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/worktree-binding-guard.mjs +225 -33
- package/plugins/lisa-copilot/rules/reference/design-source-of-truth.md +1 -1
- package/plugins/lisa-copilot/rules/reference/rejection-detection.md +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/worktree-binding-guard.mjs +225 -33
- package/plugins/lisa-cursor/rules/design-source-of-truth-reference.mdc +1 -1
- package/plugins/lisa-cursor/rules/rejection-detection-reference.mdc +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/skills/add-app-clip/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/apollo-client/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/atomic-design-gluestack/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/building-native-ui/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/container-view-pattern/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/cross-platform-compatibility/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/directory-structure/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/e2e-coverage-gaps/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/eas-update-insights/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-api-routes/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-brownfield/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-cicd-workflows/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-deployment/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-dev-client/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-env-config/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-module/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-router-best-practices/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-tailwind-setup/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-ui-jetpack-compose/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/expo-ui-swift-ui/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/gluestack-nativewind/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-add-journey/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-create/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-evidence/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-journey/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/jira-verify/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/lisa-e2e-coverage-gaps/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/lisa-maestro-mcp-setup/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/local-state/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/maestro-mcp-setup/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/native-data-fetching/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-browser-uat/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-check-logs/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-db-ops/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-deploy/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-monitor-errors/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-performance/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-run-local/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/ops-verify-health/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/owasp-zap/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/play-store-access/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/playwright-ci-debugging/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/playwright-selectors/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/reduce-complexity/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/testing-library/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/upgrading-expo/SKILL.md +2 -0
- package/plugins/lisa-expo/.codex-plugin/skills/use-dom/SKILL.md +2 -0
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/e2e-coverage-gaps/SKILL.md +2 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-auth/SKILL.md +2 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-build-and-deploy/SKILL.md +2 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-caching/SKILL.md +2 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-component-model/SKILL.md +2 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-config-yaml/SKILL.md +2 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-operations/SKILL.md +2 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-realtime/SKILL.md +2 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-resources/SKILL.md +2 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-rest-queries/SKILL.md +2 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-schema-graphql/SKILL.md +3 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-schema-graphql/agents/openai.yaml +2 -2
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/harper-testing/SKILL.md +2 -0
- package/plugins/lisa-harper-fabric/.codex-plugin/skills/lisa-e2e-coverage-gaps/SKILL.md +2 -0
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-graphql/SKILL.md +2 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/nestjs-rules/SKILL.md +2 -0
- package/plugins/lisa-nestjs/.codex-plugin/skills/typeorm-patterns/SKILL.md +2 -0
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-repo-topic/SKILL.md +2 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-staff-slack/SKILL.md +2 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-connect-staff-telegram/SKILL.md +2 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-repo-topic/SKILL.md +2 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-connect-staff/SKILL.md +2 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-openclaw-setup/SKILL.md +2 -0
- package/plugins/lisa-openclaw/.codex-plugin/skills/lisa-setup-openclaw/SKILL.md +2 -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 +1 -1
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-accessibility/SKILL.md +2 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-asset-pipeline/SKILL.md +2 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-asset-sourcing/SKILL.md +2 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-build-deploy/SKILL.md +2 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-i18n/SKILL.md +2 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-project-structure/SKILL.md +2 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-services/SKILL.md +2 -0
- package/plugins/lisa-phaser/.codex-plugin/skills/phaser-testing/SKILL.md +2 -0
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/skills/action-controller-best-practices/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/action-view-best-practices/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/active-record-model-best-practices/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/e2e-coverage-gaps/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/fix-linter-error/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-code-complexity/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-max-lines/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-max-lines-per-function/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/improve-test-coverage/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-add-journey/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-create/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-evidence/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-journey/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/jira-verify/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/lisa-e2e-coverage-gaps/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-check-logs/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-deploy/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-run-local/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-verify-jobs/SKILL.md +2 -0
- package/plugins/lisa-rails/.codex-plugin/skills/ops-verify-telemetry/SKILL.md +2 -0
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-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 +1 -1
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-add-ingest/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-add-role/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-ingest/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-lint/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-migrate/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-onboard-me/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-query/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-setup/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-setup-wiki/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-status/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-add-ingest/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-add-role/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-confluence/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-docs/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-git/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-jira/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-memory/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-notion/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-roles/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-slack/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-connector-web/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-doctor/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-ingest/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-lint/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-migrate/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-onboard-me/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-query/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-setup/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-setup-automations/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-status/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-tear-down-automations/SKILL.md +2 -0
- package/plugins/lisa-wiki/.codex-plugin/skills/lisa-wiki-usage/SKILL.md +2 -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/worktree-binding-guard.mjs +225 -33
- package/plugins/src/base/rules/reference/design-source-of-truth.md +1 -1
- package/plugins/src/base/rules/reference/rejection-detection.md +1 -1
- package/scripts/generate-codex-plugin-artifacts.mjs +11 -6
|
@@ -3,6 +3,8 @@ name: lisa-verify-prd
|
|
|
3
3
|
description: "Initiative-level PRD acceptance…"
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "Read"]
|
|
5
5
|
---
|
|
6
|
+
Initiative-level PRD acceptance gate. Given a PRD ref/URL (GitHub, Linear, Notion, Confluence, or JIRA), resolves the source vendor, reads the PRD and its generated top-level child work via the prd-lifecycle-rollup contract, and confirms every required child is terminal before any verification runs — if any is non-terminal it reports the incomplete set and STOPS. When the guard passes it runs spec-conformance against the original PRD requirements plus empirical verification via verification-lifecycle. On CONFORMS with all checks passing: transitions the PRD shipped → verified and posts evidence. On PARTIAL/DIVERGES or any failing check: re-opens the PRD shipped → ticketed (NEVER blocked), creates build-ready fix tickets for each divergence, and posts a product-readable failure report — the fix tickets auto-build, rollup re-ships the PRD, and a later intake cycle re-verifies, so the loop closes itself. Idempotent re-runs: comments regenerate in place via sentinel markers; fix tickets dedupe by stable ref.
|
|
7
|
+
|
|
6
8
|
|
|
7
9
|
# PRD-level Verification: $ARGUMENTS
|
|
8
10
|
|
|
@@ -3,6 +3,8 @@ name: lisa-verify-workflow-change
|
|
|
3
3
|
description: "a GitHub Actions workflow file…"
|
|
4
4
|
allowed-tools: ["Bash", "Read"]
|
|
5
5
|
---
|
|
6
|
+
Use when a GitHub Actions workflow file changed and you need pre-merge runtime proof. Classifies default-branch-only triggers, dispatches a safe workflow_dispatch sibling on the branch ref when possible, observes the exact step under test, cancels before side effects, and proves cleanup.
|
|
7
|
+
|
|
6
8
|
|
|
7
9
|
# Verify Workflow Change
|
|
8
10
|
|
|
@@ -3,6 +3,8 @@ name: lisa-wiki-install
|
|
|
3
3
|
description: "Bootstrap the LLM Wiki kernel…"
|
|
4
4
|
allowed-tools: ["Bash", "Read", "Write", "Edit"]
|
|
5
5
|
---
|
|
6
|
+
Bootstrap the LLM Wiki kernel (lisa-wiki plugin) in a host project. Solves the chicken-and-egg gap: the base lisa plugin can install the wiki plugin so its setup skill becomes discoverable. Edits .claude/settings.json to enable lisa-wiki@lisa and confirm the CodySwannGT/lisa marketplace, then for Codex verifies whether the .codex/skills/lisa overlay already carries lisa-wiki-* skills (printed by Lisa's apply) and nudges the user to refresh the overlay if missing. Idempotent. Never auto-runs `lisa apply`. After this skill, reload the runtime and run /setup:wiki (Claude) or $lisa-wiki-setup (Codex) to scaffold the wiki itself.
|
|
7
|
+
|
|
6
8
|
|
|
7
9
|
# Install the LLM Wiki kernel
|
|
8
10
|
|
|
@@ -38,9 +38,9 @@
|
|
|
38
38
|
* first attempt and lets the retry through is defeated by a blind retry, which
|
|
39
39
|
* is the single most likely next action. So the block stands until the session
|
|
40
40
|
* states, in the acknowledgement, the absolute path it now intends to work in.
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
41
|
+
* An acknowledgement can choose the observed root, return to the initial root,
|
|
42
|
+
* or accept a linked target this session was explicitly offered. A selected
|
|
43
|
+
* target does not prove a move: the next guarded call must actually be there.
|
|
44
44
|
*
|
|
45
45
|
* FAILING OPEN, LOUDLY. Anything this cannot determine — no session id, no
|
|
46
46
|
* cwd, not a git repository, an unreadable state file — exits 0 with a line on
|
|
@@ -71,6 +71,7 @@ const GUARDED_TOOLS = new Set(["Bash", "Write", "Edit", "MultiEdit"]);
|
|
|
71
71
|
* on its own PreToolUse pass — which is exactly where a command string arrives.
|
|
72
72
|
*/
|
|
73
73
|
const ACCEPT_PREFIX = "lisa-worktree-binding: accept";
|
|
74
|
+
const ACK_AND_SEPARATOR = Symbol("acknowledgement AND separator");
|
|
74
75
|
|
|
75
76
|
/**
|
|
76
77
|
* Resolve a path the way git reports one.
|
|
@@ -157,6 +158,46 @@ function mainCheckout(cwd) {
|
|
|
157
158
|
return null;
|
|
158
159
|
}
|
|
159
160
|
|
|
161
|
+
/** Registered roots of the bound repository, with Git path quoting disabled. */
|
|
162
|
+
function linkedWorktreeRoots(bound) {
|
|
163
|
+
const listing = git(["worktree", "list", "--porcelain", "-z"], bound);
|
|
164
|
+
if (listing === null) {
|
|
165
|
+
say(
|
|
166
|
+
"git could not identify linked worktrees; repository identity is NOT enforced"
|
|
167
|
+
);
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
return new Set(
|
|
171
|
+
listing
|
|
172
|
+
.split("\0")
|
|
173
|
+
.filter(record => record.startsWith("worktree "))
|
|
174
|
+
.map(record => realpath(record.slice("worktree ".length)))
|
|
175
|
+
);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/** Canonical common Git directory: stable identity across linked checkouts. */
|
|
179
|
+
function repositoryIdentity(root) {
|
|
180
|
+
if (typeof root !== "string") return null;
|
|
181
|
+
const common = git(["rev-parse", "--git-common-dir"], root);
|
|
182
|
+
if (common === null) {
|
|
183
|
+
say("git could not compare repository identity; identity is NOT enforced");
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
return realpath(resolve(root, common));
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/** A registration is only authoritative while its live repository agrees. */
|
|
190
|
+
function isLinkedWorktree(
|
|
191
|
+
bound,
|
|
192
|
+
candidate,
|
|
193
|
+
roots = linkedWorktreeRoots(bound)
|
|
194
|
+
) {
|
|
195
|
+
if (!roots?.has(candidate) || worktreeRoot(candidate) !== candidate)
|
|
196
|
+
return false;
|
|
197
|
+
const common = repositoryIdentity(bound);
|
|
198
|
+
return common !== null && common === repositoryIdentity(candidate);
|
|
199
|
+
}
|
|
200
|
+
|
|
160
201
|
/**
|
|
161
202
|
* How much of an executed script this guard will read, in bytes.
|
|
162
203
|
*
|
|
@@ -300,6 +341,7 @@ function executedPath(segment) {
|
|
|
300
341
|
* fooled by exactly that and was caught only by a known-answer control.
|
|
301
342
|
*/
|
|
302
343
|
function foreignTreeIn(text, bound, cwd) {
|
|
344
|
+
let linkedRoots;
|
|
303
345
|
const code = text
|
|
304
346
|
.split("\n")
|
|
305
347
|
.map(line => line.replace(/^\s*#.*$/u, ""))
|
|
@@ -320,7 +362,10 @@ function foreignTreeIn(text, bound, cwd) {
|
|
|
320
362
|
} catch {
|
|
321
363
|
continue;
|
|
322
364
|
}
|
|
323
|
-
if (root && root !== bound)
|
|
365
|
+
if (root && root !== bound) {
|
|
366
|
+
if (linkedRoots === undefined) linkedRoots = linkedWorktreeRoots(bound);
|
|
367
|
+
if (isLinkedWorktree(bound, root, linkedRoots)) return root;
|
|
368
|
+
}
|
|
324
369
|
}
|
|
325
370
|
return null;
|
|
326
371
|
}
|
|
@@ -499,10 +544,10 @@ function reachesOut(script, foreign, bound) {
|
|
|
499
544
|
` script: ${script}`,
|
|
500
545
|
` reaches: ${foreign}`,
|
|
501
546
|
` bound to: ${bound}`,
|
|
502
|
-
"The
|
|
503
|
-
"
|
|
504
|
-
"belongs to, or acknowledge the move:",
|
|
547
|
+
"The access lives inside the file, after this guard measures the session.",
|
|
548
|
+
"Run the work from the tree it belongs to, or acknowledge that target:",
|
|
505
549
|
acceptanceLine(foreign),
|
|
550
|
+
"Then move to the acknowledged tree before further guarded calls.",
|
|
506
551
|
]);
|
|
507
552
|
}
|
|
508
553
|
|
|
@@ -602,9 +647,8 @@ function readState(bindingKeyValue, payload) {
|
|
|
602
647
|
/**
|
|
603
648
|
* Write the session's binding state, MERGING over whatever is already there.
|
|
604
649
|
*
|
|
605
|
-
*
|
|
606
|
-
*
|
|
607
|
-
* What it buys is that a field one writer owns is not silently dropped by
|
|
650
|
+
* Explicit `claimedRoot: null` still clears a claim. Merging means that a
|
|
651
|
+
* field one writer owns is not silently dropped by
|
|
608
652
|
* another writer that had no opinion about it: `runtimeNoticed` is written by
|
|
609
653
|
* {@link noticeRuntimeDrift} and read by nobody else, and a clobbering write
|
|
610
654
|
* would turn its "reported once" into "reported again after the next
|
|
@@ -617,12 +661,24 @@ function readState(bindingKeyValue, payload) {
|
|
|
617
661
|
*/
|
|
618
662
|
function writeState(bindingKeyValue, state, payload) {
|
|
619
663
|
const file = stateFile(bindingKeyValue);
|
|
664
|
+
const previous = readState(bindingKeyValue, payload);
|
|
665
|
+
const originalRoot =
|
|
666
|
+
previous?.originalRoot ?? previous?.boundRoot ?? state.boundRoot;
|
|
667
|
+
const originalCommonDir =
|
|
668
|
+
previous?.originalCommonDir ?? repositoryIdentity(originalRoot);
|
|
620
669
|
try {
|
|
621
670
|
mkdirSync(dirname(file), { recursive: true });
|
|
622
671
|
writeFileSync(
|
|
623
672
|
file,
|
|
624
673
|
`${JSON.stringify(
|
|
625
|
-
{
|
|
674
|
+
{
|
|
675
|
+
...previous,
|
|
676
|
+
...state,
|
|
677
|
+
// Preserve the initial root after intentional rebinds. A legacy
|
|
678
|
+
// state's established root is its only proven recovery anchor.
|
|
679
|
+
originalRoot,
|
|
680
|
+
originalCommonDir,
|
|
681
|
+
},
|
|
626
682
|
null,
|
|
627
683
|
2
|
|
628
684
|
)}\n`
|
|
@@ -749,43 +805,161 @@ function refuse(lines) {
|
|
|
749
805
|
}
|
|
750
806
|
|
|
751
807
|
function acceptanceLine(observed) {
|
|
752
|
-
|
|
808
|
+
const literal = `${ACCEPT_PREFIX} ${observed}`.replaceAll("'", "'\\''");
|
|
809
|
+
return ` echo '${literal}'`;
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
/** Read literal shell words and AND separators without evaluating expansions. */
|
|
813
|
+
function acknowledgementWords(text) {
|
|
814
|
+
const words = [];
|
|
815
|
+
let word = "",
|
|
816
|
+
active = false,
|
|
817
|
+
quote = null;
|
|
818
|
+
const emit = () => {
|
|
819
|
+
if (active) words.push(word);
|
|
820
|
+
word = "";
|
|
821
|
+
active = false;
|
|
822
|
+
};
|
|
823
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
824
|
+
const char = text[index];
|
|
825
|
+
if (quote === "'") {
|
|
826
|
+
if (char === "'") quote = null;
|
|
827
|
+
else word += char;
|
|
828
|
+
continue;
|
|
829
|
+
}
|
|
830
|
+
if (char === "\\") {
|
|
831
|
+
const next = text[index + 1];
|
|
832
|
+
if (next === undefined) return null;
|
|
833
|
+
if (quote === '"' && !['"', "\\", "$", "`", "\n"].includes(next)) {
|
|
834
|
+
word += char;
|
|
835
|
+
continue;
|
|
836
|
+
}
|
|
837
|
+
index += 1;
|
|
838
|
+
if (next !== "\n") {
|
|
839
|
+
word += next;
|
|
840
|
+
active = true;
|
|
841
|
+
}
|
|
842
|
+
continue;
|
|
843
|
+
}
|
|
844
|
+
if (quote === '"') {
|
|
845
|
+
if (char === '"') quote = null;
|
|
846
|
+
else if (char === "$" || char === "`") return null;
|
|
847
|
+
else word += char;
|
|
848
|
+
continue;
|
|
849
|
+
}
|
|
850
|
+
if (char === "'" || char === '"') {
|
|
851
|
+
quote = char;
|
|
852
|
+
active = true;
|
|
853
|
+
} else if (char === " " || char === "\t") emit();
|
|
854
|
+
else if (char === "\n") return null;
|
|
855
|
+
else if (char === "&" && text[index + 1] === "&") {
|
|
856
|
+
emit();
|
|
857
|
+
words.push(ACK_AND_SEPARATOR);
|
|
858
|
+
index += 1;
|
|
859
|
+
} else if (/[&;|<>$`*?[\]{}()]/u.test(char)) return null;
|
|
860
|
+
else {
|
|
861
|
+
word += char;
|
|
862
|
+
active = true;
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
if (quote !== null) return null;
|
|
866
|
+
emit();
|
|
867
|
+
return words;
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
/** Strip only actual shell edge whitespace in linear time. */
|
|
871
|
+
function acknowledgementText(command) {
|
|
872
|
+
let start = 0,
|
|
873
|
+
end = command.length;
|
|
874
|
+
while (start < end && " \t\n".includes(command[start])) start += 1;
|
|
875
|
+
while (end > start && " \t\n".includes(command[end - 1])) end -= 1;
|
|
876
|
+
return command.slice(start, end);
|
|
877
|
+
}
|
|
878
|
+
|
|
879
|
+
/** A literal echo, optionally preceded by a literal cd to the stated root. */
|
|
880
|
+
function acceptanceRequest(command) {
|
|
881
|
+
const text = acknowledgementText(command);
|
|
882
|
+
const words = acknowledgementWords(text.replace(/;$/u, ""));
|
|
883
|
+
if (!words) return null;
|
|
884
|
+
const direct = words.length === 2 && words[0] === "echo";
|
|
885
|
+
const moving =
|
|
886
|
+
words.length === 5 &&
|
|
887
|
+
words[0] === "cd" &&
|
|
888
|
+
typeof words[1] === "string" &&
|
|
889
|
+
words[2] === ACK_AND_SEPARATOR &&
|
|
890
|
+
words[3] === "echo";
|
|
891
|
+
if (!direct && !moving) return null;
|
|
892
|
+
const message = words.at(-1);
|
|
893
|
+
if (typeof message !== "string" || !message.startsWith(`${ACCEPT_PREFIX} `))
|
|
894
|
+
return null;
|
|
895
|
+
const stated = message.slice(ACCEPT_PREFIX.length + 1);
|
|
896
|
+
// The printed protocol names absolute roots. Empty/relative operands and
|
|
897
|
+
// cd's special ~, -, or -- forms cannot authorize a move.
|
|
898
|
+
if (!isAbsolute(stated)) return null;
|
|
899
|
+
const path = realpath(stated);
|
|
900
|
+
const destination =
|
|
901
|
+
moving && isAbsolute(words[1]) ? realpath(words[1]) : null;
|
|
902
|
+
return {
|
|
903
|
+
path,
|
|
904
|
+
validMove: !moving || (destination !== null && destination === path),
|
|
905
|
+
};
|
|
753
906
|
}
|
|
754
907
|
|
|
755
908
|
/**
|
|
756
|
-
*
|
|
757
|
-
*
|
|
758
|
-
* The path is compared against what the session is measurably in, not against
|
|
759
|
-
* what it says it wants. An acknowledgement naming somewhere else is the case
|
|
760
|
-
* this is for: it means the operator is reasoning about a tree they are not in.
|
|
909
|
+
* Validate the initial recovery root against the identity captured at baseline.
|
|
910
|
+
* The current checkout may have been removed or deliberately rebound elsewhere.
|
|
761
911
|
*/
|
|
912
|
+
function isOriginalRoot(state, path) {
|
|
913
|
+
const original = state?.originalRoot ?? state?.boundRoot;
|
|
914
|
+
if (path !== original || worktreeRoot(path) !== path) return false;
|
|
915
|
+
// Older state can only prove the repository of its established binding.
|
|
916
|
+
const common = state.originalCommonDir ?? repositoryIdentity(state.boundRoot);
|
|
917
|
+
return common !== null && common === repositoryIdentity(path);
|
|
918
|
+
}
|
|
919
|
+
|
|
920
|
+
/** Acknowledgements select intent; the next call must prove actual movement. */
|
|
762
921
|
function handleAcceptance(payload, observed) {
|
|
763
922
|
const command = payload.tool_input?.command;
|
|
764
923
|
if (typeof command !== "string" || !command.includes(ACCEPT_PREFIX))
|
|
765
924
|
return null;
|
|
766
|
-
const
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
const
|
|
770
|
-
const
|
|
771
|
-
|
|
925
|
+
const request = acceptanceRequest(command);
|
|
926
|
+
if (!request) return null;
|
|
927
|
+
const { path, validMove } = request;
|
|
928
|
+
const previous = readState(bindingKey(payload), payload);
|
|
929
|
+
const original = previous?.originalRoot ?? previous?.boundRoot;
|
|
930
|
+
const recovering = isOriginalRoot(previous, path);
|
|
931
|
+
const offered =
|
|
932
|
+
path === previous?.offeredRoot &&
|
|
933
|
+
isLinkedWorktree(previous.boundRoot, path);
|
|
934
|
+
if (!validMove || (path !== observed && !recovering && !offered)) {
|
|
935
|
+
const suggestion = observed ?? original;
|
|
772
936
|
return refuse([
|
|
773
937
|
`worktree-binding-guard: this acknowledgement names ${path ?? "no path"},`,
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
938
|
+
"but it is not a valid move to the observed, original, or offered worktree. Not rebinding.",
|
|
939
|
+
...(suggestion
|
|
940
|
+
? [
|
|
941
|
+
"Acknowledge the measured or original worktree:",
|
|
942
|
+
acceptanceLine(suggestion),
|
|
943
|
+
]
|
|
944
|
+
: []),
|
|
777
945
|
]);
|
|
778
946
|
}
|
|
779
|
-
writeState(
|
|
947
|
+
const written = writeState(
|
|
780
948
|
bindingKey(payload),
|
|
781
949
|
{
|
|
782
|
-
boundRoot:
|
|
950
|
+
boundRoot: path,
|
|
783
951
|
claimedRoot: null,
|
|
952
|
+
offeredRoot: null,
|
|
784
953
|
updatedAt: new Date().toISOString(),
|
|
785
954
|
},
|
|
786
955
|
payload
|
|
787
956
|
);
|
|
788
|
-
|
|
957
|
+
if (written)
|
|
958
|
+
say(
|
|
959
|
+
path === observed
|
|
960
|
+
? `bound to ${path}`
|
|
961
|
+
: `binding set to ${path}; move there before further guarded calls`
|
|
962
|
+
);
|
|
789
963
|
return 0;
|
|
790
964
|
}
|
|
791
965
|
|
|
@@ -985,6 +1159,11 @@ function evaluate(payload) {
|
|
|
985
1159
|
}
|
|
986
1160
|
const binding = bindingKey(payload);
|
|
987
1161
|
const observed = worktreeRoot(cwd);
|
|
1162
|
+
// The initial-root recovery acknowledgement also works outside any repo.
|
|
1163
|
+
if (GUARDED_TOOLS.has(payload.tool_name)) {
|
|
1164
|
+
const accepted = handleAcceptance(payload, observed);
|
|
1165
|
+
if (accepted !== null) return accepted;
|
|
1166
|
+
}
|
|
988
1167
|
if (!observed) return 0;
|
|
989
1168
|
|
|
990
1169
|
if (payload.hook_event_name === "SessionStart") {
|
|
@@ -996,14 +1175,18 @@ function evaluate(payload) {
|
|
|
996
1175
|
return 0;
|
|
997
1176
|
}
|
|
998
1177
|
if (payload.tool_name === "EnterWorktree") {
|
|
1178
|
+
const previous = readState(binding, payload);
|
|
1179
|
+
if (
|
|
1180
|
+
previous?.boundRoot &&
|
|
1181
|
+
previous.boundRoot !== observed &&
|
|
1182
|
+
!isLinkedWorktree(previous.boundRoot, observed)
|
|
1183
|
+
)
|
|
1184
|
+
return 0;
|
|
999
1185
|
recordClaim(payload, observed);
|
|
1000
1186
|
return 0;
|
|
1001
1187
|
}
|
|
1002
1188
|
if (!GUARDED_TOOLS.has(payload.tool_name)) return 0;
|
|
1003
1189
|
|
|
1004
|
-
const accepted = handleAcceptance(payload, observed);
|
|
1005
|
-
if (accepted !== null) return accepted;
|
|
1006
|
-
|
|
1007
1190
|
const state = readState(binding, payload);
|
|
1008
1191
|
if (!state?.boundRoot) {
|
|
1009
1192
|
// No baseline means SessionStart did not run for this session — an older
|
|
@@ -1024,6 +1207,11 @@ function evaluate(payload) {
|
|
|
1024
1207
|
);
|
|
1025
1208
|
return 0;
|
|
1026
1209
|
}
|
|
1210
|
+
if (
|
|
1211
|
+
state.boundRoot !== observed &&
|
|
1212
|
+
!isLinkedWorktree(state.boundRoot, observed)
|
|
1213
|
+
)
|
|
1214
|
+
return 0;
|
|
1027
1215
|
if (state.claimedRoot && state.claimedRoot !== observed) {
|
|
1028
1216
|
return unconfirmedSwitch(state.claimedRoot, observed);
|
|
1029
1217
|
}
|
|
@@ -1033,6 +1221,7 @@ function evaluate(payload) {
|
|
|
1033
1221
|
{
|
|
1034
1222
|
boundRoot: observed,
|
|
1035
1223
|
claimedRoot: null,
|
|
1224
|
+
offeredRoot: null,
|
|
1036
1225
|
updatedAt: new Date().toISOString(),
|
|
1037
1226
|
},
|
|
1038
1227
|
payload
|
|
@@ -1043,7 +1232,10 @@ function evaluate(payload) {
|
|
|
1043
1232
|
// Last, and only once the session is provably where it should be: a script
|
|
1044
1233
|
// that moves somewhere else after this check has already run.
|
|
1045
1234
|
const reach = scriptReachingForeignTree(payload, observed);
|
|
1046
|
-
if (reach)
|
|
1235
|
+
if (reach) {
|
|
1236
|
+
writeState(binding, { offeredRoot: reach.foreign }, payload);
|
|
1237
|
+
return reachesOut(reach.script, reach.foreign, observed);
|
|
1238
|
+
}
|
|
1047
1239
|
return 0;
|
|
1048
1240
|
}
|
|
1049
1241
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Design Source of Truth
|
|
2
2
|
|
|
3
3
|
> Demoted from the always-on eager tier by CodySwannGT/lisa#3992. The
|
|
4
|
-
> section below is the former eager head,
|
|
4
|
+
> section below is the former eager head, preserved verbatim; the full
|
|
5
5
|
> contract follows it. Reachable on demand via [the rule index](../eager/00-rule-index.md).
|
|
6
6
|
|
|
7
7
|
## Design Source of Truth (load-bearing)
|
|
@@ -272,7 +272,7 @@ The state-only reading is what fails today, so a backward move is **not** suffic
|
|
|
272
272
|
- **JIRA** — `lisa-atlassian-access operation: changelog key:<K>`; each changelog entry carries an `author` alongside its `from`/`to` status items.
|
|
273
273
|
- **Linear** — `lisa-linear-access operation: history id:<ID>`; each history node carries an `actor` alongside `fromState` / `toState`.
|
|
274
274
|
|
|
275
|
-
An actor is **this flow** when it is the configured automation identity, or when the flow's own marker note (`[lisa-repair-intake]`) sits at that transition's timestamp.
|
|
275
|
+
An actor is **this flow** when it is the configured automation identity, or when the flow's own marker note (`[lisa-repair-intake]`) sits at that transition's timestamp. A different actor counts as human only when the provider positively identifies a person, rather than a bot, integration, or another automation identity. Missing or ambiguous actor information yields `unknown` — never an assumed human.
|
|
276
276
|
|
|
277
277
|
**A marker and a transition on the same item say nothing until you know their order.** A hold label, a comment and a lane move routinely coexist on a reversed item, and co-occurrence reads equally well in both directions — a label applied *before* a transition guards it, the same label applied *after* records that the transition was undone. Sourcing the facts, attributing them correctly and reading the artifact all pass cleanly on an invented sequence; only ordering disconfirms it. Compare timestamps explicitly and treat an unorderable pair as `unknown`.
|
|
278
278
|
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: lisa-setup-aws
|
|
3
|
-
description: "Provision the
|
|
3
|
+
description: "Provision the…"
|
|
4
4
|
---
|
|
5
|
+
Provision the dev/staging/production/shared AWS accounts this CDK project deploys into via the @codyswann/aws-soc2-setup CLI (Organizations, Control Tower, IAM Identity Center, SOC 2 controls), then wire them in end-to-end: SSO profiles, cdk bootstrap with pipeline trust, PLACEHOLDER account IDs in config/environments.ts, AWS_ACCOUNT_ID_* GitHub secrets, and the .lisa.config.json account map. Idempotent; console-only prerequisites (root MFA, Identity Center, landing zone) surface as a human checklist instead of being automated.
|
|
6
|
+
|
|
5
7
|
## Lisa Command Compatibility
|
|
6
8
|
|
|
7
9
|
- Original Claude command: `/lisa:setup:aws`
|
|
@@ -3,6 +3,8 @@ name: setup-aws-accounts
|
|
|
3
3
|
description: "Provision the multi-account AWS…"
|
|
4
4
|
allowed-tools: ["Bash", "Read", "Edit", "Write", "AskUserQuestion"]
|
|
5
5
|
---
|
|
6
|
+
Provision the multi-account AWS environment a Lisa CDK project deploys into, using the @codyswann/aws-soc2-setup CLI (AWS Organizations, Control Tower, IAM Identity Center, SOC 2 controls). Use when a CDK project still has PLACEHOLDER account IDs in config/environments.ts, when asked to create the dev/staging/production/shared AWS accounts, or when CDK deploys fail because accounts, SSO profiles, or bootstrap are missing. Drives the CLI for the org + OU + security foundation and Account Factory account vending, writes the AWS SSO profiles the project's scripts expect, runs cdk bootstrap with cross-account pipeline trust, replaces PLACEHOLDER account IDs, sets the AWS_ACCOUNT_ID_* GitHub secrets when CI uses them, and records the account map in .lisa.config.json. Idempotent — safe to re-run. Console-only prerequisites (root MFA, enabling Identity Center, creating the Control Tower landing zone) are surfaced as an explicit human checklist, never automated.
|
|
7
|
+
|
|
6
8
|
|
|
7
9
|
# Setup AWS Accounts (SOC 2 Landing Zone)
|
|
8
10
|
|