pactkit 2.10.6__tar.gz → 2.12.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.10.6 → pactkit-2.12.0}/.github/workflows/pactkit.yml +1 -1
- {pactkit-2.10.6 → pactkit-2.12.0}/.opencode/pactkit.yaml +13 -7
- {pactkit-2.10.6 → pactkit-2.12.0}/CHANGELOG.md +20 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/PKG-INFO +1 -2
- {pactkit-2.10.6 → pactkit-2.12.0}/README.md +0 -1
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/architecture/governance/archive/lessons_archive_202603.md +4 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/architecture/governance/lessons.md +4 -3
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/architecture/governance/rules.md +1 -1
- pactkit-2.12.0/docs/e2e/journey.md +243 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/product/archive/archive_202604.md +46 -0
- pactkit-2.12.0/docs/product/context.md +31 -0
- pactkit-2.12.0/docs/product/sprint_board.md +39 -0
- pactkit-2.12.0/docs/specs/BUG-slim-107.md +12 -0
- pactkit-2.12.0/docs/specs/HOTFIX-slim-107.md +19 -0
- pactkit-2.12.0/docs/specs/STORY-slim-105.md +149 -0
- pactkit-2.12.0/docs/specs/STORY-slim-106.md +171 -0
- pactkit-2.12.0/docs/specs/STORY-slim-107.md +134 -0
- pactkit-2.12.0/docs/specs/STORY-slim-108.md +97 -0
- pactkit-2.12.0/docs/specs/STORY-slim-109.md +106 -0
- pactkit-2.12.0/docs/specs/STORY-slim-110.md +96 -0
- pactkit-2.12.0/docs/specs/STORY-slim-111.md +100 -0
- pactkit-2.12.0/docs/specs/STORY-slim-112.md +255 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/pyproject.toml +1 -1
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/__init__.py +1 -1
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/cli.py +14 -1
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/config.py +11 -45
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/generators/deployer.py +59 -116
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/lazy_visualize.py +1 -1
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/prompts/__init__.py +3 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/prompts/agents.py +2 -2
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/prompts/commands.py +66 -5
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/prompts/rules.py +188 -36
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/prompts/skills.py +18 -9
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/prompts/workflows.py +16 -1
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/schemas.py +3 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/board.py +26 -41
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/spec_linter.py +12 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/visualize.py +26 -8
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/e2e/cli/test_cli_e2e.py +42 -5
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug004_dead_set.py +8 -5
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug009_project_config_backfill.py +0 -36
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug010_rewrite_yaml.py +0 -50
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_022.py +0 -15
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_023.py +0 -1
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_config.py +2 -2
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_config_auto_merge.py +3 -2
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_constitution_sharpening.py +30 -15
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_deployer_plugin.py +11 -3
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_design_command.py +105 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_hotfix_command.py +0 -12
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_mcp_integration.py +18 -10
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_modular_constitution.py +7 -11
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_prompt_structural_invariants.py +2 -2
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_release.py +0 -34
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_review_command.py +0 -12
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_rules_enrichment.py +19 -8
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_selective_deploy.py +29 -15
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_solution_design_rule.py +16 -10
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story028_rule_scoping.py +23 -10
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story033_config_backfill.py +2 -34
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story034_plan_config_refresh.py +0 -1
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story049_community_standards.py +0 -4
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story063_prompt_slimming.py +5 -1
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story072_developer_prefix.py +0 -23
- pactkit-2.12.0/tests/unit/test_story106_lateral_scan.py +239 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim009_lazy_rules.py +41 -19
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim011_command_rules.py +40 -20
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim021.py +11 -7
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim023.py +5 -2
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim026.py +1 -1
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim028.py +19 -11
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim051.py +0 -26
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim052.py +0 -20
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim083.py +4 -2
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim098_pdca_nudge.py +22 -17
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim102_version_marker.py +2 -1
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim104_should_semantics.py +4 -3
- pactkit-2.12.0/tests/unit/test_story_slim107.py +145 -0
- pactkit-2.12.0/tests/unit/test_story_slim109_journey_spec.py +112 -0
- pactkit-2.12.0/tests/unit/test_story_slim111_playwright_assertion.py +144 -0
- pactkit-2.12.0/tests/unit/test_story_slim112_rules_split.py +394 -0
- pactkit-2.10.6/docs/product/context.md +0 -28
- pactkit-2.10.6/docs/product/sprint_board.md +0 -8
- pactkit-2.10.6/tests/unit/test_story027_hooks.py +0 -112
- {pactkit-2.10.6 → pactkit-2.12.0}/.github/workflows/publish.yml +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/.gitignore +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/AGENTS.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/CODE_OF_CONDUCT.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/CONTRIBUTING.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/LICENSE +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/SECURITY.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/architecture/governance/harness_audit.json +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/architecture/governance/philosophy.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/assets/logo.png +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/guides/codex-integration-preresearch.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/guides/tool-integration-checklist.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/product/archive/archive_202602.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/product/archive/archive_202603.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/product/friction-log.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/product/prd.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-001.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-002.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-003.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-004.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-005.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-006.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-007.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-008.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-009.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-010.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-011.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-012.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-013.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-014.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-015.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-016.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-017.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-018.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-019.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-020.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-021.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-022.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-023.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-024.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-025.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-026.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-027.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-028.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-029.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-030.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-031.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-032.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-033.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-034.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-035.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-slim-001.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-slim-002.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-slim-003.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-slim-004.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-slim-005.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-slim-006.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-slim-089.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-023.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-049.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-050.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-051.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-052.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-061.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-062.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-067.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-069.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-070.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-085.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-087.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-096.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-099.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-001.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-002.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-003.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-004.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-005.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-006.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-007.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-008.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-009.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-010.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-011.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-012.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-013.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-014.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-015.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-016.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-017.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-018.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-019.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-020.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-021.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-022.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-023.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-024.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-025.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-026.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-027.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-028.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-029.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-030.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-031.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-032.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-033.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-034.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-035.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-036.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-037.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-038.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-039.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-040.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-041.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-042.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-043.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-044.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-045.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-046.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-047.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-048.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-049.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-050.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-051.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-052.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-053.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-054.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-055.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-056.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-057.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-058.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-059.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-060.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-061.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-062.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-063.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-064.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-065.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-069.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-070.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-071.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-072.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-073.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-001.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-005.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-006.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-007.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-009.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-010.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-011.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-012.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-013.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-014.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-015.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-016.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-017.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-018.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-019.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-020.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-021.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-022.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-023.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-024.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-028.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-029.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-030.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-031.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-032.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-033.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-034.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-035.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-036.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-037.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-038.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-039.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-040.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-041.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-042.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-043.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-044.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-045.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-046.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-047.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-048.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-049.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-050.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-051.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-052.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-053.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-054.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-055.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-056.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-057.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-058.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-059.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-060.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-063.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-066.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-067.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-068.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-069.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-070.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-071.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-072.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-073.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-074.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-075.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-076.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-077.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-078.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-079.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-080.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-081.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-082.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-083.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-084.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-086.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-088.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-089.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-090.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-091.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-092.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-093.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-094.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-095.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-097.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-098.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-099.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-100.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-101.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-102.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-103.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-104.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/test_cases/BUG-001_case.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/test_cases/BUG-002_case.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/test_cases/STORY-slim-028_case.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/test_cases/STORY-slim-029_case.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/test_cases/STORY-slim-031_case.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/test_cases/STORY-slim-032_case.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/test_cases/STORY-slim-033_case.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/docs/test_cases/STORY-slim-034_case.md +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/opencode.json +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/__main__.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/audit.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/backfill.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/cleaners.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/context_gen.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/coverage_gate.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/doctor.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/garden.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/generators/__init__.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/generators/adapter.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/generators/deploy_base.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/guards.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/id_generator.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/invariants.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/issue_sync.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/lessons.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/lint_runner.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/observe.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/profiles.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/prompts/references.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/regression.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/scripts.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/sec_scope.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/__init__.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/analyzers/__init__.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/report.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/scaffold.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/spec_status.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/test_mapper.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/utils.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/validators.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/conftest.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/e2e/__init__.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/e2e/cli/__init__.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/fixtures/api_call_parser/page.tsx +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/integration/__init__.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/integration/test_deploy_classic.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_agent_features.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_agent_frontmatter.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_agents_enrichment.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_audit.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_blast_radius.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_board_bug027.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_board_sections.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug001_skill_path.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug002_plugin_paths.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug003_multi_import.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug005_archive_taskless.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug006_scan_excludes.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug008_stale_command_refs.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug011_stale_refs.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug012_call_graph_filter.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug013_config_single_source.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug014_version_hygiene.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug017_project_init_playbook.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug019_venv_deployment.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug020_claude_md_backup.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug025_release_delegation.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug026_version_sync.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug028_ghost_refs.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_021.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_024.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_slim001_env_detection.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_slim003.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_slim004.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_slim005.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_slim006.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_check_command.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_check_extensions_072_073.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_check_playbook_072_073.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_command_frontmatter.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_command_visualize_modes.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_complexity.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_context_gen.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_create_skill.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_cross_flow_matrix.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_deploy_base.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_deployer_cleanup.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_done_gates.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_draw_prompt.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_draw_references.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_drawio_mcp.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_garden.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_home_path_fix.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_init_guard.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_init_playbook_074.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_lang_profiles.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_layer_violations.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_lessons_rotation_075.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_list_stories.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_model_config.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_monorepo_detect.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_multi_prefix.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_observe.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_pdca_slim.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_profiles.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_project_visibility.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_prompt_cli_refs.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_prompt_quality_075.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_prompts_package.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_release_field.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_release_v110.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_render_prompt.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_report_parser.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_report_unified.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_scaffold.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_scaffold_developer_prefix.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_schemas.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_script_extraction.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_session_context.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_skill_structure.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_skills_enrichment.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_slim_deps_088.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_smart_regression.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_sprint_command.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_stack_references.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_status_command.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_statusline.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story014_release.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story015_ci_lint_gate.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story016_claude_md.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story017_init_claude_md.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story018_arch_staleness.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story019_bailout.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story020_horizon.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story021_rfc.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story022_decision_tree.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story023_test_quality.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story024_native_agent.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story025_ci_pipeline.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story026_issue_tracker.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story029_doctor.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story030_lint.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story031_git_init_guard.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story032_greenfield_redirect.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story035_readme_docs.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story037_regression_fix.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story038_call_graph_update.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story039_venv_config.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story040_layered_claude_md.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story042_spec_linter.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story043_active_clarify.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story044_consistency_check.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story045_auto_pr.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story046_agent_adapter.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story047_enterprise_flags.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story048_worktree_isolation.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story051_workflow_streamlining.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story052_conditional_github_release.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story053_impact_regression.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story055_commands.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story055_config.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story055_spec_linter.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story056_commands.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story056_config.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story057_implicit_cleanup.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story058_opencode_extraction.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story058_routing_fix.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story059_codex_removal.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story060_init_hang.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story061_remove_thinking.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story062_mcp_recommendations.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story064_venv_local_md.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story065_sprint_model.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim012_ci.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim014_clean.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim014_context.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim014_guard.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim014_next_id.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim014_regression.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim014_sec_scope.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim014_validators.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim015_doctor.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim017.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim018.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim022.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim024.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim025.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim027.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim029.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim030.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim031.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim032.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim033.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim034.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim035.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim036.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim037.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim038.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim039.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim040.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim041.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim042.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim043.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim044.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim045.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim046.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim047.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim048.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim049.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim053.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim054.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim055.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim056.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim060_codex_profile.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim063.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim065.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim076_multistack.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim078.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim079.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim080.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim081.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim082.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim084.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim095.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_tools.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_topology_parsers_066.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_update_task.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_visualize_call_nested.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_visualize_chain_fix.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_visualize_modes.py +0 -0
- {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_visualize_multilang_chain.py +0 -0
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
# Edit this file to customize which components are deployed.
|
|
3
3
|
# Remove items from a list to disable them. Default: all enabled.
|
|
4
4
|
|
|
5
|
-
version: "2.10.4"
|
|
6
5
|
stack: python
|
|
7
6
|
root: .
|
|
8
7
|
developer: "slim"
|
|
@@ -72,6 +71,15 @@ rules:
|
|
|
72
71
|
- 08-architecture-principles
|
|
73
72
|
- 09-sectional-write
|
|
74
73
|
- 11-pdca-nudge
|
|
74
|
+
- 12-solution-design
|
|
75
|
+
- 05-principles
|
|
76
|
+
- 01-workflow-conventions
|
|
77
|
+
- 02-mcp-integration
|
|
78
|
+
- 03-shared-protocols
|
|
79
|
+
- 04-architecture-principles
|
|
80
|
+
- 05-sectional-write
|
|
81
|
+
- 06-solution-design
|
|
82
|
+
- pactkit
|
|
75
83
|
|
|
76
84
|
# CI/CD — set provider to github or gitlab to generate pipeline config
|
|
77
85
|
ci:
|
|
@@ -85,12 +93,6 @@ ci:
|
|
|
85
93
|
issue_tracker:
|
|
86
94
|
provider: github
|
|
87
95
|
|
|
88
|
-
# Hooks — safe, report-only hook templates (command-type only)
|
|
89
|
-
hooks:
|
|
90
|
-
post_test_coverage: false
|
|
91
|
-
pre_commit_lint: false
|
|
92
|
-
pre_push_check: false
|
|
93
|
-
|
|
94
96
|
# Lint — configure lint behavior in /project-done
|
|
95
97
|
lint_blocking: false
|
|
96
98
|
auto_fix: false
|
|
@@ -163,3 +165,7 @@ e2e:
|
|
|
163
165
|
env_file: .env.test
|
|
164
166
|
test_dir: tests/e2e
|
|
165
167
|
type: none
|
|
168
|
+
hooks:
|
|
169
|
+
post_test_coverage: false
|
|
170
|
+
pre_commit_lint: false
|
|
171
|
+
pre_push_check: false
|
|
@@ -4,6 +4,26 @@ 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.12.0] - 2026-05-06
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
- **Rules architecture refactor** (STORY-slim-112) — Merged 6 global core rules into single `pactkit.md`; on-demand rules renumbered 01-06 and moved to `~/.claude/skills/_rules/`. Reduces context window usage by ~60% per conversation.
|
|
11
|
+
- **Auto-deploy on version mismatch** — After `pipx upgrade pactkit`, the next CLI command auto-syncs deployed files without requiring explicit `pactkit init`.
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
- **Hardcoded paths in deployer** — `_build_command_rules_header()` now uses `FormatProfile.rules_dir` / `skills_dir` instead of hardcoded `~/.claude/` paths.
|
|
15
|
+
- **Stale filename references** — Updated cross-references in visualize.py, commands.py, lazy_visualize.py, and test files to match new rule filenames.
|
|
16
|
+
|
|
17
|
+
## [2.11.0] - 2026-04-25
|
|
18
|
+
|
|
19
|
+
### Added
|
|
20
|
+
- **Lateral Scan** (STORY-slim-106) — Plan Phase 1 now scans for duplicate patterns before writing Specs. If overlap > 30% with existing implementations, Spec must include `R0: Extract shared abstraction` or declare tech debt accepted. Removed dead hooks code from rules.
|
|
21
|
+
- **DEFERRED comment mechanism** (STORY-slim-105) — When skipping a SHOULD requirement, code must include `# DEFERRED(SHOULD): R{N} — reason` comment. Coverage table output added to Check phase for tracking deferred items.
|
|
22
|
+
|
|
23
|
+
### Fixed
|
|
24
|
+
- **Residual pactkit.yaml version operations** (HOTFIX-slim-107) — Removed `update_version()` function and CLI subcommand from board.py, plus all stale references in prompts, agents, and skills docs. Version is now exclusively managed in pyproject.toml + __init__.py with deploy marker at ~/.claude/.pactkit-version.
|
|
25
|
+
- **CI tree-sitter deps** — Install tree-sitter optional dependencies in CI workflow to prevent import failures.
|
|
26
|
+
|
|
7
27
|
## [2.10.6] - 2026-04-22
|
|
8
28
|
|
|
9
29
|
### Fixed
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pactkit
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.12.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
|
|
@@ -369,7 +369,6 @@ docs/
|
|
|
369
369
|
| Field | Type | Default | Description |
|
|
370
370
|
|-------|------|---------|-------------|
|
|
371
371
|
| `stack` | string | auto-detected | Project stack (`python`, `node`, `go`, `java`) |
|
|
372
|
-
| `version` | string | current | PactKit version that generated the config |
|
|
373
372
|
| `developer` | string | `""` | Developer prefix for Story IDs (multi-developer collaboration) |
|
|
374
373
|
| `agents` | list | all 9 | Agent definitions to deploy |
|
|
375
374
|
| `commands` | list | all 11 | Command playbooks to deploy |
|
|
@@ -327,7 +327,6 @@ docs/
|
|
|
327
327
|
| Field | Type | Default | Description |
|
|
328
328
|
|-------|------|---------|-------------|
|
|
329
329
|
| `stack` | string | auto-detected | Project stack (`python`, `node`, `go`, `java`) |
|
|
330
|
-
| `version` | string | current | PactKit version that generated the config |
|
|
331
330
|
| `developer` | string | `""` | Developer prefix for Story IDs (multi-developer collaboration) |
|
|
332
331
|
| `agents` | list | all 9 | Agent definitions to deploy |
|
|
333
332
|
| `commands` | list | all 11 | Command playbooks to deploy |
|
{pactkit-2.10.6 → pactkit-2.12.0}/docs/architecture/governance/archive/lessons_archive_202603.md
RENAMED
|
@@ -50,3 +50,7 @@
|
|
|
50
50
|
| 2026-03-24 | Worktree isolation diverges from working-tree: verify visualize.py _scan_files() signature is preserved across stories to avoid breaking callers | visualize.py:_scan_files |
|
|
51
51
|
| 2026-03-24 | Extracting _detect_stack() from _detect_file_ext() enables both file discovery and test mapping to share stack detection — DRY refactoring | visualize.py:_detect_stack |
|
|
52
52
|
| 2026-03-24 | Standalone skill scripts using exec() require all imports in _SHARED_HEADER; new stdlib imports (dataclass) must be added to skills/__init__.py _SHARED_HEADER, not just the standalone header section | skills/__init__.py:_SHARED_HEADER |
|
|
53
|
+
| 2026-03-24 | detect_topology() must delegate to _TOPOLOGY_PARSERS parser.detect() first, not _TOPOLOGY_MARKERS alone — parsers and markers can diverge silently causing empty graphs | visualize.py:detect_topology |
|
|
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
|
+
| 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
|
+
| 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 |
|
|
@@ -2,9 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
| Date | Lesson | Context |
|
|
4
4
|
|------|--------|---------|
|
|
5
|
-
| 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 |
|
|
6
|
-
| 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 |
|
|
7
|
-
| 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 |
|
|
8
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 |
|
|
9
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 |
|
|
10
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 |
|
|
@@ -53,3 +50,7 @@
|
|
|
53
50
|
| 2026-04-21 | Version tracking in pactkit.yaml caused cross-project desync — moved to ~/.claude/.pactkit-version as single source of truth for deploy state. config.py get_default_config() no longer includes version field. | STORY-slim-102 |
|
|
54
51
|
| 2026-04-22 | When the same bug pattern recurs 3+ times across specs (BUG-010, BUG-slim-089, STORY-033, STORY-slim-054), promote the fix from spec-level to a standing rule in 08-architecture-principles.md — ad-hoc spec fixes do not prevent recurrence | ~/.claude/rules/08-architecture-principles.md:§9 |
|
|
55
52
|
| 2026-04-22 | Signal Strength L3 SHOULD semantics in rules.py:RULES_MODULES['core'] must use RFC 2119 wording — 'warning, non-blocking' caused AI to systematically defer all SHOULD tasks during Act | src/pactkit/prompts/rules.py:51 |
|
|
53
|
+
| 2026-04-23 | Rule files deploy from src/pactkit/prompts/rules.py via pactkit deploy — never edit ~/.claude/rules/ directly | src/pactkit/prompts/rules.py:RULES_MODULES |
|
|
54
|
+
| 2026-04-24 | Plan Phase横向扫描(Lateral Scan)比纵向trace更重要——PactSearch的10个技术债中60%源于缺少水平重复检测。修复方向是改Plan playbook引导Architect用已有工具(LSP/visualize/grep)做横向扫描,而非新建CLI | commands.py:Plan_Phase_1 |
|
|
55
|
+
| 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
|
+
| 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 |
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
## Invariants
|
|
17
17
|
|
|
18
|
-
1. All
|
|
18
|
+
1. All 3841+ 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,243 @@
|
|
|
1
|
+
# User Journey Format Specification
|
|
2
|
+
|
|
3
|
+
> This document defines the canonical format for `docs/e2e/journey.md` in PactKit-managed projects.
|
|
4
|
+
> It is a **format specification template** -- projects copy and fill this structure with their own journeys.
|
|
5
|
+
|
|
6
|
+
## Purpose
|
|
7
|
+
|
|
8
|
+
A user journey describes an end-to-end flow that spans multiple stories. While individual stories
|
|
9
|
+
have their own acceptance criteria (in `docs/test_cases/`), journeys capture the cross-story
|
|
10
|
+
integration path that a real user follows.
|
|
11
|
+
|
|
12
|
+
**Relationship to other artifacts:**
|
|
13
|
+
- `docs/test_cases/{ID}_case.md` -- single-story acceptance (Gherkin scenarios)
|
|
14
|
+
- `docs/e2e/journey.md` -- cross-story user flows (this document)
|
|
15
|
+
- `tests/e2e/` -- executable E2E test code implementing journey segments
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## Journey Structure
|
|
20
|
+
|
|
21
|
+
Each journey follows this format:
|
|
22
|
+
|
|
23
|
+
```markdown
|
|
24
|
+
## Journey: {Journey Name}
|
|
25
|
+
|
|
26
|
+
> {One-line description of the user goal}
|
|
27
|
+
|
|
28
|
+
### Pre-conditions (Fixtures)
|
|
29
|
+
|
|
30
|
+
| Fixture | Description | Setup Method |
|
|
31
|
+
|---------|-------------|--------------|
|
|
32
|
+
| {name} | {what it provides} | {seed script / API call / fixture function} |
|
|
33
|
+
|
|
34
|
+
### Steps
|
|
35
|
+
|
|
36
|
+
#### Step 1: {Step Title} [client]
|
|
37
|
+
|
|
38
|
+
**Action**: {What the user does}
|
|
39
|
+
|
|
40
|
+
**Assertions**:
|
|
41
|
+
- STRUCTURE: {element/component} exists on page
|
|
42
|
+
- STRUCTURE: {data container} is non-empty
|
|
43
|
+
- BEHAVIOR: {interaction} triggers {expected response}
|
|
44
|
+
|
|
45
|
+
#### Step 2: {Step Title} [server]
|
|
46
|
+
|
|
47
|
+
**Action**: {What the system processes}
|
|
48
|
+
|
|
49
|
+
**Assertions**:
|
|
50
|
+
- STRUCTURE: {database record / API response} contains expected fields
|
|
51
|
+
- STRUCTURE: {response payload} is non-empty
|
|
52
|
+
- BEHAVIOR: {side effect} is observable (log entry, event emitted, etc.)
|
|
53
|
+
|
|
54
|
+
#### Step 3: {Step Title} [server+client]
|
|
55
|
+
|
|
56
|
+
**Action**: {Full-stack interaction}
|
|
57
|
+
|
|
58
|
+
**Assertions**:
|
|
59
|
+
- STRUCTURE: {UI element} renders with data from server
|
|
60
|
+
- STRUCTURE: {response} matches expected schema shape
|
|
61
|
+
- BEHAVIOR: {round-trip} completes within timeout
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Execution Layer Annotations
|
|
67
|
+
|
|
68
|
+
Each step MUST be annotated with its execution layer:
|
|
69
|
+
|
|
70
|
+
| Annotation | Meaning | Test Tooling |
|
|
71
|
+
|------------|---------|--------------|
|
|
72
|
+
| `[client]` | Browser/UI interaction only | Playwright, Cypress |
|
|
73
|
+
| `[server]` | Backend/API processing only | pytest + httpx, curl |
|
|
74
|
+
| `[server+client]` | Full-stack round-trip | Playwright + API assertions |
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## Assertion Types
|
|
79
|
+
|
|
80
|
+
Assertions are classified into two categories with different enforcement rules:
|
|
81
|
+
|
|
82
|
+
### Structure Assertions (MUST)
|
|
83
|
+
|
|
84
|
+
Structure assertions verify that the expected elements, fields, or components **exist** and are
|
|
85
|
+
**non-empty**. These are deterministic and safe to assert in any context.
|
|
86
|
+
|
|
87
|
+
Examples:
|
|
88
|
+
- "SQL code block element exists on page"
|
|
89
|
+
- "Chart component is rendered"
|
|
90
|
+
- "API response contains `data` field"
|
|
91
|
+
- "Answer container has text content (length > 0)"
|
|
92
|
+
|
|
93
|
+
### Content Assertions (MUST NOT for AI-generated content)
|
|
94
|
+
|
|
95
|
+
Content assertions verify specific text values, numbers, or exact strings. These are appropriate
|
|
96
|
+
for deterministic outputs but MUST NOT be used for AI-generated content.
|
|
97
|
+
|
|
98
|
+
**When content is deterministic** (e.g., user profile display, static labels):
|
|
99
|
+
- Exact text matching is acceptable
|
|
100
|
+
- Numeric value assertions are acceptable
|
|
101
|
+
|
|
102
|
+
**When content is AI-generated** (e.g., chatbot responses, generated analysis):
|
|
103
|
+
- MUST NOT assert specific text content
|
|
104
|
+
- MUST NOT assert exact numeric values in generated output
|
|
105
|
+
- MUST NOT assert specific word choices or phrasing
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## AI Content Assertion Strategy
|
|
110
|
+
|
|
111
|
+
> This section provides guidance for projects that include AI-generated content in their user journeys
|
|
112
|
+
> (e.g., chatbots, AI assistants, generated reports, analysis tools).
|
|
113
|
+
|
|
114
|
+
### What to Assert (MUST)
|
|
115
|
+
|
|
116
|
+
| Category | Example Assertion |
|
|
117
|
+
|----------|------------------|
|
|
118
|
+
| Structure exists | "SQL code block element is present in the response area" |
|
|
119
|
+
| Non-empty | "Response container has text content with length > 0" |
|
|
120
|
+
| Component renders | "Chart component is mounted and visible" |
|
|
121
|
+
| Schema shape | "API response has `answer` field of type string" |
|
|
122
|
+
| Timing | "Response arrives within N seconds" |
|
|
123
|
+
| State transition | "Loading spinner disappears after response" |
|
|
124
|
+
|
|
125
|
+
### What NOT to Assert (MUST NOT)
|
|
126
|
+
|
|
127
|
+
| Anti-Pattern | Why It Fails |
|
|
128
|
+
|--------------|--------------|
|
|
129
|
+
| `assert response.text == "The answer is 42"` | AI output is non-deterministic |
|
|
130
|
+
| `assert chart.data_points == [1.5, 2.3, 4.1]` | Generated values vary per run |
|
|
131
|
+
| `assert sql_block.contains("SELECT * FROM users")` | AI may generate equivalent but different SQL |
|
|
132
|
+
| `assert summary.word_count == 150` | Length varies with model/prompt |
|
|
133
|
+
|
|
134
|
+
### Correct Pattern
|
|
135
|
+
|
|
136
|
+
```python
|
|
137
|
+
# STRUCTURE: verify element exists
|
|
138
|
+
assert page.locator(".sql-code-block").is_visible()
|
|
139
|
+
|
|
140
|
+
# NON-EMPTY: verify content was generated
|
|
141
|
+
sql_content = page.locator(".sql-code-block").text_content()
|
|
142
|
+
assert len(sql_content.strip()) > 0
|
|
143
|
+
|
|
144
|
+
# SCHEMA: verify response shape, not content
|
|
145
|
+
response = api_client.get("/chat/answer")
|
|
146
|
+
assert "answer" in response.json()
|
|
147
|
+
assert isinstance(response.json()["answer"], str)
|
|
148
|
+
assert len(response.json()["answer"]) > 0
|
|
149
|
+
|
|
150
|
+
# BEHAVIOR: verify state transition occurred
|
|
151
|
+
assert page.locator(".loading-spinner").is_hidden()
|
|
152
|
+
assert page.locator(".answer-area").is_visible()
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## Pre-condition Fixtures
|
|
158
|
+
|
|
159
|
+
Each journey MUST declare its pre-conditions as named fixtures:
|
|
160
|
+
|
|
161
|
+
```markdown
|
|
162
|
+
### Pre-conditions (Fixtures)
|
|
163
|
+
|
|
164
|
+
| Fixture | Description | Setup Method |
|
|
165
|
+
|---------|-------------|--------------|
|
|
166
|
+
| authenticated_user | Logged-in user session | `conftest.py::auth_fixture` |
|
|
167
|
+
| sample_dataset | Pre-loaded test data | `scripts/seed_test_data.py` |
|
|
168
|
+
| clean_state | Empty database with schema | `pytest fixture: db_reset` |
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Fixtures are referenced by name in step pre-conditions, enabling:
|
|
172
|
+
- Test isolation (each journey starts from a known state)
|
|
173
|
+
- Parallelization (independent journeys can run concurrently)
|
|
174
|
+
- Debugging (reproduce failures by loading specific fixtures)
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Example: Complete Journey
|
|
179
|
+
|
|
180
|
+
```markdown
|
|
181
|
+
## Journey: First Question to Answer
|
|
182
|
+
|
|
183
|
+
> New user asks their first question and receives an AI-generated answer.
|
|
184
|
+
|
|
185
|
+
### Pre-conditions (Fixtures)
|
|
186
|
+
|
|
187
|
+
| Fixture | Description | Setup Method |
|
|
188
|
+
|---------|-------------|--------------|
|
|
189
|
+
| authenticated_user | Logged-in user with valid session | `conftest.py::auth_user` |
|
|
190
|
+
| connected_datasource | At least one data source configured | `seed/datasource.sql` |
|
|
191
|
+
|
|
192
|
+
### Steps
|
|
193
|
+
|
|
194
|
+
#### Step 1: Navigate to Chat [client]
|
|
195
|
+
|
|
196
|
+
**Action**: User opens the chat interface from dashboard.
|
|
197
|
+
|
|
198
|
+
**Assertions**:
|
|
199
|
+
- STRUCTURE: Chat input field is visible
|
|
200
|
+
- STRUCTURE: Message history area exists (may be empty)
|
|
201
|
+
- BEHAVIOR: Input field accepts text input
|
|
202
|
+
|
|
203
|
+
#### Step 2: Submit Question [server+client]
|
|
204
|
+
|
|
205
|
+
**Action**: User types a question and presses Enter.
|
|
206
|
+
|
|
207
|
+
**Assertions**:
|
|
208
|
+
- STRUCTURE: Loading indicator appears
|
|
209
|
+
- STRUCTURE: User message appears in history
|
|
210
|
+
- BEHAVIOR: API call to `/api/chat` is triggered
|
|
211
|
+
|
|
212
|
+
#### Step 3: Receive Answer [server+client]
|
|
213
|
+
|
|
214
|
+
**Action**: Server processes the question and streams response.
|
|
215
|
+
|
|
216
|
+
**Assertions**:
|
|
217
|
+
- STRUCTURE: Answer area becomes visible
|
|
218
|
+
- STRUCTURE: Answer text content is non-empty
|
|
219
|
+
- STRUCTURE: SQL code block is present (if query was data-related)
|
|
220
|
+
- BEHAVIOR: Loading indicator disappears
|
|
221
|
+
- MUST NOT: Assert specific answer text content (AI-generated)
|
|
222
|
+
- MUST NOT: Assert exact SQL query string (AI-generated)
|
|
223
|
+
|
|
224
|
+
#### Step 4: View Generated Visualization [client]
|
|
225
|
+
|
|
226
|
+
**Action**: User clicks on the chart tab to see generated visualization.
|
|
227
|
+
|
|
228
|
+
**Assertions**:
|
|
229
|
+
- STRUCTURE: Chart component is rendered
|
|
230
|
+
- STRUCTURE: Chart has at least one data series
|
|
231
|
+
- BEHAVIOR: Chart responds to hover interaction
|
|
232
|
+
- MUST NOT: Assert specific chart data values (AI-generated)
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## Usage in Check Phase 4
|
|
238
|
+
|
|
239
|
+
When `/project-check` Phase 4 (E2E Execution) runs:
|
|
240
|
+
|
|
241
|
+
1. If `docs/e2e/journey.md` exists, read it to identify journey segments affected by the current story
|
|
242
|
+
2. E2E tests SHOULD cover the affected segments (not the full journey)
|
|
243
|
+
3. Journey definitions inform test scope; `docs/test_cases/` informs acceptance criteria
|
|
@@ -241,3 +241,49 @@
|
|
|
241
241
|
- [x] Change L3 Semantics text in rules.py
|
|
242
242
|
- [x] Add SHOULD clarification note
|
|
243
243
|
- [x] Add test for L3 content
|
|
244
|
+
|
|
245
|
+
### [STORY-slim-105] SHOULD 覆盖追踪与改动类型声明
|
|
246
|
+
> Spec: docs/specs/STORY-slim-105.md
|
|
247
|
+
|
|
248
|
+
- [x] 更新01-core-protocol.md SHOULD语义
|
|
249
|
+
- [x] 更新05-workflow-conventions.md DEFERRED规范
|
|
250
|
+
- [x] schemas.py新增常量
|
|
251
|
+
- [x] spec_linter.py新增W010
|
|
252
|
+
- [x] project-act.md覆盖表输出
|
|
253
|
+
- [x] 测试用例
|
|
254
|
+
|
|
255
|
+
### [STORY-slim-106] Plan 阶段横向扫描强化与 hooks 死代码清理
|
|
256
|
+
> Spec: docs/specs/STORY-slim-106.md
|
|
257
|
+
|
|
258
|
+
- [x] R1: Plan playbook Lateral Scan 步骤
|
|
259
|
+
- [x] R2: Solution Design Internal Patterns
|
|
260
|
+
- [x] R3: Architecture Principles 通用化
|
|
261
|
+
- [x] R4: 删除 hooks 死代码
|
|
262
|
+
- [x] R5: spec_linter W006
|
|
263
|
+
- [x] 测试覆盖
|
|
264
|
+
|
|
265
|
+
### [HOTFIX-slim-107] Remove residual pactkit.yaml version operations
|
|
266
|
+
> Spec: docs/specs/HOTFIX-slim-107.md
|
|
267
|
+
|
|
268
|
+
- [x] Remove update_version function
|
|
269
|
+
- [x] Update CLI help text
|
|
270
|
+
- [x] Clean prompt references
|
|
271
|
+
- [x] Update agent docs
|
|
272
|
+
|
|
273
|
+
### [STORY-slim-107] Integrate tech debt prevention patterns into framework rules
|
|
274
|
+
> Spec: docs/specs/STORY-slim-107.md
|
|
275
|
+
|
|
276
|
+
- [x] Expand architecture §1 DRY with dual-write
|
|
277
|
+
- [x] Expand architecture §6 Security (deny-by-default, input validation, timing)
|
|
278
|
+
- [x] Add architecture §10 Code Enforces / LLM≠Calculator
|
|
279
|
+
- [x] Add architecture §11 Concurrency & Async Safety
|
|
280
|
+
- [x] Add architecture §12 Cache Lifecycle
|
|
281
|
+
- [x] Add architecture §13 Dead Code Hygiene
|
|
282
|
+
- [x] Add String→Enum to solution module
|
|
283
|
+
- [x] Run test suite
|
|
284
|
+
|
|
285
|
+
### [BUG-slim-107] Fix scan_excludes replacing defaults and hidden root module
|
|
286
|
+
> Spec: docs/specs/BUG-slim-107.md
|
|
287
|
+
|
|
288
|
+
- [x] Merge custom excludes with defaults
|
|
289
|
+
- [x] Show root module in available list
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Project Context (Auto-generated)
|
|
2
|
+
> Last updated: 2026-05-06T14:08:28+08:00 by pactkit context
|
|
3
|
+
|
|
4
|
+
## Sprint Status
|
|
5
|
+
Backlog: 1 | In Progress: 0 | Done: 4 stories
|
|
6
|
+
|
|
7
|
+
## Current Stories
|
|
8
|
+
None
|
|
9
|
+
|
|
10
|
+
## Recent Completions
|
|
11
|
+
- STORY-slim-110: project-design 集成 User Journey 生成
|
|
12
|
+
- STORY-slim-109: E2E journey.md 规范定义与 File Atlas 集成
|
|
13
|
+
- STORY-slim-108: pactkit-trace --summary 模式:接口摘要输出
|
|
14
|
+
|
|
15
|
+
## Active Branches
|
|
16
|
+
+ claude/naughty-euclid-e6a787
|
|
17
|
+
develop
|
|
18
|
+
* main
|
|
19
|
+
|
|
20
|
+
## Key Decisions
|
|
21
|
+
- Signal Strength L3 SHOULD semantics in rules.py:RULES_MODULES['core'] must use RFC 2119 wording — 'warning, non-blocking' caused AI to systematically defer all SHOULD tasks during Act
|
|
22
|
+
- Rule files deploy from src/pactkit/prompts/rules.py via pactkit deploy — never edit ~/.claude/rules/ directly
|
|
23
|
+
- Plan Phase横向扫描(Lateral Scan)比纵向trace更重要——PactSearch的10个技术债中60%源于缺少水平重复检测。修复方向是改Plan playbook引导Architect用已有工具(LSP/visualize/grep)做横向扫描,而非新建CLI
|
|
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
|
|
25
|
+
- 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
|
|
26
|
+
|
|
27
|
+
## Next Recommended Action
|
|
28
|
+
`/project-plan`
|
|
29
|
+
|
|
30
|
+
## Agent Continuation
|
|
31
|
+
No active work session.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Sprint Board
|
|
2
|
+
|
|
3
|
+
## 📋 Backlog
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### [STORY-slim-112] Rules 架构重构:全局原则 vs 按需操作规程
|
|
7
|
+
> Spec: docs/specs/STORY-slim-112.md
|
|
8
|
+
|
|
9
|
+
- [ ] 拆分 RULES_CORE/ONDEMAND + 新建 05-principles
|
|
10
|
+
- [ ] 更新 deployer 双目录部署
|
|
11
|
+
- [ ] 更新所有 skill @import 路径
|
|
12
|
+
- [ ] 更新测试断言
|
|
13
|
+
|
|
14
|
+
## 🔄 In Progress
|
|
15
|
+
|
|
16
|
+
## ✅ Done
|
|
17
|
+
|
|
18
|
+
### [STORY-slim-111] Check Phase 4 Playwright 断言策略指南
|
|
19
|
+
> Spec: docs/specs/STORY-slim-111.md
|
|
20
|
+
|
|
21
|
+
- [x] 修改 project-check SKILL.md Phase 4 增加断言策略
|
|
22
|
+
|
|
23
|
+
### [STORY-slim-110] project-design 集成 User Journey 生成
|
|
24
|
+
> Spec: docs/specs/STORY-slim-110.md
|
|
25
|
+
|
|
26
|
+
- [x] 修改 project-design SKILL.md Phase 1 Group B
|
|
27
|
+
|
|
28
|
+
### [STORY-slim-109] E2E journey.md 规范定义与 File Atlas 集成
|
|
29
|
+
> Spec: docs/specs/STORY-slim-109.md
|
|
30
|
+
|
|
31
|
+
- [x] 注册 File Atlas
|
|
32
|
+
- [x] 创建 journey.md 格式规范
|
|
33
|
+
- [x] 修改 project-check Phase 4
|
|
34
|
+
|
|
35
|
+
### [STORY-slim-108] pactkit-trace --summary 模式:接口摘要输出
|
|
36
|
+
> Spec: docs/specs/STORY-slim-108.md
|
|
37
|
+
|
|
38
|
+
- [x] 修改 pactkit-trace SKILL.md Phase 3
|
|
39
|
+
- [x] 修改 project-act SKILL.md Phase 1
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# BUG-slim-107: Custom scan_excludes replaces defaults, leaking .next as modules
|
|
2
|
+
|
|
3
|
+
## Background
|
|
4
|
+
When a project's `pactkit.yaml` defines custom `visualize.scan_excludes`, it completely replaces the built-in `SCAN_EXCLUDES` set. Projects lose critical exclusions like `.next`, causing build artifacts to be detected as modules. Combined with the root module `.` being hidden from the "Available modules" error message, this misleads AI into concluding "visual scan not applicable to Python projects".
|
|
5
|
+
|
|
6
|
+
## Target
|
|
7
|
+
- `src/pactkit/skills/visualize.py:280` — merge custom excludes with defaults instead of replacing
|
|
8
|
+
- `src/pactkit/skills/visualize.py:1180` — include root module in available list with descriptive label
|
|
9
|
+
|
|
10
|
+
## Fix
|
|
11
|
+
1. `_detect_modules`: union custom scan_excludes with SCAN_EXCLUDES
|
|
12
|
+
2. Available modules list: show root module as `"." (project root)` instead of filtering it out
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# HOTFIX-slim-107: Remove residual pactkit.yaml version field operations
|
|
2
|
+
|
|
3
|
+
## Background
|
|
4
|
+
STORY-slim-102 migrated version checking from pactkit.yaml to `~/.claude/.pactkit-version` global marker, but left 4 residual references that still read/write version in pactkit.yaml.
|
|
5
|
+
|
|
6
|
+
## Target Files
|
|
7
|
+
| File | Line(s) | Issue |
|
|
8
|
+
|------|---------|-------|
|
|
9
|
+
| `src/pactkit/skills/board.py` | 239-256, 401-402, 417-418 | `update_version()` function + CLI entry |
|
|
10
|
+
| `src/pactkit/cli.py` | 146 | `--if-needed` help text references pactkit.yaml |
|
|
11
|
+
| `src/pactkit/prompts/commands.py` | 659 | Manual pactkit.yaml creation includes `version: 0.0.1` |
|
|
12
|
+
| `src/pactkit/prompts/agents.py` | 29 | "Release field (from pactkit.yaml version)" |
|
|
13
|
+
| `src/pactkit/prompts/skills.py` | 127-130, 152, 699 | `update_version` docs and usage |
|
|
14
|
+
| `src/pactkit/prompts/agents.py` | 145 | "Use update_version to update version number" |
|
|
15
|
+
|
|
16
|
+
## Fix
|
|
17
|
+
- Remove `update_version()` function and CLI subcommand from board.py
|
|
18
|
+
- Update help text, prompts, and agent docs to remove pactkit.yaml version references
|
|
19
|
+
- Version is now managed in pyproject.toml + __init__.py only; deploy marker at ~/.claude/.pactkit-version
|