cc-session-tools 3.12.2__tar.gz → 3.14.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (306) hide show
  1. {cc_session_tools-3.12.2/src/cc_session_tools.egg-info → cc_session_tools-3.14.0}/PKG-INFO +1 -1
  2. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/pyproject.toml +1 -1
  3. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/cli/ccmsg.py +13 -1
  4. cc_session_tools-3.14.0/src/cc_session_tools/lib/messaging/session_ref.py +59 -0
  5. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/init_paths.py +9 -5
  6. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/init_service.py +1 -1
  7. cc_session_tools-3.14.0/src/cc_session_tools/lib/pdata/project_claude_md.py +29 -0
  8. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/sessions_db.py +18 -0
  9. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/send-session-message/SKILL.md +9 -1
  10. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0/src/cc_session_tools.egg-info}/PKG-INFO +1 -1
  11. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools.egg-info/SOURCES.txt +2 -0
  12. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/LICENSE +0 -0
  13. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/README.md +0 -0
  14. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/setup.cfg +0 -0
  15. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/__init__.py +0 -0
  16. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/cli/__init__.py +0 -0
  17. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/cli/ccd.py +0 -0
  18. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/cli/ccr.py +0 -0
  19. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/cli/ccs.py +0 -0
  20. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/cli/ccsched.py +0 -0
  21. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/cli/ccst.py +0 -0
  22. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/cli/migrate_ccmsg.py +0 -0
  23. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/cli/migrate_ccsched.py +0 -0
  24. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/cli/migrate_sessions_db.py +0 -0
  25. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/cli/migrate_telemetry.py +0 -0
  26. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/config/api-keys.example +0 -0
  27. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/config/hooks-bundle.json +0 -0
  28. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/config/session-tag-hook.json +0 -0
  29. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/hooks_install.py +0 -0
  30. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/__init__.py +0 -0
  31. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/api_keys.py +0 -0
  32. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/bun_tools.py +0 -0
  33. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/claude_flags.py +0 -0
  34. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/claude_md_install.py +0 -0
  35. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/context_overrides.py +0 -0
  36. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/db.py +0 -0
  37. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/debug.py +0 -0
  38. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/doctor.py +0 -0
  39. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/doctor_mutes.py +0 -0
  40. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/hook_registry.py +0 -0
  41. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/install_sync.py +0 -0
  42. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/levenshtein.py +0 -0
  43. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/machine_identity.py +0 -0
  44. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/messaging/__init__.py +0 -0
  45. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/messaging/addressing.py +0 -0
  46. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/messaging/cursor.py +0 -0
  47. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/messaging/lock.py +0 -0
  48. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/messaging/message.py +0 -0
  49. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/messaging/move_safety.py +0 -0
  50. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/messaging/repository.py +0 -0
  51. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/messaging/retention.py +0 -0
  52. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/messaging/service.py +0 -0
  53. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/messaging/store.py +0 -0
  54. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/occupancy.py +0 -0
  55. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/paths.py +0 -0
  56. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/__init__.py +0 -0
  57. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/backup.py +0 -0
  58. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/classify.py +0 -0
  59. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/cutover.py +0 -0
  60. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/dump.py +0 -0
  61. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/formatting.py +0 -0
  62. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/importers.py +0 -0
  63. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/manifest.py +0 -0
  64. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/naming.py +0 -0
  65. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/readiness.py +0 -0
  66. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/rehydrate.py +0 -0
  67. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/rename_group.py +0 -0
  68. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/reorganize.py +0 -0
  69. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/repository.py +0 -0
  70. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/resolve.py +0 -0
  71. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/service.py +0 -0
  72. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/session_output.py +0 -0
  73. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/store.py +0 -0
  74. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/sync_check.py +0 -0
  75. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/sync_lock.py +0 -0
  76. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/sync_notify.py +0 -0
  77. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/vector_clock.py +0 -0
  78. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/vector_clock_store.py +0 -0
  79. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/verify.py +0 -0
  80. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/pdata/write_log.py +0 -0
  81. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/picker.py +0 -0
  82. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/proc_lock.py +0 -0
  83. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/prompts.py +0 -0
  84. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/roots.py +0 -0
  85. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/rules.py +0 -0
  86. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/__init__.py +0 -0
  87. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/bundled_jobs.py +0 -0
  88. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/cadence.py +0 -0
  89. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/cursor.py +0 -0
  90. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/digest.py +0 -0
  91. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/due.py +0 -0
  92. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/duration.py +0 -0
  93. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/jobspec.py +0 -0
  94. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/ledger.py +0 -0
  95. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/lock.py +0 -0
  96. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/notify.py +0 -0
  97. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/reconcile.py +0 -0
  98. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/registry.py +0 -0
  99. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/runner.py +0 -0
  100. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/state.py +0 -0
  101. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/store.py +0 -0
  102. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/surface.py +0 -0
  103. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/throttle.py +0 -0
  104. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/scheduler/worker.py +0 -0
  105. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/session_gc.py +0 -0
  106. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/sessions.py +0 -0
  107. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/sessions_repair.py +0 -0
  108. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/shell_install.py +0 -0
  109. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/tasklist.py +0 -0
  110. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/telemetry_store.py +0 -0
  111. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/text_wrap.py +0 -0
  112. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/lib/timefmt.py +0 -0
  113. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/analyse-cc-usage/SKILL.md +0 -0
  114. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/clean-hook-sessions/SKILL.md +0 -0
  115. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/clean-hook-sessions/scripts/clean-hook-sessions.py +0 -0
  116. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/compact-smart/SKILL.md +0 -0
  117. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/context-override/SKILL.md +0 -0
  118. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/delete-sessions/SKILL.md +0 -0
  119. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/delete-sessions/scripts/delete_sessions.py +0 -0
  120. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/do-executor-critic-assessor-loop/SKILL.md +0 -0
  121. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/extract-pptx/SKILL.md +0 -0
  122. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/extract-pptx/scripts/extract_pptx.py +0 -0
  123. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/extract-to-text/SKILL.md +0 -0
  124. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/extract-to-text/scripts/extract_to_text.py +0 -0
  125. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/find-claude-code-session/SKILL.md +0 -0
  126. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/generate-8digit-code/SKILL.md +0 -0
  127. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/generate-8digit-code/scripts/generate_8digit_code.py +0 -0
  128. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/list-empty-sessions/SKILL.md +0 -0
  129. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/list-empty-sessions/scripts/list_empty_sessions.py +0 -0
  130. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/manage-recurring-cc-jobs-using-ccsched/SKILL.md +0 -0
  131. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/move-session/SKILL.md +0 -0
  132. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/move-session/hooks/sessionstart-pending-rename.sh +0 -0
  133. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/move-session/scripts/cc_session_rules.py +0 -0
  134. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/move-session/scripts/move_session.py +0 -0
  135. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/pm-pdata-design-schema/SKILL.md +0 -0
  136. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/pm-pdata-do-audit-and-prepare-to-migrate/SKILL.md +0 -0
  137. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/pm-pdata-do-init/SKILL.md +0 -0
  138. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/pm-pdata-do-manual-migration/SKILL.md +0 -0
  139. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/pm-pdata-do-update-consuming-skills/SKILL.md +0 -0
  140. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/pm-pdata-do-update-project-docs/SKILL.md +0 -0
  141. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/pm-pdata-resolve-conflicts/SKILL.md +0 -0
  142. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/pm-project-layout-reference/SKILL.md +0 -0
  143. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/pm-update-central-files/SKILL.md +0 -0
  144. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/reduce-persistent-context/CALIBRATION.md +0 -0
  145. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/reduce-persistent-context/SKILL.md +0 -0
  146. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/reduce-persistent-context/scripts/analyze_context.py +0 -0
  147. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/reduce-persistent-context/scripts/duplicates.py +0 -0
  148. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/reduce-persistent-context/scripts/measure.py +0 -0
  149. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/reduce-persistent-context/scripts/report.py +0 -0
  150. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/reduce-persistent-context/scripts/tokens.py +0 -0
  151. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/reduce-persistent-context/scripts/usage.py +0 -0
  152. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/select-agent-model/SKILL.md +0 -0
  153. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/update-command-cache/SKILL.md +0 -0
  154. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools/skills/update-command-cache/scripts/update_command_cache.py +0 -0
  155. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools.egg-info/dependency_links.txt +0 -0
  156. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools.egg-info/entry_points.txt +0 -0
  157. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools.egg-info/requires.txt +0 -0
  158. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/cc_session_tools.egg-info/top_level.txt +0 -0
  159. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/claude_code_usage/__init__.py +0 -0
  160. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/claude_code_usage/attribution.py +0 -0
  161. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/claude_code_usage/cache.py +0 -0
  162. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/claude_code_usage/ccusage_wrapper.py +0 -0
  163. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/claude_code_usage/cli.py +0 -0
  164. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/claude_code_usage/data/pricing.json +0 -0
  165. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/claude_code_usage/parent_inference.py +0 -0
  166. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/claude_code_usage/parser.py +0 -0
  167. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/claude_code_usage/pricing.py +0 -0
  168. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/claude_code_usage/query.py +0 -0
  169. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/claude_code_usage/report.py +0 -0
  170. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/claude_code_usage/schema.py +0 -0
  171. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/claude_code_usage/session_names.py +0 -0
  172. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/__init__.py +0 -0
  173. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/after_response.py +0 -0
  174. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/bash_hard_deny.py +0 -0
  175. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/bash_security_review.py +0 -0
  176. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/cache.py +0 -0
  177. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/catchup.py +0 -0
  178. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/confirm_8digit.py +0 -0
  179. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/context_window_warning.py +0 -0
  180. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/last_screenshot.py +0 -0
  181. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/marker_allow.py +0 -0
  182. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/markers.py +0 -0
  183. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/messaging_deliver.py +0 -0
  184. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/model_info.py +0 -0
  185. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/normalise.py +0 -0
  186. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/pdata_sync.py +0 -0
  187. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/pending_migration.py +0 -0
  188. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/pending_rename.py +0 -0
  189. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/script_allowlist.py +0 -0
  190. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/session_tag.py +0 -0
  191. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/stats.py +0 -0
  192. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/telemetry.py +0 -0
  193. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/telemetry_query.py +0 -0
  194. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/telemetry_trim.py +0 -0
  195. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/transcript.py +0 -0
  196. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/src/hooks/worklog_guard.py +0 -0
  197. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_after_response.py +0 -0
  198. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_api_keys.py +0 -0
  199. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_attribution.py +0 -0
  200. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_bash_hard_deny.py +0 -0
  201. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_bash_security_review.py +0 -0
  202. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_bash_security_review_allowlist.py +0 -0
  203. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_bun_tools.py +0 -0
  204. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_cache.py +0 -0
  205. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_cache_sqlite.py +0 -0
  206. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccr_orphans.py +0 -0
  207. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccs_emptiness.py +0 -0
  208. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccs_eta.py +0 -0
  209. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccs_list_mode.py +0 -0
  210. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccs_scope_flags.py +0 -0
  211. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccs_sentinel_sort.py +0 -0
  212. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccs_session_counts.py +0 -0
  213. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_bundle_discovery.py +0 -0
  214. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_ccsched_jobs_cli.py +0 -0
  215. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_cli.py +0 -0
  216. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_context_override_cli.py +0 -0
  217. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_doctor.py +0 -0
  218. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_gc_prune.py +0 -0
  219. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_gc_report.py +0 -0
  220. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_hook_dispatcher.py +0 -0
  221. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_hooks_allowlist.py +0 -0
  222. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_hooks_install_prune.py +0 -0
  223. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_hooks_install_zero_arg.py +0 -0
  224. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_hooks_uninstall.py +0 -0
  225. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_install_everything.py +0 -0
  226. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_machine_identity_cli.py +0 -0
  227. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_main_gate.py +0 -0
  228. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_pdata_cli.py +0 -0
  229. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_pdata_init_cli.py +0 -0
  230. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_pdata_readiness_cli.py +0 -0
  231. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_pdata_reconcile_cli.py +0 -0
  232. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_pdata_rename_group_cli.py +0 -0
  233. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_pdata_reorganize_cli.py +0 -0
  234. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_pdata_sync_cli.py +0 -0
  235. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_pdata_verify_cli.py +0 -0
  236. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_repair_sessions_cli.py +0 -0
  237. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_sessions_cli.py +0 -0
  238. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_shell_install.py +0 -0
  239. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_skills_install.py +0 -0
  240. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_skills_uninstall.py +0 -0
  241. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_telemetry_query.py +0 -0
  242. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccst_telemetry_trim.py +0 -0
  243. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_ccusage_wrapper.py +0 -0
  244. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_claude_flags.py +0 -0
  245. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_claude_md_install.py +0 -0
  246. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_clean_hook_sessions_format.py +0 -0
  247. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_cli.py +0 -0
  248. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_cli_api_launchers.py +0 -0
  249. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_cli_ccd.py +0 -0
  250. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_cli_ccd_dry_run.py +0 -0
  251. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_cli_ccr.py +0 -0
  252. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_cli_ccs.py +0 -0
  253. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_cli_version.py +0 -0
  254. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_confirm_8digit.py +0 -0
  255. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_context_overrides.py +0 -0
  256. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_context_window_warning.py +0 -0
  257. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_date_format_conformance.py +0 -0
  258. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_db.py +0 -0
  259. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_debug.py +0 -0
  260. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_doctor_mutes.py +0 -0
  261. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_empty_session.py +0 -0
  262. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_hook_cache.py +0 -0
  263. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_hooks_install.py +0 -0
  264. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_hooks_install_records.py +0 -0
  265. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_install_sync.py +0 -0
  266. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_last_screenshot.py +0 -0
  267. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_levenshtein.py +0 -0
  268. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_machine_identity.py +0 -0
  269. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_marker_allow.py +0 -0
  270. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_migrate_ccmsg.py +0 -0
  271. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_migrate_ccsched.py +0 -0
  272. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_migrate_sessions_db.py +0 -0
  273. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_migrate_telemetry.py +0 -0
  274. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_model_info.py +0 -0
  275. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_normalise.py +0 -0
  276. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_occupancy.py +0 -0
  277. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_parent_inference.py +0 -0
  278. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_parser.py +0 -0
  279. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_paths.py +0 -0
  280. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_pdata_audit_skill.py +0 -0
  281. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_pdata_post_migration_skills.py +0 -0
  282. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_pending_migration_hook.py +0 -0
  283. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_picker.py +0 -0
  284. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_pricing.py +0 -0
  285. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_proc_lock.py +0 -0
  286. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_prompts.py +0 -0
  287. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_query.py +0 -0
  288. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_report.py +0 -0
  289. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_roots.py +0 -0
  290. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_rules.py +0 -0
  291. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_scheduler_bundled_jobs.py +0 -0
  292. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_schema.py +0 -0
  293. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_script_allowlist.py +0 -0
  294. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_session_names.py +0 -0
  295. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_session_tag.py +0 -0
  296. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_sessions.py +0 -0
  297. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_sessions_db.py +0 -0
  298. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_sessions_db_migration_chain.py +0 -0
  299. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_sessions_repair.py +0 -0
  300. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_tasklist.py +0 -0
  301. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_telemetry.py +0 -0
  302. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_telemetry_store.py +0 -0
  303. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_text_wrap.py +0 -0
  304. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_timefmt.py +0 -0
  305. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_transcript.py +0 -0
  306. {cc_session_tools-3.12.2 → cc_session_tools-3.14.0}/tests/test_worklog_guard.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cc-session-tools
