invar-tools 1.16.0__tar.gz → 1.17.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.16.0 → invar_tools-1.17.0}/.invar/context.md +15 -15
- {invar_tools-1.16.0 → invar_tools-1.17.0}/PKG-INFO +1 -1
- invar_tools-1.17.0/docs/proposals/DX-84-security-review-backlog.md +162 -0
- invar_tools-1.17.0/docs/rule-severity-comparison.md +389 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/pyproject.toml +1 -1
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/format_strategies.py +3 -1
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/mcp/handlers.py +10 -1
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/node_tools/eslint-plugin/cli.js +55 -9
- invar_tools-1.16.0/src/invar/node_tools/fc-runner/cli.js → invar_tools-1.17.0/src/invar/node_tools/fc-runner/bundle.js +1 -1
- invar_tools-1.17.0/src/invar/node_tools/fc-runner/cli.d.ts +12 -0
- invar_tools-1.17.0/src/invar/node_tools/fc-runner/cli.d.ts.map +1 -0
- invar_tools-1.17.0/src/invar/node_tools/fc-runner/cli.js +149 -0
- invar_tools-1.17.0/src/invar/node_tools/fc-runner/cli.js.map +1 -0
- invar_tools-1.17.0/src/invar/node_tools/fc-runner/index.d.ts +338 -0
- invar_tools-1.17.0/src/invar/node_tools/fc-runner/index.d.ts.map +1 -0
- invar_tools-1.17.0/src/invar/node_tools/fc-runner/index.js +260 -0
- invar_tools-1.17.0/src/invar/node_tools/fc-runner/index.js.map +1 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/prove/guard_ts.py +85 -5
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/package.json +1 -1
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/cli.ts +54 -9
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/index.ts +1 -1
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/no-pure-logic-in-shell.ts +30 -10
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/require-schema-validation.ts +6 -4
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/shell-complexity.ts +77 -12
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/fc-runner/src/cli.ts +16 -3
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.aider.conf.yml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/commands/audit.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/commands/guard.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/hooks/PostToolUse.sh +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/hooks/PreToolUse.sh +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/hooks/Stop.sh +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/hooks/UserPromptSubmit.sh +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/hooks/invar.PostToolUse.sh +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/hooks/invar.PreToolUse.sh +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/hooks/invar.Stop.sh +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/hooks/invar.UserPromptSubmit.sh +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/acceptance/SKILL.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/develop/SKILL.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/invar-onboard/SKILL.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/invar-onboard/patterns/python.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/invar-onboard/patterns/typescript.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/invar-onboard/templates/assessment.md.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/invar-onboard/templates/roadmap.md.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/invar-reflect/CONFIG.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/invar-reflect/SKILL.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/invar-reflect/template.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/investigate/SKILL.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/propose/SKILL.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/review/SKILL.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/security/SKILL.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/security/patterns/_common.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/security/patterns/python.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.claude/skills/security/patterns/typescript.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.cursorrules +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.github/workflows/ci.yml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.github/workflows/claude-code-review.yml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.github/workflows/claude.yml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.github/workflows/publish.yml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.gitignore +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.invar/archive/sessions-2025-12.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.invar/examples/README.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.invar/examples/conftest.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.invar/examples/contracts.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.invar/examples/core_shell.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.invar/examples/functional.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.invar/examples/workflow.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.invar/feedback/feedback-2026-01-03.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.invar/mcp-setup.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.invar/project-additions.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.invar/proposals/TEMPLATE.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.mcp.json +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.pre-commit-config.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.serena/.gitignore +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/.serena/project.yml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/CHANGELOG.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/CLAUDE.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/INVAR.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/LICENSE +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/LICENSE-GPL +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/NOTICE +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/README.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/.nojekyll +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/agents.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/design.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/diagrams.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/guide.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/guides/aider.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/guides/cline.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/guides/continue.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/guides/cursor.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/guides/multi-agent.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/guides/pi.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/history/decisions-2024.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/history/feedback/compliance-analysis.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/history/feedback/feedback-memo.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/history/feedback/index.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/history/index.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/history/original-vision.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/history/protocol-evolution.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/history/research/cruxeval-quick-validation.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/index.html +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/logo.svg +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/DX-23-entry-point-detection.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/DX-25-functional-patterns.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/DX-29-pure-content-detection.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/DX-38-contract-quality-rules.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/DX-60-structured-rules-ssot.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/DX-61-functional-pattern-guidance.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/DX-61-implementation-design.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/DX-62-proactive-reference-reading.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/DX-68-agent-behavior-optimization.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/DX-74-experiment-report.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/DX-75-attention-aware-framework.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/DX-78-mcp-protocol-sync.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/DX-79-invar-usage-feedback.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/DX-80-guard-cli-mcp-alignment.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/DX-81-multi-agent-init.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/DX-83-multi-agent-subagent-support.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/LX-01-multi-language-feasibility.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/LX-04-pi-agent-support.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/LX-07-extension-skills.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/LX-08-extension-skills-future.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/LX-09-legacy-onboarding.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/LX-11-cursor-support.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/LX-13-typescript-runtime-optimization.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/LX-15-typescript-guard-parity.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/LX-16-typescript-guard-remaining-gap.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/2024-12-21-guard-enhancements.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/2024-12-21-language-inspired-enhancements.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/2024-12-21-test-first-enhancement.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/2025-12-21-dx-improvements.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/2025-12-23-dx-20-property-testing-enhancements.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/2025-12-23-dx-21-package-and-init.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/AGENT-IMPROVEMENTS.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-11-documentation-restructure.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-12-hypothesis-fallback.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-13-incremental-prove.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-14-expanded-prove-usage.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-16-agent-tool-enforcement.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-17-workflow-enforcement.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-22-verification-strategy.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-24-mechanism-documentation.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-26-guard-simplification.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-27-system-prompt-protocol.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-28-semantic-verification.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-30-visible-workflow.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-31-adversarial-reviewer.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-32-workflow-iteration.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-33-verification-blind-spots.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-34-review-cycle.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-35-workflow-phase-separation.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-36-documentation-restructuring.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-37-coverage-integration.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-39-workflow-efficiency.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-40-smart-tool-redirect-hook.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-41-automatic-review-orchestration.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-42-workflow-auto-routing.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-43-cross-platform-distribution.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-45-template-consistency.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-46-documentation-audit.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-47-command-skill-naming.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-48-code-structure-reorganization.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-49-protocol-distribution-unification.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-50-workflow-enforcement.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-51-workflow-phase-visibility.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-52-venv-dependency-injection.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-53-review-loop-effectiveness.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-54-agent-native-context-management.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-55-claude-init-conflict-resolution.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-56-template-sync-unification.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-57-claude-code-hooks.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-58-document-structure-optimization.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-63-contracts-first-enforcement.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-64-version-display-unification.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-65-single-file-guard.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-66-escape-hatch-visibility.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-67-explicit-skill-invocation.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-69-project-uninstall.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-70-init-simplification.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-70-review-isolation.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-71-skill-command-simplification.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-72-mandatory-self-review-detection.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-74-tiered-attention-defense.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-76-structured-document-query.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/DX-77-mcp-doc-tools-enhancements.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/LX-02-agent-portability-analysis.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/LX-03-multi-agent-support.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/LX-05-language-agnostic-protocol.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/LX-06-appendix-guard-comparison.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/LX-06-typescript-tooling.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/LX-09-legacy-onboarding.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/LX-10-typescript-size-limits.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/LX-12-typescript-contract-enforcement.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/completed/LX-14-typescript-doctest-execution.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/proposals/index.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/agent-information-hierarchy.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/architecture/index.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/contracts/advanced.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/contracts/completeness.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/contracts/doctests.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/contracts/index.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/contracts/pre-post.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/documentation.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/index.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/proposal-workflow.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/rules/index.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/rules/severity.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/verification/crosshair-vs-hypothesis.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/verification/index.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/verification/smart-routing.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/workflow/index.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/workflow/session-start.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/reference/workflow/usbv.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/terminal-gif-guide.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/test-reports/DX-55-test-report.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/test-reports/DX-56-test-report.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/test-reports/DX-58-test-scenario.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/testing/v1.5.0-stress-test.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/testing/v1.5.0-test-report.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/testing/v1.5.0-workflow-compliance.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/docs/vision.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/runtime/LICENSE +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/runtime/README.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/runtime/pyproject.toml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/runtime/src/invar_runtime/__init__.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/runtime/src/invar_runtime/contracts.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/runtime/src/invar_runtime/decorators.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/runtime/src/invar_runtime/invariant.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/runtime/src/invar_runtime/relations.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/runtime/src/invar_runtime/resource.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/scripts/embed_node_tools.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/scripts/smart-guard.sh +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/core/__init__.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/__init__.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/__init__.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/contracts.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/doc_edit.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/doc_parser.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/entry_points.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/extraction.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/feedback.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/format_specs.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/formatter.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/hypothesis_strategies.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/inspect.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/lambda_helpers.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/language.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/models.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/must_use.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/parser.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/patterns/__init__.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/patterns/detector.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/patterns/p0_exhaustive.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/patterns/p0_literal.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/patterns/p0_newtype.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/patterns/p0_nonempty.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/patterns/p0_validation.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/patterns/registry.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/patterns/types.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/postcondition_scope.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/property_gen.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/purity.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/purity_heuristics.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/references.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/review_trigger.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/rule_meta.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/rules.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/shell_analysis.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/shell_architecture.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/strategies.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/suggestions.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/sync_helpers.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/tautology.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/template_helpers.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/template_parser.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/timeout_inference.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/trivial_detection.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/ts_parsers.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/ts_sig_parser.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/utils.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/core/verification_routing.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/mcp/__init__.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/mcp/__main__.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/mcp/server.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/node_tools/.gitignore +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/node_tools/MANIFEST +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/node_tools/__init__.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/node_tools/quick-check/cli.js +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/node_tools/ts-analyzer/cli.js +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/node_tools/ts-query.js +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/py.typed +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/__init__.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/claude_hooks.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/commands/__init__.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/commands/doc.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/commands/feedback.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/commands/guard.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/commands/hooks.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/commands/init.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/commands/merge.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/commands/mutate.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/commands/perception.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/commands/skill.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/commands/sync_self.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/commands/template_sync.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/commands/test.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/commands/uninstall.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/commands/update.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/config.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/contract_coverage.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/coverage.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/doc_tools.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/fs.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/git.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/guard_helpers.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/guard_output.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/mcp_config.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/mutation.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/pattern_integration.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/pi_hooks.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/pi_tools.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/property_tests.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/prove/__init__.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/prove/accept.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/prove/cache.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/prove/crosshair.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/prove/hypothesis.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/py_refs.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/skill_manager.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/subprocess_env.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/template_engine.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/templates.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/testing.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/shell/ts_compiler.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/CLAUDE.md.template +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/__init__.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/claude-md/python/critical-rules.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/claude-md/python/quick-reference.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/claude-md/typescript/critical-rules.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/claude-md/typescript/quick-reference.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/claude-md/universal/check-in.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/claude-md/universal/skills.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/claude-md/universal/tool-selection.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/claude-md/universal/workflow.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/commands/audit.md.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/commands/guard.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/config/AGENT.md.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/config/CLAUDE.md.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/config/context.md.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/config/pre-commit.yaml.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/context.md.template +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/examples/python/README.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/examples/python/conftest.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/examples/python/contracts.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/examples/python/core_shell.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/examples/python/functional.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/examples/python/workflow.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/examples/typescript/README.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/examples/typescript/contracts.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/examples/typescript/core_shell.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/examples/typescript/functional.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/examples/typescript/patterns.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/examples/typescript/workflow.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/hooks/PostToolUse.sh.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/hooks/PreToolUse.sh.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/hooks/Stop.sh.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/hooks/UserPromptSubmit.sh.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/hooks/__init__.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/hooks/pi/invar.ts.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/manifest.toml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/onboard/assessment.md.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/onboard/patterns/python.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/onboard/patterns/typescript.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/onboard/roadmap.md.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/pi-tools/invar/index.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/proposal.md.template +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/INVAR.md.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/python/architecture-examples.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/python/contracts-syntax.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/python/markers.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/python/tools.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/python/troubleshooting.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/typescript/architecture-examples.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/typescript/contracts-syntax.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/typescript/markers.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/typescript/tools.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/typescript/troubleshooting.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/universal/architecture.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/universal/completion.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/universal/contracts-concept.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/universal/header.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/universal/session.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/universal/six-laws.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/universal/usbv.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/protocol/universal/visible-workflow.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/develop/SKILL.md.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/extensions/_registry.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/extensions/acceptance/SKILL.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/extensions/invar-onboard/SKILL.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/extensions/invar-onboard/patterns/python.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/extensions/invar-onboard/patterns/typescript.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/extensions/invar-onboard/templates/assessment.md.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/extensions/invar-onboard/templates/roadmap.md.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/extensions/security/SKILL.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/extensions/security/patterns/_common.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/extensions/security/patterns/python.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/extensions/security/patterns/typescript.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/invar-reflect/CONFIG.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/invar-reflect/SKILL.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/invar-reflect/template.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/investigate/SKILL.md.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/propose/SKILL.md.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/invar/templates/skills/review/SKILL.md.jinja +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/src/shell/__init__.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/__init__.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/conftest.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/conftest.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/README.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/RESULTS.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/RESULTS_V2.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/RESULTS_V4.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/ground_truth.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/prompts.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario/api_client.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario/auth_service.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario/config_manager.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario/data_processor.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario/file_handler.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario/utils.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v2/analytics_engine.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v2/ground_truth.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v2/inventory_manager.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v2/notification_service.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v2/order_processor.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v2/payment_gateway.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v2/user_service.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v3/README.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v3/cache_service.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v3/calculator.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v3/data_processor.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v3/ground_truth.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v3/user_manager.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v3/validator.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v4/.serena/.gitignore +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v4/.serena/project.yml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v4/README.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v4/config_manager.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v4/data_service.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v4/ground_truth.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v4/math_utils.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v4/report_generator.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v4/user_auth.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v5/api_gateway.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v5/auth_service.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v5/cache_handler.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v5/config_loader.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v5/data_validator.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v5/ground_truth.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v5/metrics_collector.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v5/notification_service.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v5/payment_processor.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v5/report_builder.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v5/task_scheduler.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v5/user_manager.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v5/utils.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v6/api_gateway.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v6/auth_service.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v6/cache_handler.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v6/config_loader.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v6/data_validator.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v6/ground_truth.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v6/metrics_collector.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v6/notification_service.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v6/payment_processor.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v6/report_builder.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v6/task_scheduler.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v6/user_manager.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v6/utils.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v7/api_service.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v7/auth_manager.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v7/data_processor.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v7/ground_truth.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v7/report_engine.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v7/storage_handler.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/experiments/dx74_attention_drift/scenario_v7/utils.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/integration/__init__.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/integration/test_cli_flags.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/integration/test_dx55_regression.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/integration/test_dx56_sync.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/integration/test_dx78_ts_compiler.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/integration/test_lx05_detection.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/integration/test_lx05_integration.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/integration/test_lx05_templates.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/integration/test_lx06_typescript.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/integration/test_lx07_skills.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/integration/test_mcp_doc_tools.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/tests/test_subprocess_env.py +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/.gitignore +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/README.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/doctest.config.json +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/package.json +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/CONFIGURATION.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/EXAMPLES.md +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/__tests__/behavior.test.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/__tests__/e2e-scenarios.test.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/__tests__/fixtures/core/function-lengths.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/__tests__/fixtures/core/has-io-imports.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/__tests__/fixtures/core/valid-small.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/__tests__/fixtures/exported-functions.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/__tests__/fixtures/shell/with-io.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/__tests__/fixtures/tests/large.test.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/max-file-lines.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/max-function-lines.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/no-any-in-schema.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/no-empty-schema.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/no-impure-calls-in-core.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/no-io-in-core.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/no-redundant-type-schema.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/no-runtime-imports.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/require-complete-validation.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/require-jsdoc-example.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/shell-result-type.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/rules/thin-entry-points.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/utils/layer-detection.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/src/utils/math-example.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/eslint-plugin/tsconfig.json +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/fc-runner/package.json +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/fc-runner/src/index.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/fc-runner/tsconfig.json +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/quick-check/package.json +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/quick-check/src/cli.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/quick-check/src/index.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/quick-check/tsconfig.json +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/ts-analyzer/package.json +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/ts-analyzer/src/cli.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/ts-analyzer/src/index.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/packages/ts-analyzer/tsconfig.json +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/pnpm-workspace.yaml +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/scripts/bundle.mjs +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/scripts/generate-doctests.mjs +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/tsconfig.base.json +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/typescript/vitest.config.ts +0 -0
- {invar_tools-1.16.0 → invar_tools-1.17.0}/uv.lock +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Invar Project Context
|
|
2
2
|
|
|
3
|
-
*Last updated: 2026-01-
|
|
3
|
+
*Last updated: 2026-01-04*
|
|
4
4
|
|
|
5
5
|
<!-- DX-58: Slimmed context for efficient Check-In (~150 lines) -->
|
|
6
6
|
|
|
@@ -51,17 +51,17 @@
|
|
|
51
51
|
|
|
52
52
|
## Current State
|
|
53
53
|
|
|
54
|
-
- **PyPI:** `invar-tools` v1.
|
|
54
|
+
- **PyPI:** `invar-tools` v1.17.0 + `invar-runtime` v1.3.0
|
|
55
55
|
- **Protocol:** v5.0 (USBV workflow, DX-58 critical section)
|
|
56
|
-
- **Status:** Feature complete,
|
|
57
|
-
- **Recent:** DX-
|
|
56
|
+
- **Status:** Feature complete, TypeScript tooling production-ready
|
|
57
|
+
- **Recent:** DX-22 (Fix-or-Explain complexity), LX-06 (Unbundled eslint-plugin), DX-81 (Multi-agent init)
|
|
58
58
|
- **Blockers:** None
|
|
59
59
|
|
|
60
60
|
## Active Work
|
|
61
61
|
|
|
62
62
|
See [docs/proposals/](../docs/proposals/) for planned changes.
|
|
63
63
|
|
|
64
|
-
**Current focus:**
|
|
64
|
+
**Current focus:** LX-06 completed - TypeScript tools production-ready with unbundled distribution
|
|
65
65
|
|
|
66
66
|
---
|
|
67
67
|
|
|
@@ -93,16 +93,16 @@ Smart Guard (`invar guard`) runs multiple verification layers:
|
|
|
93
93
|
|
|
94
94
|
<!-- DX-58: Keep last 10, archive older ones -->
|
|
95
95
|
|
|
96
|
-
1. **
|
|
97
|
-
2. **
|
|
98
|
-
3. **
|
|
99
|
-
4. **
|
|
100
|
-
5. **
|
|
101
|
-
6. **
|
|
102
|
-
7. **
|
|
103
|
-
8. **
|
|
104
|
-
9. **
|
|
105
|
-
10. **
|
|
96
|
+
1. **Reliability > Size Optimization** - ESLint unbundled (632 KB) beats bundled (50 KB) when architecture demands it
|
|
97
|
+
2. **Agent-Native ≠ Agent-Only** - Design for Agent, measure by Human success
|
|
98
|
+
3. **Automatic > Opt-in** - Agents won't use flags they don't know about
|
|
99
|
+
4. **Example-Driven Learning** - Abstract rules don't teach; concrete code examples do
|
|
100
|
+
5. **Skip Requires Justification** - Each @skip_property_test needs explicit reason
|
|
101
|
+
6. **Review Gate as Conditional Step** - Review should be automatic trigger, not manual
|
|
102
|
+
7. **Process Visibility vs Task Completion** - Need explicit visibility checkpoints
|
|
103
|
+
8. **Enforcement Timing Matters** - Pre-commit blocks effective; PreToolUse hooks too late
|
|
104
|
+
9. **Tools Exist ≠ Tools Used** - Habit overrides methodology
|
|
105
|
+
10. **Performance Enables Adoption** - Fast tools get used more
|
|
106
106
|
|
|
107
107
|
---
|
|
108
108
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: invar-tools
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.17.0
|
|
4
4
|
Summary: AI-native software engineering tools with design-by-contract verification
|
|
5
5
|
Project-URL: Homepage, https://github.com/tefx/invar
|
|
6
6
|
Project-URL: Documentation, https://github.com/tefx/invar#readme
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# DX-84: Security Review Backlog (TypeScript & Python Guard)
|
|
2
|
+
|
|
3
|
+
**Status:** Active
|
|
4
|
+
**Created:** 2026-01-04
|
|
5
|
+
**Priority:** Medium (Code Quality)
|
|
6
|
+
**Category:** Technical Debt
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## Context
|
|
11
|
+
|
|
12
|
+
During comprehensive security review of TypeScript and Python Guard implementations (2026-01-04), we identified and fixed 9 security issues (1 Critical, 8 Major). This proposal tracks the remaining minor issues that were not addressed in the immediate fix cycle.
|
|
13
|
+
|
|
14
|
+
**Security fixes completed:**
|
|
15
|
+
- TypeScript: 1 Critical + 6 Major issues fixed
|
|
16
|
+
- Python: 2 Major issues fixed
|
|
17
|
+
- All e2e tests passing
|
|
18
|
+
- Production-ready for deployment
|
|
19
|
+
|
|
20
|
+
**Remaining backlog:** 13 minor code quality issues
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## TypeScript Guard - Remaining Issues (9)
|
|
25
|
+
|
|
26
|
+
### R2-002: Type Safety Bypass
|
|
27
|
+
**File:** `typescript/packages/eslint-plugin/src/cli.ts:113`
|
|
28
|
+
**Issue:** Type assertion `as any` on ESLint config bypasses TypeScript safety
|
|
29
|
+
**Severity:** Minor
|
|
30
|
+
**Fix:** Define proper type for ESLint config or use type-safe configuration
|
|
31
|
+
**Impact:** Potential runtime type errors if ESLint config changes
|
|
32
|
+
|
|
33
|
+
### R2-003: Magic Number Duplication
|
|
34
|
+
**File:** `typescript/packages/eslint-plugin/src/rules/shell-complexity.ts:80,145`
|
|
35
|
+
**Issue:** `MAX_DEPTH = 10` repeated twice (in `countStatements` and `calculateComplexity`)
|
|
36
|
+
**Severity:** Minor
|
|
37
|
+
**Fix:** Extract to named constant at module level
|
|
38
|
+
**Impact:** Maintenance - changing depth limit requires two edits
|
|
39
|
+
|
|
40
|
+
### R2-004: Arbitrary Length Check
|
|
41
|
+
**File:** `typescript/packages/eslint-plugin/src/rules/shell-complexity.ts:254`
|
|
42
|
+
**Issue:** Function name length check `functionName.length < 3` is arbitrary
|
|
43
|
+
**Severity:** Minor
|
|
44
|
+
**Fix:** Make configurable or document why 3 characters
|
|
45
|
+
**Impact:** May skip valid short function names (e.g., `do`, `go`)
|
|
46
|
+
|
|
47
|
+
### R2-005: Magic Numbers in Pure Logic Detection
|
|
48
|
+
**File:** `typescript/packages/eslint-plugin/src/rules/no-pure-logic-in-shell.ts:91,95`
|
|
49
|
+
**Issue:** `MAX_DEPTH = 10` and `hasSubstantialLogic > 3` are magic numbers
|
|
50
|
+
**Severity:** Minor
|
|
51
|
+
**Fix:** Extract to named constants with semantic names
|
|
52
|
+
**Impact:** Code clarity and maintainability
|
|
53
|
+
|
|
54
|
+
### R2-006: Incomplete Argument Validation
|
|
55
|
+
**File:** `typescript/packages/fc-runner/src/cli.ts:110,117`
|
|
56
|
+
**Issue:** Argument parsing assumes next arg exists via `args[i + 1]` check, but doesn't validate it's not another flag
|
|
57
|
+
**Example:** `--seed --verbose` would try to parse `--verbose` as a number
|
|
58
|
+
**Severity:** Minor
|
|
59
|
+
**Fix:** Add check: `args[i + 1] && !args[i + 1].startsWith('--')`
|
|
60
|
+
**Impact:** Confusing error messages on malformed CLI usage
|
|
61
|
+
|
|
62
|
+
### R2-007: Unsafe Type Cast
|
|
63
|
+
**File:** `typescript/packages/fc-runner/src/cli.ts:157`
|
|
64
|
+
**Issue:** `as unknown as PropertyDefinition<Record<string, unknown>>[]` loses type safety
|
|
65
|
+
**Severity:** Minor
|
|
66
|
+
**Fix:** Use proper generic typing or validation
|
|
67
|
+
**Impact:** Potential runtime type errors
|
|
68
|
+
|
|
69
|
+
### R2-008: Tool Name Validation Too Strict
|
|
70
|
+
**File:** `guard_ts.py:313` (affects TypeScript tools too)
|
|
71
|
+
**Issue:** Tool name validation allows underscore but rejects dots. Tool names like `tsc.cmd` (Windows) would fail
|
|
72
|
+
**Severity:** Minor
|
|
73
|
+
**Fix:** Extend validation: `c.isalnum() or c in "-_."`
|
|
74
|
+
**Impact:** Windows compatibility issues
|
|
75
|
+
|
|
76
|
+
### R2-010: Silent JSON Suppression
|
|
77
|
+
**File:** `guard_ts.py:474`
|
|
78
|
+
**Issue:** `contextlib.suppress(json.JSONDecodeError)` silently ignores invalid JSON
|
|
79
|
+
**Severity:** Minor
|
|
80
|
+
**Fix:** Log warning or add comment explaining why silent suppression is acceptable
|
|
81
|
+
**Impact:** Difficult debugging when JSON is malformed
|
|
82
|
+
|
|
83
|
+
### R2-011: Lost Diagnostic Information
|
|
84
|
+
**File:** `guard_ts.py:791-793`
|
|
85
|
+
**Issue:** Empty `pass` statement on doctest failure loses diagnostic information
|
|
86
|
+
**Severity:** Info
|
|
87
|
+
**Fix:** At minimum, log to `result.tool_errors` for visibility
|
|
88
|
+
**Impact:** Harder to debug doctest generation failures
|
|
89
|
+
|
|
90
|
+
---
|
|
91
|
+
|
|
92
|
+
## Python Guard - Remaining Issues (4)
|
|
93
|
+
|
|
94
|
+
### PY-02: Silent Cache Failure
|
|
95
|
+
**File:** `src/invar/shell/prove/cache.py:67`
|
|
96
|
+
**Issue:** Silent JSON decode failure in cache loading - errors are swallowed
|
|
97
|
+
**Severity:** Minor
|
|
98
|
+
**Fix:** Log warning when cache is corrupted
|
|
99
|
+
**Impact:** Cache corruption goes unnoticed, leading to performance degradation
|
|
100
|
+
|
|
101
|
+
### PY-04: Generic Error String
|
|
102
|
+
**File:** `src/invar/shell/prove/cache.py:135`
|
|
103
|
+
**Issue:** `OSError` catch returns generic "error" string without details
|
|
104
|
+
**Severity:** Info
|
|
105
|
+
**Fix:** Include error message: `f"Cache error: {e}"`
|
|
106
|
+
**Impact:** Difficult debugging of cache-related issues
|
|
107
|
+
|
|
108
|
+
### PY-05: Overly Broad Exception Handler
|
|
109
|
+
**File:** `src/invar/shell/guard_output.py:84`
|
|
110
|
+
**Issue:** Bare `except Exception` in `show_file_context`
|
|
111
|
+
**Severity:** Info
|
|
112
|
+
**Fix:** Catch specific exceptions (OSError, UnicodeDecodeError)
|
|
113
|
+
**Impact:** May mask unexpected errors
|
|
114
|
+
|
|
115
|
+
### PY-06: Missing Explicit Timeout
|
|
116
|
+
**File:** `src/invar/shell/prove/guard_ts.py:779-787`
|
|
117
|
+
**Issue:** Doctest generation subprocess missing explicit timeout parameter
|
|
118
|
+
**Severity:** Info
|
|
119
|
+
**Fix:** Add `timeout=60` to subprocess.run call
|
|
120
|
+
**Impact:** Doctest generation could hang indefinitely
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## Positive Patterns to Preserve
|
|
125
|
+
|
|
126
|
+
**TypeScript:**
|
|
127
|
+
- Symlink resolution via `realpathSync()` before security checks
|
|
128
|
+
- Comprehensive NaN validation on numeric inputs
|
|
129
|
+
- Explicit TOCTOU acknowledgment in comments
|
|
130
|
+
|
|
131
|
+
**Python:**
|
|
132
|
+
- Result[T, E] monad enforcing explicit error handling
|
|
133
|
+
- No `shell=True` usage (all subprocess calls use list args)
|
|
134
|
+
- Consistent timeout parameters on all subprocess calls
|
|
135
|
+
- Comprehensive exception handling (OSError, UnicodeDecodeError, TimeoutExpired)
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## Recommendation
|
|
140
|
+
|
|
141
|
+
**Priority:** Medium
|
|
142
|
+
**Timeline:** Address in future refactoring cycles (not blocking current release)
|
|
143
|
+
|
|
144
|
+
**Suggested Approach:**
|
|
145
|
+
1. Create issues for each category (TypeScript minor, Python minor)
|
|
146
|
+
2. Address during normal maintenance when touching related code
|
|
147
|
+
3. No dedicated sprint needed - opportunistic fixes
|
|
148
|
+
|
|
149
|
+
**Not Blocking Because:**
|
|
150
|
+
- All security and functionality issues resolved
|
|
151
|
+
- e2e tests passing
|
|
152
|
+
- Code quality issues, not correctness issues
|
|
153
|
+
- Production deployment ready
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## References
|
|
158
|
+
|
|
159
|
+
- Security Review: 2026-01-04 adversarial code review (2 rounds)
|
|
160
|
+
- Fixed Issues: 1 Critical + 8 Major (see completed fixes)
|
|
161
|
+
- e2e Validation: Paralex project TypeScript Guard passing
|
|
162
|
+
- Python Guard: All verification passing (static + doctest + CrossHair + property tests)
|
|
@@ -0,0 +1,389 @@
|
|
|
1
|
+
# Guard 规则严重性对比表
|
|
2
|
+
|
|
3
|
+
**生成时间:** 2026-01-04 (更新: 2026-01-05)
|
|
4
|
+
**用途:** 说明 Python 和 TypeScript Guard 规则严重性配置的设计原理
|
|
5
|
+
**变更:** v1.16.0 - 对齐复杂度规则 (DX-22 Fix-or-Explain)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 快速对比:强制 vs 建议
|
|
10
|
+
|
|
11
|
+
| 维度 | Python Guard | TypeScript Guard (recommended) |
|
|
12
|
+
|------|-------------|--------------------------------|
|
|
13
|
+
| **强制 (ERROR)** | 10 条 | 7 条 ↓ |
|
|
14
|
+
| **建议 (WARN)** | 9 条 | 8 条 ↑ |
|
|
15
|
+
| **信息 (INFO)** | 2 条 | 0 条(无单独分类)|
|
|
16
|
+
| **总计** | 21 条 | 15 条 |
|
|
17
|
+
|
|
18
|
+
**v1.16.0 变更:**
|
|
19
|
+
- ✅ `max-function-lines`: ERROR → WARN (对齐 Python)
|
|
20
|
+
- ✅ 新增 `shell-complexity-debt` 机制 (与 Python 一致)
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## 详细规则对比表
|
|
25
|
+
|
|
26
|
+
### 1. 架构边界规则 (Architecture Boundaries)
|
|
27
|
+
|
|
28
|
+
**设计原则:** 违反 = 破坏架构分层,必须强制 ✅
|
|
29
|
+
|
|
30
|
+
| 规则 | Python | TypeScript | 严重性 | 为什么必须强制? |
|
|
31
|
+
|------|--------|-----------|--------|------------------|
|
|
32
|
+
| Core 中禁止 I/O | `forbidden_import` | `no-io-in-core` | **ERROR** | Core = 纯逻辑层,混入 I/O 破坏可测试性和可组合性 |
|
|
33
|
+
| Core 中禁止不纯调用 | `impure_call` | `no-impure-calls-in-core` | **ERROR** | `random.random()`, `datetime.now()` 破坏确定性 |
|
|
34
|
+
| Shell 必须返回 Result | `shell_result` | `shell-result-type` | **ERROR (PY) / WARN (TS)** ⚠️ | 统一错误处理,防止异常泄漏 |
|
|
35
|
+
|
|
36
|
+
**差异点:`shell_result` vs `shell-result-type`**
|
|
37
|
+
- **Python:** ERROR - Python 有 `Result[T, E]` 标准库支持,强制要求
|
|
38
|
+
- **TypeScript:** WARN - TypeScript 的 Result 类型需要手动定义,允许渐进式采用
|
|
39
|
+
|
|
40
|
+
**结论:** TS 在 Result 类型上更宽容是合理的,因为生态系统支持不同
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
### 2. 契约覆盖规则 (Contract Coverage)
|
|
45
|
+
|
|
46
|
+
**设计原则:** 核心契约 = 强制,质量改进 = 建议 ✅
|
|
47
|
+
|
|
48
|
+
| 规则 | Python | TypeScript | 严重性 | 为什么这样设计? |
|
|
49
|
+
|------|--------|-----------|--------|------------------|
|
|
50
|
+
| 缺少契约 | `missing_contract` | `require-jsdoc-example` | **ERROR** | Core 函数必须有契约(或 doctest),否则无法验证 |
|
|
51
|
+
| 空契约/套套逻辑 | `empty_contract` | `no-empty-schema` | **ERROR** | `@pre(lambda: True)` = 无意义,浪费维护成本 |
|
|
52
|
+
| 参数不匹配 | `param_mismatch` | N/A (TS 类型检查) | **ERROR** | 运行时崩溃风险 |
|
|
53
|
+
| @post 引用参数 | `postcondition_scope_error` | N/A | **ERROR** | 设计错误,@post 只能访问 result |
|
|
54
|
+
| 契约仅检查类型 | `redundant_type_contract` | `no-redundant-type-schema` | **INFO (PY) / WARN (TS)** | 类型已覆盖,契约应加语义约束 |
|
|
55
|
+
| 契约覆盖率低 | `contract_quality_ratio` | N/A | **WARN** | <80% 覆盖 = 建议改进,不阻塞 |
|
|
56
|
+
|
|
57
|
+
**差异点:为何 TypeScript 用 `require-jsdoc-example` 而非 `@pre/@post`?**
|
|
58
|
+
- TypeScript 没有运行时契约系统(需要第三方库)
|
|
59
|
+
- JSDoc `@example` + doctest 是 TypeScript 生态的最佳实践
|
|
60
|
+
- 要求 `@example` 相当于要求可验证的示例(功能等价)
|
|
61
|
+
|
|
62
|
+
**结论:** 两者设计目标一致(强制契约覆盖),实现方式适配各自生态
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
### 3. 文件/函数大小规则 (Size Limits)
|
|
67
|
+
|
|
68
|
+
**设计原则:** 硬限制 = 强制,软限制 = 建议 ✅
|
|
69
|
+
|
|
70
|
+
| 规则 | Python | TypeScript | 严重性 | 为什么这样设计? |
|
|
71
|
+
|------|--------|-----------|--------|------------------|
|
|
72
|
+
| 文件超过限制 | `file_size` | `max-file-lines` | **ERROR** | 绝对限制(默认 300 行),必须拆分 |
|
|
73
|
+
| 文件接近限制 | `file_size_warning` | N/A | **WARN** | 预警(80% 阈值),提前规划 |
|
|
74
|
+
| 函数超过限制 | `function_size` | `max-function-lines` | **WARN** ✅ | 允许合理的大函数(如 Shell 编排) |
|
|
75
|
+
|
|
76
|
+
**✅ v1.16.0 已对齐:函数大小规则统一为 WARN**
|
|
77
|
+
|
|
78
|
+
**为什么改为 WARN?**
|
|
79
|
+
1. **Python Shell 编排:** `run_typescript_guard()` 等编排函数合理地超过 50 行
|
|
80
|
+
2. **TypeScript React 组件:** JSX 声明性标记非逻辑复杂性
|
|
81
|
+
3. **DX-22 原则:** 软限制允许渐进改进,WARN 提供可见性但不阻塞开发
|
|
82
|
+
4. **shell_complexity_debt 兜底:** 累积过多未处理 WARN → ERROR 强制处理
|
|
83
|
+
|
|
84
|
+
**何时触发 ERROR?**
|
|
85
|
+
- **文件级别:** 超过绝对限制(300 行)→ `max-file-lines` ERROR
|
|
86
|
+
- **函数复杂度债务:** ≥3 个未处理的复杂度 WARN → `shell-complexity-debt` ERROR (DX-22)
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
### 4. Shell 复杂度规则 (Shell Complexity)
|
|
91
|
+
|
|
92
|
+
**设计原则:** 复杂度 = 建议重构,不阻塞开发 ✅
|
|
93
|
+
|
|
94
|
+
| 规则 | Python | TypeScript | 严重性 | 为什么都是建议性? |
|
|
95
|
+
|------|--------|-----------|--------|------------------|
|
|
96
|
+
| Shell 函数太复杂 | `shell_too_complex` | `shell-complexity` | **INFO (PY) / WARN (TS)** | 复杂度阈值主观,允许合理复杂编排 |
|
|
97
|
+
| Shell 有纯逻辑 | `shell_pure_logic` | `no-pure-logic-in-shell` | **WARN** | 启发式检测,可能误报(如配置转换) |
|
|
98
|
+
| 复杂度债务累积 | `shell_complexity_debt` | `shell-complexity-debt` ✅ | **ERROR** | v1.16.0 - 两者都有:累积未解决警告 → 强制处理 |
|
|
99
|
+
| 入口点太厚 | `entry_point_too_thick` | `thin-entry-points` | **ERROR (PY) / WARN (TS)** | Flask/Typer 命令应薄,TS 更宽容 |
|
|
100
|
+
|
|
101
|
+
**✅ v1.16.0: TypeScript 实现 shell_complexity_debt(DX-22 Fix-or-Explain)**
|
|
102
|
+
|
|
103
|
+
**Python 实现:**
|
|
104
|
+
- 单个 `shell_too_complex` = INFO(不阻塞)
|
|
105
|
+
- 累积 ≥5 个未解决 = 触发 `shell_complexity_debt` ERROR
|
|
106
|
+
- 解除:重构 OR 添加 `# @shell_complexity: <理由>`
|
|
107
|
+
|
|
108
|
+
**TypeScript 实现:**
|
|
109
|
+
- 单个 `shell-complexity` = WARN(不阻塞)
|
|
110
|
+
- 累积 ≥3 个未解决 = 触发 `shell-complexity-debt` ERROR
|
|
111
|
+
- 解除:重构 OR 添加 `// @shell_complexity: <理由>`
|
|
112
|
+
|
|
113
|
+
**差异点:阈值 5 vs 3**
|
|
114
|
+
- Python: 5(项目通常更大,Shell 函数更多)
|
|
115
|
+
- TypeScript: 3(项目通常更小,更严格防止技术债务)
|
|
116
|
+
|
|
117
|
+
**为什么复杂度是 WARN/INFO?**
|
|
118
|
+
1. **主观性:** 什么是"太复杂"因项目而异
|
|
119
|
+
- Web 框架的路由函数 vs CLI 工具的命令函数
|
|
120
|
+
- 复杂业务规则 vs 简单 CRUD
|
|
121
|
+
|
|
122
|
+
2. **渐进式改进:** 允许遗留代码渐进重构
|
|
123
|
+
- 新代码应简单,旧代码有改进空间
|
|
124
|
+
- ERROR 会阻塞所有开发,WARN 允许技术债务可见性
|
|
125
|
+
|
|
126
|
+
3. **启发式检测不完美:** 可能误报
|
|
127
|
+
- 长但简单的 if-elif 链(配置映射)
|
|
128
|
+
- 框架要求的模板代码
|
|
129
|
+
|
|
130
|
+
**为什么有 shell_complexity_debt 兜底?**
|
|
131
|
+
- 防止"破窗效应":WARN 太多 → 被忽略 → 代码质量下降
|
|
132
|
+
- DX-22 Fix-or-Explain 原则:允许复杂,但必须显式标记原因
|
|
133
|
+
|
|
134
|
+
---
|
|
135
|
+
|
|
136
|
+
### 5. 验证完整性规则 (Validation Completeness)
|
|
137
|
+
|
|
138
|
+
| 规则 | Python | TypeScript | 严重性 | 为什么这样设计? |
|
|
139
|
+
|------|--------|-----------|--------|------------------|
|
|
140
|
+
| Schema 验证缺失 | N/A | `require-schema-validation` | **ERROR** | 外部输入必须验证(Zod/AJV) |
|
|
141
|
+
| Schema 不完整 | N/A | `require-complete-validation` | **WARN** | 验证覆盖建议,不强制 |
|
|
142
|
+
| Schema 中有 any | N/A | `no-any-in-schema` | **WARN** | `any` 失去类型安全,建议避免 |
|
|
143
|
+
|
|
144
|
+
**为什么 Python 没有对应规则?**
|
|
145
|
+
- Python 用 `@pre` 契约做输入验证,已被 `missing_contract` 覆盖
|
|
146
|
+
- TypeScript 需要运行时验证(Zod schema),故需要专门规则
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
### 6. 其他规则
|
|
151
|
+
|
|
152
|
+
| 规则 | Python | TypeScript | 严重性 | 说明 |
|
|
153
|
+
|------|--------|-----------|--------|------|
|
|
154
|
+
| 内部 import | `internal_import` | N/A | **WARN** | 函数内 import = 代码味道 |
|
|
155
|
+
| @must_use 被忽略 | `must_use_ignored` | N/A | **WARN** | 返回值应被使用 |
|
|
156
|
+
| 缺少 doctest | `missing_doctest` | N/A | **WARN** | 建议添加示例 |
|
|
157
|
+
| 滥用 @skip | `skip_without_reason` | N/A | **WARN** | 跳过测试应有理由 |
|
|
158
|
+
| 建议审查 | `review_suggested` | N/A | **WARN** | 触发独立审查条件 |
|
|
159
|
+
| 禁止运行时导入 | N/A | `no-runtime-imports` | **ERROR** | TypeScript 特定 |
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## 设计哲学总结
|
|
164
|
+
|
|
165
|
+
### 三层严重性体系
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
ERROR (强制) 必须修复或显式豁免
|
|
169
|
+
↓ 架构边界、核心契约、绝对限制
|
|
170
|
+
WARN (建议) 应该修复,但不阻塞
|
|
171
|
+
↓ 代码质量、最佳实践、启发式检测
|
|
172
|
+
INFO (提示) 可选改进
|
|
173
|
+
↓ 代码味道、重构建议
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
### 什么是 ERROR?(4 个标准)
|
|
177
|
+
|
|
178
|
+
1. **违反架构边界** → 破坏系统设计
|
|
179
|
+
- Core 中有 I/O、Shell 不返回 Result
|
|
180
|
+
|
|
181
|
+
2. **缺少核心契约** → 无法验证正确性
|
|
182
|
+
- 缺少 @pre/@post 或 doctest
|
|
183
|
+
|
|
184
|
+
3. **运行时崩溃风险** → 可靠性问题
|
|
185
|
+
- 参数不匹配、@post 引用参数
|
|
186
|
+
|
|
187
|
+
4. **超过绝对限制** → 维护性红线
|
|
188
|
+
- 文件 >300 行、累积 ≥3 个复杂度债务
|
|
189
|
+
|
|
190
|
+
### 什么是 WARN?(3 个标准)
|
|
191
|
+
|
|
192
|
+
1. **代码质量问题** → 应该修复,但不紧急
|
|
193
|
+
- 函数太长、Shell 有纯逻辑
|
|
194
|
+
|
|
195
|
+
2. **最佳实践建议** → 提升代码可维护性
|
|
196
|
+
- 缺少 doctest、@skip 无理由
|
|
197
|
+
|
|
198
|
+
3. **启发式检测** → 可能误报
|
|
199
|
+
- `no-pure-logic-in-shell` 误报配置转换函数
|
|
200
|
+
|
|
201
|
+
### 什么是 INFO?(1 个标准)
|
|
202
|
+
|
|
203
|
+
1. **可选改进** → 不影响正确性或维护性
|
|
204
|
+
- 契约仅检查类型、单个 shell 复杂度
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## 为什么这样设计能说服你?
|
|
209
|
+
|
|
210
|
+
### 原因 1:平衡严格与灵活
|
|
211
|
+
|
|
212
|
+
**问题:** 如果所有规则都是 ERROR,会发生什么?
|
|
213
|
+
- ❌ 无法处理遗留代码(一次性重构成本过高)
|
|
214
|
+
- ❌ 阻塞正常开发(每个警告都阻塞 PR)
|
|
215
|
+
- ❌ 开发者绕过规则(添加大量 `@invar:allow`)
|
|
216
|
+
|
|
217
|
+
**解决方案:** 分层严重性
|
|
218
|
+
- ✅ ERROR:不可妥协的底线(架构、正确性)
|
|
219
|
+
- ✅ WARN:渐进式改进目标(质量、最佳实践)
|
|
220
|
+
- ✅ INFO:可选重构建议(代码味道)
|
|
221
|
+
|
|
222
|
+
### 原因 2:适配项目生命周期
|
|
223
|
+
|
|
224
|
+
| 阶段 | ERROR 作用 | WARN 作用 |
|
|
225
|
+
|------|-----------|-----------|
|
|
226
|
+
| **新项目** | 强制最佳实践 | 预防技术债务 |
|
|
227
|
+
| **成熟项目** | 防止倒退 | 识别改进机会 |
|
|
228
|
+
| **遗留代码** | 保护核心不变式 | 渐进重构路线图 |
|
|
229
|
+
|
|
230
|
+
**示例:Paralex 项目**
|
|
231
|
+
- `chat.actions.ts` 有 68 条语句(限制 20)
|
|
232
|
+
- 如果是 ERROR:必须立即重构(阻塞所有开发)
|
|
233
|
+
- 实际是 WARN:可见但不阻塞,团队可以计划重构
|
|
234
|
+
|
|
235
|
+
### 原因 3:防止规则疲劳
|
|
236
|
+
|
|
237
|
+
**心理学研究:**
|
|
238
|
+
- 太多 ERROR → 开发者麻木 → 忽略所有警告
|
|
239
|
+
- 精准 ERROR → 引起重视 → 认真对待
|
|
240
|
+
|
|
241
|
+
**Invar 设计:**
|
|
242
|
+
- 10 条 ERROR(Python)/ 8 条 ERROR(TypeScript)
|
|
243
|
+
- 每个都是真正重要的架构或正确性问题
|
|
244
|
+
- WARN 是改进建议,不制造心理压力
|
|
245
|
+
|
|
246
|
+
### 原因 4:DX-22 Fix-or-Explain 兜底
|
|
247
|
+
|
|
248
|
+
**问题:** WARN 会被忽略吗?
|
|
249
|
+
**解决:** `shell_complexity_debt` 机制
|
|
250
|
+
- 允许少量 WARN(<3 个未解决)
|
|
251
|
+
- 累积 ≥3 个 → 触发 ERROR
|
|
252
|
+
- 强制开发者:修复或添加 `# @shell_complexity: <理由>`
|
|
253
|
+
|
|
254
|
+
**效果:**
|
|
255
|
+
- 允许合理的复杂性(有理由)
|
|
256
|
+
- 防止无限累积技术债务
|
|
257
|
+
|
|
258
|
+
---
|
|
259
|
+
|
|
260
|
+
## 对 Paralex 项目的具体分析
|
|
261
|
+
|
|
262
|
+
### 当前状态
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
chat.actions.ts (1208 lines)
|
|
266
|
+
├─ sendMessage: 68 statements (limit 20) → WARN
|
|
267
|
+
├─ editMessage: 27 statements (limit 20) → WARN
|
|
268
|
+
└─ deleteMessage: ... → WARN
|
|
269
|
+
|
|
270
|
+
Guard 结果: PASS ✓ (0 errors, 3 warnings)
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### 为什么这是正确的?
|
|
274
|
+
|
|
275
|
+
1. **没有架构违反**
|
|
276
|
+
- ✅ Shell 函数都返回 ActionResult<T>(等价 Result)
|
|
277
|
+
- ✅ 没有 Core 中混入 I/O
|
|
278
|
+
- ✅ 所有外部输入都有 schema 验证
|
|
279
|
+
|
|
280
|
+
2. **复杂度是业务合理性**
|
|
281
|
+
- `sendMessage` 68 statements:处理消息、更新数据库、触发副作用
|
|
282
|
+
- 这是 Shell 编排的正常复杂度,不是逻辑复杂度
|
|
283
|
+
- 如果强制拆分,会降低可读性(编排逻辑分散)
|
|
284
|
+
|
|
285
|
+
3. **WARN 提供可见性**
|
|
286
|
+
- 团队知道这些函数复杂
|
|
287
|
+
- 可以计划重构(如果需要)
|
|
288
|
+
- 不阻塞当前功能开发
|
|
289
|
+
|
|
290
|
+
### 如果改为 ERROR 会怎样?
|
|
291
|
+
|
|
292
|
+
❌ **立即阻塞:**
|
|
293
|
+
- 无法合并任何 PR(guard 失败)
|
|
294
|
+
- 必须停下所有开发去重构
|
|
295
|
+
|
|
296
|
+
❌ **可能过度拆分:**
|
|
297
|
+
- 为了通过检查,强行拆分成多个小函数
|
|
298
|
+
- 编排逻辑分散,反而降低可读性
|
|
299
|
+
|
|
300
|
+
❌ **或者滥用豁免:**
|
|
301
|
+
```typescript
|
|
302
|
+
// @invar:allow shell-complexity: too hard to fix
|
|
303
|
+
export async function sendMessage(...) {
|
|
304
|
+
// 68 statements
|
|
305
|
+
}
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
### 正确的处理方式(当前)
|
|
309
|
+
|
|
310
|
+
✅ **认知技术债务:**
|
|
311
|
+
- Guard 报告 3 个 WARN
|
|
312
|
+
- 团队知道需要改进
|
|
313
|
+
|
|
314
|
+
✅ **计划重构:**
|
|
315
|
+
- 识别可提取的纯逻辑 → 移到 Core
|
|
316
|
+
- 识别可独立的副作用 → 拆分成辅助函数
|
|
317
|
+
|
|
318
|
+
✅ **不阻塞开发:**
|
|
319
|
+
- 继续开发新功能
|
|
320
|
+
- 渐进式改进(每次 PR 改进一点)
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
## 结论:现有设计是经过深思熟虑的
|
|
325
|
+
|
|
326
|
+
### Python Guard: 10 ERROR + 9 WARN + 2 INFO ✅
|
|
327
|
+
|
|
328
|
+
**强制(ERROR):**
|
|
329
|
+
- 架构边界(3 条)
|
|
330
|
+
- 核心契约(4 条)
|
|
331
|
+
- 绝对限制(2 条)
|
|
332
|
+
- 债务累积(1 条)
|
|
333
|
+
|
|
334
|
+
**建议(WARN):**
|
|
335
|
+
- 代码质量(6 条)
|
|
336
|
+
- 最佳实践(3 条)
|
|
337
|
+
|
|
338
|
+
### TypeScript Guard: 7 ERROR + 8 WARN ✅ (v1.16.0 已更新)
|
|
339
|
+
|
|
340
|
+
**强制(ERROR):**
|
|
341
|
+
- 架构边界(2 条)
|
|
342
|
+
- 核心契约(3 条)
|
|
343
|
+
- 绝对限制(1 条:max-file-lines)
|
|
344
|
+
- 运行时安全(1 条:no-runtime-imports)
|
|
345
|
+
|
|
346
|
+
**建议(WARN):**
|
|
347
|
+
- 代码质量(5 条:含 max-function-lines)
|
|
348
|
+
- 最佳实践(3 条)
|
|
349
|
+
|
|
350
|
+
**项目级 ERROR(自动触发):**
|
|
351
|
+
- shell-complexity-debt(累积 ≥3 个复杂度 WARN)
|
|
352
|
+
|
|
353
|
+
### ✅ v1.16.0 已完成的对齐
|
|
354
|
+
|
|
355
|
+
1. **✅ TS `max-function-lines`:ERROR → WARN**
|
|
356
|
+
- 与 Python `function_size` 对齐
|
|
357
|
+
- 允许合理的长组件(JSX 声明性代码)
|
|
358
|
+
- 已在 v1.16.0 实现
|
|
359
|
+
|
|
360
|
+
2. **✅ TS `shell-complexity-debt` 机制**
|
|
361
|
+
- 实现 DX-22 Fix-or-Explain 原则
|
|
362
|
+
- 累积 ≥3 个未解决复杂度 WARN → ERROR
|
|
363
|
+
- 支持 `// @shell_complexity: <理由>` 标记
|
|
364
|
+
- 已在 v1.16.0 实现
|
|
365
|
+
|
|
366
|
+
### 未来可能的微调
|
|
367
|
+
|
|
368
|
+
1. **TS `shell-result-type`:WARN → ERROR(未来)**
|
|
369
|
+
- 当 TypeScript 项目普遍采用 Result 类型后
|
|
370
|
+
- 当前 WARN 是渐进式采用策略
|
|
371
|
+
|
|
372
|
+
### 最终回答你的问题
|
|
373
|
+
|
|
374
|
+
**"为什么 paralex 有超大文件但 guard pass?"**
|
|
375
|
+
|
|
376
|
+
✅ **因为 shell-complexity 是 WARN,不是 ERROR,这是正确的设计**
|
|
377
|
+
|
|
378
|
+
**理由:**
|
|
379
|
+
1. 复杂度阈值主观,业务编排合理复杂度存在
|
|
380
|
+
2. 启发式检测可能误报,不应阻塞开发
|
|
381
|
+
3. WARN 提供可见性,支持渐进式改进
|
|
382
|
+
4. 如果累积 ≥3 个,`shell_complexity_debt` 会强制处理
|
|
383
|
+
|
|
384
|
+
**你应该做什么?**
|
|
385
|
+
- 现在:继续开发,WARN 不阻塞
|
|
386
|
+
- 稍后:识别可提取的纯逻辑,移到 Core
|
|
387
|
+
- 或者:添加 `# @shell_complexity: <理由>` 标记
|
|
388
|
+
|
|
389
|
+
**这是功能,不是 bug!** ✅
|
|
@@ -159,11 +159,13 @@ def text_with_pattern(
|
|
|
159
159
|
)
|
|
160
160
|
noise_lines = st.lists(noise_line, min_size=0, max_size=10)
|
|
161
161
|
|
|
162
|
+
# Note: Hypothesis will automatically explore different orderings of the lines,
|
|
163
|
+
# so explicit shuffling is unnecessary. The concatenation order is sufficient.
|
|
162
164
|
return st.builds(
|
|
163
165
|
lambda p, n: "\n".join(p + n),
|
|
164
166
|
pattern_lines,
|
|
165
167
|
noise_lines,
|
|
166
|
-
)
|
|
168
|
+
)
|
|
167
169
|
|
|
168
170
|
|
|
169
171
|
@pre(lambda pattern: len(pattern) > 0)
|
|
@@ -24,6 +24,11 @@ def _validate_path(path: str) -> tuple[bool, str]:
|
|
|
24
24
|
|
|
25
25
|
Returns (is_valid, error_message).
|
|
26
26
|
Rejects paths that could be interpreted as shell commands or flags.
|
|
27
|
+
|
|
28
|
+
Note: This validation is for MCP (Model Context Protocol) handlers, which
|
|
29
|
+
are designed to provide AI agents with access to the project filesystem.
|
|
30
|
+
We validate format and reject shell injection patterns, but do not restrict
|
|
31
|
+
to working directory (unlike CLI tools) since MCP is a trusted local protocol.
|
|
27
32
|
"""
|
|
28
33
|
if not path:
|
|
29
34
|
return True, "" # Empty path defaults to "." in handlers
|
|
@@ -38,9 +43,13 @@ def _validate_path(path: str) -> tuple[bool, str]:
|
|
|
38
43
|
if char in path:
|
|
39
44
|
return False, f"Invalid path: contains forbidden character: {char!r}"
|
|
40
45
|
|
|
41
|
-
#
|
|
46
|
+
# Resolve path to canonical form, following symlinks
|
|
47
|
+
# This ensures path is valid and catches directory traversal attempts
|
|
42
48
|
try:
|
|
43
49
|
Path(path).resolve()
|
|
50
|
+
# Note: We don't restrict to cwd here because MCP handlers are designed
|
|
51
|
+
# to access the full project. If path restriction is needed, implement
|
|
52
|
+
# at the MCP server level, not per-handler.
|
|
44
53
|
except (OSError, ValueError) as e:
|
|
45
54
|
return False, f"Invalid path: {e}"
|
|
46
55
|
|