cc-session-tools 2.7.2__tar.gz → 2.8.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 (253) hide show
  1. {cc_session_tools-2.7.2/src/cc_session_tools.egg-info → cc_session_tools-2.8.0}/PKG-INFO +1 -1
  2. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/pyproject.toml +3 -3
  3. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/cli/ccst.py +41 -0
  4. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/pdata/init_paths.py +1 -1
  5. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/pdata/init_service.py +1 -1
  6. cc_session_tools-2.8.0/src/cc_session_tools/prompts/pdata-migration-claude-md-update.md +10 -0
  7. cc_session_tools-2.8.0/src/cc_session_tools/prompts/pdata-migration-skills-update.md +10 -0
  8. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0/src/cc_session_tools.egg-info}/PKG-INFO +1 -1
  9. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools.egg-info/SOURCES.txt +2 -0
  10. cc_session_tools-2.8.0/tests/test_ccst_bundle_discovery.py +91 -0
  11. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_pdata_init_cli.py +12 -0
  12. cc_session_tools-2.7.2/tests/test_ccst_bundle_discovery.py +0 -52
  13. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/LICENSE +0 -0
  14. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/README.md +0 -0
  15. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/setup.cfg +0 -0
  16. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/__init__.py +0 -0
  17. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/cli/__init__.py +0 -0
  18. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/cli/ccd.py +0 -0
  19. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/cli/ccmsg.py +0 -0
  20. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/cli/ccr.py +0 -0
  21. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/cli/ccs.py +0 -0
  22. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/cli/ccsched.py +0 -0
  23. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/cli/migrate_ccmsg.py +0 -0
  24. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/cli/migrate_ccsched.py +0 -0
  25. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/cli/migrate_sessions_db.py +0 -0
  26. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/cli/migrate_telemetry.py +0 -0
  27. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/config/hooks-bundle.json +0 -0
  28. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/config/session-tag-hook.json +0 -0
  29. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/hooks_install.py +0 -0
  30. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/__init__.py +0 -0
  31. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/claude_flags.py +0 -0
  32. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/claude_md_install.py +0 -0
  33. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/context_overrides.py +0 -0
  34. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/db.py +0 -0
  35. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/debug.py +0 -0
  36. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/doctor.py +0 -0
  37. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/doctor_mutes.py +0 -0
  38. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/hook_registry.py +0 -0
  39. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/install_sync.py +0 -0
  40. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/levenshtein.py +0 -0
  41. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/messaging/__init__.py +0 -0
  42. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/messaging/addressing.py +0 -0
  43. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/messaging/cursor.py +0 -0
  44. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/messaging/lock.py +0 -0
  45. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/messaging/message.py +0 -0
  46. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/messaging/move_safety.py +0 -0
  47. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/messaging/repository.py +0 -0
  48. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/messaging/retention.py +0 -0
  49. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/messaging/service.py +0 -0
  50. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/messaging/store.py +0 -0
  51. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/paths.py +0 -0
  52. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/pdata/__init__.py +0 -0
  53. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/pdata/backup.py +0 -0
  54. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/pdata/classify.py +0 -0
  55. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/pdata/cutover.py +0 -0
  56. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/pdata/formatting.py +0 -0
  57. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/pdata/importers.py +0 -0
  58. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/pdata/manifest.py +0 -0
  59. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/pdata/naming.py +0 -0
  60. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/pdata/repository.py +0 -0
  61. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/pdata/service.py +0 -0
  62. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/pdata/session_output.py +0 -0
  63. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/pdata/store.py +0 -0
  64. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/pdata/verify.py +0 -0
  65. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/pdata/write_log.py +0 -0
  66. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/picker.py +0 -0
  67. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/proc_lock.py +0 -0
  68. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/prompts.py +0 -0
  69. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/roots.py +0 -0
  70. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/rules.py +0 -0
  71. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/__init__.py +0 -0
  72. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/bundled_jobs.py +0 -0
  73. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/cadence.py +0 -0
  74. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/cursor.py +0 -0
  75. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/digest.py +0 -0
  76. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/due.py +0 -0
  77. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/duration.py +0 -0
  78. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/jobspec.py +0 -0
  79. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/ledger.py +0 -0
  80. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/lock.py +0 -0
  81. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/notify.py +0 -0
  82. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/reconcile.py +0 -0
  83. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/registry.py +0 -0
  84. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/runner.py +0 -0
  85. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/state.py +0 -0
  86. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/store.py +0 -0
  87. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/surface.py +0 -0
  88. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/throttle.py +0 -0
  89. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/scheduler/worker.py +0 -0
  90. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/session_gc.py +0 -0
  91. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/sessions.py +0 -0
  92. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/sessions_db.py +0 -0
  93. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/sessions_repair.py +0 -0
  94. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/shell_install.py +0 -0
  95. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/tasklist.py +0 -0
  96. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/lib/telemetry_store.py +0 -0
  97. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/analyse-cc-usage/SKILL.md +0 -0
  98. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/context-override/SKILL.md +0 -0
  99. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/delete-sessions/SKILL.md +0 -0
  100. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/delete-sessions/scripts/delete_sessions.py +0 -0
  101. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/do-executor-critic-assessor-loop/SKILL.md +0 -0
  102. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/find-claude-code-session/SKILL.md +0 -0
  103. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/generate-8digit-code/SKILL.md +0 -0
  104. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/generate-8digit-code/scripts/generate_8digit_code.py +0 -0
  105. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/list-empty-sessions/SKILL.md +0 -0
  106. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/list-empty-sessions/scripts/list_empty_sessions.py +0 -0
  107. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/manage-recurring-cc-jobs-using-ccsched/SKILL.md +0 -0
  108. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/move-session/SKILL.md +0 -0
  109. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/move-session/hooks/sessionstart-pending-rename.sh +0 -0
  110. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/move-session/scripts/cc_session_rules.py +0 -0
  111. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/move-session/scripts/move_session.py +0 -0
  112. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/pm-pdata-conflict-resolution/SKILL.md +0 -0
  113. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/pm-pdata-schema-design/SKILL.md +0 -0
  114. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/pm-project-init/SKILL.md +0 -0
  115. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/pm-update-central-files/SKILL.md +0 -0
  116. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/reduce-persistent-context/CALIBRATION.md +0 -0
  117. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/reduce-persistent-context/SKILL.md +0 -0
  118. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/reduce-persistent-context/scripts/analyze_context.py +0 -0
  119. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/reduce-persistent-context/scripts/duplicates.py +0 -0
  120. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/reduce-persistent-context/scripts/measure.py +0 -0
  121. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/reduce-persistent-context/scripts/report.py +0 -0
  122. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/reduce-persistent-context/scripts/tokens.py +0 -0
  123. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/reduce-persistent-context/scripts/usage.py +0 -0
  124. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/select-agent-model/SKILL.md +0 -0
  125. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/send-session-message/SKILL.md +0 -0
  126. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/update-command-cache/SKILL.md +0 -0
  127. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools/skills/update-command-cache/scripts/update_command_cache.py +0 -0
  128. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools.egg-info/dependency_links.txt +0 -0
  129. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools.egg-info/entry_points.txt +0 -0
  130. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools.egg-info/requires.txt +0 -0
  131. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cc_session_tools.egg-info/top_level.txt +0 -0
  132. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/__init__.py +0 -0
  133. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/after_response.py +0 -0
  134. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/bash_hard_deny.py +0 -0
  135. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/bash_security_review.py +0 -0
  136. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/cache.py +0 -0
  137. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/catchup.py +0 -0
  138. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/confirm_8digit.py +0 -0
  139. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/context_window_warning.py +0 -0
  140. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/last_screenshot.py +0 -0
  141. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/marker_allow.py +0 -0
  142. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/markers.py +0 -0
  143. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/messaging_deliver.py +0 -0
  144. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/model_info.py +0 -0
  145. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/normalise.py +0 -0
  146. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/pending_migration.py +0 -0
  147. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/pending_rename.py +0 -0
  148. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/session_tag.py +0 -0
  149. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/stats.py +0 -0
  150. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/telemetry.py +0 -0
  151. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/telemetry_query.py +0 -0
  152. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/telemetry_trim.py +0 -0
  153. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/transcript.py +0 -0
  154. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/cccs_hooks/worklog_guard.py +0 -0
  155. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/claude_code_usage/__init__.py +0 -0
  156. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/claude_code_usage/attribution.py +0 -0
  157. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/claude_code_usage/cache.py +0 -0
  158. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/claude_code_usage/ccusage_wrapper.py +0 -0
  159. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/claude_code_usage/cli.py +0 -0
  160. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/claude_code_usage/data/pricing.json +0 -0
  161. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/claude_code_usage/parent_inference.py +0 -0
  162. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/claude_code_usage/parser.py +0 -0
  163. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/claude_code_usage/pricing.py +0 -0
  164. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/claude_code_usage/query.py +0 -0
  165. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/claude_code_usage/report.py +0 -0
  166. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/claude_code_usage/schema.py +0 -0
  167. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/src/claude_code_usage/session_names.py +0 -0
  168. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_after_response.py +0 -0
  169. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_attribution.py +0 -0
  170. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_bash_hard_deny.py +0 -0
  171. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_bash_security_review.py +0 -0
  172. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_cache.py +0 -0
  173. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_cache_sqlite.py +0 -0
  174. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccr_orphans.py +0 -0
  175. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccs_emptiness.py +0 -0
  176. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccs_eta.py +0 -0
  177. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccs_list_mode.py +0 -0
  178. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccs_scope_flags.py +0 -0
  179. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccs_sentinel_sort.py +0 -0
  180. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccs_session_counts.py +0 -0
  181. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_ccsched_jobs_cli.py +0 -0
  182. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_cli.py +0 -0
  183. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_context_override_cli.py +0 -0
  184. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_doctor.py +0 -0
  185. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_gc_report.py +0 -0
  186. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_hook_dispatcher.py +0 -0
  187. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_hooks_install_prune.py +0 -0
  188. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_hooks_install_zero_arg.py +0 -0
  189. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_hooks_uninstall.py +0 -0
  190. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_install_everything.py +0 -0
  191. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_main_gate.py +0 -0
  192. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_pdata_cli.py +0 -0
  193. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_pdata_reconcile_cli.py +0 -0
  194. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_pdata_verify_cli.py +0 -0
  195. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_repair_sessions_cli.py +0 -0
  196. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_sessions_cli.py +0 -0
  197. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_shell_install.py +0 -0
  198. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_skills_install.py +0 -0
  199. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_skills_uninstall.py +0 -0
  200. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_telemetry_query.py +0 -0
  201. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccst_telemetry_trim.py +0 -0
  202. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_ccusage_wrapper.py +0 -0
  203. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_claude_flags.py +0 -0
  204. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_claude_md_install.py +0 -0
  205. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_cli.py +0 -0
  206. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_cli_ccd.py +0 -0
  207. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_cli_ccd_dry_run.py +0 -0
  208. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_cli_ccr.py +0 -0
  209. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_cli_ccs.py +0 -0
  210. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_cli_version.py +0 -0
  211. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_confirm_8digit.py +0 -0
  212. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_context_overrides.py +0 -0
  213. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_context_window_warning.py +0 -0
  214. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_db.py +0 -0
  215. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_debug.py +0 -0
  216. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_doctor_mutes.py +0 -0
  217. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_empty_session.py +0 -0
  218. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_hook_cache.py +0 -0
  219. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_hooks_install.py +0 -0
  220. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_install_sync.py +0 -0
  221. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_last_screenshot.py +0 -0
  222. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_levenshtein.py +0 -0
  223. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_marker_allow.py +0 -0
  224. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_migrate_ccmsg.py +0 -0
  225. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_migrate_ccsched.py +0 -0
  226. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_migrate_sessions_db.py +0 -0
  227. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_migrate_telemetry.py +0 -0
  228. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_model_info.py +0 -0
  229. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_normalise.py +0 -0
  230. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_parent_inference.py +0 -0
  231. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_parser.py +0 -0
  232. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_paths.py +0 -0
  233. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_pending_migration_hook.py +0 -0
  234. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_picker.py +0 -0
  235. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_pricing.py +0 -0
  236. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_proc_lock.py +0 -0
  237. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_prompts.py +0 -0
  238. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_query.py +0 -0
  239. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_report.py +0 -0
  240. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_roots.py +0 -0
  241. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_rules.py +0 -0
  242. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_scheduler_bundled_jobs.py +0 -0
  243. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_schema.py +0 -0
  244. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_session_names.py +0 -0
  245. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_session_tag.py +0 -0
  246. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_sessions.py +0 -0
  247. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_sessions_db.py +0 -0
  248. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_sessions_repair.py +0 -0
  249. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_tasklist.py +0 -0
  250. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_telemetry.py +0 -0
  251. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_telemetry_store.py +0 -0
  252. {cc_session_tools-2.7.2 → cc_session_tools-2.8.0}/tests/test_transcript.py +0 -0
  253. {cc_session_tools-2.7.2 → cc_session_tools-2.8.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: 2.7.2
3
+ Version: 2.8.0
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.2"
7
+ version = "2.8.0"
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" }
@@ -62,11 +62,11 @@ where = ["src"]
62
62
  # only filters within the file's *own* discovered package, and a wrongly
63
63
  # auto-discovered "cc_session_tools.skills.<name>.tests" package was never
64
64
  # covered by an exclude-package-data entry keyed just "cc_session_tools").
65
- exclude = ["cc_session_tools.skills", "cc_session_tools.skills.*", "cc_session_tools.config", "cc_session_tools.config.*"]
65
+ exclude = ["cc_session_tools.skills", "cc_session_tools.skills.*", "cc_session_tools.config", "cc_session_tools.config.*", "cc_session_tools.prompts", "cc_session_tools.prompts.*"]
66
66
 
67
67
  [tool.setuptools.package-data]
68
68
  claude_code_usage = ["data/*.json"]
69
- cc_session_tools = ["skills/**/*", "config/*"]
69
+ cc_session_tools = ["skills/**/*", "config/*", "prompts/**/*"]
70
70
 
71
71
  [tool.setuptools.exclude-package-data]
72
72
  cc_session_tools = ["**/tests/*", "**/__pycache__/*"]
@@ -122,6 +122,40 @@ def _discover_bundle() -> Path:
122
122
  )
