diff --git a/e2e/tests/comments-panel.spec.ts b/e2e/tests/comments-panel.spec.ts index 2d7b84e..4b44ffc 100644 --- a/e2e/tests/comments-panel.spec.ts +++ b/e2e/tests/comments-panel.spec.ts @@ -239,26 +239,6 @@ test.describe('Comments Panel — Git Mode', () => { await expect(card.locator('.resolved-badge')).toContainText('Resolved'); }); - test('unresolved carried-forward comment shows Unresolved badge', async ({ page, request }) => { - const mdPath = await getMdPath(request); - await addComment(request, mdPath, 1, 'Still unresolved'); - - // Finish + round-complete to carry forward - await request.post('/api/finish'); - const round = (await request.get('/api/session').then(r => r.json())).review_round; - await request.post('/api/round-complete'); - await waitForRound(request, round); - - await loadPage(page); - await page.keyboard.press('Shift+C'); - - const card = panelCards(page).first(); - await expect(card).toBeVisible(); - await expect(card.locator('.carried-forward-label')).toContainText('Unresolved'); - // Should NOT have a resolved badge - await expect(card.locator('.resolved-badge')).toHaveCount(0); - }); - test('clicking resolved comment in panel scrolls to inline resolved comment', async ({ page, request }) => { const mdPath = await getMdPath(request); await addComment(request, mdPath, 1, 'Resolve and scroll'); diff --git a/frontend/app.js b/frontend/app.js index 512e2fa..5bb2578 100644 --- a/frontend/app.js +++ b/frontend/app.js @@ -4206,12 +4206,6 @@ : 'Lines ' + comment.start_line + '-' + comment.end_line; headerLeft.appendChild(lineRef); } - if (opts.showCarriedForward && comment.carried_forward && !comment.resolved) { - const label = document.createElement('span'); - label.className = 'carried-forward-label'; - label.textContent = 'Unresolved'; - headerLeft.appendChild(label); - } const time = document.createElement('span'); time.className = 'comment-time'; time.textContent = formatTime(comment.created_at); diff --git a/frontend/style.css b/frontend/style.css index 68d733d..f443609 100644 --- a/frontend/style.css +++ b/frontend/style.css @@ -1002,14 +1002,6 @@ body.dragging .line-comment-gutter.drag-range:not(.drag-endpoint) .line-add { op font-family: var(--font-body); } -.comment-card.carried-forward { - border-color: var(--orange); -} -.carried-forward-label { - font-size: 11px; - color: var(--orange); - font-weight: 500; -} .comment-round-badge { font-size: 10px; font-weight: 500; diff --git a/frontend/theme.css b/frontend/theme.css index 099bca1..b58d66e 100644 --- a/frontend/theme.css +++ b/frontend/theme.css @@ -45,7 +45,6 @@ --diff-word-add-bg: rgba(63, 185, 80, 0.4); --diff-word-del-bg: rgba(248, 81, 73, 0.4); --badge-resolved-bg: rgba(158, 206, 106, 0.12); - --badge-unresolved-bg: rgba(255, 158, 100, 0.14); --yellow-subtle: rgba(224, 175, 104, 0.08); --yellow-bg: rgba(224, 175, 104, 0.14); --yellow-border: rgba(224, 175, 104, 0.2); @@ -92,7 +91,6 @@ --diff-word-add-bg: rgba(26, 127, 55, 0.25); --diff-word-del-bg: rgba(207, 34, 46, 0.25); --badge-resolved-bg: rgba(26, 127, 55, 0.1); - --badge-unresolved-bg: rgba(188, 76, 0, 0.1); --yellow-subtle: rgba(154, 103, 0, 0.06); --yellow-bg: rgba(154, 103, 0, 0.1); --yellow-border: rgba(154, 103, 0, 0.16); @@ -139,7 +137,6 @@ --diff-word-add-bg: rgba(63, 185, 80, 0.4); --diff-word-del-bg: rgba(248, 81, 73, 0.4); --badge-resolved-bg: rgba(158, 206, 106, 0.12); - --badge-unresolved-bg: rgba(255, 158, 100, 0.14); --yellow-subtle: rgba(224, 175, 104, 0.08); --yellow-bg: rgba(224, 175, 104, 0.14); --yellow-border: rgba(224, 175, 104, 0.2); @@ -185,7 +182,6 @@ --diff-word-add-bg: rgba(26, 127, 55, 0.25); --diff-word-del-bg: rgba(207, 34, 46, 0.25); --badge-resolved-bg: rgba(26, 127, 55, 0.1); - --badge-unresolved-bg: rgba(188, 76, 0, 0.1); --yellow-subtle: rgba(154, 103, 0, 0.06); --yellow-bg: rgba(154, 103, 0, 0.1); --yellow-border: rgba(154, 103, 0, 0.16); diff --git a/integration_hashes_gen.go b/integration_hashes_gen.go index aef5078..e0c0c5d 100644 --- a/integration_hashes_gen.go +++ b/integration_hashes_gen.go @@ -3,18 +3,20 @@ package main var integrationHashes = map[string]string{ - "integrations/aider/CONVENTIONS.md": "72cad55c188231f2f026863fdf910b8d45b891593b660719178fac082bb900d9", + "integrations/aider/CONVENTIONS.md": "394c783f46ef33568b24270e3d32235724f832e020fb9b1570a856e90ff66512", "integrations/claude-code/.claude-plugin/plugin.json": "1802a767f5e73fec437b94d70ffac911b3672a2508d3e3e9da2d1ed4437d558d", - "integrations/claude-code/commands/crit.md": "899d8a98a03fbbb9775ec47e77e8ea5cba6bfdd8b3020e231547cb210101495e", - "integrations/claude-code/skills/crit-cli/SKILL.md": "51139680abae1584527d2560e4385eb15283fe0250371369a250d33031494a1a", - "integrations/cline/crit.md": "3e8fb99bb9e25f4405c47234d3cae3125b9c4bd5083af5f68f6849d394832de4", - "integrations/codex/skills/crit-cli/SKILL.md": "972044b6ced44fbc40cdc9edd6f65280ad1b48f311cd76c25a3b911006253434", - "integrations/codex/skills/crit/SKILL.md": "fc39931fad4597decebd31c5b3a4aa0e9c79cc4517fdf8fe1e51eeaafdeb7fcb", - "integrations/cursor/commands/crit.md": "ddbb0e93a12f6929ca07d97805302f3a2a47dcf25e0aa017e77e0f3c7d52868d", - "integrations/cursor/skills/crit-cli/SKILL.md": "2b58c84bf578790236448474d4d5a402d361c9fded9865db648df3bb0aee9390", - "integrations/github-copilot/commands/crit.prompt.md": "226da1fcbd27776fd0823dced05d31ac422bebcd4b9f4f87d85e4deff0503f2b", - "integrations/github-copilot/skills/crit-cli/SKILL.md": "60f31ae65311911ab0d7a234445ca8ae87ec2d2c9cb64832b902162faf627b45", - "integrations/opencode/SKILL.md": "ca158d41ae5fd6d7ad2a3bc83e90cc427eea4f49b8c14b8496eb168fd0757e23", - "integrations/opencode/crit.md": "7eeed082e4033862886755c537672d961e810dabd79fd82d8f9aab6aab74d314", - "integrations/windsurf/crit.md": "633814f69ca784f59e73e8b0def280588f055bb4d3db2e44ca56a91f98a3b237", + "integrations/claude-code/commands/crit.md": "3a92f67cbb361090d306ec853bc2530a83559ea0f7fc3a0fd8ab82b32394bdd7", + "integrations/claude-code/hooks/hooks.json": "fb569475dc3586025fb9bc9ed0131adab8a36355aa79538b454e4fbd8f5a8567", + "integrations/claude-code/hooks/plan-review.sh": "6648d6ef3b916e38025b67bb116c2ba16f05cf10c16ebf96c7fda9f3ebe28418", + "integrations/claude-code/skills/crit-cli/SKILL.md": "d4d22bb51825dcc130f3695961f8c83247954a82b252023cccc066b4cbcc0478", + "integrations/cline/crit.md": "d598ef81bda18b8b0688cc130962d15ecfb9cd22fe47d7e888caf0c67d931510", + "integrations/codex/skills/crit-cli/SKILL.md": "1358ac659df061f71dc4e853ba9f466f61b5505228f782499d5a93895800dfd8", + "integrations/codex/skills/crit/SKILL.md": "b72164af205bf12ea0875b06a3c6207383e0084fc7f6f69ff6e9bfa00f1e6f2b", + "integrations/cursor/commands/crit.md": "aaf59f93e132e0abcc2e74fa0a193fe9b6b1b569be7a1cc0b3a8418458be1f7f", + "integrations/cursor/skills/crit-cli/SKILL.md": "7638638fada679216fe21eafb4c8a506c96ec36965624332e6560525e88ffab0", + "integrations/github-copilot/commands/crit.prompt.md": "64f41231c7bb65604aa57665e84192f9c79cbd7898d3256802004d60b8baa99e", + "integrations/github-copilot/skills/crit-cli/SKILL.md": "d7a50e5be38ea6514a56422fa6e910c24ab1311eeeed572bbfa9c26fd7ef327c", + "integrations/opencode/SKILL.md": "27a82936991b3d1a92ed940fafcde2fd2636ec5d17d7311248b52e52ce1c3d56", + "integrations/opencode/crit.md": "26e517158042ee4b0d45bb43ee5bb86831f41197bf4d34948ae2b064ddc98aaf", + "integrations/windsurf/crit.md": "e0557e430b0e9b1af5417ae910018db00886ad8d1819c748e951cd3971961951", } diff --git a/integrations/aider/CONVENTIONS.md b/integrations/aider/CONVENTIONS.md index a9312b5..104aaf7 100644 --- a/integrations/aider/CONVENTIONS.md +++ b/integrations/aider/CONVENTIONS.md @@ -34,14 +34,14 @@ crit ## After review -Read `.crit.json` to find the user's inline comments. Comments have three scopes: line comments in `files..comments` (with `start_line`/`end_line`), file comments (same array, `scope: "file"`, lines are 0), and review comments in the top-level `review_comments` array (`scope: "review"`, not tied to any file). A comment is unresolved if `"resolved": false` or if the `resolved` field is missing. Address each unresolved comment by revising the referenced file. After addressing, reply with what you did: `crit comment --reply-to --resolve --author 'Aider' ''`. This works for both file comment IDs (`c1`) and review comment IDs (`r0`). +Read `.crit.json` to find the user's inline comments. Comments have three scopes: line comments in `files..comments` (with `start_line`/`end_line`), file comments (same array, `scope: "file"`, lines are 0), and review comments in the top-level `review_comments` array (`scope: "review"`, not tied to any file). Address each unresolved comment by revising the referenced file. After addressing, reply with what you did: `crit comment --reply-to --author 'Aider' ''`. This works for both file comment IDs (`c1`) and review comment IDs (`r0`). -When addressing multiple comments, use `--json` to resolve them all in one call: +When addressing multiple comments, use `--json` to reply to them all in one call: ```bash echo '[ - {"reply_to": "c1", "body": "Fixed", "resolve": true}, - {"reply_to": "c2", "body": "Refactored as suggested", "resolve": true} + {"reply_to": "c1", "body": "Fixed"}, + {"reply_to": "c2", "body": "Refactored as suggested"} ]' | crit comment --json --author 'Aider' ``` @@ -58,8 +58,8 @@ crit comment --author 'Aider' '' # Review-level c crit comment --author 'Aider' '' # File-level comment crit comment --author 'Aider' : '' # Line comment crit comment --author 'Aider' :- '' # Line range comment -crit comment --reply-to c1 --resolve --author 'Aider' '' # Reply to file comment -crit comment --reply-to r0 --resolve --author 'Aider' '' # Reply to review comment +crit comment --reply-to c1 --author 'Aider' '' # Reply to file comment +crit comment --reply-to r0 --author 'Aider' '' # Reply to review comment ``` Paths are relative, line numbers are 1-indexed, comments are appended (never replaced). Creates `.crit.json` automatically if it doesn't exist. diff --git a/integrations/claude-code/commands/crit.md b/integrations/claude-code/commands/crit.md index 9f3359b..6ebbea0 100644 --- a/integrations/claude-code/commands/crit.md +++ b/integrations/claude-code/commands/crit.md @@ -73,14 +73,14 @@ For each unresolved comment: 2. If a comment contains a suggestion block, apply that specific change 3. Revise the **referenced file** to address the feedback - this could be the plan file or any code file from the git diff 4. Use the Edit tool to make targeted changes -5. Reply to the comment with what you did: `crit comment --reply-to --resolve --author 'Claude Code' ''` +5. Reply to the comment with what you did: `crit comment --reply-to --author 'Claude Code' ''` -When addressing multiple comments, use `--json` to resolve them all in one call: +When addressing multiple comments, use `--json` to reply to them all in one call: ```bash echo '[ - {"reply_to": "c1", "body": "Fixed", "resolve": true}, - {"reply_to": "c2", "body": "Refactored as suggested", "resolve": true} + {"reply_to": "c1", "body": "Fixed"}, + {"reply_to": "c2", "body": "Refactored as suggested"} ]' | crit comment --json --author 'Claude Code' ``` diff --git a/integrations/claude-code/skills/crit-cli/SKILL.md b/integrations/claude-code/skills/crit-cli/SKILL.md index 0bfaed2..6a522f1 100644 --- a/integrations/claude-code/skills/crit-cli/SKILL.md +++ b/integrations/claude-code/skills/crit-cli/SKILL.md @@ -60,23 +60,23 @@ After a crit review session, comments are in `.crit.json`. Comments have three s - Address each unresolved comment by editing the relevant file at the referenced location - Before acting on a comment, check its `replies` array — if you have already replied, the reviewer may be following up conversationally rather than requesting a new code change -### Resolving comments +### Replying to comments After addressing a comment, reply to it using the CLI: ```bash -crit comment --reply-to c1 --resolve --author 'Claude Code' 'Fixed by extracting to helper' -crit comment --reply-to r0 --resolve --author 'Claude Code' 'All issues addressed' +crit comment --reply-to c1 --author 'Claude Code' 'Fixed by extracting to helper' +crit comment --reply-to r0 --author 'Claude Code' 'All issues addressed' ``` -This adds a reply to the comment thread and marks it resolved. Works for both file comment IDs (`c1`, `c2`, ...) and review comment IDs (`r0`, `r1`, ...). You can also reply without resolving (omit `--resolve`) if discussion is ongoing. +This adds a reply to the comment thread. Works for both file comment IDs (`c1`, `c2`, ...) and review comment IDs (`r0`, `r1`, ...). Resolving is a user action — do not mark comments resolved from AI. ### Plan mode comments When reviewing plans (via `crit plan` or the ExitPlanMode hook), `.crit.json` is stored in `~/.crit/plans//` — not the project root. Use `--plan ` so `crit comment` finds the right file: ```bash -crit comment --plan my-plan-2026-03-23 --reply-to c1 --resolve --author 'Claude Code' 'Updated the plan' +crit comment --plan my-plan-2026-03-23 --reply-to c1 --author 'Claude Code' 'Updated the plan' ``` The `--plan` flag resolves to the plan storage directory automatically. The slug is shown in the review feedback prompt. **Always use `--plan` when responding to plan review comments** — without it, `crit comment` looks in the project root and won't find the comments. @@ -110,8 +110,8 @@ crit comment --author 'Claude Code' 'Overall architecture looks solid' crit comment --author 'Claude Code' src/auth.go 'This file needs restructuring' crit comment --author 'Claude Code' src/auth.go:42 'Missing null check on user.session — will panic if session expired' crit comment --author 'Claude Code' src/handler.go:15-28 'This error is swallowed silently' -crit comment --reply-to c1 --resolve --author 'Claude Code' 'Added null check on line 42' -crit comment --reply-to r0 --resolve --author 'Claude Code' 'All issues addressed' +crit comment --reply-to c1 --author 'Claude Code' 'Added null check on line 42' +crit comment --reply-to r0 --author 'Claude Code' 'All issues addressed' ``` Rules: @@ -133,8 +133,8 @@ echo '[ {"path": "session.go", "body": "restructure", "scope": "file"}, {"file": "src/auth.go", "line": 42, "body": "Missing null check"}, {"file": "src/auth.go", "line": "50-55", "body": "Extract to helper"}, - {"reply_to": "c1", "body": "Fixed — added null check", "resolve": true}, - {"reply_to": "r0", "body": "Done", "resolve": true} + {"reply_to": "c1", "body": "Fixed — added null check"}, + {"reply_to": "r0", "body": "Done"} ]' | crit comment --json --author 'Claude Code' ``` @@ -150,7 +150,7 @@ JSON schema per entry: | `author` | string | no | Per-entry override (falls back to `--author`) | | `scope` | string | no | `"review"`, `"file"`, or omit to infer from context | | `reply_to` | string | yes (reply) | Comment ID (`"c1"` or `"r0"`) | -| `resolve` | bool | no | Mark the parent comment resolved | +| `resolve` | bool | no | Mark the parent comment resolved (user action — don't set from AI) | Scope inference when `scope` is omitted: - Has `reply_to` → reply diff --git a/integrations/cline/crit.md b/integrations/cline/crit.md index 0ec441e..9a1736c 100644 --- a/integrations/cline/crit.md +++ b/integrations/cline/crit.md @@ -34,14 +34,14 @@ crit ## After review -Read `.crit.json` to find the user's inline comments. Comments have three scopes: line comments in `files..comments` (with `start_line`/`end_line`), file comments (same array, `scope: "file"`, lines are 0), and review comments in the top-level `review_comments` array (`scope: "review"`, not tied to any file). A comment is unresolved if `"resolved": false` or if the `resolved` field is missing. Address each unresolved comment by revising the referenced file. After addressing, reply with what you did: `crit comment --reply-to --resolve --author 'Cline' ''`. This works for both file comment IDs (`c1`) and review comment IDs (`r0`). +Read `.crit.json` to find the user's inline comments. Comments have three scopes: line comments in `files..comments` (with `start_line`/`end_line`), file comments (same array, `scope: "file"`, lines are 0), and review comments in the top-level `review_comments` array (`scope: "review"`, not tied to any file). Address each unresolved comment by revising the referenced file. After addressing, reply with what you did: `crit comment --reply-to --author 'Cline' ''`. This works for both file comment IDs (`c1`) and review comment IDs (`r0`). -When addressing multiple comments, use `--json` to resolve them all in one call: +When addressing multiple comments, use `--json` to reply to them all in one call: ```bash echo '[ - {"reply_to": "c1", "body": "Fixed", "resolve": true}, - {"reply_to": "c2", "body": "Refactored as suggested", "resolve": true} + {"reply_to": "c1", "body": "Fixed"}, + {"reply_to": "c2", "body": "Refactored as suggested"} ]' | crit comment --json --author 'Cline' ``` @@ -58,8 +58,8 @@ crit comment --author 'Cline' '' # Review-level c crit comment --author 'Cline' '' # File-level comment crit comment --author 'Cline' : '' # Line comment crit comment --author 'Cline' :- '' # Line range comment -crit comment --reply-to c1 --resolve --author 'Cline' '' # Reply to file comment -crit comment --reply-to r0 --resolve --author 'Cline' '' # Reply to review comment +crit comment --reply-to c1 --author 'Cline' '' # Reply to file comment +crit comment --reply-to r0 --author 'Cline' '' # Reply to review comment ``` Paths are relative, line numbers are 1-indexed, comments are appended (never replaced). Creates `.crit.json` automatically if it doesn't exist. diff --git a/integrations/codex/skills/crit-cli/SKILL.md b/integrations/codex/skills/crit-cli/SKILL.md index 7d885bd..94b0b1c 100644 --- a/integrations/codex/skills/crit-cli/SKILL.md +++ b/integrations/codex/skills/crit-cli/SKILL.md @@ -60,22 +60,22 @@ After a crit review session, comments are in `.crit.json`. Comments have three s - Address each unresolved comment by editing the relevant file at the referenced location - Before acting on a comment, check its `replies` array — if you have already replied, the reviewer may be following up conversationally rather than requesting a new code change -### Resolving comments +### Replying to comments After addressing a comment, reply to it using the CLI: ```bash -crit comment --reply-to c1 --resolve --author 'Codex' 'Fixed by extracting to helper' -crit comment --reply-to r0 --resolve --author 'Codex' 'All issues addressed' +crit comment --reply-to c1 --author 'Codex' 'Fixed by extracting to helper' +crit comment --reply-to r0 --author 'Codex' 'All issues addressed' ``` -This adds a reply to the comment thread and marks it resolved. Works for both file comment IDs (`c1`, `c2`, ...) and review comment IDs (`r0`, `r1`, ...). You can also reply without resolving (omit `--resolve`) if discussion is ongoing. +This adds a reply to the comment thread. Works for both file comment IDs (`c1`, `c2`, ...) and review comment IDs (`r0`, `r1`, ...). Resolving is a user action — do not mark comments resolved from AI. ### Plan mode comments When reviewing plans (via `crit plan` or the ExitPlanMode hook), `.crit.json` is stored in `~/.crit/plans//` — not the project root. Use `--plan ` so `crit comment` finds the right file: ```bash -crit comment --plan my-plan-2026-03-23 --reply-to c1 --resolve --author 'Claude Code' 'Updated the plan' +crit comment --plan my-plan-2026-03-23 --reply-to c1 --author 'Claude Code' 'Updated the plan' ``` The `--plan` flag resolves to the plan storage directory automatically. The slug is shown in the review feedback prompt. **Always use `--plan` when responding to plan review comments** — without it, `crit comment` looks in the project root and won't find the comments. @@ -109,8 +109,8 @@ crit comment --author 'Codex' 'Overall architecture looks solid' crit comment --author 'Codex' src/auth.go 'This file needs restructuring' crit comment --author 'Codex' src/auth.go:42 'Missing null check on user.session — will panic if session expired' crit comment --author 'Codex' src/handler.go:15-28 'This error is swallowed silently' -crit comment --reply-to c1 --resolve --author 'Codex' 'Added null check on line 42' -crit comment --reply-to r0 --resolve --author 'Codex' 'All issues addressed' +crit comment --reply-to c1 --author 'Codex' 'Added null check on line 42' +crit comment --reply-to r0 --author 'Codex' 'All issues addressed' ``` Rules: @@ -132,8 +132,8 @@ echo '[ {"path": "session.go", "body": "restructure", "scope": "file"}, {"file": "src/auth.go", "line": 42, "body": "Missing null check"}, {"file": "src/auth.go", "line": "50-55", "body": "Extract to helper"}, - {"reply_to": "c1", "body": "Fixed — added null check", "resolve": true}, - {"reply_to": "r0", "body": "Done", "resolve": true} + {"reply_to": "c1", "body": "Fixed — added null check"}, + {"reply_to": "r0", "body": "Done"} ]' | crit comment --json --author 'Codex' ``` @@ -149,7 +149,7 @@ JSON schema per entry: | `author` | string | no | Per-entry override (falls back to `--author`) | | `scope` | string | no | `"review"`, `"file"`, or omit to infer from context | | `reply_to` | string | yes (reply) | Comment ID (`"c1"` or `"r0"`) | -| `resolve` | bool | no | Mark the parent comment resolved | +| `resolve` | bool | no | Mark the parent comment resolved (user action — don't set from AI) | Scope inference when `scope` is omitted: - Has `reply_to` → reply diff --git a/integrations/codex/skills/crit/SKILL.md b/integrations/codex/skills/crit/SKILL.md index 87b166f..bbd9270 100644 --- a/integrations/codex/skills/crit/SKILL.md +++ b/integrations/codex/skills/crit/SKILL.md @@ -68,14 +68,14 @@ For each unresolved comment: 1. Understand what the comment asks for (clarification, change, addition, removal) 2. If a comment contains a suggestion block, apply that specific change 3. Revise the **referenced file** to address the feedback — this could be the plan file or any code file from the git diff -4. Reply to the comment with what you did: `crit comment --reply-to --resolve --author 'Codex' ''` +4. Reply to the comment with what you did: `crit comment --reply-to --author 'Codex' ''` -When addressing multiple comments, use `--json` to resolve them all in one call: +When addressing multiple comments, use `--json` to reply to them all in one call: ```bash echo '[ - {"reply_to": "c1", "body": "Fixed", "resolve": true}, - {"reply_to": "c2", "body": "Refactored as suggested", "resolve": true} + {"reply_to": "c1", "body": "Fixed"}, + {"reply_to": "c2", "body": "Refactored as suggested"} ]' | crit comment --json --author 'Codex' ``` diff --git a/integrations/cursor/commands/crit.md b/integrations/cursor/commands/crit.md index 26561f5..4de971f 100644 --- a/integrations/cursor/commands/crit.md +++ b/integrations/cursor/commands/crit.md @@ -61,14 +61,14 @@ For each unresolved comment: 1. Understand what the comment asks for (clarification, change, addition, removal) 2. If a comment contains a suggestion block, apply that specific change 3. Revise the **referenced file** to address the feedback - this could be the plan file or any code file -4. Reply to the comment with what you did: `crit comment --reply-to --resolve --author 'Cursor' ''` +4. Reply to the comment with what you did: `crit comment --reply-to --author 'Cursor' ''` -When addressing multiple comments, use `--json` to resolve them all in one call: +When addressing multiple comments, use `--json` to reply to them all in one call: ```bash echo '[ - {"reply_to": "c1", "body": "Fixed", "resolve": true}, - {"reply_to": "c2", "body": "Refactored as suggested", "resolve": true} + {"reply_to": "c1", "body": "Fixed"}, + {"reply_to": "c2", "body": "Refactored as suggested"} ]' | crit comment --json --author 'Cursor' ``` diff --git a/integrations/cursor/skills/crit-cli/SKILL.md b/integrations/cursor/skills/crit-cli/SKILL.md index cc1e1d3..94b9a86 100644 --- a/integrations/cursor/skills/crit-cli/SKILL.md +++ b/integrations/cursor/skills/crit-cli/SKILL.md @@ -60,22 +60,22 @@ After a crit review session, comments are in `.crit.json`. Comments have three s - Address each unresolved comment by editing the relevant file at the referenced location - Before acting on a comment, check its `replies` array — if you have already replied, the reviewer may be following up conversationally rather than requesting a new code change -### Resolving comments +### Replying to comments After addressing a comment, reply to it using the CLI: ```bash -crit comment --reply-to c1 --resolve --author 'Cursor' 'Fixed by extracting to helper' -crit comment --reply-to r0 --resolve --author 'Cursor' 'All issues addressed' +crit comment --reply-to c1 --author 'Cursor' 'Fixed by extracting to helper' +crit comment --reply-to r0 --author 'Cursor' 'All issues addressed' ``` -This adds a reply to the comment thread and marks it resolved. Works for both file comment IDs (`c1`, `c2`, ...) and review comment IDs (`r0`, `r1`, ...). You can also reply without resolving (omit `--resolve`) if discussion is ongoing. +This adds a reply to the comment thread. Works for both file comment IDs (`c1`, `c2`, ...) and review comment IDs (`r0`, `r1`, ...). Resolving is a user action — do not mark comments resolved from AI. ### Plan mode comments When reviewing plans (via `crit plan` or the ExitPlanMode hook), `.crit.json` is stored in `~/.crit/plans//` — not the project root. Use `--plan ` so `crit comment` finds the right file: ```bash -crit comment --plan my-plan-2026-03-23 --reply-to c1 --resolve --author 'Claude Code' 'Updated the plan' +crit comment --plan my-plan-2026-03-23 --reply-to c1 --author 'Claude Code' 'Updated the plan' ``` The `--plan` flag resolves to the plan storage directory automatically. The slug is shown in the review feedback prompt. **Always use `--plan` when responding to plan review comments** — without it, `crit comment` looks in the project root and won't find the comments. @@ -109,8 +109,8 @@ crit comment --author 'Cursor' 'Overall architecture looks solid' crit comment --author 'Cursor' src/auth.go 'This file needs restructuring' crit comment --author 'Cursor' src/auth.go:42 'Missing null check on user.session — will panic if session expired' crit comment --author 'Cursor' src/handler.go:15-28 'This error is swallowed silently' -crit comment --reply-to c1 --resolve --author 'Cursor' 'Added null check on line 42' -crit comment --reply-to r0 --resolve --author 'Cursor' 'All issues addressed' +crit comment --reply-to c1 --author 'Cursor' 'Added null check on line 42' +crit comment --reply-to r0 --author 'Cursor' 'All issues addressed' ``` Rules: @@ -132,8 +132,8 @@ echo '[ {"path": "session.go", "body": "restructure", "scope": "file"}, {"file": "src/auth.go", "line": 42, "body": "Missing null check"}, {"file": "src/auth.go", "line": "50-55", "body": "Extract to helper"}, - {"reply_to": "c1", "body": "Fixed — added null check", "resolve": true}, - {"reply_to": "r0", "body": "Done", "resolve": true} + {"reply_to": "c1", "body": "Fixed — added null check"}, + {"reply_to": "r0", "body": "Done"} ]' | crit comment --json --author 'Cursor' ``` @@ -149,7 +149,7 @@ JSON schema per entry: | `author` | string | no | Per-entry override (falls back to `--author`) | | `scope` | string | no | `"review"`, `"file"`, or omit to infer from context | | `reply_to` | string | yes (reply) | Comment ID (`"c1"` or `"r0"`) | -| `resolve` | bool | no | Mark the parent comment resolved | +| `resolve` | bool | no | Mark the parent comment resolved (user action — don't set from AI) | Scope inference when `scope` is omitted: - Has `reply_to` → reply diff --git a/integrations/github-copilot/commands/crit.prompt.md b/integrations/github-copilot/commands/crit.prompt.md index 0a91ef5..f77cbab 100644 --- a/integrations/github-copilot/commands/crit.prompt.md +++ b/integrations/github-copilot/commands/crit.prompt.md @@ -61,14 +61,14 @@ For each unresolved comment: 1. Understand what the comment asks for (clarification, change, addition, removal) 2. If a comment contains a suggestion block, apply that specific change 3. Revise the **referenced file** to address the feedback - this could be the plan file or any code file -4. Reply to the comment with what you did: `crit comment --reply-to --resolve --author 'GitHub Copilot' ''` +4. Reply to the comment with what you did: `crit comment --reply-to --author 'GitHub Copilot' ''` -When addressing multiple comments, use `--json` to resolve them all in one call: +When addressing multiple comments, use `--json` to reply to them all in one call: ```bash echo '[ - {"reply_to": "c1", "body": "Fixed", "resolve": true}, - {"reply_to": "c2", "body": "Refactored as suggested", "resolve": true} + {"reply_to": "c1", "body": "Fixed"}, + {"reply_to": "c2", "body": "Refactored as suggested"} ]' | crit comment --json --author 'GitHub Copilot' ``` diff --git a/integrations/github-copilot/skills/crit-cli/SKILL.md b/integrations/github-copilot/skills/crit-cli/SKILL.md index 5822eae..366789b 100644 --- a/integrations/github-copilot/skills/crit-cli/SKILL.md +++ b/integrations/github-copilot/skills/crit-cli/SKILL.md @@ -60,22 +60,22 @@ After a crit review session, comments are in `.crit.json`. Comments have three s - Address each unresolved comment by editing the relevant file at the referenced location - Before acting on a comment, check its `replies` array — if you have already replied, the reviewer may be following up conversationally rather than requesting a new code change -### Resolving comments +### Replying to comments After addressing a comment, reply to it using the CLI: ```bash -crit comment --reply-to c1 --resolve --author 'Copilot' 'Fixed by extracting to helper' -crit comment --reply-to r0 --resolve --author 'Copilot' 'All issues addressed' +crit comment --reply-to c1 --author 'Copilot' 'Fixed by extracting to helper' +crit comment --reply-to r0 --author 'Copilot' 'All issues addressed' ``` -This adds a reply to the comment thread and marks it resolved. Works for both file comment IDs (`c1`, `c2`, ...) and review comment IDs (`r0`, `r1`, ...). You can also reply without resolving (omit `--resolve`) if discussion is ongoing. +This adds a reply to the comment thread. Works for both file comment IDs (`c1`, `c2`, ...) and review comment IDs (`r0`, `r1`, ...). Resolving is a user action — do not mark comments resolved from AI. ### Plan mode comments When reviewing plans (via `crit plan` or the ExitPlanMode hook), `.crit.json` is stored in `~/.crit/plans//` — not the project root. Use `--plan ` so `crit comment` finds the right file: ```bash -crit comment --plan my-plan-2026-03-23 --reply-to c1 --resolve --author 'Claude Code' 'Updated the plan' +crit comment --plan my-plan-2026-03-23 --reply-to c1 --author 'Claude Code' 'Updated the plan' ``` The `--plan` flag resolves to the plan storage directory automatically. The slug is shown in the review feedback prompt. **Always use `--plan` when responding to plan review comments** — without it, `crit comment` looks in the project root and won't find the comments. @@ -109,8 +109,8 @@ crit comment --author 'Copilot' 'Overall architecture looks solid' crit comment --author 'Copilot' src/auth.go 'This file needs restructuring' crit comment --author 'Copilot' src/auth.go:42 'Missing null check on user.session — will panic if session expired' crit comment --author 'Copilot' src/handler.go:15-28 'This error is swallowed silently' -crit comment --reply-to c1 --resolve --author 'Copilot' 'Added null check on line 42' -crit comment --reply-to r0 --resolve --author 'Copilot' 'All issues addressed' +crit comment --reply-to c1 --author 'Copilot' 'Added null check on line 42' +crit comment --reply-to r0 --author 'Copilot' 'All issues addressed' ``` Rules: @@ -132,8 +132,8 @@ echo '[ {"path": "session.go", "body": "restructure", "scope": "file"}, {"file": "src/auth.go", "line": 42, "body": "Missing null check"}, {"file": "src/auth.go", "line": "50-55", "body": "Extract to helper"}, - {"reply_to": "c1", "body": "Fixed — added null check", "resolve": true}, - {"reply_to": "r0", "body": "Done", "resolve": true} + {"reply_to": "c1", "body": "Fixed — added null check"}, + {"reply_to": "r0", "body": "Done"} ]' | crit comment --json --author 'GitHub Copilot' ``` @@ -149,7 +149,7 @@ JSON schema per entry: | `author` | string | no | Per-entry override (falls back to `--author`) | | `scope` | string | no | `"review"`, `"file"`, or omit to infer from context | | `reply_to` | string | yes (reply) | Comment ID (`"c1"` or `"r0"`) | -| `resolve` | bool | no | Mark the parent comment resolved | +| `resolve` | bool | no | Mark the parent comment resolved (user action — don't set from AI) | Scope inference when `scope` is omitted: - Has `reply_to` → reply diff --git a/integrations/opencode/SKILL.md b/integrations/opencode/SKILL.md index 3f7137a..9985e0c 100644 --- a/integrations/opencode/SKILL.md +++ b/integrations/opencode/SKILL.md @@ -69,16 +69,16 @@ After a crit review session, comments are in `.crit.json`. Comments have three s - `resolved`: `false` or **missing** — both mean unresolved. Only `true` means resolved. - Address each unresolved comment by editing the relevant file at the referenced location -### Resolving comments +### Replying to comments After addressing a comment, reply to it using the CLI: ```bash -crit comment --reply-to c1 --resolve --author 'OpenCode' 'Fixed by extracting to helper' -crit comment --reply-to r0 --resolve --author 'OpenCode' 'All issues addressed' +crit comment --reply-to c1 --author 'OpenCode' 'Fixed by extracting to helper' +crit comment --reply-to r0 --author 'OpenCode' 'All issues addressed' ``` -This adds a reply to the comment thread and marks it resolved. Works for both file comment IDs (`c1`, `c2`, ...) and review comment IDs (`r0`, `r1`, ...). You can also reply without resolving (omit `--resolve`) if discussion is ongoing. +This adds a reply to the comment thread. Works for both file comment IDs (`c1`, `c2`, ...) and review comment IDs (`r0`, `r1`, ...). Resolving is a user action — do not mark comments resolved from AI. ## Leaving Comments with crit comment CLI @@ -121,8 +121,8 @@ echo '[ {"path": "session.go", "body": "restructure", "scope": "file"}, {"file": "src/auth.go", "line": 42, "body": "Missing null check"}, {"file": "src/auth.go", "line": "50-55", "body": "Extract to helper"}, - {"reply_to": "c1", "body": "Fixed — added null check", "resolve": true}, - {"reply_to": "r0", "body": "Done", "resolve": true} + {"reply_to": "c1", "body": "Fixed — added null check"}, + {"reply_to": "r0", "body": "Done"} ]' | crit comment --json --author 'OpenCode' ``` @@ -138,7 +138,7 @@ JSON schema per entry: | `author` | string | no | Per-entry override (falls back to `--author`) | | `scope` | string | no | `"review"`, `"file"`, or omit to infer from context | | `reply_to` | string | yes (reply) | Comment ID (`"c1"` or `"r0"`) | -| `resolve` | bool | no | Mark the parent comment resolved | +| `resolve` | bool | no | Mark the parent comment resolved (user action — don't set from AI) | Scope inference when `scope` is omitted: - Has `reply_to` → reply diff --git a/integrations/opencode/crit.md b/integrations/opencode/crit.md index 3a05333..a1d378d 100644 --- a/integrations/opencode/crit.md +++ b/integrations/opencode/crit.md @@ -70,14 +70,14 @@ For each unresolved comment: 1. Understand what the comment asks for. 2. If a comment contains a suggestion block, apply that specific change. 3. Revise the referenced file to address the feedback - this could be the plan file or any code file from the git diff. -4. Reply to the comment with what you did: `crit comment --reply-to --resolve --author 'OpenCode' ''` (works for both file comment IDs like `c1` and review comment IDs like `r0`) +4. Reply to the comment with what you did: `crit comment --reply-to --author 'OpenCode' ''` (works for both file comment IDs like `c1` and review comment IDs like `r0`) -When addressing multiple comments, use `--json` to resolve them all in one call: +When addressing multiple comments, use `--json` to reply to them all in one call: ```bash echo '[ - {"reply_to": "c1", "body": "Fixed", "resolve": true}, - {"reply_to": "c2", "body": "Refactored as suggested", "resolve": true} + {"reply_to": "c1", "body": "Fixed"}, + {"reply_to": "c2", "body": "Refactored as suggested"} ]' | crit comment --json --author 'OpenCode' ``` diff --git a/integrations/windsurf/crit.md b/integrations/windsurf/crit.md index 114ff4f..fb0d839 100644 --- a/integrations/windsurf/crit.md +++ b/integrations/windsurf/crit.md @@ -34,14 +34,14 @@ crit ## After review -Read `.crit.json` to find the user's inline comments. Comments have three scopes: line comments in `files..comments` (with `start_line`/`end_line`), file comments (same array, `scope: "file"`, lines are 0), and review comments in the top-level `review_comments` array (`scope: "review"`, not tied to any file). A comment is unresolved if `"resolved": false` or if the `resolved` field is missing. Address each unresolved comment by revising the referenced file. After addressing, reply with what you did: `crit comment --reply-to --resolve --author 'Windsurf' ''`. This works for both file comment IDs (`c1`) and review comment IDs (`r0`). +Read `.crit.json` to find the user's inline comments. Comments have three scopes: line comments in `files..comments` (with `start_line`/`end_line`), file comments (same array, `scope: "file"`, lines are 0), and review comments in the top-level `review_comments` array (`scope: "review"`, not tied to any file). Address each unresolved comment by revising the referenced file. After addressing, reply with what you did: `crit comment --reply-to --author 'Windsurf' ''`. This works for both file comment IDs (`c1`) and review comment IDs (`r0`). -When addressing multiple comments, use `--json` to resolve them all in one call: +When addressing multiple comments, use `--json` to reply to them all in one call: ```bash echo '[ - {"reply_to": "c1", "body": "Fixed", "resolve": true}, - {"reply_to": "c2", "body": "Refactored as suggested", "resolve": true} + {"reply_to": "c1", "body": "Fixed"}, + {"reply_to": "c2", "body": "Refactored as suggested"} ]' | crit comment --json --author 'Windsurf' ``` @@ -58,8 +58,8 @@ crit comment --author 'Windsurf' '' # Review-leve crit comment --author 'Windsurf' '' # File-level comment crit comment --author 'Windsurf' : '' # Line comment crit comment --author 'Windsurf' :- '' # Line range comment -crit comment --reply-to c1 --resolve --author 'Windsurf' '' # Reply to file comment -crit comment --reply-to r0 --resolve --author 'Windsurf' '' # Reply to review comment +crit comment --reply-to c1 --author 'Windsurf' '' # Reply to file comment +crit comment --reply-to r0 --author 'Windsurf' '' # Reply to review comment ``` Paths are relative, line numbers are 1-indexed, comments are appended (never replaced). Creates `.crit.json` automatically if it doesn't exist. diff --git a/server.go b/server.go index 98e32c4..593166b 100644 --- a/server.go +++ b/server.go @@ -685,8 +685,7 @@ func (s *Server) handleFinish(w http.ResponseWriter, r *http.Request) { "Review-level comments appear in the top-level review_comments array (not tied to any file). "+ "Read the file, address each unresolved comment in the relevant file and location. "+ "Before acting, check each comment's replies array — if you have already replied, the reviewer may be following up conversationally rather than requesting a new code change. "+ - "For each comment: reply explaining what you did using `crit comment --reply-to --author --resolve \"\"`, "+ - "or edit .crit.json directly to add a reply to the comment's \"replies\" array and set \"resolved\": true. "+ + "For each comment, reply explaining what you did using `crit comment --reply-to --author \"\"`. "+ "When done run: `%s`", critJSON, s.session.ReinvokeCommand()) } @@ -734,7 +733,7 @@ func (s *Server) buildPlanFeedback(critJSON string) string { "Comments are in %s — grouped per file with start_line/end_line referencing the source. "+ "Each comment has a scope field: \"line\" for inline comments, \"file\" for file-level, or \"review\" for review-level comments. "+ "Read the file, revise the plan to address each comment. "+ - "To reply to and resolve comments, use `crit comment --plan %s --reply-to --resolve --author \"\"`.", + "To reply to comments, use `crit comment --plan %s --reply-to --author \"\"`.", critJSON, slug) }