cc-session-tools 3.16.0__tar.gz → 3.16.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.
- cc_session_tools-3.16.2/PKG-INFO +617 -0
- cc_session_tools-3.16.2/README.md +558 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/pyproject.toml +1 -1
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/compact-smart/SKILL.md +24 -6
- cc_session_tools-3.16.2/src/cc_session_tools.egg-info/PKG-INFO +617 -0
- cc_session_tools-3.16.0/PKG-INFO +0 -346
- cc_session_tools-3.16.0/README.md +0 -287
- cc_session_tools-3.16.0/src/cc_session_tools.egg-info/PKG-INFO +0 -346
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/LICENSE +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/setup.cfg +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/__init__.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/cli/__init__.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/cli/ccd.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/cli/ccmsg.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/cli/ccr.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/cli/ccs.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/cli/ccsched.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/cli/ccst.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/cli/migrate_ccmsg.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/cli/migrate_ccsched.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/cli/migrate_sessions_db.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/cli/migrate_telemetry.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/config/api-keys.example +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/config/hooks-bundle.json +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/config/session-tag-hook.json +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/hooks_install.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/__init__.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/api_keys.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/bun_tools.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/claude_flags.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/claude_md_install.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/claude_md_store.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/context_overrides.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/db.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/debug.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/doctor.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/doctor_mutes.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/hook_registry.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/install_sync.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/levenshtein.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/machine_identity.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/messaging/__init__.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/messaging/addressing.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/messaging/cursor.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/messaging/lock.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/messaging/message.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/messaging/move_safety.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/messaging/repository.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/messaging/retention.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/messaging/service.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/messaging/session_ref.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/messaging/store.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/occupancy.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/paths.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/__init__.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/backup.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/classify.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/cutover.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/dump.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/formatting.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/importers.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/init_paths.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/init_service.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/manifest.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/naming.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/project_claude_md.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/readiness.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/rehydrate.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/rename_group.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/reorganize.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/repository.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/resolve.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/service.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/session_output.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/store.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/sync_check.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/sync_lock.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/sync_notify.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/vector_clock.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/vector_clock_store.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/verify.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/pdata/write_log.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/picker.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/proc_lock.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/prompts.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/roots.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/rules.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/__init__.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/bundled_jobs.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/cadence.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/cursor.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/digest.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/due.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/duration.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/jobspec.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/ledger.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/lock.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/notify.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/reconcile.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/registry.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/runner.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/state.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/store.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/surface.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/throttle.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/scheduler/worker.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/session_gc.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/sessions.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/sessions_db.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/sessions_repair.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/shell_install.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/tasklist.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/telemetry_store.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/text_wrap.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/lib/timefmt.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/analyse-cc-usage/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/clean-hook-sessions/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/clean-hook-sessions/scripts/clean-hook-sessions.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/context-override/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/delete-sessions/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/delete-sessions/scripts/delete_sessions.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/do-executor-critic-assessor-loop/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/extract-pptx/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/extract-pptx/scripts/extract_pptx.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/extract-to-text/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/extract-to-text/scripts/extract_to_text.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/find-claude-code-session/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/generate-8digit-code/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/generate-8digit-code/scripts/generate_8digit_code.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/list-empty-sessions/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/list-empty-sessions/scripts/list_empty_sessions.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/manage-recurring-cc-jobs-using-ccsched/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/move-session/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/move-session/hooks/sessionstart-pending-rename.sh +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/move-session/scripts/cc_session_rules.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/move-session/scripts/move_session.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/pm-pdata-design-schema/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/pm-pdata-do-audit-and-prepare-to-migrate/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/pm-pdata-do-init/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/pm-pdata-do-manual-migration/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/pm-pdata-do-update-consuming-skills/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/pm-pdata-do-update-project-docs/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/pm-pdata-resolve-conflicts/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/pm-project-layout-reference/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/pm-update-central-files/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/reduce-persistent-context/CALIBRATION.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/reduce-persistent-context/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/analyze_context.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/duplicates.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/measure.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/report.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/tokens.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/reduce-persistent-context/scripts/usage.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/select-agent-model/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/send-session-message/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/update-command-cache/SKILL.md +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools/skills/update-command-cache/scripts/update_command_cache.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools.egg-info/SOURCES.txt +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools.egg-info/dependency_links.txt +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools.egg-info/entry_points.txt +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools.egg-info/requires.txt +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/cc_session_tools.egg-info/top_level.txt +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/claude_code_usage/__init__.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/claude_code_usage/attribution.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/claude_code_usage/cache.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/claude_code_usage/ccusage_wrapper.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/claude_code_usage/cli.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/claude_code_usage/data/pricing.json +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/claude_code_usage/parent_inference.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/claude_code_usage/parser.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/claude_code_usage/pricing.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/claude_code_usage/query.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/claude_code_usage/report.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/claude_code_usage/schema.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/claude_code_usage/session_names.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/__init__.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/after_response.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/bash_hard_deny.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/bash_security_review.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/cache.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/catchup.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/confirm_8digit.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/context_window_warning.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/last_screenshot.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/marker_allow.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/markers.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/messaging_deliver.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/model_info.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/normalise.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/pdata_sync.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/pending_migration.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/pending_rename.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/script_allowlist.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/session_tag.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/stats.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/telemetry.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/telemetry_query.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/telemetry_trim.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/transcript.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/src/hooks/worklog_guard.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_after_response.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_api_keys.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_attribution.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_bash_hard_deny.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_bash_security_review.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_bash_security_review_allowlist.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_bun_tools.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_cache.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_cache_sqlite.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccr_orphans.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccs_emptiness.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccs_eta.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccs_list_mode.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccs_scope_flags.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccs_sentinel_sort.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccs_session_counts.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_bundle_discovery.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_ccsched_jobs_cli.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_cli.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_context_override_cli.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_doctor.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_gc_prune.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_gc_report.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_hook_dispatcher.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_hooks_allowlist.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_hooks_install_prune.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_hooks_install_zero_arg.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_hooks_uninstall.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_install_everything.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_machine_identity_cli.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_main_gate.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_pdata_cli.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_pdata_init_cli.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_pdata_readiness_cli.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_pdata_reconcile_cli.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_pdata_rename_group_cli.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_pdata_reorganize_cli.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_pdata_sync_cli.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_pdata_verify_cli.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_repair_sessions_cli.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_sessions_cli.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_shell_install.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_skills_install.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_skills_uninstall.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_telemetry_query.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccst_telemetry_trim.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_ccusage_wrapper.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_claude_flags.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_claude_md_drift.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_claude_md_install.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_clean_hook_sessions_format.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_cli.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_cli_api_launchers.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_cli_ccd.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_cli_ccd_dry_run.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_cli_ccr.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_cli_ccs.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_cli_version.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_confirm_8digit.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_context_overrides.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_context_window_warning.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_date_format_conformance.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_db.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_debug.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_doctor_mutes.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_empty_session.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_hook_cache.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_hooks_install.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_hooks_install_records.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_install_sync.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_last_screenshot.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_levenshtein.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_machine_identity.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_marker_allow.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_migrate_ccmsg.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_migrate_ccsched.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_migrate_sessions_db.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_migrate_telemetry.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_model_info.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_normalise.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_occupancy.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_parent_inference.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_parser.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_paths.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_pdata_audit_skill.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_pdata_post_migration_skills.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_pending_migration_hook.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_picker.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_pricing.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_proc_lock.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_prompts.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_query.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_report.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_roots.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_rules.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_scheduler_bundled_jobs.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_schema.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_script_allowlist.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_session_names.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_session_tag.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_sessions.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_sessions_db.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_sessions_db_migration_chain.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_sessions_repair.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_tasklist.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_telemetry.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_telemetry_store.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_text_wrap.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_timefmt.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_transcript.py +0 -0
- {cc_session_tools-3.16.0 → cc_session_tools-3.16.2}/tests/test_worklog_guard.py +0 -0
|
@@ -0,0 +1,617 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: cc-session-tools
|
|
3
|
+
Version: 3.16.2
|
|
4
|
+
Summary: Claude Code session management CLI tools (ccd, ccr, ccs, claude-code-usage, ccst) and hook library (hooks package)
|
|
5
|
+
Author: raffishquartan
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2026 raffishquartan
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in all
|
|
18
|
+
copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
26
|
+
SOFTWARE.
|
|
27
|
+
|
|
28
|
+
Project-URL: Homepage, https://github.com/raffishquartan/claude-code-session-tools
|
|
29
|
+
Project-URL: Repository, https://github.com/raffishquartan/claude-code-session-tools
|
|
30
|
+
Project-URL: Issues, https://github.com/raffishquartan/claude-code-session-tools/issues
|
|
31
|
+
Keywords: claude-code,cli,session-management,usage-analytics,hooks
|
|
32
|
+
Classifier: Development Status :: 4 - Beta
|
|
33
|
+
Classifier: Environment :: Console
|
|
34
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
35
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
36
|
+
Classifier: Operating System :: MacOS
|
|
37
|
+
Classifier: Programming Language :: Python :: 3
|
|
38
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
39
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
40
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
41
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
42
|
+
Classifier: Topic :: Software Development
|
|
43
|
+
Classifier: Topic :: Utilities
|
|
44
|
+
Requires-Python: >=3.11
|
|
45
|
+
Description-Content-Type: text/markdown
|
|
46
|
+
License-File: LICENSE
|
|
47
|
+
Requires-Dist: pandas>=2.2
|
|
48
|
+
Requires-Dist: pyarrow>=15.0
|
|
49
|
+
Requires-Dist: jsonschema>=4.21
|
|
50
|
+
Requires-Dist: platformdirs>=4.0
|
|
51
|
+
Requires-Dist: httpx>=0.27
|
|
52
|
+
Requires-Dist: pyyaml>=6.0
|
|
53
|
+
Requires-Dist: tiktoken-tools>=0.1.0
|
|
54
|
+
Provides-Extra: dev
|
|
55
|
+
Requires-Dist: pytest>=7; extra == "dev"
|
|
56
|
+
Requires-Dist: mypy>=1.10; extra == "dev"
|
|
57
|
+
Requires-Dist: pandas-stubs; extra == "dev"
|
|
58
|
+
Dynamic: license-file
|
|
59
|
+
|
|
60
|
+
# cc-session-tools (CCST)
|
|
61
|
+
|
|
62
|
+
[](https://pypi.org/project/cc-session-tools/)
|
|
63
|
+
[](https://pypi.org/project/cc-session-tools/)
|
|
64
|
+
[](LICENSE)
|
|
65
|
+
|
|
66
|
+
**Tools for running Claude Code at scale as your default way of working, not just a
|
|
67
|
+
sometimes tool.**
|
|
68
|
+
|
|
69
|
+
Claude Code on its own is a great single conversation. It is much less good at the things
|
|
70
|
+
that appear once you use it all day, across many projects, for weeks:
|
|
71
|
+
|
|
72
|
+
- _"Which session was that in?"_ - sessions are anonymous UUIDs in a transcript folder.
|
|
73
|
+
- _"Where did that draft go?"_ - files end up wherever the conversation left them.
|
|
74
|
+
- _"I need to tell the other session about this."_ - sessions cannot talk to each other.
|
|
75
|
+
- _"This should just run every week."_ - nothing runs while Claude Code is closed.
|
|
76
|
+
- _"Did that command it just ran do something bad?"_ - you either approve everything by hand
|
|
77
|
+
or approve nothing.
|
|
78
|
+
- _"My CSV of records has drifted out of sync with my notes again."_ - ad hoc files do not
|
|
79
|
+
scale.
|
|
80
|
+
- _"I'm working with GB of unstructured data, and I need multiple sessions to work on the
|
|
81
|
+
files simultaneously"_ - race conditions anyone?
|
|
82
|
+
- _"I can't give Claude Code all this power"_ - and you definitely don't want to trust the
|
|
83
|
+
LLM to enforce its own guardrails
|
|
84
|
+
|
|
85
|
+
CCST fixes each of those with small, boring, local tools. Everything is a command line
|
|
86
|
+
program plus a handful of Claude Code hooks and skills. There is no server, no account and
|
|
87
|
+
no network service (the only optional outbound call is a Telegram notification you opt
|
|
88
|
+
into). All state is SQLite under `~/.local/share/claude/`.
|
|
89
|
+
|
|
90
|
+
If you run Claude Code only a few times a week for one-off questions or just 1 or 2 coding
|
|
91
|
+
sessions on different code bases at the same time then you do not need this. If you run
|
|
92
|
+
several named sessions a day, want to resume one from three weeks ago, want sessions to
|
|
93
|
+
leave each other notes, and want housekeeping to just happen, CCST is the layer that makes
|
|
94
|
+
that sustainable.
|
|
95
|
+
|
|
96
|
+
## Contents
|
|
97
|
+
|
|
98
|
+
- [What you get](#what-you-get)
|
|
99
|
+
- [Install](#install)
|
|
100
|
+
- [Quick start](#quick-start)
|
|
101
|
+
- [Sessions: `ccd`, `ccr`, `ccs`](#sessions-ccd-ccr-ccs)
|
|
102
|
+
- [Sessions talking to each other: `ccmsg`](#sessions-talking-to-each-other-ccmsg)
|
|
103
|
+
- [Scheduled jobs: `ccsched`](#scheduled-jobs-ccsched)
|
|
104
|
+
- [Safety hooks](#safety-hooks)
|
|
105
|
+
- [Per-project data store: `pdata`](#per-project-data-store-pdata)
|
|
106
|
+
- [Usage and cost analytics: `claude-code-usage`](#usage-and-cost-analytics-claude-code-usage)
|
|
107
|
+
- [Bundled skills](#bundled-skills)
|
|
108
|
+
- [Teaching Claude the conventions: `claude-md`](#teaching-claude-the-conventions-claude-md)
|
|
109
|
+
- [Command reference](#command-reference)
|
|
110
|
+
- [Configuration](#configuration)
|
|
111
|
+
- [Health checks, upgrades and uninstalling](#health-checks-upgrades-and-uninstalling)
|
|
112
|
+
- [How it fits together](#how-it-fits-together)
|
|
113
|
+
- [Contributing](#contributing)
|
|
114
|
+
|
|
115
|
+
## What you get
|
|
116
|
+
|
|
117
|
+
| You want to... | CCST gives you |
|
|
118
|
+
| ------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
|
|
119
|
+
| Find and resume past work | `ccd` starts a session under a name you choose, `ccr` resumes it by name fragment, `ccs` searches names, files and transcripts |
|
|
120
|
+
| Keep drafts and deliverables together | A `working/` and `out/` directory per session, created for you |
|
|
121
|
+
| Hand work between sessions | `ccmsg`: durable messages addressed to a session, a project, or "whoever picks this up" |
|
|
122
|
+
| Run things on a schedule without a daemon | `ccsched`: recurring jobs, caught up the next time you open Claude Code |
|
|
123
|
+
| Stop destructive commands | A hard-deny hook plus a cached, tiered (allowlist, heuristics, LLM) review of every shell command |
|
|
124
|
+
| Gate high-stakes actions | An 8-digit confirmation code you must type back before gated tools run |
|
|
125
|
+
| Track structured records per project | `pdata`: one SQLite database per project, with typed fields, versioning and multi-machine sync |
|
|
126
|
+
| See what Claude Code costs you | `claude-code-usage`: tokens and dollars by project, session, model, tool, MCP server, plugin |
|
|
127
|
+
| Avoid context bloat | A warning hook when the context window gets large, plus `/compact-smart` and `/context-override` |
|
|
128
|
+
| Get Claude to follow these conventions unprompted | Managed, human-editable sections installed into your global `CLAUDE.md` |
|
|
129
|
+
| Start from sensible workflows | 26 bundled skills (session hygiene, `pdata` workflows, document extraction, agent patterns) |
|
|
130
|
+
| Know it all still works | `ccst doctor`, a single health check across every subsystem, also run weekly by a bundled job |
|
|
131
|
+
|
|
132
|
+
## Install
|
|
133
|
+
|
|
134
|
+
Requires Python 3.11 or newer, [Claude Code](https://docs.claude.com/en/docs/claude-code)
|
|
135
|
+
and a POSIX shell (macOS or Linux; Windows via WSL).
|
|
136
|
+
|
|
137
|
+
### 1. Install the package
|
|
138
|
+
|
|
139
|
+
```sh
|
|
140
|
+
uv tool install cc-session-tools # recommended
|
|
141
|
+
# or: pipx install cc-session-tools
|
|
142
|
+
# or: pip install cc-session-tools
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
This puts the commands `ccd`, `ccr`, `ccdapi`, `ccrapi`, `ccs`, `ccmsg`, `ccsched`, `ccst`,
|
|
146
|
+
`claude-code-usage` and `cccs-stats` on your `PATH`.
|
|
147
|
+
|
|
148
|
+
### 2. Tell CCST where your projects live
|
|
149
|
+
|
|
150
|
+
`ccd` creates a session directory inside the project you are working in, and refuses to run
|
|
151
|
+
outside a configured root. Set one or both of these in your shell profile (for example
|
|
152
|
+
`~/.zshrc` or `~/.bashrc`). Each must point at a directory whose direct children are your
|
|
153
|
+
projects:
|
|
154
|
+
|
|
155
|
+
```sh
|
|
156
|
+
export CLAUDE_SESSION_TOOLS_REPO_ROOT="$HOME/repos" # loose: any session name tags must not have spaces in them
|
|
157
|
+
export CLAUDE_SESSION_TOOLS_PROJ_ROOT="$HOME/cc" # strict: session name tags must be <project folder name>-<label>
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
- Use `REPO_ROOT` for code repositories. Any tag works (`ccd fix-login-bug`).
|
|
161
|
+
- Use `PROJ_ROOT` for non-code "project" folders, where you want tags namespaced as
|
|
162
|
+
`<project>-<label>` (project names are lowercase letters and digits only). `pdata` (below)
|
|
163
|
+
lives under this root.
|
|
164
|
+
|
|
165
|
+
### 3. Wire CCST into Claude Code
|
|
166
|
+
|
|
167
|
+
```sh
|
|
168
|
+
ccst install-everything # dry run: shows exactly what would change
|
|
169
|
+
ccst install-everything --apply # does it
|
|
170
|
+
ccst doctor # health check; prints only problems (add --all to see everything)
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
`install-everything` installs, into `~/.claude`:
|
|
174
|
+
|
|
175
|
+
1. the bundled **skills** (symlinked into `~/.claude/skills/`)
|
|
176
|
+
2. the **hooks** (merged into `~/.claude/settings.json`; existing entries you wrote are left
|
|
177
|
+
alone)
|
|
178
|
+
3. the **`ccl` shell function**, written as `~/.shellrc.d/ccl.sh`
|
|
179
|
+
4. the managed **`CLAUDE.md` sections**, delimited blocks in `~/.claude/CLAUDE.md`
|
|
180
|
+
5. the standard **scheduled jobs**
|
|
181
|
+
|
|
182
|
+
then runs `ccst doctor`. It is idempotent, so it is safe to re-run.
|
|
183
|
+
|
|
184
|
+
### 4. Load the shell functions
|
|
185
|
+
|
|
186
|
+
`ccst` does not edit your `~/.zshrc` or `~/.bashrc`. Make sure your shell sources the
|
|
187
|
+
fragment directory (add this once if it does not already):
|
|
188
|
+
|
|
189
|
+
```sh
|
|
190
|
+
for f in ~/.shellrc.d/*.sh; do [ -r "$f" ] && . "$f"; done
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Open a new terminal, `cd` into a project under one of your roots, and you are ready.
|
|
194
|
+
|
|
195
|
+
### Optional configuration
|
|
196
|
+
|
|
197
|
+
These are not needed to get started; see [Configuration](#configuration) for details.
|
|
198
|
+
|
|
199
|
+
- `CCST_CONFIRM_8DIGIT_GATED_TOOLS` - which tools require the 8-digit confirmation code.
|
|
200
|
+
- `TELEGRAM_BOT_TOKEN` / `TELEGRAM_CHAT_ID` - push scheduled-job outcomes or other messages
|
|
201
|
+
via Telegram.
|
|
202
|
+
- `CCST_SCREENSHOT_DIR` - where the `>lss` prompt token looks for your latest screenshot.
|
|
203
|
+
- `~/.config/ccst/api-keys` - Anthropic API keys for `ccdapi`/`ccrapi`.
|
|
204
|
+
|
|
205
|
+
## Quick start
|
|
206
|
+
|
|
207
|
+
```sh
|
|
208
|
+
cd ~/repos/myproject
|
|
209
|
+
ccd fix-login-bug # new session: cc-sessions/20261015-fix-login-bug/ (today's date)
|
|
210
|
+
# ... work, then quit Claude Code ...
|
|
211
|
+
|
|
212
|
+
ccr login-bug # days later: resume it by any fragment of its name
|
|
213
|
+
ccs --global # list sessions across every project
|
|
214
|
+
ccs "rate limit" --contents --global # search inside working/ and out/ of all sessions
|
|
215
|
+
ccst doctor # is everything healthy?
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
Then, from inside any session, just ask Claude in plain language: _"leave a note for the
|
|
219
|
+
next session in this project saying the config file was renamed"_, or _"run
|
|
220
|
+
`ccst doctor --drift` every Monday morning"_, or _"send a message to
|
|
221
|
+
~/repos/my-other-project about ..."_. The installed skills and `CLAUDE.md` sections teach
|
|
222
|
+
Claude how to use `ccmsg` and `ccsched` for you.
|
|
223
|
+
|
|
224
|
+
## Sessions: `ccd`, `ccr`, `ccs`
|
|
225
|
+
|
|
226
|
+
Three commands cover starting, resuming and finding your sessions. Run them from
|
|
227
|
+
inside a project directory under one of your configured roots.
|
|
228
|
+
|
|
229
|
+
**`ccd <tag>`** starts a new session and scaffolds `cc-sessions/<yyyyMMdd>-<tag>/` with
|
|
230
|
+
empty `working/` and `out/` subdirectories. Tags use letters, digits and dashes. `--dry-run`
|
|
231
|
+
shows what it would do; extra arguments are passed through to `claude`.
|
|
232
|
+
|
|
233
|
+
```sh
|
|
234
|
+
ccd fix-login-bug
|
|
235
|
+
# -> Claude Code, session 20261015-fix-login-bug (if today is 2026-10-15)
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
**`ccr <fragment>`** resumes a session by fuzzy name match. You do not need the exact tag or
|
|
239
|
+
date; if several sessions match you get an interactive picker. If a session was forked
|
|
240
|
+
(Ctrl-L), `ccr` helps you pick the right transcript. `--include-orphans` also finds
|
|
241
|
+
transcripts that have no `cc-sessions/` directory.
|
|
242
|
+
|
|
243
|
+
```sh
|
|
244
|
+
ccr login-bug
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
**`ccs`** (and `ccl`, its shell-function wrapper) lists and searches sessions:
|
|
248
|
+
|
|
249
|
+
```sh
|
|
250
|
+
ccs --global # every session, across every project
|
|
251
|
+
ccs login --global # by name
|
|
252
|
+
ccs "rate limit" --contents --global # full text in working/ and out/
|
|
253
|
+
ccs "stack trace" --messages # full text of transcripts in the current project
|
|
254
|
+
ccs --order-by active -n 5 --global # your 5 most recently active sessions anywhere
|
|
255
|
+
ccs --since 2026-10-01 --emptiness exclude --json --global
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
Filters cover date ranges (`--since`, `--before`, `--days`), sessions you never typed in
|
|
259
|
+
(`--emptiness`), and hook-spawned review sessions (`--exclude-hooks`). Output can be JSON or
|
|
260
|
+
null-delimited for `xargs -0`. Set `CCS_DEFAULT_GLOBAL=1` to make `--global` the default.
|
|
261
|
+
|
|
262
|
+
### `working/` and `out/`: draft, then finalise
|
|
263
|
+
|
|
264
|
+
Each session directory gets two folders:
|
|
265
|
+
|
|
266
|
+
```
|
|
267
|
+
cc-sessions/20261015-fix-login-bug/
|
|
268
|
+
├── working/ # drafts, scratch notes, WORKLOG.md, intermediate data
|
|
269
|
+
└── out/ # the confirmed final artefact
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Drafts and iterations accumulate in `working/`; only the finished deliverable goes in
|
|
273
|
+
`out/`. Nothing on disk enforces this, but the managed `workflow` `CLAUDE.md` section
|
|
274
|
+
teaches Claude to do it, and `ccs --contents` and `pdata reconcile-session-output` rely on
|
|
275
|
+
it. The same section asks Claude to keep a `working/WORKLOG.md` (timestamped entries), and
|
|
276
|
+
the `worklog-guard` hook blocks a manual `/compact` while that log is stale, so a compaction
|
|
277
|
+
cannot silently lose your session history.
|
|
278
|
+
|
|
279
|
+
### Where subagents write
|
|
280
|
+
|
|
281
|
+
A subagent Claude dispatches gets its own folder, `agents/<tag>--<task-slug>/`, inside the
|
|
282
|
+
session directory, with the exact prompt in `prompt.md` and a running `WORKLOG.md`, so a
|
|
283
|
+
large or parallel task leaves an audit trail instead of filling the chat. This is taught by
|
|
284
|
+
the managed `agents` section.
|
|
285
|
+
|
|
286
|
+
### Recurring routines get a fresh session each time
|
|
287
|
+
|
|
288
|
+
A weekly review is not one long-lived session; it is a new dated session each time, sharing
|
|
289
|
+
a suffix so the series is easy to find:
|
|
290
|
+
|
|
291
|
+
```sh
|
|
292
|
+
ccd myproject-weekly-review # -> 20261001-myproject-weekly-review
|
|
293
|
+
ccd myproject-weekly-review # a week later: 20261008-myproject-weekly-review
|
|
294
|
+
ccs myproject-weekly-review --global # lists every occurrence
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
### Billing a session to an API key: `ccdapi`, `ccrapi`
|
|
298
|
+
|
|
299
|
+
`ccdapi` and `ccrapi` behave like `ccd` and `ccr`, but launch Claude Code with an Anthropic
|
|
300
|
+
API key instead of your subscription. Pick the key with `-k <label>`, or omit `-k` to choose
|
|
301
|
+
from a numbered menu:
|
|
302
|
+
|
|
303
|
+
```sh
|
|
304
|
+
ccdapi -k work fix-login-bug
|
|
305
|
+
ccrapi login-bug # prompts for which key label to use
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
Keys live in `~/.config/ccst/api-keys` (override with `CCST_API_KEYS_FILE`), one `label=key`
|
|
309
|
+
per line, `#` comments allowed. The file must be `chmod 600` and is parsed, not sourced.
|
|
310
|
+
Keep it out of `~/.claude` and your shell rc files. Start from the value-free template
|
|
311
|
+
`api-keys.example`, bundled under `cc_session_tools/config/`.
|
|
312
|
+
|
|
313
|
+
### Session housekeeping
|
|
314
|
+
|
|
315
|
+
- `ccst sessions list` shows what `sessions.db` knows.
|
|
316
|
+
- `ccst repair sessions` fixes rows that `ccl`/`ccs --global` cannot see.
|
|
317
|
+
- `ccst gc report` finds orphaned data left behind by deleted sessions;
|
|
318
|
+
`ccst gc prune --execute` removes it. A bundled job runs the report weekly.
|
|
319
|
+
- Skills (below) cover deleting empty sessions, moving or renaming a session, and archiving
|
|
320
|
+
hook-review sessions.
|
|
321
|
+
|
|
322
|
+
## Sessions talking to each other: `ccmsg`
|
|
323
|
+
|
|
324
|
+
Leave a message for a session that is not open right now. The most common use is "whoever
|
|
325
|
+
next works on this project", delivered automatically the next time a matching session
|
|
326
|
+
starts:
|
|
327
|
+
|
|
328
|
+
```sh
|
|
329
|
+
ccmsg send --to-project myproject \
|
|
330
|
+
--subject "heads up: shared config file renamed" \
|
|
331
|
+
--body "renamed config/settings.yaml -> config/app.yaml, update references"
|
|
332
|
+
|
|
333
|
+
# in a later session opened in the same project (also done by a SessionStart hook):
|
|
334
|
+
ccmsg deliver
|
|
335
|
+
ccmsg list
|
|
336
|
+
ccmsg read <id>
|
|
337
|
+
ccmsg claim <id> # first session to claim wins, for description-addressed messages
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
Three ways to address a message:
|
|
341
|
+
|
|
342
|
+
- `--to-project <name>` - any session in that project (by far the most common).
|
|
343
|
+
- `--to-session <session name or uuid prefix>` - one specific session, for example
|
|
344
|
+
`--to-session 20261015-fix-login-bug` or `--to-session 3f9c1a2b`. An ambiguous or unknown
|
|
345
|
+
reference is rejected and nothing is stored.
|
|
346
|
+
- `--to-description "whoever is working on the billing migration"` - a free-text proposal
|
|
347
|
+
that the first interested session claims.
|
|
348
|
+
|
|
349
|
+
You rarely type any of this. Tell your session _"send a message to the myproject session
|
|
350
|
+
about X"_ and the installed `send-session-message` skill does the rest.
|
|
351
|
+
|
|
352
|
+
If you send a message to a session that is open the hooks will flag its appearance to it
|
|
353
|
+
(and you) at the beginning of its next response to you.
|
|
354
|
+
|
|
355
|
+
## Scheduled jobs: `ccsched`
|
|
356
|
+
|
|
357
|
+
Recurring jobs without a cron daemon. They are reconciled and caught up the next time you
|
|
358
|
+
open Claude Code, rather than run in the background while your laptop sleeps. A catch-up
|
|
359
|
+
digest at session start tells you what ran, what failed, and what was skipped.
|
|
360
|
+
|
|
361
|
+
```sh
|
|
362
|
+
ccsched add --id nightly-lint --cadence 'daily@22:00' -- npm run lint
|
|
363
|
+
ccsched list # jobs and when each is next due
|
|
364
|
+
ccsched status # recent run history
|
|
365
|
+
ccsched show nightly-lint
|
|
366
|
+
ccsched run nightly-lint # run one now
|
|
367
|
+
ccsched sweep # reconcile, run anything due, surface results (also automatic at session start)
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
- **Cadences**: `every:<duration>` (for example `every:6h`, `every:2w`), `daily@HH:MM`,
|
|
371
|
+
`weekly:<day>@HH:MM`, `monthly:<day>@HH:MM`, and `monthly:<weekday>#<n>@HH:MM`.
|
|
372
|
+
- **Safe by default**: a job that fails repeatedly auto-suspends instead of failing silently
|
|
373
|
+
forever, and `ccsched add --success-exit-codes` lets a job declare which exit codes mean
|
|
374
|
+
"ran fine".
|
|
375
|
+
- **Notifications**: set `TELEGRAM_BOT_TOKEN` and `TELEGRAM_CHAT_ID` to also get a Telegram
|
|
376
|
+
push for every job outcome, including when no session is open.
|
|
377
|
+
- **Bundled jobs**: CCST registers its own upkeep with `ccst ccsched-jobs install` (part of
|
|
378
|
+
`install-everything`): `pdata` verification and multi-machine sync, a weekly `doctor`
|
|
379
|
+
drift check, a weekly orphan report, telemetry trimming, session-output reconciliation, a
|
|
380
|
+
fortnightly reminder to curate the command-review cache, and a weekly sweep of hook-review
|
|
381
|
+
sessions.
|
|
382
|
+
|
|
383
|
+
You can also just ask Claude: _"run this every weekday at 09:00 and tell me if it fails"_ -
|
|
384
|
+
the `manage-recurring-cc-jobs-using-ccsched` skill translates that into a `ccsched add`.
|
|
385
|
+
|
|
386
|
+
## Safety hooks
|
|
387
|
+
|
|
388
|
+
CCST installs hooks that sit in front of what Claude does. They are on by default after
|
|
389
|
+
`install-everything`.
|
|
390
|
+
|
|
391
|
+
- **`bash-hard-deny`** - every shell command passes a deny list first, with no bypass:
|
|
392
|
+
deletes (`rm` and friends, including inside inline scripts), delete-by-move into temp or
|
|
393
|
+
trash locations, force-deleting git branches, deleting remote branches, mutating `gh` and
|
|
394
|
+
`curl` calls, `sudo`, and similar. Everything else is auto-approved so routine compound
|
|
395
|
+
commands do not stall on prompts.
|
|
396
|
+
- **`bash-security-review`** - a tiered review of shell commands: a fast allowlist and
|
|
397
|
+
command cache, read-only pre-filters and heuristics, and an LLM-backed review only for
|
|
398
|
+
anything unusual. Results are cached so the common case stays fast. Use
|
|
399
|
+
`ccst hooks allowlist list` to see what is pre-approved and the `update-command-cache`
|
|
400
|
+
skill to curate the cache.
|
|
401
|
+
- **`confirm-8digit`** - for tools you choose to gate, Claude must show you a fresh random
|
|
402
|
+
8-digit code and you type it back in your own message before the call runs. Gate tools
|
|
403
|
+
with `CCST_CONFIRM_8DIGIT_GATED_TOOLS="tool_a,tool_b"` (none are gated by default). A code
|
|
404
|
+
that came from another agent or a file never counts. The author uses this to stop Claude
|
|
405
|
+
Code from merging PR's without consent.
|
|
406
|
+
- **`context-window-warning`** - a non-blocking nudge toward `/compact` at 150k and 200k
|
|
407
|
+
tokens. Silence it for a session with `/context-override`.
|
|
408
|
+
- **`worklog-guard`** - blocks a manual `/compact` when the session's `WORKLOG.md` is stale.
|
|
409
|
+
|
|
410
|
+
```sh
|
|
411
|
+
ccst hooks install # dry run
|
|
412
|
+
ccst hooks install --apply # merge CCST's hooks into ~/.claude/settings.json
|
|
413
|
+
ccst hooks uninstall --apply # remove only CCST's entries; yours are never touched
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
### Other hooks
|
|
417
|
+
|
|
418
|
+
These keep the rest of CCST working without any action from you:
|
|
419
|
+
|
|
420
|
+
- `session-tag` - tells Claude the session tag and directory when launched via `ccd`/`ccr`.
|
|
421
|
+
- `after-response` - records last-activity time for `ccs --order-by active`.
|
|
422
|
+
- `messaging-deliver` - delivers `ccmsg` messages at session start and each prompt.
|
|
423
|
+
- `catchup` - catches up missed scheduled jobs and shows the digest.
|
|
424
|
+
- `pdata-sync` - syncs `pdata` databases across your machines (see below).
|
|
425
|
+
- `pending-migration` and `pending-rename` - surface unfinished data migrations and
|
|
426
|
+
half-finished session renames.
|
|
427
|
+
- `last-screenshot` - type `>lss` in a prompt and Claude gets the path of your newest
|
|
428
|
+
screenshot (set `CCST_SCREENSHOT_DIR`; several directories may be separated by `:`).
|
|
429
|
+
- `marker-allow` - lets skills drop small marker files without a permission prompt.
|
|
430
|
+
|
|
431
|
+
## Per-project data store: `pdata`
|
|
432
|
+
|
|
433
|
+
Projects accumulate CSVs, JSON files and markdown logs that drift out of sync and cannot be
|
|
434
|
+
queried. `pdata` gives each project one SQLite database instead, while deliberately leaving
|
|
435
|
+
prose and free-form notes as ordinary files. It lives under your
|
|
436
|
+
`CLAUDE_SESSION_TOOLS_PROJ_ROOT`.
|
|
437
|
+
|
|
438
|
+
```sh
|
|
439
|
+
ccst pdata readiness-scan --project myproject # read-only: what would block a migration?
|
|
440
|
+
ccst pdata init --project myproject # dry run: classifies each file
|
|
441
|
+
ccst pdata init --project myproject --write # migrate (backs up first, verifies after)
|
|
442
|
+
|
|
443
|
+
ccst pdata add --project myproject --group invoices --content '{"status": "open", "amount": 120}'
|
|
444
|
+
ccst pdata query --project myproject --group invoices --where 'status = "open"'
|
|
445
|
+
ccst pdata schema list --project myproject
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
- **Typed fields on demand** - records carry a flexible content field, and
|
|
449
|
+
`ccst pdata schema add-field` adds typed columns when a record shape settles.
|
|
450
|
+
- **Safe edits** - soft deletes, optimistic-concurrency versioning (a stale `update` or
|
|
451
|
+
`delete` exits non-zero rather than clobbering), and `ccst pdata verify` as an integrity
|
|
452
|
+
backstop (also run daily by a bundled job).
|
|
453
|
+
- **Multi-machine sync** - each project's database is published as a deterministic SQL dump
|
|
454
|
+
inside the project folder, so any folder-sync service carries it between your machines. A
|
|
455
|
+
vector clock per project means a genuine fork (two machines both edited) is flagged for
|
|
456
|
+
your choice with `ccst pdata resolve`, never silently merged. Each machine has a confirmed
|
|
457
|
+
identity (`ccst machine-identity show|confirm`).
|
|
458
|
+
- **New projects start well** - the first `pdata init` for a new project seeds starter
|
|
459
|
+
folders and a `CLAUDE.md` with date-format and line-ending conventions. An existing
|
|
460
|
+
`CLAUDE.md` is never touched.
|
|
461
|
+
- **Date hygiene** - writing a non-ISO date into a date-like field prints a warning, and
|
|
462
|
+
`readiness-scan` flags dotted, compact, slash and long-form date columns before you
|
|
463
|
+
migrate.
|
|
464
|
+
- **Session-output index** - `ccst pdata reconcile-session-output` indexes every session's
|
|
465
|
+
`out/` deliverables across projects (a bundled job runs it weekly).
|
|
466
|
+
|
|
467
|
+
The `pm-pdata-*` skills walk Claude through the whole lifecycle: auditing a project,
|
|
468
|
+
migrating it, designing schemas for new record shapes, resolving conflicts, and rewriting
|
|
469
|
+
skills and docs that pointed at the old flat files.
|
|
470
|
+
|
|
471
|
+
## Usage and cost analytics: `claude-code-usage`
|
|
472
|
+
|
|
473
|
+
```sh
|
|
474
|
+
claude-code-usage query --group-by model,day --format markdown
|
|
475
|
+
claude-code-usage report --since 2026-10-01 --output report.md
|
|
476
|
+
claude-code-usage children <session-uuid-or-name> # hook and subagent sessions under a parent
|
|
477
|
+
claude-code-usage reconcile # cross-check totals against the independent ccusage tool
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
Groups by project, session, model, MCP server, plugin, tool or time period, in tokens and
|
|
481
|
+
dollars (using Anthropic's published prices). It separates subagent cost, already counted in
|
|
482
|
+
the parent session, from hook-review cost, billed separately, so totals are never
|
|
483
|
+
double-counted. Ask Claude _"analyse my Claude Code usage this month"_ and the
|
|
484
|
+
`analyse-cc-usage` skill runs these for you. `cccs-stats` reports the efficiency of the
|
|
485
|
+
command-review cache.
|
|
486
|
+
|
|
487
|
+
## Bundled skills
|
|
488
|
+
|
|
489
|
+
26 skills are installed into `~/.claude/skills/` by `ccst skills install --apply` (part of
|
|
490
|
+
`install-everything`). Claude loads each one when its description matches what you ask for.
|
|
491
|
+
Each lives in `src/cc_session_tools/skills/<name>/SKILL.md`.
|
|
492
|
+
|
|
493
|
+
- **Finding and managing sessions**: `find-claude-code-session`, `list-empty-sessions`,
|
|
494
|
+
`delete-sessions`, `move-session`, `clean-hook-sessions`
|
|
495
|
+
- **Cross-session coordination**: `send-session-message` (for `ccmsg`),
|
|
496
|
+
`manage-recurring-cc-jobs-using-ccsched`
|
|
497
|
+
- **Context and cost**: `compact-smart` (drafts the `/compact` instruction that preserves
|
|
498
|
+
what matters), `context-override`, `reduce-persistent-context` (measures and trims the
|
|
499
|
+
fixed per-session context footprint), `analyse-cc-usage`
|
|
500
|
+
- **Per-project data (`pdata`)**: `pm-pdata-do-init`,
|
|
501
|
+
`pm-pdata-do-audit-and-prepare-to-migrate`, `pm-pdata-design-schema`,
|
|
502
|
+
`pm-pdata-resolve-conflicts`, `pm-pdata-do-update-consuming-skills`,
|
|
503
|
+
`pm-pdata-do-update-project-docs`, `pm-project-layout-reference`,
|
|
504
|
+
`pm-update-central-files` (end-of-session wrap-up), and the deprecated fallback
|
|
505
|
+
`pm-pdata-do-manual-migration`
|
|
506
|
+
- **Multi-agent patterns**: `select-agent-model` (which model tier for a subagent),
|
|
507
|
+
`do-executor-critic-assessor-loop` (an iterate-and-critique quality loop)
|
|
508
|
+
- **Document extraction**: `extract-to-text` (docx, doc, rtf, odt, pptx, eml, msg, pdf
|
|
509
|
+
including scanned pages via OCR, xlsx, xls) and `extract-pptx`
|
|
510
|
+
- **Safety**: `generate-8digit-code`, `update-command-cache`
|
|
511
|
+
|
|
512
|
+
`ccst skills install` and `ccst skills uninstall` manage them individually if you want a
|
|
513
|
+
subset.
|
|
514
|
+
|
|
515
|
+
## Teaching Claude the conventions: `claude-md`
|
|
516
|
+
|
|
517
|
+
The conventions above are not magic; they are taught. `ccst claude-md install` inserts
|
|
518
|
+
small, sentinel-delimited sections into your global `~/.claude/CLAUDE.md`, each
|
|
519
|
+
independently installable:
|
|
520
|
+
|
|
521
|
+
```sh
|
|
522
|
+
ccst claude-md install --apply # every section
|
|
523
|
+
ccst claude-md install --section workflow --apply # just one
|
|
524
|
+
ccst claude-md uninstall --section agents --apply # remove one
|
|
525
|
+
ccst claude-md backups list # saved copies of hand-edited sections
|
|
526
|
+
```
|
|
527
|
+
|
|
528
|
+
| Section | Teaches Claude |
|
|
529
|
+
| -------------- | ---------------------------------------------------------------- |
|
|
530
|
+
| `messaging` | to use `ccmsg` proactively to leave notes for other sessions |
|
|
531
|
+
| `workflow` | the `working/` to `out/` convention and a mandatory `WORKLOG.md` |
|
|
532
|
+
| `agents` | the per-subagent `agents/<tag>--<slug>/` folder convention |
|
|
533
|
+
| `confirm-gate` | how the 8-digit confirmation gate works |
|
|
534
|
+
| `date-format` | `yyyy.MM.dd` in filenames, `yyyy-MM-dd` everywhere else |
|
|
535
|
+
|
|
536
|
+
Each is a plain block you can read, edit or override. If you hand-edit a managed block, the
|
|
537
|
+
next install saves your version first (`ccst claude-md backups show <id>`), and
|
|
538
|
+
`ccst doctor` warns you before that happens.
|
|
539
|
+
|
|
540
|
+
## Command reference
|
|
541
|
+
|
|
542
|
+
`ccst <noun> <verb>` is the administrative umbrella. Run `ccst <noun> --help` for every
|
|
543
|
+
flag.
|
|
544
|
+
|
|
545
|
+
| Noun | What it is for |
|
|
546
|
+
| -------------------- | ------------------------------------------------------------------------- |
|
|
547
|
+
| `install-everything` | run every install step, then a health check (dry run unless `--apply`) |
|
|
548
|
+
| `doctor` | health check; `--all`, `--drift`, `--mute NAME`, `--list-mutes` |
|
|
549
|
+
| `hooks` | install/uninstall hooks, manage the review allowlist, `run <name>` a hook |
|
|
550
|
+
| `skills` | install/uninstall the bundled skills |
|
|
551
|
+
| `claude-md` | install/uninstall the managed `CLAUDE.md` sections, list/show backups |
|
|
552
|
+
| `shell` | install/uninstall the `ccl` shell function |
|
|
553
|
+
| `ccsched-jobs` | install the bundled scheduled jobs |
|
|
554
|
+
| `pdata` | the per-project data store (see above) |
|
|
555
|
+
| `machine-identity` | show/confirm this machine's identity for `pdata` sync |
|
|
556
|
+
| `sessions` | inspect `sessions.db`; one-shot schema migrations |
|
|
557
|
+
| `repair` | repair known `sessions.db` corruption |
|
|
558
|
+
| `gc` | `report` and `prune` orphaned per-session data |
|
|
559
|
+
| `telemetry` | `query` and `trim` the hook-invocation log |
|
|
560
|
+
| `migrate` | one-shot migrations from legacy flat-file stores to SQLite |
|
|
561
|
+
| `context-override` | toggle the context-window warning for the current session |
|
|
562
|
+
|
|
563
|
+
Other commands: `ccd`, `ccr`, `ccs`/`ccl`, `ccdapi`, `ccrapi`, `ccmsg`, `ccsched`,
|
|
564
|
+
`claude-code-usage`, `cccs-stats`. Every command has `--help` and `--version`.
|
|
565
|
+
|
|
566
|
+
## Configuration
|
|
567
|
+
|
|
568
|
+
Nothing here is required beyond the two root variables in [Install](#install).
|
|
569
|
+
|
|
570
|
+
| Setting | Purpose |
|
|
571
|
+
| ---------------------------------------- | ---------------------------------------------------------------------------- |
|
|
572
|
+
| `CLAUDE_SESSION_TOOLS_REPO_ROOT` | loose session root (code repositories) |
|
|
573
|
+
| `CLAUDE_SESSION_TOOLS_PROJ_ROOT` | strict `<project>-<label>` session root; also where `pdata` projects live |
|
|
574
|
+
| `CCST_CONFIRM_8DIGIT_GATED_TOOLS` | comma-separated tool names that require the 8-digit code (none by default) |
|
|
575
|
+
| `TELEGRAM_BOT_TOKEN`, `TELEGRAM_CHAT_ID` | Telegram push for scheduled-job outcomes (also read from `~/.creds`) |
|
|
576
|
+
| `CCST_SCREENSHOT_DIR` | directory (or `:`-separated list) searched by the `>lss` token |
|
|
577
|
+
| `CCST_API_KEYS_FILE` | alternative path for the `ccdapi`/`ccrapi` key file |
|
|
578
|
+
| `CCST_MACHINE_NAME` | explicit machine identity for `pdata` multi-machine sync |
|
|
579
|
+
| `CCS_DEFAULT_GLOBAL=1` | make `ccs`/`ccl` search globally by default |
|
|
580
|
+
| `CCST_NO_AUTO_SYNC=1` | disable the automatic post-upgrade install sync (CI, bisecting, development) |
|
|
581
|
+
|
|
582
|
+
## Health checks, upgrades and uninstalling
|
|
583
|
+
|
|
584
|
+
- **`ccst doctor`** checks PATH, environment, `settings.json`, hooks, skills, data stores,
|
|
585
|
+
version drift against PyPI, and whether the install is in sync. By default it prints only
|
|
586
|
+
problems. Mute a known, accepted warning with `ccst doctor --mute <check>`. A bundled job
|
|
587
|
+
runs `ccst doctor --drift` weekly so problems reach you without you asking.
|
|
588
|
+
- **Upgrading**: `uv tool upgrade cc-session-tools` (or `pip install -U cc-session-tools`).
|
|
589
|
+
The next `ccst` command notices the new version and re-runs the install itself. Run
|
|
590
|
+
`ccst install-everything` (dry run) any time to preview what it would change.
|
|
591
|
+
- **Data migrations**: a major version that changes on-disk data ships a `ccst doctor` FAIL
|
|
592
|
+
and a one-shot `ccst migrate ...` command, and a SessionStart hook surfaces it. See
|
|
593
|
+
[CHANGELOG.md](CHANGELOG.md) before a major upgrade.
|
|
594
|
+
- **Uninstalling**: `ccst hooks uninstall --apply`, `ccst skills uninstall --apply`,
|
|
595
|
+
`ccst claude-md uninstall --apply` and `ccst shell uninstall --apply` remove what CCST
|
|
596
|
+
added (everything is dry run until you pass `--apply`), then
|
|
597
|
+
`uv tool uninstall cc-session-tools`. Your session directories and data stores are left in
|
|
598
|
+
place.
|
|
599
|
+
|
|
600
|
+
## How it fits together
|
|
601
|
+
|
|
602
|
+
CCST is deliberately not a server or a shared team tool. It is local infrastructure for one
|
|
603
|
+
person running Claude Code hard, on one or more of their own machines. Everything is SQLite
|
|
604
|
+
under `~/.local/share/claude/`, one file per subsystem (sessions, messages, scheduler,
|
|
605
|
+
telemetry, command cache), and all of it is inspectable with `ccst telemetry query`,
|
|
606
|
+
`ccst gc report`, `ccst sessions list`, or a plain `sqlite3` shell. `ccst doctor` is the one
|
|
607
|
+
command that checks all of it at once. Run it any time something feels off.
|
|
608
|
+
|
|
609
|
+
## Contributing
|
|
610
|
+
|
|
611
|
+
Development uses git worktrees and `uv`; see `.claude/CLAUDE.md` in this repo for the
|
|
612
|
+
workflow, versioning policy and release process. Changes follow an OpenSpec proposal process
|
|
613
|
+
under `openspec/`. Release history is in [CHANGELOG.md](CHANGELOG.md).
|
|
614
|
+
|
|
615
|
+
## License
|
|
616
|
+
|
|
617
|
+
MIT
|