123
123
 
124
124
 
125
+ def _discover_prompts_dir() -> Path:
126
+ """Return the bundled prompts/ directory (pdata-migration follow-up prompts).
127
+
128
+ prompts/ is packaged inside cc_session_tools the same way skills/ and config/ are (see
129
+ _discover_source_dir) - src/cc_session_tools/cli/ccst.py -> ../prompts. No install-location
130
+ fallback, same reasoning as the other two: a fallback here would just mask a broken install.
131
+ """
132
+ candidate = Path(__file__).resolve().parent.parent / "prompts"
133
+ if candidate.is_dir():
134
+ return candidate
135
+ raise FileNotFoundError(
136
+ "Cannot locate bundled prompts/ directory. Run from the source tree or reinstall ccst."
137
+ )
138
+
139
+
140
+ def _print_migration_prompt_reminders(*labeled_filenames: tuple[str, str]) -> None:
141
+ """Print one "<label>: <path>" reminder line per (label, filename) pair, for the bundled
142
+ prompts/ directory.
143
+
144
+ Best-effort, deliberately swallowing a missing prompts/ directory: these reminders are a
145
+ nicety layered on top of an otherwise-already-completed classification or migration, not
146
+ the operation itself — a broken/partial install must never turn a successful --write (rows
147
+ already written, files already cut over) or dry-run (proposal already written) into a
148
+ reported failure just because this follow-up reminder couldn't be printed.
149
+ """
150
+ try:
151
+ prompts_dir = _discover_prompts_dir()
152
+ except FileNotFoundError as exc:
153
+ print(f"({exc})", file=sys.stderr)
154
+ return
155
+ for label, filename in labeled_filenames:
156
+ print(f"{label}: {prompts_dir / filename}")
157
+
158
+
125
159
  # ---------- skills install ----------
