pactkit 2.12.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.12.0 → pactkit-2.14.0}/.gitignore +3 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/.opencode/pactkit.yaml +1 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/CHANGELOG.md +27 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/PKG-INFO +6 -4
- {pactkit-2.12.0 → pactkit-2.14.0}/README.md +5 -3
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/architecture/governance/archive/lessons_archive_202603.md +8 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/architecture/governance/lessons.md +6 -8
- {pactkit-2.12.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-113.md +175 -0
- pactkit-2.14.0/docs/specs/STORY-slim-114.md +158 -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.12.0 → pactkit-2.14.0}/pyproject.toml +1 -1
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/__init__.py +1 -1
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/cli.py +144 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/config.py +8 -4
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/prompts/commands.py +47 -11
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/prompts/skills.py +60 -11
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/prompts/workflows.py +3 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/python_analyzer.py +98 -21
- pactkit-2.14.0/src/pactkit/skills/interface_summary.py +199 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/visualize.py +42 -7
- pactkit-2.14.0/tests/unit/test_interface_summary.py +207 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_prompt_cli_refs.py +1 -1
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story063_prompt_slimming.py +4 -1
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim026.py +2 -2
- pactkit-2.14.0/tests/unit/test_story_slim114_journey_sync.py +130 -0
- 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.12.0/docs/product/context.md +0 -31
- pactkit-2.12.0/docs/product/sprint_board.md +0 -39
- {pactkit-2.12.0 → pactkit-2.14.0}/.github/workflows/pactkit.yml +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/.github/workflows/publish.yml +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/AGENTS.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/CODE_OF_CONDUCT.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/CONTRIBUTING.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/LICENSE +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/SECURITY.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/architecture/governance/harness_audit.json +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/architecture/governance/philosophy.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/assets/logo.png +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/e2e/journey.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/guides/codex-integration-preresearch.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/guides/tool-integration-checklist.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/product/archive/archive_202602.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/product/archive/archive_202603.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/product/archive/archive_202604.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/product/friction-log.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/product/prd.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-001.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-002.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-003.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-004.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-005.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-006.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-007.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-008.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-009.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-010.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-011.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-012.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-013.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-014.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-015.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-016.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-017.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-018.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-019.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-020.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-021.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-022.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-023.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-024.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-025.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-026.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-027.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-028.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-029.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-030.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-031.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-032.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-033.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-034.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-035.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-slim-001.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-slim-002.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-slim-003.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-slim-004.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-slim-005.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-slim-006.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-slim-089.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-slim-107.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-023.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-049.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-050.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-051.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-052.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-061.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-062.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-067.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-069.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-070.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-085.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-087.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-096.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-099.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-107.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-001.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-002.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-003.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-004.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-005.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-006.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-007.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-008.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-009.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-010.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-011.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-012.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-013.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-014.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-015.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-016.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-017.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-018.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-019.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-020.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-021.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-022.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-023.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-024.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-025.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-026.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-027.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-028.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-029.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-030.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-031.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-032.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-033.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-034.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-035.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-036.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-037.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-038.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-039.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-040.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-041.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-042.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-043.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-044.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-045.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-046.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-047.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-048.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-049.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-050.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-051.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-052.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-053.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-054.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-055.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-056.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-057.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-058.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-059.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-060.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-061.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-062.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-063.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-064.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-065.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-069.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-070.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-071.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-072.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-073.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-001.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-005.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-006.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-007.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-009.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-010.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-011.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-012.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-013.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-014.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-015.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-016.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-017.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-018.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-019.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-020.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-021.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-022.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-023.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-024.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-028.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-029.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-030.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-031.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-032.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-033.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-034.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-035.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-036.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-037.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-038.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-039.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-040.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-041.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-042.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-043.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-044.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-045.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-046.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-047.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-048.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-049.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-050.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-051.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-052.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-053.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-054.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-055.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-056.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-057.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-058.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-059.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-060.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-063.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-066.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-067.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-068.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-069.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-070.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-071.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-072.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-073.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-074.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-075.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-076.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-077.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-078.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-079.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-080.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-081.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-082.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-083.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-084.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-086.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-088.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-089.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-090.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-091.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-092.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-093.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-094.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-095.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-097.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-098.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-099.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-100.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-101.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-102.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-103.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-104.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-105.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-106.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-107.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-108.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-109.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-110.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-111.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-112.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/test_cases/BUG-001_case.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/test_cases/BUG-002_case.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-028_case.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-029_case.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-031_case.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-032_case.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-033_case.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-034_case.md +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/opencode.json +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/__main__.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/audit.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/backfill.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/cleaners.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/context_gen.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/coverage_gate.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/doctor.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/garden.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/generators/__init__.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/generators/adapter.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/generators/deploy_base.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/generators/deployer.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/guards.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/id_generator.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/invariants.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/issue_sync.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/lazy_visualize.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/lessons.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/lint_runner.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/observe.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/profiles.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/prompts/__init__.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/prompts/agents.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/prompts/references.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/prompts/rules.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/regression.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/schemas.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/scripts.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/sec_scope.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/__init__.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/__init__.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/board.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/report.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/scaffold.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/spec_linter.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/spec_status.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/test_mapper.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/utils.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/validators.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/conftest.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/e2e/__init__.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/e2e/cli/__init__.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/e2e/cli/test_cli_e2e.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/fixtures/api_call_parser/page.tsx +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/integration/__init__.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/integration/test_deploy_classic.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_agent_features.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_agent_frontmatter.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_agents_enrichment.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_audit.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_blast_radius.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_board_bug027.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_board_sections.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug001_skill_path.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug002_plugin_paths.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug003_multi_import.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug004_dead_set.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug005_archive_taskless.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug006_scan_excludes.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug008_stale_command_refs.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug009_project_config_backfill.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug011_stale_refs.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug012_call_graph_filter.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug013_config_single_source.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug014_version_hygiene.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug017_project_init_playbook.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug019_venv_deployment.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug020_claude_md_backup.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug025_release_delegation.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug026_version_sync.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug028_ghost_refs.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_021.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_022.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_023.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_024.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_slim001_env_detection.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_slim003.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_slim004.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_slim005.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_slim006.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_check_command.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_check_extensions_072_073.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_check_playbook_072_073.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_command_frontmatter.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_command_visualize_modes.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_complexity.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_config.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_config_auto_merge.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_constitution_sharpening.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_context_gen.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_create_skill.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_cross_flow_matrix.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_deploy_base.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_deployer_cleanup.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_deployer_plugin.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_design_command.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_done_gates.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_draw_prompt.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_draw_references.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_drawio_mcp.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_garden.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_home_path_fix.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_hotfix_command.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_init_guard.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_init_playbook_074.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_lang_profiles.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_layer_violations.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_lessons_rotation_075.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_list_stories.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_mcp_integration.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_model_config.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_modular_constitution.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_monorepo_detect.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_multi_prefix.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_observe.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_pdca_slim.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_profiles.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_project_visibility.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_prompt_quality_075.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_prompt_structural_invariants.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_prompts_package.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_release.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_release_field.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_release_v110.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_render_prompt.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_report_parser.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_report_unified.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_review_command.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_rules_enrichment.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_scaffold.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_scaffold_developer_prefix.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_schemas.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_script_extraction.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_selective_deploy.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_session_context.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_skill_structure.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_skills_enrichment.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_slim_deps_088.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_smart_regression.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_solution_design_rule.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_sprint_command.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_stack_references.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_status_command.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_statusline.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story014_release.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story015_ci_lint_gate.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story016_claude_md.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story017_init_claude_md.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story018_arch_staleness.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story019_bailout.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story020_horizon.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story021_rfc.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story022_decision_tree.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story023_test_quality.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story024_native_agent.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story025_ci_pipeline.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story026_issue_tracker.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story028_rule_scoping.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story029_doctor.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story030_lint.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story031_git_init_guard.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story032_greenfield_redirect.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story033_config_backfill.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story034_plan_config_refresh.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story035_readme_docs.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story037_regression_fix.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story038_call_graph_update.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story039_venv_config.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story040_layered_claude_md.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story042_spec_linter.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story043_active_clarify.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story044_consistency_check.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story045_auto_pr.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story046_agent_adapter.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story047_enterprise_flags.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story048_worktree_isolation.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story049_community_standards.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story051_workflow_streamlining.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story052_conditional_github_release.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story053_impact_regression.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story055_commands.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story055_config.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story055_spec_linter.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story056_commands.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story056_config.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story057_implicit_cleanup.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story058_opencode_extraction.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story058_routing_fix.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story059_codex_removal.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story060_init_hang.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story061_remove_thinking.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story062_mcp_recommendations.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story064_venv_local_md.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story065_sprint_model.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story072_developer_prefix.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story106_lateral_scan.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim011_command_rules.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim012_ci.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_clean.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_context.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_guard.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_next_id.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_regression.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_sec_scope.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_validators.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim015_doctor.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim017.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim018.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim021.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim022.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim023.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim024.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim025.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim027.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim028.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim029.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim030.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim031.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim032.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim033.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim034.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim035.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim036.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim037.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim038.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim039.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim040.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim041.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim042.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim043.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim044.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim045.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim046.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim047.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim048.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim049.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim051.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim052.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim053.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim054.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim055.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim056.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim060_codex_profile.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim063.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim065.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim076_multistack.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim078.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim079.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim080.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim081.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim082.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim083.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim084.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim095.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim102_version_marker.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim104_should_semantics.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim107.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim109_journey_spec.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim111_playwright_assertion.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim112_rules_split.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_tools.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_topology_parsers_066.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_update_task.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_visualize_call_nested.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_visualize_chain_fix.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_visualize_modes.py +0 -0
- {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_visualize_multilang_chain.py +0 -0
|
@@ -4,6 +4,33 @@ 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.14.0] - 2026-05-26
|
|
8
|
+
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
33
|
+
|
|
7
34
|
## [2.12.0] - 2026-05-06
|
|
8
35
|
|
|
9
36
|
### Changed
|
|
@@ -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) |
|
{pactkit-2.12.0 → pactkit-2.14.0}/docs/architecture/governance/archive/lessons_archive_202603.md
RENAMED
|
@@ -54,3 +54,11 @@
|
|
|
54
54
|
| 2026-03-24 | _scan_hooks() only accepts files with 'use' prefix in hook dirs (src/hooks/, composables/) to prevent utility files from becoming hook nodes | visualize.py:_scan_hooks |
|
|
55
55
|
| 2026-03-24 | regression_workflow_impact hook/store matching uses node.id substring of changed file path, not reverse — e.g. 'useAuth' in 'src/hooks/useAuth.ts' | visualize.py:regression_workflow_impact |
|
|
56
56
|
| 2026-03-25 | export_focus_graphs() in visualize.py uses forward_reach() (not reverse_reach()) because entry points (command/service/page) are graph roots that invoke downward — forward BFS shows their dependency tree | src/pactkit/skills/visualize.py:export_focus_graphs |
|
|
57
|
+
| 2026-03-26 | board.py update_task: added 3-tier fuzzy fallback (single-task auto-mark, substring match, numeric index) to handle real-world callers that don't know exact task names on the board | src/pactkit/skills/board.py:update_task |
|
|
58
|
+
| 2026-03-26 | Position-based block removal (start, end tuples) is safer than str.find() for board operations — prevents substring false matches on similar story IDs | board.py:_parse_story_blocks |
|
|
59
|
+
| 2026-03-26 | Fixing _parse_story_blocks to return adjusted_end (len match) inherently fixed fix_board offset compensation — root cause fix in board.py:_parse_story_blocks eliminated downstream R2 symptom in board.py:fix_board | board.py:_parse_story_blocks,board.py:fix_board |
|
|
60
|
+
| 2026-03-26 | Helpers added to visualize.py standalone header get stripped by load_script(); always place new functions below the SCRIPT BODY marker | visualize.py:_mermaid_escape |
|
|
61
|
+
| 2026-03-26 | dict.pop() in shared config references causes caller mutation; use .get() for read-only access to avoid breaking multi-call scenarios | deployer.py:_deploy_ci |
|
|
62
|
+
| 2026-03-26 | _atomic_mmd_write() in visualize.py prevents truncated .mmd on crash via tmp+rename; all 4 write sites converted | visualize.py:_atomic_mmd_write |
|
|
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
|
+
| 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 |
|
|
@@ -2,14 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
| Date | Lesson | Context |
|
|
4
4
|
|------|--------|---------|
|
|
5
|
-
| 2026-03-26 | board.py update_task: added 3-tier fuzzy fallback (single-task auto-mark, substring match, numeric index) to handle real-world callers that don't know exact task names on the board | src/pactkit/skills/board.py:update_task |
|
|
6
|
-
| 2026-03-26 | Position-based block removal (start, end tuples) is safer than str.find() for board operations — prevents substring false matches on similar story IDs | board.py:_parse_story_blocks |
|
|
7
|
-
| 2026-03-26 | Fixing _parse_story_blocks to return adjusted_end (len match) inherently fixed fix_board offset compensation — root cause fix in board.py:_parse_story_blocks eliminated downstream R2 symptom in board.py:fix_board | board.py:_parse_story_blocks,board.py:fix_board |
|
|
8
|
-
| 2026-03-26 | Helpers added to visualize.py standalone header get stripped by load_script(); always place new functions below the SCRIPT BODY marker | visualize.py:_mermaid_escape |
|
|
9
|
-
| 2026-03-26 | dict.pop() in shared config references causes caller mutation; use .get() for read-only access to avoid breaking multi-call scenarios | deployer.py:_deploy_ci |
|
|
10
|
-
| 2026-03-26 | _atomic_mmd_write() in visualize.py prevents truncated .mmd on crash via tmp+rename; all 4 write sites converted | visualize.py:_atomic_mmd_write |
|
|
11
|
-
| 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 |
|
|
12
|
-
| 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 |
|
|
13
5
|
| 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 |
|
|
14
6
|
| 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 |
|
|
15
7
|
| 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 |
|
|
@@ -54,3 +46,9 @@
|
|
|
54
46
|
| 2026-04-24 | Plan Phase横向扫描(Lateral Scan)比纵向trace更重要——PactSearch的10个技术债中60%源于缺少水平重复检测。修复方向是改Plan playbook引导Architect用已有工具(LSP/visualize/grep)做横向扫描,而非新建CLI | commands.py:Plan_Phase_1 |
|
|
55
47
|
| 2026-04-24 | When migrating functionality (e.g., version checking from pactkit.yaml to global marker), grep all references across source, prompts, tests, and CLI help text — partial migration leaves ghost behavior | board.py:update_version |
|
|
56
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
|
+
| 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
|
+
| 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,175 @@
|
|
|
1
|
+
# STORY-slim-113: pactkit interface-summary CLI — Code Enforce 接口摘要
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-113 |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.13.0 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
### 问题
|
|
13
|
+
|
|
14
|
+
STORY-slim-108 引入了"接口摘要"概念——Act Phase 1 对 trace 发现的非目标模块只读签名+docstring。但当前实现**完全依赖 Prompt 指导**(pactkit-trace SKILL.md 的 "Layered Output" 表格 + Act Phase 1.2 的一句 "Layered Loading"),AI 实际执行时仍然直接 Read 完整文件,因为:
|
|
15
|
+
|
|
16
|
+
1. 没有工具约束——AI 调用 Read 工具时没有 `--summary-only` 限制
|
|
17
|
+
2. 一句文字指导不足以改变 AI 的默认行为
|
|
18
|
+
3. 违反了 PactKit 自己的 "Code Enforces, Prompt Instructs" 原则(架构原则 §10)
|
|
19
|
+
|
|
20
|
+
### 方案
|
|
21
|
+
|
|
22
|
+
新增 `pactkit interface-summary <file>` CLI 命令:
|
|
23
|
+
- 基于现有 `python_analyzer.py` 的 AST 能力(已有 `extract_classes`、`extract_functions_and_calls`)
|
|
24
|
+
- 输出经代码裁剪的接口摘要,AI 拿到的物理上就是精简内容
|
|
25
|
+
- Act Phase 1 改为**显式步骤**:对非目标模块调用此 CLI 而非 Read
|
|
26
|
+
|
|
27
|
+
### 为什么不用 hook
|
|
28
|
+
|
|
29
|
+
用户明确要求不使用 hook。本方案通过 CLI 输出 + playbook 步骤变更来实现 Code Enforce,无需 harness 层面的文件拦截。
|
|
30
|
+
|
|
31
|
+
## Requirements
|
|
32
|
+
|
|
33
|
+
### R1: 新增 `pactkit interface-summary` CLI 命令 (MUST)
|
|
34
|
+
|
|
35
|
+
新增子命令接受一个或多个文件路径,输出接口摘要:
|
|
36
|
+
|
|
37
|
+
```
|
|
38
|
+
pactkit interface-summary src/pactkit/generators/deployer.py
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
输出格式(per file):
|
|
42
|
+
```
|
|
43
|
+
# deployer.py — Interface Summary
|
|
44
|
+
|
|
45
|
+
class ClassicDeployer(BaseDeployer):
|
|
46
|
+
"""Deploy PactKit to ~/.claude/ (Classic format)."""
|
|
47
|
+
+deploy(target, config) -> DeployResult
|
|
48
|
+
+_deploy_rules(claude_root, enabled_rules) -> None
|
|
49
|
+
+_deploy_skills(claude_root, enabled_skills) -> None
|
|
50
|
+
-_cleanup_legacy(target) -> None
|
|
51
|
+
|
|
52
|
+
def atomic_write(path: Path, content: str) -> None:
|
|
53
|
+
"""Write content atomically via tempfile + rename."""
|
|
54
|
+
|
|
55
|
+
def _render_prompt(template: str, profile: FormatProfile) -> str:
|
|
56
|
+
"""Replace placeholders with profile-specific values."""
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
提取规则:
|
|
60
|
+
- **Class**: class name + bases + docstring 第一行 + public/private methods with signature
|
|
61
|
+
- **Function**: def name + params with type hints + return type + docstring 第一行
|
|
62
|
+
- **Skip**: 函数体、局部变量、内部逻辑
|
|
63
|
+
- **Constants/Enums**: 顶层 `UPPER_CASE` 赋值保留名称和类型
|
|
64
|
+
|
|
65
|
+
### R2: 多语言支持通过 LANG_PROFILES 分派 (SHOULD)
|
|
66
|
+
|
|
67
|
+
使用已有的 `LANG_PROFILES` + analyzer 架构:
|
|
68
|
+
- Python: `ast` 模块提取(已有基础设施)
|
|
69
|
+
- TypeScript: `tree_sitter_typescript` 提取 exported declarations
|
|
70
|
+
- Go: `tree_sitter_go` 提取 exported (大写) func/struct
|
|
71
|
+
|
|
72
|
+
初始版本 MUST 支持 Python。TS/Go 为 SHOULD。
|
|
73
|
+
|
|
74
|
+
### R3: Act Phase 1 增加显式步骤 (MUST)
|
|
75
|
+
|
|
76
|
+
修改 `project-act/SKILL.md` Phase 1.2,从当前的一句指导:
|
|
77
|
+
> "Layered Loading: For non-target modules discovered by trace, read interface summary..."
|
|
78
|
+
|
|
79
|
+
改为显式步骤:
|
|
80
|
+
```
|
|
81
|
+
2b. **Interface Summary** (for non-target modules):
|
|
82
|
+
- For each module discovered by trace that is NOT the modification target:
|
|
83
|
+
`pactkit interface-summary <file>`
|
|
84
|
+
- Only escalate to `Read <file>` when you confirm the module needs modification.
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### R4: pactkit-trace SKILL.md 更新输出格式指引 (MUST)
|
|
88
|
+
|
|
89
|
+
修改 pactkit-trace SKILL.md Phase 3 "Layered Output" 部分,从"建议 AI 自行精简"改为"调用 CLI 获取":
|
|
90
|
+
|
|
91
|
+
> For related (non-target) modules, run `pactkit interface-summary <file>` instead of reading full source.
|
|
92
|
+
|
|
93
|
+
### R5: 不修改 Read 工具行为 (MUST NOT)
|
|
94
|
+
|
|
95
|
+
本 story 不修改 Claude Code harness 的 Read 工具、不添加 hook、不拦截文件访问。通过提供更好的替代工具来引导行为,而非限制现有工具。
|
|
96
|
+
|
|
97
|
+
## Acceptance Criteria
|
|
98
|
+
|
|
99
|
+
### AC1: CLI 输出接口摘要 (R1)
|
|
100
|
+
|
|
101
|
+
- **Given** 一个 Python 文件 `src/pactkit/generators/deployer.py`(含多个 class 和函数)
|
|
102
|
+
- **When** 运行 `pactkit interface-summary src/pactkit/generators/deployer.py`
|
|
103
|
+
- **Then** 输出包含所有 class(带 bases 和 methods 签名)和顶层函数(带参数和返回类型),不包含函数体
|
|
104
|
+
|
|
105
|
+
### AC2: 输出行数显著小于原文件 (R1)
|
|
106
|
+
|
|
107
|
+
- **Given** `deployer.py` 约 600+ 行
|
|
108
|
+
- **When** 运行 `pactkit interface-summary` 对其生成摘要
|
|
109
|
+
- **Then** 输出行数 ≤ 原文件行数的 25%(即 ≤ 150 行)
|
|
110
|
+
|
|
111
|
+
### AC3: 多文件支持 (R1)
|
|
112
|
+
|
|
113
|
+
- **Given** 两个 Python 文件 A.py 和 B.py
|
|
114
|
+
- **When** 运行 `pactkit interface-summary A.py B.py`
|
|
115
|
+
- **Then** 输出两个文件的摘要,以 `# filename — Interface Summary` 分隔
|
|
116
|
+
|
|
117
|
+
### AC4: Act Phase 1 步骤可验证 (R3)
|
|
118
|
+
|
|
119
|
+
- **Given** 修改后的 project-act SKILL.md
|
|
120
|
+
- **When** 读取 Phase 1 内容
|
|
121
|
+
- **Then** 存在显式编号步骤 "2b" 包含 `pactkit interface-summary` 命令
|
|
122
|
+
|
|
123
|
+
### AC5: 非 Python 文件 graceful fallback (R2)
|
|
124
|
+
|
|
125
|
+
- **Given** 一个 .go 文件但 tree-sitter-go 未安装
|
|
126
|
+
- **When** 运行 `pactkit interface-summary file.go`
|
|
127
|
+
- **Then** 输出警告 "Unsupported or unavailable analyzer for .go" 并退出 0(不阻塞)
|
|
128
|
+
|
|
129
|
+
## Target Call Chain
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
pactkit interface-summary <files>
|
|
133
|
+
→ cli.py: main() → parse args → _interface_summary_command(args)
|
|
134
|
+
→ interface_summary.py: generate_summary(file_paths)
|
|
135
|
+
→ detect language from extension
|
|
136
|
+
→ LANG_PROFILES dispatch → python_analyzer / ts_analyzer / go_analyzer
|
|
137
|
+
→ For Python:
|
|
138
|
+
→ ast.parse(source)
|
|
139
|
+
→ Extract: class defs (name, bases, docstring, method signatures)
|
|
140
|
+
→ Extract: top-level functions (name, params, return type, docstring)
|
|
141
|
+
→ Extract: top-level constants (UPPER_CASE assignments)
|
|
142
|
+
→ Format output as structured text
|
|
143
|
+
→ Print to stdout
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Implementation Steps
|
|
147
|
+
|
|
148
|
+
| Step | File | Action | Dependencies | Risk |
|
|
149
|
+
|------|------|--------|-------------|------|
|
|
150
|
+
| 1 | `src/pactkit/skills/interface_summary.py` | 新建:接口摘要提取逻辑,复用 python_analyzer AST 能力 | None | Medium |
|
|
151
|
+
| 2 | `src/pactkit/cli.py` | 注册 `interface-summary` 子命令 | Step 1 | Low |
|
|
152
|
+
| 3 | `~/.claude/skills/project-act/SKILL.md` (source: `src/pactkit/prompts/commands.py`) | Phase 1.2 → 1.2a + 1.2b 显式步骤 | Step 1-2 | Low |
|
|
153
|
+
| 4 | `~/.claude/skills/pactkit-trace/SKILL.md` (source: `src/pactkit/prompts/skills.py`) | Phase 3 Layered Output 改为 CLI 调用指引 | Step 1-2 | Low |
|
|
154
|
+
| 5 | `tests/unit/test_interface_summary.py` | 新建:单元测试覆盖 Python 文件摘要输出 | Step 1 | Low |
|
|
155
|
+
|
|
156
|
+
## Security Scope
|
|
157
|
+
|
|
158
|
+
| Check | Applicable | Reason |
|
|
159
|
+
|-------|------------|--------|
|
|
160
|
+
| SEC-1 | No | 无秘钥变更 |
|
|
161
|
+
| SEC-2 | No | 输入为本地文件路径,已有 file_path.stat() 大小检查 |
|
|
162
|
+
| SEC-3 | No | 无数据库 |
|
|
163
|
+
| SEC-4 | No | 无 UI |
|
|
164
|
+
| SEC-5 | No | 无认证 |
|
|
165
|
+
| SEC-6 | No | 无接口暴露 |
|
|
166
|
+
| SEC-7 | No | CLI 输出,无敏感信息 |
|
|
167
|
+
| SEC-8 | No | 无新依赖(复用现有 ast + tree_sitter) |
|
|
168
|
+
|
|
169
|
+
## Out of Scope
|
|
170
|
+
|
|
171
|
+
- 修改 Claude Code Read 工具行为
|
|
172
|
+
- Hook 机制
|
|
173
|
+
- 自动拦截 AI 的 Read 调用
|
|
174
|
+
- Java analyzer 支持(已有但不在本 story 优先级内)
|
|
175
|
+
- `pactkit trace` CLI 命令(本 story 只做 interface-summary,trace 仍是 skill)
|