pactkit 2.10.2__tar.gz → 2.10.3__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 (548) hide show
  1. {pactkit-2.10.2 → pactkit-2.10.3}/.opencode/pactkit.yaml +1 -1
  2. {pactkit-2.10.2 → pactkit-2.10.3}/CHANGELOG.md +5 -0
  3. {pactkit-2.10.2 → pactkit-2.10.3}/PKG-INFO +1 -1
  4. {pactkit-2.10.2 → pactkit-2.10.3}/docs/architecture/governance/archive/lessons_archive_202603.md +1 -0
  5. {pactkit-2.10.2 → pactkit-2.10.3}/docs/architecture/governance/lessons.md +1 -1
  6. {pactkit-2.10.2 → pactkit-2.10.3}/docs/architecture/governance/rules.md +1 -1
  7. {pactkit-2.10.2 → pactkit-2.10.3}/docs/product/context.md +2 -2
  8. {pactkit-2.10.2 → pactkit-2.10.3}/pyproject.toml +1 -1
  9. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/__init__.py +1 -1
  10. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/cleaners.py +25 -2
  11. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim014_clean.py +44 -0
  12. {pactkit-2.10.2 → pactkit-2.10.3}/.github/workflows/pactkit.yml +0 -0
  13. {pactkit-2.10.2 → pactkit-2.10.3}/.github/workflows/publish.yml +0 -0
  14. {pactkit-2.10.2 → pactkit-2.10.3}/.gitignore +0 -0
  15. {pactkit-2.10.2 → pactkit-2.10.3}/AGENTS.md +0 -0
  16. {pactkit-2.10.2 → pactkit-2.10.3}/CODE_OF_CONDUCT.md +0 -0
  17. {pactkit-2.10.2 → pactkit-2.10.3}/CONTRIBUTING.md +0 -0
  18. {pactkit-2.10.2 → pactkit-2.10.3}/LICENSE +0 -0
  19. {pactkit-2.10.2 → pactkit-2.10.3}/README.md +0 -0
  20. {pactkit-2.10.2 → pactkit-2.10.3}/SECURITY.md +0 -0
  21. {pactkit-2.10.2 → pactkit-2.10.3}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
  22. {pactkit-2.10.2 → pactkit-2.10.3}/docs/architecture/governance/harness_audit.json +0 -0
  23. {pactkit-2.10.2 → pactkit-2.10.3}/docs/architecture/governance/philosophy.md +0 -0
  24. {pactkit-2.10.2 → pactkit-2.10.3}/docs/assets/logo.png +0 -0
  25. {pactkit-2.10.2 → pactkit-2.10.3}/docs/guides/codex-integration-preresearch.md +0 -0
  26. {pactkit-2.10.2 → pactkit-2.10.3}/docs/guides/tool-integration-checklist.md +0 -0
  27. {pactkit-2.10.2 → pactkit-2.10.3}/docs/product/archive/archive_202602.md +0 -0
  28. {pactkit-2.10.2 → pactkit-2.10.3}/docs/product/archive/archive_202603.md +0 -0
  29. {pactkit-2.10.2 → pactkit-2.10.3}/docs/product/archive/archive_202604.md +0 -0
  30. {pactkit-2.10.2 → pactkit-2.10.3}/docs/product/friction-log.md +0 -0
  31. {pactkit-2.10.2 → pactkit-2.10.3}/docs/product/prd.md +0 -0
  32. {pactkit-2.10.2 → pactkit-2.10.3}/docs/product/sprint_board.md +0 -0
  33. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-001.md +0 -0
  34. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-002.md +0 -0
  35. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-003.md +0 -0
  36. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-004.md +0 -0
  37. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-005.md +0 -0
  38. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-006.md +0 -0
  39. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-007.md +0 -0
  40. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-008.md +0 -0
  41. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-009.md +0 -0
  42. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-010.md +0 -0
  43. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-011.md +0 -0
  44. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-012.md +0 -0
  45. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-013.md +0 -0
  46. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-014.md +0 -0
  47. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-015.md +0 -0
  48. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-016.md +0 -0
  49. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-017.md +0 -0
  50. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-018.md +0 -0
  51. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-019.md +0 -0
  52. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-020.md +0 -0
  53. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-021.md +0 -0
  54. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-022.md +0 -0
  55. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-023.md +0 -0
  56. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-024.md +0 -0
  57. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-025.md +0 -0
  58. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-026.md +0 -0
  59. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-027.md +0 -0
  60. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-028.md +0 -0
  61. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-029.md +0 -0
  62. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-030.md +0 -0
  63. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-031.md +0 -0
  64. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-032.md +0 -0
  65. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-033.md +0 -0
  66. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-034.md +0 -0
  67. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-035.md +0 -0
  68. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-slim-001.md +0 -0
  69. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-slim-002.md +0 -0
  70. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-slim-003.md +0 -0
  71. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-slim-004.md +0 -0
  72. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-slim-005.md +0 -0
  73. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-slim-006.md +0 -0
  74. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/BUG-slim-089.md +0 -0
  75. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/HOTFIX-slim-023.md +0 -0
  76. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/HOTFIX-slim-049.md +0 -0
  77. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/HOTFIX-slim-050.md +0 -0
  78. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/HOTFIX-slim-051.md +0 -0
  79. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/HOTFIX-slim-052.md +0 -0
  80. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/HOTFIX-slim-061.md +0 -0
  81. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/HOTFIX-slim-062.md +0 -0
  82. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/HOTFIX-slim-067.md +0 -0
  83. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/HOTFIX-slim-069.md +0 -0
  84. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/HOTFIX-slim-070.md +0 -0
  85. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/HOTFIX-slim-085.md +0 -0
  86. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/HOTFIX-slim-087.md +0 -0
  87. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/HOTFIX-slim-096.md +0 -0
  88. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/HOTFIX-slim-099.md +0 -0
  89. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-001.md +0 -0
  90. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-002.md +0 -0
  91. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-003.md +0 -0
  92. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-004.md +0 -0
  93. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-005.md +0 -0
  94. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-006.md +0 -0
  95. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-007.md +0 -0
  96. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-008.md +0 -0
  97. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-009.md +0 -0
  98. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-010.md +0 -0
  99. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-011.md +0 -0
  100. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-012.md +0 -0
  101. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-013.md +0 -0
  102. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-014.md +0 -0
  103. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-015.md +0 -0
  104. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-016.md +0 -0
  105. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-017.md +0 -0
  106. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-018.md +0 -0
  107. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-019.md +0 -0
  108. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-020.md +0 -0
  109. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-021.md +0 -0
  110. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-022.md +0 -0
  111. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-023.md +0 -0
  112. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-024.md +0 -0
  113. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-025.md +0 -0
  114. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-026.md +0 -0
  115. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-027.md +0 -0
  116. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-028.md +0 -0
  117. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-029.md +0 -0
  118. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-030.md +0 -0
  119. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-031.md +0 -0
  120. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-032.md +0 -0
  121. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-033.md +0 -0
  122. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-034.md +0 -0
  123. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-035.md +0 -0
  124. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-036.md +0 -0
  125. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-037.md +0 -0
  126. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-038.md +0 -0
  127. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-039.md +0 -0
  128. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-040.md +0 -0
  129. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-041.md +0 -0
  130. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-042.md +0 -0
  131. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-043.md +0 -0
  132. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-044.md +0 -0
  133. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-045.md +0 -0
  134. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-046.md +0 -0
  135. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-047.md +0 -0
  136. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-048.md +0 -0
  137. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-049.md +0 -0
  138. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-050.md +0 -0
  139. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-051.md +0 -0
  140. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-052.md +0 -0
  141. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-053.md +0 -0
  142. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-054.md +0 -0
  143. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-055.md +0 -0
  144. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-056.md +0 -0
  145. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-057.md +0 -0
  146. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-058.md +0 -0
  147. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-059.md +0 -0
  148. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-060.md +0 -0
  149. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-061.md +0 -0
  150. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-062.md +0 -0
  151. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-063.md +0 -0
  152. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-064.md +0 -0
  153. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-065.md +0 -0
  154. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-069.md +0 -0
  155. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-070.md +0 -0
  156. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-071.md +0 -0
  157. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-072.md +0 -0
  158. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-073.md +0 -0
  159. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-001.md +0 -0
  160. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-005.md +0 -0
  161. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-006.md +0 -0
  162. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-007.md +0 -0
  163. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-009.md +0 -0
  164. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-010.md +0 -0
  165. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-011.md +0 -0
  166. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-012.md +0 -0
  167. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-013.md +0 -0
  168. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-014.md +0 -0
  169. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-015.md +0 -0
  170. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-016.md +0 -0
  171. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-017.md +0 -0
  172. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-018.md +0 -0
  173. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-019.md +0 -0
  174. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-020.md +0 -0
  175. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-021.md +0 -0
  176. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-022.md +0 -0
  177. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-023.md +0 -0
  178. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-024.md +0 -0
  179. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-028.md +0 -0
  180. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-029.md +0 -0
  181. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-030.md +0 -0
  182. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-031.md +0 -0
  183. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-032.md +0 -0
  184. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-033.md +0 -0
  185. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-034.md +0 -0
  186. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-035.md +0 -0
  187. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-036.md +0 -0
  188. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-037.md +0 -0
  189. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-038.md +0 -0
  190. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-039.md +0 -0
  191. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-040.md +0 -0
  192. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-041.md +0 -0
  193. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-042.md +0 -0
  194. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-043.md +0 -0
  195. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-044.md +0 -0
  196. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-045.md +0 -0
  197. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-046.md +0 -0
  198. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-047.md +0 -0
  199. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-048.md +0 -0
  200. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-049.md +0 -0
  201. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-050.md +0 -0
  202. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-051.md +0 -0
  203. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-052.md +0 -0
  204. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-053.md +0 -0
  205. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-054.md +0 -0
  206. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-055.md +0 -0
  207. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-056.md +0 -0
  208. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-057.md +0 -0
  209. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-058.md +0 -0
  210. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-059.md +0 -0
  211. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-060.md +0 -0
  212. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-063.md +0 -0
  213. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-066.md +0 -0
  214. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-067.md +0 -0
  215. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-068.md +0 -0
  216. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-069.md +0 -0
  217. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-070.md +0 -0
  218. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-071.md +0 -0
  219. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-072.md +0 -0
  220. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-073.md +0 -0
  221. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-074.md +0 -0
  222. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-075.md +0 -0
  223. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-076.md +0 -0
  224. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-077.md +0 -0
  225. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-078.md +0 -0
  226. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-079.md +0 -0
  227. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-080.md +0 -0
  228. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-081.md +0 -0
  229. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-082.md +0 -0
  230. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-083.md +0 -0
  231. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-084.md +0 -0
  232. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-086.md +0 -0
  233. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-088.md +0 -0
  234. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-089.md +0 -0
  235. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-090.md +0 -0
  236. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-091.md +0 -0
  237. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-092.md +0 -0
  238. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-093.md +0 -0
  239. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-094.md +0 -0
  240. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-095.md +0 -0
  241. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-097.md +0 -0
  242. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-098.md +0 -0
  243. {pactkit-2.10.2 → pactkit-2.10.3}/docs/specs/STORY-slim-099.md +0 -0
  244. {pactkit-2.10.2 → pactkit-2.10.3}/docs/test_cases/BUG-001_case.md +0 -0
  245. {pactkit-2.10.2 → pactkit-2.10.3}/docs/test_cases/BUG-002_case.md +0 -0
  246. {pactkit-2.10.2 → pactkit-2.10.3}/docs/test_cases/STORY-slim-028_case.md +0 -0
  247. {pactkit-2.10.2 → pactkit-2.10.3}/docs/test_cases/STORY-slim-029_case.md +0 -0
  248. {pactkit-2.10.2 → pactkit-2.10.3}/docs/test_cases/STORY-slim-031_case.md +0 -0
  249. {pactkit-2.10.2 → pactkit-2.10.3}/docs/test_cases/STORY-slim-032_case.md +0 -0
  250. {pactkit-2.10.2 → pactkit-2.10.3}/docs/test_cases/STORY-slim-033_case.md +0 -0
  251. {pactkit-2.10.2 → pactkit-2.10.3}/docs/test_cases/STORY-slim-034_case.md +0 -0
  252. {pactkit-2.10.2 → pactkit-2.10.3}/opencode.json +0 -0
  253. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/__main__.py +0 -0
  254. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/audit.py +0 -0
  255. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/backfill.py +0 -0
  256. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/cli.py +0 -0
  257. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/config.py +0 -0
  258. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/context_gen.py +0 -0
  259. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/coverage_gate.py +0 -0
  260. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/doctor.py +0 -0
  261. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/garden.py +0 -0
  262. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/generators/__init__.py +0 -0
  263. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/generators/adapter.py +0 -0
  264. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/generators/deploy_base.py +0 -0
  265. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/generators/deployer.py +0 -0
  266. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/guards.py +0 -0
  267. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/id_generator.py +0 -0
  268. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/invariants.py +0 -0
  269. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/issue_sync.py +0 -0
  270. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/lazy_visualize.py +0 -0
  271. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/lessons.py +0 -0
  272. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/lint_runner.py +0 -0
  273. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/observe.py +0 -0
  274. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/profiles.py +0 -0
  275. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/prompts/__init__.py +0 -0
  276. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/prompts/agents.py +0 -0
  277. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/prompts/commands.py +0 -0
  278. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/prompts/references.py +0 -0
  279. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/prompts/rules.py +0 -0
  280. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/prompts/skills.py +0 -0
  281. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/prompts/workflows.py +0 -0
  282. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/regression.py +0 -0
  283. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/schemas.py +0 -0
  284. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/scripts.py +0 -0
  285. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/sec_scope.py +0 -0
  286. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/skills/__init__.py +0 -0
  287. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/skills/analyzers/__init__.py +0 -0
  288. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
  289. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
  290. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
  291. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
  292. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/skills/board.py +0 -0
  293. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/skills/report.py +0 -0
  294. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/skills/scaffold.py +0 -0
  295. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/skills/spec_linter.py +0 -0
  296. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/skills/visualize.py +0 -0
  297. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/spec_status.py +0 -0
  298. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/test_mapper.py +0 -0
  299. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/utils.py +0 -0
  300. {pactkit-2.10.2 → pactkit-2.10.3}/src/pactkit/validators.py +0 -0
  301. {pactkit-2.10.2 → pactkit-2.10.3}/tests/conftest.py +0 -0
  302. {pactkit-2.10.2 → pactkit-2.10.3}/tests/e2e/__init__.py +0 -0
  303. {pactkit-2.10.2 → pactkit-2.10.3}/tests/e2e/cli/__init__.py +0 -0
  304. {pactkit-2.10.2 → pactkit-2.10.3}/tests/e2e/cli/test_cli_e2e.py +0 -0
  305. {pactkit-2.10.2 → pactkit-2.10.3}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
  306. {pactkit-2.10.2 → pactkit-2.10.3}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
  307. {pactkit-2.10.2 → pactkit-2.10.3}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
  308. {pactkit-2.10.2 → pactkit-2.10.3}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
  309. {pactkit-2.10.2 → pactkit-2.10.3}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
  310. {pactkit-2.10.2 → pactkit-2.10.3}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
  311. {pactkit-2.10.2 → pactkit-2.10.3}/tests/fixtures/api_call_parser/page.tsx +0 -0
  312. {pactkit-2.10.2 → pactkit-2.10.3}/tests/integration/__init__.py +0 -0
  313. {pactkit-2.10.2 → pactkit-2.10.3}/tests/integration/test_deploy_classic.py +0 -0
  314. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_agent_features.py +0 -0
  315. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_agent_frontmatter.py +0 -0
  316. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_agents_enrichment.py +0 -0
  317. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_audit.py +0 -0
  318. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_blast_radius.py +0 -0
  319. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_board_bug027.py +0 -0
  320. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_board_sections.py +0 -0
  321. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug001_skill_path.py +0 -0
  322. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug002_plugin_paths.py +0 -0
  323. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug003_multi_import.py +0 -0
  324. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug004_dead_set.py +0 -0
  325. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug005_archive_taskless.py +0 -0
  326. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug006_scan_excludes.py +0 -0
  327. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
  328. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug008_stale_command_refs.py +0 -0
  329. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug009_project_config_backfill.py +0 -0
  330. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
  331. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug011_stale_refs.py +0 -0
  332. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug012_call_graph_filter.py +0 -0
  333. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug013_config_single_source.py +0 -0
  334. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug014_version_hygiene.py +0 -0
  335. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug017_project_init_playbook.py +0 -0
  336. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
  337. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug019_venv_deployment.py +0 -0
  338. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug020_claude_md_backup.py +0 -0
  339. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug025_release_delegation.py +0 -0
  340. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug026_version_sync.py +0 -0
  341. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug028_ghost_refs.py +0 -0
  342. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
  343. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
  344. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
  345. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
  346. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug_021.py +0 -0
  347. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug_022.py +0 -0
  348. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug_023.py +0 -0
  349. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug_024.py +0 -0
  350. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug_slim001_env_detection.py +0 -0
  351. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
  352. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug_slim003.py +0 -0
  353. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug_slim004.py +0 -0
  354. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug_slim005.py +0 -0
  355. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug_slim006.py +0 -0
  356. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
  357. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_check_command.py +0 -0
  358. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_check_extensions_072_073.py +0 -0
  359. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_check_playbook_072_073.py +0 -0
  360. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_command_frontmatter.py +0 -0
  361. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_command_visualize_modes.py +0 -0
  362. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_complexity.py +0 -0
  363. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_config.py +0 -0
  364. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_config_auto_merge.py +0 -0
  365. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_constitution_sharpening.py +0 -0
  366. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_context_gen.py +0 -0
  367. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_create_skill.py +0 -0
  368. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_cross_flow_matrix.py +0 -0
  369. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_deploy_base.py +0 -0
  370. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_deployer_cleanup.py +0 -0
  371. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_deployer_plugin.py +0 -0
  372. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_design_command.py +0 -0
  373. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_done_gates.py +0 -0
  374. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_draw_prompt.py +0 -0
  375. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_draw_references.py +0 -0
  376. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_drawio_mcp.py +0 -0
  377. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_garden.py +0 -0
  378. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_home_path_fix.py +0 -0
  379. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_hotfix_command.py +0 -0
  380. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_init_guard.py +0 -0
  381. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_init_playbook_074.py +0 -0
  382. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_lang_profiles.py +0 -0
  383. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_layer_violations.py +0 -0
  384. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_lessons_rotation_075.py +0 -0
  385. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_list_stories.py +0 -0
  386. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_mcp_integration.py +0 -0
  387. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_model_config.py +0 -0
  388. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_modular_constitution.py +0 -0
  389. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_monorepo_detect.py +0 -0
  390. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_multi_prefix.py +0 -0
  391. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_observe.py +0 -0
  392. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_pdca_slim.py +0 -0
  393. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_profiles.py +0 -0
  394. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_project_visibility.py +0 -0
  395. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_prompt_cli_refs.py +0 -0
  396. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_prompt_quality_075.py +0 -0
  397. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_prompt_structural_invariants.py +0 -0
  398. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_prompts_package.py +0 -0
  399. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_release.py +0 -0
  400. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_release_field.py +0 -0
  401. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_release_v110.py +0 -0
  402. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_render_prompt.py +0 -0
  403. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_report_parser.py +0 -0
  404. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_report_unified.py +0 -0
  405. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_review_command.py +0 -0
  406. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_rules_enrichment.py +0 -0
  407. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_scaffold.py +0 -0
  408. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_scaffold_developer_prefix.py +0 -0
  409. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_schemas.py +0 -0
  410. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_script_extraction.py +0 -0
  411. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_selective_deploy.py +0 -0
  412. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_session_context.py +0 -0
  413. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_skill_structure.py +0 -0
  414. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_skills_enrichment.py +0 -0
  415. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_slim_deps_088.py +0 -0
  416. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_smart_regression.py +0 -0
  417. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_sprint_command.py +0 -0
  418. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_stack_references.py +0 -0
  419. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_status_command.py +0 -0
  420. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_statusline.py +0 -0
  421. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story014_release.py +0 -0
  422. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story015_ci_lint_gate.py +0 -0
  423. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story016_claude_md.py +0 -0
  424. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story017_init_claude_md.py +0 -0
  425. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story018_arch_staleness.py +0 -0
  426. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story019_bailout.py +0 -0
  427. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story020_horizon.py +0 -0
  428. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story021_rfc.py +0 -0
  429. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story022_decision_tree.py +0 -0
  430. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story023_test_quality.py +0 -0
  431. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story024_native_agent.py +0 -0
  432. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story025_ci_pipeline.py +0 -0
  433. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story026_issue_tracker.py +0 -0
  434. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story027_hooks.py +0 -0
  435. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story028_rule_scoping.py +0 -0
  436. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story029_doctor.py +0 -0
  437. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story030_lint.py +0 -0
  438. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story031_git_init_guard.py +0 -0
  439. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story032_greenfield_redirect.py +0 -0
  440. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story033_config_backfill.py +0 -0
  441. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story034_plan_config_refresh.py +0 -0
  442. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story035_readme_docs.py +0 -0
  443. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story037_regression_fix.py +0 -0
  444. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story038_call_graph_update.py +0 -0
  445. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story039_venv_config.py +0 -0
  446. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story040_layered_claude_md.py +0 -0
  447. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story042_spec_linter.py +0 -0
  448. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story043_active_clarify.py +0 -0
  449. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story044_consistency_check.py +0 -0
  450. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story045_auto_pr.py +0 -0
  451. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story046_agent_adapter.py +0 -0
  452. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story047_enterprise_flags.py +0 -0
  453. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story048_worktree_isolation.py +0 -0
  454. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story049_community_standards.py +0 -0
  455. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
  456. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story051_workflow_streamlining.py +0 -0
  457. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story052_conditional_github_release.py +0 -0
  458. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story053_impact_regression.py +0 -0
  459. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story055_commands.py +0 -0
  460. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story055_config.py +0 -0
  461. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story055_spec_linter.py +0 -0
  462. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story056_commands.py +0 -0
  463. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story056_config.py +0 -0
  464. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story057_implicit_cleanup.py +0 -0
  465. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story058_opencode_extraction.py +0 -0
  466. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story058_routing_fix.py +0 -0
  467. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story059_codex_removal.py +0 -0
  468. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story060_init_hang.py +0 -0
  469. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story061_remove_thinking.py +0 -0
  470. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story062_mcp_recommendations.py +0 -0
  471. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story063_prompt_slimming.py +0 -0
  472. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story064_venv_local_md.py +0 -0
  473. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story065_sprint_model.py +0 -0
  474. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story072_developer_prefix.py +0 -0
  475. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
  476. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
  477. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim011_command_rules.py +0 -0
  478. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim012_ci.py +0 -0
  479. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim014_context.py +0 -0
  480. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim014_guard.py +0 -0
  481. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
  482. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim014_next_id.py +0 -0
  483. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim014_regression.py +0 -0
  484. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim014_sec_scope.py +0 -0
  485. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim014_validators.py +0 -0
  486. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim015_doctor.py +0 -0
  487. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
  488. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim017.py +0 -0
  489. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim018.py +0 -0
  490. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
  491. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
  492. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim021.py +0 -0
  493. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim022.py +0 -0
  494. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim023.py +0 -0
  495. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim024.py +0 -0
  496. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim025.py +0 -0
  497. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim026.py +0 -0
  498. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim027.py +0 -0
  499. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim028.py +0 -0
  500. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim029.py +0 -0
  501. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim030.py +0 -0
  502. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim031.py +0 -0
  503. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim032.py +0 -0
  504. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim033.py +0 -0
  505. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim034.py +0 -0
  506. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim035.py +0 -0
  507. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim036.py +0 -0
  508. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim037.py +0 -0
  509. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim038.py +0 -0
  510. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim039.py +0 -0
  511. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim040.py +0 -0
  512. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim041.py +0 -0
  513. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim042.py +0 -0
  514. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim043.py +0 -0
  515. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim044.py +0 -0
  516. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim045.py +0 -0
  517. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim046.py +0 -0
  518. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim047.py +0 -0
  519. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim048.py +0 -0
  520. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim049.py +0 -0
  521. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim051.py +0 -0
  522. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim052.py +0 -0
  523. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim053.py +0 -0
  524. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim054.py +0 -0
  525. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim055.py +0 -0
  526. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim056.py +0 -0
  527. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim060_codex_profile.py +0 -0
  528. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim063.py +0 -0
  529. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim065.py +0 -0
  530. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim076_multistack.py +0 -0
  531. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
  532. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim078.py +0 -0
  533. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim079.py +0 -0
  534. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim080.py +0 -0
  535. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim081.py +0 -0
  536. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim082.py +0 -0
  537. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim083.py +0 -0
  538. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim084.py +0 -0
  539. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim095.py +0 -0
  540. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
  541. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
  542. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_tools.py +0 -0
  543. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_topology_parsers_066.py +0 -0
  544. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_update_task.py +0 -0
  545. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_visualize_call_nested.py +0 -0
  546. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_visualize_chain_fix.py +0 -0
  547. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_visualize_modes.py +0 -0
  548. {pactkit-2.10.2 → pactkit-2.10.3}/tests/unit/test_visualize_multilang_chain.py +0 -0
