@erclx/canon 5.46.0 → 5.47.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.
Files changed (36) hide show
  1. package/claude/.claude-plugin/plugin.json +1 -1
  2. package/claude/skills/git-followup/SKILL.md +1 -0
  3. package/claude/skills/git-pr/REQUIREMENT.md +2 -2
  4. package/claude/skills/git-pr/SKILL.md +2 -1
  5. package/claude/skills/git-pr/references/pr.md +58 -7
  6. package/claude/skills/review-address/SKILL.md +18 -6
  7. package/claude/skills/review-address/references/post-review-findings.md +4 -1
  8. package/claude/skills/review-address/references/rebase-only.md +14 -2
  9. package/claude/skills/review-pr/SKILL.md +9 -2
  10. package/claude/skills/review-pr/references/body-variants.md +29 -8
  11. package/claude/skills/review-pr/references/post.md +29 -10
  12. package/claude/skills/review-ui/SKILL.md +1 -0
  13. package/claude/skills/review-ui/references/post.md +2 -0
  14. package/claude/skills/review-ui/references/tick.md +3 -0
  15. package/claude/skills/role-reviewer/REQUIREMENT.md +1 -1
  16. package/claude/skills/role-reviewer/SKILL.md +3 -0
  17. package/claude/skills/role-worker/REQUIREMENT.md +1 -1
  18. package/claude/skills/role-worker/SKILL.md +1 -0
  19. package/claude/skills/task-board/references/decline.md +2 -2
  20. package/claude/skills/task-complete/references/archive.md +3 -2
  21. package/claude/skills/ui-checklist/SKILL.md +3 -3
  22. package/docs/workflow/zshrc-aliases.md +3 -0
  23. package/package.json +1 -1
  24. package/scripts/core/bootstrap.sh +1 -0
  25. package/src/commands/labels.ts +66 -1
  26. package/src/commands/pr.ts +113 -4
  27. package/src/commands/sessions.ts +25 -11
  28. package/src/commands/tasks.ts +2 -0
  29. package/src/labels/density.ts +363 -0
  30. package/src/pr/evidence.ts +1 -1
  31. package/src/pr/rest.ts +2 -0
  32. package/src/pr/tick.ts +89 -0
  33. package/src/sessions/live.ts +26 -0
  34. package/src/sessions/resolve.ts +62 -11
  35. package/src/tasks/archive.ts +15 -4
  36. package/tooling/base/seeds/.github/pull_request_template.md +1 -1
@@ -107,6 +107,7 @@ export interface ArchiveSuccess {
107
107
  readonly from: string
108
108
  readonly to: string
109
109
  readonly priorityRowRemoved: boolean
110
+ readonly backlogRowRemoved: boolean
110
111
  readonly indexRegenerated: boolean
111
112
  /** Every live plan the task cited that no other live task still holds, in line order. */
112
113
  readonly plans: readonly PlanMove[]
@@ -556,7 +557,7 @@ function isRowFor(line: string, target: string): boolean {
556
557
  }
557
558
 
558
559
  /**
559
- * Drops the declined task's bullet from the backlog. A backlog line is a
560
+ * Drops the task's bullet from the backlog. A backlog line is a
560
561
  * bullet carrying a link rather than a table row, so the match is a bullet
561
562
  * prefix and the link target rather than `isRowFor`'s pipe-delimited cell.
562
563
  */
@@ -571,9 +572,17 @@ export function removeBacklogRow(
571
572
  return { text: kept.join('\n'), removed: kept.length !== lines.length }
572
573
  }
573
574
 
575
+ /**
576
+ * A bullet is about a task when its first link targets it. A later link is a
577
+ * reference, such as a note on what the bullet waits for, and matching anywhere
578
+ * would drop that other task's line from a file no history backs.
579
+ */
574
580
  function isBulletFor(line: string, target: string): boolean {
575
581
  const trimmed = line.trimStart()
576
- return /^[-*]\s/.test(trimmed) && trimmed.includes(target)
582
+ if (!/^[-*]\s/.test(trimmed)) return false
583
+
584
+ const first = trimmed.indexOf('](')
585
+ return first !== -1 && trimmed.startsWith(target, first)
577
586
  }
578
587
 
579
588
  /**
@@ -896,8 +905,8 @@ async function resolveStem(
896
905
  }
897
906
 
898
907
  /**
899
- * Archives one task as a single unit: the move, the ordering-row removal, and
900
- * the index regen. The hook and `task-complete` both call this, so every gate
908
+ * Archives one task as a single unit: the move, the ordering-row and backlog
909
+ * bullet removal, and the index regen. The hook and `task-complete` both call this, so every gate
901
910
  * refuses rather than reports. A caller with nobody watching cannot act on a
902
911
  * warning, and two callers gating differently is the drift this exists to stop.
903
912
  */
@@ -996,6 +1005,7 @@ export async function archiveTask(
996
1005
 
997
1006
  const { relinked, failed } = await repointInboundLinks(root, from, to)
998
1007
  const priorityRowRemoved = await clearPriorityRow(dir, stem)
1008
+ const backlogRowRemoved = await clearBacklogRow(dir, stem)
999
1009
  const regen = await regenOne(dir, { dryRun: false })
1000
1010
 
1001
1011
  return {
@@ -1004,6 +1014,7 @@ export async function archiveTask(
1004
1014
  from,
1005
1015
  to,
1006
1016
  priorityRowRemoved,
1017
+ backlogRowRemoved,
1007
1018
  indexRegenerated: regen.action === 'written',
1008
1019
  plans: plans.moves,
1009
1020
  ready: ready || undefined,
@@ -8,7 +8,7 @@
8
8
  - <Verb> <specific component/file/function>
9
9
 
10
10
  <!-- ## Technical context (optional, omit for docs/config/trivial changes) -->
11
- <!-- - <Why this approach was taken, not what changed> -->
11
+ <!-- **<Decision in a few words>.** <Why this approach, what the code can't show, and any shortcoming> -->
12
12
 
13
13
  ## Testing
14
14