invar-tools 1.8.0__tar.gz → 1.10.0__tar.gz
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.
- invar_tools-1.10.0/.claude/hooks/PostToolUse.sh +10 -0
- invar_tools-1.10.0/.claude/hooks/PreToolUse.sh +10 -0
- invar_tools-1.10.0/.claude/hooks/Stop.sh +10 -0
- invar_tools-1.10.0/.claude/hooks/UserPromptSubmit.sh +10 -0
- invar_tools-1.10.0/.claude/skills/acceptance/SKILL.md +383 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.claude/skills/develop/SKILL.md +7 -2
- invar_tools-1.10.0/.claude/skills/invar-onboard/SKILL.md +448 -0
- invar_tools-1.10.0/.claude/skills/invar-onboard/patterns/python.md +347 -0
- invar_tools-1.10.0/.claude/skills/invar-onboard/patterns/typescript.md +452 -0
- invar_tools-1.10.0/.claude/skills/invar-onboard/templates/assessment.md.jinja +214 -0
- invar_tools-1.10.0/.claude/skills/invar-onboard/templates/roadmap.md.jinja +168 -0
- invar_tools-1.10.0/.claude/skills/review/SKILL.md +613 -0
- invar_tools-1.10.0/.claude/skills/security/SKILL.md +382 -0
- invar_tools-1.10.0/.claude/skills/security/patterns/_common.yaml +126 -0
- invar_tools-1.10.0/.claude/skills/security/patterns/python.yaml +155 -0
- invar_tools-1.10.0/.claude/skills/security/patterns/typescript.yaml +194 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.gitignore +6 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.invar/context.md +8 -8
- {invar_tools-1.8.0/src/invar/templates → invar_tools-1.10.0/.invar}/examples/README.md +2 -0
- {invar_tools-1.8.0/src/invar/templates → invar_tools-1.10.0/.invar}/examples/conftest.py +1 -1
- {invar_tools-1.8.0/src/invar/templates → invar_tools-1.10.0/.invar}/examples/contracts.py +81 -4
- invar_tools-1.10.0/.invar/examples/core_shell.py +227 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.invar/examples/functional.py +165 -2
- {invar_tools-1.8.0 → invar_tools-1.10.0}/CLAUDE.md +8 -2
- {invar_tools-1.8.0 → invar_tools-1.10.0}/INVAR.md +101 -37
- {invar_tools-1.8.0 → invar_tools-1.10.0}/PKG-INFO +304 -12
- {invar_tools-1.8.0 → invar_tools-1.10.0}/README.md +303 -11
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/design.md +32 -2
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/index.html +88 -2
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/DX-62-proactive-reference-reading.md +11 -1
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/LX-04-pi-agent-support.md +20 -14
- invar_tools-1.10.0/docs/proposals/LX-07-extension-skills.md +1561 -0
- invar_tools-1.10.0/docs/proposals/LX-08-extension-skills-future.md +67 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-39-workflow-efficiency.md +1 -1
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-41-automatic-review-orchestration.md +1 -1
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-42-workflow-auto-routing.md +1 -1
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-50-workflow-enforcement.md +4 -1
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-51-workflow-phase-visibility.md +1 -1
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-52-venv-dependency-injection.md +1 -1
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-67-explicit-skill-invocation.md +1 -1
- invar_tools-1.10.0/docs/proposals/completed/DX-70-review-isolation.md +185 -0
- invar_tools-1.10.0/docs/proposals/completed/DX-71-skill-command-simplification.md +152 -0
- invar_tools-1.10.0/docs/proposals/completed/DX-72-mandatory-self-review-detection.md +140 -0
- invar_tools-1.10.0/docs/proposals/completed/LX-05-language-agnostic-protocol.md +1237 -0
- invar_tools-1.10.0/docs/proposals/completed/LX-06-appendix-guard-comparison.md +499 -0
- invar_tools-1.10.0/docs/proposals/completed/LX-06-typescript-tooling.md +920 -0
- invar_tools-1.10.0/docs/proposals/completed/LX-09-legacy-onboarding.md +1290 -0
- invar_tools-1.10.0/docs/proposals/completed/LX-10-typescript-size-limits.md +267 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/index.md +84 -12
- {invar_tools-1.8.0 → invar_tools-1.10.0}/pyproject.toml +11 -3
- {invar_tools-1.8.0 → invar_tools-1.10.0}/runtime/src/invar_runtime/__init__.py +1 -1
- {invar_tools-1.8.0 → invar_tools-1.10.0}/runtime/src/invar_runtime/contracts.py +78 -11
- invar_tools-1.10.0/scripts/embed_node_tools.py +219 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/__init__.py +8 -0
- invar_tools-1.10.0/src/invar/core/language.py +88 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/models.py +106 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/patterns/detector.py +6 -1
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/patterns/p0_exhaustive.py +15 -3
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/patterns/p0_literal.py +15 -3
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/patterns/p0_newtype.py +15 -3
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/patterns/p0_nonempty.py +15 -3
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/patterns/p0_validation.py +15 -3
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/patterns/registry.py +5 -1
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/patterns/types.py +5 -1
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/property_gen.py +4 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/rules.py +84 -18
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/sync_helpers.py +27 -1
- invar_tools-1.10.0/src/invar/core/ts_parsers.py +286 -0
- invar_tools-1.10.0/src/invar/core/ts_sig_parser.py +307 -0
- invar_tools-1.10.0/src/invar/node_tools/MANIFEST +7 -0
- invar_tools-1.10.0/src/invar/node_tools/__init__.py +51 -0
- invar_tools-1.10.0/src/invar/node_tools/fc-runner/cli.js +77 -0
- invar_tools-1.10.0/src/invar/node_tools/quick-check/cli.js +28 -0
- invar_tools-1.10.0/src/invar/node_tools/ts-analyzer/cli.js +480 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/claude_hooks.py +35 -12
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/commands/guard.py +36 -1
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/commands/init.py +82 -3
- invar_tools-1.10.0/src/invar/shell/commands/perception.py +251 -0
- invar_tools-1.10.0/src/invar/shell/commands/skill.py +187 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/commands/template_sync.py +65 -13
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/commands/uninstall.py +60 -12
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/commands/update.py +6 -14
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/contract_coverage.py +1 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/fs.py +66 -13
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/pi_hooks.py +6 -0
- invar_tools-1.10.0/src/invar/shell/prove/guard_ts.py +899 -0
- invar_tools-1.10.0/src/invar/shell/skill_manager.py +353 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/template_engine.py +28 -4
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/templates.py +4 -4
- invar_tools-1.10.0/src/invar/templates/claude-md/python/critical-rules.md +33 -0
- invar_tools-1.10.0/src/invar/templates/claude-md/python/quick-reference.md +24 -0
- invar_tools-1.10.0/src/invar/templates/claude-md/typescript/critical-rules.md +40 -0
- invar_tools-1.10.0/src/invar/templates/claude-md/typescript/quick-reference.md +24 -0
- invar_tools-1.10.0/src/invar/templates/claude-md/universal/check-in.md +25 -0
- invar_tools-1.10.0/src/invar/templates/claude-md/universal/skills.md +73 -0
- invar_tools-1.10.0/src/invar/templates/claude-md/universal/workflow.md +55 -0
- invar_tools-1.8.0/src/invar/templates/commands/audit.md → invar_tools-1.10.0/src/invar/templates/commands/audit.md.jinja +18 -1
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/config/AGENT.md.jinja +58 -0
- invar_tools-1.10.0/src/invar/templates/config/CLAUDE.md.jinja +51 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/config/context.md.jinja +19 -0
- {invar_tools-1.8.0/.invar/examples → invar_tools-1.10.0/src/invar/templates/examples/python}/README.md +4 -0
- invar_tools-1.10.0/src/invar/templates/examples/python/conftest.py +3 -0
- {invar_tools-1.8.0/.invar/examples → invar_tools-1.10.0/src/invar/templates/examples/python}/contracts.py +81 -4
- invar_tools-1.10.0/src/invar/templates/examples/python/core_shell.py +227 -0
- invar_tools-1.10.0/src/invar/templates/examples/python/functional.py +613 -0
- invar_tools-1.10.0/src/invar/templates/examples/python/workflow.md +81 -0
- invar_tools-1.10.0/src/invar/templates/examples/typescript/README.md +31 -0
- invar_tools-1.10.0/src/invar/templates/examples/typescript/contracts.ts +163 -0
- invar_tools-1.10.0/src/invar/templates/examples/typescript/core_shell.ts +374 -0
- invar_tools-1.10.0/src/invar/templates/examples/typescript/functional.ts +601 -0
- invar_tools-1.10.0/src/invar/templates/examples/typescript/workflow.md +95 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/hooks/PostToolUse.sh.jinja +10 -1
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/hooks/PreToolUse.sh.jinja +38 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/hooks/Stop.sh.jinja +1 -1
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/hooks/UserPromptSubmit.sh.jinja +7 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/hooks/pi/invar.ts.jinja +9 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/manifest.toml +7 -6
- invar_tools-1.10.0/src/invar/templates/onboard/assessment.md.jinja +214 -0
- invar_tools-1.10.0/src/invar/templates/onboard/patterns/python.md +347 -0
- invar_tools-1.10.0/src/invar/templates/onboard/patterns/typescript.md +452 -0
- invar_tools-1.10.0/src/invar/templates/onboard/roadmap.md.jinja +168 -0
- invar_tools-1.10.0/src/invar/templates/protocol/INVAR.md.jinja +51 -0
- invar_tools-1.10.0/src/invar/templates/protocol/python/architecture-examples.md +41 -0
- invar_tools-1.10.0/src/invar/templates/protocol/python/contracts-syntax.md +56 -0
- invar_tools-1.10.0/src/invar/templates/protocol/python/markers.md +44 -0
- invar_tools-1.10.0/src/invar/templates/protocol/python/tools.md +24 -0
- invar_tools-1.10.0/src/invar/templates/protocol/python/troubleshooting.md +38 -0
- invar_tools-1.10.0/src/invar/templates/protocol/typescript/architecture-examples.md +52 -0
- invar_tools-1.10.0/src/invar/templates/protocol/typescript/contracts-syntax.md +73 -0
- invar_tools-1.10.0/src/invar/templates/protocol/typescript/markers.md +48 -0
- invar_tools-1.10.0/src/invar/templates/protocol/typescript/tools.md +65 -0
- invar_tools-1.10.0/src/invar/templates/protocol/typescript/troubleshooting.md +104 -0
- invar_tools-1.10.0/src/invar/templates/protocol/universal/architecture.md +36 -0
- invar_tools-1.10.0/src/invar/templates/protocol/universal/completion.md +14 -0
- invar_tools-1.10.0/src/invar/templates/protocol/universal/contracts-concept.md +37 -0
- invar_tools-1.10.0/src/invar/templates/protocol/universal/header.md +17 -0
- invar_tools-1.10.0/src/invar/templates/protocol/universal/session.md +17 -0
- invar_tools-1.10.0/src/invar/templates/protocol/universal/six-laws.md +10 -0
- invar_tools-1.10.0/src/invar/templates/protocol/universal/usbv.md +14 -0
- invar_tools-1.10.0/src/invar/templates/protocol/universal/visible-workflow.md +25 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/skills/develop/SKILL.md.jinja +39 -3
- invar_tools-1.10.0/src/invar/templates/skills/extensions/_registry.yaml +93 -0
- invar_tools-1.10.0/src/invar/templates/skills/extensions/acceptance/SKILL.md +383 -0
- invar_tools-1.10.0/src/invar/templates/skills/extensions/invar-onboard/SKILL.md +448 -0
- invar_tools-1.10.0/src/invar/templates/skills/extensions/invar-onboard/patterns/python.md +347 -0
- invar_tools-1.10.0/src/invar/templates/skills/extensions/invar-onboard/patterns/typescript.md +452 -0
- invar_tools-1.10.0/src/invar/templates/skills/extensions/invar-onboard/templates/assessment.md.jinja +214 -0
- invar_tools-1.10.0/src/invar/templates/skills/extensions/invar-onboard/templates/roadmap.md.jinja +168 -0
- invar_tools-1.10.0/src/invar/templates/skills/extensions/security/SKILL.md +382 -0
- invar_tools-1.10.0/src/invar/templates/skills/extensions/security/patterns/_common.yaml +126 -0
- invar_tools-1.10.0/src/invar/templates/skills/extensions/security/patterns/python.yaml +155 -0
- invar_tools-1.10.0/src/invar/templates/skills/extensions/security/patterns/typescript.yaml +194 -0
- invar_tools-1.10.0/src/invar/templates/skills/review/SKILL.md.jinja +613 -0
- invar_tools-1.10.0/tests/integration/test_lx05_detection.py +131 -0
- invar_tools-1.10.0/tests/integration/test_lx05_integration.py +496 -0
- invar_tools-1.10.0/tests/integration/test_lx05_templates.py +228 -0
- invar_tools-1.10.0/tests/integration/test_lx06_typescript.py +409 -0
- invar_tools-1.10.0/tests/integration/test_lx07_skills.py +490 -0
- invar_tools-1.10.0/typescript/.gitignore +27 -0
- invar_tools-1.10.0/typescript/README.md +105 -0
- invar_tools-1.10.0/typescript/package.json +34 -0
- invar_tools-1.10.0/typescript/packages/eslint-plugin/package.json +38 -0
- invar_tools-1.10.0/typescript/packages/eslint-plugin/src/index.ts +61 -0
- invar_tools-1.10.0/typescript/packages/eslint-plugin/src/rules/no-any-in-schema.ts +47 -0
- invar_tools-1.10.0/typescript/packages/eslint-plugin/src/rules/no-io-in-core.ts +108 -0
- invar_tools-1.10.0/typescript/packages/eslint-plugin/src/rules/require-jsdoc-example.ts +75 -0
- invar_tools-1.10.0/typescript/packages/eslint-plugin/src/rules/require-schema-validation.ts +202 -0
- invar_tools-1.10.0/typescript/packages/eslint-plugin/src/rules/shell-result-type.ts +166 -0
- invar_tools-1.10.0/typescript/packages/eslint-plugin/tsconfig.json +8 -0
- invar_tools-1.10.0/typescript/packages/fc-runner/package.json +42 -0
- invar_tools-1.10.0/typescript/packages/fc-runner/src/cli.ts +150 -0
- invar_tools-1.10.0/typescript/packages/fc-runner/src/index.ts +328 -0
- invar_tools-1.10.0/typescript/packages/fc-runner/tsconfig.json +8 -0
- invar_tools-1.10.0/typescript/packages/quick-check/package.json +47 -0
- invar_tools-1.10.0/typescript/packages/quick-check/src/cli.ts +123 -0
- invar_tools-1.10.0/typescript/packages/quick-check/src/index.ts +279 -0
- invar_tools-1.10.0/typescript/packages/quick-check/tsconfig.json +8 -0
- invar_tools-1.10.0/typescript/packages/ts-analyzer/package.json +42 -0
- invar_tools-1.10.0/typescript/packages/ts-analyzer/src/cli.ts +131 -0
- invar_tools-1.10.0/typescript/packages/ts-analyzer/src/index.ts +622 -0
- invar_tools-1.10.0/typescript/packages/ts-analyzer/tsconfig.json +8 -0
- invar_tools-1.10.0/typescript/pnpm-workspace.yaml +2 -0
- invar_tools-1.10.0/typescript/scripts/bundle.mjs +65 -0
- invar_tools-1.10.0/typescript/tsconfig.base.json +24 -0
- invar_tools-1.10.0/typescript/vitest.config.ts +13 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/uv.lock +126 -1
- invar_tools-1.8.0/.claude/hooks/PostToolUse.sh +0 -3
- invar_tools-1.8.0/.claude/hooks/PreToolUse.sh +0 -3
- invar_tools-1.8.0/.claude/hooks/Stop.sh +0 -3
- invar_tools-1.8.0/.claude/hooks/UserPromptSubmit.sh +0 -3
- invar_tools-1.8.0/.claude/skills/review/SKILL.md +0 -352
- invar_tools-1.8.0/.invar/examples/conftest.py +0 -3
- invar_tools-1.8.0/.invar/examples/core_shell.py +0 -127
- invar_tools-1.8.0/.invar/examples/workflow.md +0 -258
- invar_tools-1.8.0/src/invar/shell/commands/perception.py +0 -127
- invar_tools-1.8.0/src/invar/templates/config/CLAUDE.md.jinja +0 -244
- invar_tools-1.8.0/src/invar/templates/examples/core_shell.py +0 -127
- invar_tools-1.8.0/src/invar/templates/protocol/INVAR.md +0 -310
- invar_tools-1.8.0/src/invar/templates/skills/review/SKILL.md.jinja +0 -353
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.aider.conf.yml +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.claude/commands/audit.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.claude/commands/guard.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.claude/hooks/invar.PostToolUse.sh +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.claude/hooks/invar.PreToolUse.sh +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.claude/hooks/invar.Stop.sh +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.claude/hooks/invar.UserPromptSubmit.sh +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.claude/skills/investigate/SKILL.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.claude/skills/propose/SKILL.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.cursorrules +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.github/workflows/ci.yml +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.github/workflows/publish.yml +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.invar/archive/sessions-2025-12.md +0 -0
- {invar_tools-1.8.0/src/invar/templates → invar_tools-1.10.0/.invar}/examples/workflow.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.invar/mcp-setup.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.invar/project-additions.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.invar/proposals/TEMPLATE.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.mcp.json +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.pre-commit-config.yaml +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.serena/.gitignore +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/.serena/project.yml +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/LICENSE +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/LICENSE-GPL +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/NOTICE +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/.nojekyll +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/agents.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/diagrams.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/guide.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/guides/aider.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/guides/cline.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/guides/continue.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/guides/cursor.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/guides/multi-agent.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/guides/pi.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/history/decisions-2024.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/history/feedback/compliance-analysis.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/history/feedback/feedback-memo.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/history/feedback/index.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/history/index.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/history/original-vision.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/history/protocol-evolution.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/history/research/cruxeval-quick-validation.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/logo.svg +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/DX-23-entry-point-detection.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/DX-25-functional-patterns.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/DX-29-pure-content-detection.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/DX-38-contract-quality-rules.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/DX-60-structured-rules-ssot.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/DX-61-functional-pattern-guidance.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/DX-61-implementation-design.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/DX-68-agent-behavior-optimization.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/LX-01-multi-language-feasibility.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/2024-12-21-guard-enhancements.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/2024-12-21-language-inspired-enhancements.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/2024-12-21-test-first-enhancement.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/2025-12-21-dx-improvements.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/2025-12-23-dx-20-property-testing-enhancements.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/2025-12-23-dx-21-package-and-init.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/AGENT-IMPROVEMENTS.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-11-documentation-restructure.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-12-hypothesis-fallback.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-13-incremental-prove.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-14-expanded-prove-usage.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-16-agent-tool-enforcement.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-17-workflow-enforcement.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-22-verification-strategy.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-24-mechanism-documentation.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-26-guard-simplification.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-27-system-prompt-protocol.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-28-semantic-verification.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-30-visible-workflow.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-31-adversarial-reviewer.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-32-workflow-iteration.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-33-verification-blind-spots.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-34-review-cycle.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-35-workflow-phase-separation.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-36-documentation-restructuring.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-37-coverage-integration.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-40-smart-tool-redirect-hook.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-43-cross-platform-distribution.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-45-template-consistency.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-46-documentation-audit.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-47-command-skill-naming.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-48-code-structure-reorganization.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-49-protocol-distribution-unification.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-53-review-loop-effectiveness.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-54-agent-native-context-management.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-55-claude-init-conflict-resolution.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-56-template-sync-unification.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-57-claude-code-hooks.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-58-document-structure-optimization.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/DX-63-contracts-first-enforcement.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-64-version-display-unification.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-65-single-file-guard.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-66-escape-hatch-visibility.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-69-project-uninstall.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-70-init-simplification.md +0 -0
- {invar_tools-1.8.0/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/LX-02-agent-portability-analysis.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/proposals/completed/LX-03-multi-agent-support.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/agent-information-hierarchy.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/architecture/index.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/contracts/advanced.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/contracts/completeness.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/contracts/doctests.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/contracts/index.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/contracts/pre-post.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/documentation.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/index.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/proposal-workflow.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/rules/index.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/rules/severity.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/verification/crosshair-vs-hypothesis.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/verification/index.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/verification/smart-routing.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/workflow/index.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/workflow/session-start.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/reference/workflow/usbv.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/terminal-gif-guide.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/test-reports/DX-55-test-report.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/test-reports/DX-56-test-report.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/test-reports/DX-58-test-scenario.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/testing/v1.5.0-stress-test.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/testing/v1.5.0-test-report.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/testing/v1.5.0-workflow-compliance.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/docs/vision.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/runtime/LICENSE +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/runtime/README.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/runtime/pyproject.toml +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/runtime/src/invar_runtime/decorators.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/runtime/src/invar_runtime/invariant.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/runtime/src/invar_runtime/relations.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/runtime/src/invar_runtime/resource.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/scripts/smart-guard.sh +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/core/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/contracts.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/entry_points.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/extraction.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/format_specs.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/format_strategies.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/formatter.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/hypothesis_strategies.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/inspect.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/lambda_helpers.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/must_use.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/parser.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/patterns/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/postcondition_scope.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/purity.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/purity_heuristics.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/references.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/review_trigger.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/rule_meta.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/shell_analysis.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/shell_architecture.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/strategies.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/suggestions.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/tautology.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/template_helpers.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/template_parser.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/timeout_inference.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/trivial_detection.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/utils.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/core/verification_routing.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/mcp/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/mcp/__main__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/mcp/server.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/py.typed +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/commands/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/commands/hooks.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/commands/merge.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/commands/mutate.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/commands/sync_self.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/commands/test.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/config.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/coverage.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/git.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/guard_helpers.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/guard_output.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/mcp_config.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/mutation.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/pattern_integration.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/property_tests.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/prove/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/prove/accept.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/prove/cache.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/prove/crosshair.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/prove/hypothesis.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/subprocess_env.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/shell/testing.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/CLAUDE.md.template +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/commands/guard.md +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/config/pre-commit.yaml.jinja +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/context.md.template +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/hooks/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/proposal.md.template +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/skills/investigate/SKILL.md.jinja +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/invar/templates/skills/propose/SKILL.md.jinja +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/src/shell/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/tests/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/tests/conftest.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/tests/integration/__init__.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/tests/integration/test_cli_flags.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/tests/integration/test_dx55_regression.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/tests/integration/test_dx56_sync.py +0 -0
- {invar_tools-1.8.0 → invar_tools-1.10.0}/tests/test_subprocess_env.py +0 -0
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Invar hook wrapper (DX-57)
|
|
3
|
+
# Ensure correct working directory regardless of where Claude Code invokes from
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
5
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
6
|
+
if ! cd "$PROJECT_ROOT" 2>/dev/null; then
|
|
7
|
+
echo "[invar] Warning: Could not cd to $PROJECT_ROOT" >&2
|
|
8
|
+
exit 0 # Don't block Claude Code
|
|
9
|
+
fi
|
|
10
|
+
source "$SCRIPT_DIR/invar.PostToolUse.sh" "$@"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Invar hook wrapper (DX-57)
|
|
3
|
+
# Ensure correct working directory regardless of where Claude Code invokes from
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
5
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
6
|
+
if ! cd "$PROJECT_ROOT" 2>/dev/null; then
|
|
7
|
+
echo "[invar] Warning: Could not cd to $PROJECT_ROOT" >&2
|
|
8
|
+
exit 0 # Don't block Claude Code
|
|
9
|
+
fi
|
|
10
|
+
source "$SCRIPT_DIR/invar.PreToolUse.sh" "$@"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Invar hook wrapper (DX-57)
|
|
3
|
+
# Ensure correct working directory regardless of where Claude Code invokes from
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
5
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
6
|
+
if ! cd "$PROJECT_ROOT" 2>/dev/null; then
|
|
7
|
+
echo "[invar] Warning: Could not cd to $PROJECT_ROOT" >&2
|
|
8
|
+
exit 0 # Don't block Claude Code
|
|
9
|
+
fi
|
|
10
|
+
source "$SCRIPT_DIR/invar.Stop.sh" "$@"
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Invar hook wrapper (DX-57)
|
|
3
|
+
# Ensure correct working directory regardless of where Claude Code invokes from
|
|
4
|
+
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
5
|
+
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
6
|
+
if ! cd "$PROJECT_ROOT" 2>/dev/null; then
|
|
7
|
+
echo "[invar] Warning: Could not cd to $PROJECT_ROOT" >&2
|
|
8
|
+
exit 0 # Don't block Claude Code
|
|
9
|
+
fi
|
|
10
|
+
source "$SCRIPT_DIR/invar.UserPromptSubmit.sh" "$@"
|
|
@@ -0,0 +1,383 @@
|
|
|
1
|
+
<!--invar:skill-->
|
|
2
|
+
# /acceptance — Requirements Acceptance Review
|
|
3
|
+
|
|
4
|
+
> Extension Skill | Tier: T0 | Isolation: Default
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
Verify implementation satisfies requirements with adversarial rigor. This skill performs PRD alignment review, checking that all requirements are implemented and edge cases are handled.
|
|
9
|
+
|
|
10
|
+
## Triggers
|
|
11
|
+
|
|
12
|
+
Use this skill when user says: "acceptance", "check requirements", "PRD alignment", "acceptance review", "verify requirements"
|
|
13
|
+
|
|
14
|
+
## Relationship to Core Skills
|
|
15
|
+
|
|
16
|
+
- `/review` = Code quality (bugs, contracts, security)
|
|
17
|
+
- `/acceptance` = Feature completeness (requirements coverage)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## Core Principles
|
|
22
|
+
|
|
23
|
+
| Principle | Description |
|
|
24
|
+
|-----------|-------------|
|
|
25
|
+
| **Skeptical by default** | Assume feature is NOT implemented until proven otherwise |
|
|
26
|
+
| **Evidence required** | "Implemented" requires file:line proof, not intuition |
|
|
27
|
+
| **Deep challenge** | Every requirement gets adversarial scenarios, no shortcuts |
|
|
28
|
+
| **Graceful degradation** | Works without Invar contracts (falls back to code analysis) |
|
|
29
|
+
| **Polluter pays** | External verification must restore state, or use dry-run |
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Depth Levels
|
|
34
|
+
|
|
35
|
+
| Level | Scope | Use Case |
|
|
36
|
+
|-------|-------|----------|
|
|
37
|
+
| `--quick` | P0 (Must-have) only, skip NFR/UI | Fast feedback, CI gates |
|
|
38
|
+
| `--standard` | P0 + P1, sample challenges | Normal development |
|
|
39
|
+
| `--deep` (default) | ALL requirements, full challenge, external verify | Release readiness |
|
|
40
|
+
|
|
41
|
+
**Default is `--deep`** — thorough verification is the norm.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Workflow
|
|
46
|
+
|
|
47
|
+
### Step 0: Isolation Check
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
Parse depth: --quick / --standard / --deep (default)
|
|
51
|
+
|
|
52
|
+
If --deep (default):
|
|
53
|
+
┌─────────────────────────────────────────────────────────┐
|
|
54
|
+
│ SPAWN ISOLATED AGENT │
|
|
55
|
+
│ │
|
|
56
|
+
│ Collect inputs: │
|
|
57
|
+
│ • PRD path (smart search or user-provided) │
|
|
58
|
+
│ • Design paths (if found) │
|
|
59
|
+
│ • Code scope (files/directories to review) │
|
|
60
|
+
│ │
|
|
61
|
+
│ Spawn Task agent with: │
|
|
62
|
+
│ • QA Acceptance Reviewer persona (see below) │
|
|
63
|
+
│ • NO conversation history │
|
|
64
|
+
│ • Only the collected inputs │
|
|
65
|
+
│ │
|
|
66
|
+
│ → Isolated agent executes steps 1-5 below │
|
|
67
|
+
│ → Returns structured report │
|
|
68
|
+
└─────────────────────────────────────────────────────────┘
|
|
69
|
+
|
|
70
|
+
If --quick or --standard:
|
|
71
|
+
└─ Continue in same context with persona switch
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Step 1: Entry
|
|
75
|
+
|
|
76
|
+
- Detect Invar (Enhanced/Standalone mode)
|
|
77
|
+
- Locate PRD: smart search or user-provided path
|
|
78
|
+
- Locate Design: design/, mockups/, figma/ (if exists)
|
|
79
|
+
|
|
80
|
+
**Invar Detection:**
|
|
81
|
+
- File-based: `INVAR.md` exists OR `.invar/` directory exists
|
|
82
|
+
- Context-based: `invar_guard` tool available in session
|
|
83
|
+
- Enhanced Mode → Use invar_guard, invar_sig, invar_map
|
|
84
|
+
- Standalone Mode → Use Read, Grep, Glob, Bash only
|
|
85
|
+
|
|
86
|
+
### Step 2: Parse — Extract Requirements
|
|
87
|
+
|
|
88
|
+
Read PRD and extract:
|
|
89
|
+
- **FR (Functional):** What system must DO
|
|
90
|
+
- **NFR (Non-Functional):** Performance, security, UX
|
|
91
|
+
- **EC (Edge Case):** Explicitly mentioned scenarios
|
|
92
|
+
- **UI (UI/UX):** Visual/interaction requirements (if any)
|
|
93
|
+
|
|
94
|
+
**Output format:**
|
|
95
|
+
```markdown
|
|
96
|
+
| ID | Type | Requirement | Priority |
|
|
97
|
+
|-------|------|--------------------------|----------|
|
|
98
|
+
| FR-1 | FR | User can login with email| Must |
|
|
99
|
+
| NFR-1 | NFR | Response time < 200ms | Should |
|
|
100
|
+
| UI-1 | UI | Login button is blue #007| Could |
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
### Step 3: Map — Link to Implementation (Skeptical)
|
|
104
|
+
|
|
105
|
+
**DEFAULT STATUS: ❌ Missing** (upgrade only with evidence)
|
|
106
|
+
|
|
107
|
+
**Evidence Sources (priority order):**
|
|
108
|
+
1. Invar contracts (@pre/@post matching requirement)
|
|
109
|
+
2. Type signatures + docstrings
|
|
110
|
+
3. Test cases covering the requirement
|
|
111
|
+
4. Code implementation (read and verify)
|
|
112
|
+
|
|
113
|
+
**Enhanced Mode:**
|
|
114
|
+
- `invar_sig` to find functions + contracts
|
|
115
|
+
- Cross-reference contracts with requirements
|
|
116
|
+
|
|
117
|
+
**Standalone Mode (no contracts):**
|
|
118
|
+
- Grep for requirement keywords
|
|
119
|
+
- Read docstrings, type hints, comments
|
|
120
|
+
- Trace code flow to verify implementation
|
|
121
|
+
|
|
122
|
+
**Output format:**
|
|
123
|
+
```markdown
|
|
124
|
+
| ID | Requirement | Evidence | Status |
|
|
125
|
+
|------|--------------|--------------------| ------------|
|
|
126
|
+
| FR-1 | User login | auth.py:45 @post | ✅ Complete |
|
|
127
|
+
| FR-2 | Password reset| - | ❌ Missing |
|
|
128
|
+
| FR-3 | Email verify | email.py:30 (partial)| ⚠️ Partial|
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Step 4: Challenge — Deep Adversarial Scenarios
|
|
132
|
+
|
|
133
|
+
For **EVERY** requirement (no shortcuts):
|
|
134
|
+
|
|
135
|
+
**Functional (FR):**
|
|
136
|
+
- "What if input is empty/null/malformed?"
|
|
137
|
+
- "What if user lacks permission?"
|
|
138
|
+
- "What if dependent service fails?"
|
|
139
|
+
- "What if called twice/concurrently?"
|
|
140
|
+
|
|
141
|
+
**Non-Functional (NFR):**
|
|
142
|
+
- "Is there evidence this is measured?"
|
|
143
|
+
- "What's the worst-case scenario?"
|
|
144
|
+
- "How does it degrade under load?"
|
|
145
|
+
|
|
146
|
+
**Edge Cases (EC):**
|
|
147
|
+
- "Is boundary explicitly handled?"
|
|
148
|
+
- "What's the error message?"
|
|
149
|
+
- "Is it tested?"
|
|
150
|
+
|
|
151
|
+
**UI/UX (UI):**
|
|
152
|
+
- "Does implementation match design spec?"
|
|
153
|
+
- "Are design tokens correct (colors, spacing)?"
|
|
154
|
+
- "Is interaction behavior as specified?"
|
|
155
|
+
|
|
156
|
+
**Output format:**
|
|
157
|
+
```markdown
|
|
158
|
+
| Scenario | Expected | Actual | Gap? |
|
|
159
|
+
|-----------------------|--------------|---------|------|
|
|
160
|
+
| Wrong password 5x | Lock account | No lock | ❌ |
|
|
161
|
+
| Empty email | Error msg | Crash | ❌ |
|
|
162
|
+
| Concurrent login | Queue/reject | Race bug| ❌ |
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Step 5: Verify — External Tool Validation
|
|
166
|
+
|
|
167
|
+
**POLLUTER PAYS PRINCIPLE:**
|
|
168
|
+
```
|
|
169
|
+
Before running external verification:
|
|
170
|
+
1. Can state be restored? (snapshot, rollback, reset)
|
|
171
|
+
→ YES: Run freely, restore after
|
|
172
|
+
→ NO: Must use dry-run / read-only mode
|
|
173
|
+
|
|
174
|
+
Examples:
|
|
175
|
+
• DB: Use transaction + rollback, or test DB
|
|
176
|
+
• Files: Backup → run → restore
|
|
177
|
+
• API: Use sandbox/test endpoint
|
|
178
|
+
• Destructive: MUST dry-run (--dry-run, --whatif)
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Web Projects:**
|
|
182
|
+
- Playwright/Puppeteer for E2E flows
|
|
183
|
+
- curl/httpie for API endpoints
|
|
184
|
+
- Lighthouse for performance NFRs
|
|
185
|
+
|
|
186
|
+
**CLI Projects:**
|
|
187
|
+
- Actually invoke commands with test inputs
|
|
188
|
+
- Verify exit codes and output format
|
|
189
|
+
|
|
190
|
+
**Library Projects:**
|
|
191
|
+
- Run existing test suite
|
|
192
|
+
- Execute doctest examples
|
|
193
|
+
|
|
194
|
+
**NFR Benchmarks:**
|
|
195
|
+
```bash
|
|
196
|
+
# Response Time
|
|
197
|
+
time curl -s http://localhost:8000/api/endpoint
|
|
198
|
+
hyperfine 'curl -s http://localhost:8000/api/endpoint'
|
|
199
|
+
|
|
200
|
+
# Load Testing
|
|
201
|
+
wrk -t4 -c100 -d30s http://localhost:8000/api/endpoint
|
|
202
|
+
|
|
203
|
+
# Memory
|
|
204
|
+
/usr/bin/time -v python script.py
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
**UI/UX Deep Verification (4 levels):**
|
|
208
|
+
1. **Level 1: Design Tokens** — Colors, Typography, Spacing
|
|
209
|
+
2. **Level 2: Layout** — Flexbox/Grid alignment, Responsive breakpoints
|
|
210
|
+
3. **Level 3: Interaction** — Hover/focus states, Animation, Keyboard nav
|
|
211
|
+
4. **Level 4: Visual Regression** — Screenshot comparison (if baseline exists)
|
|
212
|
+
|
|
213
|
+
### Step 6: Report — Coverage Matrix + Integration
|
|
214
|
+
|
|
215
|
+
```markdown
|
|
216
|
+
## Validation Report
|
|
217
|
+
|
|
218
|
+
**PRD:** docs/requirements.md
|
|
219
|
+
**Design:** design/mockups/ (if found)
|
|
220
|
+
**Mode:** Enhanced (Invar detected) / Standalone
|
|
221
|
+
|
|
222
|
+
### Coverage Summary
|
|
223
|
+
| Status | Count | Percent |
|
|
224
|
+
|-------------|-------|---------|
|
|
225
|
+
| ✅ Complete | 7 | 58% |
|
|
226
|
+
| ⚠️ Partial | 3 | 25% |
|
|
227
|
+
| ❌ Missing | 2 | 17% |
|
|
228
|
+
|
|
229
|
+
### Critical Gaps
|
|
230
|
+
1. FR-2: Password reset — Not implemented
|
|
231
|
+
2. NFR-1: Response time — Not measured
|
|
232
|
+
|
|
233
|
+
### Adversarial Findings
|
|
234
|
+
| Finding | Severity | Location |
|
|
235
|
+
|----------------------------|----------|---------------|
|
|
236
|
+
| Account lockout missing | High | auth.py |
|
|
237
|
+
| Input validation incomplete| Medium | forms.py:23 |
|
|
238
|
+
|
|
239
|
+
### UI/UX Discrepancies (if applicable)
|
|
240
|
+
| Element | Design | Actual | Action |
|
|
241
|
+
|--------------|-----------|-----------|--------------|
|
|
242
|
+
| Login button | #0070f3 | #007bff | Update color |
|
|
243
|
+
|
|
244
|
+
### NFR Verification Results
|
|
245
|
+
| Requirement | Target | Measured | Status |
|
|
246
|
+
|-------------------|----------|----------|-----------|
|
|
247
|
+
| Response time | < 200ms | 145ms | ✅ Pass |
|
|
248
|
+
| Memory usage | < 100MB | 89MB | ✅ Pass |
|
|
249
|
+
|
|
250
|
+
### Suggested /develop Tasks
|
|
251
|
+
|
|
252
|
+
**High Priority (Must-have gaps):**
|
|
253
|
+
1. FR-2: Password reset
|
|
254
|
+
- Scope: auth/ module
|
|
255
|
+
- Estimate: ~80 LOC, 2 new functions
|
|
256
|
+
|
|
257
|
+
2. Account lockout (adversarial finding)
|
|
258
|
+
- Scope: auth/session.py
|
|
259
|
+
- Estimate: ~30 LOC
|
|
260
|
+
|
|
261
|
+
### Next Actions
|
|
262
|
+
1. [ ] Implement FR-2 (use /develop)
|
|
263
|
+
2. [ ] Add account lockout (use /develop)
|
|
264
|
+
3. [ ] Run load test for NFR verification
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
---
|
|
268
|
+
|
|
269
|
+
## PRD Smart Search
|
|
270
|
+
|
|
271
|
+
When user says "PRD" without path:
|
|
272
|
+
|
|
273
|
+
```
|
|
274
|
+
Search order:
|
|
275
|
+
1. docs/prd.md, docs/PRD.md, docs/requirements.md
|
|
276
|
+
2. *.prd.md, *requirements*.md, *spec*.md
|
|
277
|
+
3. README.md (Requirements section)
|
|
278
|
+
4. .invar/prd.md
|
|
279
|
+
|
|
280
|
+
If multiple → ask user to select
|
|
281
|
+
If none → ask user for path
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
## Design File Detection
|
|
287
|
+
|
|
288
|
+
```
|
|
289
|
+
Search order:
|
|
290
|
+
1. design/, mockups/, figma/
|
|
291
|
+
2. *.fig, *.sketch (metadata only)
|
|
292
|
+
3. docs/design/, docs/ui/
|
|
293
|
+
4. .invar/design/
|
|
294
|
+
|
|
295
|
+
If found → enable UI/UX verification
|
|
296
|
+
If not → skip UI checks, note in report
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## Contract Fallback Strategy
|
|
302
|
+
|
|
303
|
+
When Invar contracts are not available:
|
|
304
|
+
|
|
305
|
+
| Fallback Level | Evidence Source | Confidence |
|
|
306
|
+
|----------------|-----------------|------------|
|
|
307
|
+
| 1. Type hints | `def login(email: str) -> User` | Medium |
|
|
308
|
+
| 2. Docstrings | `"""Returns user if valid credentials."""` | Medium |
|
|
309
|
+
| 3. Test cases | `test_login_success()` exists | High |
|
|
310
|
+
| 4. Code trace | Read implementation, verify logic | Low |
|
|
311
|
+
|
|
312
|
+
**Important:** Without contracts, increase skepticism. Code that "looks implemented" may have subtle bugs.
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## QA Acceptance Reviewer Persona
|
|
317
|
+
|
|
318
|
+
Used in `--deep` mode (isolated agent):
|
|
319
|
+
|
|
320
|
+
```
|
|
321
|
+
You are an independent QA Acceptance Reviewer.
|
|
322
|
+
|
|
323
|
+
CRITICAL RULES:
|
|
324
|
+
1. You have NEVER seen this code before
|
|
325
|
+
2. You do NOT know what the developer intended
|
|
326
|
+
3. Assume NOTHING works until you verify evidence
|
|
327
|
+
4. Your job is to FIND GAPS, not confirm success
|
|
328
|
+
5. Be adversarial — challenge every claim
|
|
329
|
+
|
|
330
|
+
INPUT YOU WILL RECEIVE:
|
|
331
|
+
- PRD/Requirements document
|
|
332
|
+
- Code files to review
|
|
333
|
+
- Design specs (optional)
|
|
334
|
+
|
|
335
|
+
INPUT YOU WILL NOT RECEIVE:
|
|
336
|
+
- Development conversation history
|
|
337
|
+
- Developer's explanations
|
|
338
|
+
- Prior context about design decisions
|
|
339
|
+
|
|
340
|
+
OUTPUT: Structured Validation Report (see Step 6)
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## CLI Override
|
|
346
|
+
|
|
347
|
+
Override isolation level per-invocation:
|
|
348
|
+
|
|
349
|
+
```
|
|
350
|
+
/acceptance → Uses --deep (default, spawns isolated agent)
|
|
351
|
+
/acceptance --quick → Same context, persona hint only
|
|
352
|
+
/acceptance --standard → Same context, persona switch
|
|
353
|
+
/acceptance --deep → Spawns isolated agent (explicit)
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
**No external configuration required.** Defaults are in this SKILL.md.
|
|
357
|
+
|
|
358
|
+
---
|
|
359
|
+
|
|
360
|
+
## Installation
|
|
361
|
+
|
|
362
|
+
```bash
|
|
363
|
+
# Via CLI
|
|
364
|
+
invar skill add acceptance
|
|
365
|
+
|
|
366
|
+
# Manual copy
|
|
367
|
+
cp -r /path/to/extensions/acceptance .claude/skills/
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
*Extension Skill v1.0 — LX-07*
|
|
373
|
+
<!--/invar:skill--><!--invar:extensions-->
|
|
374
|
+
<!-- ========================================================================
|
|
375
|
+
EXTENSIONS REGION - USER EDITABLE
|
|
376
|
+
Add project-specific extensions here. This section is preserved on update.
|
|
377
|
+
|
|
378
|
+
Examples of what to add:
|
|
379
|
+
- Custom acceptance criteria templates
|
|
380
|
+
- Project-specific requirement categories
|
|
381
|
+
- Domain-specific validation rules
|
|
382
|
+
======================================================================== -->
|
|
383
|
+
<!--/invar:extensions-->
|
|
@@ -92,10 +92,11 @@ If task appears simple (4+ signals: single file, clear target, additive change,
|
|
|
92
92
|
|
|
93
93
|
### 2. SPECIFY
|
|
94
94
|
|
|
95
|
-
- **Contracts FIRST:** Write
|
|
96
|
-
- **
|
|
95
|
+
- **Contracts FIRST:** Write contracts before implementation
|
|
96
|
+
- **Examples:** Add examples for expected behavior
|
|
97
97
|
- **Design:** Decompose complex tasks into sub-functions
|
|
98
98
|
|
|
99
|
+
|
|
99
100
|
```python
|
|
100
101
|
# SPECIFY before BUILD:
|
|
101
102
|
@pre(lambda x: x > 0)
|
|
@@ -108,6 +109,7 @@ def calculate(x: int) -> int:
|
|
|
108
109
|
... # Implementation comes in BUILD
|
|
109
110
|
```
|
|
110
111
|
|
|
112
|
+
|
|
111
113
|
#### Function-Level Gates (DX-63)
|
|
112
114
|
|
|
113
115
|
When creating new modules, use **incremental development**:
|
|
@@ -211,6 +213,7 @@ For multiple tasks:
|
|
|
211
213
|
|
|
212
214
|
Quick reference for resolving common Guard errors:
|
|
213
215
|
|
|
216
|
+
|
|
214
217
|
| Error | Cause | Quick Fix |
|
|
215
218
|
|-------|-------|-----------|
|
|
216
219
|
| `forbidden_import: io` | I/O library in Core | Use `iter(s.splitlines())` not `io.StringIO` |
|
|
@@ -230,6 +233,7 @@ Check the "Suggested:" line in Guard output.
|
|
|
230
233
|
**Note:** Use `from deal import pre, post` for lambda-based contracts.
|
|
231
234
|
`invar_runtime.pre/post` are for Contract objects like `NonEmpty`.
|
|
232
235
|
|
|
236
|
+
|
|
233
237
|
## Timeout Handling
|
|
234
238
|
|
|
235
239
|
| Threshold | Duration | Action |
|
|
@@ -355,6 +359,7 @@ Agent:
|
|
|
355
359
|
|
|
356
360
|
@pre(lambda source, path: len(source.strip()) > 0)
|
|
357
361
|
|
|
362
|
+
|
|
358
363
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
359
364
|
📍 /develop → BUILD (3/4)
|
|
360
365
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|