dctracker 1.4.0__tar.gz → 1.6.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 (474) hide show
  1. {dctracker-1.4.0 → dctracker-1.6.0}/MANIFEST.in +4 -0
  2. dctracker-1.6.0/PKG-INFO +515 -0
  3. dctracker-1.6.0/README.md +467 -0
  4. {dctracker-1.4.0 → dctracker-1.6.0}/dct/__init__.py +1 -1
  5. dctracker-1.6.0/dct/assets/__init__.py +43 -0
  6. dctracker-1.6.0/dct/assets/claude-md-snippet.md +19 -0
  7. dctracker-1.6.0/dct/assets/codex-agents.md +10 -0
  8. dctracker-1.6.0/dct/assets/codex-clog.md +101 -0
  9. dctracker-1.6.0/dct/assets/codex-clog.yaml +6 -0
  10. dctracker-1.6.0/dct/assets/codex-commit.md +342 -0
  11. dctracker-1.6.0/dct/assets/codex-commit.yaml +6 -0
  12. dctracker-1.6.0/dct/assets/codex-dct-import.md +353 -0
  13. dctracker-1.6.0/dct/assets/codex-dct-import.yaml +6 -0
  14. dctracker-1.6.0/dct/assets/codex-dct-init.md +341 -0
  15. dctracker-1.6.0/dct/assets/codex-dct-init.yaml +6 -0
  16. dctracker-1.6.0/dct/assets/codex-handoff.md +245 -0
  17. dctracker-1.6.0/dct/assets/codex-handoff.yaml +6 -0
  18. dctracker-1.6.0/dct/assets/codex-pickup.md +248 -0
  19. dctracker-1.6.0/dct/assets/codex-pickup.yaml +6 -0
  20. dctracker-1.6.0/dct/assets/codex-plan-resolve-uncertain.md +61 -0
  21. dctracker-1.6.0/dct/assets/codex-plan-resolve-uncertain.yaml +6 -0
  22. dctracker-1.6.0/dct/assets/codex-plan-status.md +90 -0
  23. dctracker-1.6.0/dct/assets/codex-plan-status.yaml +6 -0
  24. dctracker-1.6.0/dct/assets/codex-release.md +1082 -0
  25. dctracker-1.6.0/dct/assets/codex-release.yaml +6 -0
  26. dctracker-1.6.0/dct/assets/codex-track-list.md +137 -0
  27. dctracker-1.6.0/dct/assets/codex-track-list.yaml +6 -0
  28. dctracker-1.6.0/dct/assets/codex-track-resolve.md +128 -0
  29. dctracker-1.6.0/dct/assets/codex-track-resolve.yaml +6 -0
  30. dctracker-1.6.0/dct/assets/codex-track-update.md +222 -0
  31. dctracker-1.6.0/dct/assets/codex-track-update.yaml +6 -0
  32. dctracker-1.6.0/dct/assets/codex-track.md +143 -0
  33. dctracker-1.6.0/dct/assets/codex-track.yaml +6 -0
  34. dctracker-1.6.0/dct/assets/codex-triage.md +303 -0
  35. dctracker-1.6.0/dct/assets/codex-triage.yaml +6 -0
  36. dctracker-1.6.0/dct/assets/dct-reference.md +146 -0
  37. dctracker-1.6.0/dct/assets/dct-version-sync.sh +62 -0
  38. dctracker-1.6.0/dct/cli.py +4708 -0
  39. {dctracker-1.4.0 → dctracker-1.6.0}/dct/config.py +58 -9
  40. {dctracker-1.4.0 → dctracker-1.6.0}/dct/core/analytics.py +20 -26
  41. dctracker-1.6.0/dct/core/changelog.py +1452 -0
  42. dctracker-1.6.0/dct/core/changelog_file.py +802 -0
  43. {dctracker-1.4.0 → dctracker-1.6.0}/dct/core/checkpoints.py +114 -47
  44. {dctracker-1.4.0 → dctracker-1.6.0}/dct/core/engine.py +27 -1
  45. dctracker-1.6.0/dct/core/gitinfo.py +825 -0
  46. {dctracker-1.4.0 → dctracker-1.6.0}/dct/core/handoff.py +4 -0
  47. dctracker-1.6.0/dct/core/items.py +743 -0
  48. dctracker-1.6.0/dct/core/limits.py +38 -0
  49. dctracker-1.6.0/dct/core/plans/classification.py +207 -0
  50. dctracker-1.6.0/dct/core/plans/classify.py +152 -0
  51. {dctracker-1.4.0 → dctracker-1.6.0}/dct/core/plans/crud.py +73 -43
  52. {dctracker-1.4.0 → dctracker-1.6.0}/dct/core/plans/ingest.py +93 -67
  53. dctracker-1.6.0/dct/core/procs.py +816 -0
  54. {dctracker-1.4.0 → dctracker-1.6.0}/dct/core/projects.py +180 -45
  55. {dctracker-1.4.0 → dctracker-1.6.0}/dct/core/provenance.py +4 -1
  56. dctracker-1.6.0/dct/core/records.py +48 -0
  57. dctracker-1.6.0/dct/core/releases.py +2805 -0
  58. {dctracker-1.4.0 → dctracker-1.6.0}/dct/core/sprint.py +14 -6
  59. {dctracker-1.4.0 → dctracker-1.6.0}/dct/core/sprints.py +110 -110
  60. dctracker-1.6.0/dct/core/tags.py +566 -0
  61. dctracker-1.6.0/dct/core/text.py +70 -0
  62. dctracker-1.6.0/dct/core/version.py +232 -0
  63. dctracker-1.6.0/dct/core/version_sync.py +58 -0
  64. dctracker-1.6.0/dct/db.py +1928 -0
  65. dctracker-1.6.0/dct/export.py +214 -0
  66. {dctracker-1.4.0 → dctracker-1.6.0}/dct/hooks/check-changelog-on-stop.sh +55 -8
  67. {dctracker-1.4.0 → dctracker-1.6.0}/dct/hooks/check-changelog.sh +45 -53
  68. dctracker-1.6.0/dct/hooks/dct-changelog-count.lib.sh +79 -0
  69. {dctracker-1.4.0 → dctracker-1.6.0}/dct/hooks/dct-plan-autoscan.sh +1 -1
  70. {dctracker-1.4.0 → dctracker-1.6.0}/dct/hooks/dct-task-mirror.sh +1 -1
  71. dctracker-1.6.0/dct/integrations/__init__.py +6 -0
  72. dctracker-1.6.0/dct/integrations/base.py +301 -0
  73. dctracker-1.6.0/dct/integrations/claude.py +590 -0
  74. dctracker-1.6.0/dct/integrations/codex.py +590 -0
  75. dctracker-1.6.0/dct/integrations/codex_hooks.py +312 -0
  76. dctracker-1.6.0/dct/integrations/doctor.py +206 -0
  77. dctracker-1.6.0/dct/integrations/manager.py +100 -0
  78. dctracker-1.6.0/dct/integrations/reference.py +179 -0
  79. dctracker-1.6.0/dct/mcp/server.py +4212 -0
  80. {dctracker-1.4.0 → dctracker-1.6.0}/dct/migrate.py +5 -3
  81. {dctracker-1.4.0 → dctracker-1.6.0}/dct/paths.py +67 -1
  82. dctracker-1.6.0/dct/skill_render.py +221 -0
  83. dctracker-1.6.0/dct/skill_sources/hosts/claude/allowlist-apply.md +7 -0
  84. dctracker-1.6.0/dct/skill_sources/hosts/claude/allowlist-choice.md +8 -0
  85. dctracker-1.6.0/dct/skill_sources/hosts/claude/allowlist-probe.md +1 -0
  86. dctracker-1.6.0/dct/skill_sources/hosts/claude/allowlist-status.md +2 -0
  87. dctracker-1.6.0/dct/skill_sources/hosts/claude/bootstrap.md +93 -0
  88. dctracker-1.6.0/dct/skill_sources/hosts/claude/coauthor.md +1 -0
  89. dctracker-1.6.0/dct/skill_sources/hosts/claude/conflict-locations.md +1 -0
  90. dctracker-1.6.0/dct/skill_sources/hosts/claude/delegation.md +1 -0
  91. dctracker-1.6.0/dct/skill_sources/hosts/claude/discovery.md +1 -0
  92. dctracker-1.6.0/dct/skill_sources/hosts/claude/handoff-screen.md +5 -0
  93. dctracker-1.6.0/dct/skill_sources/hosts/claude/identity.md +1 -0
  94. dctracker-1.6.0/dct/skill_sources/hosts/claude/pickup-screen.md +4 -0
  95. dctracker-1.6.0/dct/skill_sources/hosts/claude/presentation.md +13 -0
  96. dctracker-1.6.0/dct/skill_sources/hosts/claude/proposal-transport.md +11 -0
  97. dctracker-1.6.0/dct/skill_sources/hosts/claude/question-method.md +1 -0
  98. dctracker-1.6.0/dct/skill_sources/hosts/claude/question.md +1 -0
  99. dctracker-1.6.0/dct/skill_sources/hosts/claude/release-screen.md +7 -0
  100. dctracker-1.6.0/dct/skill_sources/hosts/claude/restart.md +1 -0
  101. dctracker-1.6.0/dct/skill_sources/hosts/claude/shell.md +1 -0
  102. dctracker-1.6.0/dct/skill_sources/hosts/claude/skill-prefix.md +1 -0
  103. dctracker-1.6.0/dct/skill_sources/hosts/claude/task-mirror-probe.md +6 -0
  104. dctracker-1.6.0/dct/skill_sources/hosts/claude/triage-publish.md +16 -0
  105. dctracker-1.6.0/dct/skill_sources/hosts/codex/allowlist-apply.md +1 -0
  106. dctracker-1.6.0/dct/skill_sources/hosts/codex/allowlist-choice.md +1 -0
  107. dctracker-1.6.0/dct/skill_sources/hosts/codex/allowlist-probe.md +1 -0
  108. dctracker-1.6.0/dct/skill_sources/hosts/codex/allowlist-status.md +1 -0
  109. dctracker-1.6.0/dct/skill_sources/hosts/codex/bootstrap.md +7 -0
  110. dctracker-1.6.0/dct/skill_sources/hosts/codex/coauthor.md +1 -0
  111. dctracker-1.6.0/dct/skill_sources/hosts/codex/conflict-locations.md +1 -0
  112. dctracker-1.6.0/dct/skill_sources/hosts/codex/delegation.md +1 -0
  113. dctracker-1.6.0/dct/skill_sources/hosts/codex/discovery.md +1 -0
  114. dctracker-1.6.0/dct/skill_sources/hosts/codex/handoff-screen.md +1 -0
  115. dctracker-1.6.0/dct/skill_sources/hosts/codex/identity.md +1 -0
  116. dctracker-1.6.0/dct/skill_sources/hosts/codex/pickup-screen.md +1 -0
  117. dctracker-1.6.0/dct/skill_sources/hosts/codex/presentation.md +1 -0
  118. dctracker-1.6.0/dct/skill_sources/hosts/codex/proposal-transport.md +1 -0
  119. dctracker-1.6.0/dct/skill_sources/hosts/codex/question-method.md +1 -0
  120. dctracker-1.6.0/dct/skill_sources/hosts/codex/question.md +1 -0
  121. dctracker-1.6.0/dct/skill_sources/hosts/codex/release-screen.md +1 -0
  122. dctracker-1.6.0/dct/skill_sources/hosts/codex/restart.md +1 -0
  123. dctracker-1.6.0/dct/skill_sources/hosts/codex/shell.md +1 -0
  124. dctracker-1.6.0/dct/skill_sources/hosts/codex/skill-prefix.md +1 -0
  125. dctracker-1.6.0/dct/skill_sources/hosts/codex/task-mirror-probe.md +1 -0
  126. dctracker-1.6.0/dct/skill_sources/hosts/codex/triage-publish.md +5 -0
  127. dctracker-1.6.0/dct/skill_sources/hosts/fallback/allowlist-apply.md +1 -0
  128. dctracker-1.6.0/dct/skill_sources/hosts/fallback/allowlist-choice.md +1 -0
  129. dctracker-1.6.0/dct/skill_sources/hosts/fallback/allowlist-probe.md +1 -0
  130. dctracker-1.6.0/dct/skill_sources/hosts/fallback/allowlist-status.md +1 -0
  131. dctracker-1.6.0/dct/skill_sources/hosts/fallback/bootstrap.md +1 -0
  132. dctracker-1.6.0/dct/skill_sources/hosts/fallback/coauthor.md +1 -0
  133. dctracker-1.6.0/dct/skill_sources/hosts/fallback/conflict-locations.md +1 -0
  134. dctracker-1.6.0/dct/skill_sources/hosts/fallback/delegation.md +1 -0
  135. dctracker-1.6.0/dct/skill_sources/hosts/fallback/discovery.md +1 -0
  136. dctracker-1.6.0/dct/skill_sources/hosts/fallback/footer.md +1 -0
  137. dctracker-1.6.0/dct/skill_sources/hosts/fallback/handoff-screen.md +1 -0
  138. dctracker-1.6.0/dct/skill_sources/hosts/fallback/header.md +15 -0
  139. dctracker-1.6.0/dct/skill_sources/hosts/fallback/identity.md +1 -0
  140. dctracker-1.6.0/dct/skill_sources/hosts/fallback/pickup-screen.md +1 -0
  141. dctracker-1.6.0/dct/skill_sources/hosts/fallback/presentation.md +1 -0
  142. dctracker-1.6.0/dct/skill_sources/hosts/fallback/proposal-transport.md +1 -0
  143. dctracker-1.6.0/dct/skill_sources/hosts/fallback/question-method.md +1 -0
  144. dctracker-1.6.0/dct/skill_sources/hosts/fallback/question.md +1 -0
  145. dctracker-1.6.0/dct/skill_sources/hosts/fallback/release-screen.md +1 -0
  146. dctracker-1.6.0/dct/skill_sources/hosts/fallback/restart.md +1 -0
  147. dctracker-1.6.0/dct/skill_sources/hosts/fallback/shell.md +1 -0
  148. dctracker-1.6.0/dct/skill_sources/hosts/fallback/task-mirror-probe.md +1 -0
  149. dctracker-1.6.0/dct/skill_sources/hosts/fallback/triage-publish.md +5 -0
  150. dctracker-1.6.0/dct/skill_sources/manifest.toml +126 -0
  151. dctracker-1.6.0/dct/skill_sources/shared/changelog-proof.md +56 -0
  152. dctracker-1.6.0/dct/skill_sources/shared/checkpoint-plan.md +18 -0
  153. dctracker-1.6.0/dct/skill_sources/shared/closing-gates.md +56 -0
  154. dctracker-1.6.0/dct/skill_sources/shared/consent.md +3 -0
  155. dctracker-1.6.0/dct/skill_sources/shared/creation-checkpoints.md +6 -0
  156. dctracker-1.6.0/dct/skill_sources/shared/discovery.md +3 -0
  157. dctracker-1.6.0/dct/skill_sources/shared/identity.md +9 -0
  158. dctracker-1.6.0/dct/skill_sources/shared/language.md +4 -0
  159. dctracker-1.6.0/dct/skill_sources/shared/pickup-mode.md +13 -0
  160. dctracker-1.6.0/dct/skill_sources/shared/project-trailers.md +10 -0
  161. dctracker-1.6.0/dct/skill_sources/shared/read-schema.md +1 -0
  162. dctracker-1.6.0/dct/skill_sources/shared/reference.md +51 -0
  163. dctracker-1.6.0/dct/skill_sources/shared/trailer-preferences.md +11 -0
  164. dctracker-1.6.0/dct/skill_sources/shared/type-cues.md +26 -0
  165. dctracker-1.6.0/dct/skill_sources/workflows/clog.md +88 -0
  166. dctracker-1.6.0/dct/skill_sources/workflows/commit.md +302 -0
  167. dctracker-1.4.0/dct/skills/dct-import/SKILL.md → dctracker-1.6.0/dct/skill_sources/workflows/dct-import.md +47 -37
  168. dctracker-1.6.0/dct/skill_sources/workflows/dct-init.md +313 -0
  169. dctracker-1.6.0/dct/skill_sources/workflows/handoff.md +224 -0
  170. dctracker-1.6.0/dct/skill_sources/workflows/pickup.md +216 -0
  171. dctracker-1.6.0/dct/skill_sources/workflows/plan-resolve-uncertain.md +48 -0
  172. dctracker-1.4.0/dct/skills/plan-status/SKILL.md → dctracker-1.6.0/dct/skill_sources/workflows/plan-status.md +18 -19
  173. dctracker-1.6.0/dct/skill_sources/workflows/release.md +1069 -0
  174. dctracker-1.6.0/dct/skill_sources/workflows/track-list.md +124 -0
  175. dctracker-1.6.0/dct/skill_sources/workflows/track-resolve.md +60 -0
  176. dctracker-1.6.0/dct/skill_sources/workflows/track-update.md +138 -0
  177. dctracker-1.6.0/dct/skill_sources/workflows/track.md +102 -0
  178. dctracker-1.6.0/dct/skill_sources/workflows/triage.md +279 -0
  179. dctracker-1.6.0/dct/skills/clog/SKILL.md +113 -0
  180. dctracker-1.6.0/dct/skills/commit/SKILL.md +354 -0
  181. dctracker-1.6.0/dct/skills/dct-import/SKILL.md +366 -0
  182. dctracker-1.6.0/dct/skills/dct-init/SKILL.md +454 -0
  183. dctracker-1.6.0/dct/skills/handoff/SKILL.md +266 -0
  184. dctracker-1.6.0/dct/skills/pickup/SKILL.md +263 -0
  185. dctracker-1.6.0/dct/skills/plan-resolve-uncertain/SKILL.md +74 -0
  186. dctracker-1.6.0/dct/skills/plan-status/SKILL.md +102 -0
  187. dctracker-1.6.0/dct/skills/release/SKILL.md +1100 -0
  188. dctracker-1.6.0/dct/skills/track/SKILL.md +155 -0
  189. dctracker-1.6.0/dct/skills/track-list/SKILL.md +149 -0
  190. dctracker-1.6.0/dct/skills/track-resolve/SKILL.md +140 -0
  191. dctracker-1.6.0/dct/skills/track-update/SKILL.md +234 -0
  192. dctracker-1.6.0/dct/skills/triage/SKILL.md +337 -0
  193. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/app.py +4 -0
  194. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/blueprints/items.py +24 -7
  195. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/serializers.py +7 -2
  196. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/static/app.css +7 -0
  197. dctracker-1.6.0/dct/web/static/vendor/LICENSE.htmx.txt +13 -0
  198. dctracker-1.6.0/dct/web/static/vendor/LICENSE.uPlot.txt +21 -0
  199. dctracker-1.6.0/dct/web/static/vendor/SOURCES.txt +18 -0
  200. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/analytics.html +11 -0
  201. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/changelog/list.html +1 -1
  202. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/item_detail.html +4 -2
  203. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/partials/_items_table.html +7 -2
  204. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/sprints/detail.html +1 -0
  205. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/sprints/list.html +1 -1
  206. dctracker-1.6.0/dct/workflows/changelog_import.py +38 -0
  207. dctracker-1.6.0/dct/workflows/release/__init__.py +25 -0
  208. dctracker-1.6.0/dct/workflows/release/effects.py +7146 -0
  209. dctracker-1.6.0/dct/workflows/release/oplock.py +341 -0
  210. dctracker-1.6.0/dct/workflows/release/plan.py +1925 -0
  211. dctracker-1.6.0/dct/workflows/release/proof.py +358 -0
  212. dctracker-1.6.0/dct/workflows/rubric.py +89 -0
  213. {dctracker-1.4.0 → dctracker-1.6.0}/dct/workflows/session.py +68 -37
  214. dctracker-1.6.0/dct/workflows/task_mirror.py +164 -0
  215. dctracker-1.6.0/dct/workflows/triage.py +1873 -0
  216. dctracker-1.6.0/dct/workflows/triage_page.py +507 -0
  217. dctracker-1.6.0/dctracker.egg-info/PKG-INFO +515 -0
  218. dctracker-1.6.0/dctracker.egg-info/SOURCES.txt +442 -0
  219. dctracker-1.6.0/dctracker.egg-info/dependency_links.txt +1 -0
  220. dctracker-1.6.0/dctracker.egg-info/requires.txt +30 -0
  221. dctracker-1.6.0/docs/assistant-fallbacks.md +3837 -0
  222. {dctracker-1.4.0 → dctracker-1.6.0}/pyproject.toml +33 -13
  223. dctracker-1.6.0/scripts/render_skills.py +36 -0
  224. dctracker-1.6.0/setup.py +36 -0
  225. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_adversarial.py +87 -30
  226. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_analytics.py +102 -22
  227. dctracker-1.6.0/tests/test_atomic_symlinks.py +57 -0
  228. dctracker-1.6.0/tests/test_benchmark_codex.py +425 -0
  229. dctracker-1.6.0/tests/test_branch_label_adversarial.py +294 -0
  230. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_changelog.py +6 -5
  231. dctracker-1.6.0/tests/test_changelog_branch.py +723 -0
  232. dctracker-1.6.0/tests/test_changelog_branch_migration.py +100 -0
  233. dctracker-1.6.0/tests/test_changelog_integrity.py +437 -0
  234. dctracker-1.6.0/tests/test_changelog_pr_refs.py +110 -0
  235. dctracker-1.6.0/tests/test_changelog_proof_execution.py +223 -0
  236. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_check_numbers.py +34 -0
  237. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_checkpoints.py +2 -1
  238. dctracker-1.6.0/tests/test_claude_md_snippet.py +496 -0
  239. dctracker-1.6.0/tests/test_cli_changelog_branch.py +534 -0
  240. dctracker-1.6.0/tests/test_cli_gate_filter.py +27 -0
  241. dctracker-1.6.0/tests/test_cli_handoff_context_summary.py +124 -0
  242. dctracker-1.6.0/tests/test_cli_init_noninteractive.py +29 -0
  243. dctracker-1.6.0/tests/test_cli_plan_classification.py +62 -0
  244. dctracker-1.6.0/tests/test_cli_releases.py +352 -0
  245. dctracker-1.6.0/tests/test_cli_short_title.py +76 -0
  246. dctracker-1.6.0/tests/test_cli_startup.py +104 -0
  247. dctracker-1.6.0/tests/test_cli_tags.py +278 -0
  248. dctracker-1.6.0/tests/test_cli_triage.py +852 -0
  249. dctracker-1.6.0/tests/test_cli_user_text.py +56 -0
  250. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_cli_web.py +28 -13
  251. dctracker-1.6.0/tests/test_codex_hook_install.py +374 -0
  252. dctracker-1.6.0/tests/test_codex_hooks.py +348 -0
  253. dctracker-1.6.0/tests/test_codex_integration.py +472 -0
  254. dctracker-1.6.0/tests/test_codex_task_mirror.py +176 -0
  255. dctracker-1.6.0/tests/test_commit_trailers.py +268 -0
  256. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_config.py +85 -1
  257. dctracker-1.6.0/tests/test_context_readonly.py +168 -0
  258. dctracker-1.6.0/tests/test_cross_client_e2e.py +140 -0
  259. dctracker-1.6.0/tests/test_dct_init_first_contact.py +134 -0
  260. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_export.py +21 -0
  261. dctracker-1.6.0/tests/test_export_versions.py +148 -0
  262. dctracker-1.6.0/tests/test_gate_checkpoint_kind.py +82 -0
  263. dctracker-1.6.0/tests/test_gate_closing_workflows.py +241 -0
  264. dctracker-1.6.0/tests/test_gate_policy.py +727 -0
  265. dctracker-1.6.0/tests/test_gate_race.py +100 -0
  266. dctracker-1.6.0/tests/test_gitinfo.py +329 -0
  267. dctracker-1.6.0/tests/test_gitinfo_strict.py +238 -0
  268. dctracker-1.6.0/tests/test_historical_import.py +66 -0
  269. dctracker-1.6.0/tests/test_home_isolation.py +305 -0
  270. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_hook_bypass.py +6 -0
  271. dctracker-1.6.0/tests/test_hook_changelog_branch.py +580 -0
  272. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_hook_changelog_stop.py +2 -0
  273. dctracker-1.6.0/tests/test_hook_exemption_parity.py +158 -0
  274. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_hook_plan_autoscan.py +3 -4
  275. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_hook_task_mirror.py +73 -4
  276. dctracker-1.6.0/tests/test_hook_tools_guard.py +48 -0
  277. dctracker-1.6.0/tests/test_instruction_files.py +656 -0
  278. dctracker-1.6.0/tests/test_integration_base.py +287 -0
  279. dctracker-1.6.0/tests/test_integration_cli.py +122 -0
  280. dctracker-1.6.0/tests/test_integration_lifecycle.py +86 -0
  281. dctracker-1.6.0/tests/test_integration_reference_reporting.py +148 -0
  282. dctracker-1.6.0/tests/test_items.py +429 -0
  283. dctracker-1.6.0/tests/test_items_create_conn.py +278 -0
  284. dctracker-1.6.0/tests/test_label_blank.py +105 -0
  285. dctracker-1.6.0/tests/test_limits.py +256 -0
  286. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_migrate.py +20 -0
  287. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_migration.py +452 -3
  288. dctracker-1.6.0/tests/test_migration_guarantees.py +427 -0
  289. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_packaging.py +19 -6
  290. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_paths.py +79 -3
  291. dctracker-1.6.0/tests/test_pg_lane.py +139 -0
  292. dctracker-1.6.0/tests/test_plan_classification.py +490 -0
  293. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_plan_classify.py +90 -15
  294. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_plan_ingest.py +33 -14
  295. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_plans_crud.py +121 -0
  296. dctracker-1.6.0/tests/test_procs.py +813 -0
  297. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_projects.py +78 -17
  298. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_provenance.py +22 -14
  299. dctracker-1.6.0/tests/test_readonly_engine.py +256 -0
  300. dctracker-1.6.0/tests/test_reference_install.py +453 -0
  301. dctracker-1.6.0/tests/test_release_apply_consent.py +2449 -0
  302. dctracker-1.6.0/tests/test_release_binding.py +305 -0
  303. dctracker-1.6.0/tests/test_release_changelog_file_round2.py +1022 -0
  304. dctracker-1.6.0/tests/test_release_changelog_file_round3.py +989 -0
  305. dctracker-1.6.0/tests/test_release_changelog_file_round4.py +476 -0
  306. dctracker-1.6.0/tests/test_release_changelog_path.py +1036 -0
  307. dctracker-1.6.0/tests/test_release_conflict.py +366 -0
  308. dctracker-1.6.0/tests/test_release_consent_binding.py +468 -0
  309. dctracker-1.6.0/tests/test_release_consent_hardening.py +690 -0
  310. dctracker-1.6.0/tests/test_release_dialog_routing.py +409 -0
  311. dctracker-1.6.0/tests/test_release_effects.py +927 -0
  312. dctracker-1.6.0/tests/test_release_executor.py +371 -0
  313. dctracker-1.6.0/tests/test_release_git_effects.py +530 -0
  314. dctracker-1.6.0/tests/test_release_ledger.py +851 -0
  315. dctracker-1.6.0/tests/test_release_ledger_round3.py +500 -0
  316. dctracker-1.6.0/tests/test_release_pending_proposal.py +123 -0
  317. dctracker-1.6.0/tests/test_release_plan.py +543 -0
  318. dctracker-1.6.0/tests/test_release_plan_work_tree.py +241 -0
  319. dctracker-1.6.0/tests/test_release_prepare.py +749 -0
  320. dctracker-1.6.0/tests/test_release_preview.py +1826 -0
  321. dctracker-1.6.0/tests/test_release_proof_round3.py +366 -0
  322. dctracker-1.6.0/tests/test_release_push_scope.py +559 -0
  323. dctracker-1.6.0/tests/test_release_reconstruct.py +247 -0
  324. dctracker-1.6.0/tests/test_release_resume_contract.py +143 -0
  325. dctracker-1.6.0/tests/test_release_round4_alias.py +354 -0
  326. dctracker-1.6.0/tests/test_release_round4_git.py +561 -0
  327. dctracker-1.6.0/tests/test_release_round4_git_units.py +215 -0
  328. dctracker-1.6.0/tests/test_release_round4_ledger.py +1319 -0
  329. dctracker-1.6.0/tests/test_release_round4_lock.py +193 -0
  330. dctracker-1.6.0/tests/test_release_round4_procs.py +437 -0
  331. dctracker-1.6.0/tests/test_release_round4_proof.py +773 -0
  332. dctracker-1.6.0/tests/test_release_round4_push.py +283 -0
  333. dctracker-1.6.0/tests/test_release_round4_reconstruct.py +1054 -0
  334. dctracker-1.6.0/tests/test_release_secret_paths.py +207 -0
  335. dctracker-1.6.0/tests/test_release_skill_one_dialog.py +1841 -0
  336. dctracker-1.6.0/tests/test_release_ux_phase1.py +1144 -0
  337. dctracker-1.6.0/tests/test_release_version_suggestion.py +629 -0
  338. dctracker-1.6.0/tests/test_releases.py +516 -0
  339. dctracker-1.6.0/tests/test_releases_adversarial.py +362 -0
  340. dctracker-1.6.0/tests/test_releases_migration.py +131 -0
  341. dctracker-1.6.0/tests/test_rubric_classify.py +126 -0
  342. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_server_acks.py +386 -7
  343. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_server_alwaysload.py +6 -0
  344. dctracker-1.6.0/tests/test_server_changelog_branch.py +215 -0
  345. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_server_handoff_view.py +8 -5
  346. dctracker-1.6.0/tests/test_server_input_hardening.py +238 -0
  347. dctracker-1.6.0/tests/test_server_plan_classification.py +66 -0
  348. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_server_protocol.py +7 -6
  349. dctracker-1.6.0/tests/test_server_releases.py +248 -0
  350. dctracker-1.6.0/tests/test_server_triage.py +809 -0
  351. dctracker-1.6.0/tests/test_server_wire.py +170 -0
  352. dctracker-1.6.0/tests/test_session_concurrency.py +327 -0
  353. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_setup_wiring.py +1 -1
  354. dctracker-1.6.0/tests/test_shared_reference.py +118 -0
  355. dctracker-1.6.0/tests/test_short_title.py +344 -0
  356. dctracker-1.6.0/tests/test_short_title_migration.py +131 -0
  357. dctracker-1.6.0/tests/test_skill_dct_init_reference.py +363 -0
  358. dctracker-1.6.0/tests/test_skill_prose.py +271 -0
  359. dctracker-1.6.0/tests/test_skill_prose_changelog.py +1131 -0
  360. dctracker-1.6.0/tests/test_skill_render.py +262 -0
  361. dctracker-1.6.0/tests/test_skill_trailer_rules.py +110 -0
  362. dctracker-1.6.0/tests/test_skills_fewer_questions.py +1439 -0
  363. dctracker-1.6.0/tests/test_skills_language_rule.py +74 -0
  364. dctracker-1.6.0/tests/test_skills_screen_in_dialog.py +142 -0
  365. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_sprint.py +1 -1
  366. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_sprints_crud.py +64 -0
  367. dctracker-1.6.0/tests/test_suite_isolation.py +86 -0
  368. dctracker-1.6.0/tests/test_tags.py +1119 -0
  369. dctracker-1.6.0/tests/test_triage_export.py +240 -0
  370. dctracker-1.6.0/tests/test_triage_ledger.py +2581 -0
  371. dctracker-1.6.0/tests/test_triage_page.py +883 -0
  372. dctracker-1.6.0/tests/test_triage_schema.py +766 -0
  373. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_update.py +14 -8
  374. dctracker-1.6.0/tests/test_update_item_gates.py +187 -0
  375. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_version.py +56 -0
  376. dctracker-1.6.0/tests/test_version_sync_template.py +273 -0
  377. dctracker-1.6.0/tests/test_version_write_contract.py +204 -0
  378. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_web_analytics.py +11 -0
  379. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_web_items.py +96 -0
  380. dctracker-1.6.0/tests/test_web_short_title.py +72 -0
  381. dctracker-1.6.0/tests/test_workflow_source_contract.py +193 -0
  382. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_workflows.py +68 -4
  383. dctracker-1.6.0/tests/test_worktree_paths.py +70 -0
  384. dctracker-1.4.0/PKG-INFO +0 -386
  385. dctracker-1.4.0/README.md +0 -343
  386. dctracker-1.4.0/dct/assets/__init__.py +0 -19
  387. dctracker-1.4.0/dct/cli.py +0 -2326
  388. dctracker-1.4.0/dct/core/changelog.py +0 -112
  389. dctracker-1.4.0/dct/core/items.py +0 -430
  390. dctracker-1.4.0/dct/core/plans/classify.py +0 -94
  391. dctracker-1.4.0/dct/core/version.py +0 -116
  392. dctracker-1.4.0/dct/db.py +0 -688
  393. dctracker-1.4.0/dct/export.py +0 -107
  394. dctracker-1.4.0/dct/integrations/__init__.py +0 -5
  395. dctracker-1.4.0/dct/integrations/claude.py +0 -334
  396. dctracker-1.4.0/dct/mcp/server.py +0 -2256
  397. dctracker-1.4.0/dct/skills/clog/SKILL.md +0 -68
  398. dctracker-1.4.0/dct/skills/commit/SKILL.md +0 -114
  399. dctracker-1.4.0/dct/skills/dct-init/SKILL.md +0 -290
  400. dctracker-1.4.0/dct/skills/handoff/SKILL.md +0 -188
  401. dctracker-1.4.0/dct/skills/pickup/SKILL.md +0 -147
  402. dctracker-1.4.0/dct/skills/plan-resolve-uncertain/SKILL.md +0 -83
  403. dctracker-1.4.0/dct/skills/release/SKILL.md +0 -294
  404. dctracker-1.4.0/dct/skills/track/SKILL.md +0 -117
  405. dctracker-1.4.0/dct/skills/track-list/SKILL.md +0 -133
  406. dctracker-1.4.0/dct/skills/track-resolve/SKILL.md +0 -52
  407. dctracker-1.4.0/dct/skills/track-update/SKILL.md +0 -109
  408. dctracker-1.4.0/dct/web/static/vendor/SOURCES.txt +0 -10
  409. dctracker-1.4.0/dctracker.egg-info/PKG-INFO +0 -386
  410. dctracker-1.4.0/dctracker.egg-info/SOURCES.txt +0 -155
  411. dctracker-1.4.0/dctracker.egg-info/requires.txt +0 -27
  412. dctracker-1.4.0/tests/test_items.py +0 -195
  413. dctracker-1.4.0/tests/test_server_wire.py +0 -99
  414. {dctracker-1.4.0 → dctracker-1.6.0}/LICENSE +0 -0
  415. {dctracker-1.4.0 → dctracker-1.6.0}/dct/core/__init__.py +0 -0
  416. {dctracker-1.4.0 → dctracker-1.6.0}/dct/core/decisions.py +0 -0
  417. {dctracker-1.4.0 → dctracker-1.6.0}/dct/core/ids.py +0 -0
  418. {dctracker-1.4.0 → dctracker-1.6.0}/dct/core/plans/__init__.py +0 -0
  419. {dctracker-1.4.0 → dctracker-1.6.0}/dct/core/plans/parser.py +0 -0
  420. {dctracker-1.4.0 → dctracker-1.6.0}/dct/mcp/__init__.py +0 -0
  421. {dctracker-1.4.0 → dctracker-1.6.0}/dct/server.py +0 -0
  422. {dctracker-1.4.0 → dctracker-1.6.0}/dct/services/__init__.py +0 -0
  423. {dctracker-1.4.0 → dctracker-1.6.0}/dct/setup.py +0 -0
  424. /dctracker-1.4.0/dctracker.egg-info/dependency_links.txt → /dctracker-1.6.0/dct/skill_sources/hosts/fallback/skill-prefix.md +0 -0
  425. {dctracker-1.4.0 → dctracker-1.6.0}/dct/update.py +0 -0
  426. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/__init__.py +0 -0
  427. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/blueprints/__init__.py +0 -0
  428. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/blueprints/analytics.py +0 -0
  429. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/blueprints/changelog.py +0 -0
  430. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/blueprints/decisions.py +0 -0
  431. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/blueprints/events.py +0 -0
  432. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/blueprints/handoffs.py +0 -0
  433. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/blueprints/home.py +0 -0
  434. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/blueprints/plans.py +0 -0
  435. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/blueprints/projects.py +0 -0
  436. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/blueprints/sprints.py +0 -0
  437. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/changes.py +0 -0
  438. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/static/app.js +0 -0
  439. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/static/vendor/htmx.min.js +0 -0
  440. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/static/vendor/uPlot.iife.min.js +0 -0
  441. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/static/vendor/uPlot.min.css +0 -0
  442. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/base.html +0 -0
  443. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/decisions/list.html +0 -0
  444. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/handoffs/list.html +0 -0
  445. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/home.html +0 -0
  446. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/items_list.html +0 -0
  447. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/partials/_bars.html +0 -0
  448. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/partials/_checkpoint_steps.html +0 -0
  449. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/partials/_plan_section.html +0 -0
  450. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/partials/_project_card.html +0 -0
  451. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/plans/detail.html +0 -0
  452. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/plans/list.html +0 -0
  453. {dctracker-1.4.0 → dctracker-1.6.0}/dct/web/templates/project_home.html +0 -0
  454. {dctracker-1.4.0 → dctracker-1.6.0}/dct/workflows/__init__.py +0 -0
  455. {dctracker-1.4.0 → dctracker-1.6.0}/dctracker.egg-info/entry_points.txt +0 -0
  456. {dctracker-1.4.0 → dctracker-1.6.0}/dctracker.egg-info/top_level.txt +0 -0
  457. {dctracker-1.4.0 → dctracker-1.6.0}/setup.cfg +0 -0
  458. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_changes.py +0 -0
  459. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_cli_prompts.py +0 -0
  460. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_cli_sprints.py +0 -0
  461. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_cli_workflows.py +0 -0
  462. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_decisions_crud.py +0 -0
  463. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_engine.py +0 -0
  464. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_handoff.py +0 -0
  465. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_ids.py +0 -0
  466. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_ingest_dogfood.py +0 -0
  467. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_plan_parser.py +0 -0
  468. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_restructure.py +0 -0
  469. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_server_workflow_ops.py +0 -0
  470. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_setup.py +0 -0
  471. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_web_app.py +0 -0
  472. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_web_structural.py +0 -0
  473. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_web_views.py +0 -0
  474. {dctracker-1.4.0 → dctracker-1.6.0}/tests/test_windows_support.py +0 -0