3
- Version: 3.12.2
3
+ Version: 3.14.0
4
4
  Summary: Claude Code session management CLI tools (ccd, ccr, ccs, claude-code-usage, ccst) and hook library (hooks package)
5
5
  Author: raffishquartan
6
6
  License: MIT License
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "cc-session-tools"
7
- version = "3.12.2"
7
+ version = "3.14.0"
8
8
  description = "Claude Code session management CLI tools (ccd, ccr, ccs, claude-code-usage, ccst) and hook library (hooks package)"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -14,10 +14,12 @@ from datetime import datetime, timezone
14
14
  from pathlib import Path
15
15
 
16
16
  from cc_session_tools import __version__
17
+ from cc_session_tools.lib import sessions_db
17
18
  from cc_session_tools.lib.messaging import service, store
18
19
  from cc_session_tools.lib.messaging.addressing import SessionContext
19
20
  from cc_session_tools.lib.messaging.lock import AlreadyClaimedError
20
21
  from cc_session_tools.lib.messaging.message import ToKind
22
+ from cc_session_tools.lib.messaging.session_ref import resolve_session_ref
21
23
 
22
24
 
23
25
  def _build_parser() -> argparse.ArgumentParser:
@@ -30,7 +32,11 @@ def _build_parser() -> argparse.ArgumentParser:
30
32
 
