pactkit 2.14.1__tar.gz → 2.14.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pactkit-2.14.2/.opencode/pactkit.yaml +23 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/CHANGELOG.md +14 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/PKG-INFO +2 -2
- {pactkit-2.14.1 → pactkit-2.14.2}/README.md +1 -1
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/architecture/governance/archive/lessons_archive_202603.md +1 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/architecture/governance/lessons.md +2 -1
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/architecture/governance/rules.md +1 -1
- pactkit-2.14.2/docs/product/archive/archive_202606.md +17 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/product/context.md +3 -3
- pactkit-2.14.2/docs/specs/STORY-slim-126.md +131 -0
- pactkit-2.14.2/docs/specs/STORY-slim-127.md +116 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/pyproject.toml +1 -1
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/__init__.py +1 -1
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/cli.py +23 -1
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/config.py +3 -19
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/generators/deployer.py +109 -70
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/lazy_visualize.py +40 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/prompts/commands.py +2 -2
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/prompts/rules.py +0 -29
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/prompts/workflows.py +1 -1
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_drawio_mcp.py +4 -32
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_mcp_integration.py +2 -11
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story033_config_backfill.py +7 -8
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story040_layered_claude_md.py +16 -10
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story062_mcp_recommendations.py +4 -4
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim028.py +8 -9
- pactkit-2.14.2/tests/unit/test_story_slim126.py +101 -0
- pactkit-2.14.2/tests/unit/test_story_slim127_managed_block.py +233 -0
- pactkit-2.14.1/.opencode/pactkit.yaml +0 -172
- {pactkit-2.14.1 → pactkit-2.14.2}/.codegraph/.gitignore +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/.github/workflows/pactkit.yml +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/.github/workflows/publish.yml +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/.gitignore +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/AGENTS.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/CODE_OF_CONDUCT.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/CONTRIBUTING.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/LICENSE +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/SECURITY.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/architecture/governance/harness_audit.json +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/architecture/governance/philosophy.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/assets/logo.png +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/e2e/journey.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/guides/codex-integration-preresearch.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/guides/tool-integration-checklist.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/product/archive/archive_202602.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/product/archive/archive_202603.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/product/archive/archive_202604.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/product/archive/archive_202605.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/product/friction-log.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/product/prd.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/product/sprint_board.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-001.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-002.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-003.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-004.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-005.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-006.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-007.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-008.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-009.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-010.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-011.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-012.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-013.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-014.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-015.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-016.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-017.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-018.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-019.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-020.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-021.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-022.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-023.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-024.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-025.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-026.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-027.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-028.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-029.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-030.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-031.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-032.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-033.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-034.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-035.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-slim-001.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-slim-002.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-slim-003.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-slim-004.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-slim-005.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-slim-006.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-slim-089.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/BUG-slim-107.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-023.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-049.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-050.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-051.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-052.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-061.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-062.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-067.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-069.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-070.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-085.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-087.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-096.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-099.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-107.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-117.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-122.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-123.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-126.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/HOTFIX-slim-127.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-001.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-002.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-003.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-004.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-005.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-006.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-007.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-008.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-009.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-010.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-011.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-012.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-013.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-014.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-015.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-016.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-017.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-018.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-019.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-020.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-021.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-022.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-023.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-024.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-025.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-026.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-027.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-028.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-029.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-030.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-031.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-032.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-033.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-034.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-035.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-036.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-037.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-038.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-039.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-040.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-041.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-042.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-043.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-044.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-045.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-046.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-047.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-048.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-049.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-050.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-051.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-052.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-053.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-054.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-055.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-056.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-057.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-058.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-059.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-060.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-061.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-062.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-063.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-064.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-065.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-069.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-070.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-071.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-072.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-073.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-001.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-005.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-006.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-007.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-009.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-010.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-011.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-012.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-013.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-014.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-015.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-016.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-017.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-018.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-019.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-020.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-021.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-022.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-023.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-024.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-028.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-029.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-030.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-031.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-032.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-033.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-034.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-035.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-036.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-037.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-038.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-039.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-040.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-041.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-042.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-043.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-044.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-045.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-046.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-047.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-048.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-049.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-050.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-051.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-052.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-053.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-054.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-055.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-056.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-057.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-058.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-059.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-060.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-063.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-066.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-067.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-068.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-069.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-070.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-071.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-072.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-073.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-074.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-075.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-076.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-077.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-078.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-079.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-080.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-081.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-082.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-083.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-084.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-086.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-088.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-089.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-090.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-091.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-092.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-093.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-094.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-095.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-097.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-098.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-099.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-100.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-101.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-102.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-103.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-104.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-105.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-106.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-107.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-108.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-109.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-110.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-111.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-112.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-113.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-114.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-115.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-116.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-118.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-119.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-120.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-121.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-124.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/specs/STORY-slim-125.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/test_cases/BUG-001_case.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/test_cases/BUG-002_case.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/test_cases/STORY-slim-028_case.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/test_cases/STORY-slim-029_case.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/test_cases/STORY-slim-031_case.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/test_cases/STORY-slim-032_case.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/test_cases/STORY-slim-033_case.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/docs/test_cases/STORY-slim-034_case.md +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/opencode.json +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/__main__.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/audit.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/backfill.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/cleaners.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/context_gen.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/coverage_gate.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/doctor.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/garden.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/generators/__init__.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/generators/adapter.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/generators/deploy_base.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/guards.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/id_generator.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/invariants.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/issue_sync.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/lessons.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/lint_runner.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/observe.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/profiles.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/prompts/__init__.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/prompts/agents.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/prompts/references.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/prompts/skills.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/regression.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/schemas.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/scripts.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/sec_scope.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/skills/__init__.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/skills/analyzers/__init__.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/skills/board.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/skills/interface_summary.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/skills/report.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/skills/scaffold.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/skills/spec_linter.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/skills/visualize.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/spec_status.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/test_mapper.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/utils.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/src/pactkit/validators.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/conftest.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/e2e/__init__.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/e2e/cli/__init__.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/e2e/cli/test_cli_e2e.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/fixtures/api_call_parser/page.tsx +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/integration/__init__.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/integration/test_deploy_classic.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_agent_features.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_agent_frontmatter.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_agents_enrichment.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_audit.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_blast_radius.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_board_bug027.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_board_sections.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug001_skill_path.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug002_plugin_paths.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug003_multi_import.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug004_dead_set.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug005_archive_taskless.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug006_scan_excludes.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug008_stale_command_refs.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug009_project_config_backfill.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug011_stale_refs.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug012_call_graph_filter.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug013_config_single_source.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug014_version_hygiene.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug017_project_init_playbook.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug019_venv_deployment.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug020_claude_md_backup.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug025_release_delegation.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug026_version_sync.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug028_ghost_refs.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug_021.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug_022.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug_023.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug_024.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug_slim001_env_detection.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug_slim003.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug_slim004.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug_slim005.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug_slim006.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_check_command.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_check_extensions_072_073.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_check_playbook_072_073.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_command_frontmatter.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_command_visualize_modes.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_complexity.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_config.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_config_auto_merge.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_constitution_sharpening.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_context_gen.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_create_skill.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_cross_flow_matrix.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_deploy_base.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_deployer_cleanup.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_deployer_plugin.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_design_command.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_done_gates.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_draw_prompt.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_draw_references.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_garden.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_home_path_fix.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_hotfix_command.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_init_guard.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_init_playbook_074.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_interface_summary.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_lang_profiles.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_layer_violations.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_lessons_rotation_075.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_list_stories.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_model_config.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_modular_constitution.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_monorepo_detect.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_multi_prefix.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_observe.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_pdca_slim.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_profiles.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_project_visibility.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_prompt_cli_refs.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_prompt_quality_075.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_prompt_structural_invariants.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_prompts_package.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_release.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_release_field.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_release_v110.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_render_prompt.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_report_parser.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_report_unified.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_review_command.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_rules_enrichment.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_scaffold.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_scaffold_developer_prefix.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_schemas.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_script_extraction.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_selective_deploy.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_session_context.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_skill_structure.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_skills_enrichment.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_slim_deps_088.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_smart_regression.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_solution_design_rule.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_sprint_command.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_stack_references.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_status_command.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_statusline.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story014_release.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story015_ci_lint_gate.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story016_claude_md.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story017_init_claude_md.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story018_arch_staleness.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story019_bailout.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story020_horizon.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story021_rfc.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story022_decision_tree.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story023_test_quality.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story024_native_agent.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story025_ci_pipeline.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story026_issue_tracker.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story028_rule_scoping.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story029_doctor.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story030_lint.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story031_git_init_guard.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story032_greenfield_redirect.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story034_plan_config_refresh.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story035_readme_docs.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story037_regression_fix.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story038_call_graph_update.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story039_venv_config.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story042_spec_linter.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story043_active_clarify.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story044_consistency_check.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story045_auto_pr.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story046_agent_adapter.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story047_enterprise_flags.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story048_worktree_isolation.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story049_community_standards.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story051_workflow_streamlining.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story052_conditional_github_release.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story053_impact_regression.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story055_commands.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story055_config.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story055_spec_linter.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story056_commands.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story056_config.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story057_implicit_cleanup.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story058_opencode_extraction.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story058_routing_fix.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story059_codex_removal.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story060_init_hang.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story061_remove_thinking.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story063_prompt_slimming.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story064_venv_local_md.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story065_sprint_model.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story072_developer_prefix.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story106_lateral_scan.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim011_command_rules.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim012_ci.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim014_clean.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim014_context.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim014_guard.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim014_next_id.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim014_regression.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim014_sec_scope.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim014_validators.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim015_doctor.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim017.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim018.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim021.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim022.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim023.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim024.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim025.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim026.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim027.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim029.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim030.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim031.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim032.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim033.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim034.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim035.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim036.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim037.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim038.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim039.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim040.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim041.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim042.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim043.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim044.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim045.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim046.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim047.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim048.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim049.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim051.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim052.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim053.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim054.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim055.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim056.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim060_codex_profile.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim063.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim065.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim076_multistack.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim078.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim079.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim080.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim081.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim082.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim083.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim084.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim095.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim102_version_marker.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim104_should_semantics.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim107.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim109_journey_spec.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim111_playwright_assertion.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim112_rules_split.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim114_journey_sync.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim119.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim120.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim121.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_story_slim125.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_tools.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_topology_parsers_066.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_update_task.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_visualize_call_nested.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_visualize_chain_fix.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_visualize_modes.py +0 -0
- {pactkit-2.14.1 → pactkit-2.14.2}/tests/unit/test_visualize_multilang_chain.py +0 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# PactKit Configuration (OpenCode)
|
|
2
|
+
# Only override non-default values. Absent keys = default (all enabled).
|
|
3
|
+
|
|
4
|
+
stack: python
|
|
5
|
+
developer: "slim"
|
|
6
|
+
|
|
7
|
+
ci:
|
|
8
|
+
provider: github
|
|
9
|
+
|
|
10
|
+
issue_tracker:
|
|
11
|
+
provider: github
|
|
12
|
+
|
|
13
|
+
release:
|
|
14
|
+
github_release: true
|
|
15
|
+
|
|
16
|
+
visualize:
|
|
17
|
+
graph_provider: codegraph
|
|
18
|
+
|
|
19
|
+
agent_models:
|
|
20
|
+
code-explorer: haiku
|
|
21
|
+
product-designer: opus
|
|
22
|
+
system-architect: opus
|
|
23
|
+
system-medic: haiku
|
|
@@ -4,6 +4,20 @@ 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.2] - 2026-06-01
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- **Managed-block update for project CLAUDE.md** (STORY-slim-127) — `pactkit update` now uses `<!-- pactkit:start -->` / `<!-- pactkit:end -->` markers. User content outside the managed block is preserved across updates. Supports four migration paths: fresh install, existing markers, legacy PactKit template, and user-modified files.
|
|
11
|
+
- **Codegraph sync enforcement via code** (STORY-slim-126) — `pactkit visualize --lazy` and `pactkit sync` now run `codegraph sync` automatically when `.codegraph/` exists. Removed prompt-based instructions that relied on AI compliance.
|
|
12
|
+
- **Codegraph priority in generated CLAUDE.md** — When `.codegraph/` exists, the generated project CLAUDE.md includes a "Code Intelligence" section instructing AI to prefer codegraph over grep/find.
|
|
13
|
+
|
|
14
|
+
### Changed
|
|
15
|
+
- **MCP strategy trimmed to Context7 + Memory** — Removed Playwright, Chrome DevTools, Draw.io, and shadcn from MCP rules and recommendations. These remain as conditional no-ops in command prompts but are no longer actively promoted.
|
|
16
|
+
- **Config backfill removed** — `pactkit update` no longer backfills default sections into `pactkit.yaml`. Absent keys now mean "accept default", keeping config files minimal.
|
|
17
|
+
|
|
18
|
+
### Fixed
|
|
19
|
+
- **Stale rule warnings** — Removed obsolete rule names from `.opencode/pactkit.yaml` that caused "Unknown rule" warnings on every `pactkit update`.
|
|
20
|
+
|
|
7
21
|
## [2.14.1] - 2026-05-28
|
|
8
22
|
|
|
9
23
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pactkit
|
|
3
|
-
Version: 2.14.
|
|
3
|
+
Version: 2.14.2
|
|
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
|
|
@@ -123,7 +123,7 @@ Requires Python 3.10+ and one of:
|
|
|
123
123
|
# Deploy to all 3 IDEs at once
|
|
124
124
|
pactkit init
|
|
125
125
|
|
|
126
|
-
# Update to latest playbooks (preserves your
|
|
126
|
+
# Update to latest playbooks (preserves your custom content in CLAUDE.md)
|
|
127
127
|
pactkit update
|
|
128
128
|
```
|
|
129
129
|
|
{pactkit-2.14.1 → pactkit-2.14.2}/docs/architecture/governance/archive/lessons_archive_202603.md
RENAMED
|
@@ -62,3 +62,4 @@
|
|
|
62
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
63
|
| 2026-03-26 | test_story_slim056.py _init_project() helper creates realistic pactkit project fixture for subprocess E2E tests; 60 tests cover all 25 subcommands | test_story_slim056.py:_init_project |
|
|
64
64
|
| 2026-03-26 | entry_points auto-discovery with _load_entry_point_deployers() enables pip install pactkit-opencode to self-register; pre-existing tests referencing extracted functions must be updated to import from adapter package | deployer.py:_load_entry_point_deployers |
|
|
65
|
+
| 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 |
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
| Date | Lesson | Context |
|
|
4
4
|
|------|--------|---------|
|
|
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 |
|
|
6
5
|
| 2026-03-26 | DeployerBase static methods use lazy imports to avoid circular dependencies between deploy_base.py and deployer.py | deploy_base.py:DeployerBase.render_prompt |
|
|
7
6
|
| 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 |
|
|
8
7
|
| 2026-03-27 | When migrating commands to skills (subdir/SKILL.md format), all path assertions in pre-existing tests must be updated in the same commit — 17 tests broke because they asserted flat commands/*.md paths | deployer.py:_deploy_commands |
|
|
@@ -52,3 +51,5 @@
|
|
|
52
51
|
| 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
52
|
| 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
53
|
| 2026-05-26 | SKILL.md model: frontmatter is passed through by deployer without transformation — source prompts in commands.py/workflows.py are the single source of truth for deployed skill metadata | commands.py:COMMANDS_CONTENT |
|
|
54
|
+
| 2026-06-01 | codegraph sync must be enforced by code (pactkit visualize/sync), not by prompt instructions — prompt-only enforcement is unreliable for deterministic operations | lazy_visualize.py:codegraph_sync |
|
|
55
|
+
| 2026-06-01 | Managed-block pattern (start/end markers + regex replace) is the canonical way to update mixed-ownership files — same pattern for CLAUDE.md and CLAUDE.local.md | deployer.py:_upsert_claude_md_managed_block |
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
## Invariants
|
|
17
17
|
|
|
18
|
-
1. All
|
|
18
|
+
1. All 4009+ 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,17 @@
|
|
|
1
|
+
|
|
2
|
+
### [STORY-slim-126] codegraph sync code enforcement
|
|
3
|
+
> Spec: docs/specs/STORY-slim-126.md
|
|
4
|
+
|
|
5
|
+
- [x] Add codegraph_sync() function
|
|
6
|
+
- [x] Integrate into visualize path
|
|
7
|
+
- [x] Add pactkit sync subcommand
|
|
8
|
+
- [x] Remove prompt instructions
|
|
9
|
+
- [x] Unit tests
|
|
10
|
+
|
|
11
|
+
### [STORY-slim-127] project CLAUDE.md managed-block update
|
|
12
|
+
> Spec: docs/specs/STORY-slim-127.md
|
|
13
|
+
|
|
14
|
+
- [x] Add marker constants
|
|
15
|
+
- [x] Extract managed content builder
|
|
16
|
+
- [x] Rewrite _generate_project_claude_md with upsert
|
|
17
|
+
- [x] Unit tests
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Project Context (Auto-generated)
|
|
2
|
-
> Last updated: 2026-
|
|
2
|
+
> Last updated: 2026-06-01T11:05:34+08:00 by pactkit context
|
|
3
3
|
|
|
4
4
|
## Sprint Status
|
|
5
5
|
Backlog: 3 | In Progress: 0 | Done: 0 stories
|
|
@@ -16,11 +16,11 @@ None
|
|
|
16
16
|
* main
|
|
17
17
|
|
|
18
18
|
## Key Decisions
|
|
19
|
-
- 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
19
|
- When SCAN_EXCLUDES is a module-level constant shared across graph modes, add mode-specific exclusion logic at the call site rather than modifying the constant — pass call_extra_excludes = SCAN_EXCLUDES - {'tests'} only for call mode to avoid affecting file/class modes
|
|
22
20
|
- _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
21
|
- SKILL.md model: frontmatter is passed through by deployer without transformation — source prompts in commands.py/workflows.py are the single source of truth for deployed skill metadata
|
|
22
|
+
- codegraph sync must be enforced by code (pactkit visualize/sync), not by prompt instructions — prompt-only enforcement is unreliable for deterministic operations
|
|
23
|
+
- Managed-block pattern (start/end markers + regex replace) is the canonical way to update mixed-ownership files — same pattern for CLAUDE.md and CLAUDE.local.md
|
|
24
24
|
|
|
25
25
|
## Next Recommended Action
|
|
26
26
|
`/project-plan`
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# STORY-slim-126: codegraph sync code enforcement
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-126 |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.15.0 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
`codegraph sync` is currently enforced only via prompt instructions in 4 PDCA skill templates (Act Phase 4, Done Phase 2, Hotfix Phase 3.6, Plan Phase 1 auto-setup). This violates the "Code Enforces, Prompt Instructs" principle — if the AI ignores the prompt instruction, the codegraph index becomes stale and `pactkit query` returns outdated results.
|
|
13
|
+
|
|
14
|
+
The fix: integrate `codegraph sync` into the `pactkit visualize --lazy` code path so it runs automatically whenever source files changed. Remove the corresponding prompt instructions afterward.
|
|
15
|
+
|
|
16
|
+
## Requirements
|
|
17
|
+
|
|
18
|
+
### R1: Auto-sync codegraph in visualize path (MUST)
|
|
19
|
+
|
|
20
|
+
When `pactkit visualize --lazy` determines that source files changed (should_visualize returns True) AND `.codegraph/` directory exists in project root AND `codegraph` is on `$PATH`, automatically run `codegraph sync` after graph generation completes.
|
|
21
|
+
|
|
22
|
+
### R2: Standalone sync function (MUST)
|
|
23
|
+
|
|
24
|
+
Extract a reusable `codegraph_sync(project_root)` function in `lazy_visualize.py` that:
|
|
25
|
+
- Checks `.codegraph/` exists
|
|
26
|
+
- Checks `codegraph` binary is available via `shutil.which`
|
|
27
|
+
- Runs `codegraph sync <path>` with subprocess
|
|
28
|
+
- Returns a status tuple: `(synced: bool, message: str)`
|
|
29
|
+
- Fails silently (returns False + reason) when codegraph is unavailable
|
|
30
|
+
|
|
31
|
+
### R3: CLI integration for non-visualize paths (MUST)
|
|
32
|
+
|
|
33
|
+
Add `--sync` flag to `pactkit visualize` that forces codegraph sync even when `--lazy` skips graph regeneration. This covers the Hotfix use case where visualize is not run but codegraph still needs syncing.
|
|
34
|
+
|
|
35
|
+
Also: expose `pactkit sync` as a standalone subcommand that only runs codegraph sync (no mermaid graphs). This is the minimal replacement for prompt instructions in Hotfix flow.
|
|
36
|
+
|
|
37
|
+
### R4: Remove prompt instructions (MUST)
|
|
38
|
+
|
|
39
|
+
Remove all "If `.codegraph/` exists, run `codegraph sync`" instructions from:
|
|
40
|
+
- `commands.py:248` (Act Phase 4)
|
|
41
|
+
- `commands.py:505` (Done Phase 2)
|
|
42
|
+
- `workflows.py:614` (Hotfix Phase 3.6)
|
|
43
|
+
|
|
44
|
+
Replace with a note that `pactkit visualize --lazy` and `pactkit sync` handle this automatically.
|
|
45
|
+
|
|
46
|
+
### R5: Output feedback (SHOULD)
|
|
47
|
+
|
|
48
|
+
When codegraph sync runs, print a brief status line: `"🔄 codegraph synced (N files updated)"` or `"codegraph: skipped (not installed)"`. Silent when `.codegraph/` doesn't exist (user hasn't opted in).
|
|
49
|
+
|
|
50
|
+
## Acceptance Criteria
|
|
51
|
+
|
|
52
|
+
### AC1: visualize --lazy triggers codegraph sync when source changed (R1)
|
|
53
|
+
|
|
54
|
+
- **Given** project has `.codegraph/` directory and `codegraph` is on PATH
|
|
55
|
+
- **When** `pactkit visualize --lazy` runs and source files have changed
|
|
56
|
+
- **Then** `codegraph sync` is executed after mermaid graph generation, output includes sync status
|
|
57
|
+
|
|
58
|
+
### AC2: visualize --lazy skips codegraph sync when no .codegraph/ (R1, R2)
|
|
59
|
+
|
|
60
|
+
- **Given** project does NOT have `.codegraph/` directory
|
|
61
|
+
- **When** `pactkit visualize --lazy` runs
|
|
62
|
+
- **Then** no codegraph sync is attempted, no error is raised
|
|
63
|
+
|
|
64
|
+
### AC3: codegraph_sync returns gracefully when binary missing (R2)
|
|
65
|
+
|
|
66
|
+
- **Given** project has `.codegraph/` directory but `codegraph` is NOT on PATH
|
|
67
|
+
- **When** `codegraph_sync(project_root)` is called
|
|
68
|
+
- **Then** returns `(False, "codegraph not installed")` without raising
|
|
69
|
+
|
|
70
|
+
### AC4: pactkit sync standalone command (R3)
|
|
71
|
+
|
|
72
|
+
- **Given** project has `.codegraph/` and `codegraph` on PATH
|
|
73
|
+
- **When** user runs `pactkit sync`
|
|
74
|
+
- **Then** codegraph sync runs and reports status
|
|
75
|
+
|
|
76
|
+
### AC5: prompt instructions removed (R4)
|
|
77
|
+
|
|
78
|
+
- **Given** the updated codebase
|
|
79
|
+
- **When** `grep -rn "codegraph sync" src/pactkit/prompts/` is run
|
|
80
|
+
- **Then** zero matches for "If .codegraph/ exists, run codegraph sync" pattern (only informational references like skills.py docs remain)
|
|
81
|
+
|
|
82
|
+
### AC6: output feedback on sync (R5)
|
|
83
|
+
|
|
84
|
+
- **Given** project has `.codegraph/` and codegraph is on PATH
|
|
85
|
+
- **When** `pactkit visualize --lazy` runs and triggers sync
|
|
86
|
+
- **Then** stdout includes a status line like "🔄 codegraph synced" or "codegraph: skipped (not installed)"
|
|
87
|
+
|
|
88
|
+
## Target Call Chain
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
CLI main() → args.command == "visualize"
|
|
92
|
+
→ lazy_visualize.should_visualize()
|
|
93
|
+
→ run_visualize_graphs() / run_visualize_single()
|
|
94
|
+
→ [NEW] codegraph_sync(project_root)
|
|
95
|
+
→ shutil.which("codegraph")
|
|
96
|
+
→ subprocess.run(["codegraph", "sync", str(project_root)])
|
|
97
|
+
|
|
98
|
+
CLI main() → args.command == "sync" [NEW]
|
|
99
|
+
→ codegraph_sync(project_root)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
## Implementation Steps
|
|
103
|
+
|
|
104
|
+
| Step | File | Action | Dependencies | Risk |
|
|
105
|
+
|------|------|--------|-------------|------|
|
|
106
|
+
| 1 | `src/pactkit/lazy_visualize.py` | Add `codegraph_sync(project_root) -> tuple[bool, str]` function | None | Low |
|
|
107
|
+
| 2 | `src/pactkit/lazy_visualize.py` | Call `codegraph_sync()` at end of `run_visualize_graphs()` and `run_visualize_single()` | Step 1 | Low |
|
|
108
|
+
| 3 | `src/pactkit/cli.py` | Add `sync` subcommand that calls `codegraph_sync()` | Step 1 | Low |
|
|
109
|
+
| 4 | `src/pactkit/cli.py` | In `visualize` handler, call `codegraph_sync()` after lazy check passes | Step 1 | Low |
|
|
110
|
+
| 5 | `src/pactkit/prompts/commands.py` | Remove "If .codegraph/ exists, run codegraph sync" from Act & Done prompts | None | Low |
|
|
111
|
+
| 6 | `src/pactkit/prompts/workflows.py` | Remove Hotfix Phase 3.6 codegraph sync prompt instruction | None | Low |
|
|
112
|
+
| 7 | `tests/unit/` | Unit tests for `codegraph_sync()` with mocked subprocess | Step 1 | Low |
|
|
113
|
+
|
|
114
|
+
## Security Scope
|
|
115
|
+
|
|
116
|
+
| Check | Applicable | Reason |
|
|
117
|
+
|-------|------------|--------|
|
|
118
|
+
| SEC-1 Input Validation | N/A | No user input — project_root from cwd |
|
|
119
|
+
| SEC-2 Authentication | N/A | Local CLI tool |
|
|
120
|
+
| SEC-3 Authorization | N/A | Local CLI tool |
|
|
121
|
+
| SEC-4 Data Exposure | N/A | No secrets involved |
|
|
122
|
+
| SEC-5 Injection | N/A | subprocess uses list args, not shell=True |
|
|
123
|
+
| SEC-6 Dependencies | N/A | No new dependencies |
|
|
124
|
+
| SEC-7 Cryptography | N/A | Not applicable |
|
|
125
|
+
| SEC-8 Logging | N/A | No sensitive data logged |
|
|
126
|
+
|
|
127
|
+
## Out of Scope
|
|
128
|
+
|
|
129
|
+
- codegraph MCP server auto-start (out of scope — user manages MCP servers independently)
|
|
130
|
+
- codegraph init auto-setup (already handled in Plan Phase 1 prompt, keep as-is)
|
|
131
|
+
- Modifying `pactkit query` behavior (already works correctly)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# STORY-slim-127: project CLAUDE.md managed-block update
|
|
2
|
+
|
|
3
|
+
| Field | Value |
|
|
4
|
+
|-------|-------|
|
|
5
|
+
| ID | STORY-slim-127 |
|
|
6
|
+
| Status | Done |
|
|
7
|
+
| Priority | P1 |
|
|
8
|
+
| Release | 2.15.0 |
|
|
9
|
+
|
|
10
|
+
## Background
|
|
11
|
+
|
|
12
|
+
`_generate_project_claude_md` currently uses `atomic_write` to fully overwrite `.claude/CLAUDE.md` on every `pactkit update`. This violates Architecture Principle §9 (Merge over Replace) — any content the user manually adds to CLAUDE.md is silently destroyed.
|
|
13
|
+
|
|
14
|
+
The fix: adopt the same managed-block pattern used by `_upsert_venv_managed_block` in CLAUDE.local.md. PactKit owns a `<!-- pactkit:start -->` / `<!-- pactkit:end -->` region; user content outside that region is preserved.
|
|
15
|
+
|
|
16
|
+
## Requirements
|
|
17
|
+
|
|
18
|
+
### R1: Managed-block update for project CLAUDE.md (MUST)
|
|
19
|
+
|
|
20
|
+
`_generate_project_claude_md` MUST use `<!-- pactkit:start -->` / `<!-- pactkit:end -->` markers. Only content between these markers is regenerated. User content outside is preserved.
|
|
21
|
+
|
|
22
|
+
### R2: Migration from legacy full-replace (MUST)
|
|
23
|
+
|
|
24
|
+
When CLAUDE.md exists but has no markers:
|
|
25
|
+
- If content matches PactKit template (detected via `# {project_name} — Project Context` header) → wrap entire content in markers (safe migration).
|
|
26
|
+
- If content has user modifications (no PactKit header) → append managed block at end of file, preserve all existing content.
|
|
27
|
+
|
|
28
|
+
### R3: Fresh install (MUST)
|
|
29
|
+
|
|
30
|
+
When CLAUDE.md does not exist, create it with the managed block including markers. Also include `@` import references outside the managed block so users can add content above or below.
|
|
31
|
+
|
|
32
|
+
### R4: Preserve @import references position (MUST)
|
|
33
|
+
|
|
34
|
+
The `@./docs/product/context.md` and `@./.claude/CLAUDE.local.md` references MUST be placed outside the managed block (after `<!-- pactkit:end -->`) so they are never accidentally removed if the user rearranges content.
|
|
35
|
+
|
|
36
|
+
### R5: Codegraph section conditional inclusion (SHOULD)
|
|
37
|
+
|
|
38
|
+
When `.codegraph/` exists, include the "Code Intelligence" section inside the managed block. When absent, omit it. This is dynamic per-deploy.
|
|
39
|
+
|
|
40
|
+
## Acceptance Criteria
|
|
41
|
+
|
|
42
|
+
### AC1: Existing user content preserved on update (R1)
|
|
43
|
+
|
|
44
|
+
- **Given** `.claude/CLAUDE.md` exists with user content outside markers
|
|
45
|
+
- **When** `pactkit update` runs
|
|
46
|
+
- **Then** user content is unchanged; only content between `<!-- pactkit:start -->` and `<!-- pactkit:end -->` is regenerated
|
|
47
|
+
|
|
48
|
+
### AC2: Legacy CLAUDE.md migrated with markers (R2)
|
|
49
|
+
|
|
50
|
+
- **Given** `.claude/CLAUDE.md` exists with PactKit-generated content but no markers
|
|
51
|
+
- **When** `pactkit update` runs
|
|
52
|
+
- **Then** content is wrapped in markers; no content is lost
|
|
53
|
+
|
|
54
|
+
### AC3: User-modified legacy CLAUDE.md preserved (R2)
|
|
55
|
+
|
|
56
|
+
- **Given** `.claude/CLAUDE.md` exists with user-written content (no PactKit header)
|
|
57
|
+
- **When** `pactkit update` runs
|
|
58
|
+
- **Then** existing content is preserved, managed block is appended
|
|
59
|
+
|
|
60
|
+
### AC4: Fresh install creates file with markers (R3)
|
|
61
|
+
|
|
62
|
+
- **Given** `.claude/CLAUDE.md` does not exist
|
|
63
|
+
- **When** `pactkit update` runs
|
|
64
|
+
- **Then** file is created with `<!-- pactkit:start -->` ... `<!-- pactkit:end -->` and `@` imports after the end marker
|
|
65
|
+
|
|
66
|
+
### AC5: @imports are outside managed block (R4)
|
|
67
|
+
|
|
68
|
+
- **Given** any state of CLAUDE.md
|
|
69
|
+
- **When** `pactkit update` runs
|
|
70
|
+
- **Then** `@./docs/product/context.md` and `@./.claude/CLAUDE.local.md` appear after `<!-- pactkit:end -->`
|
|
71
|
+
|
|
72
|
+
### AC6: Codegraph section appears when .codegraph/ exists (R5)
|
|
73
|
+
|
|
74
|
+
- **Given** project has `.codegraph/` directory
|
|
75
|
+
- **When** `pactkit update` runs
|
|
76
|
+
- **Then** managed block includes "Code Intelligence (codegraph)" section
|
|
77
|
+
|
|
78
|
+
## Target Call Chain
|
|
79
|
+
|
|
80
|
+
```
|
|
81
|
+
deployer.deploy() → _generate_project_claude_md(config)
|
|
82
|
+
→ _build_managed_block(config, project_root) [NEW]
|
|
83
|
+
→ _upsert_claude_md_managed_block(claude_md_path, managed_block) [NEW]
|
|
84
|
+
→ if file missing: write fresh (markers + @imports)
|
|
85
|
+
→ if has markers: regex replace between markers
|
|
86
|
+
→ if legacy PactKit template: wrap in markers
|
|
87
|
+
→ if user content: append managed block
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Implementation Steps
|
|
91
|
+
|
|
92
|
+
| Step | File | Action | Dependencies | Risk |
|
|
93
|
+
|------|------|--------|-------------|------|
|
|
94
|
+
| 1 | `src/pactkit/generators/deployer.py` | Add `_CLAUDE_MD_START` / `_CLAUDE_MD_END` constants | None | Low |
|
|
95
|
+
| 2 | `src/pactkit/generators/deployer.py` | Extract `_build_claude_md_managed_content()` from existing lines[] logic | None | Low |
|
|
96
|
+
| 3 | `src/pactkit/generators/deployer.py` | Rewrite `_generate_project_claude_md` to use upsert pattern (detect markers, migrate, or fresh create) | Steps 1-2 | Medium |
|
|
97
|
+
| 4 | `tests/unit/` | Unit tests for all 4 paths (fresh, has-markers, legacy-template, user-modified) | Step 3 | Low |
|
|
98
|
+
|
|
99
|
+
## Security Scope
|
|
100
|
+
|
|
101
|
+
| Check | Applicable | Reason |
|
|
102
|
+
|-------|------------|--------|
|
|
103
|
+
| SEC-1 Input Validation | N/A | No user input — paths from cwd |
|
|
104
|
+
| SEC-2 Authentication | N/A | Local CLI tool |
|
|
105
|
+
| SEC-3 Authorization | N/A | Local CLI tool |
|
|
106
|
+
| SEC-4 Data Exposure | N/A | No secrets |
|
|
107
|
+
| SEC-5 Injection | N/A | No shell/SQL |
|
|
108
|
+
| SEC-6 Dependencies | N/A | No new deps |
|
|
109
|
+
| SEC-7 Cryptography | N/A | Not applicable |
|
|
110
|
+
| SEC-8 Logging | N/A | No sensitive data |
|
|
111
|
+
|
|
112
|
+
## Out of Scope
|
|
113
|
+
|
|
114
|
+
- Global `~/.claude/CLAUDE.md` — already has user-modified detection, not changing
|
|
115
|
+
- `CLAUDE.local.md` — already uses managed-block pattern, not changing
|
|
116
|
+
- Plugin/marketplace format CLAUDE.md — separate code path
|
|
@@ -268,6 +268,10 @@ def main():
|
|
|
268
268
|
viz_parser.add_argument("--reverse", action="store_true", default=False, help="Reverse BFS: find callers of entry")
|
|
269
269
|
viz_parser.add_argument("--depth", type=int, default=0, help="Limit traversal depth (0=unlimited)")
|
|
270
270
|
viz_parser.add_argument("--max-nodes", type=int, default=0, help="Truncate graph to N nodes (0=unlimited)")
|
|
271
|
+
viz_parser.add_argument("--sync", action="store_true", help="Force codegraph sync even if graphs are skipped")
|
|
272
|
+
|
|
273
|
+
# pactkit sync (STORY-slim-126: codegraph sync code enforcement)
|
|
274
|
+
subparsers.add_parser("sync", help="Sync codegraph index")
|
|
271
275
|
|
|
272
276
|
# pactkit garden (STORY-slim-070)
|
|
273
277
|
garden_parser = subparsers.add_parser("garden", help="Codebase quality patrol")
|
|
@@ -565,12 +569,18 @@ def main():
|
|
|
565
569
|
elif args.command == "visualize":
|
|
566
570
|
from pathlib import Path
|
|
567
571
|
|
|
568
|
-
from pactkit.lazy_visualize import run_visualize_graphs, run_visualize_single, should_visualize
|
|
572
|
+
from pactkit.lazy_visualize import codegraph_sync, run_visualize_graphs, run_visualize_single, should_visualize
|
|
569
573
|
|
|
570
574
|
project_root = Path.cwd()
|
|
571
575
|
if args.lazy:
|
|
572
576
|
should_run, reason = should_visualize(project_root, stack=args.stack)
|
|
573
577
|
if not should_run:
|
|
578
|
+
if args.sync:
|
|
579
|
+
synced, msg = codegraph_sync(project_root)
|
|
580
|
+
if synced:
|
|
581
|
+
print(f"🔄 {msg}")
|
|
582
|
+
elif "skipped" not in msg:
|
|
583
|
+
print(f"codegraph: {msg}")
|
|
574
584
|
print(reason)
|
|
575
585
|
raise SystemExit(0)
|
|
576
586
|
print(f"Visualize needed: {reason}")
|
|
@@ -584,6 +594,18 @@ def main():
|
|
|
584
594
|
else:
|
|
585
595
|
run_visualize_graphs(project_root, focus=args.focus)
|
|
586
596
|
|
|
597
|
+
elif args.command == "sync":
|
|
598
|
+
from pathlib import Path
|
|
599
|
+
|
|
600
|
+
from pactkit.lazy_visualize import codegraph_sync
|
|
601
|
+
|
|
602
|
+
project_root = Path.cwd()
|
|
603
|
+
synced, msg = codegraph_sync(project_root)
|
|
604
|
+
if synced:
|
|
605
|
+
print(f"🔄 {msg}")
|
|
606
|
+
else:
|
|
607
|
+
print(f"codegraph: {msg}")
|
|
608
|
+
|
|
587
609
|
elif args.command == "garden":
|
|
588
610
|
from pathlib import Path
|
|
589
611
|
|
|
@@ -478,25 +478,9 @@ def auto_merge_config_file(path: Union[Path, str]) -> list[str]:
|
|
|
478
478
|
for item in new_items:
|
|
479
479
|
added.append(f"{key}: {item}")
|
|
480
480
|
|
|
481
|
-
#
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
"ci",
|
|
485
|
-
"issue_tracker",
|
|
486
|
-
"lint_blocking",
|
|
487
|
-
"auto_fix",
|
|
488
|
-
"venv",
|
|
489
|
-
"release",
|
|
490
|
-
"regression",
|
|
491
|
-
"check",
|
|
492
|
-
"done",
|
|
493
|
-
"e2e", # STORY-slim-022
|
|
494
|
-
"visualize", # STORY-slim-028
|
|
495
|
-
)
|
|
496
|
-
for key in _BACKFILL_KEYS:
|
|
497
|
-
if key not in user_data:
|
|
498
|
-
user_data[key] = defaults[key]
|
|
499
|
-
added.append(f"section: {key}")
|
|
481
|
+
# Non-list sections are NO LONGER backfilled (STORY-slim-126).
|
|
482
|
+
# Absent key = accept default. Users keep yaml minimal.
|
|
483
|
+
# Backfill only happens during `pactkit init` (scaffold).
|
|
500
484
|
|
|
501
485
|
# STORY-slim-102: Remove stale version field from project yaml
|
|
502
486
|
if "version" in user_data:
|