pm-github 2026.10.24 → 2026.10.26
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.
- package/CHANGELOG.md +6 -0
- package/README.md +125 -7
- package/dist/closeout.d.ts +20 -5
- package/dist/closeout.d.ts.map +1 -1
- package/dist/closeout.js +292 -66
- package/dist/closeout.js.map +1 -1
- package/dist/gate.d.ts.map +1 -1
- package/dist/gate.js +5 -3
- package/dist/gate.js.map +1 -1
- package/dist/identity.d.ts.map +1 -1
- package/dist/identity.js +3 -2
- package/dist/identity.js.map +1 -1
- package/dist/import-fidelity.d.ts +1 -1
- package/dist/import-fidelity.d.ts.map +1 -1
- package/dist/import-fidelity.js +39 -50
- package/dist/import-fidelity.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +66 -39
- package/dist/index.js.map +1 -1
- package/dist/issue-forms.d.ts +72 -0
- package/dist/issue-forms.d.ts.map +1 -0
- package/dist/issue-forms.js +195 -0
- package/dist/issue-forms.js.map +1 -0
- package/dist/own-record.d.ts +8 -0
- package/dist/own-record.d.ts.map +1 -0
- package/dist/own-record.js +14 -0
- package/dist/own-record.js.map +1 -0
- package/dist/projects.d.ts.map +1 -1
- package/dist/projects.js +2 -15
- package/dist/projects.js.map +1 -1
- package/dist/refresh.d.ts.map +1 -1
- package/dist/refresh.js +3 -2
- package/dist/refresh.js.map +1 -1
- package/dist/webhooks.js +1 -1
- package/dist/webhooks.js.map +1 -1
- package/manifest.json +1 -1
- package/package.json +10 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026.10.25 - 2026-10-25
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- Hold ambiguous merged-PR delivery until attribution is verified ([pm-github-closeout-attribution](https://github.com/unbraind/pm-github/blob/main/.agents/pm/issues/pm-github-closeout-attribution.toon))
|
|
8
|
+
|
|
3
9
|
## 2026.10.24 - 2026-10-24
|
|
4
10
|
|
|
5
11
|
### Fixed
|
package/README.md
CHANGED
|
@@ -48,17 +48,41 @@ PR body, including links in follow-up lists (`PM:`), can produce `not_delivery`
|
|
|
48
48
|
rows for otherwise eligible items with the reason "Mentioned, not delivered".
|
|
49
49
|
Tracker PR URL metadata with no body reference or declaration produces no row.
|
|
50
50
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
PR
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
A merged PR is a delivery candidate only when it claims the item through an explicit
|
|
52
|
+
`delivery-pr:` tag, a closing declaration, or a commit claim naming the item.
|
|
53
|
+
A fully inspected mention-only or link-only PR is context: it remains listed as
|
|
54
|
+
`skip` / `not_delivery`, never enters the candidate set, and its merge/check gaps
|
|
55
|
+
cannot hold another delivery. Unreadable PR or commit evidence remains unresolved
|
|
56
|
+
because it may hide a claim; a known candidate's incomplete evidence still holds.
|
|
57
|
+
|
|
58
|
+
Closeout never breaks a delivery tie by PR number or merge order. Prefer one explicit
|
|
59
|
+
item tag linking the delivery PR, for example:
|
|
60
|
+
|
|
61
|
+
```sh
|
|
62
|
+
pm update pm-x --add-tags delivery-pr:https://github.com/example/project/pull/19
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
The tagged PR must be in the selected PR set and pass the merge and head-check gates.
|
|
66
|
+
Ordinary `pr_url` metadata remains contextual. Without an explicit tag, exactly one
|
|
67
|
+
linked merged PR must declare the item in its description or commit messages and
|
|
68
|
+
merge strictly after the last acceptance-criteria edit in the item's SDK history.
|
|
69
|
+
Creation is the cutoff when no later criteria edit exists; comments and unrelated
|
|
70
|
+
updates do not move it. Missing or unverifiable history cannot establish chronology.
|
|
71
|
+
Unreadable commits on an otherwise qualifying mention also hold selection: they may hide another claim. A failed check on the unique PR never permits fallback to an earlier delivery.
|
|
72
|
+
|
|
73
|
+
Unresolved attribution produces `needs_review` rows listing every linked candidate
|
|
74
|
+
PR number, leaving the item and its history unchanged. Multiple or unmatched explicit
|
|
75
|
+
tags also require review. The reusable workflow includes these rows and candidates
|
|
76
|
+
in the closeout PR body. An all-held run proposes only the privacy-gated
|
|
77
|
+
`closeout-review.json` report in the tracker, so it can still open a review PR.
|
|
78
|
+
All completion fields and the appended close event use the selected PR's merge
|
|
79
|
+
time, merge SHA, head SHA and check evidence.
|
|
56
80
|
|
|
57
81
|
**A mention is not delivery.** PR bodies routinely link follow-ups, epics and
|
|
58
82
|
related work for context, so a link alone never closes an item. An item is
|
|
59
83
|
closed only when:
|
|
60
84
|
|
|
61
|
-
- its delivery is
|
|
85
|
+
- its delivery is selected by an explicit item tag or a unique claim after the last criteria edit; a canonical link may be preceded on the same
|
|
62
86
|
line by a GitHub-style closing keyword: `Closes`, `Fixes`, `Resolves` or
|
|
63
87
|
`Delivers` (and their tense forms), for example `- Closes [pm-x](…/pm-x.toon)`;
|
|
64
88
|
- it is not an `Epic`; epics close when their children are done;
|
|
@@ -163,10 +187,96 @@ for missed deliveries or unavailable webhooks. Back up the ignored durable
|
|
|
163
187
|
[CLI and typed SDK example](docs/webhook-inbox.md) for deployment, crash recovery,
|
|
164
188
|
retention and supported-event details.
|
|
165
189
|
|
|
190
|
+
## Issue-form completion contracts
|
|
191
|
+
|
|
192
|
+
`pm github form` reads one explicitly selected repository issue form through the
|
|
193
|
+
GitHub Contents API. It compiles requirements before export; it never writes to
|
|
194
|
+
GitHub or changes an item. Select a revision explicitly (prefer a commit SHA for
|
|
195
|
+
reproducibility). Requirements follow [GitHub's form schema](https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/syntax-for-githubs-form-schema).
|
|
196
|
+
|
|
197
|
+
```sh
|
|
198
|
+
pm github form --repo unbraind/pm-cli \
|
|
199
|
+
--form .github/ISSUE_TEMPLATE/feature-request.yml --form-ref main \
|
|
200
|
+
--form-bindings docs/issue-form-bindings.json --compile --json
|
|
201
|
+
|
|
202
|
+
pm github form --repo unbraind/pm-cli \
|
|
203
|
+
--form .github/ISSUE_TEMPLATE/feature-request.yml --form-ref main \
|
|
204
|
+
--item pm-123 --form-bindings docs/issue-form-bindings.json \
|
|
205
|
+
--form-answers docs/issue-form-answers.json --json
|
|
206
|
+
|
|
207
|
+
pm github export --repo unbraind/pm-cli --ids pm-123 \
|
|
208
|
+
--form .github/ISSUE_TEMPLATE/feature-request.yml --form-ref main \
|
|
209
|
+
--form-bindings docs/issue-form-bindings.json \
|
|
210
|
+
--form-answers docs/issue-form-answers.json --dry-run --json
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
The [bindings example](docs/issue-form-bindings.json) maps form IDs to current
|
|
214
|
+
native item fields; the [answers example](docs/issue-form-answers.json) supplies
|
|
215
|
+
the dropdown selection. Explicit answers override bindings. Native text fields
|
|
216
|
+
(including custom fields) and string arrays are read through the SDK, without
|
|
217
|
+
coercion. Numbers, objects and nested arrays refuse as answers. Status bindings
|
|
218
|
+
are literal text; this feature does not infer lifecycle meaning. Required text
|
|
219
|
+
must contain non-whitespace content. Text supports `required` and `min_length`
|
|
220
|
+
(Unicode code points, after CRLF/CR normalization); dropdowns support `required`,
|
|
221
|
+
exact option membership, uniqueness and single/multiple selection. Defaults and
|
|
222
|
+
placeholders do not count as confirmed answers. Markdown elements are display
|
|
223
|
+
context and are omitted from the issue body. Fields without IDs use `field-N`,
|
|
224
|
+
where N is their one-based position in the form body.
|
|
225
|
+
|
|
226
|
+
IDs accept Unicode letters/numbers, `_` and `-` (1..100 characters). Names such as
|
|
227
|
+
`toString`, `constructor`, `__proto__`, `hasOwnProperty` and `valueOf` are ordinary
|
|
228
|
+
IDs, choices and binding names. Answer and binding maps preserve every own key;
|
|
229
|
+
inherited properties never supply answers or defaults. Invalid answer objects
|
|
230
|
+
refuse by value shape, without rejecting these names or changing prototypes.
|
|
231
|
+
|
|
232
|
+
Unknown keys, validators or element types refuse explicitly as `unsupported_form`.
|
|
233
|
+
This includes checkboxes, uploads, rendered/code textareas, dropdown defaults,
|
|
234
|
+
assignees, project routing and issue types. Duplicate IDs, labels or options
|
|
235
|
+
also refuse. The supported top-level keys are `name`, `description`, `title`,
|
|
236
|
+
`labels`, and `body`; `title` is a UI preset and the native pm title remains the
|
|
237
|
+
exported title. Form labels augment exported labels. Missing/invalid answers
|
|
238
|
+
produce `incomplete_answers`, exit 2, and **one** checklist of at most 20 repairs
|
|
239
|
+
plus an omitted count. A batch validates all selected items before any POST or
|
|
240
|
+
PATCH, so one incomplete item yields zero remote writes. Pass the same form
|
|
241
|
+
flags to `export --apply` only after reviewing the preview. Without `--form`,
|
|
242
|
+
export retains its existing behavior. This does not repair export identity,
|
|
243
|
+
retry or idempotency defects, and a form check is not an approval for later use.
|
|
244
|
+
|
|
245
|
+
Normal form output is compact host-rendered TOON (`--json` selects JSON): contract,
|
|
246
|
+
binding names, counts and repair evidence, without item contents or answer values.
|
|
247
|
+
`--compile` returns the contract even before answers are supplied. Limits are
|
|
248
|
+
128 KiB YAML/JSON files; 100 elements, map entries or choices; 200 characters per
|
|
249
|
+
label/choice; 32,768 characters per answer; `min_length` 0..32,768; 64 KiB UTF-8
|
|
250
|
+
rendered issue body. Arrays must be dense and numeric validators finite integers.
|
|
251
|
+
Input and output size refusals use `invalid_form_input`; inaccessible forms and
|
|
252
|
+
items use `form_unavailable` and `item_unavailable`. Remedies use the host SDK's
|
|
253
|
+
structured error context (`nextSteps` and `why`).
|
|
254
|
+
|
|
255
|
+
The typed SDK exports `IssueFormInput`, `IssueFormContract`, `IssueFormReport`,
|
|
256
|
+
`IssueFormRefusalCode`, `compileIssueForm(input)`,
|
|
257
|
+
`completeIssueForm(pmRoot, input)` and `readRepositoryIssueForm(selection, reader, apiBase)`:
|
|
258
|
+
|
|
259
|
+
```ts
|
|
260
|
+
import { completeIssueForm, type IssueFormInput } from "pm-github";
|
|
261
|
+
|
|
262
|
+
const input: IssueFormInput = {
|
|
263
|
+
repo: "owner/repo", ref: "commit-sha", path: ".github/ISSUE_TEMPLATE/bug.yml",
|
|
264
|
+
yaml: selectedRepositoryFormYaml,
|
|
265
|
+
item: "pm-123", bindings: { problem: "description" },
|
|
266
|
+
answers: { version: "stable" },
|
|
267
|
+
};
|
|
268
|
+
const { report, body } = await completeIssueForm(pmRoot, input);
|
|
269
|
+
// report.ok is completion evidence for this read; body is the validated export text.
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
There are no saved plans, leases, idempotency keys, or retries in the completion
|
|
273
|
+
adapter. Every call re-reads native state, and the semantic form digest is only
|
|
274
|
+
a source identifier. Imports and sync do not use this opt-in export adapter.
|
|
275
|
+
|
|
166
276
|
## Without git
|
|
167
277
|
|
|
168
278
|
With an explicit repository, GitHub import, export, refresh, sync, project commands,
|
|
169
|
-
blocker checks, closeout and webhook receive/reconcile work in a plain pm tracker
|
|
279
|
+
blocker checks, issue-form compilation/completion, closeout and webhook receive/reconcile work in a plain pm tracker
|
|
170
280
|
without a git executable.
|
|
171
281
|
`pm github identity` also works there, entirely offline and without credentials.
|
|
172
282
|
The provider commands still require their normal GitHub access and credentials. Privacy scanning
|
|
@@ -176,6 +286,14 @@ Gated imports (`github import --gate`, including the scheduled sync workflow)
|
|
|
176
286
|
also require a git repository so the proposed publication can be checked. They
|
|
177
287
|
refuse before writing when the tracker is outside one; plain imports still work.
|
|
178
288
|
|
|
289
|
+
Import lifecycle finalization uses the pm SDK's item mutation boundary, retaining
|
|
290
|
+
GitHub source dates and both import write hooks. Tracker ownership, workflow,
|
|
291
|
+
history-stream and transactional extension guards now apply to these writes too;
|
|
292
|
+
a refusal leaves the item and history unchanged. The SDK supplies missing-item
|
|
293
|
+
diagnostics (not-found exit code 3), maintains its derived index, and uses its
|
|
294
|
+
native TOON storage format when updating legacy documents.
|
|
295
|
+
See [SDK adoption evidence](docs/sdk-adoption-1025.md).
|
|
296
|
+
|
|
179
297
|
## Revalidate GitHub blockers
|
|
180
298
|
|
|
181
299
|
**Compatibility:** pm-github now requires PM CLI 2026.10.5 or newer for complete
|
package/dist/closeout.d.ts
CHANGED
|
@@ -11,12 +11,18 @@ export interface CloseoutApi {
|
|
|
11
11
|
export interface CloseoutRow {
|
|
12
12
|
item: string;
|
|
13
13
|
pr: number;
|
|
14
|
-
action: "close" | "skip";
|
|
14
|
+
action: "close" | "skip" | "needs_review";
|
|
15
|
+
candidates?: number[];
|
|
16
|
+
missing_evidence?: {
|
|
17
|
+
pr: number;
|
|
18
|
+
code: CloseoutCode;
|
|
19
|
+
reason: string;
|
|
20
|
+
}[];
|
|
15
21
|
reason: string;
|
|
16
22
|
code: CloseoutCode;
|
|
17
23
|
}
|
|
18
24
|
/** Stable decisions used by automation and compact skip counts. */
|
|
19
|
-
export type CloseoutCode = "already_terminal" | "other_repository" | "duplicate_selection" | "explicit_skip" | "unknown_item" | "epic" | "active_children" | "not_delivery" | "close_failed" | "head_checks_passed" | "head_checks_failed" | "head_evidence_unavailable" | "required_checks_unverified" | "incomplete_merge";
|
|
25
|
+
export type CloseoutCode = "already_terminal" | "other_repository" | "duplicate_selection" | "explicit_skip" | "needs_review" | "unknown_item" | "epic" | "active_children" | "not_delivery" | "close_failed" | "head_checks_passed" | "head_checks_failed" | "head_evidence_unavailable" | "required_checks_unverified" | "not_merged" | "incomplete_merge";
|
|
20
26
|
/** Which head-check policy was evaluated for one selected pull request. */
|
|
21
27
|
interface CheckGate {
|
|
22
28
|
pr: number;
|
|
@@ -30,9 +36,10 @@ interface CheckGate {
|
|
|
30
36
|
interface PullRequest {
|
|
31
37
|
number: number;
|
|
32
38
|
body: string | null;
|
|
33
|
-
merged: boolean;
|
|
39
|
+
merged: boolean | null;
|
|
34
40
|
merged_at: string | null;
|
|
35
41
|
merge_commit_sha: string | null;
|
|
42
|
+
commits?: number | null;
|
|
36
43
|
html_url: string;
|
|
37
44
|
head: {
|
|
38
45
|
sha: string;
|
|
@@ -76,8 +83,10 @@ export declare class CloseoutUsageError extends Error {
|
|
|
76
83
|
* may pass on neutral or skipped runs alone, so it states that policy and lists successful checks only when any exist.
|
|
77
84
|
*/
|
|
78
85
|
export declare function checkEvidence(gate: CheckGate): string;
|
|
79
|
-
/**
|
|
80
|
-
export
|
|
86
|
+
/** Deterministic scheduling observer; it never replaces SDK reads or writes. */
|
|
87
|
+
export type CloseoutObserver = (boundary: "listed" | "snapshot" | "history" | "selection" | "before_close" | "locked") => Promise<void>;
|
|
88
|
+
/** Plan selected PRs and apply only decisions whose exact item snapshot still matches. */
|
|
89
|
+
export declare function runCloseout(pmRoot: string, repo: string | undefined, options: Record<string, unknown>, api: CloseoutApi, observer?: CloseoutObserver): Promise<{
|
|
81
90
|
command: string;
|
|
82
91
|
repo: string;
|
|
83
92
|
dry_run: boolean;
|
|
@@ -96,6 +105,12 @@ export declare function compactCloseoutReport(report: Awaited<ReturnType<typeof
|
|
|
96
105
|
plan: {
|
|
97
106
|
item: string;
|
|
98
107
|
pr: number;
|
|
108
|
+
candidates?: number[];
|
|
109
|
+
missing_evidence?: {
|
|
110
|
+
pr: number;
|
|
111
|
+
code: CloseoutCode;
|
|
112
|
+
reason: string;
|
|
113
|
+
}[];
|
|
99
114
|
reason: string;
|
|
100
115
|
code: CloseoutCode;
|
|
101
116
|
action: string;
|
package/dist/closeout.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"closeout.d.ts","sourceRoot":"","sources":["../closeout.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"closeout.d.ts","sourceRoot":"","sources":["../closeout.ts"],"names":[],"mappings":"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"}
|