31
33
  send_p = sub.add_parser("send", help="Compose and route a message.")
32
34
  rcpt = send_p.add_argument_group("recipient (exactly one)")
33
- rcpt.add_argument("--to-session", metavar="UUID")
35
+ rcpt.add_argument(
36
+ "--to-session", metavar="UUID|NAME|PREFIX",
37
+ help="a session uuid, a session name (YYYYMMDD-<tag>) or a uuid prefix of 8+ hex "
38
+ "characters; names and prefixes are resolved in the sessions store",
39
+ )
34
40
  rcpt.add_argument("--to-project", metavar="NAME")
35
41
  rcpt.add_argument("--to-description", metavar="TEXT")
36
42
  send_p.add_argument("--subject", required=True)
@@ -94,6 +100,11 @@ def _resolve_recipient(args: argparse.Namespace) -> tuple[ToKind, str]:
94
100
  )
95
101
  kind, val = chosen[0]
96
102
  assert val is not None # the filter above guarantees this; narrows for mypy
103
+ if kind == "session":
104
+ val = resolve_session_ref(
105
+ val, find_by_name=sessions_db.find_exact,
106
+ find_by_prefix=sessions_db.find_by_uuid_prefix,
107
+ )
97
108
  return kind, val
98
109
 
99
110
 
