diffowl 0.2.0 → 0.3.0

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.
package/README.md CHANGED
@@ -25,7 +25,8 @@ DiffOwl is a lightweight CLI that integrates into your Git workflow to provide h
25
25
  - **Intelligent File Filtering**: Supports `include` and `exclude` glob patterns to focus reviews on source directories while skipping build artifacts, lockfiles, and node modules.
26
26
  - **Project-Specific Rules**: Inject custom guidelines directly into the reviewer's system prompt (e.g., "Check for SQL injection", "Ensure TypeScript types are explicit").
27
27
  - **Interactive Model Selector**: Automatically queries OpenCode to present a clean, interactive list of your connected providers and models.
28
- - **Local Reports**: Generates markdown reviews under `.diffowl/reviews/`, including hidden session metadata that makes reports chat-capable.
28
+ - **Local Reports**: Generates markdown reviews under `.diffowl/reviews/`, including durable finding IDs and hidden session metadata that makes reports chat-capable.
29
+ - **Durable Findings (0.3)**: Persists reviews and findings in `.diffowl/state.db` with stable `fnd_*` IDs, occurrence tracking, and lifecycle commands for fix, dismiss, defer, and reopen.
29
30
  - **Agent-Assisted Resolution**: Includes an optional portable skill that lets coding agents investigate findings, fix confirmed issues, record dismissals, and archive handled reports.
30
31
  - **Hook Log Retention**: Bounds accumulated hook logs without deleting review history.
31
32
 
@@ -35,7 +36,7 @@ DiffOwl is a lightweight CLI that integrates into your Git workflow to provide h
35
36
 
36
37
  ### 1. Prerequisites
37
38
 
38
- 1. **Verify Node.js 20 or newer is installed**:
39
+ 1. **Verify Node.js 22.14.0 is installed**:
39
40
  ```bash
40
41
  node --version
41
42
  ```
@@ -137,13 +138,14 @@ The agent will:
137
138
 
138
139
  1. Treat findings as candidates and verify them against the current code.
139
140
  2. Fix confirmed issues using the repository's normal workflow.
140
- 3. Mark findings as fixed, already fixed, agent dismissed, user dismissed, deferred, or open.
141
- 4. Append a `## Resolution` checklist without rewriting the generated review.
142
- 5. Move fully handled timestamped reports into `.diffowl/reviews/resolved/`.
141
+ 3. For durable findings (0.3+), record lifecycle status with `diffowl findings fix`, `dismiss`, or `defer`.
142
+ 4. For legacy reports, mark findings as fixed, already fixed, agent dismissed, user dismissed, deferred, or open in a `## Resolution` checklist.
143
+ 5. Append or merge resolution state without rewriting the generated review body.
144
+ 6. Move fully handled timestamped reports into `.diffowl/reviews/resolved/` when every finding is complete.
143
145
 
144
- `latest.md` is only a copy of the newest report and is overwritten by future reviews. The skill updates the matching timestamped report as the durable record.
146
+ `latest.md` is only a copy of the newest report and is overwritten by future reviews. Markdown reports from 0.3+ are immutable snapshots; SQLite is the authoritative backlog for durable findings.
145
147
 
146
- The generated review content remains unchanged. Resolution state is appended under `## Resolution`. To reopen the OpenCode session for an archived report, pass its explicit path:
148
+ For legacy pre-0.3 reports, resolution state is appended under `## Resolution`. To reopen the OpenCode session for an archived report, pass its explicit path:
147
149
 
148
150
  ```bash
149
151
  diffowl chat .diffowl/reviews/resolved/review-<timestamp>.md
@@ -185,10 +187,11 @@ Runs a code review on your repository.
185
187
  - `--depth <depth>`: Overrides configured review depth. Valid values: `shallow`, `default`.
186
188
  - `--reasoning <effort>`: Overrides configured OpenCode reasoning variant. Valid values: `auto`, `none`, `minimal`, `low`, `medium`, `high`, `max`, `xhigh`.
187
189
  - `--verbose`: Includes suppressed findings and extra review details in the report.
190
+ - `--format <format>`: Output format: `text` (default) or `json`. JSON writes a versioned document to stdout and persists SQLite state.
188
191
 
189
192
  Candidates below `min_confidence` or outside changed files are excluded from actionable finding counts and review status. When any are excluded, the report includes a short diagnostic summary and points to `diffowl chat` for investigation. Outside-file candidates are shown in full with `--verbose`; below-threshold candidates remain available in the OpenCode session.
190
193
 
191
- Rendered findings have stable `Finding N` headings, making prompts such as “investigate finding 2” map directly to resolution checklist entries.
194
+ Rendered findings use stable `Finding N` headings. Reports from DiffOwl 0.3+ also include durable `fnd_*` IDs and observation classification (`new`, `existing`, `regressed`), making prompts such as “investigate finding 2” or `diffowl findings show fnd_abc` map directly to the backlog.
192
195
 
193
196
  Review depth controls both how much local context DiffOwl preloads and how much exploration the reviewer is expected to do:
194
197
 
@@ -275,6 +278,32 @@ diffowl server start
275
278
  diffowl server stop
276
279
  ```
