Repository navigation
feat: add comment update and comment delete - #48
Closed
seraph-pixelperfect wants to merge 1 commit into
Closed
seraph-pixelperfect wants to merge 1 commit into
seraph-pixelperfect wants to merge 1 commit into
Conversation
- comment update <COMMENT-ID> --body|--body-file via commentUpdate (pre-fetch for a loud NOT_FOUND; body guards mirror the create path) - comment delete <COMMENT-ID> via commentDelete, idempotent no-op when the comment is already gone (pre-fetch pattern, mirrors deleteIssueCmd) - comment list rows now lead with the full comment id (the handle update/delete target); list hint advertises both subcommands - COMMENT_HELP documents the new subcommands and the reserved words - skill prose regenerated via pnpm run build:skill Closes #27
This was referenced Aug 19, 2026
Collaborator
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #27
Depends on #47
What
comment update <COMMENT-ID> --body "..."|--body-file <path>— edits a comment's body via thecommentUpdatemutation. Body guards (mutual exclusion,readBodyFile, required-field errors) mirror the create path exactly. A missing comment fails loud withNOT_FOUND(update is not idempotent-by-convention — only delete is).comment delete <COMMENT-ID>— removes a comment viacommentDelete. Idempotent no-op when the comment is already gone, mirroringdeleteIssueCmd's pre-fetch pattern:comment(id:)returns null →comment: "<id>" not found (no-op), no mutation issued. Like issue delete, any missing id no-ops.comment listsurfaces comment ids — every row now leads with the comment's full UUID (first column,comments[n]{id,author,body,created}), the handle update/delete target. The query already selectedid(COMMENT_LIST_FIELDS); only the render changed. A hint advertises both new subcommands.COMMENT_HELPdocuments the new subcommands and the now-reserved words (list,update,delete); a bare ref still routes to create (backward compat, tested). Skill prose updated; SKILL.md regenerated viapnpm run build:skill.Schema source (verified against
@linear/sdkv90.0.0 generated documents,npm pack @linear/sdk→dist/index-zxW4m1xd.d.mts)UpdateCommentMutationVariables(line 61303):commentUpdate(id: String!, input: CommentUpdateInput, skipEditedAt?)→CommentPayload { comment, lastSyncId, success }.CommentUpdateInput(line 3220): exactly one non-internal field —body: String("The comment content"); everything else is[Internal]. Hence no omit-null input builder: body is the single required value.DeleteCommentMutationVariables(line 61264):commentDelete(id: String!)→DeletePayload { entityId, lastSyncId, success }(line 5164) —successis all the CLI needs, mirroringissueDelete.comment(id:)query exists (QueryCommentArgsline 20047:{ hash?, id? }, returnsMaybe<Comment>; missing id → null, not an error) — used by the pre-fetch. It also carriesissue { identifier }(Comment.issue, nullable: "Null if the comment belongs to a different parent entity type") for the confirmations.Demo (real code paths, stubbed network — captured via a fetch-stub harness)
Local gates (real output)
New tests cover: update document + variables;
--body-filecontent as body; mutual exclusion (zero network); update not-found loudNOT_FOUND; no-issue fallback render; delete document; delete idempotent no-op (pre-fetch null → no mutation); missing id / unknown-flag rejection on both paths; list document + render carrying ids; bare-ref dispatch to create; help contents; and the full list → update → delete round trip asserting all six documents in sequence.Stacked PR note
Stacked on #47 (stack: #37→#38→#39→#40→#41→#42→#43→#44→#45→#46→#47). No CI checks appear here —
ci.ymlonly triggers on PRs targetingmain. CI runs when retargeted tomainafter the stack merges; local gates above are the evidence. Not retargeting.CI quota-block caveat: if checks do appear and look failed, billing/spending-limit rejections resemble check failures — check
gh run view <run-id>/ the jobs API for a billing annotation or emptystepswith ~3-4s duration. If quota-blocked, this PR relies on the local output above; no retries.Judgment calls / ambiguities flagged
comment(id:)→ null ⇒ no-op, no mutation), for consistency withdeleteIssueCmd's established pattern; it also yields the issue identifier for the confirmation. Same asymmetry as issues: any missing id no-ops on delete, while update is loud.comment update/delete. Cost: +36 chars/row.comment: updated on LIN-1(mirrorscomment: added to LIN-1), falling back tocomment: updated <id>when the comment has no parent issue (Comment.issueis nullable). Kept minimal rather than echoing the new body.Identity
Automated agent dispatch authenticated as
seraph-pixelperfect, submitted for human review — not self-approved. Merge is a human decision.