@@ -189,6 +200,7 @@ def _cmd_read(args: argparse.Namespace) -> int:
189
200
  return 1
190
201
  print(f"id: {message.id}")
191
202
  print(f"from: {message.from_session} ({message.from_project})")
203
+ print(f"from_uuid: {message.from_uuid}")
192
204
  print(f"to: {message.to_kind}={message.to_value}")
193
205
  print(f"subject: {message.subject}")
194
206
  print(f"status: {message.status}")
@@ -0,0 +1,59 @@
1
+ """Resolve a `ccmsg send --to-session` reference to a full session uuid."""
2
+ from __future__ import annotations
3
+
4
+ import re
5
+ from collections.abc import Callable
6
+
7
+ from cc_session_tools.lib.sessions_db import SessionRow
8
+
9
+ _UUID = re.compile(r"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}")
10
+ _UUID_PREFIX = re.compile(r"[0-9a-f]{8}[0-9a-f-]*")
11
+ _SESSION_NAME = re.compile(r"\d{8}-\S+")
12
+
13
+ _FORMS = (
14
+ "a session uuid, a session name (YYYYMMDD-<tag>) or a uuid prefix of at least 8 hex characters"
15
+ )
16
+
17
+
18
+ class SessionRefError(ValueError):
19
+ """The reference cannot be resolved to exactly one session."""
20
+
21
+
22
+ def resolve_session_ref(
23
+ ref: str,
24
+ *,
25
+ find_by_name: Callable[[str], list[SessionRow]],
26
+ find_by_prefix: Callable[[str], list[SessionRow]],
27
+ ) -> str:
28
+ """Return the full lowercase uuid `ref` names.
29
+
30
+ A canonical uuid is returned as given: the sessions store only records sessions opened
31
+ through ccd/ccr, so a valid uuid it has not seen must still be addressable. A session name is
32
+ tried before a uuid prefix because a date-prefixed name can also read as hex."""
33
+ ref = ref.strip()
34
+ if _UUID.fullmatch(ref.lower()):
35
+ return ref.lower()
36
+
37
+ is_name = _SESSION_NAME.fullmatch(ref) is not None
38
+ is_prefix = _UUID_PREFIX.fullmatch(ref.lower()) is not None
39
+ if not is_name and not is_prefix:
40
+ raise SessionRefError(f"{ref!r} is not {_FORMS}")
41
+
42
+ rows = find_by_name(ref) if is_name else []
43
+ if not rows and is_prefix:
44
+ rows = find_by_prefix(ref.lower())
45
+ if not rows:
46
+ raise SessionRefError(
47
+ f"no session matches {ref!r}; the sessions store only knows sessions opened with "
48
+ "ccd or ccr, so pass the full uuid for any other session"
49
+ )
50
+ uuids = {row.uuid for row in rows}
51
+ if len(uuids) > 1:
52
+ lines = "\n".join(
53
+ f" {row.uuid[:8]} {row.basename} {row.project_dir}"
54
+ for row in sorted(rows, key=lambda r: (r.uuid, str(r.project_dir)))
55
+ )
56
+ raise SessionRefError(
57
+ f"{ref!r} matches {len(uuids)} sessions; retry with a full uuid:\n{lines}"
58
+ )
59
+ return next(iter(uuids))
@@ -10,7 +10,7 @@ from collections.abc import Iterator
10
10
  from contextlib import contextmanager
