invar-tools 1.7.1__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.
Files changed (407) hide show
  1. invar_tools-1.10.0/.claude/hooks/PostToolUse.sh +10 -0
  2. invar_tools-1.10.0/.claude/hooks/PreToolUse.sh +10 -0
  3. invar_tools-1.10.0/.claude/hooks/Stop.sh +10 -0
  4. invar_tools-1.10.0/.claude/hooks/UserPromptSubmit.sh +10 -0
  5. invar_tools-1.10.0/.claude/skills/acceptance/SKILL.md +383 -0
  6. {invar_tools-1.7.1 → invar_tools-1.10.0}/.claude/skills/develop/SKILL.md +66 -2
  7. invar_tools-1.10.0/.claude/skills/invar-onboard/SKILL.md +448 -0
  8. invar_tools-1.10.0/.claude/skills/invar-onboard/patterns/python.md +347 -0
  9. invar_tools-1.10.0/.claude/skills/invar-onboard/patterns/typescript.md +452 -0
  10. invar_tools-1.10.0/.claude/skills/invar-onboard/templates/assessment.md.jinja +214 -0
  11. invar_tools-1.10.0/.claude/skills/invar-onboard/templates/roadmap.md.jinja +168 -0
  12. {invar_tools-1.7.1 → invar_tools-1.10.0}/.claude/skills/investigate/SKILL.md +15 -0
  13. {invar_tools-1.7.1 → invar_tools-1.10.0}/.claude/skills/propose/SKILL.md +29 -0
  14. invar_tools-1.10.0/.claude/skills/review/SKILL.md +613 -0
  15. invar_tools-1.10.0/.claude/skills/security/SKILL.md +382 -0
  16. invar_tools-1.10.0/.claude/skills/security/patterns/_common.yaml +126 -0
  17. invar_tools-1.10.0/.claude/skills/security/patterns/python.yaml +155 -0
  18. invar_tools-1.10.0/.claude/skills/security/patterns/typescript.yaml +194 -0
  19. {invar_tools-1.7.1 → invar_tools-1.10.0}/.gitignore +6 -0
  20. {invar_tools-1.7.1 → invar_tools-1.10.0}/.invar/context.md +8 -8
  21. {invar_tools-1.7.1/src/invar/templates → invar_tools-1.10.0/.invar}/examples/README.md +2 -0
  22. {invar_tools-1.7.1/src/invar/templates → invar_tools-1.10.0/.invar}/examples/conftest.py +1 -1
  23. {invar_tools-1.7.1 → invar_tools-1.10.0}/.invar/examples/contracts.py +81 -4
  24. invar_tools-1.10.0/.invar/examples/core_shell.py +227 -0
  25. {invar_tools-1.7.1 → invar_tools-1.10.0}/.invar/examples/functional.py +165 -2
  26. {invar_tools-1.7.1 → invar_tools-1.10.0}/CLAUDE.md +26 -2
  27. {invar_tools-1.7.1 → invar_tools-1.10.0}/INVAR.md +101 -37
  28. {invar_tools-1.7.1 → invar_tools-1.10.0}/PKG-INFO +326 -19
  29. {invar_tools-1.7.1 → invar_tools-1.10.0}/README.md +325 -18
  30. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/design.md +32 -2
  31. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/guides/multi-agent.md +50 -13
  32. invar_tools-1.10.0/docs/guides/pi.md +275 -0
  33. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/index.html +93 -7
  34. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/DX-62-proactive-reference-reading.md +11 -1
  35. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/LX-04-pi-agent-support.md +163 -41
  36. invar_tools-1.10.0/docs/proposals/LX-07-extension-skills.md +1561 -0
  37. invar_tools-1.10.0/docs/proposals/LX-08-extension-skills-future.md +67 -0
  38. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-39-workflow-efficiency.md +1 -1
  39. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-41-automatic-review-orchestration.md +1 -1
  40. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-42-workflow-auto-routing.md +1 -1
  41. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-50-workflow-enforcement.md +4 -1
  42. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-51-workflow-phase-visibility.md +1 -1
  43. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-52-venv-dependency-injection.md +1 -1
  44. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-67-explicit-skill-invocation.md +1 -1
  45. invar_tools-1.10.0/docs/proposals/completed/DX-70-review-isolation.md +185 -0
  46. invar_tools-1.10.0/docs/proposals/completed/DX-71-skill-command-simplification.md +152 -0
  47. invar_tools-1.10.0/docs/proposals/completed/DX-72-mandatory-self-review-detection.md +140 -0
  48. invar_tools-1.10.0/docs/proposals/completed/LX-05-language-agnostic-protocol.md +1237 -0
  49. invar_tools-1.10.0/docs/proposals/completed/LX-06-appendix-guard-comparison.md +499 -0
  50. invar_tools-1.10.0/docs/proposals/completed/LX-06-typescript-tooling.md +920 -0
  51. invar_tools-1.10.0/docs/proposals/completed/LX-09-legacy-onboarding.md +1290 -0
  52. invar_tools-1.10.0/docs/proposals/completed/LX-10-typescript-size-limits.md +267 -0
  53. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/index.md +112 -31
  54. {invar_tools-1.7.1 → invar_tools-1.10.0}/pyproject.toml +11 -3
  55. {invar_tools-1.7.1 → invar_tools-1.10.0}/runtime/src/invar_runtime/__init__.py +1 -1
  56. {invar_tools-1.7.1 → invar_tools-1.10.0}/runtime/src/invar_runtime/contracts.py +78 -11
  57. invar_tools-1.10.0/scripts/embed_node_tools.py +219 -0
  58. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/__init__.py +8 -0
  59. invar_tools-1.10.0/src/invar/core/language.py +88 -0
  60. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/models.py +106 -0
  61. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/patterns/detector.py +6 -1
  62. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/patterns/p0_exhaustive.py +15 -3
  63. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/patterns/p0_literal.py +15 -3
  64. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/patterns/p0_newtype.py +15 -3
  65. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/patterns/p0_nonempty.py +15 -3
  66. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/patterns/p0_validation.py +15 -3
  67. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/patterns/registry.py +5 -1
  68. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/patterns/types.py +5 -1
  69. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/property_gen.py +4 -0
  70. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/rules.py +84 -18
  71. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/sync_helpers.py +27 -1
  72. invar_tools-1.10.0/src/invar/core/template_helpers.py +32 -0
  73. invar_tools-1.10.0/src/invar/core/ts_parsers.py +286 -0
  74. invar_tools-1.10.0/src/invar/core/ts_sig_parser.py +307 -0
  75. invar_tools-1.10.0/src/invar/node_tools/MANIFEST +7 -0
  76. invar_tools-1.10.0/src/invar/node_tools/__init__.py +51 -0
  77. invar_tools-1.10.0/src/invar/node_tools/fc-runner/cli.js +77 -0
  78. invar_tools-1.10.0/src/invar/node_tools/quick-check/cli.js +28 -0
  79. invar_tools-1.10.0/src/invar/node_tools/ts-analyzer/cli.js +480 -0
  80. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/claude_hooks.py +35 -12
  81. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/commands/guard.py +36 -1
  82. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/commands/init.py +133 -7
  83. invar_tools-1.10.0/src/invar/shell/commands/perception.py +251 -0
  84. invar_tools-1.10.0/src/invar/shell/commands/skill.py +187 -0
  85. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/commands/template_sync.py +65 -13
  86. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/commands/uninstall.py +77 -12
  87. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/commands/update.py +6 -14
  88. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/contract_coverage.py +1 -0
  89. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/fs.py +66 -13
  90. invar_tools-1.10.0/src/invar/shell/pi_hooks.py +213 -0
  91. invar_tools-1.10.0/src/invar/shell/prove/guard_ts.py +899 -0
  92. invar_tools-1.10.0/src/invar/shell/skill_manager.py +353 -0
  93. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/template_engine.py +28 -4
  94. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/templates.py +4 -4
  95. invar_tools-1.10.0/src/invar/templates/claude-md/python/critical-rules.md +33 -0
  96. invar_tools-1.10.0/src/invar/templates/claude-md/python/quick-reference.md +24 -0
  97. invar_tools-1.10.0/src/invar/templates/claude-md/typescript/critical-rules.md +40 -0
  98. invar_tools-1.10.0/src/invar/templates/claude-md/typescript/quick-reference.md +24 -0
  99. invar_tools-1.10.0/src/invar/templates/claude-md/universal/check-in.md +25 -0
  100. invar_tools-1.10.0/src/invar/templates/claude-md/universal/skills.md +73 -0
  101. invar_tools-1.10.0/src/invar/templates/claude-md/universal/workflow.md +55 -0
  102. invar_tools-1.7.1/src/invar/templates/commands/audit.md → invar_tools-1.10.0/src/invar/templates/commands/audit.md.jinja +18 -1
  103. invar_tools-1.10.0/src/invar/templates/config/AGENT.md.jinja +256 -0
  104. invar_tools-1.10.0/src/invar/templates/config/CLAUDE.md.jinja +51 -0
  105. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/templates/config/context.md.jinja +19 -0
  106. {invar_tools-1.7.1/.invar/examples → invar_tools-1.10.0/src/invar/templates/examples/python}/README.md +4 -0
  107. invar_tools-1.10.0/src/invar/templates/examples/python/conftest.py +3 -0
  108. {invar_tools-1.7.1/src/invar/templates/examples → invar_tools-1.10.0/src/invar/templates/examples/python}/contracts.py +81 -4
  109. invar_tools-1.10.0/src/invar/templates/examples/python/core_shell.py +227 -0
  110. invar_tools-1.10.0/src/invar/templates/examples/python/functional.py +613 -0
  111. invar_tools-1.10.0/src/invar/templates/examples/python/workflow.md +81 -0
  112. invar_tools-1.10.0/src/invar/templates/examples/typescript/README.md +31 -0
  113. invar_tools-1.10.0/src/invar/templates/examples/typescript/contracts.ts +163 -0
  114. invar_tools-1.10.0/src/invar/templates/examples/typescript/core_shell.ts +374 -0
  115. invar_tools-1.10.0/src/invar/templates/examples/typescript/functional.ts +601 -0
  116. invar_tools-1.10.0/src/invar/templates/examples/typescript/workflow.md +95 -0
  117. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/templates/hooks/PostToolUse.sh.jinja +10 -1
  118. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/templates/hooks/PreToolUse.sh.jinja +38 -0
  119. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/templates/hooks/Stop.sh.jinja +1 -1
  120. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/templates/hooks/UserPromptSubmit.sh.jinja +7 -0
  121. invar_tools-1.10.0/src/invar/templates/hooks/pi/invar.ts.jinja +82 -0
  122. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/templates/manifest.toml +8 -6
  123. invar_tools-1.10.0/src/invar/templates/onboard/assessment.md.jinja +214 -0
  124. invar_tools-1.10.0/src/invar/templates/onboard/patterns/python.md +347 -0
  125. invar_tools-1.10.0/src/invar/templates/onboard/patterns/typescript.md +452 -0
  126. invar_tools-1.10.0/src/invar/templates/onboard/roadmap.md.jinja +168 -0
  127. invar_tools-1.10.0/src/invar/templates/protocol/INVAR.md.jinja +51 -0
  128. invar_tools-1.10.0/src/invar/templates/protocol/python/architecture-examples.md +41 -0
  129. invar_tools-1.10.0/src/invar/templates/protocol/python/contracts-syntax.md +56 -0
  130. invar_tools-1.10.0/src/invar/templates/protocol/python/markers.md +44 -0
  131. invar_tools-1.10.0/src/invar/templates/protocol/python/tools.md +24 -0
  132. invar_tools-1.10.0/src/invar/templates/protocol/python/troubleshooting.md +38 -0
  133. invar_tools-1.10.0/src/invar/templates/protocol/typescript/architecture-examples.md +52 -0
  134. invar_tools-1.10.0/src/invar/templates/protocol/typescript/contracts-syntax.md +73 -0
  135. invar_tools-1.10.0/src/invar/templates/protocol/typescript/markers.md +48 -0
  136. invar_tools-1.10.0/src/invar/templates/protocol/typescript/tools.md +65 -0
  137. invar_tools-1.10.0/src/invar/templates/protocol/typescript/troubleshooting.md +104 -0
  138. invar_tools-1.10.0/src/invar/templates/protocol/universal/architecture.md +36 -0
  139. invar_tools-1.10.0/src/invar/templates/protocol/universal/completion.md +14 -0
  140. invar_tools-1.10.0/src/invar/templates/protocol/universal/contracts-concept.md +37 -0
  141. invar_tools-1.10.0/src/invar/templates/protocol/universal/header.md +17 -0
  142. invar_tools-1.10.0/src/invar/templates/protocol/universal/session.md +17 -0
  143. invar_tools-1.10.0/src/invar/templates/protocol/universal/six-laws.md +10 -0
  144. invar_tools-1.10.0/src/invar/templates/protocol/universal/usbv.md +14 -0
  145. invar_tools-1.10.0/src/invar/templates/protocol/universal/visible-workflow.md +25 -0
  146. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/templates/skills/develop/SKILL.md.jinja +98 -3
  147. invar_tools-1.10.0/src/invar/templates/skills/extensions/_registry.yaml +93 -0
  148. invar_tools-1.10.0/src/invar/templates/skills/extensions/acceptance/SKILL.md +383 -0
  149. invar_tools-1.10.0/src/invar/templates/skills/extensions/invar-onboard/SKILL.md +448 -0
  150. invar_tools-1.10.0/src/invar/templates/skills/extensions/invar-onboard/patterns/python.md +347 -0
  151. invar_tools-1.10.0/src/invar/templates/skills/extensions/invar-onboard/patterns/typescript.md +452 -0
  152. invar_tools-1.10.0/src/invar/templates/skills/extensions/invar-onboard/templates/assessment.md.jinja +214 -0
  153. invar_tools-1.10.0/src/invar/templates/skills/extensions/invar-onboard/templates/roadmap.md.jinja +168 -0
  154. invar_tools-1.10.0/src/invar/templates/skills/extensions/security/SKILL.md +382 -0
  155. invar_tools-1.10.0/src/invar/templates/skills/extensions/security/patterns/_common.yaml +126 -0
  156. invar_tools-1.10.0/src/invar/templates/skills/extensions/security/patterns/python.yaml +155 -0
  157. invar_tools-1.10.0/src/invar/templates/skills/extensions/security/patterns/typescript.yaml +194 -0
  158. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/templates/skills/investigate/SKILL.md.jinja +15 -0
  159. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/templates/skills/propose/SKILL.md.jinja +33 -0
  160. invar_tools-1.10.0/src/invar/templates/skills/review/SKILL.md.jinja +613 -0
  161. invar_tools-1.10.0/tests/integration/test_lx05_detection.py +131 -0
  162. invar_tools-1.10.0/tests/integration/test_lx05_integration.py +496 -0
  163. invar_tools-1.10.0/tests/integration/test_lx05_templates.py +228 -0
  164. invar_tools-1.10.0/tests/integration/test_lx06_typescript.py +409 -0
  165. invar_tools-1.10.0/tests/integration/test_lx07_skills.py +490 -0
  166. invar_tools-1.10.0/typescript/.gitignore +27 -0
  167. invar_tools-1.10.0/typescript/README.md +105 -0
  168. invar_tools-1.10.0/typescript/package.json +34 -0
  169. invar_tools-1.10.0/typescript/packages/eslint-plugin/package.json +38 -0
  170. invar_tools-1.10.0/typescript/packages/eslint-plugin/src/index.ts +61 -0
  171. invar_tools-1.10.0/typescript/packages/eslint-plugin/src/rules/no-any-in-schema.ts +47 -0
  172. invar_tools-1.10.0/typescript/packages/eslint-plugin/src/rules/no-io-in-core.ts +108 -0
  173. invar_tools-1.10.0/typescript/packages/eslint-plugin/src/rules/require-jsdoc-example.ts +75 -0
  174. invar_tools-1.10.0/typescript/packages/eslint-plugin/src/rules/require-schema-validation.ts +202 -0
  175. invar_tools-1.10.0/typescript/packages/eslint-plugin/src/rules/shell-result-type.ts +166 -0
  176. invar_tools-1.10.0/typescript/packages/eslint-plugin/tsconfig.json +8 -0
  177. invar_tools-1.10.0/typescript/packages/fc-runner/package.json +42 -0
  178. invar_tools-1.10.0/typescript/packages/fc-runner/src/cli.ts +150 -0
  179. invar_tools-1.10.0/typescript/packages/fc-runner/src/index.ts +328 -0
  180. invar_tools-1.10.0/typescript/packages/fc-runner/tsconfig.json +8 -0
  181. invar_tools-1.10.0/typescript/packages/quick-check/package.json +47 -0
  182. invar_tools-1.10.0/typescript/packages/quick-check/src/cli.ts +123 -0
  183. invar_tools-1.10.0/typescript/packages/quick-check/src/index.ts +279 -0
  184. invar_tools-1.10.0/typescript/packages/quick-check/tsconfig.json +8 -0
  185. invar_tools-1.10.0/typescript/packages/ts-analyzer/package.json +42 -0
  186. invar_tools-1.10.0/typescript/packages/ts-analyzer/src/cli.ts +131 -0
  187. invar_tools-1.10.0/typescript/packages/ts-analyzer/src/index.ts +622 -0
  188. invar_tools-1.10.0/typescript/packages/ts-analyzer/tsconfig.json +8 -0
  189. invar_tools-1.10.0/typescript/pnpm-workspace.yaml +2 -0
  190. invar_tools-1.10.0/typescript/scripts/bundle.mjs +65 -0
  191. invar_tools-1.10.0/typescript/tsconfig.base.json +24 -0
  192. invar_tools-1.10.0/typescript/vitest.config.ts +13 -0
  193. {invar_tools-1.7.1 → invar_tools-1.10.0}/uv.lock +126 -1
  194. invar_tools-1.7.1/.claude/hooks/PostToolUse.sh +0 -3
  195. invar_tools-1.7.1/.claude/hooks/PreToolUse.sh +0 -3
  196. invar_tools-1.7.1/.claude/hooks/Stop.sh +0 -3
  197. invar_tools-1.7.1/.claude/hooks/UserPromptSubmit.sh +0 -3
  198. invar_tools-1.7.1/.claude/skills/review/SKILL.md +0 -337
  199. invar_tools-1.7.1/.invar/examples/conftest.py +0 -3
  200. invar_tools-1.7.1/.invar/examples/core_shell.py +0 -127
  201. invar_tools-1.7.1/.invar/examples/workflow.md +0 -258
  202. invar_tools-1.7.1/src/invar/shell/commands/perception.py +0 -127
  203. invar_tools-1.7.1/src/invar/templates/config/CLAUDE.md.jinja +0 -244
  204. invar_tools-1.7.1/src/invar/templates/examples/core_shell.py +0 -127
  205. invar_tools-1.7.1/src/invar/templates/protocol/INVAR.md +0 -310
  206. invar_tools-1.7.1/src/invar/templates/skills/review/SKILL.md.jinja +0 -338
  207. {invar_tools-1.7.1 → invar_tools-1.10.0}/.aider.conf.yml +0 -0
  208. {invar_tools-1.7.1 → invar_tools-1.10.0}/.claude/commands/audit.md +0 -0
  209. {invar_tools-1.7.1 → invar_tools-1.10.0}/.claude/commands/guard.md +0 -0
  210. {invar_tools-1.7.1 → invar_tools-1.10.0}/.claude/hooks/invar.PostToolUse.sh +0 -0
  211. {invar_tools-1.7.1 → invar_tools-1.10.0}/.claude/hooks/invar.PreToolUse.sh +0 -0
  212. {invar_tools-1.7.1 → invar_tools-1.10.0}/.claude/hooks/invar.Stop.sh +0 -0
  213. {invar_tools-1.7.1 → invar_tools-1.10.0}/.claude/hooks/invar.UserPromptSubmit.sh +0 -0
  214. {invar_tools-1.7.1 → invar_tools-1.10.0}/.cursorrules +0 -0
  215. {invar_tools-1.7.1 → invar_tools-1.10.0}/.github/workflows/ci.yml +0 -0
  216. {invar_tools-1.7.1 → invar_tools-1.10.0}/.github/workflows/publish.yml +0 -0
  217. {invar_tools-1.7.1 → invar_tools-1.10.0}/.invar/archive/sessions-2025-12.md +0 -0
  218. {invar_tools-1.7.1/src/invar/templates → invar_tools-1.10.0/.invar}/examples/workflow.md +0 -0
  219. {invar_tools-1.7.1 → invar_tools-1.10.0}/.invar/mcp-setup.md +0 -0
  220. {invar_tools-1.7.1 → invar_tools-1.10.0}/.invar/project-additions.md +0 -0
  221. {invar_tools-1.7.1 → invar_tools-1.10.0}/.invar/proposals/TEMPLATE.md +0 -0
  222. {invar_tools-1.7.1 → invar_tools-1.10.0}/.mcp.json +0 -0
  223. {invar_tools-1.7.1 → invar_tools-1.10.0}/.pre-commit-config.yaml +0 -0
  224. {invar_tools-1.7.1 → invar_tools-1.10.0}/.serena/.gitignore +0 -0
  225. {invar_tools-1.7.1 → invar_tools-1.10.0}/.serena/project.yml +0 -0
  226. {invar_tools-1.7.1 → invar_tools-1.10.0}/LICENSE +0 -0
  227. {invar_tools-1.7.1 → invar_tools-1.10.0}/LICENSE-GPL +0 -0
  228. {invar_tools-1.7.1 → invar_tools-1.10.0}/NOTICE +0 -0
  229. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/.nojekyll +0 -0
  230. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/agents.md +0 -0
  231. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/diagrams.md +0 -0
  232. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/guide.md +0 -0
  233. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/guides/aider.md +0 -0
  234. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/guides/cline.md +0 -0
  235. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/guides/continue.md +0 -0
  236. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/guides/cursor.md +0 -0
  237. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/history/decisions-2024.md +0 -0
  238. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/history/feedback/compliance-analysis.md +0 -0
  239. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/history/feedback/feedback-memo.md +0 -0
  240. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/history/feedback/index.md +0 -0
  241. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/history/index.md +0 -0
  242. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/history/original-vision.md +0 -0
  243. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/history/protocol-evolution.md +0 -0
  244. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/history/research/cruxeval-quick-validation.md +0 -0
  245. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/logo.svg +0 -0
  246. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/DX-23-entry-point-detection.md +0 -0
  247. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/DX-25-functional-patterns.md +0 -0
  248. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/DX-29-pure-content-detection.md +0 -0
  249. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/DX-38-contract-quality-rules.md +0 -0
  250. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/DX-60-structured-rules-ssot.md +0 -0
  251. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/DX-61-functional-pattern-guidance.md +0 -0
  252. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/DX-61-implementation-design.md +0 -0
  253. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/DX-68-agent-behavior-optimization.md +0 -0
  254. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/LX-01-multi-language-feasibility.md +0 -0
  255. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/2024-12-21-guard-enhancements.md +0 -0
  256. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/2024-12-21-language-inspired-enhancements.md +0 -0
  257. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/2024-12-21-test-first-enhancement.md +0 -0
  258. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/2025-12-21-dx-improvements.md +0 -0
  259. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/2025-12-23-dx-20-property-testing-enhancements.md +0 -0
  260. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/2025-12-23-dx-21-package-and-init.md +0 -0
  261. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/AGENT-IMPROVEMENTS.md +0 -0
  262. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-11-documentation-restructure.md +0 -0
  263. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-12-hypothesis-fallback.md +0 -0
  264. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-13-incremental-prove.md +0 -0
  265. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-14-expanded-prove-usage.md +0 -0
  266. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-16-agent-tool-enforcement.md +0 -0
  267. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-17-workflow-enforcement.md +0 -0
  268. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-22-verification-strategy.md +0 -0
  269. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-24-mechanism-documentation.md +0 -0
  270. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-26-guard-simplification.md +0 -0
  271. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-27-system-prompt-protocol.md +0 -0
  272. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-28-semantic-verification.md +0 -0
  273. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-30-visible-workflow.md +0 -0
  274. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-31-adversarial-reviewer.md +0 -0
  275. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-32-workflow-iteration.md +0 -0
  276. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-33-verification-blind-spots.md +0 -0
  277. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-34-review-cycle.md +0 -0
  278. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-35-workflow-phase-separation.md +0 -0
  279. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-36-documentation-restructuring.md +0 -0
  280. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-37-coverage-integration.md +0 -0
  281. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-40-smart-tool-redirect-hook.md +0 -0
  282. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-43-cross-platform-distribution.md +0 -0
  283. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-45-template-consistency.md +0 -0
  284. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-46-documentation-audit.md +0 -0
  285. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-47-command-skill-naming.md +0 -0
  286. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-48-code-structure-reorganization.md +0 -0
  287. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-49-protocol-distribution-unification.md +0 -0
  288. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-53-review-loop-effectiveness.md +0 -0
  289. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-54-agent-native-context-management.md +0 -0
  290. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-55-claude-init-conflict-resolution.md +0 -0
  291. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-56-template-sync-unification.md +0 -0
  292. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-57-claude-code-hooks.md +0 -0
  293. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-58-document-structure-optimization.md +0 -0
  294. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/DX-63-contracts-first-enforcement.md +0 -0
  295. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-64-version-display-unification.md +0 -0
  296. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-65-single-file-guard.md +0 -0
  297. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-66-escape-hatch-visibility.md +0 -0
  298. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-69-project-uninstall.md +0 -0
  299. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/DX-70-init-simplification.md +0 -0
  300. {invar_tools-1.7.1/docs/proposals → invar_tools-1.10.0/docs/proposals/completed}/LX-02-agent-portability-analysis.md +0 -0
  301. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/proposals/completed/LX-03-multi-agent-support.md +0 -0
  302. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/agent-information-hierarchy.md +0 -0
  303. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/architecture/index.md +0 -0
  304. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/contracts/advanced.md +0 -0
  305. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/contracts/completeness.md +0 -0
  306. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/contracts/doctests.md +0 -0
  307. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/contracts/index.md +0 -0
  308. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/contracts/pre-post.md +0 -0
  309. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/documentation.md +0 -0
  310. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/index.md +0 -0
  311. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/proposal-workflow.md +0 -0
  312. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/rules/index.md +0 -0
  313. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/rules/severity.md +0 -0
  314. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/verification/crosshair-vs-hypothesis.md +0 -0
  315. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/verification/index.md +0 -0
  316. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/verification/smart-routing.md +0 -0
  317. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/workflow/index.md +0 -0
  318. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/workflow/session-start.md +0 -0
  319. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/reference/workflow/usbv.md +0 -0
  320. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/terminal-gif-guide.md +0 -0
  321. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/test-reports/DX-55-test-report.md +0 -0
  322. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/test-reports/DX-56-test-report.md +0 -0
  323. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/test-reports/DX-58-test-scenario.md +0 -0
  324. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/testing/v1.5.0-stress-test.md +0 -0
  325. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/testing/v1.5.0-test-report.md +0 -0
  326. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/testing/v1.5.0-workflow-compliance.md +0 -0
  327. {invar_tools-1.7.1 → invar_tools-1.10.0}/docs/vision.md +0 -0
  328. {invar_tools-1.7.1 → invar_tools-1.10.0}/runtime/LICENSE +0 -0
  329. {invar_tools-1.7.1 → invar_tools-1.10.0}/runtime/README.md +0 -0
  330. {invar_tools-1.7.1 → invar_tools-1.10.0}/runtime/pyproject.toml +0 -0
  331. {invar_tools-1.7.1 → invar_tools-1.10.0}/runtime/src/invar_runtime/decorators.py +0 -0
  332. {invar_tools-1.7.1 → invar_tools-1.10.0}/runtime/src/invar_runtime/invariant.py +0 -0
  333. {invar_tools-1.7.1 → invar_tools-1.10.0}/runtime/src/invar_runtime/relations.py +0 -0
  334. {invar_tools-1.7.1 → invar_tools-1.10.0}/runtime/src/invar_runtime/resource.py +0 -0
  335. {invar_tools-1.7.1 → invar_tools-1.10.0}/scripts/smart-guard.sh +0 -0
  336. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/core/__init__.py +0 -0
  337. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/__init__.py +0 -0
  338. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/contracts.py +0 -0
  339. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/entry_points.py +0 -0
  340. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/extraction.py +0 -0
  341. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/format_specs.py +0 -0
  342. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/format_strategies.py +0 -0
  343. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/formatter.py +0 -0
  344. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/hypothesis_strategies.py +0 -0
  345. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/inspect.py +0 -0
  346. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/lambda_helpers.py +0 -0
  347. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/must_use.py +0 -0
  348. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/parser.py +0 -0
  349. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/patterns/__init__.py +0 -0
  350. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/postcondition_scope.py +0 -0
  351. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/purity.py +0 -0
  352. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/purity_heuristics.py +0 -0
  353. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/references.py +0 -0
  354. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/review_trigger.py +0 -0
  355. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/rule_meta.py +0 -0
  356. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/shell_analysis.py +0 -0
  357. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/shell_architecture.py +0 -0
  358. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/strategies.py +0 -0
  359. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/suggestions.py +0 -0
  360. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/tautology.py +0 -0
  361. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/template_parser.py +0 -0
  362. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/timeout_inference.py +0 -0
  363. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/trivial_detection.py +0 -0
  364. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/utils.py +0 -0
  365. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/core/verification_routing.py +0 -0
  366. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/mcp/__init__.py +0 -0
  367. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/mcp/__main__.py +0 -0
  368. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/mcp/server.py +0 -0
  369. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/py.typed +0 -0
  370. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/__init__.py +0 -0
  371. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/commands/__init__.py +0 -0
  372. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/commands/hooks.py +0 -0
  373. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/commands/merge.py +0 -0
  374. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/commands/mutate.py +0 -0
  375. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/commands/sync_self.py +0 -0
  376. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/commands/test.py +0 -0
  377. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/config.py +0 -0
  378. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/coverage.py +0 -0
  379. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/git.py +0 -0
  380. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/guard_helpers.py +0 -0
  381. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/guard_output.py +0 -0
  382. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/mcp_config.py +0 -0
  383. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/mutation.py +0 -0
  384. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/pattern_integration.py +0 -0
  385. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/property_tests.py +0 -0
  386. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/prove/__init__.py +0 -0
  387. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/prove/accept.py +0 -0
  388. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/prove/cache.py +0 -0
  389. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/prove/crosshair.py +0 -0
  390. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/prove/hypothesis.py +0 -0
  391. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/subprocess_env.py +0 -0
  392. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/shell/testing.py +0 -0
  393. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/templates/CLAUDE.md.template +0 -0
  394. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/templates/__init__.py +0 -0
  395. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/templates/commands/guard.md +0 -0
  396. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/templates/config/pre-commit.yaml.jinja +0 -0
  397. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/templates/context.md.template +0 -0
  398. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/templates/hooks/__init__.py +0 -0
  399. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/invar/templates/proposal.md.template +0 -0
  400. {invar_tools-1.7.1 → invar_tools-1.10.0}/src/shell/__init__.py +0 -0
  401. {invar_tools-1.7.1 → invar_tools-1.10.0}/tests/__init__.py +0 -0
  402. {invar_tools-1.7.1 → invar_tools-1.10.0}/tests/conftest.py +0 -0
  403. {invar_tools-1.7.1 → invar_tools-1.10.0}/tests/integration/__init__.py +0 -0
  404. {invar_tools-1.7.1 → invar_tools-1.10.0}/tests/integration/test_cli_flags.py +0 -0
  405. {invar_tools-1.7.1 → invar_tools-1.10.0}/tests/integration/test_dx55_regression.py +0 -0
  406. {invar_tools-1.7.1 → invar_tools-1.10.0}/tests/integration/test_dx56_sync.py +0 -0
  407. {invar_tools-1.7.1 → 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-->
@@ -10,9 +10,49 @@ _invar:
10
10
  # Development Mode
11
11
 
12
12
  > **Purpose:** Implement solution following USBV workflow with verification.
13
+ > **Mindset:** CONTRACTS before code — no exceptions.
14
+
15
+ ## Scope Boundaries
16
+
17
+ **This skill IS for:**
18
+ - Implementing features ("add", "create", "build")
19
+ - Fixing bugs ("fix", "resolve")
20
+ - Modifying existing code ("update", "change")
21
+ - Writing tests and contracts
22
+
23
+ **This skill is NOT for:**
24
+ - Exploring unclear requirements → switch to `/investigate`
25
+ - Choosing between approaches → switch to `/propose`
26
+ - Reviewing completed work → switch to `/review`
27
+
28
+ **Drift detection:** If requirements are unclear → STOP, exit to `/investigate` first.
13
29
 
14
30
  ## Entry Actions (REQUIRED)
15
31
 
32
+ ### Session Restore (if continuing from summary)
33
+
34
+ When conversation begins with a previous session summary:
35
+
36
+ 1. **ALWAYS display Check-In first** — even when continuing
37
+ 2. **Determine current phase** from todo items:
38
+ | Todo keywords | Phase |
39
+ |---------------|-------|
40
+ | "research", "understand", "analyze" | UNDERSTAND |
41
+ | "contract", "design", "specify" | SPECIFY |
42
+ | "implement", "code", "build" | BUILD |
43
+ | "verify", "test", "guard" | VALIDATE |
44
+ 3. **Display phase header** before resuming work
45
+ 4. **Re-read context.md** for project state
46
+
47
+ ```
48
+ # Example session restore:
49
+ ✓ Check-In: Invar | Main | dirty
50
+
51
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
52
+ 📍 /develop → BUILD (3/4) [resumed]
53
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
54
+ ```
55
+
16
56
  ### Context Refresh (DX-54)
17
57
 
18
58
  Before any workflow action:
@@ -52,10 +92,11 @@ If task appears simple (4+ signals: single file, clear target, additive change,
52
92
 
53
93
  ### 2. SPECIFY
54
94
 
55
- - **Contracts FIRST:** Write `@pre`/`@post` before implementation
56
- - **Doctests:** Add examples for expected behavior
95
+ - **Contracts FIRST:** Write contracts before implementation
96
+ - **Examples:** Add examples for expected behavior
57
97
  - **Design:** Decompose complex tasks into sub-functions
58
98
 
99
+
59
100
  ```python
60
101
  # SPECIFY before BUILD:
61
102
  @pre(lambda x: x > 0)
@@ -68,6 +109,7 @@ def calculate(x: int) -> int:
68
109
  ... # Implementation comes in BUILD
69
110
  ```
70
111
 
112
+
71
113
  #### Function-Level Gates (DX-63)
72
114
 
73
115
  When creating new modules, use **incremental development**:
@@ -106,6 +148,25 @@ If any NO → Stop. Write contract first.
106
148
 
107
149
  ### 3. BUILD
108
150
 
151
+ #### New Function Gate (MANDATORY)
152
+
153
+ **Before writing ANY new Core function, STOP and verify:**
154
+
155
+ | Check | If NO → Action |
156
+ |-------|----------------|
157
+ | Contract shown in SPECIFY phase? | ⛔ STOP. Return to SPECIFY. |
158
+ | Doctest written? | ⛔ STOP. Write doctest first. |
159
+
160
+ ```
161
+ ⛔ GATE VIOLATION: Writing new function without prior contract.
162
+ → Return to SPECIFY phase. Show contract first.
163
+ ```
164
+
165
+ **Exempt from gate:**
166
+ - Shell functions (no @pre/@post required)
167
+ - Editing existing functions (contract already exists)
168
+ - Non-Python files
169
+
109
170
  **For complex tasks:** Enter Plan Mode first, get user approval.
110
171
 
111
172
  **Implementation rules:**
@@ -152,6 +213,7 @@ For multiple tasks:
152
213
 
153
214
  Quick reference for resolving common Guard errors:
154
215
 
216
+
155
217
  | Error | Cause | Quick Fix |
156
218
  |-------|-------|-----------|
157
219
  | `forbidden_import: io` | I/O library in Core | Use `iter(s.splitlines())` not `io.StringIO` |
@@ -171,6 +233,7 @@ Check the "Suggested:" line in Guard output.
171
233
  **Note:** Use `from deal import pre, post` for lambda-based contracts.
172
234
  `invar_runtime.pre/post` are for Contract objects like `NonEmpty`.
173
235
 
236
+
174
237
  ## Timeout Handling
175
238
 
176
239
  | Threshold | Duration | Action |
@@ -296,6 +359,7 @@ Agent:
296
359
 
297
360
  @pre(lambda source, path: len(source.strip()) > 0)
298
361
 
362
+
299
363
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
300
364
  📍 /develop → BUILD (3/4)
301
365
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━