Support issue identifiers (PAP-39) in URLs and prefer them throughout

Backend:
- Add router.param middleware in issues, activity, and agents routes to
  resolve identifiers (e.g. PAP-39) to UUIDs before handlers run
- Simplify GET /issues/:id now that param middleware handles resolution
- Include identifier in getAncestors response and issuesForRun query
- Add identifier field to IssueAncestor shared type

Frontend:
- Update all issue navigation links across 15+ files to use
  issue.identifier ?? issue.id instead of bare UUIDs
- Add URL redirect in IssueDetail: navigating via UUID automatically
  replaces the URL with the human-readable identifier
- Fix childIssues filter to use issue.id (UUID) instead of URL param
  so it works correctly with identifier-based URLs
- Add issueUrl() utility in lib/utils.ts

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Forgotten
2026-02-20 16:04:05 -06:00
parent 0c0c308594
commit 9906a5ba06
21 changed files with 80 additions and 34 deletions

View File

@@ -149,7 +149,7 @@ export function ApprovalDetail() {
(linkedIssues?.length ?? 0) > 1
? "Review linked issues"
: "Review linked issue",
to: `/issues/${primaryLinkedIssue.id}`,
to: `/issues/${primaryLinkedIssue.identifier ?? primaryLinkedIssue.id}`,
}
: linkedAgentId
? {
@@ -236,7 +236,7 @@ export function ApprovalDetail() {
{linkedIssues.map((issue) => (
<Link
key={issue.id}
to={`/issues/${issue.id}`}
to={`/issues/${issue.identifier ?? issue.id}`}
className="block text-xs rounded border border-border/70 px-2 py-1.5 hover:bg-accent/20"
>
<span className="font-mono text-muted-foreground mr-2">