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