Files
small-scripts/specs/unreflected-logs.spec.md
Paul O'Reilly 57b4c0a2bb Add unreflected-logs: find session logs pending reflection
Scans all projects for session logs not yet processed by /reflect-logs,
using .reflection-state.json to track reflected status.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-17 11:14:34 +13:00

102 lines
3.1 KiB
Markdown

# unreflected-logs
## Purpose
Scan project directories for session logs that have not yet been processed by `/reflect-logs`, showing a per-project summary.
## Usage
```
unreflected-logs [OPTIONS] [DIRECTORY]
```
### Arguments
| Argument | Default | Description |
|----------|---------|-------------|
| `DIRECTORY` | `.` (current directory) | Root directory to scan |
### Flags
| Flag | Short | Description |
|------|-------|-------------|
| `--dryrun` | `-n` | List discovered projects without checking log status |
| `--help` | `-h` | Show usage information |
## Behaviour
1. **Discovery phase:** Walk `DIRECTORY` recursively, looking for directories that contain a `memory/log/` subdirectory. Each such directory is a "project". Stop descending into `memory/` and `node_modules/` directories.
2. **Check phase:** For each discovered project:
a. List all `*.md` files in `memory/log/`.
b. Read `.reflection-state.json` from the project root (sibling to `memory/`). If it doesn't exist, all logs are unreflected.
c. A log file is "reflected" if its path (relative, as `log/<filename>`) appears as a key in the `processed` object of the reflection state file.
d. Count reflected and unreflected logs.
3. **Report phase:** Print a summary:
- **Projects with unreflected logs** get a section showing:
- Project path (relative to `DIRECTORY`)
- Count: `N unreflected / M total logs`
- List of unreflected log filenames
- **Projects with all logs reflected** are listed in a summary line (count only).
- **Total** line at the end: `N unreflected logs across M projects`
4. **Exit code:**
- `0` — no unreflected logs found anywhere
- `1` — at least one unreflected log exists
## Dryrun Behaviour
When `--dryrun` is passed:
- Perform the discovery phase only
- Print each discovered project path (relative to `DIRECTORY`), one per line
- Prefix output with `[dryrun] Would check N projects:`
- Exit code is always `0`
## Edge Cases
| Scenario | Handling |
|----------|----------|
| No projects with `memory/log/` found | Print "No projects with session logs found in <dir>" and exit 0 |
| `memory/log/` exists but is empty | Skip project (no logs to report) |
| `.reflection-state.json` missing | Treat all logs as unreflected |
| `.reflection-state.json` malformed | Warn to stderr, treat all logs as unreflected |
| `processed` key missing from state | Treat all logs as unreflected |
| Permission denied on subdirectory | Skip with warning to stderr, continue scanning |
## Examples
### All reflected
```
Scanned 4 projects in ~/dev/claude
✓ All logs reflected across 4 projects.
```
### Some unreflected
```
Scanned 4 projects in ~/dev/claude
── projects/claude-foundations ──
1 unreflected / 4 total logs
- 2026-03-15.225345.md
── small-scripts ──
2 unreflected / 3 total logs
- 2026-03-14.091200.md
- 2026-03-15.142300.md
✓ 2 projects have all logs reflected.
Total: 3 unreflected logs across 2 projects
```
### Dryrun
```
[dryrun] Would check 4 projects:
~/dev/claude/projects/claude-foundations
~/dev/claude/projects/cluster-bootstrap
~/dev/claude/small-scripts
~/dev/claude/octopus/customer-issue-sync
```