pm-github 2026.10.16 → 2026.10.23

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.
@@ -0,0 +1,467 @@
1
+ /** Source lifecycle, release-window and cross-provider identity rules for issue imports. */
2
+ import { spawnSync } from "node:child_process";
3
+ import { decodeHTML } from "entities";
4
+ import { acquireLock, appendHistoryEntry, canonicalDocument, createHistoryEntry, getHistoryPath, locateItem, normalizeItemId, readLocatedItem, readSettings, resolveItemTypeRegistry, resolvePmRoot, runActiveOnWriteHooks, serializeItemDocument, writeFileAtomic, } from "@unbrained/pm-cli/sdk";
5
+ import { CommandError, fetchJSON, githubApiBase, githubGraphQL, parseNextLink, parseProvenanceTag } from "./index.js";
6
+ /**
7
+ * Select the latest external edit or different lifecycle generation in immutable history.
8
+ * Creation staging and compensation are transient; importing the desired state again
9
+ * keeps the selected revision stable, including after an interrupted governed update.
10
+ * @internal Shared by transaction planning and deterministic history-shape tests.
11
+ */
12
+ export function selectImportContextIndex(entries, status) {
13
+ let currentStatus;
14
+ let selected = -1;
15
+ for (const [index, event] of entries.entries()) {
16
+ for (const patch of event.patch) {
17
+ if (patch.path === "/metadata/status")
18
+ currentStatus = patch.value;
19
+ }
20
+ const message = event.message ?? "";
21
+ const owned = /^(?:pm-github import create |bulk-item-transaction github-import-|Compensate interrupted bulk transaction github-import-|Preserve GitHub source lifecycle for issue #\d+$)/.test(message);
22
+ const transient = /^(?:pm-github import create |Compensate interrupted bulk transaction github-import-)|^bulk-item-transaction github-import-.* compensate$/.test(message);
23
+ if (!owned || (currentStatus !== undefined && currentStatus !== status && !transient))
24
+ selected = index;
25
+ }
26
+ return selected;
27
+ }
28
+ /** Carry a typed refusal from identity resolution into the batch's reviewable plan. */
29
+ export class AmbiguousCitationError extends Error {
30
+ entry;
31
+ /** Retain candidate IDs and the exact provenance tag needed to resolve the conflict. */
32
+ constructor(repo, number, candidates, incidental = []) {
33
+ const entry = { action: "ambiguous_citation", issue: number, candidates,
34
+ ...(incidental.length > 0 ? { citation_candidates: incidental } : {}),
35
+ remedy: `Tag the correct item with gh:${repo}#${number}, then retry.` };
36
+ super(JSON.stringify(entry));
37
+ this.entry = entry;
38
+ }
39
+ }
40
+ /** Parse strict issue/PR identities and source positions for positive ownership checks. */
41
+ function citationReferences(text, repoHint) {
42
+ const references = [];
43
+ const tokens = text.matchAll(/(?<![\w./#-])(?:https?:\/\/[^\s<>"'`\])}]+|(?:[\w.-]+\/[\w.-]+)?#[1-9]\d*(?![\w/=&%-]|\.\w))/gi);
44
+ for (const token of tokens) {
45
+ const raw = token[0];
46
+ if (/^https?:/i.test(raw)) {
47
+ try {
48
+ const url = new URL(trimLocatorPunctuation(raw, "),.;:!]}"));
49
+ const path = /^\/([\w.-]+\/[\w.-]+)\/(issues|pull)\/([1-9]\d*)\/?$/i.exec(url.pathname);
50
+ if (["github.com", "www.github.com"].includes(url.hostname) && path) {
51
+ references.push({ key: `${path[1].toLowerCase()}#${path[3]}`, index: token.index, ownsIssue: path[2].toLowerCase() === "issues" });
52
+ }
53
+ }
54
+ catch { /* Malformed URL tokens never expose shorter hash references inside them. */ }
55
+ }
56
+ else {
57
+ const [repo, number] = raw.split("#");
58
+ references.push({ key: `${repo || repoHint}#${number}`.toLowerCase(), index: token.index, ownsIssue: repo !== "" });
59
+ }
60
+ }
61
+ return references;
62
+ }
63
+ /** Decode nested representations before either ownership or exclusion; an exhausted bound refuses adoption. */
64
+ function normalizeCitationText(input) {
65
+ let text = input;
66
+ for (let pass = 0; pass < 8; pass++) {
67
+ const entities = decodeHTML(text.replace(/(?:%[a-f0-9]{2})+/gi, encoded => Buffer.from(encoded.slice(1).split("%").map(byte => Number.parseInt(byte, 16))).toString("utf8")));
68
+ // Both Unicode transforms are identity on printable ASCII and line whitespace.
69
+ const unicode = /[^\x20-\x7e\t\r\n]/.test(entities)
70
+ ? entities.normalize("NFKC").replace(/\p{Default_Ignorable_Code_Point}/gu, "") : entities;
71
+ const decoded = unicode.replace(/\r\n?/g, "\n");
72
+ if (decoded === text)
73
+ return { text: citationDisplayText(text), source: text, stable: true };
74
+ text = decoded;
75
+ }
76
+ return { text: citationDisplayText(text), source: text, stable: false };
77
+ }
78
+ /** Unwrap link destinations/definitions for anchored intent, retaining the normalized source for exclusion. */
79
+ function citationDisplayText(source) {
80
+ let text = source;
81
+ if (source.includes("[")) {
82
+ const definitions = new Map();
83
+ text = source.replace(/^[ \t]{0,3}\[([^[\]\n]+)\]:[ \t]*(?:<([^>\n]+)>|(\S+))/gm, (_raw, label, angle, destination) => {
84
+ definitions.set(label.trim().toLowerCase(), angle ?? destination);
85
+ return angle ?? destination;
86
+ }).replace(/!?\[([^[\]\n]*)\]\((?:<([^<>\n]+)>|([^()[\]\n]*))\)/g, (_raw, _label, angle, destination) => angle ?? destination.trim())
87
+ .replace(/\[([^[\]\n]+)\](?:\[([^[\]\n]*)\])?/g, (raw, label, key) => definitions.get((key || label).trim().toLowerCase()) ?? raw);
88
+ }
89
+ return text.includes("\n") ? text.replace(/\\\n/g, "").replace(/(?<!\n)\n(?!\n|[ \t]*(?:Issue|Tracks):)/gi, " ") : text;
90
+ }
91
+ /** Refuse every GitHub URL except a complete issue locator for this target, including embedded URLs. */
92
+ function hasOtherGithubUrl(text, repo, number) {
93
+ const sites = [...text.matchAll(/github\.com/gi)];
94
+ for (const [index, site] of sites.entries()) {
95
+ const segment = text.slice(site.index, sites[index + 1]?.index);
96
+ const token = /^github\.com[^\s<>"'`[\]()*{}]*/i.exec(segment)[0];
97
+ const locator = trimLocatorPunctuation(token, "),.;:!*_~]}");
98
+ const reference = /^github\.com\/([\w.-]+\/[\w.-]+)\/issues\/([1-9]\d*)\/?(?:[?#].*)?$/i.exec(locator);
99
+ if (!reference || reference[1].toLowerCase() !== repo || reference[2] !== String(number))
100
+ return true;
101
+ }
102
+ return false;
103
+ }
104
+ /** Read the immediately preceding repository without making every character a regex start position. */
105
+ function citationRepositoryBefore(text, index, hash) {
106
+ if (!hash && text[index - 1] !== "/")
107
+ return undefined;
108
+ const end = hash ? index : index - 1;
109
+ let repoStart = end;
110
+ while (repoStart > 0 && /[\w.-]/.test(text[repoStart - 1]))
111
+ repoStart--;
112
+ if (repoStart === end || text[repoStart - 1] !== "/")
113
+ return undefined;
114
+ let ownerStart = repoStart - 1;
115
+ while (ownerStart > 0 && /[\w.-]/.test(text[ownerStart - 1]))
116
+ ownerStart--;
117
+ if (ownerStart === repoStart - 1 || (!hash && text.slice(Math.max(0, ownerStart - 11), ownerStart).toLowerCase() !== "github.com/"))
118
+ return undefined;
119
+ return text.slice(ownerStart, end).toLowerCase();
120
+ }
121
+ /** Inspect normalized source without trusting Markdown interpretation or an assumed repository for bare hashes. */
122
+ function inspectCitationReferences(texts, repo, number) {
123
+ let mentioned = false;
124
+ let unsafe = false;
125
+ for (const source of new Set(texts)) {
126
+ // Check both retained source and joined soft lines; joining must not discard link labels or destinations.
127
+ for (const text of new Set([source, source.replace(/(?<!\n)\\?\n(?!\n)[ \t]*/g, "")])) {
128
+ if (hasOtherGithubUrl(text, repo, number))
129
+ unsafe = true;
130
+ for (const reference of text.matchAll(/(?:issues[\s/:]*|pull[\s/:]*|#)([0-9]+)/gi)) {
131
+ const sourceRepo = citationRepositoryBefore(text, reference.index, reference[0].startsWith("#"));
132
+ const sourceNumber = reference[1];
133
+ if (sourceNumber === String(number) && (sourceRepo === repo || sourceRepo === undefined))
134
+ mentioned = true;
135
+ if (sourceRepo !== repo || sourceNumber !== String(number))
136
+ unsafe = true;
137
+ }
138
+ }
139
+ }
140
+ return { mentioned, unsafe };
141
+ }
142
+ /** Permit only title references, leading description closing words, or whole body issue-label lines. */
143
+ function hasAnchoredCitationIntent(text, field, repo, number) {
144
+ for (const reference of citationReferences(text, repo)) {
145
+ if (reference.key !== `${repo}#${number}` || !reference.ownsIssue)
146
+ continue;
147
+ if (field === 0)
148
+ return true;
149
+ const prefix = text.slice(0, reference.index);
150
+ if (field === 1 && /^(?:fix|fixes|fixed|close|closes|closed|resolve|resolves|resolved)[ \t]+$/i.test(prefix))
151
+ return true;
152
+ if (field === 2 && /^(?:Issue|Tracks):[ \t]*<?$/i.test(prefix.slice(prefix.lastIndexOf("\n") + 1))) {
153
+ const line = text.slice(reference.index).split("\n")[0];
154
+ // Trim the allowed tail (`>`, then `.`/`)`, then spaces/tabs) by hand: a regex tail that can also match the
155
+ // query's last characters backtracks polynomially on a run of `)`.
156
+ let end = line.length;
157
+ while (end > 0 && (line[end - 1] === " " || line[end - 1] === "\t"))
158
+ end--;
159
+ while (end > 0 && (line[end - 1] === "." || line[end - 1] === ")"))
160
+ end--;
161
+ if (end > 0 && line[end - 1] === ">")
162
+ end--;
163
+ if (/^https:\/\/github\.com\/[\w.-]+\/[\w.-]+\/issues\/[1-9]\d*\/?(?:[?#][^\s<>]*)?$/i.test(line.slice(0, end)))
164
+ return true;
165
+ }
166
+ }
167
+ return false;
168
+ }
169
+ /** Normalize first, exclude other/unknown references, then apply the anchored ownership allowlist. */
170
+ function citesIssue(item, repo, number) {
171
+ const normalized = [item.title ?? "", item.description ?? "", item.body ?? ""].map(normalizeCitationText);
172
+ const assessment = inspectCitationReferences(normalized.flatMap(value => [value.source, value.text]), repo, number);
173
+ if (!assessment.mentioned)
174
+ return undefined;
175
+ if (normalized.some(value => !value.stable))
176
+ return "normalization_limit";
177
+ const intended = normalized.some((value, field) => hasAnchoredCitationIntent(value.text, field, repo, number));
178
+ if (assessment.unsafe)
179
+ return "multiple_issues";
180
+ return intended ? "eligible" : "missing_intent";
181
+ }
182
+ /** Trim configurable exporter punctuation in one backwards pass. @internal Shared with parity tests. */
183
+ export function trimLocatorPunctuation(locator, punctuation = "),.;") {
184
+ let end = locator.length;
185
+ while (end > 0 && punctuation.includes(locator[end - 1]))
186
+ end--;
187
+ return locator.slice(0, end);
188
+ }
189
+ /** Normalize only complete HTTP issue/provider locators, never substring identities. */
190
+ function locators(value) {
191
+ const text = typeof value === "string" ? value : JSON.stringify(value) ?? "";
192
+ return [...text.matchAll(/https?:\/\/[^\s<>"'`]+/gi)].map(match => trimLocatorPunctuation(match[0]).replace(/\/$/, "").toLowerCase()
193
+ .replace(/^https?:\/\/(?:www\.)?github\.com\/([^/]+)\/([^/]+)\/(?:issues|pull)\/(\d+)\/?(?:[?#].*)?$/, "https://github.com/$1/$2/issues/$3"));
194
+ }
195
+ /** Copied body text and labels cannot transfer an established GitHub import to another owner. */
196
+ function copiedProviderMarkersOwnItem(item) {
197
+ return item.github_link_only !== false && !item.tags?.some(tag => /^gh:[^/]+\/[^#]+#\d+$/.test(tag));
198
+ }
199
+ /** Extract declared provider fields and the description/body markers used by provider exporters. */
200
+ function providerProvenance(item) {
201
+ const identities = new Set(Object.entries(item).filter(([key, value]) => /^(linear|jira|ado)_(?:.*_)?(?:id|key|url|identifier)$/i.test(key) && Boolean(value) &&
202
+ (typeof value !== "string" || value.trim() !== "")).map(([key]) => key));
203
+ const declared = identities.size > 0 || (copiedProviderMarkersOwnItem(item) && item.tags?.some(tag => /^(linear|jira|ado):/i.test(tag))) ||
204
+ Object.entries(item).some(([key, value]) => /^(provider|source|provenance)$/i.test(key) && (typeof value === "string"
205
+ ? /^(?:pm-)?(?:linear|jira|ado)$/i.test(value.trim())
206
+ : /"(?:provider|source|system)"\s*:\s*"(?:pm-)?(?:linear|jira|ado)"/i.test(JSON.stringify(value) ?? "")));
207
+ return Object.entries(item).filter(([key, value]) => identities.has(key) ||
208
+ (declared && /^provider$|url|link|provenance|source|external/i.test(key)) ||
209
+ ((/description|provenance/i.test(key) || copiedProviderMarkersOwnItem(item)) && /description|body|provenance/i.test(key) && typeof value === "string" &&
210
+ /\[(linear|jira|ado)\]|\b(linear|jira|ado)_(id|key|url)=|Jira(?:\s+[A-Z][A-Z0-9]+-\d+)?:\s/i.test(value)))
211
+ .map(([, value]) => typeof value === "string" ? value : JSON.stringify(value)).join("\n");
212
+ }
213
+ /** Fields whose GitHub locators name an item's owner; shared by the owner matcher and the adoption guard so they cannot drift. */
214
+ const OWNER_LINK_FIELD = /^(?:github_?url|provenance|external_?(?:links?|url)|links?)$/i;
215
+ /**
216
+ * True when an item already carries a structured GitHub or provider identity of its own. Mirrors every ownership source
217
+ * identity.ts and the owner matcher recognize: any `github*` field (`github_url`, `githuburl`, ...), a GitHub identity tag in any case (`gh:`, `GH:`), a core `external_ref`, a native `source_owner`, provider identity fields
218
+ * (`linear_*`/`jira_*`/`ado_*` id, key, url or identifier), provider provenance, a native "GitHub issue <url>"
219
+ * declaration, or a GitHub issue URL in provenance/external links.
220
+ */
221
+ function hasStructuredOwnership(item) {
222
+ const issueLocator = /^https:\/\/github\.com\/[^/]+\/[^/]+\/issues\/\d+$/;
223
+ const filled = (value) => value !== undefined && value !== null && value !== false && !(typeof value === "string" && value.trim() === "");
224
+ return Object.entries(item).some(([key, value]) => filled(value) && (/^github/i.test(key) && !/^github_?link_?only$/i.test(key) ||
225
+ /^(?:external_ref|source_owner)$/.test(key) || /^(?:linear|jira|ado)_(?:.*_)?(?:id|key|url|identifier)$/i.test(key))) ||
226
+ item.github_link_only === false || Boolean(providerProvenance(item)) ||
227
+ Boolean(item.tags?.some(tag => /^gh:[^/\s]+\/[^#\s]+#[1-9]\d*$/i.test(tag))) ||
228
+ (typeof item.description === "string" && /^GitHub issue(?:\s*:\s+|\s+)https?:\/\//i.test(item.description)) ||
229
+ Object.entries(item).some(([key, value]) => OWNER_LINK_FIELD.test(key) &&
230
+ locators(value).some(url => issueLocator.test(url)));
231
+ }
232
+ /** Match GitHub locators or provider back-links before creation, refusing multiple owners. */
233
+ export function matchImportedIssue(items, issue, tagged, adoptCited = false) {
234
+ const issueUrl = locators(issue.html_url)[0];
235
+ const bodyUrls = new Set(locators(issue.body ?? ""));
236
+ /** Recognize leading native ownership declarations; later prose cannot transfer ownership. */
237
+ const declaredOwner = (item) => copiedProviderMarkersOwnItem(item) && typeof item.description === "string" &&
238
+ locators(/^GitHub issue(?:\s*:\s+|\s+)(https?:\/\/\S+)/i.exec(item.description)?.[1]).includes(issueUrl);
239
+ const candidates = items.filter(item => item.id && (item.id === tagged?.id ||
240
+ declaredOwner(item) ||
241
+ Object.entries(item).some(([key, value]) => OWNER_LINK_FIELD.test(key) && locators(value).includes(issueUrl)) ||
242
+ locators(providerProvenance(item)).some(url => bodyUrls.has(url))));
243
+ if (candidates.length > 1)
244
+ throw new CommandError(`GitHub issue #${issue.number} has multiple existing owners; import plan is not idempotent. No item was written for this issue.`);
245
+ let item = candidates[0];
246
+ let cited = false;
247
+ const incidental = [];
248
+ if (!item && !issue.pull_request) {
249
+ const repo = issue.html_url.split("/").slice(3, 5).join("/").toLowerCase();
250
+ const citing = [];
251
+ for (const candidate of items) {
252
+ if (!candidate.id || candidate.tags?.some(tag => parseProvenanceTag(tag) !== undefined))
253
+ continue;
254
+ const assessment = citesIssue(candidate, repo, issue.number);
255
+ if (assessment === undefined)
256
+ continue;
257
+ // Structured ownership (a GitHub issue URL field, an issue number, provider provenance or a native declaration)
258
+ // already names an identity; prose citing another issue must never overwrite it.
259
+ if (assessment === "eligible" && hasStructuredOwnership(candidate))
260
+ incidental.push({ id: candidate.id, reason: "structured_owner" });
261
+ else if (assessment === "eligible" && adoptCited)
262
+ citing.push(candidate);
263
+ else if (assessment !== undefined)
264
+ incidental.push({ id: candidate.id, reason: assessment === "eligible" ? "adoption_disabled" : assessment });
265
+ }
266
+ incidental.sort((left, right) => left.id.localeCompare(right.id));
267
+ if (citing.length > 1)
268
+ throw new AmbiguousCitationError(repo, issue.number, citing.map(candidate => candidate.id).sort(), incidental);
269
+ item = citing[0];
270
+ cited = Boolean(item);
271
+ }
272
+ const provider = item && (Boolean(providerProvenance(item)) || (copiedProviderMarkersOwnItem(item) && item.tags?.some(tag => /^(linear|jira|ado):/i.test(tag))));
273
+ const native = item && declaredOwner(item);
274
+ return { item, linkOnly: Boolean(item && (provider || native || item.github_link_only === true)),
275
+ ...(incidental.length > 0 ? { citation_candidates: incidental } : {}),
276
+ via: cited ? "citation" : item ? (provider ? "provider-link" : native ? "github-declaration" : item.id === tagged?.id ? "provenance-tag" : "github-url") : "new" };
277
+ }
278
+ /** Read calendar release tags from the selected tracker checkout, including annotated tag dates. */
279
+ export function readImportReleases(pmRoot) {
280
+ const result = spawnSync("git", ["-C", pmRoot, "for-each-ref", "--format=%(refname:short)%09%(creatordate:iso-strict)", "refs/tags"], { encoding: "utf8" });
281
+ if (result.status !== 0)
282
+ return [];
283
+ return result.stdout.trim().split("\n").flatMap(line => {
284
+ const [tag, date] = line.split("\t");
285
+ return /^v?\d{4}\.\d{1,2}\.\d{1,2}$/.test(tag) && Number.isFinite(Date.parse(date)) ? [{ tag: tag, date: date }] : [];
286
+ }).sort((a, b) => Date.parse(a.date) - Date.parse(b.date) || a.tag.localeCompare(b.tag));
287
+ }
288
+ /** Select only the latest closure within GitHub's observed forward timestamp skew. */
289
+ function latestClosure(events, closedAt, graphql = false) {
290
+ const candidates = events.filter((event) => event !== null && typeof event === "object" && !Array.isArray(event))
291
+ .filter(event => graphql ? event.__typename === "ClosedEvent" : event.event === "closed");
292
+ const key = graphql ? "createdAt" : "created_at";
293
+ return candidates.filter(event => {
294
+ const delta = typeof event[key] === "string" && closedAt ? Date.parse(event[key]) - Date.parse(closedAt) : NaN;
295
+ return Number.isFinite(delta) && delta >= 0 && delta <= 5_000;
296
+ }).sort((left, right) => Date.parse(String(left[key])) - Date.parse(String(right[key]))).at(-1);
297
+ }
298
+ /** Fetch every timeline page; only closure-specific events may supply resolution evidence. */
299
+ export async function fetchImportTimeline(issue, repo, token) {
300
+ if (issue.state !== "closed")
301
+ return [];
302
+ let url = `${githubApiBase()}/repos/${repo}/issues/${issue.number}/timeline?per_page=100`;
303
+ const events = [];
304
+ while (url) {
305
+ const response = await fetchJSON(url, token);
306
+ if (response.status !== 200)
307
+ throw new CommandError(`Could not read closure timeline for issue #${issue.number} (HTTP ${response.status}).`);
308
+ let page;
309
+ try {
310
+ page = JSON.parse(response.body);
311
+ }
312
+ catch {
313
+ throw new CommandError(`Closure timeline for issue #${issue.number} is not valid JSON.`);
314
+ }
315
+ if (!Array.isArray(page))
316
+ throw new CommandError(`Invalid closure timeline for issue #${issue.number}.`);
317
+ events.push(...page);
318
+ url = parseNextLink(response.linkHeader);
319
+ }
320
+ const closed = latestClosure(events, issue.closed_at);
321
+ if (token && !(typeof closed?.commit_id === "string" && /^[a-f0-9]{40}$/i.test(closed.commit_id))) {
322
+ const [owner, name] = repo.split("/");
323
+ let cursor = null;
324
+ do {
325
+ const data = await githubGraphQL(token, `query($owner:String!,$name:String!,$number:Int!,$cursor:String) { repository(owner:$owner,name:$name) { issue: ${issue.pull_request ? "pullRequest" : "issue"}(number:$number) { timelineItems(first:100,after:$cursor,itemTypes:[CLOSED_EVENT,CONNECTED_EVENT]) { nodes { __typename ... on ClosedEvent { createdAt closer { __typename ... on PullRequest { url title } ... on Commit { url messageHeadline oid } } } ... on ConnectedEvent { createdAt subject { __typename ... on PullRequest { url title } } } } pageInfo { hasNextPage endCursor } } } } }`, { owner, name, number: issue.number, cursor });
326
+ const connection = data.repository?.issue?.timelineItems;
327
+ if (!connection || !Array.isArray(connection.nodes) || typeof connection.pageInfo?.hasNextPage !== "boolean") {
328
+ throw new CommandError(`Invalid GraphQL closure timeline for issue #${issue.number}.`);
329
+ }
330
+ events.push(...connection.nodes);
331
+ cursor = connection.pageInfo.hasNextPage ? connection.pageInfo.endCursor : null;
332
+ } while (cursor);
333
+ }
334
+ return events;
335
+ }
336
+ /** Accept only GitHub PR/commit evidence tied to the latest closure, excluding pre-reopen events. */
337
+ export function importCloseReason(issue, events) {
338
+ const reason = issue.state_reason ?? "unspecified";
339
+ const base = `Closed on GitHub as ${reason} on ${issue.closed_at ?? "an unknown date"}`;
340
+ const records = events.filter((event) => event !== null && typeof event === "object" && !Array.isArray(event));
341
+ const closed = latestClosure(records, issue.closed_at);
342
+ if (closed && typeof closed.commit_id === "string" && /^[a-f0-9]{40}$/i.test(closed.commit_id)) {
343
+ const linkedCommit = typeof closed.commit_url === "string"
344
+ ? /^https:\/\/api\.github\.com\/repos\/([^/]+)\/([^/]+)\/commits\/([a-f0-9]{40})$/.exec(closed.commit_url) : null;
345
+ const repoUrl = linkedCommit && linkedCommit[3] === closed.commit_id
346
+ ? `https://github.com/${linkedCommit[1]}/${linkedCommit[2]}` : issue.html_url.replace(/\/(?:issues|pull)\/\d+$/, "");
347
+ return `${base}; closing commit ${repoUrl}/commit/${closed.commit_id}`;
348
+ }
349
+ const graphClosed = latestClosure(records, issue.closed_at, true);
350
+ const graphEvents = [
351
+ ...(graphClosed ? [graphClosed] : []),
352
+ ...records.filter(event => event.__typename === "ConnectedEvent").reverse(),
353
+ ];
354
+ for (const event of graphEvents) {
355
+ const closer = event.__typename === "ClosedEvent" ? event.closer : event.subject;
356
+ if (closer && typeof closer === "object" && "url" in closer && typeof closer.url === "string" && /^https:\/\/github\.com\/[^/]+\/[^/]+\/(pull\/\d+|commit\/[a-f0-9]{40})$/.test(closer.url)) {
357
+ const title = "title" in closer ? closer.title : "messageHeadline" in closer ? closer.messageHeadline : undefined;
358
+ return `${base}; ${event.__typename === "ClosedEvent" ? "closing" : "linked"} ${closer.url.includes("/pull/") ? "PR" : "commit"} ${closer.url}${typeof title === "string" ? ` (${JSON.stringify(title)})` : ""}`;
359
+ }
360
+ }
361
+ const connected = records.find(event => event.event === "connected" && typeof event.url === "string" && /^https:\/\/github\.com\/[^/]+\/[^/]+\/pull\/\d+$/.test(event.url));
362
+ return connected ? `${base}; linked PR ${connected.url}` : base;
363
+ }
364
+ /** Validate source date ordering and return the parsed closure, when supplied. */
365
+ export function validateImportLifetime(issue) {
366
+ const created = Date.parse(issue.created_at);
367
+ const updated = Date.parse(issue.updated_at);
368
+ const closed = issue.closed_at ? Date.parse(issue.closed_at) : undefined;
369
+ if (!Number.isFinite(created) || !Number.isFinite(updated) || updated < created ||
370
+ (closed !== undefined && (!Number.isFinite(closed) || closed < created || closed > updated))) {
371
+ throw new CommandError(`GitHub issue #${issue.number} has an invalid source lifetime; nothing may be imported.`);
372
+ }
373
+ return closed;
374
+ }
375
+ /** Validate source lifetimes and assign the earliest release tag at or after the closure. */
376
+ export function buildImportFidelity(issue, releases, timeline) {
377
+ const closed = validateImportLifetime(issue);
378
+ return {
379
+ github_url: issue.html_url, github_number: issue.number, github_state: issue.state,
380
+ github_state_reason: issue.state_reason ?? "unspecified",
381
+ github_created_at: issue.created_at, github_updated_at: issue.updated_at,
382
+ github_closed_at: issue.state === "closed" ? issue.closed_at ?? "" : "",
383
+ github_close_reason: issue.state === "closed" ? importCloseReason(issue, timeline) : "",
384
+ github_release: issue.state === "closed" && closed !== undefined ? releases.find(release => Date.parse(release.date) >= closed)?.tag ?? "" : "",
385
+ };
386
+ }
387
+ /** Project the import-owned metadata; undefined values remove stale native lifecycle fields. */
388
+ export function importFidelityFields(fidelity, linkOnly) {
389
+ return {
390
+ ...fidelity, github_link_only: linkOnly,
391
+ ...(!linkOnly ? {
392
+ created_at: fidelity.github_created_at,
393
+ close_reason: fidelity.github_state === "closed" ? fidelity.github_close_reason : undefined,
394
+ ...(fidelity.github_closed_at || fidelity.github_state === "open" ? {
395
+ closed_at: fidelity.github_closed_at || undefined,
396
+ completed_at: fidelity.github_closed_at || undefined,
397
+ } : {}),
398
+ // Assign release only when GitHub supplied one: an open issue or a
399
+ // closure without a matching calendar tag must preserve an existing
400
+ // release that users or tools set, instead of deleting it.
401
+ ...(fidelity.github_release ? { release: fidelity.github_release } : {}),
402
+ } : {}),
403
+ };
404
+ }
405
+ /** Compare source instants and tag sets without treating their serialized representation as a change. */
406
+ export function normalizeImportValue(field, value) {
407
+ if (field === "tags")
408
+ return [...new Set(value ?? [])].sort();
409
+ if (/^(?:github_)?(?:created|updated|closed|completed)_at$/.test(field) && typeof value === "string" && Number.isFinite(Date.parse(value)))
410
+ return Date.parse(value);
411
+ return value;
412
+ }
413
+ /**
414
+ * Finalize source metadata through public SDK lock, serialization and append-only history primitives.
415
+ * High-level create/update reserve native timestamps. This import adapter appends a real
416
+ * before/after event instead of editing past history; retrying identical metadata is a no-op.
417
+ * Cross-provider owners retain their creation/completion dates, content and release.
418
+ */
419
+ export async function persistImportFidelity(pmRoot, id, fidelity, linkOnly, normalizeFields = false) {
420
+ pmRoot = resolvePmRoot(process.cwd(), pmRoot);
421
+ const settings = await readSettings(pmRoot);
422
+ id = normalizeItemId(id, settings.id_prefix);
423
+ const unlock = await acquireLock(pmRoot, id, settings.locks.ttl_seconds, "pm-github", false, settings.governance.force_required_for_stale_lock, settings.locks.wait_ms);
424
+ try {
425
+ const located = await locateItem(pmRoot, id, settings.id_prefix, settings.item_format, resolveItemTypeRegistry(settings).type_to_folder);
426
+ if (!located)
427
+ throw new CommandError(`Imported item ${id} is missing during lifecycle finalization.`);
428
+ const { document, raw } = await readLocatedItem(located);
429
+ const before = canonicalDocument(document);
430
+ for (const [field, value] of Object.entries(importFidelityFields(fidelity, linkOnly))) {
431
+ if (normalizeFields && JSON.stringify(normalizeImportValue(field, document.metadata[field])) === JSON.stringify(normalizeImportValue(field, value)))
432
+ continue;
433
+ if (value === undefined)
434
+ delete document.metadata[field];
435
+ else
436
+ document.metadata[field] = value;
437
+ }
438
+ if (document.metadata.closed_at && Date.parse(document.metadata.closed_at) < Date.parse(document.metadata.created_at)) {
439
+ throw new CommandError(`GitHub issue #${fidelity.github_number} needs a source closure date before its lifecycle can be imported safely.`);
440
+ }
441
+ if (JSON.stringify(before) === JSON.stringify(canonicalDocument(document)))
442
+ return;
443
+ // SDK bulk rollback addresses history by native updated_at. Keep that clock
444
+ // equal to the appended event timestamp; source time lives in github_updated_at.
445
+ const now = new Date().toISOString();
446
+ document.metadata.updated_at = now;
447
+ const after = canonicalDocument(document);
448
+ const history = createHistoryEntry({ nowIso: now, author: "pm-github", op: "import", before, after,
449
+ message: `Preserve GitHub source lifecycle for issue #${fidelity.github_number}` });
450
+ await writeFileAtomic(located.itemPath, serializeItemDocument(after, { format: located.item_format }));
451
+ try {
452
+ await appendHistoryEntry(getHistoryPath(pmRoot, id), history);
453
+ }
454
+ catch (error) {
455
+ await writeFileAtomic(located.itemPath, raw);
456
+ throw error;
457
+ }
458
+ const hookContext = { scope: "project", item_id: id, item_type: after.metadata.type,
459
+ before, after, changed_fields: history.patch.map(patch => patch.path) };
460
+ await runActiveOnWriteHooks({ ...hookContext, path: located.itemPath, op: "import" });
461
+ await runActiveOnWriteHooks({ ...hookContext, path: getHistoryPath(pmRoot, id), op: "import:history" });
462
+ }
463
+ finally {
464
+ await unlock();
465
+ }
466
+ }
467
+ //# sourceMappingURL=import-fidelity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import-fidelity.js","sourceRoot":"","sources":["../import-fidelity.ts"],"names":[],"mappings":"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"}