cc-session-tools 2.7.1__tar.gz → 2.7.2__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 (250) hide show
  1. {cc_session_tools-2.7.1/src/cc_session_tools.egg-info → cc_session_tools-2.7.2}/PKG-INFO +1 -1
  2. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/pyproject.toml +1 -1
  3. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/cli/ccst.py +4 -0
  4. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/pdata/backup.py +7 -4
  5. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/pdata/write_log.py +11 -0
  6. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2/src/cc_session_tools.egg-info}/PKG-INFO +1 -1
  7. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_pdata_init_cli.py +44 -1
  8. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/LICENSE +0 -0
  9. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/README.md +0 -0
  10. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/setup.cfg +0 -0
  11. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/__init__.py +0 -0
  12. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/cli/__init__.py +0 -0
  13. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/cli/ccd.py +0 -0
  14. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/cli/ccmsg.py +0 -0
  15. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/cli/ccr.py +0 -0
  16. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/cli/ccs.py +0 -0
  17. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/cli/ccsched.py +0 -0
  18. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/cli/migrate_ccmsg.py +0 -0
  19. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/cli/migrate_ccsched.py +0 -0
  20. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/cli/migrate_sessions_db.py +0 -0
  21. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/cli/migrate_telemetry.py +0 -0
  22. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/config/hooks-bundle.json +0 -0
  23. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/config/session-tag-hook.json +0 -0
  24. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/hooks_install.py +0 -0
  25. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/__init__.py +0 -0
  26. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/claude_flags.py +0 -0
  27. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/claude_md_install.py +0 -0
  28. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/context_overrides.py +0 -0
  29. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/db.py +0 -0
  30. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/debug.py +0 -0
  31. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/doctor.py +0 -0
  32. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/doctor_mutes.py +0 -0
  33. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/hook_registry.py +0 -0
  34. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/install_sync.py +0 -0
  35. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/levenshtein.py +0 -0
  36. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/messaging/__init__.py +0 -0
  37. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/messaging/addressing.py +0 -0
  38. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/messaging/cursor.py +0 -0
  39. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/messaging/lock.py +0 -0
  40. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/messaging/message.py +0 -0
  41. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/messaging/move_safety.py +0 -0
  42. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/messaging/repository.py +0 -0
  43. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/messaging/retention.py +0 -0
  44. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/messaging/service.py +0 -0
  45. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/messaging/store.py +0 -0
  46. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/paths.py +0 -0
  47. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/pdata/__init__.py +0 -0
  48. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/pdata/classify.py +0 -0
  49. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/pdata/cutover.py +0 -0
  50. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/pdata/formatting.py +0 -0
  51. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/pdata/importers.py +0 -0
  52. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/pdata/init_paths.py +0 -0
  53. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/pdata/init_service.py +0 -0
  54. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/pdata/manifest.py +0 -0
  55. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/pdata/naming.py +0 -0
  56. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/pdata/repository.py +0 -0
  57. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/pdata/service.py +0 -0
  58. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/pdata/session_output.py +0 -0
  59. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/pdata/store.py +0 -0
  60. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/pdata/verify.py +0 -0
  61. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/picker.py +0 -0
  62. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/proc_lock.py +0 -0
  63. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/prompts.py +0 -0
  64. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/roots.py +0 -0
  65. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/rules.py +0 -0
  66. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/__init__.py +0 -0
  67. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/bundled_jobs.py +0 -0
  68. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/cadence.py +0 -0
  69. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/cursor.py +0 -0
  70. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/digest.py +0 -0
  71. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/due.py +0 -0
  72. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/duration.py +0 -0
  73. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/jobspec.py +0 -0
  74. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/ledger.py +0 -0
  75. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/lock.py +0 -0
  76. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/notify.py +0 -0
  77. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/reconcile.py +0 -0
  78. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/registry.py +0 -0
  79. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/runner.py +0 -0
  80. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/state.py +0 -0
  81. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/store.py +0 -0
  82. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/surface.py +0 -0
  83. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/throttle.py +0 -0
  84. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/scheduler/worker.py +0 -0
  85. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/session_gc.py +0 -0
  86. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/sessions.py +0 -0
  87. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/sessions_db.py +0 -0
  88. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/sessions_repair.py +0 -0
  89. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/shell_install.py +0 -0
  90. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/tasklist.py +0 -0
  91. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/lib/telemetry_store.py +0 -0
  92. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/analyse-cc-usage/SKILL.md +0 -0
  93. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/context-override/SKILL.md +0 -0
  94. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/delete-sessions/SKILL.md +0 -0
  95. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/delete-sessions/scripts/delete_sessions.py +0 -0
  96. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/do-executor-critic-assessor-loop/SKILL.md +0 -0
  97. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/find-claude-code-session/SKILL.md +0 -0
  98. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/generate-8digit-code/SKILL.md +0 -0
  99. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/generate-8digit-code/scripts/generate_8digit_code.py +0 -0
  100. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/list-empty-sessions/SKILL.md +0 -0
  101. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/list-empty-sessions/scripts/list_empty_sessions.py +0 -0
  102. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/manage-recurring-cc-jobs-using-ccsched/SKILL.md +0 -0
  103. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/move-session/SKILL.md +0 -0
  104. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/move-session/hooks/sessionstart-pending-rename.sh +0 -0
  105. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/move-session/scripts/cc_session_rules.py +0 -0
  106. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/move-session/scripts/move_session.py +0 -0
  107. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/pm-pdata-conflict-resolution/SKILL.md +0 -0
  108. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/pm-pdata-schema-design/SKILL.md +0 -0
  109. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/pm-project-init/SKILL.md +0 -0
  110. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/pm-update-central-files/SKILL.md +0 -0
  111. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/reduce-persistent-context/CALIBRATION.md +0 -0
  112. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/reduce-persistent-context/SKILL.md +0 -0
  113. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/analyze_context.py +0 -0
  114. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/duplicates.py +0 -0
  115. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/measure.py +0 -0
  116. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/report.py +0 -0
  117. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/tokens.py +0 -0
  118. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/usage.py +0 -0
  119. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/select-agent-model/SKILL.md +0 -0
  120. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/send-session-message/SKILL.md +0 -0
  121. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/update-command-cache/SKILL.md +0 -0
  122. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools/skills/update-command-cache/scripts/update_command_cache.py +0 -0
  123. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools.egg-info/SOURCES.txt +0 -0
  124. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools.egg-info/dependency_links.txt +0 -0
  125. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools.egg-info/entry_points.txt +0 -0
  126. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools.egg-info/requires.txt +0 -0
  127. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cc_session_tools.egg-info/top_level.txt +0 -0
  128. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/__init__.py +0 -0
  129. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/after_response.py +0 -0
  130. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/bash_hard_deny.py +0 -0
  131. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/bash_security_review.py +0 -0
  132. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/cache.py +0 -0
  133. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/catchup.py +0 -0
  134. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/confirm_8digit.py +0 -0
  135. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/context_window_warning.py +0 -0
  136. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/last_screenshot.py +0 -0
  137. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/marker_allow.py +0 -0
  138. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/markers.py +0 -0
  139. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/messaging_deliver.py +0 -0
  140. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/model_info.py +0 -0
  141. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/normalise.py +0 -0
  142. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/pending_migration.py +0 -0
  143. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/pending_rename.py +0 -0
  144. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/session_tag.py +0 -0
  145. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/stats.py +0 -0
  146. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/telemetry.py +0 -0
  147. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/telemetry_query.py +0 -0
  148. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/telemetry_trim.py +0 -0
  149. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/transcript.py +0 -0
  150. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/cccs_hooks/worklog_guard.py +0 -0
  151. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/claude_code_usage/__init__.py +0 -0
  152. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/claude_code_usage/attribution.py +0 -0
  153. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/claude_code_usage/cache.py +0 -0
  154. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/claude_code_usage/ccusage_wrapper.py +0 -0
  155. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/claude_code_usage/cli.py +0 -0
  156. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/claude_code_usage/data/pricing.json +0 -0
  157. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/claude_code_usage/parent_inference.py +0 -0
  158. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/claude_code_usage/parser.py +0 -0
  159. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/claude_code_usage/pricing.py +0 -0
  160. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/claude_code_usage/query.py +0 -0
  161. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/claude_code_usage/report.py +0 -0
  162. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/claude_code_usage/schema.py +0 -0
  163. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/src/claude_code_usage/session_names.py +0 -0
  164. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_after_response.py +0 -0
  165. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_attribution.py +0 -0
  166. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_bash_hard_deny.py +0 -0
  167. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_bash_security_review.py +0 -0
  168. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_cache.py +0 -0
  169. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_cache_sqlite.py +0 -0
  170. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccr_orphans.py +0 -0
  171. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccs_emptiness.py +0 -0
  172. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccs_eta.py +0 -0
  173. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccs_list_mode.py +0 -0
  174. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccs_scope_flags.py +0 -0
  175. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccs_sentinel_sort.py +0 -0
  176. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccs_session_counts.py +0 -0
  177. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_bundle_discovery.py +0 -0
  178. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_ccsched_jobs_cli.py +0 -0
  179. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_cli.py +0 -0
  180. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_context_override_cli.py +0 -0
  181. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_doctor.py +0 -0
  182. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_gc_report.py +0 -0
  183. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_hook_dispatcher.py +0 -0
  184. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_hooks_install_prune.py +0 -0
  185. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_hooks_install_zero_arg.py +0 -0
  186. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_hooks_uninstall.py +0 -0
  187. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_install_everything.py +0 -0
  188. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_main_gate.py +0 -0
  189. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_pdata_cli.py +0 -0
  190. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_pdata_reconcile_cli.py +0 -0
  191. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_pdata_verify_cli.py +0 -0
  192. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_repair_sessions_cli.py +0 -0
  193. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_sessions_cli.py +0 -0
  194. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_shell_install.py +0 -0
  195. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_skills_install.py +0 -0
  196. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_skills_uninstall.py +0 -0
  197. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_telemetry_query.py +0 -0
  198. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccst_telemetry_trim.py +0 -0
  199. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_ccusage_wrapper.py +0 -0
  200. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_claude_flags.py +0 -0
  201. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_claude_md_install.py +0 -0
  202. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_cli.py +0 -0
  203. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_cli_ccd.py +0 -0
  204. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_cli_ccd_dry_run.py +0 -0
  205. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_cli_ccr.py +0 -0
  206. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_cli_ccs.py +0 -0
  207. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_cli_version.py +0 -0
  208. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_confirm_8digit.py +0 -0
  209. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_context_overrides.py +0 -0
  210. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_context_window_warning.py +0 -0
  211. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_db.py +0 -0
  212. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_debug.py +0 -0
  213. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_doctor_mutes.py +0 -0
  214. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_empty_session.py +0 -0
  215. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_hook_cache.py +0 -0
  216. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_hooks_install.py +0 -0
  217. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_install_sync.py +0 -0
  218. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_last_screenshot.py +0 -0
  219. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_levenshtein.py +0 -0
  220. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_marker_allow.py +0 -0
  221. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_migrate_ccmsg.py +0 -0
  222. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_migrate_ccsched.py +0 -0
  223. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_migrate_sessions_db.py +0 -0
  224. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_migrate_telemetry.py +0 -0
  225. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_model_info.py +0 -0
  226. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_normalise.py +0 -0
  227. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_parent_inference.py +0 -0
  228. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_parser.py +0 -0
  229. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_paths.py +0 -0
  230. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_pending_migration_hook.py +0 -0
  231. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_picker.py +0 -0
  232. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_pricing.py +0 -0
  233. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_proc_lock.py +0 -0
  234. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_prompts.py +0 -0
  235. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_query.py +0 -0
  236. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_report.py +0 -0
  237. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_roots.py +0 -0
  238. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_rules.py +0 -0
  239. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_scheduler_bundled_jobs.py +0 -0
  240. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_schema.py +0 -0
  241. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_session_names.py +0 -0
  242. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_session_tag.py +0 -0
  243. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_sessions.py +0 -0
  244. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_sessions_db.py +0 -0
  245. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_sessions_repair.py +0 -0
  246. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_tasklist.py +0 -0
  247. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_telemetry.py +0 -0
  248. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_telemetry_store.py +0 -0
  249. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/tests/test_transcript.py +0 -0
  250. {cc_session_tools-2.7.1 → cc_session_tools-2.7.2}/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: 2.7.1