277
280
 
281
+ ### `diffowl findings [list] | show | dismiss | defer | fix | reopen`
282
+
283
+ Inspect and manage the durable findings backlog stored in `.diffowl/state.db`.
284
+
285
+ ```bash
286
+ # List unresolved findings (open and regressed)
287
+ diffowl findings
288
+
289
+ # Inspect one finding by full id, id prefix, or latest:N
290
+ diffowl findings show fnd_abc --format json
291
+
292
+ # Mark fixed after verification
293
+ diffowl findings fix fnd_abc --note "Added null guard." --verified-by "pnpm run test"
294
+
295
+ # Dismiss a false positive
296
+ diffowl findings dismiss fnd_abc --reason "Guarded by caller."
297
+
298
+ # Defer intentionally
299
+ diffowl findings defer fnd_abc --reason "Needs upstream change."
300
+
301
+ # Reopen a previously fixed or dismissed finding
302
+ diffowl findings reopen fnd_abc --reason "Regression in new path."
303
+ ```
304
+
305
+ The unresolved backlog is durable: a finding does not auto-resolve just because a later review fails to mention it. Absence from a later model review never marks a finding fixed.
306
+
278
307
  ---
279
308
 
280
309
  ## Configuration (`.diffowl.yml`)
@@ -344,7 +373,8 @@ rules:
344
373
  Each completed review starts with a timestamped report and an ephemeral `latest.md` copy. The optional resolution skill moves fully handled timestamped reports into the resolved archive:
345
374
 
346
375
  ```text
347
- .diffowl/reviews/review-<timestamp>.md # Durable timestamped report
376
+ .diffowl/state.db # Authoritative review and finding state (0.3+)
377
+ .diffowl/reviews/review-<timestamp>.md # Immutable markdown export snapshot
348
378
  .diffowl/reviews/latest.md # Ephemeral copy of the newest report
349
379
  .diffowl/reviews/resolved/review-<timestamp>.md # Fully handled report archived by the skill
350
380
  ```
@@ -354,12 +384,31 @@ Review reports include YAML frontmatter similar to:
354
384
  ```yaml
355
385
  ---
356
386
  diffowl:
387
+ schema_version: 1
388
+ review_id: rev_...
357
389
  session_id: ses_...
358
390
  project_root: /path/to/project
359
391
  ---
360
392
  ```
361
393
 
362
- This metadata is used by `diffowl chat`. Agents may append a `## Resolution` section to timestamped reports, but should preserve the generated review body. DiffOwl does not delete review history automatically.
394
+ Finding headings in 0.3+ reports look like:
395
+
396
+ ```md
397
+ #### Finding 1 (`fnd_...`) — **new**
398
+
399
+ **[WARNING] src/auth.ts:12**
400
+ Missing null check
401
+ ```
402
+
403
+ This metadata is used by `diffowl chat`. For legacy pre-0.3 reports, agents may append a `## Resolution` section. For 0.3+ reports, use `diffowl findings *` only—do not edit markdown. DiffOwl does not delete review history automatically.
404
+
405
+ ### Upgrading to 0.3
406
+
407
+ - **No import step**: Existing markdown reports remain unchanged and chat-capable. They are not imported into SQLite.
408
+ - **New reviews persist state**: After upgrading, each `diffowl review` writes both SQLite state and a markdown snapshot.
409
+ - **Backlog semantics change**: Use `diffowl findings` for the unresolved backlog. Markdown `### Status` reflects the review snapshot only.
410
+ - **Resolution workflow**: Prefer `diffowl findings fix|dismiss|defer` over editing report checklists when durable findings exist. Never mark fixed without recorded verification (`--verified-by`).
411
+ - **Not in 0.3**: Semantic deduplication beyond fingerprint matching, automatic resolution when findings disappear, legacy report migration, retention cleanup, and SARIF export.
363
412
 
364
413
  ---
365
414