126
160
 
127
161
 
@@ -1056,6 +1090,9 @@ def _cmd_pdata_init(args: argparse.Namespace) -> int:
1056
1090
  return 2
1057
1091
  print(result.report)
1058
1092
  print(f"\nProposal: {result.proposal_path}")
1093
+ _print_migration_prompt_reminders(
1094
+ ("After a successful --write, update project docs", "pdata-migration-claude-md-update.md"),
1095
+ )
1059
1096
  return 0
1060
1097
 
1061
1098
  try:
@@ -1091,6 +1128,10 @@ def _cmd_pdata_init(args: argparse.Namespace) -> int:
1091
1128
  print()
1092
1129
  print(write_result.report) # spec §7.1 step 4's diff report, for review
1093
1130
  print(f"\nVerify: ccst pdata verify --project {args.project} --full")
1131
+ _print_migration_prompt_reminders(
1132
+ ("Update project docs", "pdata-migration-claude-md-update.md"),
1133
+ ("Update consuming skills", "pdata-migration-skills-update.md"),
1134
+ )
1094
1135
  print("SUCCESS")
1095
1136
  return 0
1096
1137
 
@@ -76,7 +76,7 @@ def backup_dir_override(rehearse: Path | None) -> Iterator[None]:
76
76
  whatever CCST_PDATA_BACKUP_DIR is already set to), by reusing this plan's own