3
+ Version: 2.7.2
4
4
  Summary: Claude Code session management CLI tools (ccd, ccr, ccs, claude-code-usage, ccst) and hook library (cccs_hooks)
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 = "2.7.1"
7
+ version = "2.7.2"
8
8
  description = "Claude Code session management CLI tools (ccd, ccr, ccs, claude-code-usage, ccst) and hook library (cccs_hooks)"
9
9
  readme = "README.md"
10
10
  license = { file = "LICENSE" }
@@ -1071,12 +1071,14 @@ def _cmd_pdata_init(args: argparse.Namespace) -> int:
1071
1071
  )
1072
1072
  except (FileNotFoundError, ValueError) as exc:
1073
1073
  print(f"ccst pdata: {exc}", file=sys.stderr)
1074
+ print(f"ERROR: {exc}")
1074
1075
  return 2
1075
1076
 
1076
1077
  if write_result.failure is not None:
1077
1078
  print("ccst pdata init: verification failed, nothing was cut over:", file=sys.stderr)
1078
1079
  for reason in write_result.failure.reasons:
1079
1080
  print(f" - {reason}", file=sys.stderr)
1081
+ print(f"ERROR: verification failed ({len(write_result.failure.reasons)} reason(s))")
1080
1082
  return 1
1081
1083
 