@@ -2,7 +2,7 @@
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.2"
5
+ version: "2.10.3"
6
6
  stack: python
7
7
  root: .
8
8
  developer: "slim"
@@ -4,6 +4,11 @@ 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.10.3] - 2026-04-20
8
+
9
+ ### Fixed
10
+ - **Protected parent dirs in `pactkit clean`** — `rglob("dist")` was matching `node_modules/*/dist`, destroying npm dependency internals. Added `_inside_protected()` guard for `node_modules/` and `.git/`; explicit path patterns (e.g., `node_modules/.cache`) now use direct matching instead of rglob.
11
+
7
12
  ## [2.10.2] - 2026-04-20
8
13
 
9
14
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pactkit
3
- Version: 2.10.2
3
+ Version: 2.10.3
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
@@ -46,3 +46,4 @@
46
46
  | 2026-03-24 | Plan Phase 3.2a scaffold-first: replaced AI freeform Write with {SCAFFOLD_CMD} create_spec + Read + Edit in src/pactkit/prompts/commands.py. Removed 3 inline format examples (~240 chars). Pre-existing tests (test_bug034, test_story055_commands, test_story_slim019) needed updates for new checkpoint wording. | src/pactkit/prompts/commands.py:Phase3.2a |
47
47
  | 2026-03-24 | spec_linter.py _check_acceptance_criteria: per-subsection GWT check must use raw_text (with code blocks) not stripped text, because specs legitimately wrap Gherkin in fenced blocks | spec_linter.py:_check_acceptance_criteria |