11
11
  from pathlib import Path
12
12
 
13
- from cc_session_tools.lib.pdata import backup, store
13
+ from cc_session_tools.lib.pdata import backup, project_claude_md, store
14
14
 
15
15
  PROJECTS_ROOT_ENV = "CCST_PROJECTS_ROOT"
16
16
  # Permanent tool state, not a draft - a project's pdata classification/migration record. Named
@@ -77,13 +77,17 @@ def project_root_exists_already(project: str, *, rehearse: Path | None) -> bool:
77
77
  return (default_projects_root() / project).exists()
78
78
 
79
79
 
80
- def scaffold_new_project_dirs(project_root: Path) -> None:
81
- """Create NEW_PROJECT_SCAFFOLD_DIRNAMES under project_root. Idempotent (mkdir(exist_ok=True)
82
- per folder) - safe to call even if some or all already exist, though callers should gate
80
+ def scaffold_new_project(project_root: Path, project: str) -> None:
81
+ """Create NEW_PROJECT_SCAFFOLD_DIRNAMES under project_root and, if absent, its starting
82
+ CLAUDE.md. Idempotent (mkdir(exist_ok=True) per folder; an existing CLAUDE.md is never
83
+ overwritten) - safe to call even if some or all already exist, though callers should gate
83
84
  this to a genuinely new project (see project_root_exists_already) so an existing project