1082
1084
  print(
@@ -1088,6 +1090,8 @@ def _cmd_pdata_init(args: argparse.Namespace) -> int:
1088
1090
  print(f" cut over: {path}")
1089
1091
  print()
1090
1092
  print(write_result.report) # spec §7.1 step 4's diff report, for review
1093
+ print(f"\nVerify: ccst pdata verify --project {args.project} --full")
1094
+ print("SUCCESS")
1091
1095
  return 0
1092
1096
 
1093
1097
 
@@ -75,9 +75,12 @@ def create_backup(
75
75
  philosophy (spec goals).
76
76
 
77
77
  Written to a temp path first and atomically renamed to the final
78
- `<project>-<epoch>.tar.gz` name only once the archive is fully and successfully written —
79
- a failed or interrupted run never leaves a corrupt file at the name a valid backup would
80
- use. Transient OSErrors (e.g. a flaky network/DrvFS-backed project_root) are retried a
78
+ `<project>-<YYYYMMDD-HHMMSS>.tar.gz` name only once the archive is fully and successfully
79
+ written — a failed or interrupted run never leaves a corrupt file at the name a valid
80
+ backup would use. The timestamp is second-granularity specifically so it keeps the same
81
+ collision-resistance across reruns within the same minute that the epoch it replaced had
82
+ — a coarser (e.g. minute-only) format would need a separate numeric tie-breaker to match.
83
+ Transient OSErrors (e.g. a flaky network/DrvFS-backed project_root) are retried a
81
84
  bounded number of times before raising BackupError. Each failed attempt is reported
82
85
  through on_progress (if given) before the retry sleep — otherwise a multi-attempt backup
83
86
  that eventually succeeds leaves no trace in --write's progress log of the retries it took,
@@ -92,7 +95,7 @@ def create_backup(
92
95
  """
93
96
  target_dir = backup_dir()
94
97
  target_dir.mkdir(parents=True, exist_ok=True)
95
- final_path = target_dir / f"{project}-{int(time.time())}.tar.gz"
98
+ final_path = target_dir / f"{project}-{time.strftime('%Y%m%d-%H%M%S')}.tar.gz"
96
99
  tmp_path = final_path.parent / (final_path.name + ".tmp")
97
100
 
98
101
  last_exc: OSError | sqlite3.Error | None = None
@@ -90,8 +90,19 @@ class WriteLog:
90
90
  assert self._real_stderr is not None, "WriteLog.__exit__ called without a completed __enter__"
91
91
 
92
92
  if exc is not None:
93
+ # The exc_type/exc pairing is a stdlib __exit__ contract guarantee (exc_type is
94
+ # only ever None when exc is too), not something this method re-derives — same
95
+ # rationale as the asserts above.
96
+ assert exc_type is not None, "WriteLog.__exit__ called with exc but no exc_type"
93
97
  try:
94
98
  traceback.print_exception(exc_type, exc, tb, file=self._file)
99
+ # An explicit sentinel line after the traceback, matching the ERROR/SUCCESS
100
+ # contract the CLI's own known exit paths write via print() — this is the one
101
+ # path that never reaches back to those print() calls, since the exception
102
+ # escapes the `with` block entirely. Without it, an absent sentinel would mean
103
+ # two different things (an escaped exception vs. the process being killed
104
+ # before __exit__ ran) instead of just the latter.
105
+ self._file.write(f"ERROR: {exc_type.__name__}: {exc}\n")
95
106
  self._file.flush()
96
107
  except OSError:
97
108
  pass # same best-effort contract as _Tee — never let the log itself crash
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cc-session-tools
3
- Version: 2.7.1
3
+ Version: 2.7.2
4
4
  Summary: Claude Code session management CLI tools (ccd, ccr, ccs, claude-code-usage, ccst) and hook library (cccs_hooks)
5
5
  Author: raffishquartan
6
6
  License: MIT License
@@ -90,11 +90,17 @@ def test_pdata_init_write_end_to_end_imports_and_cuts_over(base_env, tmp_path):
90
90
 
91
91
 
92
92
  def test_pdata_init_write_without_prior_dry_run_errors(base_env, tmp_path):
93
- (tmp_path / "projects" / "demo").mkdir(parents=True)
93
+ project_dir = tmp_path / "projects" / "demo"
94
+ project_dir.mkdir(parents=True)
94
95
  r = _run(base_env, "pdata", "init", "--project", "demo", "--write")
95
96
  assert r.returncode == 2
96
97
  assert "proposal" in r.stderr
97
98
 
99
+ # This is the FileNotFoundError/ValueError branch inside WriteLog's `with` block (project
100
+ # root resolution already succeeded), so it must still end in the ERROR sentinel.
101
+ log_content = (project_dir / "ccst-pdata-init-write.log").read_text()
102
+ assert log_content.rstrip().splitlines()[-1].startswith("ERROR: ")
103
+
98
104
 
99
105
  def test_pdata_init_write_aborts_on_bad_file_path_without_cutover(base_env, tmp_path):
100
106
  project_dir = tmp_path / "projects" / "demo"
@@ -158,6 +164,43 @@ def test_pdata_init_write_log_captures_verification_failure(base_env, tmp_path):
158
164
  assert "verification failed" in log_content.lower()
159
165
 
160
166
 
167
+ def test_pdata_init_write_success_ends_with_success_sentinel_and_verify_command(base_env, tmp_path):
168
+ project_dir = tmp_path / "projects" / "demo"
169
+ project_dir.mkdir(parents=True)
170
+ (project_dir / "ideas.csv").write_text("idea\nfirst\nsecond\n")
171
+ base_env["CCST_PDATA_BACKUP_DIR"] = str(tmp_path / "backups")
172
+
173
+ _run(base_env, "pdata", "init", "--project", "demo")
174
+ r_write = _run(base_env, "pdata", "init", "--project", "demo", "--write")
175
+
176
+ assert r_write.returncode == 0, r_write.stderr
177
+ assert "ccst pdata verify --project demo --full" in r_write.stdout
178
+ assert r_write.stdout.rstrip().splitlines()[-1] == "SUCCESS"
179
+
180
+ log_content = (project_dir / "ccst-pdata-init-write.log").read_text()
181
+ assert log_content.rstrip().splitlines()[-1] == "SUCCESS"
182
+
183
+
184
+ def test_pdata_init_write_verification_failure_ends_with_error_sentinel(base_env, tmp_path):
185
+ project_dir = tmp_path / "projects" / "demo"
186
+ project_dir.mkdir(parents=True)
187
+ (project_dir / "docs.csv").write_text("doc_path,note\n/etc/passwd,bad\n")
188
+ base_env["CCST_PDATA_BACKUP_DIR"] = str(tmp_path / "backups")
189
+
190
+ _run(base_env, "pdata", "init", "--project", "demo")
191
+ proposal_path = project_dir / ".ccst-pdata-proposal.json"
192
+ data = json.loads(proposal_path.read_text())
193
+ data["entries"][0]["file_path_column"] = "doc_path"
194
+ proposal_path.write_text(json.dumps(data))
195
+
196
+ r_write = _run(base_env, "pdata", "init", "--project", "demo", "--write")
197
+
198
+ assert r_write.returncode == 1
199
+ assert r_write.stdout.rstrip().splitlines()[-1].startswith("ERROR: ")
200
+ log_content = (project_dir / "ccst-pdata-init-write.log").read_text()
201
+ assert log_content.rstrip().splitlines()[-1].startswith("ERROR: ")
202
+
203
+
161
204
  def test_pdata_init_rehearse_does_not_touch_real_project(base_env, tmp_path):
162
205
  project_dir = tmp_path / "projects" / "demo"
163
206
  project_dir.mkdir(parents=True)