| name | incremental-cache-cli-modes |
| description | Use when implementing incremental caches, cache invalidation, cache stats, cache summary, list/import/export/prune/clear cache CLI modes, or CLI side-effect/reporting paths where normal analysis output and diagnostic output must not interfere. |
Incremental Cache And CLI Modes
Use this for tools that add incremental analysis, persistent file caches, cache hit/miss metrics, or cache-management CLI flags.
Core Workflow
- Map every CLI flag into one of these categories before coding:
- analysis modes: run normal analysis and optionally use/update the cache.
- side-effect-only modes: clear, prune, import, export, stats, summary, list cached files.
- hybrid modes: warm cache, force rescan, analysis with cache metrics.
- Side-effect-only modes must not accidentally run the normal analysis/report pipeline unless the spec explicitly requires it.
- Keep report output ownership separate from diagnostics. If formatters or output-file code may close or replace
stdout, print cache stats/summary/list output through a live stream that you own, or return before the formatter path closes it.
- Cache entries must be keyed by both file content and effective analysis configuration, not by path alone.
- Preserve user-visible result semantics when serving from cache: issue severity, confidence, CWE, line number/range, filename, code snippets when applicable, skipped files, and exit codes.
Required Edge Checks
Run or create focused checks for:
- first run misses, second run hits;
- modified file rescans and updates cached results;
- deleted file does not appear as a stale cached issue;
- severity/confidence/test/profile/config changes invalidate cache entries;
--force-rescan bypasses reads but still writes fresh entries;
--warm-cache populates cache without reporting issues and exits successfully;
- stats/summary/list/clear/prune/import/export work with and without positional targets;
- cache corruption, incompatible format versions, and partial files are ignored without crashing;
- cache size limits are enforced after writes and stats still report
cache_file_size_bytes.
Output Rules
- Cache stats and summaries are operational output, not scan findings. Do not route them through a formatter that may close the output file or suppress stdout.
- When a flag is meant to answer a cache question, print the answer before returning from the CLI command path.
- If the CLI accepts targets with a stats/list flag, treat targets as optional context for locating config/cache, not as a reason to run a full scan unless the contract says so.
- If normal analysis output and cache diagnostics can both be requested, make their ordering deterministic and test the combined path.
Implementation Pattern
- Centralize cache serialization/deserialization in a small module.
- Store
format_version, file content hash, effective config hash, timestamp, and serialized issue records.
- Keep invalidation reasons explicit:
not_cached, file_changed, config_changed, expired, corrupt, or equivalent.
- Keep cache metrics on the manager/session object and expose them to JSON or machine-readable formatters under a stable
cache_info object.
- Test the CLI as a subprocess for stream ownership, because direct function tests often miss closed-stdout bugs.