cc-session-tools 3.5.2__tar.gz → 3.5.3__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 (283) hide show
  1. {cc_session_tools-3.5.2/src/cc_session_tools.egg-info → cc_session_tools-3.5.3}/PKG-INFO +1 -1
  2. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/pyproject.toml +1 -1
  3. cc_session_tools-3.5.3/src/cc_session_tools/skills/update-command-cache/SKILL.md +79 -0
  4. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/update-command-cache/scripts/update_command_cache.py +12 -10
  5. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3/src/cc_session_tools.egg-info}/PKG-INFO +1 -1
  6. cc_session_tools-3.5.2/src/cc_session_tools/skills/update-command-cache/SKILL.md +0 -57
  7. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/LICENSE +0 -0
  8. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/README.md +0 -0
  9. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/setup.cfg +0 -0
  10. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/__init__.py +0 -0
  11. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/cli/__init__.py +0 -0
  12. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/cli/ccd.py +0 -0
  13. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/cli/ccmsg.py +0 -0
  14. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/cli/ccr.py +0 -0
  15. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/cli/ccs.py +0 -0
  16. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/cli/ccsched.py +0 -0
  17. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/cli/ccst.py +0 -0
  18. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/cli/migrate_ccmsg.py +0 -0
  19. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/cli/migrate_ccsched.py +0 -0
  20. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/cli/migrate_sessions_db.py +0 -0
  21. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/cli/migrate_telemetry.py +0 -0
  22. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/config/hooks-bundle.json +0 -0
  23. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/config/session-tag-hook.json +0 -0
  24. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/hooks_install.py +0 -0
  25. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/__init__.py +0 -0
  26. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/claude_flags.py +0 -0
  27. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/claude_md_install.py +0 -0
  28. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/context_overrides.py +0 -0
  29. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/db.py +0 -0
  30. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/debug.py +0 -0
  31. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/doctor.py +0 -0
  32. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/doctor_mutes.py +0 -0
  33. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/hook_registry.py +0 -0
  34. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/install_sync.py +0 -0
  35. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/levenshtein.py +0 -0
  36. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/machine_identity.py +0 -0
  37. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/messaging/__init__.py +0 -0
  38. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/messaging/addressing.py +0 -0
  39. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/messaging/cursor.py +0 -0
  40. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/messaging/lock.py +0 -0
  41. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/messaging/message.py +0 -0
  42. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/messaging/move_safety.py +0 -0
  43. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/messaging/repository.py +0 -0
  44. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/messaging/retention.py +0 -0
  45. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/messaging/service.py +0 -0
  46. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/messaging/store.py +0 -0
  47. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/occupancy.py +0 -0
  48. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/paths.py +0 -0
  49. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/__init__.py +0 -0
  50. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/backup.py +0 -0
  51. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/classify.py +0 -0
  52. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/cutover.py +0 -0
  53. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/dump.py +0 -0
  54. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/formatting.py +0 -0
  55. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/importers.py +0 -0
  56. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/init_paths.py +0 -0
  57. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/init_service.py +0 -0
  58. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/manifest.py +0 -0
  59. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/naming.py +0 -0
  60. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/rehydrate.py +0 -0
  61. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/rename_group.py +0 -0
  62. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/reorganize.py +0 -0
  63. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/repository.py +0 -0
  64. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/resolve.py +0 -0
  65. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/service.py +0 -0
  66. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/session_output.py +0 -0
  67. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/store.py +0 -0
  68. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/sync_check.py +0 -0
  69. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/sync_lock.py +0 -0
  70. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/sync_notify.py +0 -0
  71. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/vector_clock.py +0 -0
  72. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/vector_clock_store.py +0 -0
  73. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/verify.py +0 -0
  74. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/pdata/write_log.py +0 -0
  75. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/picker.py +0 -0
  76. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/proc_lock.py +0 -0
  77. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/prompts.py +0 -0
  78. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/roots.py +0 -0
  79. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/rules.py +0 -0
  80. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/__init__.py +0 -0
  81. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/bundled_jobs.py +0 -0
  82. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/cadence.py +0 -0
  83. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/cursor.py +0 -0
  84. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/digest.py +0 -0
  85. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/due.py +0 -0
  86. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/duration.py +0 -0
  87. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/jobspec.py +0 -0
  88. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/ledger.py +0 -0
  89. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/lock.py +0 -0
  90. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/notify.py +0 -0
  91. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/reconcile.py +0 -0
  92. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/registry.py +0 -0
  93. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/runner.py +0 -0
  94. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/state.py +0 -0
  95. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/store.py +0 -0
  96. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/surface.py +0 -0
  97. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/throttle.py +0 -0
  98. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/scheduler/worker.py +0 -0
  99. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/session_gc.py +0 -0
  100. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/sessions.py +0 -0
  101. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/sessions_db.py +0 -0
  102. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/sessions_repair.py +0 -0
  103. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/shell_install.py +0 -0
  104. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/tasklist.py +0 -0
  105. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/lib/telemetry_store.py +0 -0
  106. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/prompts/pdata-migration-claude-md-update.md +0 -0
  107. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/prompts/pdata-migration-skills-update.md +0 -0
  108. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/analyse-cc-usage/SKILL.md +0 -0
  109. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/clean-hook-sessions/SKILL.md +0 -0
  110. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/clean-hook-sessions/scripts/clean-hook-sessions.py +0 -0
  111. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/compact-smart/SKILL.md +0 -0
  112. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/context-override/SKILL.md +0 -0
  113. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/delete-sessions/SKILL.md +0 -0
  114. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/delete-sessions/scripts/delete_sessions.py +0 -0
  115. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/do-executor-critic-assessor-loop/SKILL.md +0 -0
  116. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/extract-pptx/SKILL.md +0 -0
  117. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/extract-pptx/scripts/extract_pptx.py +0 -0
  118. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/extract-to-text/SKILL.md +0 -0
  119. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/extract-to-text/scripts/extract_to_text.py +0 -0
  120. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/find-claude-code-session/SKILL.md +0 -0
  121. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/generate-8digit-code/SKILL.md +0 -0
  122. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/generate-8digit-code/scripts/generate_8digit_code.py +0 -0
  123. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/list-empty-sessions/SKILL.md +0 -0
  124. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/list-empty-sessions/scripts/list_empty_sessions.py +0 -0
  125. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/manage-recurring-cc-jobs-using-ccsched/SKILL.md +0 -0
  126. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/move-session/SKILL.md +0 -0
  127. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/move-session/hooks/sessionstart-pending-rename.sh +0 -0
  128. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/move-session/scripts/cc_session_rules.py +0 -0
  129. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/move-session/scripts/move_session.py +0 -0
  130. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/pm-pdata-design-schema/SKILL.md +0 -0
  131. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/pm-pdata-do-audit-and-prepare-to-migrate/SKILL.md +0 -0
  132. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/pm-pdata-do-init/SKILL.md +0 -0
  133. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/pm-pdata-do-manual-migration/SKILL.md +0 -0
  134. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/pm-pdata-resolve-conflicts/SKILL.md +0 -0
  135. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/pm-project-layout-reference/SKILL.md +0 -0
  136. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/pm-update-central-files/SKILL.md +0 -0
  137. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/reduce-persistent-context/CALIBRATION.md +0 -0
  138. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/reduce-persistent-context/SKILL.md +0 -0
  139. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/reduce-persistent-context/scripts/analyze_context.py +0 -0
  140. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/reduce-persistent-context/scripts/duplicates.py +0 -0
  141. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/reduce-persistent-context/scripts/measure.py +0 -0
  142. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/reduce-persistent-context/scripts/report.py +0 -0
  143. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/reduce-persistent-context/scripts/tokens.py +0 -0
  144. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/reduce-persistent-context/scripts/usage.py +0 -0
  145. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/select-agent-model/SKILL.md +0 -0
  146. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools/skills/send-session-message/SKILL.md +0 -0
  147. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools.egg-info/SOURCES.txt +0 -0
  148. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools.egg-info/dependency_links.txt +0 -0
  149. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools.egg-info/entry_points.txt +0 -0
  150. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools.egg-info/requires.txt +0 -0
  151. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/cc_session_tools.egg-info/top_level.txt +0 -0
  152. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/claude_code_usage/__init__.py +0 -0
  153. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/claude_code_usage/attribution.py +0 -0
  154. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/claude_code_usage/cache.py +0 -0
  155. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/claude_code_usage/ccusage_wrapper.py +0 -0
  156. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/claude_code_usage/cli.py +0 -0
  157. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/claude_code_usage/data/pricing.json +0 -0
  158. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/claude_code_usage/parent_inference.py +0 -0
  159. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/claude_code_usage/parser.py +0 -0
  160. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/claude_code_usage/pricing.py +0 -0
  161. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/claude_code_usage/query.py +0 -0
  162. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/claude_code_usage/report.py +0 -0
  163. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/claude_code_usage/schema.py +0 -0
  164. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/claude_code_usage/session_names.py +0 -0
  165. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/__init__.py +0 -0
  166. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/after_response.py +0 -0
  167. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/bash_hard_deny.py +0 -0
  168. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/bash_security_review.py +0 -0
  169. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/cache.py +0 -0
  170. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/catchup.py +0 -0
  171. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/confirm_8digit.py +0 -0
  172. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/context_window_warning.py +0 -0
  173. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/last_screenshot.py +0 -0
  174. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/marker_allow.py +0 -0
  175. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/markers.py +0 -0
  176. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/messaging_deliver.py +0 -0
  177. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/model_info.py +0 -0
  178. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/normalise.py +0 -0
  179. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/pdata_sync.py +0 -0
  180. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/pending_migration.py +0 -0
  181. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/pending_rename.py +0 -0
  182. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/session_tag.py +0 -0
  183. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/stats.py +0 -0
  184. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/telemetry.py +0 -0
  185. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/telemetry_query.py +0 -0
  186. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/telemetry_trim.py +0 -0
  187. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/transcript.py +0 -0
  188. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/src/hooks/worklog_guard.py +0 -0
  189. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_after_response.py +0 -0
  190. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_attribution.py +0 -0
  191. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_bash_hard_deny.py +0 -0
  192. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_bash_security_review.py +0 -0
  193. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_cache.py +0 -0
  194. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_cache_sqlite.py +0 -0
  195. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccr_orphans.py +0 -0
  196. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccs_emptiness.py +0 -0
  197. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccs_eta.py +0 -0
  198. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccs_list_mode.py +0 -0
  199. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccs_scope_flags.py +0 -0
  200. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccs_sentinel_sort.py +0 -0
  201. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccs_session_counts.py +0 -0
  202. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_bundle_discovery.py +0 -0
  203. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_ccsched_jobs_cli.py +0 -0
  204. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_cli.py +0 -0
  205. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_context_override_cli.py +0 -0
  206. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_doctor.py +0 -0
  207. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_gc_prune.py +0 -0
  208. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_gc_report.py +0 -0
  209. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_hook_dispatcher.py +0 -0
  210. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_hooks_install_prune.py +0 -0
  211. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_hooks_install_zero_arg.py +0 -0
  212. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_hooks_uninstall.py +0 -0
  213. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_install_everything.py +0 -0
  214. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_machine_identity_cli.py +0 -0
  215. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_main_gate.py +0 -0
  216. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_pdata_cli.py +0 -0
  217. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_pdata_init_cli.py +0 -0
  218. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_pdata_reconcile_cli.py +0 -0
  219. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_pdata_rename_group_cli.py +0 -0
  220. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_pdata_reorganize_cli.py +0 -0
  221. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_pdata_sync_cli.py +0 -0
  222. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_pdata_verify_cli.py +0 -0
  223. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_repair_sessions_cli.py +0 -0
  224. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_sessions_cli.py +0 -0
  225. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_shell_install.py +0 -0
  226. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_skills_install.py +0 -0
  227. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_skills_uninstall.py +0 -0
  228. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_telemetry_query.py +0 -0
  229. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccst_telemetry_trim.py +0 -0
  230. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_ccusage_wrapper.py +0 -0
  231. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_claude_flags.py +0 -0
  232. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_claude_md_install.py +0 -0
  233. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_cli.py +0 -0
  234. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_cli_ccd.py +0 -0
  235. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_cli_ccd_dry_run.py +0 -0
  236. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_cli_ccr.py +0 -0
  237. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_cli_ccs.py +0 -0
  238. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_cli_version.py +0 -0
  239. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_confirm_8digit.py +0 -0
  240. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_context_overrides.py +0 -0
  241. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_context_window_warning.py +0 -0
  242. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_db.py +0 -0
  243. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_debug.py +0 -0
  244. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_doctor_mutes.py +0 -0
  245. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_empty_session.py +0 -0
  246. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_hook_cache.py +0 -0
  247. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_hooks_install.py +0 -0
  248. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_install_sync.py +0 -0
  249. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_last_screenshot.py +0 -0
  250. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_levenshtein.py +0 -0
  251. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_machine_identity.py +0 -0
  252. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_marker_allow.py +0 -0
  253. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_migrate_ccmsg.py +0 -0
  254. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_migrate_ccsched.py +0 -0
  255. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_migrate_sessions_db.py +0 -0
  256. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_migrate_telemetry.py +0 -0
  257. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_model_info.py +0 -0
  258. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_normalise.py +0 -0
  259. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_occupancy.py +0 -0
  260. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_parent_inference.py +0 -0
  261. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_parser.py +0 -0
  262. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_paths.py +0 -0
  263. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_pending_migration_hook.py +0 -0
  264. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_picker.py +0 -0
  265. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_pricing.py +0 -0
  266. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_proc_lock.py +0 -0
  267. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_prompts.py +0 -0
  268. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_query.py +0 -0
  269. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_report.py +0 -0
  270. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_roots.py +0 -0
  271. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_rules.py +0 -0
  272. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_scheduler_bundled_jobs.py +0 -0
  273. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_schema.py +0 -0
  274. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_session_names.py +0 -0
  275. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_session_tag.py +0 -0
  276. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_sessions.py +0 -0
  277. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_sessions_db.py +0 -0
  278. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_sessions_repair.py +0 -0
  279. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_tasklist.py +0 -0
  280. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_telemetry.py +0 -0
  281. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_telemetry_store.py +0 -0
  282. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/tests/test_transcript.py +0 -0
  283. {cc_session_tools-3.5.2 → cc_session_tools-3.5.3}/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.5.2