84
- that deliberately doesn't use these folders is never given them back after deletion."""
85
+ that deliberately doesn't use these folders or has its own CLAUDE.md is never changed."""
85
86
  for name in NEW_PROJECT_SCAFFOLD_DIRNAMES:
86
87
  (project_root / name).mkdir(parents=True, exist_ok=True)
88
+ claude_md = project_root / "CLAUDE.md"
89
+ if not claude_md.exists():
90
+ claude_md.write_bytes(project_claude_md.seed_text(project).encode("utf-8"))
87
91
 
88
92
 
89
93
  def resolve_project_root(project: str, *, rehearse: Path | None) -> Path:
@@ -48,7 +48,7 @@ def dry_run(*, project: str, rehearse: Path | None = None) -> DryRunResult:
48
48
  is_new_project = not init_paths.project_root_exists_already(project, rehearse=rehearse)
49
49
  project_root = init_paths.resolve_project_root(project, rehearse=rehearse)
50
50
  if is_new_project:
51
- init_paths.scaffold_new_project_dirs(project_root)
51
+ init_paths.scaffold_new_project(project_root, project)
52
52
  proposal_path = init_paths.resolve_proposal_path(project_root)
53
53
  with init_paths.project_db_dir_override(rehearse):
54
54
  # Checked before anything below opens/creates this project's .db (repository.connect()'s
@@ -0,0 +1,29 @@
1
+ """The starting CLAUDE.md `ccst pdata init` writes into a genuinely new project."""
2
+ from __future__ import annotations
3
+
4
+ _SECTIONS = """\
5
+ ## Date format
6
+
7
+ - Filenames and folder names: `yyyy.MM.dd` (with time `yyyy.MM.dd-HHmm`, partial `yyyy.MM`).
8
+ - Formal external letters: long form (for example "5 October 2026") in the header only.
9
+ - Everything else: `yyyy-MM-dd` - prose, WORKLOG, CSV/TSV and pdata date fields, frontmatter, \
10
+ JSON/YAML, commit text. Time of day is `yyyy-MM-dd HH:mm`; machine timestamps stay ISO 8601 \
11
+ (`2026-10-05T14:30:00Z`).
12
+ - Never mix formats inside one column or field.
13
+ - Exempt: identifiers containing a date (session tags, branch names, backup stamps), \
14
+ tool-generated names, existing filenames, and evidence or any document the project did not write.
15
+
16
+ ## Line endings
17
+
18
+ - Standard is LF, not CRLF, for all text files (CSV, Markdown, scripts, JSON).
19
+ - Python's `csv.writer` emits CRLF by default, even with `open(..., newline='')`. Always pass \
20
+ `lineterminator='\\n'` to `csv.writer` / `csv.DictWriter`.
21
+ - Other Python defaults can also write the wrong ending: open text files with `newline='\\n'` \
22
+ when writing, and check any tool that rewrites a file.
23
+ - When adding or rewriting a text file, check it has no `\\r` (`grep -c $'\\r' <file>` should \
24
+ print 0).
25
+ """
26
+
27
+
28
+ def seed_text(project: str) -> str:
29
+ return f"# {project}\n\n{_SECTIONS}"
@@ -626,6 +626,24 @@ def find_exact(basename: str, *, path: Path | None = None) -> list[SessionRow]:
626
626
  conn.close()