77
77
  backup.BACKUP_DIR_ENV seam — mirrors project_db_dir_override's shape exactly.
78
78
  Without this, a rehearsed --write would still deposit a
79
- <project>-<epoch>.tar.gz into the same directory a genuine production
79
+ <project>-<YYYYMMDD-HHMMSS>.tar.gz into the same directory a genuine production
80
80
  migration's backup would use, indistinguishable by filename. No-op when
81
81
  rehearse is None."""
82
82
  if rehearse is None:
@@ -164,7 +164,7 @@ def write(
164
164
  # A's CCST_PROJECT_DB_DIR seam), backup_dir_override redirects where
165
165
  # backup.create_backup() below writes its tar.gz (this module's own
166
166
  # CCST_PDATA_BACKUP_DIR seam). Without the second seam, a rehearsed --write
167
- # would still deposit a real <project>-<epoch>.tar.gz into the production
167
+ # would still deposit a real <project>-<YYYYMMDD-HHMMSS>.tar.gz into the production
168
168
  # backup directory — indistinguishable by filename from a genuine migration's
169
169
  # backup. Both are no-ops when rehearse is None.
170
170
  with (
@@ -0,0 +1,10 @@
1
+ # pdata migration — project doc update (PLACEHOLDER)
2
+
3
+ Status: **PLACEHOLDER** — this prompt's real step-by-step content is deliberately gated on a
4
+ design conversation about `~/cc/<project>` scaffolding conventions (2026-08-20). See:
5
+
6
+ `docs/superpowers/specs/2026-08-20-pdata-migration-prompts-design.md` (§"Prompt content —
7
+ informed by a first-pass survey, not fully speced here").
8
+
9
+ Do not run this prompt expecting real guidance yet — it exists only so `ccst pdata init` has a
10
+ real, bundled file to point at ahead of that conversation happening.
@@ -0,0 +1,10 @@
1
+ # pdata migration — consuming-skills update (PLACEHOLDER)
2
+
3
+ Status: **PLACEHOLDER** — this prompt's real step-by-step content is deliberately gated on the
4
+ same design conversation as the doc-update prompt. See:
5
+
6
+ `docs/superpowers/specs/2026-08-20-pdata-migration-prompts-design.md` (§"Prompt content —
7
+ informed by a first-pass survey, not fully speced here").
8
+
9
+ Do not run this prompt expecting real guidance yet — it exists only so `ccst pdata init` has a
10
+ real, bundled file to point at ahead of that conversation happening.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cc-session-tools
3
- Version: 2.7.2
3
+ Version: 2.8.0
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
@@ -91,6 +91,8 @@ src/cc_session_tools/lib/scheduler/store.py
91
91
  src/cc_session_tools/lib/scheduler/surface.py
92
92
  src/cc_session_tools/lib/scheduler/throttle.py
93
93
  src/cc_session_tools/lib/scheduler/worker.py
94
+ src/cc_session_tools/prompts/pdata-migration-claude-md-update.md
95
+ src/cc_session_tools/prompts/pdata-migration-skills-update.md
94
96
  src/cc_session_tools/skills/analyse-cc-usage/SKILL.md
95
97
  src/cc_session_tools/skills/context-override/SKILL.md
96
98
  src/cc_session_tools/skills/delete-sessions/SKILL.md
@@ -0,0 +1,91 @@
1
+ """Tests for ccst.py's `_discover_source_dir`/`_discover_bundle`/`_discover_prompts_dir` —
2
+ must resolve the bundled skills/, config/, and prompts/ correctly whether cc_session_tools is
3
+ running from an editable source checkout or an installed wheel, since all three layouts place
4
+ cc_session_tools/skills/, cc_session_tools/config/, and cc_session_tools/prompts/ at the same
5
+ relative depth from this module (src/cc_session_tools/cli/ccst.py -> ../skills, ../config,
6
+ ../prompts)."""
7
+ from __future__ import annotations
8
+
9
+ from pathlib import Path
10
+
11
+ import pytest
12
+
13
+ from cc_session_tools.cli import ccst
14
+
15
+
16
+ def test_discover_source_dir_finds_the_real_bundled_skills_dir():
17
+ result = ccst._discover_source_dir()
18
+ assert result.is_dir()
19
+ assert result.name == "skills"
20
+ # Sits directly inside the cc_session_tools package, not at the repo root -
21
+ # this is what makes it resolve the same way in an installed wheel.
22
+ assert result.parent.name == "cc_session_tools"
23
+ assert (result / "delete-sessions" / "SKILL.md").is_file()
24
+
25
+
26
+ def test_discover_bundle_finds_the_real_bundled_hooks_bundle_json():
27
+ result = ccst._discover_bundle()
28
+ assert result.is_file()
29
+ assert result.name == "hooks-bundle.json"
30
+ assert result.parent.name == "config"
31
+ assert result.parent.parent.name == "cc_session_tools"
32
+
33
+
34
+ def test_discover_source_dir_raises_clearly_when_package_relocated_away(monkeypatch, tmp_path):
35
+ """Simulate a broken install (module file present, no sibling skills/ dir) -
36
+ must fail loudly, not silently return an unrelated directory."""
37
+ fake_module_file = tmp_path / "cc_session_tools" / "cli" / "ccst.py"
38
+ fake_module_file.parent.mkdir(parents=True)
39
+ fake_module_file.touch()
40
+ monkeypatch.setattr(ccst, "__file__", str(fake_module_file))
41
+
42
+ with pytest.raises(FileNotFoundError, match="Cannot locate bundled skills"):
43
+ ccst._discover_source_dir()
44
+
45
+
46
+ def test_discover_bundle_raises_clearly_when_package_relocated_away(monkeypatch, tmp_path):
47
+ fake_module_file = tmp_path / "cc_session_tools" / "cli" / "ccst.py"
48
+ fake_module_file.parent.mkdir(parents=True)
49
+ fake_module_file.touch()
50
+ monkeypatch.setattr(ccst, "__file__", str(fake_module_file))
51
+
52
+ with pytest.raises(FileNotFoundError, match="Cannot locate bundled config/hooks-bundle.json"):
53
+ ccst._discover_bundle()
54
+
55
+
56
+ def test_discover_prompts_dir_finds_the_real_bundled_prompts():
57
+ result = ccst._discover_prompts_dir()
58
+ assert result.is_dir()
59
+ assert result.name == "prompts"
60
+ assert result.parent.name == "cc_session_tools"
61
+ assert (result / "pdata-migration-claude-md-update.md").is_file()
62
+ assert (result / "pdata-migration-skills-update.md").is_file()
63
+
64
+
65
+ def test_discover_prompts_dir_raises_clearly_when_package_relocated_away(monkeypatch, tmp_path):
66
+ fake_module_file = tmp_path / "cc_session_tools" / "cli" / "ccst.py"
67
+ fake_module_file.parent.mkdir(parents=True)
68
+ fake_module_file.touch()
69
+ monkeypatch.setattr(ccst, "__file__", str(fake_module_file))
70
+
71
+ with pytest.raises(FileNotFoundError, match="Cannot locate bundled prompts"):
72
+ ccst._discover_prompts_dir()
73
+
74
+
75
+ def test_print_migration_prompt_reminders_degrades_gracefully_when_prompts_dir_missing(
76
+ monkeypatch, capsys
77
+ ):
78
+ """Regression test: these reminders are a nicety layered on top of an
79
+ already-completed classification or migration, not the operation itself — a
80
+ broken/partial install must not raise and turn a completed --write into a
81
+ reported failure just because the bundled prompts/ directory is missing."""
82
+ def _raise() -> Path:
83
+ raise FileNotFoundError("Cannot locate bundled prompts/ directory.")
84
+
85
+ monkeypatch.setattr(ccst, "_discover_prompts_dir", _raise)
86
+
87
+ ccst._print_migration_prompt_reminders(("Update project docs", "some-prompt.md"))
88
+
89
+ captured = capsys.readouterr()
90
+ assert captured.out == "" # nothing bogus printed to stdout (would land in --write's log)
91
+ assert "Cannot locate bundled prompts" in captured.err
@@ -47,6 +47,16 @@ def test_pdata_init_dry_run_classifies_and_writes_proposal(base_env, tmp_path):
47
47
  assert (project_dir / ".ccst-pdata-proposal.json").exists()
48
48
 
49
49
 
50
+ def test_pdata_init_dry_run_prints_doc_update_prompt_path(base_env, tmp_path):
51
+ project_dir = tmp_path / "projects" / "demo"
52
+ project_dir.mkdir(parents=True)
53
+ (project_dir / "ideas.csv").write_text("idea\nfirst\n")
54
+
55
+ r = _run(base_env, "pdata", "init", "--project", "demo")
56
+ assert r.returncode == 0, r.stderr
57
+ assert "pdata-migration-claude-md-update.md" in r.stdout
58
+
59
+
50
60
  def test_pdata_init_rejects_bad_project_name(base_env):
51
61
  r = _run(base_env, "pdata", "init", "--project", "../escape")
52
62
  assert r.returncode == 2
@@ -175,6 +185,8 @@ def test_pdata_init_write_success_ends_with_success_sentinel_and_verify_command(
175
185
 
176
186
  assert r_write.returncode == 0, r_write.stderr
177
187
  assert "ccst pdata verify --project demo --full" in r_write.stdout
188
+ assert "pdata-migration-claude-md-update.md" in r_write.stdout
189
+ assert "pdata-migration-skills-update.md" in r_write.stdout
178
190
  assert r_write.stdout.rstrip().splitlines()[-1] == "SUCCESS"
179
191
 
180
192
  log_content = (project_dir / "ccst-pdata-init-write.log").read_text()
@@ -1,52 +0,0 @@
1
- """Tests for ccst.py's `_discover_source_dir`/`_discover_bundle` — must resolve the
2
- bundled skills/ and config/ correctly whether cc_session_tools is running from an
3
- editable source checkout or an installed wheel, since both layouts place
4
- cc_session_tools/skills/ and cc_session_tools/config/ at the same relative depth from
5
- this module (src/cc_session_tools/cli/ccst.py -> ../skills, ../config)."""
6
- from __future__ import annotations
7
-
8
- from pathlib import Path
9
-
10
- import pytest
11
-
12
- from cc_session_tools.cli import ccst
13
-
14
-
15
- def test_discover_source_dir_finds_the_real_bundled_skills_dir():
16
- result = ccst._discover_source_dir()
17
- assert result.is_dir()
18
- assert result.name == "skills"
19
- # Sits directly inside the cc_session_tools package, not at the repo root -
20
- # this is what makes it resolve the same way in an installed wheel.
21
- assert result.parent.name == "cc_session_tools"
22
- assert (result / "delete-sessions" / "SKILL.md").is_file()
23
-
24
-
25
- def test_discover_bundle_finds_the_real_bundled_hooks_bundle_json():
26
- result = ccst._discover_bundle()
27
- assert result.is_file()
28
- assert result.name == "hooks-bundle.json"
29
- assert result.parent.name == "config"
30
- assert result.parent.parent.name == "cc_session_tools"
31
-
32
-
33
- def test_discover_source_dir_raises_clearly_when_package_relocated_away(monkeypatch, tmp_path):
34
- """Simulate a broken install (module file present, no sibling skills/ dir) -
35
- must fail loudly, not silently return an unrelated directory."""
36
- fake_module_file = tmp_path / "cc_session_tools" / "cli" / "ccst.py"
37
- fake_module_file.parent.mkdir(parents=True)
38
- fake_module_file.touch()
39
- monkeypatch.setattr(ccst, "__file__", str(fake_module_file))
40
-
41
- with pytest.raises(FileNotFoundError, match="Cannot locate bundled skills"):
42
- ccst._discover_source_dir()
43
-
44
-
45
- def test_discover_bundle_raises_clearly_when_package_relocated_away(monkeypatch, tmp_path):
46
- fake_module_file = tmp_path / "cc_session_tools" / "cli" / "ccst.py"
47
- fake_module_file.parent.mkdir(parents=True)
48
- fake_module_file.touch()
49
- monkeypatch.setattr(ccst, "__file__", str(fake_module_file))
50
-
51
- with pytest.raises(FileNotFoundError, match="Cannot locate bundled config/hooks-bundle.json"):
52
- ccst._discover_bundle()