48
48
  | 2026-03-24 | Standalone scripts (visualize.py) need try/except ImportError guards for yaml.safe_load when reading pactkit.yaml — they cannot import from pactkit library | visualize.py:_load_scan_excludes |
49
+ | 2026-03-24 | Inline data in standalone scripts must have canonical-source comments pointing to the library module (e.g. _STACK_MARKERS → cleaners.py, _LANG_FILE_EXT → workflows.py) per Architecture Principle 1 | visualize.py:_STACK_MARKERS |
@@ -2,7 +2,6 @@
2
2
 
3
3
  | Date | Lesson | Context |
4
4
  |------|--------|---------|
5
- | 2026-03-24 | Inline data in standalone scripts must have canonical-source comments pointing to the library module (e.g. _STACK_MARKERS → cleaners.py, _LANG_FILE_EXT → workflows.py) per Architecture Principle 1 | visualize.py:_STACK_MARKERS |
6
5
  | 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 |
7
6
  | 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 |
8
7
  | 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,3 +52,4 @@
53
52
  | 2026-04-17 | Dual-anchor pattern: declare principle in RULES_MODULES['core'] (01-core-protocol.md), detail in dedicated module (11-pdca-nudge.md). Prevents attention dilution when rules/ has 10+ files — Core Protocol acts as behavioral constitution anchor. | src/pactkit/prompts/rules.py:RULES_MODULES |
