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