dctracker 1.3.0__tar.gz → 1.5.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 (165) hide show
  1. {dctracker-1.3.0 → dctracker-1.5.0}/MANIFEST.in +1 -0
  2. {dctracker-1.3.0/dctracker.egg-info → dctracker-1.5.0}/PKG-INFO +174 -107
  3. {dctracker-1.3.0 → dctracker-1.5.0}/README.md +171 -104
  4. {dctracker-1.3.0 → dctracker-1.5.0}/dct/__init__.py +1 -1
  5. {dctracker-1.3.0 → dctracker-1.5.0}/dct/assets/__init__.py +5 -0
  6. dctracker-1.5.0/dct/assets/claude-md-snippet.md +188 -0
  7. {dctracker-1.3.0 → dctracker-1.5.0}/dct/cli.py +163 -4
  8. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/analytics.py +20 -26
  9. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/items.py +101 -34
  10. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/plans/crud.py +4 -4
  11. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/sprint.py +3 -1
  12. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/sprints.py +13 -3
  13. dctracker-1.5.0/dct/core/tags.py +566 -0
  14. {dctracker-1.3.0 → dctracker-1.5.0}/dct/db.py +253 -0
  15. {dctracker-1.3.0 → dctracker-1.5.0}/dct/integrations/claude.py +96 -0
  16. {dctracker-1.3.0 → dctracker-1.5.0}/dct/mcp/__init__.py +1 -1
  17. {dctracker-1.3.0 → dctracker-1.5.0}/dct/mcp/server.py +250 -116
  18. {dctracker-1.3.0 → dctracker-1.5.0}/dct/skills/dct-import/SKILL.md +8 -1
  19. {dctracker-1.3.0 → dctracker-1.5.0}/dct/skills/handoff/SKILL.md +58 -27
  20. {dctracker-1.3.0 → dctracker-1.5.0}/dct/skills/pickup/SKILL.md +38 -11
  21. {dctracker-1.3.0 → dctracker-1.5.0}/dct/skills/track/SKILL.md +12 -1
  22. {dctracker-1.3.0 → dctracker-1.5.0}/dct/skills/track-list/SKILL.md +3 -1
  23. {dctracker-1.3.0 → dctracker-1.5.0}/dct/skills/track-update/SKILL.md +12 -0
  24. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/blueprints/items.py +24 -7
  25. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/serializers.py +7 -2
  26. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/static/app.css +5 -0
  27. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/analytics.html +11 -0
  28. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/item_detail.html +3 -1
  29. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/partials/_items_table.html +6 -1
  30. {dctracker-1.3.0 → dctracker-1.5.0/dctracker.egg-info}/PKG-INFO +174 -107
  31. {dctracker-1.3.0 → dctracker-1.5.0}/dctracker.egg-info/SOURCES.txt +9 -0
  32. {dctracker-1.3.0 → dctracker-1.5.0}/dctracker.egg-info/requires.txt +2 -2
  33. {dctracker-1.3.0 → dctracker-1.5.0}/pyproject.toml +10 -3
  34. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_adversarial.py +69 -23
  35. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_analytics.py +102 -22
  36. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_check_numbers.py +13 -0
  37. dctracker-1.5.0/tests/test_claude_md_snippet.py +130 -0
  38. dctracker-1.5.0/tests/test_cli_tags.py +278 -0
  39. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_engine.py +25 -0
  40. dctracker-1.5.0/tests/test_items.py +385 -0
  41. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_migration.py +452 -3
  42. dctracker-1.5.0/tests/test_pg_lane.py +139 -0
  43. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_plans_crud.py +21 -0
  44. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_provenance.py +22 -14
  45. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_server_acks.py +195 -1
  46. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_server_alwaysload.py +21 -5
  47. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_server_handoff_view.py +1 -1
  48. dctracker-1.5.0/tests/test_server_protocol.py +99 -0
  49. dctracker-1.5.0/tests/test_server_wire.py +99 -0
  50. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_server_workflow_ops.py +1 -1
  51. dctracker-1.5.0/tests/test_skill_prose.py +34 -0
  52. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_sprints_crud.py +64 -0
  53. dctracker-1.5.0/tests/test_tags.py +1119 -0
  54. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_web_analytics.py +11 -0
  55. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_web_items.py +96 -0
  56. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_workflows.py +28 -0
  57. dctracker-1.3.0/tests/test_items.py +0 -195
  58. {dctracker-1.3.0 → dctracker-1.5.0}/LICENSE +0 -0
  59. {dctracker-1.3.0 → dctracker-1.5.0}/dct/config.py +0 -0
  60. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/__init__.py +0 -0
  61. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/changelog.py +0 -0
  62. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/checkpoints.py +0 -0
  63. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/decisions.py +0 -0
  64. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/engine.py +0 -0
  65. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/handoff.py +0 -0
  66. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/ids.py +0 -0
  67. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/plans/__init__.py +0 -0
  68. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/plans/classify.py +0 -0
  69. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/plans/ingest.py +0 -0
  70. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/plans/parser.py +0 -0
  71. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/projects.py +0 -0
  72. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/provenance.py +0 -0
  73. {dctracker-1.3.0 → dctracker-1.5.0}/dct/core/version.py +0 -0
  74. {dctracker-1.3.0 → dctracker-1.5.0}/dct/export.py +0 -0
  75. {dctracker-1.3.0 → dctracker-1.5.0}/dct/hooks/check-changelog-on-stop.sh +0 -0
  76. {dctracker-1.3.0 → dctracker-1.5.0}/dct/hooks/check-changelog.sh +0 -0
  77. {dctracker-1.3.0 → dctracker-1.5.0}/dct/hooks/dct-plan-autoscan.sh +0 -0
  78. {dctracker-1.3.0 → dctracker-1.5.0}/dct/hooks/dct-task-mirror.sh +0 -0
  79. {dctracker-1.3.0 → dctracker-1.5.0}/dct/integrations/__init__.py +0 -0
  80. {dctracker-1.3.0 → dctracker-1.5.0}/dct/migrate.py +0 -0
  81. {dctracker-1.3.0 → dctracker-1.5.0}/dct/paths.py +0 -0
  82. {dctracker-1.3.0 → dctracker-1.5.0}/dct/server.py +0 -0
  83. {dctracker-1.3.0 → dctracker-1.5.0}/dct/services/__init__.py +0 -0
  84. {dctracker-1.3.0 → dctracker-1.5.0}/dct/setup.py +0 -0
  85. {dctracker-1.3.0 → dctracker-1.5.0}/dct/skills/clog/SKILL.md +0 -0
  86. {dctracker-1.3.0 → dctracker-1.5.0}/dct/skills/commit/SKILL.md +0 -0
  87. {dctracker-1.3.0 → dctracker-1.5.0}/dct/skills/dct-init/SKILL.md +0 -0
  88. {dctracker-1.3.0 → dctracker-1.5.0}/dct/skills/plan-resolve-uncertain/SKILL.md +0 -0
  89. {dctracker-1.3.0 → dctracker-1.5.0}/dct/skills/plan-status/SKILL.md +0 -0
  90. {dctracker-1.3.0 → dctracker-1.5.0}/dct/skills/release/SKILL.md +0 -0
  91. {dctracker-1.3.0 → dctracker-1.5.0}/dct/skills/track-resolve/SKILL.md +0 -0
  92. {dctracker-1.3.0 → dctracker-1.5.0}/dct/update.py +0 -0
  93. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/__init__.py +0 -0
  94. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/app.py +0 -0
  95. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/blueprints/__init__.py +0 -0
  96. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/blueprints/analytics.py +0 -0
  97. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/blueprints/changelog.py +0 -0
  98. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/blueprints/decisions.py +0 -0
  99. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/blueprints/events.py +0 -0
  100. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/blueprints/handoffs.py +0 -0
  101. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/blueprints/home.py +0 -0
  102. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/blueprints/plans.py +0 -0
  103. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/blueprints/projects.py +0 -0
  104. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/blueprints/sprints.py +0 -0
  105. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/changes.py +0 -0
  106. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/static/app.js +0 -0
  107. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/static/vendor/SOURCES.txt +0 -0
  108. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/static/vendor/htmx.min.js +0 -0
  109. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/static/vendor/uPlot.iife.min.js +0 -0
  110. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/static/vendor/uPlot.min.css +0 -0
  111. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/base.html +0 -0
  112. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/changelog/list.html +0 -0
  113. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/decisions/list.html +0 -0
  114. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/handoffs/list.html +0 -0
  115. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/home.html +0 -0
  116. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/items_list.html +0 -0
  117. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/partials/_bars.html +0 -0
  118. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/partials/_checkpoint_steps.html +0 -0
  119. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/partials/_plan_section.html +0 -0
  120. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/partials/_project_card.html +0 -0
  121. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/plans/detail.html +0 -0
  122. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/plans/list.html +0 -0
  123. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/project_home.html +0 -0
  124. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/sprints/detail.html +0 -0
  125. {dctracker-1.3.0 → dctracker-1.5.0}/dct/web/templates/sprints/list.html +0 -0
  126. {dctracker-1.3.0 → dctracker-1.5.0}/dct/workflows/__init__.py +0 -0
  127. {dctracker-1.3.0 → dctracker-1.5.0}/dct/workflows/session.py +0 -0
  128. {dctracker-1.3.0 → dctracker-1.5.0}/dctracker.egg-info/dependency_links.txt +0 -0
  129. {dctracker-1.3.0 → dctracker-1.5.0}/dctracker.egg-info/entry_points.txt +0 -0
  130. {dctracker-1.3.0 → dctracker-1.5.0}/dctracker.egg-info/top_level.txt +0 -0
  131. {dctracker-1.3.0 → dctracker-1.5.0}/setup.cfg +0 -0
  132. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_changelog.py +0 -0
  133. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_changes.py +0 -0
  134. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_checkpoints.py +0 -0
  135. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_cli_prompts.py +0 -0
  136. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_cli_sprints.py +0 -0
  137. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_cli_web.py +0 -0
  138. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_cli_workflows.py +0 -0
  139. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_config.py +0 -0
  140. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_decisions_crud.py +0 -0
  141. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_export.py +0 -0
  142. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_handoff.py +0 -0
  143. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_hook_bypass.py +0 -0
  144. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_hook_changelog_stop.py +0 -0
  145. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_hook_plan_autoscan.py +0 -0
  146. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_hook_task_mirror.py +0 -0
  147. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_ids.py +0 -0
  148. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_ingest_dogfood.py +0 -0
  149. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_migrate.py +0 -0
  150. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_packaging.py +0 -0
  151. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_paths.py +0 -0
  152. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_plan_classify.py +0 -0
  153. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_plan_ingest.py +0 -0
  154. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_plan_parser.py +0 -0
  155. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_projects.py +0 -0
  156. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_restructure.py +0 -0
  157. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_setup.py +0 -0
  158. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_setup_wiring.py +0 -0
  159. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_sprint.py +0 -0
  160. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_update.py +0 -0
  161. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_version.py +0 -0
  162. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_web_app.py +0 -0
  163. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_web_structural.py +0 -0
  164. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_web_views.py +0 -0
  165. {dctracker-1.3.0 → dctracker-1.5.0}/tests/test_windows_support.py +0 -0