54
53
  | 2026-04-18 | Version comparison guards must use semantic (tuple) comparison, not string equality — string != treats 2.10.1 != 2.5.0 without direction, giving wrong upgrade advice | guards.py:check_version_mismatch |
55
54
  | 2026-04-20 | Plugin deployer (_deploy_commands in deployer.py:952-954) uses _rewrite_skills_prefix instead of _render_prompt, keeping raw placeholders like {BOARD_CMD} — not a deploy drift bug but by-design template behavior | src/pactkit/generators/deployer.py:_deploy_commands |
55
+ | 2026-04-20 | pactkit clean rglob patterns must exclude protected parent dirs (node_modules, .git) — recursive pattern matching deletes dependency internals | cleaners.py:_inside_protected |
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## Invariants
17
17
 
18
- 1. All 3752+ tests must pass before any commit to `main`.
18
+ 1. All 3755+ 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`.
@@ -1,5 +1,5 @@
1
1
  # Project Context (Auto-generated)
2
- > Last updated: 2026-04-20T10:21:11+08:00 by pactkit context
2
+ > Last updated: 2026-04-20T15:24:48+08:00 by pactkit context
3
3
 
4
4
  ## Sprint Status
5
5
  Backlog: 0 | In Progress: 0 | Done: 0 stories
@@ -15,11 +15,11 @@ develop
15
15
  * main
16
16
 
17
17
  ## Key Decisions
18
- - Weighted hotspot formula (complexity 25% + docstring 15% + smells 15% + layers 10% + test 20% + blast 15%) gives meaningful scores across different project profiles; _generate_suggested_tasks auto-scaffolds BUG/HOTFIX specs with Done-completed filter for idempotency
19
18
  - Dual-dimension audit (config+code 50/50) gives accurate project health picture; scanning ~/.claude/ global config catches harness setup invisible at project level
20
19
  - Dual-anchor pattern: declare principle in RULES_MODULES['core'] (01-core-protocol.md), detail in dedicated module (11-pdca-nudge.md). Prevents attention dilution when rules/ has 10+ files — Core Protocol acts as behavioral constitution anchor.
21
20
  - Version comparison guards must use semantic (tuple) comparison, not string equality — string != treats 2.10.1 != 2.5.0 without direction, giving wrong upgrade advice
22
21
  - Plugin deployer (_deploy_commands in deployer.py:952-954) uses _rewrite_skills_prefix instead of _render_prompt, keeping raw placeholders like {BOARD_CMD} — not a deploy drift bug but by-design template behavior
22
+ - pactkit clean rglob patterns must exclude protected parent dirs (node_modules, .git) — recursive pattern matching deletes dependency internals
23
23
 
24
24
  ## Next Recommended Action
25
25
  `/project-design`
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pactkit"
7
- version = "2.10.2"
7
+ version = "2.10.3"
8
8
  description = "Spec-driven agentic DevOps toolkit for AI coding assistants"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -1,3 +1,3 @@
1
1
  """PactKit - Spec-driven agentic DevOps toolkit."""
2
2
 
3
- __version__ = "2.10.2"
3
+ __version__ = "2.10.3"
@@ -15,6 +15,9 @@ _CLEANUP_PATTERNS: dict[str, list[str]] = {
15
15
  "java": ["target/", "build/", ".gradle/"],
16
16
  }
17
17
 
18
+ # Directories whose contents must never be cleaned by rglob patterns
19
+ _PROTECTED_PARENTS = {"node_modules", ".git"}
20
+
18
21
  # Stack detection markers (ordered by priority)
19
22
  _STACK_MARKERS: list[tuple[str, str]] = [
20
23
  ("pyproject.toml", "python"),
@@ -27,6 +30,12 @@ _STACK_MARKERS: list[tuple[str, str]] = [
27
30
  ]
28
31
 
29
32
 
33
+ def _inside_protected(path: Path, project_root: Path) -> bool:
34
+ """Return True if path is inside a protected parent directory."""
35
+ rel = path.relative_to(project_root)
36
+ return bool(_PROTECTED_PARENTS & set(rel.parts[:-1]))
37
+
38
+
30
39
  def detect_stacks(project_root: Path) -> list[str]:
31
40
  """Detect all project stacks from marker files.
32
41
 
@@ -84,9 +93,21 @@ def clean_artifacts(
84
93
  removed: list[Path] = []
85
94
 
86
95
  for pattern in patterns:
87
- if "*" in pattern:
96
+ if "/" in pattern:
97
+ # Explicit path (e.g., "node_modules/.cache") — match directly
98
+ target = project_root / pattern
99
+ if target.exists():
100
+ removed.append(target)
101
+ if not dry_run:
102
+ if target.is_dir():
103
+ shutil.rmtree(target)
104
+ else:
105
+ target.unlink()
106
+ elif "*" in pattern:
88
107
  # Glob pattern (e.g., "*.pyc")
89
108
  for match in project_root.rglob(pattern):
109
+ if _inside_protected(match, project_root):
110
+ continue
90
111
  removed.append(match)
91
112
  if not dry_run:
92
113
  if match.is_dir():
@@ -94,9 +115,11 @@ def clean_artifacts(
94
115
  else:
95
116
  match.unlink()
96
117
  else:
97
- # Directory or file name (e.g., "__pycache__", ".pytest_cache")
118
+ # Directory or file name (e.g., "__pycache__", "dist")
98
119
  clean_name = pattern.rstrip("/")
99
120
  for match in project_root.rglob(clean_name):
121
+ if _inside_protected(match, project_root):
122
+ continue
100
123
  removed.append(match)
101
124
  if not dry_run:
102
125
  if match.is_dir():
@@ -87,3 +87,47 @@ class TestCleanArtifacts:
87
87
 
88
88
  removed = clean_artifacts(tmp_path, stack="auto")
89
89
  assert len(removed) >= 1
90
+
91
+ def test_clean_node_skips_dist_inside_node_modules(self, tmp_path):
92
+ """dist inside node_modules must NOT be deleted."""
93
+ (tmp_path / "package.json").write_text("{}")
94
+ # Create a dependency with dist/
95
+ dep_dist = tmp_path / "node_modules" / "some-pkg" / "dist"
96
+ dep_dist.mkdir(parents=True)
97
+ (dep_dist / "index.js").write_text("module.exports = {}")
98
+ # Create a project-level dist/ that SHOULD be cleaned
99
+ proj_dist = tmp_path / "dist"
100
+ proj_dist.mkdir()
101
+ (proj_dist / "bundle.js").write_text("")
102
+
103
+ removed = clean_artifacts(tmp_path, stack="node")
104
+ assert proj_dist not in list(tmp_path.iterdir())
105
+ assert dep_dist.exists(), "node_modules/*/dist must survive clean"
106
+
107
+ def test_clean_node_modules_cache_still_cleaned(self, tmp_path):
108
+ """node_modules/.cache is explicitly targeted and should be cleaned."""
109
+ (tmp_path / "package.json").write_text("{}")
110
+ nm_cache = tmp_path / "node_modules" / ".cache"
111
+ nm_cache.mkdir(parents=True)
112
+ (nm_cache / "babel").mkdir()
113
+ (nm_cache / "babel" / "data.json").write_text("{}")
114
+
115
+ removed = clean_artifacts(tmp_path, stack="node")
116
+ assert any("node_modules/.cache" in str(p) for p in removed)
117
+ assert not nm_cache.exists()
118
+
119
+ def test_clean_skips_pyc_inside_node_modules(self, tmp_path):
120
+ """Glob patterns (*.pyc) must not match inside node_modules."""
121
+ (tmp_path / "pyproject.toml").write_text("[project]")
122
+ # A .pyc in node_modules (unlikely but possible in hybrid projects)
123
+ nm_pyc = tmp_path / "node_modules" / "weird" / "file.pyc"
124
+ nm_pyc.parent.mkdir(parents=True)
125
+ nm_pyc.write_text("")
126
+ # A normal .pyc that should be cleaned
127
+ normal_pyc = tmp_path / "src" / "mod.pyc"
128
+ normal_pyc.parent.mkdir(parents=True)
129
+ normal_pyc.write_text("")
130
+
131
+ removed = clean_artifacts(tmp_path, stack="python")
132
+ assert not normal_pyc.exists(), "src/*.pyc should be cleaned"
133
+ assert nm_pyc.exists(), "node_modules/**/*.pyc must survive clean"
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes