pactkit 2.14.2__tar.gz → 2.15.1__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.
- {pactkit-2.14.2 → pactkit-2.15.1}/CHANGELOG.md +19 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/PKG-INFO +21 -1
- {pactkit-2.14.2 → pactkit-2.15.1}/README.md +17 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/architecture/governance/archive/lessons_archive_202603.md +1 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/architecture/governance/lessons.md +1 -1
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/architecture/governance/rules.md +1 -1
- pactkit-2.15.1/docs/product/archive/archive_202606.md +37 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/product/context.md +2 -2
- pactkit-2.15.1/docs/specs/STORY-slim-128.md +157 -0
- pactkit-2.15.1/docs/specs/STORY-slim-129.md +134 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/pyproject.toml +5 -2
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/__init__.py +1 -1
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/config.py +1 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/generators/deploy_base.py +6 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/generators/deployer.py +29 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/prompts/commands.py +18 -2
- pactkit-2.15.1/src/pactkit/prompts/guides.py +657 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/prompts/rules.py +67 -3
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/schemas.py +2 -1
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/spec_linter.py +1 -1
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_config.py +2 -2
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_prompt_structural_invariants.py +2 -2
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_selective_deploy.py +2 -2
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story042_spec_linter.py +42 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story063_prompt_slimming.py +2 -1
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim010_dry_refactor.py +0 -31
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim011_command_rules.py +2 -2
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim021.py +3 -3
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim026.py +2 -2
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim032.py +4 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim033.py +4 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim034.py +4 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim112_rules_split.py +8 -7
- pactkit-2.15.1/tests/unit/test_story_slim128_engineering_concerns.py +201 -0
- pactkit-2.14.2/.opencode/pactkit.yaml +0 -23
- pactkit-2.14.2/docs/product/archive/archive_202606.md +0 -17
- {pactkit-2.14.2 → pactkit-2.15.1}/.codegraph/.gitignore +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/.github/workflows/pactkit.yml +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/.github/workflows/publish.yml +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/.gitignore +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/AGENTS.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/CODE_OF_CONDUCT.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/CONTRIBUTING.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/LICENSE +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/SECURITY.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/architecture/governance/harness_audit.json +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/architecture/governance/philosophy.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/assets/logo.png +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/e2e/journey.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/guides/codex-integration-preresearch.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/guides/tool-integration-checklist.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/product/archive/archive_202602.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/product/archive/archive_202603.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/product/archive/archive_202604.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/product/archive/archive_202605.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/product/friction-log.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/product/prd.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/product/sprint_board.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-001.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-002.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-003.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-004.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-005.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-006.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-007.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-008.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-009.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-010.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-011.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-012.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-013.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-014.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-015.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-016.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-017.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-018.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-019.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-020.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-021.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-022.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-023.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-024.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-025.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-026.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-027.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-028.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-029.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-030.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-031.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-032.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-033.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-034.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-035.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-slim-001.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-slim-002.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-slim-003.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-slim-004.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-slim-005.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-slim-006.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-slim-089.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-slim-107.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-023.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-049.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-050.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-051.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-052.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-061.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-062.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-067.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-069.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-070.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-085.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-087.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-096.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-099.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-107.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-117.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-122.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-123.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-126.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-127.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-001.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-002.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-003.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-004.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-005.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-006.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-007.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-008.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-009.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-010.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-011.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-012.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-013.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-014.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-015.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-016.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-017.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-018.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-019.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-020.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-021.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-022.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-023.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-024.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-025.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-026.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-027.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-028.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-029.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-030.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-031.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-032.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-033.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-034.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-035.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-036.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-037.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-038.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-039.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-040.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-041.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-042.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-043.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-044.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-045.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-046.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-047.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-048.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-049.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-050.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-051.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-052.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-053.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-054.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-055.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-056.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-057.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-058.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-059.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-060.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-061.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-062.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-063.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-064.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-065.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-069.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-070.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-071.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-072.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-073.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-001.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-005.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-006.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-007.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-009.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-010.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-011.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-012.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-013.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-014.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-015.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-016.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-017.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-018.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-019.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-020.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-021.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-022.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-023.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-024.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-028.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-029.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-030.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-031.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-032.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-033.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-034.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-035.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-036.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-037.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-038.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-039.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-040.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-041.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-042.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-043.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-044.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-045.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-046.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-047.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-048.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-049.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-050.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-051.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-052.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-053.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-054.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-055.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-056.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-057.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-058.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-059.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-060.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-063.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-066.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-067.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-068.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-069.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-070.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-071.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-072.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-073.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-074.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-075.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-076.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-077.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-078.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-079.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-080.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-081.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-082.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-083.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-084.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-086.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-088.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-089.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-090.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-091.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-092.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-093.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-094.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-095.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-097.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-098.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-099.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-100.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-101.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-102.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-103.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-104.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-105.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-106.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-107.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-108.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-109.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-110.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-111.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-112.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-113.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-114.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-115.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-116.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-118.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-119.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-120.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-121.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-124.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-125.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-126.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-127.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/test_cases/BUG-001_case.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/test_cases/BUG-002_case.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/test_cases/STORY-slim-028_case.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/test_cases/STORY-slim-029_case.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/test_cases/STORY-slim-031_case.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/test_cases/STORY-slim-032_case.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/test_cases/STORY-slim-033_case.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/docs/test_cases/STORY-slim-034_case.md +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/opencode.json +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/__main__.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/audit.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/backfill.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/cleaners.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/cli.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/context_gen.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/coverage_gate.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/doctor.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/garden.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/generators/__init__.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/generators/adapter.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/guards.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/id_generator.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/invariants.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/issue_sync.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/lazy_visualize.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/lessons.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/lint_runner.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/observe.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/profiles.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/prompts/__init__.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/prompts/agents.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/prompts/references.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/prompts/skills.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/prompts/workflows.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/regression.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/scripts.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/sec_scope.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/__init__.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/analyzers/__init__.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/board.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/interface_summary.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/report.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/scaffold.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/visualize.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/spec_status.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/test_mapper.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/utils.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/validators.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/conftest.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/e2e/__init__.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/e2e/cli/__init__.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/e2e/cli/test_cli_e2e.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/fixtures/api_call_parser/page.tsx +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/integration/__init__.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/integration/test_deploy_classic.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_agent_features.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_agent_frontmatter.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_agents_enrichment.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_audit.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_blast_radius.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_board_bug027.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_board_sections.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug001_skill_path.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug002_plugin_paths.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug003_multi_import.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug004_dead_set.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug005_archive_taskless.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug006_scan_excludes.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug008_stale_command_refs.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug009_project_config_backfill.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug011_stale_refs.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug012_call_graph_filter.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug013_config_single_source.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug014_version_hygiene.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug017_project_init_playbook.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug019_venv_deployment.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug020_claude_md_backup.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug025_release_delegation.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug026_version_sync.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug028_ghost_refs.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_021.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_022.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_023.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_024.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_slim001_env_detection.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_slim003.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_slim004.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_slim005.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_slim006.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_check_command.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_check_extensions_072_073.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_check_playbook_072_073.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_command_frontmatter.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_command_visualize_modes.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_complexity.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_config_auto_merge.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_constitution_sharpening.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_context_gen.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_create_skill.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_cross_flow_matrix.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_deploy_base.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_deployer_cleanup.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_deployer_plugin.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_design_command.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_done_gates.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_draw_prompt.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_draw_references.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_drawio_mcp.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_garden.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_home_path_fix.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_hotfix_command.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_init_guard.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_init_playbook_074.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_interface_summary.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_lang_profiles.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_layer_violations.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_lessons_rotation_075.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_list_stories.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_mcp_integration.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_model_config.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_modular_constitution.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_monorepo_detect.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_multi_prefix.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_observe.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_pdca_slim.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_profiles.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_project_visibility.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_prompt_cli_refs.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_prompt_quality_075.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_prompts_package.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_release.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_release_field.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_release_v110.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_render_prompt.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_report_parser.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_report_unified.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_review_command.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_rules_enrichment.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_scaffold.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_scaffold_developer_prefix.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_schemas.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_script_extraction.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_session_context.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_skill_structure.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_skills_enrichment.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_slim_deps_088.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_smart_regression.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_solution_design_rule.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_sprint_command.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_stack_references.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_status_command.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_statusline.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story014_release.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story015_ci_lint_gate.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story016_claude_md.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story017_init_claude_md.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story018_arch_staleness.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story019_bailout.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story020_horizon.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story021_rfc.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story022_decision_tree.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story023_test_quality.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story024_native_agent.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story025_ci_pipeline.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story026_issue_tracker.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story028_rule_scoping.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story029_doctor.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story030_lint.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story031_git_init_guard.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story032_greenfield_redirect.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story033_config_backfill.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story034_plan_config_refresh.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story035_readme_docs.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story037_regression_fix.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story038_call_graph_update.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story039_venv_config.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story040_layered_claude_md.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story043_active_clarify.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story044_consistency_check.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story045_auto_pr.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story046_agent_adapter.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story047_enterprise_flags.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story048_worktree_isolation.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story049_community_standards.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story051_workflow_streamlining.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story052_conditional_github_release.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story053_impact_regression.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story055_commands.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story055_config.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story055_spec_linter.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story056_commands.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story056_config.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story057_implicit_cleanup.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story058_opencode_extraction.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story058_routing_fix.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story059_codex_removal.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story060_init_hang.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story061_remove_thinking.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story062_mcp_recommendations.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story064_venv_local_md.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story065_sprint_model.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story072_developer_prefix.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story106_lateral_scan.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim012_ci.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim014_clean.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim014_context.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim014_guard.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim014_next_id.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim014_regression.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim014_sec_scope.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim014_validators.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim015_doctor.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim017.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim018.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim022.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim023.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim024.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim025.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim027.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim028.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim029.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim030.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim031.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim035.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim036.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim037.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim038.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim039.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim040.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim041.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim042.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim043.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim044.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim045.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim046.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim047.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim048.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim049.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim051.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim052.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim053.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim054.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim055.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim056.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim060_codex_profile.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim063.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim065.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim076_multistack.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim078.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim079.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim080.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim081.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim082.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim083.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim084.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim095.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim102_version_marker.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim104_should_semantics.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim107.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim109_journey_spec.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim111_playwright_assertion.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim114_journey_sync.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim119.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim120.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim121.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim125.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim126.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim127_managed_block.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_tools.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_topology_parsers_066.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_update_task.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_visualize_call_nested.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_visualize_chain_fix.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_visualize_modes.py +0 -0
- {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_visualize_multilang_chain.py +0 -0
|
@@ -4,6 +4,25 @@ All notable changes to PactKit will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
Format follows [Keep a Changelog](https://keepachangelog.com/).
|
|
6
6
|
|
|
7
|
+
## [2.15.1] - 2026-06-10
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- **Engineering Concerns guide system** (STORY-slim-128) — On-demand NFR guide loading via trigger index. Plan Phase 2 scans requirement keywords and includes NFR decisions in Spec; Act Phase 1.5 loads matched guides (1-3 max). Initial 13 concerns: concurrency, async, configuration, observability, module-design, database, caching, api-integration, event-driven, resilience, memory-management, code-review-first, component-reuse.
|
|
11
|
+
- **6 additional engineering guides** (STORY-slim-129) — error-recovery (retry/backoff/idempotency), data-consistency (transactions/saga/optimistic lock), backwards-compatibility (API versioning/non-breaking migration), performance-antipatterns (N+1/unbounded queries/indexing), graceful-shutdown (SIGTERM/drain/cleanup order), testing-strategy (boundary/mock vs real/isolation). Total: 19 guides.
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
- **Spec linter** — Accept heading format for Security Scope `SEC-*` entries.
|
|
15
|
+
- **CI** — Remove obsolete `.opencode/pactkit.yaml` test.
|
|
16
|
+
|
|
17
|
+
## [2.15.0] - 2026-06-04
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
- **`lint` optional dependency group** — `pip install pactkit[lint]` now includes `ruff>=0.4`. The `all` extra also includes `lint`. Users no longer need to install ruff separately for the lint gate to work.
|
|
21
|
+
- **External tools documentation** — README and pactkit.dev installation pages now document recommended external tools (gh, codegraph) with install commands and fallback behavior.
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
- **CI: tree-sitter tests skip when not installed** — `test_story_slim032`, `test_story_slim033`, `test_story_slim034` now use `pytest.importorskip("tree_sitter")` so they skip gracefully in CI environments without the `visualize` extra.
|
|
25
|
+
|
|
7
26
|
## [2.14.2] - 2026-06-01
|
|
8
27
|
|
|
9
28
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pactkit
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.15.1
|
|
4
4
|
Summary: Spec-driven agentic DevOps toolkit for AI coding assistants
|
|
5
5
|
Project-URL: Homepage, https://pactkit.dev
|
|
6
6
|
Project-URL: Repository, https://github.com/pactkit/pactkit-public
|
|
@@ -25,12 +25,15 @@ Requires-Dist: pyyaml>=6.0
|
|
|
25
25
|
Provides-Extra: all
|
|
26
26
|
Requires-Dist: pactkit-codex>=2.9.0; extra == 'all'
|
|
27
27
|
Requires-Dist: pactkit-opencode>=2.9.0; extra == 'all'
|
|
28
|
+
Requires-Dist: ruff>=0.4; extra == 'all'
|
|
28
29
|
Requires-Dist: tree-sitter-go>=0.25; extra == 'all'
|
|
29
30
|
Requires-Dist: tree-sitter-java>=0.23; extra == 'all'
|
|
30
31
|
Requires-Dist: tree-sitter-typescript>=0.23; extra == 'all'
|
|
31
32
|
Requires-Dist: tree-sitter>=0.25; extra == 'all'
|
|
32
33
|
Provides-Extra: codex
|
|
33
34
|
Requires-Dist: pactkit-codex>=2.9.0; extra == 'codex'
|
|
35
|
+
Provides-Extra: lint
|
|
36
|
+
Requires-Dist: ruff>=0.4; extra == 'lint'
|
|
34
37
|
Provides-Extra: opencode
|
|
35
38
|
Requires-Dist: pactkit-opencode>=2.9.0; extra == 'opencode'
|
|
36
39
|
Provides-Extra: visualize
|
|
@@ -117,6 +120,23 @@ Requires Python 3.10+ and one of:
|
|
|
117
120
|
|
|
118
121
|
> `pip install pactkit` automatically installs adapters for all 3 IDEs.
|
|
119
122
|
|
|
123
|
+
### Optional Extras
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
pip install pactkit[lint] # Includes ruff for lint gate
|
|
127
|
+
pip install pactkit[visualize] # Includes tree-sitter for AST analysis
|
|
128
|
+
pip install pactkit[all] # Everything above + IDE adapters
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Recommended External Tools
|
|
132
|
+
|
|
133
|
+
These tools enhance PactKit but cannot be distributed via pip:
|
|
134
|
+
|
|
135
|
+
| Tool | Purpose | Install |
|
|
136
|
+
|------|---------|---------|
|
|
137
|
+
| [gh](https://cli.github.com) | GitHub CLI (issue sync, release, PR) | `brew install gh` |
|
|
138
|
+
| [codegraph](https://www.npmjs.com/package/codegraph) | Code symbol index & call chain analysis | `npm install -g codegraph` |
|
|
139
|
+
|
|
120
140
|
## Quick Start
|
|
121
141
|
|
|
122
142
|
```bash
|
|
@@ -75,6 +75,23 @@ Requires Python 3.10+ and one of:
|
|
|
75
75
|
|
|
76
76
|
> `pip install pactkit` automatically installs adapters for all 3 IDEs.
|
|
77
77
|
|
|
78
|
+
### Optional Extras
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
pip install pactkit[lint] # Includes ruff for lint gate
|
|
82
|
+
pip install pactkit[visualize] # Includes tree-sitter for AST analysis
|
|
83
|
+
pip install pactkit[all] # Everything above + IDE adapters
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Recommended External Tools
|
|
87
|
+
|
|
88
|
+
These tools enhance PactKit but cannot be distributed via pip:
|
|
89
|
+
|
|
90
|
+
| Tool | Purpose | Install |
|
|
91
|
+
|------|---------|---------|
|
|
92
|
+
| [gh](https://cli.github.com) | GitHub CLI (issue sync, release, PR) | `brew install gh` |
|
|
93
|
+
| [codegraph](https://www.npmjs.com/package/codegraph) | Code symbol index & call chain analysis | `npm install -g codegraph` |
|
|
94
|
+
|
|
78
95
|
## Quick Start
|
|
79
96
|
|
|
80
97
|
```bash
|
{pactkit-2.14.2 → pactkit-2.15.1}/docs/architecture/governance/archive/lessons_archive_202603.md
RENAMED
|
@@ -63,3 +63,4 @@
|
|
|
63
63
|
| 2026-03-26 | test_story_slim056.py _init_project() helper creates realistic pactkit project fixture for subprocess E2E tests; 60 tests cover all 25 subcommands | test_story_slim056.py:_init_project |
|
|
64
64
|
| 2026-03-26 | entry_points auto-discovery with _load_entry_point_deployers() enables pip install pactkit-opencode to self-register; pre-existing tests referencing extracted functions must be updated to import from adapter package | deployer.py:_load_entry_point_deployers |
|
|
65
65
|
| 2026-03-26 | VALID_FORMATS auto-derives from FORMAT_PROFILES.keys() — removing a profile cascades to config, CLI, and deployer with zero manual sync | profiles.py:FORMAT_PROFILES |
|
|
66
|
+
| 2026-03-26 | DeployerBase static methods use lazy imports to avoid circular dependencies between deploy_base.py and deployer.py | deploy_base.py:DeployerBase.render_prompt |
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
| Date | Lesson | Context |
|
|
4
4
|
|------|--------|---------|
|
|
5
|
-
| 2026-03-26 | DeployerBase static methods use lazy imports to avoid circular dependencies between deploy_base.py and deployer.py | deploy_base.py:DeployerBase.render_prompt |
|
|
6
5
|
| 2026-03-26 | Thin adapter conversion: pactkit-codex reduced from 15,356 lines (full fork) to 668 lines (thin adapter) by importing core via DeployerBase. Key: deploy_codex_playbooks needs explicit path replacement for ALL format prefixes (~/.claude/, ~/.config/opencode/ → ~/.codex/) | pactkit_codex/deployer.py:deploy_codex_playbooks |
|
|
7
6
|
| 2026-03-27 | When migrating commands to skills (subdir/SKILL.md format), all path assertions in pre-existing tests must be updated in the same commit — 17 tests broke because they asserted flat commands/*.md paths | deployer.py:_deploy_commands |
|
|
8
7
|
| 2026-03-30 | Frontend API path convention bugs are structurally preventable: ApiCallParser+api_convention_summary in trace phase surfaces prefix/wrapper conventions before implementation, eliminating a class of copy-paste path errors | visualize.py:ApiCallParser |
|
|
@@ -53,3 +52,4 @@
|
|
|
53
52
|
| 2026-05-26 | SKILL.md model: frontmatter is passed through by deployer without transformation — source prompts in commands.py/workflows.py are the single source of truth for deployed skill metadata | commands.py:COMMANDS_CONTENT |
|
|
54
53
|
| 2026-06-01 | codegraph sync must be enforced by code (pactkit visualize/sync), not by prompt instructions — prompt-only enforcement is unreliable for deterministic operations | lazy_visualize.py:codegraph_sync |
|
|
55
54
|
| 2026-06-01 | Managed-block pattern (start/end markers + regex replace) is the canonical way to update mixed-ownership files — same pattern for CLAUDE.md and CLAUDE.local.md | deployer.py:_upsert_claude_md_managed_block |
|
|
55
|
+
| 2026-06-10 | Engineering guides are additive: new GUIDES_FILES entries auto-deploy via _deploy_guides() without deployer changes. Test impact limited to count assertions in test_story_slim128. | src/pactkit/prompts/guides.py:GUIDES_FILES |
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
## Invariants
|
|
17
17
|
|
|
18
|
-
1. All
|
|
18
|
+
1. All 4023+ tests must pass before any commit to `main`.
|
|
19
19
|
2. Specs (`docs/specs/`) are the source of truth — code conforms to specs, not the reverse.
|
|
20
20
|
3. CLI entry point is `pactkit` via `src/pactkit/cli.py:main`.
|
|
21
21
|
4. No runtime dependencies beyond `pyyaml`.
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
|
|
2
|
+
### [STORY-slim-126] codegraph sync code enforcement
|
|
3
|
+
> Spec: docs/specs/STORY-slim-126.md
|
|
4
|
+
|
|
5
|
+
- [x] Add codegraph_sync() function
|
|
6
|
+
- [x] Integrate into visualize path
|
|
7
|
+
- [x] Add pactkit sync subcommand
|
|
8
|
+
- [x] Remove prompt instructions
|
|
9
|
+
- [x] Unit tests
|
|
10
|
+
|
|
11
|
+
### [STORY-slim-127] project CLAUDE.md managed-block update
|
|
12
|
+
> Spec: docs/specs/STORY-slim-127.md
|
|
13
|
+
|
|
14
|
+
- [x] Add marker constants
|
|
15
|
+
- [x] Extract managed content builder
|
|
16
|
+
- [x] Rewrite _generate_project_claude_md with upsert
|
|
17
|
+
- [x] Unit tests
|
|
18
|
+
|
|
19
|
+
### [STORY-slim-129] Engineering Concerns Guide Expansion — 6 Additional NFR Guides
|
|
20
|
+
> Spec: docs/specs/STORY-slim-129.md
|
|
21
|
+
|
|
22
|
+
- [x] Add 6 guide files to guides.py
|
|
23
|
+
- [x] Update trigger index in rules.py
|
|
24
|
+
- [x] Update test expectations 13→19
|
|
25
|
+
- [x] Verify deployment
|
|
26
|
+
|
|
27
|
+
### [STORY-slim-128] Engineering Concerns: Guide-based NFR enforcement
|
|
28
|
+
> Spec: docs/specs/STORY-slim-128.md
|
|
29
|
+
|
|
30
|
+
- [x] Create guides.py with 13 guide contents
|
|
31
|
+
- [x] Add trigger index to rules.py
|
|
32
|
+
- [x] Extend deployer for guides/ subdirectory
|
|
33
|
+
- [x] Enhance plan Phase 2 with NFR assessment
|
|
34
|
+
- [x] Enhance act Phase 1.5 with guide loading
|
|
35
|
+
- [x] Config registration + COMMAND_RULES_MAP
|
|
36
|
+
- [x] Multi-format parity
|
|
37
|
+
- [x] Unit tests
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Project Context (Auto-generated)
|
|
2
|
-
> Last updated: 2026-06-
|
|
2
|
+
> Last updated: 2026-06-10T11:17:05+08:00 by pactkit context
|
|
3
3
|
|
|
4
4
|
## Sprint Status
|
|
5
5
|
Backlog: 3 | In Progress: 0 | Done: 0 stories
|
|
@@ -16,11 +16,11 @@ None
|
|
|
16
16
|
* main
|
|
17
17
|
|
|
18
18
|
## Key Decisions
|
|
19
|
-
- When SCAN_EXCLUDES is a module-level constant shared across graph modes, add mode-specific exclusion logic at the call site rather than modifying the constant — pass call_extra_excludes = SCAN_EXCLUDES - {'tests'} only for call mode to avoid affecting file/class modes
|
|
20
19
|
- _write_sqlite_db reuses func_registry and rel_edges already in memory from _build_call_graph — no second AST scan; pactkit query reads db directly without touching pactkit.yaml
|
|
21
20
|
- SKILL.md model: frontmatter is passed through by deployer without transformation — source prompts in commands.py/workflows.py are the single source of truth for deployed skill metadata
|
|
22
21
|
- codegraph sync must be enforced by code (pactkit visualize/sync), not by prompt instructions — prompt-only enforcement is unreliable for deterministic operations
|
|
23
22
|
- Managed-block pattern (start/end markers + regex replace) is the canonical way to update mixed-ownership files — same pattern for CLAUDE.md and CLAUDE.local.md
|
|
23
|
+
- Engineering guides are additive: new GUIDES_FILES entries auto-deploy via _deploy_guides() without deployer changes. Test impact limited to count assertions in test_story_slim128.
|
|
24
24
|
|
|
25
25
|
## Next Recommended Action
|
|
26
26
|
`/project-plan`
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
# STORY-slim-128: Engineering Concerns: Guide-based NFR enforcement
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-128 |
|
|
6
|
+
| Status | Draft |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.16.0 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
LLM 编程时系统性缺失非功能性需求(NFR)考量:并发模型、超时策略、缓存一致性、内存管理等。
|
|
13
|
+
现有 PactKit 规则体系中,`06-solution-design.md` 只覆盖"复用已有组件",缺乏对其他 12 类工程关注点的引导。
|
|
14
|
+
|
|
15
|
+
核心矛盾:如果把所有 NFR 规则放入常驻 prompt,context 膨胀导致注意力衰减;如果不放,LLM 就忽略它们。
|
|
16
|
+
|
|
17
|
+
解决方案:**按需加载的指南系统** — 一个轻量触发索引(常驻,~40行)+ 13 个精炼指南文件(按需加载,每个 <50 行)。
|
|
18
|
+
Plan 阶段:根据需求关键词强制回答 NFR 决策问题(写入 Spec)。
|
|
19
|
+
Act 阶段:根据 Spec 中标注的 concerns,动态加载对应指南作为实现约束。
|
|
20
|
+
|
|
21
|
+
### 调用链
|
|
22
|
+
```
|
|
23
|
+
rules.py (RULES_MODULES["engineering"]) → deployer._deploy_rules() → ~/.claude/skills/_rules/07-engineering-concerns.md
|
|
24
|
+
rules.py (GUIDES_FILES) → deployer._deploy_guides() → ~/.claude/skills/_rules/guides/*.md
|
|
25
|
+
commands.py (plan Phase 2 扩展) → deployed SKILL.md
|
|
26
|
+
commands.py (act Phase 1.5 扩展) → deployed SKILL.md
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Requirements
|
|
30
|
+
|
|
31
|
+
### R1: Trigger Index Rule (MUST)
|
|
32
|
+
|
|
33
|
+
新增 `RULES_MODULES["engineering"]` 和 `RULES_ONDEMAND_FILES["engineering"]`,部署为 `07-engineering-concerns.md`。
|
|
34
|
+
内容为触发索引表(~40行):列出关键词→concern 映射,以及 concern→guide 文件的路由表。
|
|
35
|
+
此文件通过 `@import` 被 plan/act 命令加载。
|
|
36
|
+
|
|
37
|
+
### R2: Guides Deployment Mechanism (MUST)
|
|
38
|
+
|
|
39
|
+
在 `deployer.py` 中新增 `_deploy_guides()` 函数,将 13 个精炼指南文件部署到 `~/.claude/skills/_rules/guides/` 目录。
|
|
40
|
+
所有 format 均需支持:Claude Code(文件部署)、OpenCode(inline 或文件)、Codex(文件)、Copilot(文件)。
|
|
41
|
+
指南文件源定义在新文件 `src/pactkit/prompts/guides.py` 中(避免 `rules.py` 过长)。
|
|
42
|
+
|
|
43
|
+
### R3: Guides Content — 13 Engineering Guides (MUST)
|
|
44
|
+
|
|
45
|
+
每个指南文件 < 50 行,格式统一:决策表 + MUST 清单 + NEVER 清单 + 代码模板。
|
|
46
|
+
覆盖:concurrency、async-patterns、configuration、observability、module-design、database、caching、api-integration、event-driven、resilience、memory-management、code-review-first、component-reuse。
|
|
47
|
+
|
|
48
|
+
### R4: Plan Command Enhancement (MUST)
|
|
49
|
+
|
|
50
|
+
`project-plan` Phase 2 新增 "Engineering Concerns Assessment" 步骤:
|
|
51
|
+
- 扫描需求关键词(定时/API/数据库/缓存/事件/并发等)
|
|
52
|
+
- 匹配到的 concern → Spec 的 Technical Design 中 MUST 包含对应 NFR 决策
|
|
53
|
+
- 未匹配 → 不强制(避免噪音)
|
|
54
|
+
|
|
55
|
+
### R5: Act Command Enhancement (MUST)
|
|
56
|
+
|
|
57
|
+
`project-act` 新增 Phase 1.5 "Engineering Concerns Loading":
|
|
58
|
+
- 读取 Spec 的 Technical Design → 识别标注的 engineering concerns
|
|
59
|
+
- 加载对应的指南文件(`read` 指令)
|
|
60
|
+
- MUST 只加载相关的 1-3 个,NEVER 全部加载
|
|
61
|
+
|
|
62
|
+
### R6: Config Integration (SHOULD)
|
|
63
|
+
|
|
64
|
+
在 `VALID_RULES` 中注册 `"07-engineering-concerns"`。
|
|
65
|
+
在 `COMMAND_RULES_MAP` 中为 `project-plan` 和 `project-act` 添加 `"engineering"` key。
|
|
66
|
+
支持通过 `pactkit.yaml` 的 `rules` 配置项禁用。
|
|
67
|
+
|
|
68
|
+
### R7: Multi-format Parity (MUST)
|
|
69
|
+
|
|
70
|
+
OpenCode、Codex、Copilot 格式均需部署 guides 内容:
|
|
71
|
+
- OpenCode/Codex:作为独立文件部署到对应 rules 目录,或 inline 嵌入
|
|
72
|
+
- Copilot:写入对应的 prompt 文件中(copilot 不支持动态文件引用,需 inline)
|
|
73
|
+
- 各格式 plan/act playbook 均需包含 engineering concerns phase
|
|
74
|
+
|
|
75
|
+
## Acceptance Criteria
|
|
76
|
+
|
|
77
|
+
### AC1: Trigger Index Deployed (R1, R6)
|
|
78
|
+
|
|
79
|
+
- **Given** PactKit 已安装,用户运行 `pactkit init`
|
|
80
|
+
- **When** deployer 执行 classic format 部署
|
|
81
|
+
- **Then** `~/.claude/skills/_rules/07-engineering-concerns.md` 文件存在,内容包含关键词→concern 映射表和 concern→guide 路由表
|
|
82
|
+
|
|
83
|
+
### AC2: All 13 Guides Deployed (R2, R3)
|
|
84
|
+
|
|
85
|
+
- **Given** 用户运行 `pactkit init` 或 `pactkit update`
|
|
86
|
+
- **When** deployer 执行部署
|
|
87
|
+
- **Then** `~/.claude/skills/_rules/guides/` 目录下存在 13 个 .md 文件,每个文件 < 50 行
|
|
88
|
+
|
|
89
|
+
### AC3: Plan Phase Triggers NFR Questions (R4)
|
|
90
|
+
|
|
91
|
+
- **Given** 一个包含 "从第三方 API 拉取数据存入数据库" 的 Story
|
|
92
|
+
- **When** Plan Phase 2 执行 Engineering Concerns Assessment
|
|
93
|
+
- **Then** Spec 的 Technical Design 中包含:并发模型决策、API 超时/重试策略、数据库连接管理策略
|
|
94
|
+
|
|
95
|
+
### AC4: Act Phase Loads Relevant Guides Only (R5)
|
|
96
|
+
|
|
97
|
+
- **Given** Spec 的 Technical Design 标注了 `concerns: [database, api-integration]`
|
|
98
|
+
- **When** Act Phase 1.5 执行
|
|
99
|
+
- **Then** 只加载 `guides/database.md` 和 `guides/api-integration.md`,不加载其他 11 个指南
|
|
100
|
+
|
|
101
|
+
### AC5: OpenCode/Codex/Copilot Parity (R7)
|
|
102
|
+
|
|
103
|
+
- **Given** 用户运行 `pactkit init --format opencode`
|
|
104
|
+
- **When** deployer 执行 OpenCode 格式部署
|
|
105
|
+
- **Then** 对应目录下存在 engineering concerns trigger index + guides 内容(inline 或文件形式)
|
|
106
|
+
|
|
107
|
+
## Target Call Chain
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
# 部署链
|
|
111
|
+
pactkit init/update
|
|
112
|
+
→ deployer._deploy_classic() (deployer.py:302)
|
|
113
|
+
→ _deploy_rules(claude_root, enabled_rules) (deployer.py:584)
|
|
114
|
+
→ atomic_write(ondemand_dir / "07-engineering-concerns.md") — R1
|
|
115
|
+
→ _deploy_guides(claude_root) (NEW) (deployer.py:NEW)
|
|
116
|
+
→ atomic_write(guides_dir / "*.md") x13 — R2
|
|
117
|
+
→ _deploy_commands(skills_dir, ...) (deployer.py:917)
|
|
118
|
+
→ _build_command_rules_header("project-plan") — includes "engineering" — R4
|
|
119
|
+
→ _build_command_rules_header("project-act") — includes "engineering" — R5
|
|
120
|
+
|
|
121
|
+
# 指南内容源
|
|
122
|
+
src/pactkit/prompts/guides.py (NEW)
|
|
123
|
+
→ GUIDES_FILES: dict[str, str] — filename → content
|
|
124
|
+
→ Referenced by deployer._deploy_guides()
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
## Implementation Steps
|
|
128
|
+
|
|
129
|
+
| Step | File | Action | Dependencies | Risk |
|
|
130
|
+
|------|------|--------|-------------|------|
|
|
131
|
+
| 1 | `src/pactkit/prompts/guides.py` | 新建:定义 GUIDES_FILES dict(13 个指南内容) | None | Low |
|
|
132
|
+
| 2 | `src/pactkit/prompts/rules.py` | 新增 RULES_MODULES["engineering"] 触发索引内容 + RULES_ONDEMAND_FILES 注册 | Step 1 | Low |
|
|
133
|
+
| 3 | `src/pactkit/config.py` | VALID_RULES 新增 "07-engineering-concerns" | Step 2 | Low |
|
|
134
|
+
| 4 | `src/pactkit/generators/deployer.py` | 新增 _deploy_guides() + 在 _deploy_classic/opencode/codex/copilot 中调用 | Steps 1-3 | Medium |
|
|
135
|
+
| 5 | `src/pactkit/prompts/commands.py` | plan Phase 2 新增 Engineering Concerns Assessment 段落 | Step 2 | Low |
|
|
136
|
+
| 6 | `src/pactkit/prompts/commands.py` | act 新增 Phase 1.5 Engineering Concerns Loading 段落 | Step 2 | Low |
|
|
137
|
+
| 7 | `src/pactkit/prompts/rules.py` | COMMAND_RULES_MAP 为 plan/act 添加 "engineering" | Step 3 | Low |
|
|
138
|
+
| 8 | `tests/unit/` | 测试:deployer 部署 guides 目录、plan/act 包含新 phase | All | Low |
|
|
139
|
+
|
|
140
|
+
## Security Scope
|
|
141
|
+
|
|
142
|
+
| Check | Applicable | Reason |
|
|
143
|
+
|-------|------------|--------|
|
|
144
|
+
| SEC-1 | N/A | No secrets involved — only prompt/doc content |
|
|
145
|
+
| SEC-2 | N/A | No user input processing |
|
|
146
|
+
| SEC-3 | N/A | No database queries |
|
|
147
|
+
| SEC-4 | N/A | No rendering |
|
|
148
|
+
| SEC-5 | N/A | No auth |
|
|
149
|
+
| SEC-6 | N/A | No endpoints |
|
|
150
|
+
| SEC-7 | N/A | No error messages |
|
|
151
|
+
| SEC-8 | N/A | No new dependencies |
|
|
152
|
+
|
|
153
|
+
## Out of Scope
|
|
154
|
+
|
|
155
|
+
- CI/lint 自动化检测(semgrep/ruff 自定义规则)— 后续 Story
|
|
156
|
+
- 指南文件的热加载/动态选择 AI 判断 — 本 Story 用关键词匹配,不用 LLM 判断
|
|
157
|
+
- Check 阶段的完整 13 项 checklist 验证 — 可选后续 Story
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
# STORY-slim-129: Engineering Concerns Guide Expansion — 6 Additional NFR Guides
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-129 |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.15.1 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
STORY-slim-128 established the Engineering Concerns guide system with 13 on-demand guides covering concurrency, async, configuration, observability, module design, database, caching, API integration, event-driven, resilience, memory management, code-review-first, and component-reuse.
|
|
13
|
+
|
|
14
|
+
Analysis of common LLM-generated code weaknesses identified 6 additional high-frequency gaps:
|
|
15
|
+
1. **Error Recovery & Retry** — LLM try/catch blocks almost always just `log + return None`, missing retry with backoff, idempotency, partial failure handling
|
|
16
|
+
2. **Data Consistency** — multi-table/multi-service writes without transaction strategy, no idempotency key, no compensation
|
|
17
|
+
3. **Backwards Compatibility** — LLM defaults to breaking changes for API/schema modifications
|
|
18
|
+
4. **Performance Anti-patterns** — N+1 queries, unbounded list APIs, missing indices, hot-path serialization
|
|
19
|
+
5. **Graceful Shutdown** — no SIGTERM handler, no in-flight request drain, no resource cleanup ordering
|
|
20
|
+
6. **Testing Strategy** — LLM writes tests without considering boundary testing, mock vs real, or test isolation
|
|
21
|
+
|
|
22
|
+
## Requirements
|
|
23
|
+
|
|
24
|
+
### R1: Six New Guide Files (MUST)
|
|
25
|
+
|
|
26
|
+
Add 6 new guide files to `GUIDES_FILES` in `src/pactkit/prompts/guides.py`:
|
|
27
|
+
- `error-recovery.md` — retry strategies, backoff, idempotency, partial failure
|
|
28
|
+
- `data-consistency.md` — distributed transactions, idempotency keys, optimistic/pessimistic locking, Saga
|
|
29
|
+
- `backwards-compatibility.md` — API versioning, non-breaking DB migrations, protocol evolution
|
|
30
|
+
- `performance-antipatterns.md` — N+1 queries, unbounded queries, missing indexes, hot-path costs
|
|
31
|
+
- `graceful-shutdown.md` — SIGTERM handling, request drain, resource cleanup order
|
|
32
|
+
- `testing-strategy.md` — boundary testing, mock vs real, test isolation, deterministic tests
|
|
33
|
+
|
|
34
|
+
Each guide MUST follow existing format: Decision Table + MUST + NEVER + Template, ≤ 50 lines.
|
|
35
|
+
|
|
36
|
+
### R2: Trigger Index Update (MUST)
|
|
37
|
+
|
|
38
|
+
Add 6 new rows to the keyword→concern table in `RULES_MODULES["engineering"]` in `src/pactkit/prompts/rules.py`:
|
|
39
|
+
- error-recovery: retry/重试/backoff/幂等/idempoten/partial failure
|
|
40
|
+
- data-consistency: 一致性/consistency/saga/补偿/idempotency key/分布式事务
|
|
41
|
+
- backwards-compatibility: 兼容/backward/breaking change/deprecat/migration/版本
|
|
42
|
+
- performance-antipatterns: N+1/unbounded/分页/pagina/index/索引/热路径/hot path
|
|
43
|
+
- graceful-shutdown: shutdown/优雅关闭/SIGTERM/drain/信号处理
|
|
44
|
+
- testing-strategy: 测试策略/test strategy/mock/stub/boundary/隔离/isolation
|
|
45
|
+
|
|
46
|
+
### R3: Guide Loading Table Update (MUST)
|
|
47
|
+
|
|
48
|
+
Add 6 new rows to the Act Phase Guide Loading Table in the same `engineering` module content, mapping concern→guide file path.
|
|
49
|
+
|
|
50
|
+
### R4: Pre-existing Test Update (MUST)
|
|
51
|
+
|
|
52
|
+
Update hardcoded counts in tests:
|
|
53
|
+
- `test_story_slim128_engineering_concerns.py`: 13→19 guide count
|
|
54
|
+
- `test_story_slim026.py`: plan prompt char baseline if exceeded
|
|
55
|
+
- `test_story063_prompt_slimming.py`: BASELINE_TOTAL_CHARS if exceeded
|
|
56
|
+
- Trigger index "NEVER load all 13" → "NEVER load all 19"
|
|
57
|
+
|
|
58
|
+
### R5: Token Budget Control (SHOULD)
|
|
59
|
+
|
|
60
|
+
Total trigger index growth SHOULD be ≤ 8 lines (6 keyword rows + 6 guide path rows = 12 table rows, but table rows are short). The trigger index must remain under ~60 lines total.
|
|
61
|
+
|
|
62
|
+
### R6: Guide Loading Cap (MUST)
|
|
63
|
+
|
|
64
|
+
Maintain the "MUST load only 1-3 relevant guides" instruction. Do NOT increase the cap — more guides available does not mean more should be loaded simultaneously.
|
|
65
|
+
|
|
66
|
+
## Acceptance Criteria
|
|
67
|
+
|
|
68
|
+
### AC1: Guide Files Registered (R1)
|
|
69
|
+
|
|
70
|
+
- **Given** `GUIDES_FILES` dict in `src/pactkit/prompts/guides.py`
|
|
71
|
+
- **When** the module is loaded
|
|
72
|
+
- **Then** it contains exactly 19 entries (13 original + 6 new), each ≤ 50 lines with MUST and NEVER sections
|
|
73
|
+
|
|
74
|
+
### AC2: Trigger Index Extended (R2, R3)
|
|
75
|
+
|
|
76
|
+
- **Given** `RULES_MODULES["engineering"]` in rules.py
|
|
77
|
+
- **When** the content is inspected
|
|
78
|
+
- **Then** the keyword table has 19 rows and the guide loading table has 19 rows
|
|
79
|
+
|
|
80
|
+
### AC3: Deployment Creates 19 Guide Files (R1)
|
|
81
|
+
|
|
82
|
+
- **Given** `_deploy_guides()` is called
|
|
83
|
+
- **When** deployment completes
|
|
84
|
+
- **Then** 19 `.md` files exist in `skills/_rules/guides/` directory
|
|
85
|
+
|
|
86
|
+
### AC4: Guide Loading Cap Unchanged (R6)
|
|
87
|
+
|
|
88
|
+
- **Given** trigger index content
|
|
89
|
+
- **When** inspected for loading instruction
|
|
90
|
+
- **Then** still says "MUST load only 1-3 relevant guides" (not 4+)
|
|
91
|
+
|
|
92
|
+
### AC5: All Tests Pass (R4)
|
|
93
|
+
|
|
94
|
+
- **Given** updated test expectations (19 guides)
|
|
95
|
+
- **When** full test suite runs
|
|
96
|
+
- **Then** all tests pass including pre-existing count assertions
|
|
97
|
+
|
|
98
|
+
## Target Call Chain
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
guides.py::GUIDES_FILES (add 6 entries)
|
|
102
|
+
→ rules.py::RULES_MODULES["engineering"] (extend keyword table + guide table)
|
|
103
|
+
→ deployer.py::_deploy_guides() (already handles any GUIDES_FILES count)
|
|
104
|
+
→ tests/ (update count assertions 13→19)
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Implementation Steps
|
|
108
|
+
|
|
109
|
+
| Step | File | Action | Dependencies | Risk |
|
|
110
|
+
|------|------|--------|-------------|------|
|
|
111
|
+
| 1 | `src/pactkit/prompts/guides.py` | Add 6 new guide entries to GUIDES_FILES | None | Low |
|
|
112
|
+
| 2 | `src/pactkit/prompts/rules.py` | Add 6 keyword rows + 6 guide loading rows to engineering module | Step 1 | Low |
|
|
113
|
+
| 3 | `tests/unit/test_story_slim128_engineering_concerns.py` | Update count 13→19, update EXPECTED_GUIDES set | Steps 1-2 | Low |
|
|
114
|
+
| 4 | Other test files | Update baselines if char counts exceeded | Steps 1-2 | Low |
|
|
115
|
+
|
|
116
|
+
## Security Scope
|
|
117
|
+
|
|
118
|
+
| Check | Applicable | Reason |
|
|
119
|
+
|-------|------------|--------|
|
|
120
|
+
| SEC-1 Input Validation | N/A | docs/tests only |
|
|
121
|
+
| SEC-2 Auth/AuthZ | N/A | docs/tests only |
|
|
122
|
+
| SEC-3 Data Exposure | N/A | docs/tests only |
|
|
123
|
+
| SEC-4 Cryptography | N/A | docs/tests only |
|
|
124
|
+
| SEC-5 Error Handling | N/A | docs/tests only |
|
|
125
|
+
| SEC-6 Dependencies | N/A | docs/tests only |
|
|
126
|
+
| SEC-7 Logging | N/A | docs/tests only |
|
|
127
|
+
| SEC-8 Config/Secrets | N/A | docs/tests only |
|
|
128
|
+
|
|
129
|
+
## Out of Scope
|
|
130
|
+
|
|
131
|
+
- No changes to deployer logic (already handles dynamic GUIDES_FILES count)
|
|
132
|
+
- No changes to command prompts (plan/act phases already reference the trigger index)
|
|
133
|
+
- No new RULES_ONDEMAND_FILES entry needed (engineering key already exists)
|
|
134
|
+
- No config.py changes (VALID_RULES already includes 07-engineering-concerns)
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pactkit"
|
|
7
|
-
version = "2.
|
|
7
|
+
version = "2.15.1"
|
|
8
8
|
description = "Spec-driven agentic DevOps toolkit for AI coding assistants"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT"
|
|
@@ -62,8 +62,11 @@ visualize = [
|
|
|
62
62
|
"tree-sitter-java>=0.23",
|
|
63
63
|
"tree-sitter-typescript>=0.23",
|
|
64
64
|
]
|
|
65
|
+
lint = [
|
|
66
|
+
"ruff>=0.4",
|
|
67
|
+
]
|
|
65
68
|
all = [
|
|
66
|
-
"pactkit[opencode,codex,visualize]",
|
|
69
|
+
"pactkit[opencode,codex,visualize,lint]",
|
|
67
70
|
]
|
|
68
71
|
|
|
69
72
|
[tool.hatch.build.targets.wheel]
|
|
@@ -153,6 +153,12 @@ class DeployerBase:
|
|
|
153
153
|
config=config, _legacy_prefix=_legacy_prefix,
|
|
154
154
|
)
|
|
155
155
|
|
|
156
|
+
@staticmethod
|
|
157
|
+
def deploy_guides(claude_root, profile=None):
|
|
158
|
+
from pactkit.generators.deployer import _deploy_guides
|
|
159
|
+
|
|
160
|
+
return _deploy_guides(claude_root, profile=profile)
|
|
161
|
+
|
|
156
162
|
@staticmethod
|
|
157
163
|
def deploy_ci(provider, project_root, config):
|
|
158
164
|
from pactkit.generators.deployer import _deploy_ci
|
|
@@ -84,6 +84,8 @@ def _render_prompt(template: str, profile: FormatProfile) -> str:
|
|
|
84
84
|
"SCAFFOLD_CMD": f"python3 {skills_root}/pactkit-scaffold/scripts/scaffold.py",
|
|
85
85
|
"REPORT_CMD": f"python3 {skills_root}/pactkit-report/scripts/report.py",
|
|
86
86
|
"GLOBAL_INSTRUCTIONS": f"{profile.global_config_dir}/{profile.global_instructions_file}",
|
|
87
|
+
# Engineering guides path (STORY-slim-128)
|
|
88
|
+
"GUIDES_PATH": f"{skills_root}/_rules/guides",
|
|
87
89
|
# Document schema variables (STORY-slim-007)
|
|
88
90
|
"CONTEXT_SECTIONS": CONTEXT_SECTIONS_TEXT,
|
|
89
91
|
"LESSONS_ROW_FORMAT": LESSONS_ROW_FORMAT,
|
|
@@ -357,6 +359,7 @@ def _deploy_classic(config=None, target=None):
|
|
|
357
359
|
_cleanup_legacy(skills_dir)
|
|
358
360
|
rule_scopes = config.get("rule_scopes", {})
|
|
359
361
|
n_rules = _deploy_rules(claude_root, enabled_rules, rule_scopes=rule_scopes, profile=classic_profile)
|
|
362
|
+
_deploy_guides(claude_root, profile=classic_profile)
|
|
360
363
|
_deploy_claude_md(claude_root, enabled_rules)
|
|
361
364
|
agent_models = config.get("agent_models", {})
|
|
362
365
|
n_agents = _deploy_agents(agents_dir, enabled_agents, profile=classic_profile, agent_models=agent_models)
|
|
@@ -676,6 +679,32 @@ def _deploy_rules(claude_root, enabled_rules, rule_scopes=None, profile=None):
|
|
|
676
679
|
return deployed
|
|
677
680
|
|
|
678
681
|
|
|
682
|
+
def _deploy_guides(claude_root, profile=None):
|
|
683
|
+
"""Deploy engineering guide files to skills/_rules/guides/ (STORY-slim-128).
|
|
684
|
+
|
|
685
|
+
Guides are on-demand reference files loaded by Act Phase 1.5 based on
|
|
686
|
+
Spec's engineering concerns. Not loaded into context unless explicitly read.
|
|
687
|
+
"""
|
|
688
|
+
from pactkit.prompts.guides import GUIDES_DIR, GUIDES_FILES
|
|
689
|
+
|
|
690
|
+
guides_dir = claude_root / "skills" / prompts.RULES_ONDEMAND_DIR / GUIDES_DIR
|
|
691
|
+
guides_dir.mkdir(parents=True, exist_ok=True)
|
|
692
|
+
|
|
693
|
+
# Clean existing managed guide files (upgrade path)
|
|
694
|
+
for f in guides_dir.glob("*.md"):
|
|
695
|
+
if f.name in GUIDES_FILES:
|
|
696
|
+
f.unlink()
|
|
697
|
+
|
|
698
|
+
deployed = 0
|
|
699
|
+
for filename, content in GUIDES_FILES.items():
|
|
700
|
+
if profile is not None:
|
|
701
|
+
content = _render_prompt(content, profile)
|
|
702
|
+
atomic_write(guides_dir / filename, content)
|
|
703
|
+
deployed += 1
|
|
704
|
+
|
|
705
|
+
return deployed
|
|
706
|
+
|
|
707
|
+
|
|
679
708
|
def _is_pactkit_managed_global_md(content):
|
|
680
709
|
"""Detect if CLAUDE.md content is a PactKit-managed template (BUG-slim-089).
|
|
681
710
|
|
|
@@ -104,7 +104,12 @@ model: opus
|
|
|
104
104
|
## 🎬 Phase 2: Design & Impact
|
|
105
105
|
1. **Diff**: Compare User Request vs Current Reality (from Phase 1).
|
|
106
106
|
2. **Duplication Audit**: Run the Duplication Audit from system-architect protocol — if this is the Nth same-kind implementation, grep existing implementations and assess shared abstraction needs before writing Spec.
|
|
107
|
-
3. **
|
|
107
|
+
3. **Engineering Concerns Assessment** — scan the requirement for NFR keywords:
|
|
108
|
+
- Reference the Engineering Concerns trigger index (`07-engineering-concerns.md`) keyword table.
|
|
109
|
+
- For each matched concern, the Spec's Technical Design MUST include a decision (e.g., concurrency model, timeout strategy, caching policy).
|
|
110
|
+
- Unmatched concerns → do not add (avoid noise).
|
|
111
|
+
- **Output checkpoint**: `"Engineering concerns identified: {list}. Decisions will be included in Technical Design."`
|
|
112
|
+
4. **Update HLD**: Modify `docs/architecture/graphs/system_design.mmd`.
|
|
108
113
|
- *Rule*: Keep the `code_graph.mmd` as is (it updates automatically).
|
|
109
114
|
|
|
110
115
|
## 🎬 Phase 3.1: Story ID Generation
|
|
@@ -217,7 +222,18 @@ model: sonnet
|
|
|
217
222
|
- For **agent**: Check AgentParser output for orchestration edges so new code doesn't break agent flow.
|
|
218
223
|
5. **Solution Design Protocol (Conditional)** — if the implementation involves frameworks already used by the project:
|
|
219
224
|
- Execute the **Solution Design Protocol** from `06-solution-design.md` to evaluate capability delta before writing code.
|
|
220
|
-
- Output brief capability assessment before proceeding to Phase
|
|
225
|
+
- Output brief capability assessment before proceeding to Phase 1.5.
|
|
226
|
+
|
|
227
|
+
## 🔧 Phase 1.5: Engineering Concerns Loading (Conditional)
|
|
228
|
+
> **PURPOSE**: Load only the NFR guides relevant to this Story — keeps context minimal while ensuring engineering rigor.
|
|
229
|
+
1. **Read Spec Technical Design**: Check if the Spec contains engineering concern decisions (from Plan Phase 2).
|
|
230
|
+
2. **Identify concerns**: Extract the concern keywords mentioned (e.g., database, api-integration, resilience).
|
|
231
|
+
3. **Load guides**: For each identified concern, read the corresponding guide file from `{GUIDES_PATH}/`:
|
|
232
|
+
- MUST load only 1-3 relevant guides (those matching the Spec's concerns).
|
|
233
|
+
- NEVER load all 13 guides.
|
|
234
|
+
- If Spec has no engineering concerns section, skip this phase silently.
|
|
235
|
+
4. **Apply constraints**: Use the loaded guides' MUST/NEVER rules as implementation constraints in Phase 3.
|
|
236
|
+
5. **Output checkpoint**: `"Engineering guides loaded: {list}. Applying as implementation constraints."`
|
|
221
237
|
|
|
222
238
|
## 🎬 Phase 2: Test Scaffolding (TDD)
|
|
223
239
|
1. **Constraint**: NEVER write source code in this phase — doing so breaks TDD causality: tests must exist before the code they verify.
|