@@ -2,6 +2,7 @@
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
+ recursive-include dct/assets *.md
5
6
  graft dct/web/templates
6
7
  graft dct/web/static
7
8
  global-exclude *.py[cod] .DS_Store
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dctracker
3
- Version: 1.3.0
3
+ Version: 1.5.0
4
4
  Summary: Deterministic Context Tracker (dct) — cross-project tracking, changelog, and release tooling for Claude Code.
5
5
  Author-email: fotodeveloper <dev@fotodeveloper.com>
6
6
  License-Expression: MIT
@@ -25,7 +25,7 @@ Requires-Dist: platformdirs>=4.9.6; sys_platform == "win32"
25
25
  Provides-Extra: pg
26
26
  Requires-Dist: psycopg[binary]; extra == "pg"
27
27
  Provides-Extra: mcp
28
- Requires-Dist: mcp[cli]<2,>=1.2; extra == "mcp"
28
+ Requires-Dist: mcp<3,>=2; extra == "mcp"
29
29
  Provides-Extra: web
30
30
  Requires-Dist: flask>=3.0; extra == "web"
31
31
  Requires-Dist: markdown>=3.5; extra == "web"
@@ -34,7 +34,7 @@ Requires-Dist: pytest; extra == "dev"
34
34
  Requires-Dist: pytest-cov; extra == "dev"