627
627
 
628
628
 
629
+ def find_by_uuid_prefix(prefix: str, *, path: Path | None = None) -> list[SessionRow]:
630
+ """Every row whose uuid starts with `prefix`. `prefix` must hold only hex digits and
631
+ dashes (the caller validates), so it contains no LIKE wildcard."""
632
+ try:
633
+ conn = connect(path=path, readonly=True)
634
+ except sqlite3.OperationalError:
635
+ return []
636
+ try:
637
+ rows = conn.execute(
638
+ "SELECT project_dir, basename, uuid, start_date, last_opened, last_active "
639
+ "FROM sessions WHERE uuid LIKE ?",
640
+ (prefix + "%",),
641
+ ).fetchall()
642
+ return [_row_to_session(r) for r in rows]
643
+ finally:
644
+ conn.close()
645
+
646
+
629
647
  # ---------------------------------------------------------------------------
630
648
  # sessions_migration_ambiguous
631
649
  # ---------------------------------------------------------------------------
@@ -21,7 +21,15 @@ Do not send for things the user can see in this session, or to talk to yourself.
21
21
  Decide which of three addressing modes fits, and **confirm with the user when it
22
22
  is ambiguous**:
23
23
 
24
- 1. `--to-session <uuid>` - a specific known session (you have its uuid).
24
+ 1. `--to-session <ref>` - a specific known session. `<ref>` is a full uuid, a session name
25
+ (the `cc-sessions/` directory name, `YYYYMMDD-<tag>`) or a uuid prefix of at least 8 hex
26
+ characters, for example the leading characters shown in a received message's sender field. A
27
+ name or prefix is resolved in the sessions store and the message is stored for the full uuid.
28
+ It exits 2 and stores nothing when nothing matches or when it matches several sessions (a
29
+ forked session): the error lists the candidates, so retry with a full uuid. The store knows
30
+ only sessions opened with `ccd`/`ccr`; for any other session pass the full uuid. `ccmsg read`
31
+ prints the sender's full uuid on its `from_uuid:` line, so you can reply to a session you know
32
+ only from a message.
25
33
  2. `--to-project <name>` - any session in a named project.
26
34
  3. `--to-description "<text>"` - "whoever is working on X". Surfaced to candidate
27
35
  sessions; one claims it.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cc-session-tools
3
- Version: 3.12.2
3
+ Version: 3.14.0
4
4
  Summary: Claude Code session management CLI tools (ccd, ccr, ccs, claude-code-usage, ccst) and hook library (hooks package)
5
5
  Author: raffishquartan
6
6
  License: MIT License
@@ -62,6 +62,7 @@ src/cc_session_tools/lib/messaging/move_safety.py
62
62
  src/cc_session_tools/lib/messaging/repository.py
63
63
  src/cc_session_tools/lib/messaging/retention.py
64
64
  src/cc_session_tools/lib/messaging/service.py
65
+ src/cc_session_tools/lib/messaging/session_ref.py
65
66
  src/cc_session_tools/lib/messaging/store.py
66
67
  src/cc_session_tools/lib/pdata/__init__.py
67
68
  src/cc_session_tools/lib/pdata/backup.py
@@ -74,6 +75,7 @@ src/cc_session_tools/lib/pdata/init_paths.py
74
75
  src/cc_session_tools/lib/pdata/init_service.py
75
76
  src/cc_session_tools/lib/pdata/manifest.py
76
77
  src/cc_session_tools/lib/pdata/naming.py
78
+ src/cc_session_tools/lib/pdata/project_claude_md.py
77
79
  src/cc_session_tools/lib/pdata/readiness.py
78
80
  src/cc_session_tools/lib/pdata/rehydrate.py
79
81
  src/cc_session_tools/lib/pdata/rename_group.py