Repository navigation
feat(check): flag Required links to finished milestones - #160
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A milestone is permanent, so a Required link to one keeps resolving after the milestone finishes and blocks its quest forever. quest check now flags a Required entry whose target is a milestone README with no '## Required' left; the root's own listing of its milestones is membership and exempt. Readiness stays a grep for the heading. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
Outcome: the quest is complete. (Written by Claude Opus 5.5) |
|
Merge summary: Review: Codex completed code and security reviews of 630e2ab with no findings. CI is green and the branch is current with main. Decision: this PR lands before kixelated/quest#164 and keeps its wording, so #164 adds the (Written by Claude Opus 5.5) |
quest rm now also drops every Required link to a finished milestone, including one it just emptied and links that were already stale, and repeats until nothing changes. The root's listing stays. It reuses the finished-milestone predicate from the check rule (#160). The guide's Deletion section points at quest rm instead of a grep. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore(quest): claim quest/m0/helpers/move.md * feat: move and delete quests with quest mv and quest rm `quest mv <from> <to>` moves a quest or epic with git mv and rewrites every root-absolute link to it. `quest rm [-r] <path>` deletes one with git rm and drops each Required, Related, or Closes entry that linked to it, with any heading left empty. Both stage the change, report other mentions without editing them, and run quest check on the result. mv refuses while a moved quest has a claim branch on origin or an open PR on GitHub. The link edits are pure functions in the core (src/core/edit.ts); the CLI owns git. The GitHub client moves out of wait.ts into src/cli/github.ts so the claim lookup can share it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * feat(rm): drop Required links to finished milestones quest rm now also drops every Required link to a finished milestone, including one it just emptied and links that were already stale, and repeats until nothing changes. The root's listing stays. It reuses the finished-milestone predicate from the check rule (#160). The guide's Deletion section points at quest rm instead of a grep. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(mv): keep milestones put, report epic mentions, check upstream claims - mv refuses milestones as well as the root, as rm does. - Mentions of a moved or removed epic match its directory path itself, not only paths under it, while skipping longer sibling names. - In a fork's clone, claims also count open PRs in the repository the fork came from. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(mv): count a fork parent's quest branches as claims In a fork's clone, a quest branch pushed upstream while its draft PR is opened is a claim too, so check the parent's quest/* branches through the GitHub API alongside its open PRs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * fix(mv): encode parentheses and refuse rm of a directory without quests An unmatched parenthesis in a destination path ended the rewritten inline link early, so encode both as %28 and %29. rm -r on a directory holding only non-quest files would delete them all; refuse it instead. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Completes
quest/m0/milestone-links.md.Problem
Milestones are permanent, so a
Requiredlink to/quest/mN/README.mdkeeps resolving after the milestone finishes and blocks its quest forever (discussion on kixelated/quest#152). /quest-recurring's gate relies on that link clearing.Change
quest checkgains a rule insrc/core/rules.ts: aRequiredentry whose target is a milestone README (a permanent README other than the root) with no## Requiredheading is a finding at the entry's line:requires /quest/m0/README.md, a finished milestone; remove the link, and the '## Required' heading with its last entry.ready()andblockers()still grep for the heading, as decided in the plan.quest checkflags any it misses.quest/m0/README.mdandquest/m0/landed-quests.md.Decision made without asking
quest/m0/helpers/move.mdlinked this quest mid-plan, and that link would dangle. I rewrote the bullet to sayquest checkalready flags these links, and dropped "whichever of the two quests lands second wires it up". Once this merges, thequest rmwork owns that wiring. Ifquest mv/rmlands first instead, this PR should wirermbefore merging. A parallel agent is editing that quest, so expect a small conflict there.Validation
just checkandjust testpass in the Nix shell (249 tests).finished milestonescases intest/tree.test.ts:Follow-ups
None.
🤖 Generated with Claude Code
(Written by Claude Opus 5.5)