35
35
  Provides-Extra: all
36
36
  Requires-Dist: psycopg[binary]; extra == "all"
37
- Requires-Dist: mcp[cli]<2,>=1.2; extra == "all"
37
+ Requires-Dist: mcp<3,>=2; extra == "all"
38
38
  Requires-Dist: flask>=3.0; extra == "all"
39
39
  Requires-Dist: markdown>=3.5; extra == "all"
40
40
  Requires-Dist: pytest; extra == "all"
@@ -46,111 +46,80 @@ Dynamic: license-file
46
46
  [![PyPI version](https://img.shields.io/pypi/v/dctracker.svg)](https://pypi.org/project/dctracker/)
47
47
  [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/)
48
48
  [![CI](https://github.com/fotodeveloper/dct/actions/workflows/ci.yml/badge.svg)](https://github.com/fotodeveloper/dct/actions/workflows/ci.yml)
49
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
49
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/fotodeveloper/dct/blob/main/LICENSE)
50
50
 
51
- Persistent, queryable memory for AI coding assistants — your assistant reads facts from a database instead of guessing. One user-scoped database tracks issues, todos, changelog entries, plans, sprints, and decisions across all your projects. Built for [Claude Code](https://claude.com/claude-code) (skills, hooks, 52 MCP tools); the MCP server and CLI work with any MCP-capable assistant.
51
+ dct gives AI coding assistants persistent, queryable memory: project state read from a database instead of guessed. One database shared by all your projects tracks issues, todos, changelog entries, plans, sprints, decisions, and session handoffs. The MCP (Model Context Protocol) server and CLI work with any MCP-capable assistant (Cursor, Windsurf, Zed, and friends); [Claude Code](https://claude.com/claude-code) gets the deepest integration, with 13 slash-command skills and 4 automation hooks on top of the 55 MCP tools.
52
52
 
53
53
  Part of the **dc tools** family ([dctools.dev](https://dctools.dev)) — *deterministic context* for AI-assisted development.
54
54
 
55
55
  ## Why dct?
56
56
 
57
- You have a dozen side projects. Every Claude Code 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.
57
+ 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.
58
58
 
59
- The usual trackers don't fill the gap. GitHub Issues and Jira are per-repo, heavyweight, and live behind an API your assistant can't casually read or write. `TODO.md` files rot the moment you stop grooming them, and you can't query "every P1 across all my repos" from a pile of markdown.
59
+ The usual trackers don't fill the gap. Your assistant can drive GitHub Issues these days (`gh`, the official MCP server), but issues live per-repo on someone else's server, with no notion of a cross-project view, a sprint in flight, a session handoff, or a gate that keeps an item open until you've validated it — and Jira is heavier still. `TODO.md` files rot the moment you stop grooming them. Assistant memory files (CLAUDE.md, auto-memory) help, but they're prose: un-queryable, unstructured, and invisible to your other tools. dct is the structured half — typed items with priorities, state, and gates that any session, script, or MCP client can query.
60
60
 
61
61
  dct is built for exactly this:
62
62
 
63
- - **One user-scoped database** across all your projects — one place to ask "what's open everywhere?". Local-first: SQLite by default — nothing leaves your machine — with first-class PostgreSQL support when you want a server-grade backend.
64
- - **MCP-native** — the assistant reads and writes tracking directly, no copy-paste, no context loss.
65
- - **Changelog-first releases** — entries accumulate as you work (your assistant writes them); release day is one command, not an afternoon of `git log` archaeology.
66
- - **Append-only ledger** — notes, checkpoints, and handoffs are soft-deleted, never dropped. Nothing is lost.
67
- - **Session handoffs** — end a session with a handoff prompt; the next one picks up exactly where you left off.
63
+ - **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.
64
+ - **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.
65
+ - **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.
66
+ - **MCP-native** — the assistant reads and writes tracking directly: no copy-paste, no context loss.
67
+ - **Changelog-first releases** — entries accumulate as you work (your assistant writes them); release day is one command.
68
+ - **Soft-delete ledger** — notes, checkpoints, and handoffs are removed from view at most; nothing is ever hard-deleted.
69
+ - **Session handoffs** — end a session with a handoff prompt; the next one picks up where you left off.
68
70
 
69
- ## The session loop: `/handoff` → `/pickup`
71
+ The day-to-day learning curve is your assistant's, not yours. There is no UI to master and no required syntax: after a one-time `dct init` you keep talking the way you already do — "track this", "I fixed it", "what's open?" — and the assistant does the bookkeeping. The slash commands below are optional shortcuts for the same moves, and every one of them is equally an MCP tool and a CLI command, so the whole workflow runs on any MCP client.
70
72
 
71
- The pair you will use most. AI coding sessions end; your context shouldn't.
73
+ ## What a session looks like
72
74
 
73
- **Ending a session — `/handoff`** flags the items you were working on as the
74
- current sprint and stores a short prompt for whoever comes next (usually:
75
- you, tomorrow). **Starting a session — `/pickup`** reads the newest unconsumed
76
- handoff, shows the sprint with checkpoint progress, and proposes the first
77
- action — so the session starts *in the middle of the work*, not from a cold
78
- "what were we doing?". The sprint is the durable *what's-in-flight-right-now*
79
- set: it survives between sessions and cleans itself up — resolving an item
80
- drops it from the sprint automatically. Illustrative session start:
75
+ Tracking happens in the conversation you're already having — one working session, and the morning after:
81
76
 
82
77
  ```text
83
- > /pickup
84
- Handoff (2026-07-05, scope: sprint-15):
85
- "Theme tokens are merged; wire the toggle into settings next.
86
- The Safari session fix (#12) still awaits review."
87
- Sprint: 3 items — #12 in_progress [2/4], #31 open, #7 open
88
- Proposed first action: #12 — wire the theme toggle into settings.
89
- ```
90
-
91
- Handoffs are database rows, not files: several can coexist per project
92
- (`scope` tags disambiguate parallel workstreams), consuming one preserves it
93
- in the ledger, and an unconsumed one can be amended in place. Available as
94
- skills in Claude Code, MCP tools, and the CLI — full catalogue in
95
- [docs/mcp-tools.md](docs/mcp-tools.md).
78
+ > track this: parser crashes on empty frontmatter
79
+ Created issue #12 in myproj (P2, open)
96
80
 
97
- ## The release loop: `/clog` → `/commit` → `/release`
81
+ > I fixed the frontmatter crash
82
+ Changelog entry added (unreleased) — issue #12 resolved
98
83
 
99
- The other daily loop. A changelog reconstructed from `git log` on release
100
- day is archaeology — dct makes it a side effect of working. Each time a
101
- change lands, your assistant records a one-line entry in the database (the
102
- `/clog` skill, `add_changelog` over MCP, `dct clog add` in scripts); an
103
- opt-in hook can even hold back `git commit` until the entry exists. By
104
- release day the changelog is already written:
84
+ > /handoff
85
+ Sprint set (1 item); handoff prompt stored for the next session
105
86
 
106
- ```text
107
- > /release
108
- 15 unreleased entries → stamped as 1.4.0
109
- changelog.md regenerated (Keep a Changelog format)
110
- release: v1.4.0 committed, project version bumped
87
+ # next morning, new session
88
+ > /pickup
89
+ Handoff: "Frontmatter crash is fixed; release when CI is green."
90
+ Proposed first action: /release
111
91
  ```
112
92
 
113
- One command stamps the version, exports [Keep a Changelog](https://keepachangelog.com)
114
- markdown, and makes the release commit.
115
-
116
- ## Features
117
-
118
- - **Centralized tracking** — one database for all your projects
119
- - **Hybrid changelog** — entries in DB, export to Keep a Changelog markdown at release; **opt-in enforcement** + **per-project changelog location** (repo root by default, or a subdir like `pkg/changelog.md`)
120
- - **Plans, specs, roadmaps, ADRs** — index markdown plans with stable ULID anchors; state in DB, content stays in markdown
121
- - **First-class sprints** — a named, goal-scoped *current work* set that survives across sessions and self-cleans as items resolve
122
- - **Decision records** — ADRs, sprint amendments, inline plan decisions with multi-anchor linkage
123
- - **LLM-assisted classification** — uncertain plan sections auto-resolved via `claude --print` (haiku by default)
124
- - **Passive autoscan hook** — PostToolUse hook re-scans plan-like files in background on every edit
125
- - **MCP server** — native Claude Code integration via FastMCP
126
- - **CLI** — fast `dct` command for hooks and scripts
127
- - **Skills** — Claude Code slash commands (`/track`, `/clog`, `/dct-import`, `/plan-status`, …)
128
- - **Soft deletes** — ledger pattern, nothing is ever lost
129
- - **DB portable** — SQLite (zero setup) or PostgreSQL
93
+ No forms, no context switch. `/handoff` and `/pickup` are Claude Code slash commands; on any other MCP client the same moves are the `handoff_work` and `pickup_work` tools. The three loops behind this session — tracking, session, release — are described below.
130
94
 
131
95
  ## Installation
132
96
 
133
- Pick one — whichever matches your Python workflow. The distribution is named **`dctracker`** (PyPI); the installed command is **`dct`**.
97
+ Pick one — whichever matches your Python workflow. The distribution is named **`dctracker`** (PyPI); the installed command is **`dct`**. Prerequisites: Python 3.11+. Claude Code is needed only for the skills/hooks integration; the CLI and MCP server work with any MCP client.
134
98
 
135
99
  ```bash
136
- # Option A: uv tool (recommended — isolated, upgradable, editable for dev)
137
- uv tool install dctracker --with 'mcp[cli]' --with 'psycopg[binary]'
138
- # Or from source (dev):
139
- uv tool install --editable /path/to/dct --with 'mcp[cli]' --with 'psycopg[binary]'
100
+ # Option A: uv tool (recommended — isolated, upgradable)
101
+ uv tool install 'dctracker[mcp,pg]'
102
+ # Extras: mcp = the MCP server (you want this), pg = the PostgreSQL driver
103
+ # (skip it if you stay on the SQLite default), web = the local dashboard.
104
+
105
+ # From source (dev):
106
+ uv tool install --editable /path/to/dct --with 'mcp' --with 'psycopg[binary]'
140
107
  # Or straight from GitHub, no clone (e.g. to try main before a release):
141
108
  uv tool install 'dctracker[mcp,pg] @ git+https://github.com/fotodeveloper/dct'
142
109
 
143
110
  # Option B: pipx (classic isolated install)
144
111
  pipx install 'dctracker[mcp,pg]'
145
112
 
146
- # Option C: uvx (zero-install, fetches per-invocation)
113
+ # Option C: uvx (zero-install, fetches per-invocation) — server-only: pair it
114
+ # with Option A/B if you want `dct init`, the CLI, and the hooks (they need
115
+ # `dct` on PATH). CLI equivalent: uvx --from 'dctracker[mcp,pg]' dct init
147
116
  # In ~/.claude.json: { "command": "uvx", "args": ["--from", "dctracker[mcp,pg]", "dct", "server"] }
148
117
 
149
118
  # Option D: pip into your venv (not recommended for global CLI)
150
119
  pip install 'dctracker[mcp,pg]'
151
120
  ```
152
121
 
153
- After installation `dct` must be in PATH. Verify:
122
+ After installing, `dct` must be on your `PATH`. Verify:
154
123
 
155
124
  ```bash
156
125
  dct --version # -> dct <version>
@@ -171,34 +140,27 @@ The interactive wizard walks through the one-time global bootstrap:
171
140
  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.
172
141
  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.
173
142
  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`.
143
+ 6. **CLAUDE.md snippet** — with your consent, appends the packaged dct instructions to your personal `~/.claude/CLAUDE.md`. This is what makes plain phrases like "track this" reliable. The block is marker-managed and idempotent: re-runs refresh it, your own content is never touched, and the file is backed up before the first write. Decline and paste it later from [dct/assets/claude-md-snippet.md](https://github.com/fotodeveloper/dct/blob/main/dct/assets/claude-md-snippet.md).
174
144
 
175
- `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](docs/architecture.md) for the full config reference and scope model.
145
+ 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.
176
146
 
177
- ### Your first session
147
+ `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.
178
148
 
179
- With `dct init` done, open any registered project in Claude Code and just talk:
149
+ ### Other MCP clients (Cursor, Windsurf, Zed)
180
150
 
181
- ```text
182
- > track this: parser crashes on empty frontmatter
183
- Created issue #12 in myproj (P2, open)
184
-
185
- > I fixed the frontmatter crash
186
- Changelog entry added (unreleased) — issue #12 resolved
151
+ The 13 skills and 4 hooks are Claude Code integrations; everything else — the 55 MCP tools and the CLI — works from any MCP client. Register `dct server` as a stdio server in your client's MCP config, e.g. for Cursor (`~/.cursor/mcp.json`):
187
152
 
188
- > /handoff
189
- Sprint set (1 item); handoff prompt stored for the next session
153
+ ```json
154
+ { "mcpServers": { "dct": { "command": "dct", "args": ["server"] } } }
190
155
  ```
191
156
 
192
- Tomorrow, `/pickup` resumes mid-work — that's the [session loop](#the-session-loop-handoff--pickup)
193
- from the top of this page. When you're ready to ship, `/release` stamps the
194
- accumulated changelog with a version. No forms, no context switch — tracking
195
- happens in the conversation you're already having.
157
+ Then talk to your assistant as usual ("track this", "what's open?") — it drives the same tools. Slash-command equivalents: `/track` → `create_item`, `/track-list` → `list_items`, `/pickup` → `pickup_work`, `/handoff` → `handoff_work`, `/clog` → `add_changelog`, `/release` → `release_changelog`. To teach your assistant *when* to reach for them, adapt the [CLAUDE.md snippet](https://github.com/fotodeveloper/dct/blob/main/dct/assets/claude-md-snippet.md) to your client's rules file.
196
158
 
197
159
  ### Troubleshooting
198
160
 
199
161
  - **`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.
200
- - **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.
201
- - **MCP tools don't show up in Claude Code** — the MCP server is a per-session subprocess, so newly registered tools (or a reinstall) appear only after you **restart the Claude Code session**. Start a fresh session and they'll be there.
162
+ - **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]'`.
163
+ - **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.
202
164
  - **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).
203
165
 
204
166
  ### Updating
@@ -211,6 +173,109 @@ dct upgrade # detects install method (uv tool / pipx / pip), upgrades, re-lin
211
173
 
212
174
  `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.
213
175
 
176
+ ## The tracking loop: `/track` → work → `/track-resolve`
177
+
178
+ The foundation everything else builds on. An **item** is one unit of work —
179
+ an `issue`, `todo`, `feature`, `idea`, or `improvement` — with a priority
180
+ (`P1`–`P3`, `future`), append-only notes, and **checkpoints**: acceptance
181
+ criteria your assistant sketches before coding and checks off in real time
182
+ as it works. Say "track this: parser crashes on empty frontmatter" and the
183
+ item exists; say "done with #12" and it resolves, with a resolution note in
184
+ the ledger. Because every project writes to the same database, "what's open
185
+ everywhere?" is one query, not a tour of a dozen TODO.md files. Illustrative
186
+ cross-project view:
187
+
188
+ ```text
189
+ > /track-list P1
190
+ myproj #12 issue P1 in_progress [2/4] parser crashes on empty frontmatter
191
+ website #31 todo P1 open rotate API keys before launch
192
+ ```
193
+
194
+ Checkpoints can also be **gates** — `dogfood`, `security`, `review`,
195
+ `approval`, or any custom kind you invent — that block an item from
196
+ resolving until each is done or consciously rejected: a feature is finished
197
+ when the database says so, not when the conversation has moved on.
198
+
199
+ ## The session loop: `/handoff` → `/pickup`
200
+
201
+ AI coding sessions end; your context shouldn't.
202
+
203
+ **Ending a session — `/handoff`** flags the items you were working on as the
204
+ current sprint and stores a short prompt for whoever comes next (usually
205
+ you, tomorrow). **Starting a session — `/pickup`** reads the newest unconsumed
206
+ handoff, shows the sprint with checkpoint progress, and proposes the first
207
+ action, so the session starts in the middle of the work rather than from a
208
+ cold "what were we doing?" The sprint is the durable set of what's in flight
209
+ right now: it survives between sessions and cleans itself up — resolving an
210
+ item drops it from the sprint automatically. Illustrative session start:
211
+
212
+ ```text
213
+ > /pickup
214
+ Handoff (2026-07-05, scope: sprint-15):
215
+ "Theme tokens are merged; wire the toggle into settings next.
216
+ The Safari session fix (#12) still awaits review."
217
+ Sprint: 3 items — #12 in_progress [2/4], #31 open, #7 open
218
+ Proposed first action: #12 — wire the theme toggle into settings.
219
+ ```
220
+
221
+ Handoffs live in the database: several can coexist per project
222
+ (`scope` tags disambiguate parallel workstreams), consuming one preserves it
223
+ in the ledger, and an unconsumed one can be amended in place. Available as
224
+ skills in Claude Code, MCP tools, and the CLI — full catalogue in
225
+ [docs/mcp-tools.md](https://github.com/fotodeveloper/dct/blob/main/docs/mcp-tools.md).
226
+
227
+ ## The release loop: `/clog` → `/commit` → `/release`
228
+
229
+ A changelog reconstructed from `git log` on release day is archaeology —
230
+ dct makes it a side effect of working. Each time a change lands, your
231
+ assistant records a one-line entry in the database (the `/clog` skill,
232
+ `add_changelog` over MCP, `dct clog add` in scripts). A Claude Code hook —
233
+ wired with your consent at `dct init`, then on by default for every
234
+ registered project — can even hold back `git commit` until the entry exists
235
+ (`dct project changelog <slug> off` opts a project out). By release day the
236
+ changelog is already written:
237
+
238
+ ```text
239
+ > /release
240
+ 15 unreleased entries → stamped as 1.4.0
241
+ changelog.md regenerated (Keep a Changelog format)
242
+ release: v1.4.0 committed, project version bumped
243
+ ```
244
+
245
+ One command stamps the version, exports [Keep a Changelog](https://keepachangelog.com)
246
+ markdown, and makes the release commit.
247
+
248
+ ## Plans: your markdown, indexed
249
+
250
+ You already write plans — specs, roadmaps, ADRs — in markdown. dct indexes
251
+ them instead of replacing them: prose stays in the file (still the source of
252
+ truth), while sections, checkpoints, and inline decisions get stable ULID
253
+ anchors and live state (pending/done/rejected) in the database. In Claude
254
+ Code a background hook re-scans the file on every edit; elsewhere, run
255
+ `dct plan rescan <file>`. Uncertain section headings can be classified by an
256
+ optional headless LLM call through your own `claude` CLI. A plan checkpoint
257
+ can be promoted to a tracked item, a section to an item or a whole sprint —
258
+ planning and tracking stay one system.
259
+
260
+ Full guide — concepts, ULID anchors, ingest pipeline, classification rules,
261
+ and promotion to items/sprints: **[docs/plans.md](https://github.com/fotodeveloper/dct/blob/main/docs/plans.md)**.
262
+
263
+ ## Features
264
+
265
+ - **Centralized tracking** — one database for all your projects
266
+ - **Session handoffs** — end a session with a stored prompt; `/pickup` resumes the next one mid-work
267
+ - **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`)
268
+ - **Plans, specs, roadmaps, ADRs** — index markdown plans with stable ULID anchors; state in DB, content stays in markdown
269
+ - **First-class sprints** — a named, goal-scoped *current work* set that survives across sessions and self-cleans as items resolve
270
+ - **Decision records** — ADRs, sprint amendments, inline plan decisions with multi-anchor linkage
271
+ - **LLM-assisted classification** — uncertain plan sections auto-resolved via `claude --print` (haiku by default; optional, uses your own `claude` CLI)
272
+ - **Passive autoscan hook** — Claude Code PostToolUse hook re-scans plan-like files in background on every edit
273
+ - **MCP server** — 55 tools over stdio via the official MCP SDK 2.0; works with any MCP client (Claude Code, Cursor, Windsurf, …)
274
+ - **CLI** — fast `dct` command for hooks and scripts
275
+ - **Skills** — Claude Code slash commands (`/track`, `/clog`, `/dct-import`, `/plan-status`, …)
276
+ - **Soft deletes** — ledger pattern, nothing is ever hard-deleted
277
+ - **DB portable** — SQLite (zero setup) or PostgreSQL
278
+
214
279
  ## Usage
215
280
 
216
281
  ### CLI
@@ -220,11 +285,18 @@ dct upgrade # detects install method (uv tool / pipx / pip), upgrades, re-lin
220
285
  dct add myproj todo "Fix parser crash" --priority P1 --tags "parser,crash"
221
286
  dct list # All open items, all projects
222
287
  dct list myproj --priority P1 # P1 items in myproj
288
+ dct list myproj --tag parser # Items carrying the "parser" tag
223
289
  dct show 42 # Full item details with notes
224
290
  dct update 42 --status in_progress
291
+ dct update 42 --tags "perf,arch" # Full replace of the tag set (--tags "" clears)
225
292
  dct note 42 "Found root cause in tokenizer"
226
293
  dct resolve 42 --resolution "Fixed in commit abc123"
227
294
 
295
+ # Tags (global dictionary, shared by every project)
296
+ dct tags list
297
+ dct tags add perf --description "performance work"
298
+ dct tags merge test tests # Fold "test" into "tests"
299
+
228
300
  # Changelog (project auto-detected from CWD; --project overrides)
229
301
  dct clog add added "New Python parser support" --project myproj
230
302
  dct clog list --project myproj --unreleased
@@ -238,7 +310,7 @@ dct project list
238
310
  dct project detect # Print current project slug (for hooks)
239
311
  dct project rename myproj --slug myproj2 --name "Rebranded" # Rename in-place, project_id stable
240
312
  dct project set-version myproj 1.1 # Post-factum version fix
241
- dct project changelog myproj off # Opt out of dct changelog enforcement
313
+ dct project changelog myproj off # Opt out of changelog enforcement (on by default)
242
314
  dct project changelog-path myproj docs/changelog.md # Changelog outside repo root; default: changelog.md
243
315
 
244
316
  # Plans
@@ -272,7 +344,7 @@ dct config path # Show resolved config/data locations
272
344
 
273
345
  ## MCP Tools
274
346
 
275
- dct ships **52 MCP tools**, registered at user scope so they're callable from any Claude Code session as `mcp__dct__<name>`. 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 scalars); fetch full context with `get_item(id)` / `get_handoff(id)`. Thirteen tools are always resident (`alwaysLoad`) — ten mid-session daily drivers plus the three composed workflow ops (`pickup_work`, `handoff_work`, `get_context_snapshot`); the rest of the catalogue loads on demand via ToolSearch:
347
+ dct ships **55 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 MCP clients see the full flat catalogue. Whatever the client, start with `create_item`, `list_items`, `pickup_work`, and `handoff_work`:
276
348
 
277
349
  | Tool | Purpose |
278
350
  |---|---|
@@ -287,13 +359,7 @@ dct ships **52 MCP tools**, registered at user scope so they're callable from an
287
359
  | `reject_checkpoint` | Mark a checkpoint rejected (scope change) — ledger-preserving |
288
360
  | `add_changelog` | Add an unreleased changelog entry |
289
361
 
290
- 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](docs/mcp-tools.md)**.
291
-
292
- ## Plans, Roadmaps & Decisions
293
-
294
- dct extends the flat items model with **hierarchical plans**: markdown plan/spec/roadmap/ADR files stay the source of truth for content, while dct indexes their structure (sections, checkpoints, decisions) with stable **ULID anchors** and owns their state (done/pending/rejected). A PostToolUse hook rescans plan-like files in the background on every edit, injecting ULIDs and syncing the DB; uncertain section headings are classified by a headless `claude --print` call (haiku).
295
-
296
- Full guide — concepts, ULID anchors, ingest pipeline, classification rules, and promotion to items/sprints: **[docs/plans.md](docs/plans.md)**.
362
+ 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)**.
297
363
 
298
364
  ## Web viewer
299
365
 
@@ -309,11 +375,11 @@ dct web stop # SIGTERM the daemon
309
375
 
310
376
  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.
311
377
 
312
- ![dct web viewer — read-only dashboard over all registered projects](docs/assets/web-viewer.png)
378
+ ![dct web viewer — read-only dashboard over all registered projects](https://raw.githubusercontent.com/fotodeveloper/dct/main/docs/assets/web-viewer.png)
313
379
 
314
380
  ## Integration with Claude Code
315
381
 
316
- dct is designed to be driven by Claude Code. To teach your assistant *when* to reach for each skill and MCP tool across every project, copy the ready-made snippet into your personal `~/.claude/CLAUDE.md`: **[docs/CLAUDE.md-snippet.md](docs/CLAUDE.md-snippet.md)**.
382
+ Claude Code is where dct runs deepest. `dct init` offers to attach the ready-made snippet that teaches your assistant *when* to reach for each skill and MCP tool (step 6 of the wizard); to add it manually, copy **[dct/assets/claude-md-snippet.md](https://github.com/fotodeveloper/dct/blob/main/dct/assets/claude-md-snippet.md)** into your personal `~/.claude/CLAUDE.md`.
317
383
 
318
384
  ### Skills
319
385
 
@@ -343,12 +409,12 @@ dct hooks wire # idempotent; safe after upgrades or manual edits
343
409
 
344
410
  | Hook | Event | Purpose |
345
411
  |---|---|---|
346
- | `dct-check-changelog.sh` | PreToolUse (`Bash`) | blocks `git commit` when app code changed but no unreleased changelog entry exists — opt-in per project via `dct project changelog <slug> on\|off` |
347
- | `dct-check-changelog-on-stop.sh` | Stop | session-end reminder about pending unreleased entries (same opt-in gate) |
412
+ | `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` |
413
+ | `dct-check-changelog-on-stop.sh` | Stop | session-end reminder about pending unreleased entries (same per-project gate) |
348
414
  | `dct-plan-autoscan.sh` | PostToolUse (`Edit\|Write\|MultiEdit`) | background rescan of plan-like MD files; fire-and-forget |
349
415
  | `dct-task-mirror.sh` | PreToolUse (`TodoWrite\|TaskCreate`) | mirrors Claude Code tasks into dct as `cc-task` checkpoints |
350
416
 
351
- Manual wiring reference (full JSON) and the five rules every dct hook follows: [docs/hooks.md](docs/hooks.md).
417
+ 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).
352
418
 
353
419
  ## Configuration
354
420
 
@@ -360,7 +426,7 @@ url = "sqlite:////home/you/.local/share/dctools/dct.db"
360
426
  # or: url = "postgresql+psycopg://localhost:5432/dct"
361
427
  ```
362
428
 
363
- 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](docs/architecture.md)**.
429
+ 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)**.
364
430
 
365
431
  ## Testing
366
432
 
@@ -370,7 +436,7 @@ The `DCT_DATABASE_URL` environment variable overrides `[database].url`. For the
370
436
  .venv/bin/pytest tests/test_plan_ingest.py -v # Ingest + sticky-resolved semantics
371
437
 
372
438
  # MCP server smoke (boot + tool list)
373
- uv run --no-project --with 'mcp[cli]' --with sqlalchemy --with 'psycopg[binary]' \
439
+ uv run --no-project --with 'mcp' --with sqlalchemy --with 'psycopg[binary]' \
374
440
  python -c "import asyncio; from dct.mcp.server import mcp; \
375
441
  print(len(asyncio.run(mcp.list_tools())), 'tools')"
376
442
  ```
@@ -378,9 +444,10 @@ uv run --no-project --with 'mcp[cli]' --with sqlalchemy --with 'psycopg[binary]'
378
444
  ## Contributing
379
445
 
380
446
  Bug reports, feature ideas, and PRs are welcome — see
381
- [CONTRIBUTING.md](CONTRIBUTING.md) for dev setup (uv venv + pytest), commit
382
- conventions, and how to add MCP tools or skills.
447
+ [CONTRIBUTING.md](https://github.com/fotodeveloper/dct/blob/main/CONTRIBUTING.md)
448
+ for dev setup (uv venv + pytest), commit conventions, and how to add MCP
449
+ tools or skills.
383
450
 
384
451
  ## License
385
452
 
386
- MIT — see [LICENSE](LICENSE).
453
+ MIT — see [LICENSE](https://github.com/fotodeveloper/dct/blob/main/LICENSE).