pactkit 2.12.0__tar.gz → 2.14.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (595) hide show
  1. pactkit-2.14.0/.codegraph/.gitignore +16 -0
  2. {pactkit-2.12.0 → pactkit-2.14.0}/.gitignore +3 -0
  3. {pactkit-2.12.0 → pactkit-2.14.0}/.opencode/pactkit.yaml +1 -0
  4. {pactkit-2.12.0 → pactkit-2.14.0}/CHANGELOG.md +27 -0
  5. {pactkit-2.12.0 → pactkit-2.14.0}/PKG-INFO +6 -4
  6. {pactkit-2.12.0 → pactkit-2.14.0}/README.md +5 -3
  7. {pactkit-2.12.0 → pactkit-2.14.0}/docs/architecture/governance/archive/lessons_archive_202603.md +8 -0
  8. {pactkit-2.12.0 → pactkit-2.14.0}/docs/architecture/governance/lessons.md +6 -8
  9. {pactkit-2.12.0 → pactkit-2.14.0}/docs/architecture/governance/rules.md +1 -1
  10. pactkit-2.14.0/docs/product/archive/archive_202605.md +109 -0
  11. pactkit-2.14.0/docs/product/context.md +29 -0
  12. pactkit-2.14.0/docs/product/sprint_board.md +24 -0
  13. pactkit-2.14.0/docs/specs/HOTFIX-slim-117.md +18 -0
  14. pactkit-2.14.0/docs/specs/HOTFIX-slim-122.md +20 -0
  15. pactkit-2.14.0/docs/specs/HOTFIX-slim-123.md +17 -0
  16. pactkit-2.14.0/docs/specs/STORY-slim-113.md +175 -0
  17. pactkit-2.14.0/docs/specs/STORY-slim-114.md +158 -0
  18. pactkit-2.14.0/docs/specs/STORY-slim-115.md +141 -0
  19. pactkit-2.14.0/docs/specs/STORY-slim-116.md +186 -0
  20. pactkit-2.14.0/docs/specs/STORY-slim-118.md +149 -0
  21. pactkit-2.14.0/docs/specs/STORY-slim-119.md +190 -0
  22. pactkit-2.14.0/docs/specs/STORY-slim-120.md +123 -0
  23. pactkit-2.14.0/docs/specs/STORY-slim-121.md +199 -0
  24. pactkit-2.14.0/docs/specs/STORY-slim-124.md +232 -0
  25. pactkit-2.14.0/docs/specs/STORY-slim-125.md +86 -0
  26. {pactkit-2.12.0 → pactkit-2.14.0}/pyproject.toml +1 -1
  27. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/__init__.py +1 -1
  28. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/cli.py +144 -0
  29. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/config.py +8 -4
  30. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/prompts/commands.py +47 -11
  31. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/prompts/skills.py +60 -11
  32. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/prompts/workflows.py +3 -0
  33. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/python_analyzer.py +98 -21
  34. pactkit-2.14.0/src/pactkit/skills/interface_summary.py +199 -0
  35. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/visualize.py +42 -7
  36. pactkit-2.14.0/tests/unit/test_interface_summary.py +207 -0
  37. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_prompt_cli_refs.py +1 -1
  38. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story063_prompt_slimming.py +4 -1
  39. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim026.py +2 -2
  40. pactkit-2.14.0/tests/unit/test_story_slim114_journey_sync.py +130 -0
  41. pactkit-2.14.0/tests/unit/test_story_slim119.py +310 -0
  42. pactkit-2.14.0/tests/unit/test_story_slim120.py +186 -0
  43. pactkit-2.14.0/tests/unit/test_story_slim121.py +241 -0
  44. pactkit-2.14.0/tests/unit/test_story_slim125.py +105 -0
  45. pactkit-2.12.0/docs/product/context.md +0 -31
  46. pactkit-2.12.0/docs/product/sprint_board.md +0 -39
  47. {pactkit-2.12.0 → pactkit-2.14.0}/.github/workflows/pactkit.yml +0 -0
  48. {pactkit-2.12.0 → pactkit-2.14.0}/.github/workflows/publish.yml +0 -0
  49. {pactkit-2.12.0 → pactkit-2.14.0}/AGENTS.md +0 -0
  50. {pactkit-2.12.0 → pactkit-2.14.0}/CODE_OF_CONDUCT.md +0 -0
  51. {pactkit-2.12.0 → pactkit-2.14.0}/CONTRIBUTING.md +0 -0
  52. {pactkit-2.12.0 → pactkit-2.14.0}/LICENSE +0 -0
  53. {pactkit-2.12.0 → pactkit-2.14.0}/SECURITY.md +0 -0
  54. {pactkit-2.12.0 → pactkit-2.14.0}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
  55. {pactkit-2.12.0 → pactkit-2.14.0}/docs/architecture/governance/harness_audit.json +0 -0
  56. {pactkit-2.12.0 → pactkit-2.14.0}/docs/architecture/governance/philosophy.md +0 -0
  57. {pactkit-2.12.0 → pactkit-2.14.0}/docs/assets/logo.png +0 -0
  58. {pactkit-2.12.0 → pactkit-2.14.0}/docs/e2e/journey.md +0 -0
  59. {pactkit-2.12.0 → pactkit-2.14.0}/docs/guides/codex-integration-preresearch.md +0 -0
  60. {pactkit-2.12.0 → pactkit-2.14.0}/docs/guides/tool-integration-checklist.md +0 -0
  61. {pactkit-2.12.0 → pactkit-2.14.0}/docs/product/archive/archive_202602.md +0 -0
  62. {pactkit-2.12.0 → pactkit-2.14.0}/docs/product/archive/archive_202603.md +0 -0
  63. {pactkit-2.12.0 → pactkit-2.14.0}/docs/product/archive/archive_202604.md +0 -0
  64. {pactkit-2.12.0 → pactkit-2.14.0}/docs/product/friction-log.md +0 -0
  65. {pactkit-2.12.0 → pactkit-2.14.0}/docs/product/prd.md +0 -0
  66. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-001.md +0 -0
  67. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-002.md +0 -0
  68. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-003.md +0 -0
  69. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-004.md +0 -0
  70. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-005.md +0 -0
  71. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-006.md +0 -0
  72. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-007.md +0 -0
  73. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-008.md +0 -0
  74. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-009.md +0 -0
  75. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-010.md +0 -0
  76. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-011.md +0 -0
  77. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-012.md +0 -0
  78. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-013.md +0 -0
  79. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-014.md +0 -0
  80. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-015.md +0 -0
  81. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-016.md +0 -0
  82. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-017.md +0 -0
  83. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-018.md +0 -0
  84. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-019.md +0 -0
  85. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-020.md +0 -0
  86. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-021.md +0 -0
  87. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-022.md +0 -0
  88. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-023.md +0 -0
  89. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-024.md +0 -0
  90. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-025.md +0 -0
  91. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-026.md +0 -0
  92. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-027.md +0 -0
  93. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-028.md +0 -0
  94. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-029.md +0 -0
  95. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-030.md +0 -0
  96. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-031.md +0 -0
  97. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-032.md +0 -0
  98. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-033.md +0 -0
  99. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-034.md +0 -0
  100. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-035.md +0 -0
  101. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-slim-001.md +0 -0
  102. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-slim-002.md +0 -0
  103. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-slim-003.md +0 -0
  104. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-slim-004.md +0 -0
  105. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-slim-005.md +0 -0
  106. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-slim-006.md +0 -0
  107. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-slim-089.md +0 -0
  108. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/BUG-slim-107.md +0 -0
  109. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-023.md +0 -0
  110. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-049.md +0 -0
  111. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-050.md +0 -0
  112. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-051.md +0 -0
  113. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-052.md +0 -0
  114. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-061.md +0 -0
  115. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-062.md +0 -0
  116. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-067.md +0 -0
  117. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-069.md +0 -0
  118. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-070.md +0 -0
  119. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-085.md +0 -0
  120. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-087.md +0 -0
  121. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-096.md +0 -0
  122. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-099.md +0 -0
  123. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-107.md +0 -0
  124. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-001.md +0 -0
  125. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-002.md +0 -0
  126. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-003.md +0 -0
  127. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-004.md +0 -0
  128. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-005.md +0 -0
  129. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-006.md +0 -0
  130. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-007.md +0 -0
  131. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-008.md +0 -0
  132. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-009.md +0 -0
  133. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-010.md +0 -0
  134. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-011.md +0 -0
  135. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-012.md +0 -0
  136. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-013.md +0 -0
  137. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-014.md +0 -0
  138. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-015.md +0 -0
  139. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-016.md +0 -0
  140. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-017.md +0 -0
  141. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-018.md +0 -0
  142. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-019.md +0 -0
  143. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-020.md +0 -0
  144. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-021.md +0 -0
  145. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-022.md +0 -0
  146. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-023.md +0 -0
  147. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-024.md +0 -0
  148. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-025.md +0 -0
  149. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-026.md +0 -0
  150. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-027.md +0 -0
  151. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-028.md +0 -0
  152. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-029.md +0 -0
  153. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-030.md +0 -0
  154. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-031.md +0 -0
  155. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-032.md +0 -0
  156. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-033.md +0 -0
  157. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-034.md +0 -0
  158. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-035.md +0 -0
  159. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-036.md +0 -0
  160. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-037.md +0 -0
  161. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-038.md +0 -0
  162. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-039.md +0 -0
  163. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-040.md +0 -0
  164. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-041.md +0 -0
  165. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-042.md +0 -0
  166. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-043.md +0 -0
  167. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-044.md +0 -0
  168. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-045.md +0 -0
  169. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-046.md +0 -0
  170. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-047.md +0 -0
  171. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-048.md +0 -0
  172. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-049.md +0 -0
  173. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-050.md +0 -0
  174. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-051.md +0 -0
  175. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-052.md +0 -0
  176. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-053.md +0 -0
  177. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-054.md +0 -0
  178. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-055.md +0 -0
  179. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-056.md +0 -0
  180. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-057.md +0 -0
  181. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-058.md +0 -0
  182. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-059.md +0 -0
  183. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-060.md +0 -0
  184. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-061.md +0 -0
  185. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-062.md +0 -0
  186. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-063.md +0 -0
  187. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-064.md +0 -0
  188. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-065.md +0 -0
  189. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-069.md +0 -0
  190. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-070.md +0 -0
  191. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-071.md +0 -0
  192. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-072.md +0 -0
  193. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-073.md +0 -0
  194. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-001.md +0 -0
  195. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-005.md +0 -0
  196. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-006.md +0 -0
  197. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-007.md +0 -0
  198. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-009.md +0 -0
  199. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-010.md +0 -0
  200. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-011.md +0 -0
  201. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-012.md +0 -0
  202. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-013.md +0 -0
  203. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-014.md +0 -0
  204. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-015.md +0 -0
  205. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-016.md +0 -0
  206. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-017.md +0 -0
  207. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-018.md +0 -0
  208. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-019.md +0 -0
  209. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-020.md +0 -0
  210. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-021.md +0 -0
  211. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-022.md +0 -0
  212. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-023.md +0 -0
  213. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-024.md +0 -0
  214. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-028.md +0 -0
  215. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-029.md +0 -0
  216. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-030.md +0 -0
  217. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-031.md +0 -0
  218. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-032.md +0 -0
  219. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-033.md +0 -0
  220. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-034.md +0 -0
  221. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-035.md +0 -0
  222. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-036.md +0 -0
  223. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-037.md +0 -0
  224. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-038.md +0 -0
  225. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-039.md +0 -0
  226. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-040.md +0 -0
  227. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-041.md +0 -0
  228. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-042.md +0 -0
  229. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-043.md +0 -0
  230. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-044.md +0 -0
  231. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-045.md +0 -0
  232. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-046.md +0 -0
  233. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-047.md +0 -0
  234. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-048.md +0 -0
  235. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-049.md +0 -0
  236. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-050.md +0 -0
  237. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-051.md +0 -0
  238. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-052.md +0 -0
  239. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-053.md +0 -0
  240. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-054.md +0 -0
  241. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-055.md +0 -0
  242. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-056.md +0 -0
  243. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-057.md +0 -0
  244. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-058.md +0 -0
  245. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-059.md +0 -0
  246. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-060.md +0 -0
  247. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-063.md +0 -0
  248. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-066.md +0 -0
  249. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-067.md +0 -0
  250. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-068.md +0 -0
  251. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-069.md +0 -0
  252. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-070.md +0 -0
  253. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-071.md +0 -0
  254. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-072.md +0 -0
  255. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-073.md +0 -0
  256. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-074.md +0 -0
  257. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-075.md +0 -0
  258. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-076.md +0 -0
  259. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-077.md +0 -0
  260. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-078.md +0 -0
  261. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-079.md +0 -0
  262. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-080.md +0 -0
  263. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-081.md +0 -0
  264. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-082.md +0 -0
  265. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-083.md +0 -0
  266. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-084.md +0 -0
  267. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-086.md +0 -0
  268. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-088.md +0 -0
  269. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-089.md +0 -0
  270. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-090.md +0 -0
  271. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-091.md +0 -0
  272. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-092.md +0 -0
  273. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-093.md +0 -0
  274. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-094.md +0 -0
  275. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-095.md +0 -0
  276. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-097.md +0 -0
  277. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-098.md +0 -0
  278. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-099.md +0 -0
  279. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-100.md +0 -0
  280. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-101.md +0 -0
  281. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-102.md +0 -0
  282. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-103.md +0 -0
  283. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-104.md +0 -0
  284. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-105.md +0 -0
  285. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-106.md +0 -0
  286. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-107.md +0 -0
  287. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-108.md +0 -0
  288. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-109.md +0 -0
  289. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-110.md +0 -0
  290. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-111.md +0 -0
  291. {pactkit-2.12.0 → pactkit-2.14.0}/docs/specs/STORY-slim-112.md +0 -0
  292. {pactkit-2.12.0 → pactkit-2.14.0}/docs/test_cases/BUG-001_case.md +0 -0
  293. {pactkit-2.12.0 → pactkit-2.14.0}/docs/test_cases/BUG-002_case.md +0 -0
  294. {pactkit-2.12.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-028_case.md +0 -0
  295. {pactkit-2.12.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-029_case.md +0 -0
  296. {pactkit-2.12.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-031_case.md +0 -0
  297. {pactkit-2.12.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-032_case.md +0 -0
  298. {pactkit-2.12.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-033_case.md +0 -0
  299. {pactkit-2.12.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-034_case.md +0 -0
  300. {pactkit-2.12.0 → pactkit-2.14.0}/opencode.json +0 -0
  301. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/__main__.py +0 -0
  302. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/audit.py +0 -0
  303. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/backfill.py +0 -0
  304. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/cleaners.py +0 -0
  305. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/context_gen.py +0 -0
  306. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/coverage_gate.py +0 -0
  307. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/doctor.py +0 -0
  308. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/garden.py +0 -0
  309. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/generators/__init__.py +0 -0
  310. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/generators/adapter.py +0 -0
  311. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/generators/deploy_base.py +0 -0
  312. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/generators/deployer.py +0 -0
  313. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/guards.py +0 -0
  314. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/id_generator.py +0 -0
  315. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/invariants.py +0 -0
  316. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/issue_sync.py +0 -0
  317. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/lazy_visualize.py +0 -0
  318. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/lessons.py +0 -0
  319. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/lint_runner.py +0 -0
  320. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/observe.py +0 -0
  321. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/profiles.py +0 -0
  322. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/prompts/__init__.py +0 -0
  323. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/prompts/agents.py +0 -0
  324. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/prompts/references.py +0 -0
  325. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/prompts/rules.py +0 -0
  326. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/regression.py +0 -0
  327. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/schemas.py +0 -0
  328. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/scripts.py +0 -0
  329. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/sec_scope.py +0 -0
  330. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/__init__.py +0 -0
  331. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/__init__.py +0 -0
  332. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
  333. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
  334. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
  335. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/board.py +0 -0
  336. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/report.py +0 -0
  337. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/scaffold.py +0 -0
  338. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/skills/spec_linter.py +0 -0
  339. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/spec_status.py +0 -0
  340. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/test_mapper.py +0 -0
  341. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/utils.py +0 -0
  342. {pactkit-2.12.0 → pactkit-2.14.0}/src/pactkit/validators.py +0 -0
  343. {pactkit-2.12.0 → pactkit-2.14.0}/tests/conftest.py +0 -0
  344. {pactkit-2.12.0 → pactkit-2.14.0}/tests/e2e/__init__.py +0 -0
  345. {pactkit-2.12.0 → pactkit-2.14.0}/tests/e2e/cli/__init__.py +0 -0
  346. {pactkit-2.12.0 → pactkit-2.14.0}/tests/e2e/cli/test_cli_e2e.py +0 -0
  347. {pactkit-2.12.0 → pactkit-2.14.0}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
  348. {pactkit-2.12.0 → pactkit-2.14.0}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
  349. {pactkit-2.12.0 → pactkit-2.14.0}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
  350. {pactkit-2.12.0 → pactkit-2.14.0}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
  351. {pactkit-2.12.0 → pactkit-2.14.0}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
  352. {pactkit-2.12.0 → pactkit-2.14.0}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
  353. {pactkit-2.12.0 → pactkit-2.14.0}/tests/fixtures/api_call_parser/page.tsx +0 -0
  354. {pactkit-2.12.0 → pactkit-2.14.0}/tests/integration/__init__.py +0 -0
  355. {pactkit-2.12.0 → pactkit-2.14.0}/tests/integration/test_deploy_classic.py +0 -0
  356. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_agent_features.py +0 -0
  357. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_agent_frontmatter.py +0 -0
  358. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_agents_enrichment.py +0 -0
  359. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_audit.py +0 -0
  360. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_blast_radius.py +0 -0
  361. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_board_bug027.py +0 -0
  362. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_board_sections.py +0 -0
  363. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug001_skill_path.py +0 -0
  364. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug002_plugin_paths.py +0 -0
  365. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug003_multi_import.py +0 -0
  366. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug004_dead_set.py +0 -0
  367. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug005_archive_taskless.py +0 -0
  368. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug006_scan_excludes.py +0 -0
  369. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
  370. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug008_stale_command_refs.py +0 -0
  371. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug009_project_config_backfill.py +0 -0
  372. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
  373. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug011_stale_refs.py +0 -0
  374. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug012_call_graph_filter.py +0 -0
  375. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug013_config_single_source.py +0 -0
  376. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug014_version_hygiene.py +0 -0
  377. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug017_project_init_playbook.py +0 -0
  378. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
  379. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug019_venv_deployment.py +0 -0
  380. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug020_claude_md_backup.py +0 -0
  381. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug025_release_delegation.py +0 -0
  382. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug026_version_sync.py +0 -0
  383. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug028_ghost_refs.py +0 -0
  384. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
  385. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
  386. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
  387. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
  388. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_021.py +0 -0
  389. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_022.py +0 -0
  390. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_023.py +0 -0
  391. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_024.py +0 -0
  392. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_slim001_env_detection.py +0 -0
  393. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
  394. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_slim003.py +0 -0
  395. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_slim004.py +0 -0
  396. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_slim005.py +0 -0
  397. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_slim006.py +0 -0
  398. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
  399. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_check_command.py +0 -0
  400. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_check_extensions_072_073.py +0 -0
  401. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_check_playbook_072_073.py +0 -0
  402. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_command_frontmatter.py +0 -0
  403. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_command_visualize_modes.py +0 -0
  404. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_complexity.py +0 -0
  405. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_config.py +0 -0
  406. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_config_auto_merge.py +0 -0
  407. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_constitution_sharpening.py +0 -0
  408. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_context_gen.py +0 -0
  409. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_create_skill.py +0 -0
  410. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_cross_flow_matrix.py +0 -0
  411. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_deploy_base.py +0 -0
  412. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_deployer_cleanup.py +0 -0
  413. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_deployer_plugin.py +0 -0
  414. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_design_command.py +0 -0
  415. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_done_gates.py +0 -0
  416. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_draw_prompt.py +0 -0
  417. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_draw_references.py +0 -0
  418. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_drawio_mcp.py +0 -0
  419. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_garden.py +0 -0
  420. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_home_path_fix.py +0 -0
  421. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_hotfix_command.py +0 -0
  422. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_init_guard.py +0 -0
  423. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_init_playbook_074.py +0 -0
  424. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_lang_profiles.py +0 -0
  425. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_layer_violations.py +0 -0
  426. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_lessons_rotation_075.py +0 -0
  427. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_list_stories.py +0 -0
  428. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_mcp_integration.py +0 -0
  429. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_model_config.py +0 -0
  430. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_modular_constitution.py +0 -0
  431. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_monorepo_detect.py +0 -0
  432. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_multi_prefix.py +0 -0
  433. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_observe.py +0 -0
  434. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_pdca_slim.py +0 -0
  435. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_profiles.py +0 -0
  436. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_project_visibility.py +0 -0
  437. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_prompt_quality_075.py +0 -0
  438. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_prompt_structural_invariants.py +0 -0
  439. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_prompts_package.py +0 -0
  440. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_release.py +0 -0
  441. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_release_field.py +0 -0
  442. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_release_v110.py +0 -0
  443. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_render_prompt.py +0 -0
  444. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_report_parser.py +0 -0
  445. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_report_unified.py +0 -0
  446. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_review_command.py +0 -0
  447. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_rules_enrichment.py +0 -0
  448. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_scaffold.py +0 -0
  449. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_scaffold_developer_prefix.py +0 -0
  450. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_schemas.py +0 -0
  451. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_script_extraction.py +0 -0
  452. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_selective_deploy.py +0 -0
  453. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_session_context.py +0 -0
  454. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_skill_structure.py +0 -0
  455. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_skills_enrichment.py +0 -0
  456. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_slim_deps_088.py +0 -0
  457. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_smart_regression.py +0 -0
  458. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_solution_design_rule.py +0 -0
  459. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_sprint_command.py +0 -0
  460. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_stack_references.py +0 -0
  461. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_status_command.py +0 -0
  462. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_statusline.py +0 -0
  463. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story014_release.py +0 -0
  464. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story015_ci_lint_gate.py +0 -0
  465. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story016_claude_md.py +0 -0
  466. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story017_init_claude_md.py +0 -0
  467. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story018_arch_staleness.py +0 -0
  468. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story019_bailout.py +0 -0
  469. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story020_horizon.py +0 -0
  470. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story021_rfc.py +0 -0
  471. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story022_decision_tree.py +0 -0
  472. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story023_test_quality.py +0 -0
  473. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story024_native_agent.py +0 -0
  474. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story025_ci_pipeline.py +0 -0
  475. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story026_issue_tracker.py +0 -0
  476. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story028_rule_scoping.py +0 -0
  477. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story029_doctor.py +0 -0
  478. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story030_lint.py +0 -0
  479. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story031_git_init_guard.py +0 -0
  480. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story032_greenfield_redirect.py +0 -0
  481. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story033_config_backfill.py +0 -0
  482. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story034_plan_config_refresh.py +0 -0
  483. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story035_readme_docs.py +0 -0
  484. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story037_regression_fix.py +0 -0
  485. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story038_call_graph_update.py +0 -0
  486. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story039_venv_config.py +0 -0
  487. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story040_layered_claude_md.py +0 -0
  488. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story042_spec_linter.py +0 -0
  489. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story043_active_clarify.py +0 -0
  490. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story044_consistency_check.py +0 -0
  491. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story045_auto_pr.py +0 -0
  492. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story046_agent_adapter.py +0 -0
  493. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story047_enterprise_flags.py +0 -0
  494. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story048_worktree_isolation.py +0 -0
  495. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story049_community_standards.py +0 -0
  496. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
  497. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story051_workflow_streamlining.py +0 -0
  498. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story052_conditional_github_release.py +0 -0
  499. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story053_impact_regression.py +0 -0
  500. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story055_commands.py +0 -0
  501. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story055_config.py +0 -0
  502. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story055_spec_linter.py +0 -0
  503. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story056_commands.py +0 -0
  504. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story056_config.py +0 -0
  505. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story057_implicit_cleanup.py +0 -0
  506. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story058_opencode_extraction.py +0 -0
  507. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story058_routing_fix.py +0 -0
  508. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story059_codex_removal.py +0 -0
  509. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story060_init_hang.py +0 -0
  510. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story061_remove_thinking.py +0 -0
  511. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story062_mcp_recommendations.py +0 -0
  512. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story064_venv_local_md.py +0 -0
  513. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story065_sprint_model.py +0 -0
  514. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story072_developer_prefix.py +0 -0
  515. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story106_lateral_scan.py +0 -0
  516. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
  517. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
  518. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim011_command_rules.py +0 -0
  519. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim012_ci.py +0 -0
  520. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_clean.py +0 -0
  521. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_context.py +0 -0
  522. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_guard.py +0 -0
  523. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
  524. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_next_id.py +0 -0
  525. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_regression.py +0 -0
  526. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_sec_scope.py +0 -0
  527. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_validators.py +0 -0
  528. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim015_doctor.py +0 -0
  529. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
  530. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim017.py +0 -0
  531. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim018.py +0 -0
  532. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
  533. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
  534. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim021.py +0 -0
  535. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim022.py +0 -0
  536. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim023.py +0 -0
  537. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim024.py +0 -0
  538. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim025.py +0 -0
  539. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim027.py +0 -0
  540. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim028.py +0 -0
  541. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim029.py +0 -0
  542. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim030.py +0 -0
  543. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim031.py +0 -0
  544. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim032.py +0 -0
  545. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim033.py +0 -0
  546. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim034.py +0 -0
  547. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim035.py +0 -0
  548. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim036.py +0 -0
  549. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim037.py +0 -0
  550. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim038.py +0 -0
  551. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim039.py +0 -0
  552. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim040.py +0 -0
  553. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim041.py +0 -0
  554. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim042.py +0 -0
  555. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim043.py +0 -0
  556. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim044.py +0 -0
  557. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim045.py +0 -0
  558. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim046.py +0 -0
  559. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim047.py +0 -0
  560. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim048.py +0 -0
  561. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim049.py +0 -0
  562. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim051.py +0 -0
  563. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim052.py +0 -0
  564. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim053.py +0 -0
  565. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim054.py +0 -0
  566. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim055.py +0 -0
  567. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim056.py +0 -0
  568. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim060_codex_profile.py +0 -0
  569. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim063.py +0 -0
  570. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim065.py +0 -0
  571. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim076_multistack.py +0 -0
  572. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
  573. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim078.py +0 -0
  574. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim079.py +0 -0
  575. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim080.py +0 -0
  576. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim081.py +0 -0
  577. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim082.py +0 -0
  578. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim083.py +0 -0
  579. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim084.py +0 -0
  580. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim095.py +0 -0
  581. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
  582. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
  583. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim102_version_marker.py +0 -0
  584. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim104_should_semantics.py +0 -0
  585. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim107.py +0 -0
  586. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim109_journey_spec.py +0 -0
  587. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim111_playwright_assertion.py +0 -0
  588. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_story_slim112_rules_split.py +0 -0
  589. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_tools.py +0 -0
  590. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_topology_parsers_066.py +0 -0
  591. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_update_task.py +0 -0
  592. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_visualize_call_nested.py +0 -0
  593. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_visualize_chain_fix.py +0 -0
  594. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_visualize_modes.py +0 -0
  595. {pactkit-2.12.0 → pactkit-2.14.0}/tests/unit/test_visualize_multilang_chain.py +0 -0
@@ -0,0 +1,16 @@
1
+ # CodeGraph data files
2
+ # These are local to each machine and should not be committed
3
+
4
+ # Database
5
+ *.db
6
+ *.db-wal
7
+ *.db-shm
8
+
9
+ # Cache
10
+ cache/
11
+
12
+ # Logs
13
+ *.log
14
+
15
+ # Hook markers
16
+ .dirty
@@ -62,3 +62,6 @@ coder/
62
62
  docker/
63
63
  docs/slides/
64
64
 
65
+
66
+ # Call graph SQLite output (STORY-slim-121)
67
+ docs/architecture/graphs/*.db
@@ -143,6 +143,7 @@ agent_models:
143
143
 
144
144
  # Visualize — configure directory scan exclusions
145
145
  visualize:
146
+ graph_provider: codegraph
146
147
  scan_excludes:
147
148
  - venv
148
149
  - _venv
@@ -4,6 +4,33 @@ All notable changes to PactKit will be documented in this file.
4
4
 
5
5
  Format follows [Keep a Changelog](https://keepachangelog.com/).
6
6
 
7
+ ## [2.14.0] - 2026-05-26
8
+
9
+ ### Added
10
+ - **Codegraph integration** (STORY-slim-124) — `pactkit query` now reads from `.codegraph/codegraph.db` (generated by `@colbymchenry/codegraph`) when `visualize.graph_provider: codegraph` is configured. Provides 2.6x more edges than pactkit's own suffix-match resolution (6580 vs 2483 in real projects), with qualified names, line numbers, and type-aware resolution.
11
+ - **Auto-init codegraph** — When `graph_provider: codegraph` is set and `.codegraph/codegraph.db` is missing, `pactkit query` auto-runs `codegraph init -i` if the CLI is on PATH. Plan/Act phases also auto-setup codegraph when detected.
12
+ - **Graph Query Protocol dual-mode** — PDCA commands now support two modes: Codegraph Mode (`pactkit query` + codegraph CLI + MCP tools) and Grep Mode (default fallback on `.mmd` files).
13
+
14
+ ### Removed
15
+ - **`_write_sqlite_db()`** — Pactkit no longer generates its own `call_graph.db`. The upstream codegraph tool produces a superior graph with tree-sitter + import-aware resolution.
16
+ - **`visualize.sqlite_output` config** — Replaced by `visualize.graph_provider: codegraph`. Existing configs should migrate.
17
+
18
+ ### Changed
19
+ - **`pactkit query`** — Now reads `.codegraph/codegraph.db` (codegraph schema with hash IDs, JOIN edges+nodes) instead of pactkit's own `call_graph.db`.
20
+ - **PDCA prompts updated** — All references to `call_graph.db` / "SQLite Mode" removed from Plan, Act, Check, Done, Hotfix, and Trace skills. Impact analysis uses `pactkit query --callers` (codegraph) or grep `.mmd` (default).
21
+
22
+ ## [2.13.0] - 2026-05-25
23
+
24
+ ### Added
25
+ - **Call graph SQLite output** (STORY-slim-121) — `pactkit visualize --mode call` now optionally writes `call_graph.db` alongside the existing `.mmd` file. Enable via `visualize.sqlite_output: true` in `pactkit.yaml`. Atomic write (tmp+rename), zero new dependencies (`sqlite3` stdlib).
26
+ - **`pactkit query` CLI** (STORY-slim-121) — New subcommand for structured call graph queries: `--callers <func>` (fan-in), `--callees <func>` (fan-out), `--chain <func> [--down]` (transitive upstream/downstream via recursive CTE). Reads from `call_graph.db`; exits with helpful message when db is missing.
27
+ - **Graph Query Protocol upgrade** (STORY-slim-121) — `SKILL_VISUALIZE_MD` now routes to `pactkit query` as primary path when `call_graph.db` exists, with grep as fallback for mmd-only projects.
28
+ - **Enhanced Python call graph coverage** (STORY-slim-119) — `_extract_calls` now captures non-self attribute calls (`engine.run()`), function references in list/tuple/keyword/assign contexts, and nested functions via `ast.walk` + parent map. Edge count on medium-large projects: 1,360 → 3,764 (+177%).
29
+ - **Test and script scanning in call graph** (STORY-slim-120) — `visualize --mode call` now scans `tests/`, `scripts/`, and `alembic/` directories in addition to `src/`. Locality-based `_resolve_callee` prefers same-file/same-package candidates when multiple matches exist.
30
+ - **`pactkit interface-summary` CLI** (STORY-slim-113) — AST-based interface extraction that physically outputs only signatures, types, and docstrings. Enforces "Code Enforces, Prompt Instructs" for Act Phase 1 layered loading — AI receives truncated content by design.
31
+ - **Journey Sync in Act Phase 4** (STORY-slim-114) — Conditional step that updates `docs/e2e/journey.md` when a Story modifies journey-relevant steps. Closes the create→consume→update lifecycle gap.
32
+ - **Journey Segment in Plan Phase 3.2a** (STORY-slim-114) — Conditional Spec annotation that links Stories to journey steps, enabling Act Phase 4 auto-detection.
33
+
7
34
  ## [2.12.0] - 2026-05-06
8
35
 
9
36
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pactkit
3
- Version: 2.12.0
3
+ Version: 2.14.0
4
4
  Summary: Spec-driven agentic DevOps toolkit for AI coding assistants
5
5
  Project-URL: Homepage, https://pactkit.dev
6
6
  Project-URL: Repository, https://github.com/pactkit/pactkit-public
@@ -55,7 +55,7 @@ Description-Content-Type: text/markdown
55
55
 
56
56
  > **PactKit** (Pact 契约 + Kit) is a governance framework that enforces the **P.A.C.T.** contract between humans and AI agents. Deterministic operations run as code, not prompts. Decisions are grounded in data, not memory. AI does what it's best at — creativity and language — while code handles everything that must be repeatable and correct.
57
57
  >
58
- > 25 CLI subcommands, 9 specialized agents, 11 commands, 10 skills, and a full Plan-Act-Check-Done lifecycle. One `pip install` deploys to all 3 supported IDEs.
58
+ > 26 CLI subcommands, 9 specialized agents, 11 commands, 10 skills, and a full Plan-Act-Check-Done lifecycle. One `pip install` deploys to all 3 supported IDEs.
59
59
 
60
60
  ### Supported AI Tools
61
61
 
@@ -247,7 +247,7 @@ PactKit deploys 10 skills (3 scripted + 7 prompt-only), auto-invoked by commands
247
247
 
248
248
  | Skill | Type | Purpose |
249
249
  |-------|------|---------|
250
- | **pactkit-visualize** | Scripted | Code dependency graph (Mermaid): file-level, class-level, call-level |
250
+ | **pactkit-visualize** | Scripted | Code dependency graph (Mermaid .mmd): file-level, class-level, call-level |
251
251
  | **pactkit-board** | Scripted | Sprint board operations: add story, update task, archive |
252
252
  | **pactkit-scaffold** | Scripted | File scaffolding: create spec, test files, git branches, skills |
253
253
  | **pactkit-trace** | Prompt-only | Deep code tracing and execution flow analysis |
@@ -260,7 +260,7 @@ PactKit deploys 10 skills (3 scripted + 7 prompt-only), auto-invoked by commands
260
260
 
261
261
  ## CLI Subcommands
262
262
 
263
- PactKit ships 25 deterministic CLI subcommands — operations that were previously delegated to AI prompts are now enforced in Python code (the "C" in P.A.C.T.):
263
+ PactKit ships 26 deterministic CLI subcommands — operations that were previously delegated to AI prompts are now enforced in Python code (the "C" in P.A.C.T.):
264
264
 
265
265
  | Command | Purpose |
266
266
  |---------|---------|
@@ -281,6 +281,7 @@ PactKit ships 25 deterministic CLI subcommands — operations that were previous
281
281
  | `pactkit test-map` | Map source files to test files |
282
282
  | `pactkit coverage-gate` | Enforce 3-tier coverage thresholds (80/50/block) |
283
283
  | `pactkit visualize` | Conditional graph regeneration (lazy mode) |
284
+ | `pactkit query` | Query call graph via codegraph: `--callers`, `--callees`, `--chain [--down]` (requires `graph_provider: codegraph`) |
284
285
  | `pactkit lesson-append` | Append lesson with specificity check and dedup |
285
286
  | `pactkit invariants-refresh` | Update test count invariant in rules.md |
286
287
  | `pactkit sec-scope` | Detect security scope for changed files |
@@ -375,6 +376,7 @@ docs/
375
376
  | `skills` | list | all 10 | Skills to deploy |
376
377
  | `rules` | list | all 8 | Constitution rule modules to deploy |
377
378
  | `exclude` | object | `{}` | Components to exclude (e.g., `exclude.agents: [agent-name]`) |
379
+ | `visualize.graph_provider` | string | (absent) | Graph query backend. Set `codegraph` to use `.codegraph/codegraph.db` for `pactkit query`. Absent = grep `.mmd` |
378
380
  | `ci` | object | `provider: none` | CI/CD pipeline generation (`github`, `gitlab`, `none`). Sub-fields: `runner` (default: `ubuntu-latest`), `language_version` (default: auto per stack), `github_host` (GHE server address), `actions_ref` (GHE actions prefix) |
379
381
  | `issue_tracker` | object | `provider: none` | External issue tracker (`github`, `none`) |
380
382
  | `hooks` | object | disabled | Opt-in hook templates (pre-commit, post-test, pre-push) |
@@ -13,7 +13,7 @@
13
13
 
14
14
  > **PactKit** (Pact 契约 + Kit) is a governance framework that enforces the **P.A.C.T.** contract between humans and AI agents. Deterministic operations run as code, not prompts. Decisions are grounded in data, not memory. AI does what it's best at — creativity and language — while code handles everything that must be repeatable and correct.
15
15
  >
16
- > 25 CLI subcommands, 9 specialized agents, 11 commands, 10 skills, and a full Plan-Act-Check-Done lifecycle. One `pip install` deploys to all 3 supported IDEs.
16
+ > 26 CLI subcommands, 9 specialized agents, 11 commands, 10 skills, and a full Plan-Act-Check-Done lifecycle. One `pip install` deploys to all 3 supported IDEs.
17
17
 
18
18
  ### Supported AI Tools
19
19
 
@@ -205,7 +205,7 @@ PactKit deploys 10 skills (3 scripted + 7 prompt-only), auto-invoked by commands
205
205
 
206
206
  | Skill | Type | Purpose |
207
207
  |-------|------|---------|
208
- | **pactkit-visualize** | Scripted | Code dependency graph (Mermaid): file-level, class-level, call-level |
208
+ | **pactkit-visualize** | Scripted | Code dependency graph (Mermaid .mmd): file-level, class-level, call-level |
209
209
  | **pactkit-board** | Scripted | Sprint board operations: add story, update task, archive |
210
210
  | **pactkit-scaffold** | Scripted | File scaffolding: create spec, test files, git branches, skills |
211
211
  | **pactkit-trace** | Prompt-only | Deep code tracing and execution flow analysis |
@@ -218,7 +218,7 @@ PactKit deploys 10 skills (3 scripted + 7 prompt-only), auto-invoked by commands
218
218
 
219
219
  ## CLI Subcommands
220
220
 
221
- PactKit ships 25 deterministic CLI subcommands — operations that were previously delegated to AI prompts are now enforced in Python code (the "C" in P.A.C.T.):
221
+ PactKit ships 26 deterministic CLI subcommands — operations that were previously delegated to AI prompts are now enforced in Python code (the "C" in P.A.C.T.):
222
222
 
223
223
  | Command | Purpose |
224
224
  |---------|---------|
@@ -239,6 +239,7 @@ PactKit ships 25 deterministic CLI subcommands — operations that were previous
239
239
  | `pactkit test-map` | Map source files to test files |
240
240
  | `pactkit coverage-gate` | Enforce 3-tier coverage thresholds (80/50/block) |
241
241
  | `pactkit visualize` | Conditional graph regeneration (lazy mode) |
242
+ | `pactkit query` | Query call graph via codegraph: `--callers`, `--callees`, `--chain [--down]` (requires `graph_provider: codegraph`) |
242
243
  | `pactkit lesson-append` | Append lesson with specificity check and dedup |
243
244
  | `pactkit invariants-refresh` | Update test count invariant in rules.md |
244
245
  | `pactkit sec-scope` | Detect security scope for changed files |
@@ -333,6 +334,7 @@ docs/
333
334
  | `skills` | list | all 10 | Skills to deploy |
334
335
  | `rules` | list | all 8 | Constitution rule modules to deploy |
335
336
  | `exclude` | object | `{}` | Components to exclude (e.g., `exclude.agents: [agent-name]`) |
337
+ | `visualize.graph_provider` | string | (absent) | Graph query backend. Set `codegraph` to use `.codegraph/codegraph.db` for `pactkit query`. Absent = grep `.mmd` |
336
338
  | `ci` | object | `provider: none` | CI/CD pipeline generation (`github`, `gitlab`, `none`). Sub-fields: `runner` (default: `ubuntu-latest`), `language_version` (default: auto per stack), `github_host` (GHE server address), `actions_ref` (GHE actions prefix) |
337
339
  | `issue_tracker` | object | `provider: none` | External issue tracker (`github`, `none`) |
338
340
  | `hooks` | object | disabled | Opt-in hook templates (pre-commit, post-test, pre-push) |
@@ -54,3 +54,11 @@
54
54
  | 2026-03-24 | _scan_hooks() only accepts files with 'use' prefix in hook dirs (src/hooks/, composables/) to prevent utility files from becoming hook nodes | visualize.py:_scan_hooks |
55
55
  | 2026-03-24 | regression_workflow_impact hook/store matching uses node.id substring of changed file path, not reverse — e.g. 'useAuth' in 'src/hooks/useAuth.ts' | visualize.py:regression_workflow_impact |
56
56
  | 2026-03-25 | export_focus_graphs() in visualize.py uses forward_reach() (not reverse_reach()) because entry points (command/service/page) are graph roots that invoke downward — forward BFS shows their dependency tree | src/pactkit/skills/visualize.py:export_focus_graphs |
57
+ | 2026-03-26 | board.py update_task: added 3-tier fuzzy fallback (single-task auto-mark, substring match, numeric index) to handle real-world callers that don't know exact task names on the board | src/pactkit/skills/board.py:update_task |
58
+ | 2026-03-26 | Position-based block removal (start, end tuples) is safer than str.find() for board operations — prevents substring false matches on similar story IDs | board.py:_parse_story_blocks |
59
+ | 2026-03-26 | Fixing _parse_story_blocks to return adjusted_end (len match) inherently fixed fix_board offset compensation — root cause fix in board.py:_parse_story_blocks eliminated downstream R2 symptom in board.py:fix_board | board.py:_parse_story_blocks,board.py:fix_board |
60
+ | 2026-03-26 | Helpers added to visualize.py standalone header get stripped by load_script(); always place new functions below the SCRIPT BODY marker | visualize.py:_mermaid_escape |
61
+ | 2026-03-26 | dict.pop() in shared config references causes caller mutation; use .get() for read-only access to avoid breaking multi-call scenarios | deployer.py:_deploy_ci |
62
+ | 2026-03-26 | _atomic_mmd_write() in visualize.py prevents truncated .mmd on crash via tmp+rename; all 4 write sites converted | visualize.py:_atomic_mmd_write |
63
+ | 2026-03-26 | test_story_slim056.py _init_project() helper creates realistic pactkit project fixture for subprocess E2E tests; 60 tests cover all 25 subcommands | test_story_slim056.py:_init_project |
64
+ | 2026-03-26 | entry_points auto-discovery with _load_entry_point_deployers() enables pip install pactkit-opencode to self-register; pre-existing tests referencing extracted functions must be updated to import from adapter package | deployer.py:_load_entry_point_deployers |
@@ -2,14 +2,6 @@
2
2
 
3
3
  | Date | Lesson | Context |
4
4
  |------|--------|---------|
5
- | 2026-03-26 | board.py update_task: added 3-tier fuzzy fallback (single-task auto-mark, substring match, numeric index) to handle real-world callers that don't know exact task names on the board | src/pactkit/skills/board.py:update_task |
6
- | 2026-03-26 | Position-based block removal (start, end tuples) is safer than str.find() for board operations — prevents substring false matches on similar story IDs | board.py:_parse_story_blocks |
7
- | 2026-03-26 | Fixing _parse_story_blocks to return adjusted_end (len match) inherently fixed fix_board offset compensation — root cause fix in board.py:_parse_story_blocks eliminated downstream R2 symptom in board.py:fix_board | board.py:_parse_story_blocks,board.py:fix_board |
8
- | 2026-03-26 | Helpers added to visualize.py standalone header get stripped by load_script(); always place new functions below the SCRIPT BODY marker | visualize.py:_mermaid_escape |
9
- | 2026-03-26 | dict.pop() in shared config references causes caller mutation; use .get() for read-only access to avoid breaking multi-call scenarios | deployer.py:_deploy_ci |
10
- | 2026-03-26 | _atomic_mmd_write() in visualize.py prevents truncated .mmd on crash via tmp+rename; all 4 write sites converted | visualize.py:_atomic_mmd_write |
11
- | 2026-03-26 | test_story_slim056.py _init_project() helper creates realistic pactkit project fixture for subprocess E2E tests; 60 tests cover all 25 subcommands | test_story_slim056.py:_init_project |
12
- | 2026-03-26 | entry_points auto-discovery with _load_entry_point_deployers() enables pip install pactkit-opencode to self-register; pre-existing tests referencing extracted functions must be updated to import from adapter package | deployer.py:_load_entry_point_deployers |
13
5
  | 2026-03-26 | VALID_FORMATS auto-derives from FORMAT_PROFILES.keys() — removing a profile cascades to config, CLI, and deployer with zero manual sync | profiles.py:FORMAT_PROFILES |
14
6
  | 2026-03-26 | DeployerBase static methods use lazy imports to avoid circular dependencies between deploy_base.py and deployer.py | deploy_base.py:DeployerBase.render_prompt |
15
7
  | 2026-03-26 | Thin adapter conversion: pactkit-codex reduced from 15,356 lines (full fork) to 668 lines (thin adapter) by importing core via DeployerBase. Key: deploy_codex_playbooks needs explicit path replacement for ALL format prefixes (~/.claude/, ~/.config/opencode/ → ~/.codex/) | pactkit_codex/deployer.py:deploy_codex_playbooks |
@@ -54,3 +46,9 @@
54
46
  | 2026-04-24 | Plan Phase横向扫描(Lateral Scan)比纵向trace更重要——PactSearch的10个技术债中60%源于缺少水平重复检测。修复方向是改Plan playbook引导Architect用已有工具(LSP/visualize/grep)做横向扫描,而非新建CLI | commands.py:Plan_Phase_1 |
55
47
  | 2026-04-24 | When migrating functionality (e.g., version checking from pactkit.yaml to global marker), grep all references across source, prompts, tests, and CLI help text — partial migration leaves ghost behavior | board.py:update_version |
56
48
  | 2026-04-27 | When extracting project-specific rules into a framework, generalize by removing project names, library references, and spec IDs — keep only the anti-pattern/fix-pattern structure that applies to any codebase | rules.py:RULES_MODULES |
49
+ | 2026-05-07 | Code Enforces implementation: pactkit interface-summary uses ast.parse() to physically output only signatures—AI receives truncated content, not a prompt instruction to self-truncate. Pattern: CLI tool as enforcement layer (interface_summary.py:generate_summary) | src/pactkit/skills/interface_summary.py:generate_summary |
50
+ | 2026-05-07 | Lifecycle gap pattern: when artifact has create+consume but no update mechanism, add conditional sync in the modifying command. Applied: Act Phase 4 Journey Sync step in commands.py COMMANDS_CONTENT['project-act.md'] | src/pactkit/prompts/commands.py:COMMANDS_CONTENT |
51
+ | 2026-05-25 | code_graph.mmd uses sanitized node IDs (src_pactkit_generators_deployer_py), not bare filenames — grep patterns for fan-in/fan-out must use .* wildcard or they silently never match | src/pactkit/prompts/skills.py:SKILL_VISUALIZE_MD |
52
+ | 2026-05-25 | When SCAN_EXCLUDES is a module-level constant shared across graph modes, add mode-specific exclusion logic at the call site rather than modifying the constant — pass call_extra_excludes = SCAN_EXCLUDES - {'tests'} only for call mode to avoid affecting file/class modes | visualize.py:_build_call_graph |
53
+ | 2026-05-25 | _write_sqlite_db reuses func_registry and rel_edges already in memory from _build_call_graph — no second AST scan; pactkit query reads db directly without touching pactkit.yaml | visualize.py:_build_call_graph |
54
+ | 2026-05-26 | SKILL.md model: frontmatter is passed through by deployer without transformation — source prompts in commands.py/workflows.py are the single source of truth for deployed skill metadata | commands.py:COMMANDS_CONTENT |
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## Invariants
17
17
 
18
- 1. All 3841+ tests must pass before any commit to `main`.
18
+ 1. All 3986+ tests must pass before any commit to `main`.
19
19
  2. Specs (`docs/specs/`) are the source of truth — code conforms to specs, not the reverse.
20
20
  3. CLI entry point is `pactkit` via `src/pactkit/cli.py:main`.
21
21
  4. No runtime dependencies beyond `pyyaml`.
@@ -0,0 +1,109 @@
1
+
2
+ ### [STORY-slim-113] pactkit interface-summary CLI — Code Enforce 接口摘要
3
+ > Spec: docs/specs/STORY-slim-113.md
4
+
5
+ - [x] 新建 interface_summary.py 提取逻辑
6
+ - [x] CLI 注册 interface-summary 命令
7
+ - [x] Act Phase 1 改为显式步骤
8
+ - [x] pactkit-trace 更新输出指引
9
+ - [x] 单元测试
10
+
11
+ ### [STORY-slim-112] Rules 架构重构:全局原则 vs 按需操作规程
12
+ > Spec: docs/specs/STORY-slim-112.md
13
+
14
+ - [x] 拆分 RULES_CORE/ONDEMAND + 新建 05-principles
15
+ - [x] 更新 deployer 双目录部署
16
+ - [x] 更新所有 skill @import 路径
17
+ - [x] 更新测试断言
18
+
19
+ ### [STORY-slim-111] Check Phase 4 Playwright 断言策略指南
20
+ > Spec: docs/specs/STORY-slim-111.md
21
+
22
+ - [x] 修改 project-check SKILL.md Phase 4 增加断言策略
23
+
24
+ ### [STORY-slim-110] project-design 集成 User Journey 生成
25
+ > Spec: docs/specs/STORY-slim-110.md
26
+
27
+ - [x] 修改 project-design SKILL.md Phase 1 Group B
28
+
29
+ ### [STORY-slim-109] E2E journey.md 规范定义与 File Atlas 集成
30
+ > Spec: docs/specs/STORY-slim-109.md
31
+
32
+ - [x] 注册 File Atlas
33
+ - [x] 创建 journey.md 格式规范
34
+ - [x] 修改 project-check Phase 4
35
+
36
+ ### [STORY-slim-108] pactkit-trace --summary 模式:接口摘要输出
37
+ > Spec: docs/specs/STORY-slim-108.md
38
+
39
+ - [x] 修改 pactkit-trace SKILL.md Phase 3
40
+ - [x] 修改 project-act SKILL.md Phase 1
41
+
42
+ ### [STORY-slim-114] Act Phase 4 Journey Sync — journey.md 维护闭环
43
+ > Spec: docs/specs/STORY-slim-114.md
44
+
45
+ - [x] Act Phase 4 新增 Journey Sync 步骤
46
+ - [x] Plan Phase 3.2a 条件 Journey Segment
47
+ - [x] 单元测试
48
+
49
+ ### [HOTFIX-slim-117] Fix Graph Query Protocol grep patterns
50
+ > Spec: docs/specs/HOTFIX-slim-117.md
51
+
52
+ - [x] Fix fan-in/fan-out grep patterns in SKILL_VISUALIZE_MD
53
+ - [x] Fix importer-count grep in project-act.md Phase 3
54
+
55
+ ### [STORY-slim-116] Skill Model Precision and Graph Query Optimization
56
+ > Spec: docs/specs/STORY-slim-116.md
57
+
58
+ - [x] Add graph query protocol to project-act and project-plan
59
+ - [x] Add model field to pactkit-visualize SKILL.md
60
+ - [x] Add model fields to 28 skills missing model assignment
61
+ - [x] Update project-plan and project-sprint to opus
62
+ - [x] Add haiku to pure I/O skills (scaffold, board, doctor, status, report, draw, arch-diagram, profile, find-skills, docx, pdf, pptx, xlsx)
63
+
64
+ ### [STORY-slim-120] Improve Call Graph Coverage: Test Files, Scripts, Locality Resolution
65
+ > Spec: docs/specs/STORY-slim-120.md
66
+
67
+ - [x] Write TDD tests for AC1-AC4
68
+ - [x] R1: scan tests/ in call mode
69
+ - [x] R2: scan scripts/ and alembic/
70
+ - [x] R3: locality-based _resolve_callee
71
+ - [x] Run pactkit update
72
+
73
+ ### [STORY-slim-121] call graph SQLite output with pactkit query CLI
74
+ > Spec: docs/specs/STORY-slim-121.md
75
+
76
+ - [x] Add visualize.sqlite_output config toggle
77
+ - [x] Add _load_sqlite_config() helper
78
+ - [x] Add _write_sqlite_db() with atomic write
79
+ - [x] Wire into _build_call_graph()
80
+ - [x] Add pactkit query subcommand (fan-in/fan-out/chain)
81
+ - [x] Update SKILL_VISUALIZE_MD with pactkit query examples
82
+ - [x] Add *.db to .gitignore
83
+
84
+ ### [STORY-slim-124] codegraph integration — read .codegraph/codegraph.db as graph provider
85
+ > Spec: docs/specs/STORY-slim-124.md
86
+
87
+ - [x] Add graph_provider config to pactkit.yaml
88
+ - [x] Guard _write_sqlite_db when codegraph
89
+ - [x] Implement codegraph SQL in pactkit query
90
+ - [x] Update Graph Query Protocol in skills.py
91
+ - [x] Update PDCA prompts to prefer pactkit query
92
+
93
+ ### [HOTFIX-slim-123] Fix: call_graph.db duplicate edges and orphan nodes
94
+ > Spec: docs/specs/HOTFIX-slim-123.md
95
+
96
+ - [x] Dedup rel_edges before insert
97
+ - [x] Filter edges to only reference existing nodes
98
+
99
+ ### [HOTFIX-slim-122] Fix: focus/entry overwrites call_graph.db
100
+ > Spec: docs/specs/HOTFIX-slim-122.md
101
+
102
+ - [x] Guard sqlite write against focus/entry mode
103
+
104
+ ### [STORY-slim-125] Add model frontmatter to all PDCA command/skill prompts
105
+ > Spec: docs/specs/STORY-slim-125.md
106
+
107
+ - [x] Add model to commands.py
108
+ - [x] Add model to workflows.py
109
+ - [x] Add regression test
@@ -0,0 +1,29 @@
1
+ # Project Context (Auto-generated)
2
+ > Last updated: 2026-05-26T17:29:18+08:00 by pactkit context
3
+
4
+ ## Sprint Status
5
+ Backlog: 2 | In Progress: 0 | Done: 0 stories
6
+
7
+ ## Current Stories
8
+ None
9
+
10
+ ## Recent Completions
11
+ None
12
+
13
+ ## Active Branches
14
+ + claude/naughty-euclid-e6a787
15
+ develop
16
+ * main
17
+
18
+ ## Key Decisions
19
+ - Lifecycle gap pattern: when artifact has create+consume but no update mechanism, add conditional sync in the modifying command. Applied: Act Phase 4 Journey Sync step in commands.py COMMANDS_CONTENT['project-act.md']
20
+ - code_graph.mmd uses sanitized node IDs (src_pactkit_generators_deployer_py), not bare filenames — grep patterns for fan-in/fan-out must use .* wildcard or they silently never match
21
+ - When SCAN_EXCLUDES is a module-level constant shared across graph modes, add mode-specific exclusion logic at the call site rather than modifying the constant — pass call_extra_excludes = SCAN_EXCLUDES - {'tests'} only for call mode to avoid affecting file/class modes
22
+ - _write_sqlite_db reuses func_registry and rel_edges already in memory from _build_call_graph — no second AST scan; pactkit query reads db directly without touching pactkit.yaml
23
+ - SKILL.md model: frontmatter is passed through by deployer without transformation — source prompts in commands.py/workflows.py are the single source of truth for deployed skill metadata
24
+
25
+ ## Next Recommended Action
26
+ `/project-plan`
27
+
28
+ ## Agent Continuation
29
+ No active work session.
@@ -0,0 +1,24 @@
1
+ # Sprint Board
2
+
3
+ ## 📋 Backlog
4
+
5
+ ### [STORY-slim-118] codegraph MCP Integration for Semantic Code Queries
6
+ > Spec: docs/specs/STORY-slim-118.md
7
+
8
+ - [ ] Document replacement vs augmentation decision
9
+ - [ ] Add codegraph MCP conditional note to SKILL_VISUALIZE_MD Graph Query Protocol
10
+ - [ ] Run pactkit update to redeploy
11
+
12
+ ### [STORY-slim-119] Improve Python Call Graph Coverage
13
+ > Spec: docs/specs/STORY-slim-119.md
14
+
15
+ - [ ] Extend _extract_calls to capture non-self attribute method calls (R1)
16
+ - [ ] Capture function references in list/assignment contexts (R2)
17
+ - [ ] Use ast.walk to scan nested functions (R3)
18
+ - [ ] Write TDD tests for AC1-AC4
19
+ - [ ] Run pactkit update to redeploy
20
+
21
+ ## 🔄 In Progress
22
+
23
+ ## ✅ Done
24
+
@@ -0,0 +1,18 @@
1
+ # HOTFIX-slim-117: Fix Graph Query Protocol grep patterns for code_graph.mmd
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | HOTFIX-slim-117 |
6
+ | Status | Done |
7
+ | Release | 2.14.0 |
8
+
9
+ ## Background
10
+
11
+ Graph Query Protocol (added in STORY-slim-116) uses `grep " --> deployer"` and `grep "deployer --> "` to filter edges in `code_graph.mmd`. However, nodes in `code_graph.mmd` are sanitized IDs (`src_pactkit_generators_deployer_py`), not bare filenames. These patterns never match — silent no-op. Correct patterns require `.*` wildcard: `grep " --> .*deployer"` (fan-in) and `grep "deployer.* --> "` (fan-out).
12
+
13
+ Same issue in `project-act.md` Phase 3 importer-count: `grep " --> <file>"` → `grep " --> .*<file>"`.
14
+
15
+ ## Target Files
16
+
17
+ - `src/pactkit/prompts/skills.py` — SKILL_VISUALIZE_MD lines 93, 96, 99
18
+ - `src/pactkit/prompts/commands.py` — project-act.md Phase 3 line 237
@@ -0,0 +1,20 @@
1
+ # HOTFIX-slim-122: prevent focus/entry mode from overwriting full call_graph.db
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | HOTFIX-slim-122 |
6
+ | Status | In Progress |
7
+ | Priority | P2 |
8
+ | Release | 2.13.0 |
9
+
10
+ ## Background
11
+
12
+ `_build_call_graph()` writes `call_graph.db` unconditionally when `sqlite_output: true`, including when running in `--focus` or `--entry` mode. These modes produce a subgraph (not the full call graph), so writing them to `call_graph.db` overwrites the complete dataset with a partial one.
13
+
14
+ ## Fix
15
+
16
+ Only write `call_graph.db` when both `focus` and `entry` are falsy (i.e., full graph mode).
17
+
18
+ - **Target**: `src/pactkit/skills/visualize.py`
19
+ - **Line 855**: Add `and not focus` guard (BFS/entry path)
20
+ - **Line 891**: Add `and not focus` guard (full graph path with focus filter)
@@ -0,0 +1,17 @@
1
+ # HOTFIX-slim-123: call_graph.db dedup edges and filter orphan nodes
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | HOTFIX-slim-123 |
6
+ | Status | Done |
7
+ | Priority | P1 |
8
+
9
+ ## Background
10
+
11
+ `_write_sqlite_db()` had two data quality issues: (1) duplicate edges (35.8% in pactsearch) because `rel_edges` was inserted without dedup, and (2) orphan edges referencing nodes not in `func_registry` (e.g., `__module__` synthetic callers).
12
+
13
+ ## Fix
14
+
15
+ - Target: `src/pactkit/skills/visualize.py:_write_sqlite_db()`
16
+ - Dedup `rel_edges` via set conversion before INSERT
17
+ - Filter edges to only include caller/callee pairs where both exist in `func_registry`
@@ -0,0 +1,175 @@
1
+ # STORY-slim-113: pactkit interface-summary CLI — Code Enforce 接口摘要
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | STORY-slim-113 |
6
+ | Status | Done |
7
+ | Priority | P1 |
8
+ | Release | 2.13.0 |
9
+
10
+ ## Background
11
+
12
+ ### 问题
13
+
14
+ STORY-slim-108 引入了"接口摘要"概念——Act Phase 1 对 trace 发现的非目标模块只读签名+docstring。但当前实现**完全依赖 Prompt 指导**(pactkit-trace SKILL.md 的 "Layered Output" 表格 + Act Phase 1.2 的一句 "Layered Loading"),AI 实际执行时仍然直接 Read 完整文件,因为:
15
+
16
+ 1. 没有工具约束——AI 调用 Read 工具时没有 `--summary-only` 限制
17
+ 2. 一句文字指导不足以改变 AI 的默认行为
18
+ 3. 违反了 PactKit 自己的 "Code Enforces, Prompt Instructs" 原则(架构原则 §10)
19
+
20
+ ### 方案
21
+
22
+ 新增 `pactkit interface-summary <file>` CLI 命令:
23
+ - 基于现有 `python_analyzer.py` 的 AST 能力(已有 `extract_classes`、`extract_functions_and_calls`)
24
+ - 输出经代码裁剪的接口摘要,AI 拿到的物理上就是精简内容
25
+ - Act Phase 1 改为**显式步骤**:对非目标模块调用此 CLI 而非 Read
26
+
27
+ ### 为什么不用 hook
28
+
29
+ 用户明确要求不使用 hook。本方案通过 CLI 输出 + playbook 步骤变更来实现 Code Enforce,无需 harness 层面的文件拦截。
30
+
31
+ ## Requirements
32
+
33
+ ### R1: 新增 `pactkit interface-summary` CLI 命令 (MUST)
34
+
35
+ 新增子命令接受一个或多个文件路径,输出接口摘要:
36
+
37
+ ```
38
+ pactkit interface-summary src/pactkit/generators/deployer.py
39
+ ```
40
+
41
+ 输出格式(per file):
42
+ ```
43
+ # deployer.py — Interface Summary
44
+
45
+ class ClassicDeployer(BaseDeployer):
46
+ """Deploy PactKit to ~/.claude/ (Classic format)."""
47
+ +deploy(target, config) -> DeployResult
48
+ +_deploy_rules(claude_root, enabled_rules) -> None
49
+ +_deploy_skills(claude_root, enabled_skills) -> None
50
+ -_cleanup_legacy(target) -> None
51
+
52
+ def atomic_write(path: Path, content: str) -> None:
53
+ """Write content atomically via tempfile + rename."""
54
+
55
+ def _render_prompt(template: str, profile: FormatProfile) -> str:
56
+ """Replace placeholders with profile-specific values."""
57
+ ```
58
+
59
+ 提取规则:
60
+ - **Class**: class name + bases + docstring 第一行 + public/private methods with signature
61
+ - **Function**: def name + params with type hints + return type + docstring 第一行
62
+ - **Skip**: 函数体、局部变量、内部逻辑
63
+ - **Constants/Enums**: 顶层 `UPPER_CASE` 赋值保留名称和类型
64
+
65
+ ### R2: 多语言支持通过 LANG_PROFILES 分派 (SHOULD)
66
+
67
+ 使用已有的 `LANG_PROFILES` + analyzer 架构:
68
+ - Python: `ast` 模块提取(已有基础设施)
69
+ - TypeScript: `tree_sitter_typescript` 提取 exported declarations
70
+ - Go: `tree_sitter_go` 提取 exported (大写) func/struct
71
+
72
+ 初始版本 MUST 支持 Python。TS/Go 为 SHOULD。
73
+
74
+ ### R3: Act Phase 1 增加显式步骤 (MUST)
75
+
76
+ 修改 `project-act/SKILL.md` Phase 1.2,从当前的一句指导:
77
+ > "Layered Loading: For non-target modules discovered by trace, read interface summary..."
78
+
79
+ 改为显式步骤:
80
+ ```
81
+ 2b. **Interface Summary** (for non-target modules):
82
+ - For each module discovered by trace that is NOT the modification target:
83
+ `pactkit interface-summary <file>`
84
+ - Only escalate to `Read <file>` when you confirm the module needs modification.
85
+ ```
86
+
87
+ ### R4: pactkit-trace SKILL.md 更新输出格式指引 (MUST)
88
+
89
+ 修改 pactkit-trace SKILL.md Phase 3 "Layered Output" 部分,从"建议 AI 自行精简"改为"调用 CLI 获取":
90
+
91
+ > For related (non-target) modules, run `pactkit interface-summary <file>` instead of reading full source.
92
+
93
+ ### R5: 不修改 Read 工具行为 (MUST NOT)
94
+
95
+ 本 story 不修改 Claude Code harness 的 Read 工具、不添加 hook、不拦截文件访问。通过提供更好的替代工具来引导行为,而非限制现有工具。
96
+
97
+ ## Acceptance Criteria
98
+
99
+ ### AC1: CLI 输出接口摘要 (R1)
100
+
101
+ - **Given** 一个 Python 文件 `src/pactkit/generators/deployer.py`(含多个 class 和函数)
102
+ - **When** 运行 `pactkit interface-summary src/pactkit/generators/deployer.py`
103
+ - **Then** 输出包含所有 class(带 bases 和 methods 签名)和顶层函数(带参数和返回类型),不包含函数体
104
+
105
+ ### AC2: 输出行数显著小于原文件 (R1)
106
+
107
+ - **Given** `deployer.py` 约 600+ 行
108
+ - **When** 运行 `pactkit interface-summary` 对其生成摘要
109
+ - **Then** 输出行数 ≤ 原文件行数的 25%(即 ≤ 150 行)
110
+
111
+ ### AC3: 多文件支持 (R1)
112
+
113
+ - **Given** 两个 Python 文件 A.py 和 B.py
114
+ - **When** 运行 `pactkit interface-summary A.py B.py`
115
+ - **Then** 输出两个文件的摘要,以 `# filename — Interface Summary` 分隔
116
+
117
+ ### AC4: Act Phase 1 步骤可验证 (R3)
118
+
119
+ - **Given** 修改后的 project-act SKILL.md
120
+ - **When** 读取 Phase 1 内容
121
+ - **Then** 存在显式编号步骤 "2b" 包含 `pactkit interface-summary` 命令
122
+
123
+ ### AC5: 非 Python 文件 graceful fallback (R2)
124
+
125
+ - **Given** 一个 .go 文件但 tree-sitter-go 未安装
126
+ - **When** 运行 `pactkit interface-summary file.go`
127
+ - **Then** 输出警告 "Unsupported or unavailable analyzer for .go" 并退出 0(不阻塞)
128
+
129
+ ## Target Call Chain
130
+
131
+ ```
132
+ pactkit interface-summary <files>
133
+ → cli.py: main() → parse args → _interface_summary_command(args)
134
+ → interface_summary.py: generate_summary(file_paths)
135
+ → detect language from extension
136
+ → LANG_PROFILES dispatch → python_analyzer / ts_analyzer / go_analyzer
137
+ → For Python:
138
+ → ast.parse(source)
139
+ → Extract: class defs (name, bases, docstring, method signatures)
140
+ → Extract: top-level functions (name, params, return type, docstring)
141
+ → Extract: top-level constants (UPPER_CASE assignments)
142
+ → Format output as structured text
143
+ → Print to stdout
144
+ ```
145
+
146
+ ## Implementation Steps
147
+
148
+ | Step | File | Action | Dependencies | Risk |
149
+ |------|------|--------|-------------|------|
150
+ | 1 | `src/pactkit/skills/interface_summary.py` | 新建:接口摘要提取逻辑,复用 python_analyzer AST 能力 | None | Medium |
151
+ | 2 | `src/pactkit/cli.py` | 注册 `interface-summary` 子命令 | Step 1 | Low |
152
+ | 3 | `~/.claude/skills/project-act/SKILL.md` (source: `src/pactkit/prompts/commands.py`) | Phase 1.2 → 1.2a + 1.2b 显式步骤 | Step 1-2 | Low |
153
+ | 4 | `~/.claude/skills/pactkit-trace/SKILL.md` (source: `src/pactkit/prompts/skills.py`) | Phase 3 Layered Output 改为 CLI 调用指引 | Step 1-2 | Low |
154
+ | 5 | `tests/unit/test_interface_summary.py` | 新建:单元测试覆盖 Python 文件摘要输出 | Step 1 | Low |
155
+
156
+ ## Security Scope
157
+
158
+ | Check | Applicable | Reason |
159
+ |-------|------------|--------|
160
+ | SEC-1 | No | 无秘钥变更 |
161
+ | SEC-2 | No | 输入为本地文件路径,已有 file_path.stat() 大小检查 |
162
+ | SEC-3 | No | 无数据库 |
163
+ | SEC-4 | No | 无 UI |
164
+ | SEC-5 | No | 无认证 |
165
+ | SEC-6 | No | 无接口暴露 |
166
+ | SEC-7 | No | CLI 输出,无敏感信息 |
167
+ | SEC-8 | No | 无新依赖(复用现有 ast + tree_sitter) |
168
+
169
+ ## Out of Scope
170
+
171
+ - 修改 Claude Code Read 工具行为
172
+ - Hook 机制
173
+ - 自动拦截 AI 的 Read 调用
174
+ - Java analyzer 支持(已有但不在本 story 优先级内)
175
+ - `pactkit trace` CLI 命令(本 story 只做 interface-summary,trace 仍是 skill)