3
+ Version: 3.5.3
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.5.2"
7
+ version = "3.5.3"
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" }
@@ -0,0 +1,79 @@
1
+ ---
2
+ name: update-command-cache
3
+ description: Curate the SHA-256 command cache used by the bash-security-review hook. Reads recent safe-verdict fires from telemetry.db, identifies commands not yet cached, presents them for approval, and records approved ones via hooks.cache.cache_record(). Also supports manual `remove` and `flip` subcommands on existing cache entries. Use when the user says "update the command cache", "curate cached commands", "review cache fires", "promote fires to cache", "remove a cache entry", or notices the cache is stale or polluted.
4
+ ---
5
+
6
+ # Update command cache
7
+
8
+ The `bash-security-review` hook (when run with `CCST_USE_COMMAND_CACHE=1`) records `safe`-verdict fires into the command cache at `~/.local/share/claude/command-cache.db` (SQLite, overridable via `CCST_CACHE_DB`; the legacy `command-cache.csv` is retired). Auto-fill is conservative - only verdicts that came back `safe` from the claude CLI escalation are stored. This skill is the curation tool for that cache: it lets you sweep the telemetry log for safe fires not yet captured, vet them, and bulk-promote the ones you want.
9
+
10
+ ## When to use
11
+
12
+ - "Update the command cache."
13
+ - "Sweep the fires log for cacheable commands."
14
+ - "Promote my recent claude-CLI safe fires to the cache."
15
+ - "Remove this cache entry."
16
+ - "Flip this entry from safe to suspicious."
17
+ - After tuning the heuristic flag list, when stale entries should be re-validated.
18
+
19
+ ## How it works
20
+
21
+ The bash-security-review hook records every fire to `telemetry.db`. The cache (`command-cache.db`, SQLite) holds `safe`-verdict commands keyed by their SHA-256 hash so subsequent identical commands skip the claude CLI call.
22
+
23
+ ### Relationship to bash-hard-deny
24
+
25
+ This skill and the `bash-hard-deny` hook (`src/hooks/bash_hard_deny.py`) share one convention: `CCST_FIRES_ACCESS=1`. `bash-hard-deny`'s telemetry.db-block section documents this env var as the bypass that lets a legitimate reader touch the telemetry log; this skill's own gate (in `scripts/update_command_cache.py`, `cmd_list`) refuses to read `telemetry.db` unless the same variable is set.
26
+
27
+ The two are NOT structurally coupled — the hook cannot literally intercept this skill's Python-internal file read, so setting the variable is what actually unlocks the read on both sides. They stay consistent only by discipline: if `bash-hard-deny`'s bypass env var name or semantics ever change, this skill's gate must be updated by hand to match. It is a shared convention that must be kept in sync, not an enforced runtime dependency.
28
+
29
+ This skill:
30
+
31
+ 1. Reads the fires log (gated by `CCST_FIRES_ACCESS=1` so the bash-hard-deny hook permits the read).
32
+ 2. Filters to entries with `verdict == "safe"` and `cache != "hit"` (i.e. ones that escalated to claude).
33
+ 3. Cross-references each input hash with the current cache; drops anything already cached.
34
+ 4. Prints each remaining candidate's sha, fire count, last-seen timestamp, and a sample session id -
35
+ **not** the plaintext command: `telemetry_events` only stores a SHA-256 `input_hash`, never the
36
+ command text itself. Recovering the plaintext to eyeball a candidate before promoting it is a
37
+ manual step - walk the named sample session's transcript for the command that produced that
38
+ hash. There is currently no automated command preview.
39
+ 5. After you've identified and vetted a candidate's real command by hand, promote it with the
40
+ `promote` subcommand (or write it directly via `hooks.cache.cache_record()`).
41
+
42
+ Manual subcommands:
43
+ - `remove <sha>` removes a single entry (after confirmation).
44
+ - `flip <sha> <verdict>` refreshes the entry (re-records it via `cache_record()`) when the new verdict is `safe`, or deletes it when the new verdict is non-safe.
45
+ - `promote <sha> [--verdict safe] [--risks ...] [--preview ...]` records a single vetted entry directly.
46
+
47
+ **Note on synthetic rows:** `telemetry.db`'s `bash-security-review` rows can include synthetic
48
+ test-fixture rows (`session_id` values like `test-session-1`) alongside real production fires, if
49
+ this machine's test suite has ever run against the shared database. Don't be surprised if one of
50
+ these dominates the candidate list by fire count - check `sample_session` before promoting.
51
+
52
+ ## Invocation
53
+
54
+ This script `import`s `hooks` and `cc_session_tools.lib` directly - it needs an interpreter that
55
+ actually has `cc-session-tools` installed, not a bare system `python3` (which will fail with
56
+ `ModuleNotFoundError: No module named 'hooks'`). Find that interpreter from whichever `ccst`
57
+ is already on `PATH` - its console-script shebang line names the exact venv Python that has the
58
+ package, regardless of install method (`uv tool install`, `pipx`, `pip --user`):
59
+
60
+ PY="$(sed -n '1s/^#!//p' "$(command -v ccst)")"
61
+ CCST_FIRES_ACCESS=1 "$PY" ~/.claude/skills/update-command-cache/scripts/update_command_cache.py list
62
+ "$PY" ~/.claude/skills/update-command-cache/scripts/update_command_cache.py remove <sha>
63
+ "$PY" ~/.claude/skills/update-command-cache/scripts/update_command_cache.py flip <sha> <safe|suspicious|dangerous>
64
+ "$PY" ~/.claude/skills/update-command-cache/scripts/update_command_cache.py promote <sha> [--verdict safe] [--risks ...] [--preview ...]
65
+
66
+ In a repo checkout (development), `uv run python3 scripts/update_command_cache.py ...` from this
67
+ skill's source directory works the same way.
68
+
69
+ Default behaviour (no subcommand) is `list`: show pending candidates and prompt for promotion.
70
+
71
+ ## Safety notes
72
+
73
+ - Suspicious / dangerous fires are NEVER auto-promoted. Even via this skill.
74
+ - The skill never bypasses the SHA-256 exact-string match: a command in the cache must be byte-for-byte identical to the live command for the cache hit to fire. v2 may relax this once we have evidence of how big the near-miss class is.
75
+ - Promotions go through `cache_record`, which stores only `safe` verdicts and auto-prunes entries older than 90 days on every write. Removals and non-safe flips delete the row directly from the SQLite cache.
76
+
77
+ ## Bottom line
78
+
79
+ This skill is the human-in-the-loop curation step for the auto-fill cache. Use it whenever `telemetry.db` has accumulated safe fires that you want to start short-circuiting on the next run, or when you need to surgically prune a bad entry.
@@ -6,9 +6,16 @@ surfaces safe-verdict commands not yet in the cache, prompts for approval,
6
6
  and records approved ones.