@@ -2,6 +2,10 @@
2
2
  # packaged asset must be grafted here as well as declared in package-data.
3
3
  graft dct/skills
4
4
  graft dct/hooks
5
+ graft dct/assets
5
6
  graft dct/web/templates
6
7
  graft dct/web/static
7
8
  global-exclude *.py[cod] .DS_Store
9
+ graft dct/skill_sources
10
+ include scripts/render_skills.py
11
+ include docs/assistant-fallbacks.md
@@ -0,0 +1,515 @@
1
+ Metadata-Version: 2.4
2
+ Name: dctracker
3
+ Version: 1.6.0
4
+ Summary: Deterministic Context Tracker (dct) — cross-project tracking, changelog, and release tooling for AI coding clients.
5
+ Author-email: fotodeveloper <dev@fotodeveloper.com>
6
+ License-Expression: MIT AND 0BSD
7
+ Project-URL: Homepage, https://dctools.dev
8
+ Project-URL: Repository, https://github.com/fotodeveloper/dct
9
+ Project-URL: Changelog, https://github.com/fotodeveloper/dct/blob/main/changelog.md
10
+ Keywords: claude-code,codex,mcp,tracking,changelog,sprints,developer-tools,cli
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Environment :: Console
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: Operating System :: OS Independent
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Topic :: Software Development
19
+ Requires-Python: >=3.11
20
+ Description-Content-Type: text/markdown
21
+ License-File: LICENSE
22
+ License-File: dct/web/static/vendor/LICENSE.htmx.txt
23
+ License-File: dct/web/static/vendor/LICENSE.uPlot.txt
24
+ Requires-Dist: packaging>=26.3
25
+ Requires-Dist: sqlalchemy>=2.0.52
26
+ Requires-Dist: python-ulid>=4.0.1
27
+ Requires-Dist: platformdirs>=4.11.8; sys_platform == "win32"
28
+ Provides-Extra: pg
29
+ Requires-Dist: psycopg[binary]>=3.3.5; extra == "pg"
30
+ Provides-Extra: mcp
31
+ Requires-Dist: mcp<3,>=2.2; extra == "mcp"
32
+ Provides-Extra: web
33
+ Requires-Dist: flask>=3.1.3; extra == "web"
34
+ Requires-Dist: markdown>=3.10.3; extra == "web"
35
+ Provides-Extra: dev
36
+ Requires-Dist: pytest>=9.1.1; extra == "dev"
37
+ Requires-Dist: pytest-cov>=7.1.0; extra == "dev"
38
+ Requires-Dist: pytest-xdist>=3.8.0; extra == "dev"
39
+ Provides-Extra: all
40
+ Requires-Dist: psycopg[binary]>=3.3.5; extra == "all"
41
+ Requires-Dist: mcp<3,>=2.2; extra == "all"
42
+ Requires-Dist: flask>=3.1.3; extra == "all"
43
+ Requires-Dist: markdown>=3.10.3; extra == "all"
44
+ Requires-Dist: pytest>=9.1.1; extra == "all"
45
+ Requires-Dist: pytest-cov>=7.1.0; extra == "all"
46
+ Requires-Dist: pytest-xdist>=3.8.0; extra == "all"
47
+ Dynamic: license-file
48
+
49
+ # dct — Deterministic Context Tracker
50
+
51
+ [![PyPI version](https://img.shields.io/pypi/v/dctracker.svg)](https://pypi.org/project/dctracker/)
52
+ [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
53
+ [![CI](https://github.com/fotodeveloper/dct/actions/workflows/ci.yml/badge.svg)](https://github.com/fotodeveloper/dct/actions/workflows/ci.yml)
54
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/fotodeveloper/dct/blob/main/LICENSE)
55
+
56
+ dct makes your work state queryable: what is open, which checkpoints block completion, what was decided, and where the next session should resume. One user-scoped database connects issues, todos, changelog entries, plans, sprints, decisions, and session handoffs across your projects. Assistants and scripts retrieve that state through 76 MCP tools or the CLI instead of reconstructing it from a conversation.
57
+
58
+ [Claude Code](https://claude.com/claude-code) has the established integration. DCT 1.6.0 packages both clients with 14 slash-command skills, 4 Claude automation hooks and experimental native Codex hooks; availability and limits differ by client. See the [capability matrix](https://github.com/fotodeveloper/dct/blob/main/docs/integrations.md#capability-matrix).
59
+
60
+ Part of the **dc tools** family ([dctools.dev](https://dctools.dev)) — *deterministic context* for AI-assisted development.
61
+
62
+ ## Why dct?
63
+
64
+ You have a dozen side projects. Every AI coding session starts cold — the assistant has no memory of what you decided last week, which bug you were mid-fix on, or why you picked SQLite over Postgres. So you re-explain, or it guesses.
65
+
66
+ A conversation explains the work, but does not provide a reliable query for its current state. dct stores typed items, explicit checkpoint outcomes, sprint membership, decisions, and handoffs in a shared ledger. Markdown plans remain files; their indexed state links planning to execution. The next assistant can read the same records as your CLI or dashboard.
67
+
68
+ dct is built for exactly this:
69
+
70
+ - **One user-scoped database** across all your projects — one place to ask "what's open everywhere?" Local-first: SQLite by default, so your tracking data stays on your machine, with first-class PostgreSQL support when you want a server-grade backend.
71
+ - **A full tracking model** — issues, todos, features, ideas, and improvements, each with priority, notes, and per-item checkpoints; gate checkpoints (dogfood, security, review, approval) keep an item open until they pass.
72
+ - **Your markdown plans, indexed** — specs, roadmaps, and ADRs stay plain markdown files; dct anchors their sections and checkpoints in the database, so plan state is queryable and promotable to items and sprints.
73
+ - **MCP-native** — the assistant queries and updates the tracking ledger through structured tools.
74
+ - **Changelog-first releases** — entries accumulate as you work (your assistant writes them); release day is one command.
75
+ - **Soft-delete ledger** — notes, checkpoints, and handoffs are removed from view at most; nothing is ever hard-deleted.
76
+ - **Session handoffs** — end a session with a handoff prompt; the next one picks up where you left off.
77
+
78
+ With a configured client, you can ask your assistant to "track this", "record what changed", or "show the next checkpoint". Packaged skills explain when to use DCT and how to interpret the results. Their availability depends on the client; generic MCP integrations require you to supply equivalent workflow instructions.
79
+
80
+ ## What a session looks like
81
+
82
+ Tracking happens in the conversation you're already having — one working session, and the morning after:
83
+
84
+ ```text
85
+ > track this: parser crashes on empty frontmatter
86
+ Created issue #12 in myproj (P2, open)
87
+
88
+ > I fixed the frontmatter crash
89
+ Changelog entry added (unreleased) — issue #12 resolved
90
+
91
+ > /handoff
92
+ Sprint preserved; handoff prompt stored for the next session
93
+
94
+ # next morning, new session
95
+ > /pickup
96
+ Handoff: "Frontmatter crash is fixed; release when CI is green."
97
+ Proposed first action: /release
98
+ ```
99
+
100
+ No forms, no context switch. Handoff and pickup workflows are packaged as skills for Claude Code and Codex; other MCP clients can use the `handoff_work` and `pickup_work` tools directly. The example uses Claude Code skills, including `/release`; Codex currently packages `clog`, `commit`, `dct-import`, `dct-init`, `handoff`, `pickup`, `plan-resolve-uncertain`, `plan-status`, `release`, `track`, `track-list`, `track-resolve`, `track-update`, `triage`. The tracking, session, and release workflows are described below.
101
+
102
+ ## Installation
103
+
104
+ **Release availability:** DCT **1.6.0** includes the shared CLI/MCP surface, Claude Code and Codex integration installers, `dct integrate`, `dct doctor`, and packaged workflow skills for both clients. Native Codex hooks remain experimental and require the host capabilities and explicit trust described below.
105
+
106
+ Pick one — whichever matches your Python workflow. The distribution is named **`dctracker`** (PyPI); the installed command is **`dct`**. Prerequisites: Python 3.11+. Client-specific skills and hooks require the corresponding host. The CLI and MCP server work independently of either client.
107
+
108
+ ```bash
109
+ # Option A: uv tool (recommended — isolated, upgradable)
110
+ uv tool install 'dctracker[mcp,pg]'
111
+ # Extras: mcp = the MCP server (you want this), pg = the PostgreSQL driver
112
+ # (skip it if you stay on the SQLite default), web = the local dashboard.
113
+
114
+ # From source (dev):
115
+ uv tool install --editable '/path/to/dct[mcp,pg]'
116
+ # Or straight from GitHub, no clone (e.g. to try main before a release):
117
+ uv tool install 'dctracker[mcp,pg] @ git+https://github.com/fotodeveloper/dct'
118
+
119
+ # Option B: pipx (classic isolated install)
120
+ pipx install 'dctracker[mcp,pg]'
121
+
122
+ # Option C: uvx (zero-install, fetches per-invocation) — server-only: pair it
123
+ # with Option A/B if you want `dct init`, the CLI, and the hooks (they need
124
+ # `dct` on PATH). CLI equivalent: uvx --from 'dctracker[mcp,pg]' dct init
125
+ # In ~/.claude.json: { "command": "uvx", "args": ["--from", "dctracker[mcp,pg]", "dct", "server"] }
126
+
127
+ # Option D: pip into your venv (not recommended for global CLI)
128
+ pip install 'dctracker[mcp,pg]'
129
+ ```
130
+
131
+ After installing, `dct` must be on your `PATH`. Verify:
132
+
133
+ ```bash
134
+ dct --version # -> dct <version>
135
+ dct server --help
136
+ dct plan --help # plan subcommands
137
+ ```
138
+
139
+ ### First run with Claude Code
140
+
141
+ ```bash
142
+ dct init
143
+ ```
144
+
145
+ The interactive wizard walks through the one-time global bootstrap. In DCT 1.6.0, `dct init` without a terminal refuses before setup effects; run it in a terminal, or use the explicit integration/project commands for automation:
146
+
147
+ 1. **Database backend** — `sqlite` (default, zero setup at the platform data dir, e.g. `~/.local/share/dctools/dct.db`) or `postgresql` (you supply the URL). It test-connects before saving.
148
+ 2. **Register projects** — for each project it asks slug / path / name, then **auto-detects the version** from `VERSION`, `pyproject.toml`, `package.json`, `Cargo.toml`, or `src-tauri/tauri.conf.json`. If none matches, you get an interactive prompt (`0.0.1` / `0.1.0` / `1.0.0` shortcuts). Register more any time with `dct project add`; that separate command can run without a terminal, storing `current_version=NULL` when no version is detected and reminding you to set it later.
149
+ 3. **MCP server** — registered at **user scope** in `~/.claude.json` (via `claude mcp add --scope user`, with a direct-edit fallback), so `/track`, `/clog`, `/release`, and the MCP tools are available in **every** Claude Code session, from any directory.
150
+ 4. **Skills + hooks** — symlinks the skills into `~/.claude/skills/` and the four hooks into `~/.claude/hooks/`. Both ship inside the package; with an editable/dev install the symlinks point at the repo, so a fix goes live without reinstall.
151
+ 5. **Hook wiring** — with your consent, merges the hooks into `~/.claude/settings.json`. The merge is idempotent, backs up the file before the first write, and never touches hooks you already have. Re-run any time with `dct hooks wire`.
152
+ 6. **dct reference + CLAUDE.md pointer** — installs the on-demand [dct reference](https://github.com/fotodeveloper/dct/blob/main/dct/assets/dct-reference.md) and offers a short managed pointer in your personal `~/.claude/CLAUDE.md`. DCT 1.6.0 places the shared reference in the platform config directory (`~/.config/dctools/dct-reference.md` on POSIX, honoring `XDG_CONFIG_HOME`) and preserves Claude's owned `~/.claude/dct-reference.md` compatibility alias. The pointer renders the actual resolved path. Re-runs preserve bytes outside its markers, and upgrades refresh only an existing block. An edited or foreign reference is preserved and reported before any pointer is rewritten. The reference is installed even when attaching the pointer is declined.
153
+
154
+ The wizard closes with a reminder to **start a new Claude Code session** — skills, hooks, and MCP tools all load at session start. Steps 3–6 are the Claude Code integration; without Claude Code, use the wizard for steps 1–2 and register the server in your own client instead — next section.
155
+
156
+ `dct init` writes the config to the platform config dir (`~/.config/dctools/dct.toml`; existing `~/.claude/dct.toml` installs keep working — `dct migrate-home` moves them), `~/.claude.json` (MCP entry), the skill/hook symlinks, and (opt-in) the settings.json wiring — see [docs/architecture.md](https://github.com/fotodeveloper/dct/blob/main/docs/architecture.md) for the full config reference and scope model.
157
+
158
+ ### Codex
159
+
160
+ Install DCT 1.6.0 or later, then configure the Codex integration:
161
+
162
+ ```bash
163
+ uv tool install 'dctracker[mcp]>=1.6.0'
164
+ dct integrate install codex
165
+ dct doctor --client codex --json
166
+ ```
167
+
168
+ Reconnect/start a fresh Codex session. The adapter installs MCP configuration,
169
+ `clog`, `commit`, `dct-import`, `dct-init`, `handoff`, `pickup`, `plan-resolve-uncertain`, `plan-status`, `release`, `track`, `track-list`, `track-resolve`, `track-update`, `triage` skills, and managed `AGENTS.md`
170
+ instructions. It preserves existing configuration and reports conflicting
171
+ files. The 14 packaged workflows share complete contracts; their availability is separate from client/runtime acceptance evidence. `dct-init`, `dct-import` and `plan-resolve-uncertain` require explicit invocation. Both clients receive their complete workflow contracts from one authored source.
172
+
173
+ Native hooks are **experimental**: changelog checks, stop reminders and
174
+ apply-patch autoscan require the supported host events, runtime dependencies,
175
+ and review/trust through `/hooks`. Plan mirroring additionally requires the
176
+ client to expose and emit `update_plan`; it records observed snapshots rather
177
+ than synchronizing task status. It is not available merely because the assistant
178
+ describes a plan in chat. Current runtime validation targets the local POSIX client.
179
+ See the [integration guide and capability matrix](https://github.com/fotodeveloper/dct/blob/main/docs/integrations.md)
180
+ for repair, upgrade, uninstall, runtime diagnostics and limitations.
181
+
182
+ Fresh Claude → Codex handoff and the installed pickup skill were exercised on
183
+ an isolated database without passing the previous transcript. A controlled
184
+ nine-session comparison measured median main-model input of 24,926 tokens for
185
+ one DCT pickup tool versus 23,006 for exactly the same response bytes read from a
186
+ file, an increase of approximately 8.35%. All trials returned the correct answer;
187
+ cache behavior varied, and separate guardian work means these main-task figures
188
+ are not complete billing totals. DCT's demonstrated benefit here is recovering
189
+ structured work state, not token savings. See the [acceptance evidence](https://github.com/fotodeveloper/dct/blob/main/docs/codex-acceptance.md) and [controlled benchmark results](https://github.com/fotodeveloper/dct/blob/main/docs/benchmark-codex.md#controlled-results).
190
+
191
+ ### Other MCP clients: manual setup
192
+
193
+ The 14 Claude Code skills, 4 Claude hooks and 14 Codex skills are host integrations. The 76 MCP tools and CLI provide the common tracking surface. Other clients use **generic MCP support with manual setup**; no client-specific skills, hook parity or acceptance test is implied. Register `dct server` as a stdio server using the configuration format required by your client. A common JSON shape is:
194
+
195
+ ```json
196
+ { "mcpServers": { "dct": { "command": "dct", "args": ["server"] } } }
197
+ ```
198
+
199
+ Provide workflow instructions for your assistant to select and combine these tools. Relevant starting points: `/track` → `create_item`, `/track-list` → `list_items`, `/pickup` → `pickup_work`, `/handoff` → `handoff_work`, `/clog` → `add_changelog`, `/release` → the local `dct release` workflow (the ledger tools `release_changelog` / `advance_release` serve a project's own release tool). These tool mappings are not substitutes for complete commit/release workflows. To teach your assistant *when* to reach for them, adapt the [dct reference](https://github.com/fotodeveloper/dct/blob/main/dct/assets/dct-reference.md) for your client and point its rules file at it, as the [CLAUDE.md pointer](https://github.com/fotodeveloper/dct/blob/main/dct/assets/claude-md-snippet.md) does for Claude Code.
200
+
201
+ ### Troubleshooting
202
+
203
+ - **`dct: command not found` after install** — the install location isn't on your `PATH`. For `uv tool` / `pipx`, run their `ensurepath` helper (`uv tool update-shell` or `pipx ensurepath`) and restart the shell.
204
+ - **PostgreSQL connection fails at `dct init`** — either start your local Postgres and re-run, or just pick the **SQLite** default (the answer to the backend prompt) — it needs no server and works everywhere. If the error mentions `psycopg` or a missing module instead, reinstall with the `pg` extra: `uv tool install 'dctracker[mcp,pg]'`.
205
+ - **MCP tools don't show up in your client** — the MCP server is a per-session subprocess, so newly registered tools (or a reinstall) appear only after you **restart the session** — in Claude Code and any other MCP client alike. Start a fresh session and they'll be there.
206
+ - **Plans/decisions tools fail with `No module named 'ulid'`** — your installed tool environment predates the `python-ulid` dependency. Upgrade it: `uv tool upgrade dctracker` (or reinstall via your chosen option above).
207
+
208
+ ### Updating
209
+
210
+ dct runs a passive, offline-safe update check — a cached PyPI probe (refreshed at most once a day, never blocking) surfaces a one-line "newer release available" nudge on the CLI and in the MCP server instructions. Opt out with `[update] check = false` in the dct config file (`dct config path` shows where it lives). When a newer version exists:
211
+
212
+ ```bash
213
+ dct upgrade # detects install method (uv tool / pipx / pip), upgrades, re-links skills + hooks
214
+ ```
215
+
216
+ `dct upgrade` refreshes the skill/hook symlinks and prunes any that the new package dropped. Editable/dev checkouts print `git pull` guidance instead (no package to upgrade). Run it at a session boundary — skill descriptions and the MCP server pick up the new code on the next session, migrations on the next engine bootstrap.
217
+
218
+ ## The tracking loop: `/track` → work → `/track-resolve`
219
+
220
+ The foundation everything else builds on. An **item** is one unit of work —
221
+ an `issue`, `todo`, `feature`, `idea`, or `improvement` — with a priority
222
+ (`P1`–`P3`, `future`), append-only notes, and **checkpoints**: acceptance
223
+ criteria your assistant sketches before coding and checks off in real time
224
+ as it works. Say "track this: parser crashes on empty frontmatter" and the
225
+ item exists; say "done with #12" and it resolves, with a resolution note in
226
+ the ledger. Because every project writes to the same database, "what's open
227
+ everywhere?" is one query, not a tour of a dozen TODO.md files. Illustrative
228
+ cross-project view:
229
+
230
+ ```text
231
+ > /track-list P1
232
+ myproj #12 issue P1 in_progress [2/4] parser crashes on empty frontmatter
233
+ website #31 todo P1 open rotate API keys before launch
234
+ ```
235
+
236
+ Checkpoints can also be **gates** — `dogfood`, `security`, `review`,
237
+ `approval`, or any custom kind you invent — that block an item from
238
+ resolving until each is done or consciously rejected: a feature is finished
239
+ when the database says so, not when the conversation has moved on.
240
+
241
+ ## The session loop: `/handoff` → `/pickup`
242
+
243
+ AI coding sessions end; your context shouldn't.
244
+
245
+ **Ending a session — `/handoff`** stores a short prompt for whoever comes next
246
+ (usually you, tomorrow). Sprint membership changes only when explicitly
247
+ requested; otherwise it is preserved. **Starting a session — `/pickup`** reads the newest unconsumed
248
+ handoff, shows the sprint with checkpoint progress, and proposes the first
249
+ action, so the session starts in the middle of the work rather than from a
250
+ cold "what were we doing?" The sprint is the durable set of what's in flight
251
+ right now: it survives between sessions. Resolving an item removes it from the open-work
252
+ view while retaining its sprint membership as completion history. Illustrative session start:
253
+
254
+ ```text
255
+ > /pickup
256
+ Handoff (2026-07-05, scope: sprint-15):
257
+ "Theme tokens are merged; wire the toggle into settings next.
258
+ The Safari session fix (#12) still awaits review."
259
+ Sprint: 3 items — #12 in_progress [2/4], #31 open, #7 open
260
+ Proposed first action: #12 — wire the theme toggle into settings.
261
+ ```
262
+
263
+ Handoffs live in the database: several can coexist per project
264
+ (`scope` tags disambiguate parallel workstreams), consuming one preserves it
265
+ in the ledger, and an unconsumed one can be amended in place. Available as
266
+ skills in Claude Code and the Codex integration, MCP tools, and
267
+ the CLI — full catalogue in
268
+ [docs/mcp-tools.md](https://github.com/fotodeveloper/dct/blob/main/docs/mcp-tools.md).
269
+
270
+ ## The release loop: `/clog` → `/commit` → `/release`
271
+
272
+ A changelog reconstructed from `git log` on release day is archaeology —
273
+ dct makes it a side effect of working. Each time a change lands, your
274
+ assistant records a one-line entry in the database (the `/clog` skill,
275
+ `add_changelog` over MCP, `dct clog add` in scripts). A Claude Code hook —
276
+ wired with your consent at `dct init`, then on by default for every
277
+ registered project — can even hold back `git commit` until the entry exists
278
+ (`dct project changelog <slug> off` opts a project out). By release day the
279
+ changelog is already written:
280
+
281
+ ```text
282
+ > /release
283
+ 15 unreleased entries proven by commit trailers → plan approved as 1.4.0
284
+ version files prepared (pyproject.toml) → approved, push target origin/main
285
+ stamped · changelog.md section · version files · release: v1.4.0 · tag · pushed
286
+ ```
287
+
288
+ One workflow plans the release from commit proof, shows the version files and
289
+ the push target for approval, then stamps the version, writes the
290
+ [Keep a Changelog](https://keepachangelog.com) section, makes the release
291
+ commit and the tag and pushes them — each step verified and resumable.
292
+
293
+ ## Plans: your markdown, indexed
294
+
295
+ You already write plans — specs, roadmaps, ADRs — in markdown. dct indexes
296
+ them instead of replacing them: prose stays in the file (still the source of
297
+ truth), while sections, checkpoints, and inline decisions get stable ULID
298
+ anchors and live state (pending/done/rejected) in the database. In Claude
299
+ Code a background hook re-scans the file on every edit; elsewhere, run
300
+ `dct plan rescan <file>`. Local classification rules are the default and leave unknown headings
301
+ unresolved; a configured command can optionally enrich them. A plan checkpoint
302
+ can be promoted to a tracked item, a section to an item or a whole sprint —
303
+ planning and tracking stay one system.
304
+
305
+ Full guide — concepts, ULID anchors, ingest pipeline, classification rules,
306
+ and promotion to items/sprints: **[docs/plans.md](https://github.com/fotodeveloper/dct/blob/main/docs/plans.md)**.
307
+
308
+ ## Features
309
+
310
+ - **Centralized tracking** — one database for all your projects
311
+ - **Session handoffs** — end a session with a stored prompt; `/pickup` resumes the next one mid-work
312
+ - **Hybrid changelog** — entries in DB, export to Keep a Changelog markdown at release; enforcement hook wired at init with your consent, then **on by default per project** (opt out via `dct project changelog <slug> off`) + **per-project changelog location** (repo root by default, or a subdir like `pkg/changelog.md`)
313
+ - **Plans, specs, roadmaps, ADRs** — index markdown plans with stable ULID anchors; state in DB, content stays in markdown
314
+ - **First-class sprints** — a named, goal-scoped *current work* set with persistent membership and completion history
315
+ - **Decision records** — ADRs, sprint amendments, inline plan decisions with multi-anchor linkage
316
+ - **Plan classification** — deterministic heading rules by default; optional configured-command enrichment
317
+ - **Passive autoscan hook** — Claude Code PostToolUse hook re-scans plan-like files in background on every edit
318
+ - **MCP server** — 76 tools over stdio via the official MCP SDK 2.x; client configuration and supported workflow features vary
319
+ - **CLI** — fast `dct` command for hooks and scripts
320
+ - **Skills** — Claude Code slash commands (`/track`, `/clog`, `/triage`, `/dct-import`, `/plan-status`, …); 14 Codex workflows
321
+ - **Soft deletes** — ledger pattern, nothing is ever hard-deleted
322
+ - **DB portable** — SQLite (zero setup) or PostgreSQL
323
+
324
+ ## Usage
325
+
326
+ ### CLI
327
+
328
+ ```bash
329
+ # Items
330
+ dct add myproj todo "Fix parser crash" --priority P1 --tags "parser,crash"
331
+ dct list # All open items, all projects
332
+ dct list myproj --priority P1 # P1 items in myproj
333
+ dct list myproj --tag parser # Items carrying the "parser" tag
334
+ dct show 42 # Full item details with notes
335
+ dct update 42 --status in_progress
336
+ dct update 42 --tags "perf,arch" # Full replace of the tag set (--tags "" clears)
337
+ dct note 42 "Found root cause in tokenizer"
338
+ dct resolve 42 --resolution "Fixed in commit abc123"
339
+
340
+ # Tags (global dictionary, shared by every project)
341
+ dct tags list
342
+ dct tags add perf --description "performance work"
343
+ dct tags merge test tests # Fold "test" into "tests"
344
+
345
+ # Changelog (project auto-detected from CWD; --project overrides)
346
+ dct clog add added "New Python parser support" --project myproj
347
+ dct clog list --project myproj --unreleased
348
+ dct clog count --project myproj # Used by hooks
349
+ dct clog count --branch feat/x --include-unbranched # This branch + unbranched/server-detected
350
+ dct clog release 1.1 --project myproj --proposal-digest <p> --push-remote origin --push-branch main --push-url <url> --confirm # Alias of `dct release apply` that derives the plan itself (after `dct release prepare`): commit, tag, push to the approved target (run from a checkout)
351
+ dct clog release --patch --entries 12,15 --proposal-digest <p> --confirm --no-push # Only these (proven) entries; a local release
352
+ dct clog update 12 --branch feat/x # Amend an unreleased entry
353
+ dct clog delete 12 # Soft-delete an unreleased entry
354
+ dct clog export --project myproj --output changelog.md
355
+
356
+ # Release workflow (each subcommand also takes --json)
357
+ dct release plan --patch # Read-only: proven / unproven entries, range, index state
358
+ dct release attest --entries 16 --confirm # Empty attestation commit for unproven entries
359
+ dct release plan --patch --entries 12,15 --json # The snapshot to approve (snapshot_digest)
360
+ dct release prepare --patch --entries 12,15 --plan-digest <digest> # Isolated version sync → the file list and the push target to approve
361
+ dct release apply --patch --entries 12,15 --plan-digest <digest> --proposal-digest <p> --push-remote origin --push-branch main --push-url <url> --confirm # Stamp, changelog, files, commit, tag, push to the approved target (or --no-push: local)
362
+ dct release resume # Finish an interrupted release (verifies every effect; the stored consent, no new approval)
363
+ dct release abandon --version 1.1 --reason "broken build" --confirm
364
+ dct release reconstruct --version 1.0 --confirm # Record a release made before release records
365
+ dct release takeover --version 1.0 --no-push # Preview: hand a record without consent to dct (then --takeover-digest <d> --confirm, resume)
366
+ dct release version-files # Show the version-file contract (--set a,b | --none, --confirm)
367
+
368
+ # Projects
369
+ dct project add myproj /path/to/myproj --name "My Project" # Version auto-detected
370
+ dct project list
371
+ dct project detect # Print current project slug (for hooks)
372
+ dct project rename myproj --slug myproj2 --name "Rebranded" # Rename in-place, project_id stable
373
+ dct project set-version myproj 1.1 # Post-factum version fix
374
+ dct project changelog myproj off # Opt out of changelog enforcement (on by default)
375
+ dct project changelog-path myproj docs/CHANGELOG.md # Explicit Markdown changelog path (--detect: detect the tracked one again)
376
+
377
+ # Plans
378
+ dct plan rescan /path/to/docs/plans/2026-04-17-feature.md # Idempotent rescan; hook entrypoint
379
+ dct plan rescan $FILE --quiet --resolve-uncertain # Hook-mode flags
380
+
381
+ # Checkpoints (item-level)
382
+ dct checkpoint add 42 "Write parser"
383
+ dct checkpoint list 42
384
+ dct checkpoint done 3 # Mark CP #3 as done
385
+ dct checkpoint reject 4 # Scope-change, keep in ledger
386
+
387
+ # Sprints (first-class, named units of work; /handoff manages the current-sprint set)
388
+ dct sprint list --status active
389
+ dct sprint create "Payments hardening" --code pay-1 --goal "Close the P1 backlog"
390
+ dct sprint show 3 # Details + linked items
391
+ dct sprint activate 3 # Shortcuts: activate / complete / defer
392
+
393
+ # Session edges (same composed ops the /pickup and /handoff skills use)
394
+ dct pickup # Snapshot: sprint, handoffs, gates, decisions
395
+ # (read-only — --consume defaults to never)
396
+ dct handoff create --prompt-file - --add-items 22,6 # Sprint change + handoff, one transaction
397
+ # --remove-items cuts scope, --items replaces;
398
+ # omit all three to leave the sprint untouched
399
+ dct handoff update 12 --prompt "Wire the toggle into settings next"
400
+
401
+ # Config
402
+ dct config get integrations.claude.task_mirror # Read a dotted config key
403
+ dct config path # Show resolved config/data locations
404
+ ```
405
+
406
+ ## MCP Tools
407
+
408
+ dct ships **76 MCP tools**. Zero-arg calls auto-detect the project from the session's working directory; pass `project=<slug>` to override. Write ops return a minimal ack (id + a few post-state fields); fetch full context with `get_item(id)` / `get_handoff(id)`. In Claude Code the tools register at user scope (callable as `mcp__dct__<name>`), with thirteen daily drivers always loaded and the rest fetched on demand; other clients control tool discovery and loading according to their own MCP implementation. Whatever the client, start with `create_item`, `list_items`, `pickup_work`, and `handoff_work`:
409
+
410
+ | Tool | Purpose |
411
+ |---|---|
412
+ | `create_item` | Create a tracked item (issue / todo / feature / idea / improvement) |
413
+ | `get_item` | Full item dict — fields, notes, checkpoints, progress |
414
+ | `list_items` | List / search items in compact `{cols, rows}` form |
415
+ | `update_item` | Update fields on an existing item |
416
+ | `resolve_item` | Close an item (terminal status), with gate-checkpoint guard |
417
+ | `add_note` | Append a note to an item (append-only ledger) |
418
+ | `add_checkpoint` | Add an acceptance criterion to an item |
419
+ | `complete_checkpoint` | Mark a checkpoint done (real-time, never batched) |
420
+ | `reject_checkpoint` | Mark a checkpoint rejected (scope change) — ledger-preserving |
421
+ | `add_changelog` | Add an unreleased changelog entry |
422
+
423
+ Session-edge tools stay deferred: `get_handoff` (full handoff dict — untruncated prompt + context_summary), `create_handoff`, `set_sprint`, `release_changelog`, and more. Full categorized catalogue: **[docs/mcp-tools.md](https://github.com/fotodeveloper/dct/blob/main/docs/mcp-tools.md)**.
424
+
425
+ ## Web viewer
426
+
427
+ `dct web` runs a localhost-only, **read-only** browser dashboard over all registered projects (items, sprints, plans, changelog, decisions, handoffs, plus Radar / Backlog-Health / Velocity analytics) with live SSE refresh. It binds `127.0.0.1` only — no auth, single-user. Install the optional extra first:
428
+
429
+ ```bash
430
+ uv tool install 'dctracker[web,mcp,pg]' # or: pipx install 'dctracker[web]' — adds flask + markdown
431
+ dct web start # start the daemon → prints http://localhost:8787
432
+ dct web start --open # open the browser after starting
433
+ dct web status # show pid + URL
434
+ dct web stop # SIGTERM the daemon
435
+ ```
436
+
437
+ If the preferred port (default `8787`) is busy, the daemon auto-selects the next free port (disable with `--no-fallback`). Configure defaults under `[web]` in the dct config file.
438
+
439
+ ![dct web viewer — read-only dashboard over all registered projects](https://raw.githubusercontent.com/fotodeveloper/dct/main/docs/assets/web-viewer.png)
440
+
441
+ ## Integration with Claude Code
442
+
443
+ Claude Code has the established packaged integration. DCT 1.6.0 generates both clients' 14 skills, the full fallback and the concise reference from `dct/skill_sources`, with freshness checks in CI and package builds. `dct init` installs the shared reference and offers a short pointer in `~/.claude/CLAUDE.md`; the pointer names the actual resolved platform config path. Claude's owned legacy alias remains usable. Use the installer to render [the pointer template](https://github.com/fotodeveloper/dct/blob/main/dct/assets/claude-md-snippet.md); its `{{reference_path}}` slot is filled at installation. Both clients read the [reference](https://github.com/fotodeveloper/dct/blob/main/dct/assets/dct-reference.md) on demand, and per-client uninstall retains it for other clients. See [reference lifecycle details](https://github.com/fotodeveloper/dct/blob/main/docs/integrations.md#shared-reference-and-managed-pointers).
444
+
445
+ ### Skills
446
+
447
+ | Skill | Purpose |
448
+ |---|---|
449
+ | `/track` | Create a tracked item |
450
+ | `/track-list` | List/search items |
451
+ | `/track-update` | Update item fields |
452
+ | `/track-resolve` | Resolve/close items |
453
+ | `/clog` | Add changelog entry |
454
+ | `/commit` | Conventional commit with version suffix + changelog gate |
455
+ | `/release` | One workflow: proof plan → version files + push target approved → stamp, `changelog.md` section, version bump, commit, tag, push |
456
+ | `/pickup` | Session start — read handoff, show sprint, propose first action |
457
+ | `/handoff` | Session end — flag sprint items, write handoff prompt |
458
+ | `/dct-import` | Discover + multi-select + ingest plan-like markdown files |
459
+ | `/dct-init` | Bootstrap dct + register the current project (interactive) |
460
+ | `/plan-status` | Cross-plan progress dashboard |
461
+ | `/plan-resolve-uncertain` | Classify uncertain plan sections with configured rules/command or explicit manual choices |
462
+ | `/triage` | Review findings through the triage ledger — record the consolidated findings, build and publish the page from the ledger, take an agent's proposals, close with the owner's answers |
463
+
464
+ ## Global Hooks
465
+
466
+ `dct init` **symlinks** four hooks into `~/.claude/hooks/` (→ the packaged `dct/hooks/`; an editable/dev install keeps them live-editable from the repo) and — with your consent — **wires them into `~/.claude/settings.json` automatically**. The wiring is an idempotent merge: hooks you already have (dct or your own, in any placement) are never touched, and the file is backed up before the first write. Re-run any time:
467
+
468
+ ```bash
469
+ dct hooks wire # idempotent; safe after upgrades or manual edits
470
+ ```
471
+
472
+ | Hook | Event | Purpose |
473
+ |---|---|---|
474
+ | `dct-check-changelog.sh` | PreToolUse (`Bash`) | blocks `git commit` when app code changed but no unreleased changelog entry exists — once the hook is wired, enforcement is **on by default** per project; opt out via `dct project changelog <slug> off` |
475
+ | `dct-check-changelog-on-stop.sh` | Stop | session-end reminder about pending unreleased entries (same per-project gate) |
476
+ | `dct-plan-autoscan.sh` | PostToolUse (`Edit\|Write\|MultiEdit`) | background rescan of plan-like MD files; fire-and-forget |
477
+ | `dct-task-mirror.sh` | PreToolUse (`TodoWrite\|TaskCreate`) | mirrors Claude Code tasks into dct as `cc-task` checkpoints |
478
+
479
+ Manual wiring reference (full JSON) and the five rules every dct hook follows: [docs/hooks.md](https://github.com/fotodeveloper/dct/blob/main/docs/hooks.md).
480
+
481
+ ## Configuration
482
+
483
+ dct reads its config from the platform config dir — `~/.config/dctools/dct.toml` on Linux and macOS, `%LOCALAPPDATA%\dctools\dct.toml` on Windows — with a permanent fallback to a legacy `~/.claude/dct.toml` (run `dct migrate-home` to move an old install). The minimal config is just the database URL:
484
+
485
+ ```toml
486
+ [database]
487
+ url = "sqlite:////path/to/dct.db"
488
+ # or: url = "postgresql+psycopg://localhost:5432/dct"
489
+ ```
490
+
491
+ The `DCT_DATABASE_URL` environment variable overrides `[database].url`. For the full reference (`[classification]`, `[integrations.claude]`, `[web]` sections), the database schema, MCP scope precedence, and project auto-detection mechanics, see **[docs/architecture.md](https://github.com/fotodeveloper/dct/blob/main/docs/architecture.md)**.
492
+
493
+ ## Testing
494
+
495
+ ```bash
496
+ .venv/bin/pytest -q # All tests
497
+ .venv/bin/pytest tests/test_plan_parser.py -v # Parser only
498
+ .venv/bin/pytest tests/test_plan_ingest.py -v # Ingest + sticky-resolved semantics
499
+
500
+ # MCP server smoke (boot + tool list)
501
+ uv run --no-project --with 'mcp' --with sqlalchemy --with 'psycopg[binary]' \
502
+ python -c "import asyncio; from dct.mcp.server import mcp; \
503
+ print(len(asyncio.run(mcp.list_tools())), 'tools')"
504
+ ```
505
+
506
+ ## Contributing
507
+
508
+ Bug reports, feature ideas, and PRs are welcome — see
509
+ [CONTRIBUTING.md](https://github.com/fotodeveloper/dct/blob/main/CONTRIBUTING.md)
510
+ for dev setup (uv venv + pytest), commit conventions, and how to add MCP
511
+ tools or skills.
512
+
513
+ ## License
514
+
515
+ MIT — see [LICENSE](https://github.com/fotodeveloper/dct/blob/main/LICENSE).