pactkit 2.13.0__tar.gz → 2.14.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.
- pactkit-2.14.0/.codegraph/.gitignore +16 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/.github/workflows/pactkit.yml +1 -1
- {pactkit-2.13.0 → pactkit-2.14.0}/.gitignore +3 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/.opencode/pactkit.yaml +1 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/CHANGELOG.md +21 -1
- {pactkit-2.13.0 → pactkit-2.14.0}/PKG-INFO +6 -4
- {pactkit-2.13.0 → pactkit-2.14.0}/README.md +5 -3
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/architecture/governance/lessons.md +4 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/architecture/governance/rules.md +1 -1
- pactkit-2.14.0/docs/product/archive/archive_202605.md +109 -0
- pactkit-2.14.0/docs/product/context.md +29 -0
- pactkit-2.14.0/docs/product/sprint_board.md +24 -0
- pactkit-2.14.0/docs/specs/HOTFIX-slim-117.md +18 -0
- pactkit-2.14.0/docs/specs/HOTFIX-slim-122.md +20 -0
- pactkit-2.14.0/docs/specs/HOTFIX-slim-123.md +17 -0
- pactkit-2.14.0/docs/specs/STORY-slim-115.md +141 -0
- pactkit-2.14.0/docs/specs/STORY-slim-116.md +186 -0
- pactkit-2.14.0/docs/specs/STORY-slim-118.md +149 -0
- pactkit-2.14.0/docs/specs/STORY-slim-119.md +190 -0
- pactkit-2.14.0/docs/specs/STORY-slim-120.md +123 -0
- pactkit-2.14.0/docs/specs/STORY-slim-121.md +199 -0
- pactkit-2.14.0/docs/specs/STORY-slim-124.md +232 -0
- pactkit-2.14.0/docs/specs/STORY-slim-125.md +86 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/pyproject.toml +1 -1
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/__init__.py +1 -1
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/cli.py +132 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/config.py +8 -4
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/prompts/commands.py +18 -7
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/prompts/skills.py +54 -1
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/prompts/workflows.py +3 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/python_analyzer.py +98 -21
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/visualize.py +42 -7
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_prompt_cli_refs.py +1 -1
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story063_prompt_slimming.py +2 -1
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim026.py +2 -2
- pactkit-2.14.0/tests/unit/test_story_slim119.py +310 -0
- pactkit-2.14.0/tests/unit/test_story_slim120.py +186 -0
- pactkit-2.14.0/tests/unit/test_story_slim121.py +241 -0
- pactkit-2.14.0/tests/unit/test_story_slim125.py +105 -0
- pactkit-2.13.0/docs/product/archive/archive_202605.md +0 -47
- pactkit-2.13.0/docs/product/context.md +0 -29
- pactkit-2.13.0/docs/product/sprint_board.md +0 -8
- {pactkit-2.13.0 → pactkit-2.14.0}/.github/workflows/publish.yml +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/AGENTS.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/CODE_OF_CONDUCT.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/CONTRIBUTING.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/LICENSE +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/SECURITY.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/architecture/governance/archive/lessons_archive_202603.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/architecture/governance/harness_audit.json +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/architecture/governance/philosophy.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/assets/logo.png +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/e2e/journey.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/guides/codex-integration-preresearch.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/guides/tool-integration-checklist.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/product/archive/archive_202602.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/product/archive/archive_202603.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/product/archive/archive_202604.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/product/friction-log.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/product/prd.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-001.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-002.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-003.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-004.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-005.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-006.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-007.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-008.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-009.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-010.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-011.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-012.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-013.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-014.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-015.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-016.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-017.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-018.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-019.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-020.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-021.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-022.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-023.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-024.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-025.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-026.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-027.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-028.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-029.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-030.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-031.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-032.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-033.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-034.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-035.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-slim-001.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-slim-002.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-slim-003.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-slim-004.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-slim-005.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-slim-006.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-slim-089.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-slim-107.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-023.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-049.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-050.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-051.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-052.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-061.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-062.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-067.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-069.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-070.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-085.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-087.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-096.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-099.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-107.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-001.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-002.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-003.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-004.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-005.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-006.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-007.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-008.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-009.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-010.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-011.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-012.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-013.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-014.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-015.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-016.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-017.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-018.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-019.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-020.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-021.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-022.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-023.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-024.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-025.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-026.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-027.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-028.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-029.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-030.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-031.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-032.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-033.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-034.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-035.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-036.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-037.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-038.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-039.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-040.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-041.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-042.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-043.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-044.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-045.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-046.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-047.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-048.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-049.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-050.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-051.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-052.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-053.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-054.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-055.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-056.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-057.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-058.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-059.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-060.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-061.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-062.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-063.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-064.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-065.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-069.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-070.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-071.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-072.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-073.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-001.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-005.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-006.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-007.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-009.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-010.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-011.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-012.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-013.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-014.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-015.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-016.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-017.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-018.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-019.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-020.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-021.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-022.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-023.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-024.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-028.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-029.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-030.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-031.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-032.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-033.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-034.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-035.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-036.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-037.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-038.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-039.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-040.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-041.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-042.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-043.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-044.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-045.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-046.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-047.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-048.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-049.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-050.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-051.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-052.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-053.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-054.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-055.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-056.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-057.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-058.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-059.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-060.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-063.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-066.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-067.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-068.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-069.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-070.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-071.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-072.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-073.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-074.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-075.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-076.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-077.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-078.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-079.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-080.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-081.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-082.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-083.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-084.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-086.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-088.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-089.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-090.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-091.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-092.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-093.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-094.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-095.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-097.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-098.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-099.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-100.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-101.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-102.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-103.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-104.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-105.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-106.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-107.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-108.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-109.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-110.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-111.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-112.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-113.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-114.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/test_cases/BUG-001_case.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/test_cases/BUG-002_case.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-028_case.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-029_case.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-031_case.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-032_case.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-033_case.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-034_case.md +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/opencode.json +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/__main__.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/audit.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/backfill.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/cleaners.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/context_gen.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/coverage_gate.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/doctor.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/garden.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/generators/__init__.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/generators/adapter.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/generators/deploy_base.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/generators/deployer.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/guards.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/id_generator.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/invariants.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/issue_sync.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/lazy_visualize.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/lessons.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/lint_runner.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/observe.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/profiles.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/prompts/__init__.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/prompts/agents.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/prompts/references.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/prompts/rules.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/regression.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/schemas.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/scripts.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/sec_scope.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/__init__.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/__init__.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/board.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/interface_summary.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/report.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/scaffold.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/spec_linter.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/spec_status.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/test_mapper.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/utils.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/validators.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/conftest.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/e2e/__init__.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/e2e/cli/__init__.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/e2e/cli/test_cli_e2e.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/fixtures/api_call_parser/page.tsx +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/integration/__init__.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/integration/test_deploy_classic.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_agent_features.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_agent_frontmatter.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_agents_enrichment.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_audit.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_blast_radius.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_board_bug027.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_board_sections.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug001_skill_path.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug002_plugin_paths.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug003_multi_import.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug004_dead_set.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug005_archive_taskless.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug006_scan_excludes.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug008_stale_command_refs.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug009_project_config_backfill.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug011_stale_refs.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug012_call_graph_filter.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug013_config_single_source.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug014_version_hygiene.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug017_project_init_playbook.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug019_venv_deployment.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug020_claude_md_backup.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug025_release_delegation.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug026_version_sync.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug028_ghost_refs.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_021.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_022.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_023.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_024.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_slim001_env_detection.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_slim003.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_slim004.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_slim005.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_slim006.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_check_command.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_check_extensions_072_073.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_check_playbook_072_073.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_command_frontmatter.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_command_visualize_modes.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_complexity.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_config.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_config_auto_merge.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_constitution_sharpening.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_context_gen.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_create_skill.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_cross_flow_matrix.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_deploy_base.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_deployer_cleanup.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_deployer_plugin.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_design_command.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_done_gates.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_draw_prompt.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_draw_references.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_drawio_mcp.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_garden.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_home_path_fix.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_hotfix_command.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_init_guard.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_init_playbook_074.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_interface_summary.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_lang_profiles.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_layer_violations.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_lessons_rotation_075.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_list_stories.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_mcp_integration.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_model_config.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_modular_constitution.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_monorepo_detect.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_multi_prefix.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_observe.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_pdca_slim.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_profiles.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_project_visibility.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_prompt_quality_075.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_prompt_structural_invariants.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_prompts_package.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_release.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_release_field.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_release_v110.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_render_prompt.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_report_parser.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_report_unified.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_review_command.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_rules_enrichment.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_scaffold.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_scaffold_developer_prefix.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_schemas.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_script_extraction.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_selective_deploy.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_session_context.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_skill_structure.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_skills_enrichment.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_slim_deps_088.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_smart_regression.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_solution_design_rule.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_sprint_command.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_stack_references.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_status_command.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_statusline.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story014_release.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story015_ci_lint_gate.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story016_claude_md.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story017_init_claude_md.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story018_arch_staleness.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story019_bailout.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story020_horizon.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story021_rfc.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story022_decision_tree.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story023_test_quality.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story024_native_agent.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story025_ci_pipeline.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story026_issue_tracker.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story028_rule_scoping.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story029_doctor.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story030_lint.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story031_git_init_guard.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story032_greenfield_redirect.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story033_config_backfill.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story034_plan_config_refresh.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story035_readme_docs.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story037_regression_fix.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story038_call_graph_update.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story039_venv_config.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story040_layered_claude_md.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story042_spec_linter.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story043_active_clarify.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story044_consistency_check.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story045_auto_pr.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story046_agent_adapter.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story047_enterprise_flags.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story048_worktree_isolation.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story049_community_standards.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story051_workflow_streamlining.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story052_conditional_github_release.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story053_impact_regression.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story055_commands.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story055_config.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story055_spec_linter.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story056_commands.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story056_config.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story057_implicit_cleanup.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story058_opencode_extraction.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story058_routing_fix.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story059_codex_removal.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story060_init_hang.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story061_remove_thinking.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story062_mcp_recommendations.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story064_venv_local_md.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story065_sprint_model.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story072_developer_prefix.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story106_lateral_scan.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim011_command_rules.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim012_ci.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_clean.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_context.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_guard.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_next_id.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_regression.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_sec_scope.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_validators.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim015_doctor.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim017.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim018.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim021.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim022.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim023.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim024.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim025.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim027.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim028.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim029.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim030.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim031.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim032.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim033.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim034.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim035.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim036.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim037.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim038.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim039.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim040.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim041.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim042.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim043.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim044.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim045.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim046.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim047.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim048.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim049.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim051.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim052.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim053.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim054.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim055.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim056.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim060_codex_profile.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim063.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim065.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim076_multistack.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim078.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim079.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim080.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim081.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim082.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim083.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim084.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim095.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim102_version_marker.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim104_should_semantics.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim107.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim109_journey_spec.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim111_playwright_assertion.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim112_rules_split.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim114_journey_sync.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_tools.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_topology_parsers_066.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_update_task.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_visualize_call_nested.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_visualize_chain_fix.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_visualize_modes.py +0 -0
- {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_visualize_multilang_chain.py +0 -0
|
@@ -4,9 +4,29 @@ 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.
|
|
7
|
+
## [2.14.0] - 2026-05-26
|
|
8
8
|
|
|
9
9
|
### Added
|
|
10
|
+
- **Codegraph integration** (STORY-slim-124) — `pactkit query` now reads from `.codegraph/codegraph.db` (generated by `@colbymchenry/codegraph`) when `visualize.graph_provider: codegraph` is configured. Provides 2.6x more edges than pactkit's own suffix-match resolution (6580 vs 2483 in real projects), with qualified names, line numbers, and type-aware resolution.
|
|
11
|
+
- **Auto-init codegraph** — When `graph_provider: codegraph` is set and `.codegraph/codegraph.db` is missing, `pactkit query` auto-runs `codegraph init -i` if the CLI is on PATH. Plan/Act phases also auto-setup codegraph when detected.
|
|
12
|
+
- **Graph Query Protocol dual-mode** — PDCA commands now support two modes: Codegraph Mode (`pactkit query` + codegraph CLI + MCP tools) and Grep Mode (default fallback on `.mmd` files).
|
|
13
|
+
|
|
14
|
+
### Removed
|
|
15
|
+
- **`_write_sqlite_db()`** — Pactkit no longer generates its own `call_graph.db`. The upstream codegraph tool produces a superior graph with tree-sitter + import-aware resolution.
|
|
16
|
+
- **`visualize.sqlite_output` config** — Replaced by `visualize.graph_provider: codegraph`. Existing configs should migrate.
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
- **`pactkit query`** — Now reads `.codegraph/codegraph.db` (codegraph schema with hash IDs, JOIN edges+nodes) instead of pactkit's own `call_graph.db`.
|
|
20
|
+
- **PDCA prompts updated** — All references to `call_graph.db` / "SQLite Mode" removed from Plan, Act, Check, Done, Hotfix, and Trace skills. Impact analysis uses `pactkit query --callers` (codegraph) or grep `.mmd` (default).
|
|
21
|
+
|
|
22
|
+
## [2.13.0] - 2026-05-25
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
- **Call graph SQLite output** (STORY-slim-121) — `pactkit visualize --mode call` now optionally writes `call_graph.db` alongside the existing `.mmd` file. Enable via `visualize.sqlite_output: true` in `pactkit.yaml`. Atomic write (tmp+rename), zero new dependencies (`sqlite3` stdlib).
|
|
26
|
+
- **`pactkit query` CLI** (STORY-slim-121) — New subcommand for structured call graph queries: `--callers <func>` (fan-in), `--callees <func>` (fan-out), `--chain <func> [--down]` (transitive upstream/downstream via recursive CTE). Reads from `call_graph.db`; exits with helpful message when db is missing.
|
|
27
|
+
- **Graph Query Protocol upgrade** (STORY-slim-121) — `SKILL_VISUALIZE_MD` now routes to `pactkit query` as primary path when `call_graph.db` exists, with grep as fallback for mmd-only projects.
|
|
28
|
+
- **Enhanced Python call graph coverage** (STORY-slim-119) — `_extract_calls` now captures non-self attribute calls (`engine.run()`), function references in list/tuple/keyword/assign contexts, and nested functions via `ast.walk` + parent map. Edge count on medium-large projects: 1,360 → 3,764 (+177%).
|
|
29
|
+
- **Test and script scanning in call graph** (STORY-slim-120) — `visualize --mode call` now scans `tests/`, `scripts/`, and `alembic/` directories in addition to `src/`. Locality-based `_resolve_callee` prefers same-file/same-package candidates when multiple matches exist.
|
|
10
30
|
- **`pactkit interface-summary` CLI** (STORY-slim-113) — AST-based interface extraction that physically outputs only signatures, types, and docstrings. Enforces "Code Enforces, Prompt Instructs" for Act Phase 1 layered loading — AI receives truncated content by design.
|
|
11
31
|
- **Journey Sync in Act Phase 4** (STORY-slim-114) — Conditional step that updates `docs/e2e/journey.md` when a Story modifies journey-relevant steps. Closes the create→consume→update lifecycle gap.
|
|
12
32
|
- **Journey Segment in Plan Phase 3.2a** (STORY-slim-114) — Conditional Spec annotation that links Stories to journey steps, enabling Act Phase 4 auto-detection.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pactkit
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.14.0
|
|
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
|
|
@@ -55,7 +55,7 @@ Description-Content-Type: text/markdown
|
|
|
55
55
|
|
|
56
56
|
> **PactKit** (Pact 契约 + Kit) is a governance framework that enforces the **P.A.C.T.** contract between humans and AI agents. Deterministic operations run as code, not prompts. Decisions are grounded in data, not memory. AI does what it's best at — creativity and language — while code handles everything that must be repeatable and correct.
|
|
57
57
|
>
|
|
58
|
-
>
|
|
58
|
+
> 26 CLI subcommands, 9 specialized agents, 11 commands, 10 skills, and a full Plan-Act-Check-Done lifecycle. One `pip install` deploys to all 3 supported IDEs.
|
|
59
59
|
|
|
60
60
|
### Supported AI Tools
|
|
61
61
|
|
|
@@ -247,7 +247,7 @@ PactKit deploys 10 skills (3 scripted + 7 prompt-only), auto-invoked by commands
|
|
|
247
247
|
|
|
248
248
|
| Skill | Type | Purpose |
|
|
249
249
|
|-------|------|---------|
|
|
250
|
-
| **pactkit-visualize** | Scripted | Code dependency graph (Mermaid): file-level, class-level, call-level |
|
|
250
|
+
| **pactkit-visualize** | Scripted | Code dependency graph (Mermaid .mmd): file-level, class-level, call-level |
|
|
251
251
|
| **pactkit-board** | Scripted | Sprint board operations: add story, update task, archive |
|
|
252
252
|
| **pactkit-scaffold** | Scripted | File scaffolding: create spec, test files, git branches, skills |
|
|
253
253
|
| **pactkit-trace** | Prompt-only | Deep code tracing and execution flow analysis |
|
|
@@ -260,7 +260,7 @@ PactKit deploys 10 skills (3 scripted + 7 prompt-only), auto-invoked by commands
|
|
|
260
260
|
|
|
261
261
|
## CLI Subcommands
|
|
262
262
|
|
|
263
|
-
PactKit ships
|
|
263
|
+
PactKit ships 26 deterministic CLI subcommands — operations that were previously delegated to AI prompts are now enforced in Python code (the "C" in P.A.C.T.):
|
|
264
264
|
|
|
265
265
|
| Command | Purpose |
|
|
266
266
|
|---------|---------|
|
|
@@ -281,6 +281,7 @@ PactKit ships 25 deterministic CLI subcommands — operations that were previous
|
|
|
281
281
|
| `pactkit test-map` | Map source files to test files |
|
|
282
282
|
| `pactkit coverage-gate` | Enforce 3-tier coverage thresholds (80/50/block) |
|
|
283
283
|
| `pactkit visualize` | Conditional graph regeneration (lazy mode) |
|
|
284
|
+
| `pactkit query` | Query call graph via codegraph: `--callers`, `--callees`, `--chain [--down]` (requires `graph_provider: codegraph`) |
|
|
284
285
|
| `pactkit lesson-append` | Append lesson with specificity check and dedup |
|
|
285
286
|
| `pactkit invariants-refresh` | Update test count invariant in rules.md |
|
|
286
287
|
| `pactkit sec-scope` | Detect security scope for changed files |
|
|
@@ -375,6 +376,7 @@ docs/
|
|
|
375
376
|
| `skills` | list | all 10 | Skills to deploy |
|
|
376
377
|
| `rules` | list | all 8 | Constitution rule modules to deploy |
|
|
377
378
|
| `exclude` | object | `{}` | Components to exclude (e.g., `exclude.agents: [agent-name]`) |
|
|
379
|
+
| `visualize.graph_provider` | string | (absent) | Graph query backend. Set `codegraph` to use `.codegraph/codegraph.db` for `pactkit query`. Absent = grep `.mmd` |
|
|
378
380
|
| `ci` | object | `provider: none` | CI/CD pipeline generation (`github`, `gitlab`, `none`). Sub-fields: `runner` (default: `ubuntu-latest`), `language_version` (default: auto per stack), `github_host` (GHE server address), `actions_ref` (GHE actions prefix) |
|
|
379
381
|
| `issue_tracker` | object | `provider: none` | External issue tracker (`github`, `none`) |
|
|
380
382
|
| `hooks` | object | disabled | Opt-in hook templates (pre-commit, post-test, pre-push) |
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
|
|
14
14
|
> **PactKit** (Pact 契约 + Kit) is a governance framework that enforces the **P.A.C.T.** contract between humans and AI agents. Deterministic operations run as code, not prompts. Decisions are grounded in data, not memory. AI does what it's best at — creativity and language — while code handles everything that must be repeatable and correct.
|
|
15
15
|
>
|
|
16
|
-
>
|
|
16
|
+
> 26 CLI subcommands, 9 specialized agents, 11 commands, 10 skills, and a full Plan-Act-Check-Done lifecycle. One `pip install` deploys to all 3 supported IDEs.
|
|
17
17
|
|
|
18
18
|
### Supported AI Tools
|
|
19
19
|
|
|
@@ -205,7 +205,7 @@ PactKit deploys 10 skills (3 scripted + 7 prompt-only), auto-invoked by commands
|
|
|
205
205
|
|
|
206
206
|
| Skill | Type | Purpose |
|
|
207
207
|
|-------|------|---------|
|
|
208
|
-
| **pactkit-visualize** | Scripted | Code dependency graph (Mermaid): file-level, class-level, call-level |
|
|
208
|
+
| **pactkit-visualize** | Scripted | Code dependency graph (Mermaid .mmd): file-level, class-level, call-level |
|
|
209
209
|
| **pactkit-board** | Scripted | Sprint board operations: add story, update task, archive |
|
|
210
210
|
| **pactkit-scaffold** | Scripted | File scaffolding: create spec, test files, git branches, skills |
|
|
211
211
|
| **pactkit-trace** | Prompt-only | Deep code tracing and execution flow analysis |
|
|
@@ -218,7 +218,7 @@ PactKit deploys 10 skills (3 scripted + 7 prompt-only), auto-invoked by commands
|
|
|
218
218
|
|
|
219
219
|
## CLI Subcommands
|
|
220
220
|
|
|
221
|
-
PactKit ships
|
|
221
|
+
PactKit ships 26 deterministic CLI subcommands — operations that were previously delegated to AI prompts are now enforced in Python code (the "C" in P.A.C.T.):
|
|
222
222
|
|
|
223
223
|
| Command | Purpose |
|
|
224
224
|
|---------|---------|
|
|
@@ -239,6 +239,7 @@ PactKit ships 25 deterministic CLI subcommands — operations that were previous
|
|
|
239
239
|
| `pactkit test-map` | Map source files to test files |
|
|
240
240
|
| `pactkit coverage-gate` | Enforce 3-tier coverage thresholds (80/50/block) |
|
|
241
241
|
| `pactkit visualize` | Conditional graph regeneration (lazy mode) |
|
|
242
|
+
| `pactkit query` | Query call graph via codegraph: `--callers`, `--callees`, `--chain [--down]` (requires `graph_provider: codegraph`) |
|
|
242
243
|
| `pactkit lesson-append` | Append lesson with specificity check and dedup |
|
|
243
244
|
| `pactkit invariants-refresh` | Update test count invariant in rules.md |
|
|
244
245
|
| `pactkit sec-scope` | Detect security scope for changed files |
|
|
@@ -333,6 +334,7 @@ docs/
|
|
|
333
334
|
| `skills` | list | all 10 | Skills to deploy |
|
|
334
335
|
| `rules` | list | all 8 | Constitution rule modules to deploy |
|
|
335
336
|
| `exclude` | object | `{}` | Components to exclude (e.g., `exclude.agents: [agent-name]`) |
|
|
337
|
+
| `visualize.graph_provider` | string | (absent) | Graph query backend. Set `codegraph` to use `.codegraph/codegraph.db` for `pactkit query`. Absent = grep `.mmd` |
|
|
336
338
|
| `ci` | object | `provider: none` | CI/CD pipeline generation (`github`, `gitlab`, `none`). Sub-fields: `runner` (default: `ubuntu-latest`), `language_version` (default: auto per stack), `github_host` (GHE server address), `actions_ref` (GHE actions prefix) |
|
|
337
339
|
| `issue_tracker` | object | `provider: none` | External issue tracker (`github`, `none`) |
|
|
338
340
|
| `hooks` | object | disabled | Opt-in hook templates (pre-commit, post-test, pre-push) |
|
|
@@ -48,3 +48,7 @@
|
|
|
48
48
|
| 2026-04-27 | When extracting project-specific rules into a framework, generalize by removing project names, library references, and spec IDs — keep only the anti-pattern/fix-pattern structure that applies to any codebase | rules.py:RULES_MODULES |
|
|
49
49
|
| 2026-05-07 | Code Enforces implementation: pactkit interface-summary uses ast.parse() to physically output only signatures—AI receives truncated content, not a prompt instruction to self-truncate. Pattern: CLI tool as enforcement layer (interface_summary.py:generate_summary) | src/pactkit/skills/interface_summary.py:generate_summary |
|
|
50
50
|
| 2026-05-07 | Lifecycle gap pattern: when artifact has create+consume but no update mechanism, add conditional sync in the modifying command. Applied: Act Phase 4 Journey Sync step in commands.py COMMANDS_CONTENT['project-act.md'] | src/pactkit/prompts/commands.py:COMMANDS_CONTENT |
|
|
51
|
+
| 2026-05-25 | code_graph.mmd uses sanitized node IDs (src_pactkit_generators_deployer_py), not bare filenames — grep patterns for fan-in/fan-out must use .* wildcard or they silently never match | src/pactkit/prompts/skills.py:SKILL_VISUALIZE_MD |
|
|
52
|
+
| 2026-05-25 | 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 | visualize.py:_build_call_graph |
|
|
53
|
+
| 2026-05-25 | _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 | visualize.py:_build_call_graph |
|
|
54
|
+
| 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 |
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
## Invariants
|
|
17
17
|
|
|
18
|
-
1. All
|
|
18
|
+
1. All 3986+ 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,109 @@
|
|
|
1
|
+
|
|
2
|
+
### [STORY-slim-113] pactkit interface-summary CLI — Code Enforce 接口摘要
|
|
3
|
+
> Spec: docs/specs/STORY-slim-113.md
|
|
4
|
+
|
|
5
|
+
- [x] 新建 interface_summary.py 提取逻辑
|
|
6
|
+
- [x] CLI 注册 interface-summary 命令
|
|
7
|
+
- [x] Act Phase 1 改为显式步骤
|
|
8
|
+
- [x] pactkit-trace 更新输出指引
|
|
9
|
+
- [x] 单元测试
|
|
10
|
+
|
|
11
|
+
### [STORY-slim-112] Rules 架构重构:全局原则 vs 按需操作规程
|
|
12
|
+
> Spec: docs/specs/STORY-slim-112.md
|
|
13
|
+
|
|
14
|
+
- [x] 拆分 RULES_CORE/ONDEMAND + 新建 05-principles
|
|
15
|
+
- [x] 更新 deployer 双目录部署
|
|
16
|
+
- [x] 更新所有 skill @import 路径
|
|
17
|
+
- [x] 更新测试断言
|
|
18
|
+
|
|
19
|
+
### [STORY-slim-111] Check Phase 4 Playwright 断言策略指南
|
|
20
|
+
> Spec: docs/specs/STORY-slim-111.md
|
|
21
|
+
|
|
22
|
+
- [x] 修改 project-check SKILL.md Phase 4 增加断言策略
|
|
23
|
+
|
|
24
|
+
### [STORY-slim-110] project-design 集成 User Journey 生成
|
|
25
|
+
> Spec: docs/specs/STORY-slim-110.md
|
|
26
|
+
|
|
27
|
+
- [x] 修改 project-design SKILL.md Phase 1 Group B
|
|
28
|
+
|
|
29
|
+
### [STORY-slim-109] E2E journey.md 规范定义与 File Atlas 集成
|
|
30
|
+
> Spec: docs/specs/STORY-slim-109.md
|
|
31
|
+
|
|
32
|
+
- [x] 注册 File Atlas
|
|
33
|
+
- [x] 创建 journey.md 格式规范
|
|
34
|
+
- [x] 修改 project-check Phase 4
|
|
35
|
+
|
|
36
|
+
### [STORY-slim-108] pactkit-trace --summary 模式:接口摘要输出
|
|
37
|
+
> Spec: docs/specs/STORY-slim-108.md
|
|
38
|
+
|
|
39
|
+
- [x] 修改 pactkit-trace SKILL.md Phase 3
|
|
40
|
+
- [x] 修改 project-act SKILL.md Phase 1
|
|
41
|
+
|
|
42
|
+
### [STORY-slim-114] Act Phase 4 Journey Sync — journey.md 维护闭环
|
|
43
|
+
> Spec: docs/specs/STORY-slim-114.md
|
|
44
|
+
|
|
45
|
+
- [x] Act Phase 4 新增 Journey Sync 步骤
|
|
46
|
+
- [x] Plan Phase 3.2a 条件 Journey Segment
|
|
47
|
+
- [x] 单元测试
|
|
48
|
+
|
|
49
|
+
### [HOTFIX-slim-117] Fix Graph Query Protocol grep patterns
|
|
50
|
+
> Spec: docs/specs/HOTFIX-slim-117.md
|
|
51
|
+
|
|
52
|
+
- [x] Fix fan-in/fan-out grep patterns in SKILL_VISUALIZE_MD
|
|
53
|
+
- [x] Fix importer-count grep in project-act.md Phase 3
|
|
54
|
+
|
|
55
|
+
### [STORY-slim-116] Skill Model Precision and Graph Query Optimization
|
|
56
|
+
> Spec: docs/specs/STORY-slim-116.md
|
|
57
|
+
|
|
58
|
+
- [x] Add graph query protocol to project-act and project-plan
|
|
59
|
+
- [x] Add model field to pactkit-visualize SKILL.md
|
|
60
|
+
- [x] Add model fields to 28 skills missing model assignment
|
|
61
|
+
- [x] Update project-plan and project-sprint to opus
|
|
62
|
+
- [x] Add haiku to pure I/O skills (scaffold, board, doctor, status, report, draw, arch-diagram, profile, find-skills, docx, pdf, pptx, xlsx)
|
|
63
|
+
|
|
64
|
+
### [STORY-slim-120] Improve Call Graph Coverage: Test Files, Scripts, Locality Resolution
|
|
65
|
+
> Spec: docs/specs/STORY-slim-120.md
|
|
66
|
+
|
|
67
|
+
- [x] Write TDD tests for AC1-AC4
|
|
68
|
+
- [x] R1: scan tests/ in call mode
|
|
69
|
+
- [x] R2: scan scripts/ and alembic/
|
|
70
|
+
- [x] R3: locality-based _resolve_callee
|
|
71
|
+
- [x] Run pactkit update
|
|
72
|
+
|
|
73
|
+
### [STORY-slim-121] call graph SQLite output with pactkit query CLI
|
|
74
|
+
> Spec: docs/specs/STORY-slim-121.md
|
|
75
|
+
|
|
76
|
+
- [x] Add visualize.sqlite_output config toggle
|
|
77
|
+
- [x] Add _load_sqlite_config() helper
|
|
78
|
+
- [x] Add _write_sqlite_db() with atomic write
|
|
79
|
+
- [x] Wire into _build_call_graph()
|
|
80
|
+
- [x] Add pactkit query subcommand (fan-in/fan-out/chain)
|
|
81
|
+
- [x] Update SKILL_VISUALIZE_MD with pactkit query examples
|
|
82
|
+
- [x] Add *.db to .gitignore
|
|
83
|
+
|
|
84
|
+
### [STORY-slim-124] codegraph integration — read .codegraph/codegraph.db as graph provider
|
|
85
|
+
> Spec: docs/specs/STORY-slim-124.md
|
|
86
|
+
|
|
87
|
+
- [x] Add graph_provider config to pactkit.yaml
|
|
88
|
+
- [x] Guard _write_sqlite_db when codegraph
|
|
89
|
+
- [x] Implement codegraph SQL in pactkit query
|
|
90
|
+
- [x] Update Graph Query Protocol in skills.py
|
|
91
|
+
- [x] Update PDCA prompts to prefer pactkit query
|
|
92
|
+
|
|
93
|
+
### [HOTFIX-slim-123] Fix: call_graph.db duplicate edges and orphan nodes
|
|
94
|
+
> Spec: docs/specs/HOTFIX-slim-123.md
|
|
95
|
+
|
|
96
|
+
- [x] Dedup rel_edges before insert
|
|
97
|
+
- [x] Filter edges to only reference existing nodes
|
|
98
|
+
|
|
99
|
+
### [HOTFIX-slim-122] Fix: focus/entry overwrites call_graph.db
|
|
100
|
+
> Spec: docs/specs/HOTFIX-slim-122.md
|
|
101
|
+
|
|
102
|
+
- [x] Guard sqlite write against focus/entry mode
|
|
103
|
+
|
|
104
|
+
### [STORY-slim-125] Add model frontmatter to all PDCA command/skill prompts
|
|
105
|
+
> Spec: docs/specs/STORY-slim-125.md
|
|
106
|
+
|
|
107
|
+
- [x] Add model to commands.py
|
|
108
|
+
- [x] Add model to workflows.py
|
|
109
|
+
- [x] Add regression test
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Project Context (Auto-generated)
|
|
2
|
+
> Last updated: 2026-05-26T17:29:18+08:00 by pactkit context
|
|
3
|
+
|
|
4
|
+
## Sprint Status
|
|
5
|
+
Backlog: 2 | In Progress: 0 | Done: 0 stories
|
|
6
|
+
|
|
7
|
+
## Current Stories
|
|
8
|
+
None
|
|
9
|
+
|
|
10
|
+
## Recent Completions
|
|
11
|
+
None
|
|
12
|
+
|
|
13
|
+
## Active Branches
|
|
14
|
+
+ claude/naughty-euclid-e6a787
|
|
15
|
+
develop
|
|
16
|
+
* main
|
|
17
|
+
|
|
18
|
+
## Key Decisions
|
|
19
|
+
- Lifecycle gap pattern: when artifact has create+consume but no update mechanism, add conditional sync in the modifying command. Applied: Act Phase 4 Journey Sync step in commands.py COMMANDS_CONTENT['project-act.md']
|
|
20
|
+
- code_graph.mmd uses sanitized node IDs (src_pactkit_generators_deployer_py), not bare filenames — grep patterns for fan-in/fan-out must use .* wildcard or they silently never match
|
|
21
|
+
- 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
|
|
22
|
+
- _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
|
|
23
|
+
- 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
|
|
24
|
+
|
|
25
|
+
## Next Recommended Action
|
|
26
|
+
`/project-plan`
|
|
27
|
+
|
|
28
|
+
## Agent Continuation
|
|
29
|
+
No active work session.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# Sprint Board
|
|
2
|
+
|
|
3
|
+
## 📋 Backlog
|
|
4
|
+
|
|
5
|
+
### [STORY-slim-118] codegraph MCP Integration for Semantic Code Queries
|
|
6
|
+
> Spec: docs/specs/STORY-slim-118.md
|
|
7
|
+
|
|
8
|
+
- [ ] Document replacement vs augmentation decision
|
|
9
|
+
- [ ] Add codegraph MCP conditional note to SKILL_VISUALIZE_MD Graph Query Protocol
|
|
10
|
+
- [ ] Run pactkit update to redeploy
|
|
11
|
+
|
|
12
|
+
### [STORY-slim-119] Improve Python Call Graph Coverage
|
|
13
|
+
> Spec: docs/specs/STORY-slim-119.md
|
|
14
|
+
|
|
15
|
+
- [ ] Extend _extract_calls to capture non-self attribute method calls (R1)
|
|
16
|
+
- [ ] Capture function references in list/assignment contexts (R2)
|
|
17
|
+
- [ ] Use ast.walk to scan nested functions (R3)
|
|
18
|
+
- [ ] Write TDD tests for AC1-AC4
|
|
19
|
+
- [ ] Run pactkit update to redeploy
|
|
20
|
+
|
|
21
|
+
## 🔄 In Progress
|
|
22
|
+
|
|
23
|
+
## ✅ Done
|
|
24
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# HOTFIX-slim-117: Fix Graph Query Protocol grep patterns for code_graph.mmd
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | HOTFIX-slim-117 |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Release | 2.14.0 |
|
|
8
|
+
|
|
9
|
+
## Background
|
|
10
|
+
|
|
11
|
+
Graph Query Protocol (added in STORY-slim-116) uses `grep " --> deployer"` and `grep "deployer --> "` to filter edges in `code_graph.mmd`. However, nodes in `code_graph.mmd` are sanitized IDs (`src_pactkit_generators_deployer_py`), not bare filenames. These patterns never match — silent no-op. Correct patterns require `.*` wildcard: `grep " --> .*deployer"` (fan-in) and `grep "deployer.* --> "` (fan-out).
|
|
12
|
+
|
|
13
|
+
Same issue in `project-act.md` Phase 3 importer-count: `grep " --> <file>"` → `grep " --> .*<file>"`.
|
|
14
|
+
|
|
15
|
+
## Target Files
|
|
16
|
+
|
|
17
|
+
- `src/pactkit/prompts/skills.py` — SKILL_VISUALIZE_MD lines 93, 96, 99
|
|
18
|
+
- `src/pactkit/prompts/commands.py` — project-act.md Phase 3 line 237
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# HOTFIX-slim-122: prevent focus/entry mode from overwriting full call_graph.db
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | HOTFIX-slim-122 |
|
|
6
|
+
| Status | In Progress |
|
|
7
|
+
| Priority | P2 |
|
|
8
|
+
| Release | 2.13.0 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
`_build_call_graph()` writes `call_graph.db` unconditionally when `sqlite_output: true`, including when running in `--focus` or `--entry` mode. These modes produce a subgraph (not the full call graph), so writing them to `call_graph.db` overwrites the complete dataset with a partial one.
|
|
13
|
+
|
|
14
|
+
## Fix
|
|
15
|
+
|
|
16
|
+
Only write `call_graph.db` when both `focus` and `entry` are falsy (i.e., full graph mode).
|
|
17
|
+
|
|
18
|
+
- **Target**: `src/pactkit/skills/visualize.py`
|
|
19
|
+
- **Line 855**: Add `and not focus` guard (BFS/entry path)
|
|
20
|
+
- **Line 891**: Add `and not focus` guard (full graph path with focus filter)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# HOTFIX-slim-123: call_graph.db dedup edges and filter orphan nodes
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | HOTFIX-slim-123 |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
|
|
9
|
+
## Background
|
|
10
|
+
|
|
11
|
+
`_write_sqlite_db()` had two data quality issues: (1) duplicate edges (35.8% in pactsearch) because `rel_edges` was inserted without dedup, and (2) orphan edges referencing nodes not in `func_registry` (e.g., `__module__` synthetic callers).
|
|
12
|
+
|
|
13
|
+
## Fix
|
|
14
|
+
|
|
15
|
+
- Target: `src/pactkit/skills/visualize.py:_write_sqlite_db()`
|
|
16
|
+
- Dedup `rel_edges` via set conversion before INSERT
|
|
17
|
+
- Filter edges to only include caller/callee pairs where both exist in `func_registry`
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# STORY-slim-115: Worktree/Parallel Session Artifact Drift Prevention
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-115 |
|
|
6
|
+
| Title | Worktree/Parallel Session Artifact Drift Prevention |
|
|
7
|
+
| Status | Draft |
|
|
8
|
+
| Release | TBD |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
### The Problem
|
|
13
|
+
|
|
14
|
+
PactKit 的多个共享 artifact 文件在 worktree 或并行 session 场景下会发生 **drift(漂移)**——一个 session 的正确状态被另一个 session 的旧版本覆盖。
|
|
15
|
+
|
|
16
|
+
**真实案例(koi 项目,2026-05-07)**:
|
|
17
|
+
1. Session A 在 `59a043b` 完成 STORY-026/028,board 正确显示它们在 Done 区
|
|
18
|
+
2. Session B(`/dev` worktree)基于更早的 board 版本工作
|
|
19
|
+
3. Session B 完成 STORY-029,commit 时用自己的旧 board 覆盖了 Session A 的正确状态
|
|
20
|
+
4. 结果:已完成的 STORY-026/028 被"移回" Backlog,archive 中已有记录但 board 与之矛盾
|
|
21
|
+
|
|
22
|
+
### Hot Files 分析
|
|
23
|
+
|
|
24
|
+
以下文件被多个 PDCA 命令读写,是并行冲突的高危区:
|
|
25
|
+
|
|
26
|
+
| File | Written By | Conflict Risk |
|
|
27
|
+
|------|------------|---------------|
|
|
28
|
+
| `docs/product/sprint_board.md` | Plan (add), Act (move to In Progress), Done (move to Done, archive) | **HIGH** — 整个文件被覆盖 |
|
|
29
|
+
| `docs/product/context.md` | Plan, Act, Done, Hotfix (context update) | **MEDIUM** — 最后写入者覆盖 |
|
|
30
|
+
| `docs/architecture/governance/lessons.md` | Done (append lessons) | **LOW** — append-only 但仍可能丢行 |
|
|
31
|
+
| `docs/architecture/governance/rules.md` | Done (update test count invariant) | **LOW** — 单行更新 |
|
|
32
|
+
| `docs/product/archive/archive_YYYYMM.md` | Done (append archived stories) | **LOW** — append-only |
|
|
33
|
+
|
|
34
|
+
### Root Cause
|
|
35
|
+
|
|
36
|
+
1. **Worktree 隔离不完整**:worktree 创建时 fork 了主分支的状态,但返回时没有 merge 主分支的 board 变更
|
|
37
|
+
2. **Board 是 mutable 的单一文件**:状态转移(Backlog→In Progress→Done)是覆盖式操作,不是增量操作
|
|
38
|
+
3. **没有 conflict detection**:commit 时如果 board 被其他 session 修改过,git 不会自动冲突(不同位置的修改会 auto-merge,导致逻辑不一致)
|
|
39
|
+
|
|
40
|
+
## Target Call Chain
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
/project-act → Phase 0.6 → move story to In Progress → sprint_board.md
|
|
44
|
+
/project-done → Phase 3.5 → archive story → sprint_board.md + archive_YYYYMM.md
|
|
45
|
+
/dev worktree → ... → commit → merge back → potential board drift
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Requirements
|
|
49
|
+
|
|
50
|
+
### R1: Derived Board View (MUST)
|
|
51
|
+
Board 不再是手动维护的 mutable 文件,而是从 specs + archive 推导的 **view**:
|
|
52
|
+
- Story 存在于 `docs/specs/{ID}.md` 且 `status: backlog` → Backlog
|
|
53
|
+
- Story 存在于 `docs/specs/{ID}.md` 且 `status: in_progress` → In Progress
|
|
54
|
+
- Story 存在于 archive 或 spec `status: done` → Done(显示在 archive,不在 board)
|
|
55
|
+
|
|
56
|
+
状态存储在 spec 文件的 frontmatter 或 metadata table 中,单 story 单文件,并行修改不同 story 不冲突。
|
|
57
|
+
|
|
58
|
+
### R2: Board Generation Command (MUST)
|
|
59
|
+
`pactkit board` 命令动态生成 board 视图:
|
|
60
|
+
```bash
|
|
61
|
+
pactkit board # 输出 markdown 格式的当前 board
|
|
62
|
+
pactkit board --write # 可选:写入 sprint_board.md(用于兼容现有工具)
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### R3: Playbook Migration (MUST)
|
|
66
|
+
修改 PDCA 命令的 board 操作:
|
|
67
|
+
- `/project-plan`:`pactkit spec-status {ID} backlog` 设置 spec 状态
|
|
68
|
+
- `/project-act`:`pactkit spec-status {ID} in_progress` 设置 spec 状态
|
|
69
|
+
- `/project-done`:`pactkit spec-status {ID} done` 设置 spec 状态 + archive 追加
|
|
70
|
+
|
|
71
|
+
不再直接编辑 `sprint_board.md`。
|
|
72
|
+
|
|
73
|
+
### R4: Worktree Merge Protocol (SHOULD)
|
|
74
|
+
Worktree 返回主分支前,自动检查 board 相关文件是否有冲突:
|
|
75
|
+
- 如果 spec 文件被主分支修改过,提示用户 merge
|
|
76
|
+
- 如果 archive 文件被主分支追加过,auto-merge(append-only 安全)
|
|
77
|
+
|
|
78
|
+
### R5: Conflict Detection Hook (SHOULD)
|
|
79
|
+
Pre-commit hook 检测 board drift:
|
|
80
|
+
- 如果 `sprint_board.md` 的 base 版本与当前 HEAD 不同,警告用户
|
|
81
|
+
- 建议运行 `pactkit board --write` 重新生成
|
|
82
|
+
|
|
83
|
+
### R6: Backward Compatibility (MUST)
|
|
84
|
+
- 现有 `sprint_board.md` 格式保持不变(generated file 或 view)
|
|
85
|
+
- 不使用 `pactkit` CLI 的用户仍可手动编辑 board(但建议迁移)
|
|
86
|
+
- Migration path:运行 `pactkit board-migrate` 从现有 board 反推 spec status
|
|
87
|
+
|
|
88
|
+
## Security Scope
|
|
89
|
+
|
|
90
|
+
| Check | Applicable | Reason |
|
|
91
|
+
|-------|------------|--------|
|
|
92
|
+
| SEC-1 User Input | N/A | Internal tooling, no user input |
|
|
93
|
+
| SEC-2 Secrets | N/A | No secrets involved |
|
|
94
|
+
| SEC-3 File Access | N/A | Only project-local files |
|
|
95
|
+
| SEC-4 Network | N/A | No network access |
|
|
96
|
+
| SEC-5 Auth | N/A | No auth changes |
|
|
97
|
+
| SEC-6 Data Validation | N/A | No external data |
|
|
98
|
+
| SEC-7 Crypto | N/A | No crypto |
|
|
99
|
+
| SEC-8 Logging | N/A | No sensitive data logging |
|
|
100
|
+
|
|
101
|
+
## Acceptance Criteria
|
|
102
|
+
|
|
103
|
+
### AC1: Derived Board Correctness (R1, R2)
|
|
104
|
+
- **Given** a project with 3 specs: A (status: backlog), B (status: in_progress), C (status: done)
|
|
105
|
+
- **When** `pactkit board` is run
|
|
106
|
+
- **Then** output shows A in Backlog, B in In Progress, Done section is empty (done stories go to archive)
|
|
107
|
+
|
|
108
|
+
### AC2: Spec Status Transition (R3)
|
|
109
|
+
- **Given** a spec STORY-001 with `status: backlog`
|
|
110
|
+
- **When** `pactkit spec-status STORY-001 in_progress` is run
|
|
111
|
+
- **Then** the spec file's status field is updated to `in_progress`
|
|
112
|
+
- **And** `pactkit board` shows STORY-001 in In Progress section
|
|
113
|
+
|
|
114
|
+
### AC3: Parallel Session Safety (R1)
|
|
115
|
+
- **Given** two parallel sessions working on different stories (STORY-A and STORY-B)
|
|
116
|
+
- **When** both sessions complete and commit
|
|
117
|
+
- **Then** both stories' spec status are correctly updated (no overwrite)
|
|
118
|
+
- **And** `pactkit board` shows correct state for both
|
|
119
|
+
|
|
120
|
+
### AC4: Migration from Existing Board (R6)
|
|
121
|
+
- **Given** an existing `sprint_board.md` with stories in various sections
|
|
122
|
+
- **When** `pactkit board-migrate` is run
|
|
123
|
+
- **Then** each story's spec file is updated with the correct status
|
|
124
|
+
- **And** `pactkit board` reproduces the original board structure
|
|
125
|
+
|
|
126
|
+
## Implementation Steps
|
|
127
|
+
|
|
128
|
+
| Step | File | Change |
|
|
129
|
+
|------|------|--------|
|
|
130
|
+
| 1 | `src/pactkit/board.py` | New module: `generate_board()`, `get_spec_status()`, `set_spec_status()` |
|
|
131
|
+
| 2 | `src/pactkit/cli.py` | Add `board`, `spec-status`, `board-migrate` commands |
|
|
132
|
+
| 3 | `pactkit-plugin/commands/project-plan.md` | Replace board edit with `pactkit spec-status` |
|
|
133
|
+
| 4 | `pactkit-plugin/commands/project-act.md` | Replace board edit with `pactkit spec-status` |
|
|
134
|
+
| 5 | `pactkit-plugin/commands/project-done.md` | Replace board edit with `pactkit spec-status` |
|
|
135
|
+
| 6 | `tests/unit/test_board.py` | Unit tests for board generation and status transitions |
|
|
136
|
+
|
|
137
|
+
## Notes
|
|
138
|
+
|
|
139
|
+
- 这个改动是 **breaking change**,需要在 release notes 中说明 migration path
|
|
140
|
+
- 考虑添加 `pactkit.yaml` 配置项 `board.mode: derived | legacy` 支持渐进迁移
|
|
141
|
+
- Context.md 的 drift 问题较轻(信息类文件,不影响工作流状态),可以后续处理
|