7
7
 
8
8
  Usage:
9
- CCST_FIRES_ACCESS=1 python3 update_command_cache.py [--list]
10
- python3 update_command_cache.py --remove <sha>
11
- python3 update_command_cache.py --flip <sha> <verdict>
9
+ CCST_FIRES_ACCESS=1 python3 update_command_cache.py list
10
+ python3 update_command_cache.py remove <sha>
11
+ python3 update_command_cache.py flip <sha> <safe|suspicious|dangerous>
12
+ python3 update_command_cache.py promote <sha> [--verdict safe] [--risks ...] [--preview ...]
13
+
14
+ Must be run through an interpreter that has cc-session-tools installed (`uv run
15
+ python3 <path>` in a repo checkout, or the venv `uv tool install` creates) -
16
+ `hooks` and `cc_session_tools.lib` are ordinary top-level installed packages,
17
+ not importable from a bare system `python3` that never had the package
18
+ installed.
12
19
 
13
20
  The CCST_FIRES_ACCESS=1 env var is required to read telemetry.db through the
14
21
  bash-hard-deny hook's allowlist.
@@ -21,17 +28,12 @@ import sys
21
28
  from collections import Counter
22
29
  from pathlib import Path
23
30
 
24
- # Make hooks / cc_session_tools importable when running from the skill dir.
25
- _REPO_ROOT = Path(__file__).resolve().parents[3]
26
- if str(_REPO_ROOT / "src") not in sys.path:
27
- sys.path.insert(0, str(_REPO_ROOT / "src"))
28
-
29
- from hooks.cache import ( # noqa: E402
31
+ from hooks.cache import (
30
32
  _connect,
31
33
  cache_lookup,
32
34
  cache_record,
33
35
  )
34
- from cc_session_tools.lib import telemetry_store # noqa: E402
36
+ from cc_session_tools.lib import telemetry_store
35
37
 
36
38
  _DEFAULT_PREVIEW_LIMIT = 200
37
39
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cc-session-tools
3
- Version: 3.5.2
3
+ Version: 3.5.3
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
@@ -1,57 +0,0 @@
1
- ---
2
- name: update-command-cache
3
- description: Curate the SHA-256 command cache used by the bash-security-review hook. Reads recent safe-verdict fires from telemetry.db, identifies commands not yet cached, presents them for approval, and records approved ones via hooks.cache.cache_record(). Also supports manual --remove and --flip operations on existing cache entries. Use when the user says "update the command cache", "curate cached commands", "review cache fires", "promote fires to cache", "remove a cache entry", or notices the cache is stale or polluted.
4
- ---
5
-
6
- # Update command cache
7
-
8
- The `bash-security-review` hook (when run with `CCST_USE_COMMAND_CACHE=1`) records `safe`-verdict fires into the command cache at `~/.cache/claude/logs/command-cache.db` (SQLite; the legacy `command-cache.csv` is retired). Auto-fill is conservative - only verdicts that came back `safe` from the claude CLI escalation are stored. This skill is the curation tool for that cache: it lets you sweep the telemetry log for safe fires not yet captured, vet them, and bulk-promote the ones you want.
9
-
10
- ## When to use
11
-
12
- - "Update the command cache."
13
- - "Sweep the fires log for cacheable commands."
14
- - "Promote my recent claude-CLI safe fires to the cache."
15
- - "Remove this cache entry."
16
- - "Flip this entry from safe to suspicious."
17
- - After tuning the heuristic flag list, when stale entries should be re-validated.
18
-
19
- ## How it works
20
-
21
- The bash-security-review hook records every fire to `telemetry.db`. The cache (`command-cache.db`, SQLite) holds `safe`-verdict commands keyed by their SHA-256 hash so subsequent identical commands skip the claude CLI call.
22
-
23
- ### Relationship to bash-hard-deny
24
-
25
- This skill and the `bash-hard-deny` hook (`src/hooks/bash_hard_deny.py`) share one convention: `CCST_FIRES_ACCESS=1`. `bash-hard-deny`'s telemetry.db-block section documents this env var as the bypass that lets a legitimate reader touch the telemetry log; this skill's own gate (in `scripts/update_command_cache.py`, `cmd_list`) refuses to read `telemetry.db` unless the same variable is set.
26
-
27
- The two are NOT structurally coupled — the hook cannot literally intercept this skill's Python-internal file read, so setting the variable is what actually unlocks the read on both sides. They stay consistent only by discipline: if `bash-hard-deny`'s bypass env var name or semantics ever change, this skill's gate must be updated by hand to match. It is a shared convention that must be kept in sync, not an enforced runtime dependency.
28
-
29
- This skill:
30
-
31
- 1. Reads the fires log (gated by `CCST_FIRES_ACCESS=1` so the bash-hard-deny hook permits the read).
32
- 2. Filters to entries with `verdict == "safe"` and `cache != "hit"` (i.e. ones that escalated to claude).
33
- 3. Cross-references each input hash with the current cache; drops anything already cached.
34
- 4. Presents the candidate list to the user with command preview, fire count, and last-seen.
35
- 5. After explicit approval, calls `hooks.cache.cache_record()` for each approved entry.
36
-
37
- Manual modes:
38
- - `--remove <sha>` removes a single entry (after confirmation).
39
- - `--flip <sha> <verdict>` refreshes the entry (re-records it via `cache_record()`) when the new verdict is `safe`, or deletes it when the new verdict is non-safe.
40
-
41
- ## Invocation
42
-
43
- From this skill's directory:
44
-
45
- CCST_FIRES_ACCESS=1 python3 scripts/update_command_cache.py [--list] [--remove <sha>] [--flip <sha> <verdict>]
46
-
47
- Default behaviour (no flag) is `--list`: show pending candidates and prompt for promotion.
48
-
49
- ## Safety notes
50
-
51
- - Suspicious / dangerous fires are NEVER auto-promoted. Even via this skill.
52
- - The skill never bypasses the SHA-256 exact-string match: a command in the cache must be byte-for-byte identical to the live command for the cache hit to fire. v2 may relax this once we have evidence of how big the near-miss class is.
53
- - Promotions go through `cache_record`, which stores only `safe` verdicts and auto-prunes entries older than 90 days on every write. Removals and non-safe flips delete the row directly from the SQLite cache.
54
-
55
- ## Bottom line
56
-
57
- This skill is the human-in-the-loop curation step for the auto-fill cache. Use it whenever `telemetry.db` has accumulated safe fires that you want to start short-circuiting on the next run, or when you need to surgically prune a bad entry.