@fitlab-ai/agent-infra 0.9.14 → 0.9.15

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 (250) hide show
  1. package/README.md +10 -0
  2. package/README.zh-CN.md +10 -0
  3. package/bin/internal-cli.sh +45 -0
  4. package/dist/bin/internal-cli.js +93 -30
  5. package/dist/lib/agent-clients/adapters/codex-lifecycle/capability-store.js +165 -27
  6. package/dist/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.js +3 -2
  7. package/dist/lib/defaults.json +103 -103
  8. package/dist/lib/fs/durable-write.js +37 -0
  9. package/dist/lib/fs/file-lock.js +111 -0
  10. package/dist/lib/host-control/audit.js +19 -0
  11. package/dist/lib/host-control/client.js +142 -0
  12. package/dist/lib/host-control/command.js +49 -0
  13. package/dist/lib/host-control/path.js +160 -0
  14. package/dist/lib/host-control/secure-fs.js +140 -0
  15. package/dist/lib/host-control/server.js +159 -0
  16. package/dist/lib/host-control/service.js +112 -0
  17. package/dist/lib/init.js +11 -2
  18. package/dist/lib/internal/cli-route-inventory.js +3 -1
  19. package/dist/lib/internal/codex-lifecycle.js +6 -6
  20. package/dist/lib/internal/demo-promotion.js +322 -0
  21. package/dist/lib/internal/demo-transcript.js +454 -0
  22. package/dist/lib/internal/host-control.js +28 -0
  23. package/dist/lib/internal/manual-validation.js +322 -0
  24. package/dist/lib/internal/platform-pr.js +18 -4
  25. package/dist/lib/internal/release-workflow.js +63 -84
  26. package/dist/lib/internal/sandbox-control.js +149 -2
  27. package/dist/lib/internal/task-artifact.js +15 -262
  28. package/dist/lib/internal/task-create.js +6 -5
  29. package/dist/lib/internal/task-event.js +37 -37
  30. package/dist/lib/internal/task-operation-registry.js +101 -3
  31. package/dist/lib/internal/task-review.js +8 -53
  32. package/dist/lib/internal/task-validate.js +30 -10
  33. package/dist/lib/owned-path.js +33 -0
  34. package/dist/lib/platform/check-status.js +11 -0
  35. package/dist/lib/platform/comment-safety.js +4 -1
  36. package/dist/lib/platform/completion-backfill.js +1 -1
  37. package/dist/lib/platform/github-data.js +241 -0
  38. package/dist/lib/platform/github-provider.js +15 -20
  39. package/dist/lib/platform/issue-comments.js +2 -2
  40. package/dist/lib/platform/issues.js +1 -179
  41. package/dist/lib/platform/pr-checks.js +12 -65
  42. package/dist/lib/platform/pr-summary.js +55 -3
  43. package/dist/lib/platform/pull-requests.js +2 -105
  44. package/dist/lib/platform/snapshots.js +2 -0
  45. package/dist/lib/platform/verification-sync.js +127 -142
  46. package/dist/lib/release/workflow.js +1 -1
  47. package/dist/lib/sandbox/commands/create.js +7 -2
  48. package/dist/lib/sandbox/commands/rm.js +3 -1514
  49. package/dist/lib/sandbox/control/audit.js +203 -0
  50. package/dist/lib/sandbox/control/client.js +93 -54
  51. package/dist/lib/sandbox/control/executor.js +129 -65
  52. package/dist/lib/sandbox/control/finalization-response.js +27 -0
  53. package/dist/lib/sandbox/control/identity-sentinel.js +107 -0
  54. package/dist/lib/sandbox/control/lifecycle.js +36 -2
  55. package/dist/lib/sandbox/control/native-file-lock.js +6 -98
  56. package/dist/lib/sandbox/control/protocol.js +55 -4
  57. package/dist/lib/sandbox/control/server.js +491 -120
  58. package/dist/lib/sandbox/control/state.js +58 -0
  59. package/dist/lib/sandbox/control/task-workflow.js +74 -0
  60. package/dist/lib/sandbox/control/workflow-executor.js +99 -0
  61. package/dist/lib/sandbox/index.js +2 -2
  62. package/dist/lib/sandbox/recovery.js +28 -4
  63. package/dist/lib/sandbox/removal.js +1717 -0
  64. package/dist/lib/sandbox/task-cleanup.js +217 -0
  65. package/dist/lib/sandbox/workspace-view.js +13 -14
  66. package/dist/lib/task/activity-intent.js +2 -1
  67. package/dist/lib/task/activity-log.js +30 -24
  68. package/dist/lib/task/artifact-command.js +101 -0
  69. package/dist/lib/task/artifact-lifecycle.js +30 -28
  70. package/dist/lib/task/artifact-name.js +36 -0
  71. package/dist/lib/task/artifact-operations.js +23 -69
  72. package/dist/lib/task/artifact-receipts.js +3 -15
  73. package/dist/lib/task/artifact-repair-intent.js +87 -16
  74. package/dist/lib/task/artifact-schema.js +6 -14
  75. package/dist/lib/task/capabilities.js +12 -19
  76. package/dist/lib/task/codex-orchestration.js +71 -25
  77. package/dist/lib/task/commit-identity.js +28 -0
  78. package/dist/lib/task/commit-operation.js +2 -16
  79. package/dist/lib/task/control-authority.js +371 -5
  80. package/dist/lib/task/control-recovery.js +128 -0
  81. package/dist/lib/task/create.js +62 -9
  82. package/dist/lib/task/decision-details.js +2 -46
  83. package/dist/lib/task/events.js +120 -9
  84. package/dist/lib/task/finalization-state.js +9 -0
  85. package/dist/lib/task/human-override.js +3 -6
  86. package/dist/lib/task/implementation-inputs.js +3 -3
  87. package/dist/lib/task/intermediate-cleanup.js +383 -0
  88. package/dist/lib/task/invalidation.js +18 -65
  89. package/dist/lib/task/ledger-intents.js +7 -22
  90. package/dist/lib/task/ledger.js +1 -3
  91. package/dist/lib/task/lifecycle.js +19 -1
  92. package/dist/lib/task/local-artifact-finalization.js +132 -157
  93. package/dist/lib/task/manual-validation-completion.js +26 -0
  94. package/dist/lib/task/manual-validation-evidence.js +130 -0
  95. package/dist/lib/task/manual-validation-receipt.js +101 -0
  96. package/dist/lib/task/manual-validation-shared.js +40 -0
  97. package/dist/lib/task/manual-validation-transaction.js +243 -0
  98. package/dist/lib/task/markdown.js +47 -0
  99. package/dist/lib/task/orchestration.js +14 -17
  100. package/dist/lib/task/qualification-audit.js +20 -34
  101. package/dist/lib/task/review-artifacts.js +2 -18
  102. package/dist/lib/task/review-command.js +25 -0
  103. package/dist/lib/task/review-finalization.js +125 -193
  104. package/dist/lib/task/review-fingerprint.js +2 -2
  105. package/dist/lib/task/sections.js +34 -56
  106. package/dist/lib/task/verification-engine.js +116 -323
  107. package/dist/lib/task/verification.js +1 -1
  108. package/dist/lib/task/workflow-command.js +17 -0
  109. package/dist/lib/task/workflow-warning-intents.js +0 -16
  110. package/dist/lib/task/workflow-warnings.js +28 -2
  111. package/dist/lib/update.js +2 -0
  112. package/dist/lifecycle-build-manifest.json +3 -3
  113. package/lib/agent-clients/adapters/codex-lifecycle/capability-store.ts +223 -33
  114. package/lib/agent-clients/adapters/codex-lifecycle/sandbox-controller.ts +3 -2
  115. package/lib/fs/durable-write.ts +29 -0
  116. package/lib/fs/file-lock.ts +113 -0
  117. package/lib/host-control/audit.ts +22 -0
  118. package/lib/host-control/client.ts +172 -0
  119. package/lib/host-control/command.ts +60 -0
  120. package/lib/host-control/path.ts +167 -0
  121. package/lib/host-control/secure-fs.ts +135 -0
  122. package/lib/host-control/server.ts +180 -0
  123. package/lib/host-control/service.ts +133 -0
  124. package/lib/init.ts +15 -2
  125. package/lib/internal/cli-route-inventory.ts +3 -1
  126. package/lib/internal/codex-lifecycle.ts +6 -6
  127. package/lib/internal/demo-promotion.ts +354 -0
  128. package/lib/internal/demo-transcript.ts +419 -0
  129. package/lib/internal/host-control.ts +28 -0
  130. package/lib/internal/manual-validation.ts +306 -0
  131. package/lib/internal/platform-pr.ts +15 -4
  132. package/lib/internal/release-workflow.ts +74 -82
  133. package/lib/internal/sandbox-control.ts +162 -1
  134. package/lib/internal/task-artifact.ts +13 -216
  135. package/lib/internal/task-create.ts +5 -5
  136. package/lib/internal/task-event.ts +20 -11
  137. package/lib/internal/task-operation-registry.ts +111 -3
  138. package/lib/internal/task-review.ts +6 -51
  139. package/lib/internal/task-validate.ts +26 -10
  140. package/lib/owned-path.ts +26 -0
  141. package/lib/platform/check-status.ts +9 -0
  142. package/lib/platform/comment-safety.ts +5 -0
  143. package/lib/platform/completion-backfill.ts +1 -1
  144. package/lib/platform/github-data.ts +322 -0
  145. package/lib/platform/github-provider.ts +15 -20
  146. package/lib/platform/issue-comments.ts +3 -4
  147. package/lib/platform/issues.ts +4 -245
  148. package/lib/platform/pr-checks.ts +13 -77
  149. package/lib/platform/pr-summary.ts +61 -5
  150. package/lib/platform/pull-requests.ts +3 -170
  151. package/lib/platform/snapshots.ts +53 -0
  152. package/lib/platform/verification-sync.ts +145 -155
  153. package/lib/release/workflow.ts +3 -3
  154. package/lib/sandbox/commands/create.ts +7 -6
  155. package/lib/sandbox/commands/rm.ts +3 -1909
  156. package/lib/sandbox/control/audit.ts +253 -0
  157. package/lib/sandbox/control/client.ts +109 -66
  158. package/lib/sandbox/control/executor.ts +134 -74
  159. package/lib/sandbox/control/finalization-response.ts +29 -0
  160. package/lib/sandbox/control/identity-sentinel.ts +137 -0
  161. package/lib/sandbox/control/lifecycle.ts +45 -3
  162. package/lib/sandbox/control/native-file-lock.ts +6 -107
  163. package/lib/sandbox/control/protocol.ts +75 -6
  164. package/lib/sandbox/control/server.ts +538 -123
  165. package/lib/sandbox/control/state.ts +78 -0
  166. package/lib/sandbox/control/task-workflow.ts +95 -0
  167. package/lib/sandbox/control/workflow-executor.ts +102 -0
  168. package/lib/sandbox/index.ts +2 -2
  169. package/lib/sandbox/recovery.ts +28 -5
  170. package/lib/sandbox/removal.ts +2144 -0
  171. package/lib/sandbox/task-cleanup.ts +209 -0
  172. package/lib/sandbox/workspace-view.ts +17 -15
  173. package/lib/task/activity-intent.ts +2 -2
  174. package/lib/task/activity-log.ts +27 -19
  175. package/lib/task/artifact-command.ts +104 -0
  176. package/lib/task/artifact-lifecycle.ts +31 -26
  177. package/lib/task/artifact-name.ts +55 -0
  178. package/lib/task/artifact-operations.ts +22 -68
  179. package/lib/task/artifact-receipts.ts +3 -14
  180. package/lib/task/artifact-repair-intent.ts +99 -18
  181. package/lib/task/artifact-schema.ts +5 -34
  182. package/lib/task/capabilities.ts +13 -22
  183. package/lib/task/codex-orchestration.ts +85 -24
  184. package/lib/task/commit-identity.ts +31 -0
  185. package/lib/task/commit-operation.ts +2 -16
  186. package/lib/task/control-authority.ts +502 -5
  187. package/lib/task/control-recovery.ts +174 -0
  188. package/lib/task/create.ts +63 -8
  189. package/lib/task/decision-details.ts +3 -71
  190. package/lib/task/events.ts +131 -10
  191. package/lib/task/finalization-state.ts +11 -0
  192. package/lib/task/human-override.ts +3 -8
  193. package/lib/task/implementation-inputs.ts +3 -3
  194. package/lib/task/intermediate-cleanup.ts +455 -0
  195. package/lib/task/invalidation.ts +18 -62
  196. package/lib/task/ledger-intents.ts +7 -24
  197. package/lib/task/ledger.ts +1 -3
  198. package/lib/task/lifecycle.ts +17 -1
  199. package/lib/task/local-artifact-finalization.ts +148 -182
  200. package/lib/task/manual-validation-completion.ts +40 -0
  201. package/lib/task/manual-validation-evidence.ts +209 -0
  202. package/lib/task/manual-validation-receipt.ts +152 -0
  203. package/lib/task/manual-validation-shared.ts +50 -0
  204. package/lib/task/manual-validation-transaction.ts +304 -0
  205. package/lib/task/markdown.ts +70 -0
  206. package/lib/task/orchestration.ts +19 -19
  207. package/lib/task/qualification-audit.ts +22 -33
  208. package/lib/task/review-artifacts.ts +1 -20
  209. package/lib/task/review-command.ts +23 -0
  210. package/lib/task/review-finalization.ts +131 -259
  211. package/lib/task/review-fingerprint.ts +2 -2
  212. package/lib/task/sections.ts +33 -54
  213. package/lib/task/verification-engine.ts +110 -366
  214. package/lib/task/verification-types.ts +17 -0
  215. package/lib/task/verification.ts +1 -1
  216. package/lib/task/workflow-command.ts +18 -0
  217. package/lib/task/workflow-warning-intents.ts +0 -13
  218. package/lib/task/workflow-warnings.ts +21 -2
  219. package/lib/update.ts +6 -0
  220. package/package.json +6 -6
  221. package/templates/.agents/hooks/lifecycle-delegation.js +6 -6
  222. package/templates/.agents/rules/testing-discipline.en.md +2 -0
  223. package/templates/.agents/rules/testing-discipline.zh-CN.md +2 -0
  224. package/templates/.agents/scripts/package.json +3 -0
  225. package/templates/.agents/skills/complete-manual-validation/SKILL.en.md +32 -20
  226. package/templates/.agents/skills/complete-manual-validation/SKILL.zh-CN.md +32 -20
  227. package/templates/.agents/skills/complete-manual-validation/config/verify.en.json +1 -1
  228. package/templates/.agents/skills/complete-manual-validation/config/verify.zh-CN.json +1 -1
  229. package/templates/.agents/skills/complete-manual-validation/reference/report-template.en.md +2 -0
  230. package/templates/.agents/skills/complete-manual-validation/reference/report-template.zh-CN.md +2 -0
  231. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.en.md +16 -7
  232. package/templates/.agents/skills/complete-manual-validation/reference/summary-update.zh-CN.md +16 -7
  233. package/templates/.agents/skills/complete-task/SKILL.en.md +1 -1
  234. package/templates/.agents/skills/complete-task/SKILL.zh-CN.md +1 -1
  235. package/templates/.agents/skills/release/SKILL.en.md +7 -3
  236. package/templates/.agents/skills/release/SKILL.zh-CN.md +7 -3
  237. package/templates/.agents/skills/run-manual-validation/SKILL.en.md +20 -3
  238. package/templates/.agents/skills/run-manual-validation/SKILL.zh-CN.md +20 -3
  239. package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.en.md +4 -1
  240. package/templates/.agents/skills/run-manual-validation/reference/discovery-and-execution.zh-CN.md +4 -1
  241. package/templates/.agents/skills/run-manual-validation/reference/report-template.en.md +2 -0
  242. package/templates/.agents/skills/run-manual-validation/reference/report-template.zh-CN.md +2 -0
  243. package/templates/.agents/skills/run-task/SKILL.en.md +1 -1
  244. package/templates/.agents/skills/run-task/SKILL.zh-CN.md +1 -1
  245. package/templates/.agents/skills/test/SKILL.en.md +17 -6
  246. package/templates/.agents/skills/test/SKILL.zh-CN.md +17 -6
  247. package/templates/.claude/commands/run-manual-validation.en.md +1 -1
  248. package/templates/.claude/commands/run-manual-validation.zh-CN.md +1 -1
  249. package/dist/lib/platform/adapters.js +0 -56
  250. package/lib/platform/adapters.ts +0 -197
@@ -1,3 +1,4 @@
1
+ import { normalizePullRequest, type RemotePullRequest } from './github-data.ts';
1
2
  import fs from 'node:fs';
2
3
  import path from 'node:path';
3
4
  import { execFileSync } from 'node:child_process';
@@ -6,7 +7,7 @@ import { parseTypedTaskFrontmatter } from '../task/frontmatter.ts';
6
7
  import { resolveTaskRef } from '../task/resolve-ref.ts';
7
8
  import { extractSection } from '../task/sections.ts';
8
9
  import { captureTaskWriteMetadata, writeTask } from '../task/write.ts';
9
- import type { PlatformChangeRequestSnapshot } from './adapters.ts';
10
+ import type { PlatformChangeRequestSnapshot } from './snapshots.ts';
10
11
  import { resolvePlatformProviderContext } from './context.ts';
11
12
  import type { PlatformClient } from './context.ts';
12
13
  import { inspectPlatformIssue } from './issues.ts';
@@ -61,7 +62,6 @@ type PullRequestResult = PlatformResult & {
61
62
  effect: 'no-op' | 'applied' | 'unknown';
62
63
  }>;
63
64
  };
64
- type GitHubClient = PlatformClient;
65
65
  type InspectionOptions = { cwd?: string; client?: PlatformClient; runtimeVersion?: string };
66
66
  type SharedOptions = { cwd?: string; client?: PlatformClient; runtimeVersion?: string };
67
67
  type CreateOptions = SharedOptions & {
@@ -93,54 +93,6 @@ type ExternalPullRequestResult = PullRequestResult & {
93
93
 
94
94
  type CreatePhase = 'before-post' | 'post-dispatched' | 'post-accepted';
95
95
 
96
- type RemotePullRequest = {
97
- number?: number;
98
- node_id?: string;
99
- html_url?: string;
100
- state?: string;
101
- title?: string;
102
- body?: string | null;
103
- draft?: boolean;
104
- pull_request?: unknown;
105
- head?: { ref?: string; sha?: string; repo?: { full_name?: string } | null };
106
- base?: { ref?: string; sha?: string; repo?: { full_name?: string } | null };
107
- merged_at?: string | null;
108
- merge_commit_sha?: string | null;
109
- labels?: Array<string | { name?: string }>;
110
- assignees?: Array<{ login?: string }>;
111
- milestone?: { title?: string } | null;
112
- mergeable?: boolean | null;
113
- mergeable_state?: string | null;
114
- };
115
-
116
- type ClosingPullRequestNode = {
117
- number?: number;
118
- id?: string;
119
- url?: string;
120
- state?: string;
121
- title?: string;
122
- body?: string | null;
123
- isDraft?: boolean;
124
- headRefName?: string;
125
- headRefOid?: string;
126
- headRepository?: { nameWithOwner?: string } | null;
127
- baseRefName?: string;
128
- baseRefOid?: string;
129
- baseRepository?: { nameWithOwner?: string } | null;
130
- mergedAt?: string | null;
131
- mergeCommit?: { oid?: string } | null;
132
- labels?: { nodes?: Array<{ name?: string }> };
133
- assignees?: { nodes?: Array<{ login?: string }> };
134
- milestone?: { title?: string } | null;
135
- };
136
-
137
- type ClosingPullRequestPage = {
138
- data?: { repository?: { issue?: { closedByPullRequestsReferences?: {
139
- nodes?: ClosingPullRequestNode[];
140
- pageInfo?: { hasNextPage?: boolean; endCursor?: string | null };
141
- } } } };
142
- };
143
-
144
96
  function warningResultForPrimary(primaryResult: PullRequestPrimaryResult): NonNullable<PullRequestResult['result']> {
145
97
  if (primaryResult === 'pr_created') return 'pr_created_with_warnings';
146
98
  if (primaryResult === 'pr_reused') return 'pr_reused_with_warnings';
@@ -189,57 +141,6 @@ const PRECONDITION_NOT_CREATED: CreationOutcome = {
189
141
  kind: 'not-created', reason: 'precondition-failed', createdByCurrentOperation: false
190
142
  };
191
143
 
192
- function normalizePullRequest(remote: RemotePullRequest, repository: string): PullRequestSnapshot | null {
193
- const number = Number(remote.number);
194
- const headRepository = remote.head?.repo?.full_name;
195
- const baseRepository = remote.base?.repo?.full_name;
196
- if (!Number.isInteger(number) || number <= 0 || !remote.node_id || !remote.html_url ||
197
- !remote.head?.ref || !remote.head.sha || !headRepository || !remote.base?.ref || !baseRepository) return null;
198
- const mergeabilityDetail = remote.mergeable_state?.trim().toLowerCase() || null;
199
- const mergeability = remote.mergeable === false
200
- ? { state: 'conflicting' as const, detail: mergeabilityDetail }
201
- : remote.mergeable === true && mergeabilityDetail !== 'dirty'
202
- ? { state: 'mergeable' as const, detail: mergeabilityDetail }
203
- : { state: 'unknown' as const, detail: mergeabilityDetail };
204
- return {
205
- repository,
206
- number,
207
- nodeId: remote.node_id,
208
- url: remote.html_url,
209
- state: remote.state === 'closed' ? 'closed' : 'open',
210
- title: remote.title || '',
211
- body: remote.body || '',
212
- draft: Boolean(remote.draft),
213
- head: { repository: headRepository, ref: remote.head.ref, sha: remote.head.sha },
214
- base: { repository: baseRepository, ref: remote.base.ref, sha: remote.base.sha || '' },
215
- mergedAt: remote.merged_at || null,
216
- mergeCommitSha: remote.merge_commit_sha || null,
217
- labels: (remote.labels || []).map((label) => typeof label === 'string' ? label : label.name || '').filter(Boolean).sort(),
218
- assignees: (remote.assignees || []).map((assignee) => assignee.login || '').filter(Boolean).sort(),
219
- milestone: remote.milestone?.title || null,
220
- mergeability
221
- };
222
- }
223
-
224
- function normalizeClosingPullRequest(node: ClosingPullRequestNode, repository: string): PullRequestSnapshot | null {
225
- return normalizePullRequest({
226
- number: node.number,
227
- node_id: node.id,
228
- html_url: node.url,
229
- state: node.state === 'OPEN' ? 'open' : 'closed',
230
- title: node.title,
231
- body: node.body,
232
- draft: node.isDraft,
233
- head: { ref: node.headRefName, sha: node.headRefOid, repo: node.headRepository ? { full_name: node.headRepository.nameWithOwner } : null },
234
- base: { ref: node.baseRefName, sha: node.baseRefOid, repo: node.baseRepository ? { full_name: node.baseRepository.nameWithOwner } : null },
235
- merged_at: node.mergedAt,
236
- merge_commit_sha: node.mergeCommit?.oid,
237
- labels: node.labels?.nodes,
238
- assignees: node.assignees?.nodes,
239
- milestone: node.milestone
240
- }, repository);
241
- }
242
-
243
144
  function repositoryKey(repository: string): string {
244
145
  return repository.trim().toLowerCase();
245
146
  }
@@ -329,51 +230,6 @@ function selectExternalPullRequest(
329
230
  return { status: 'selected', source: 'unique', selected: eligible[0]!, candidates, eligible };
330
231
  }
331
232
 
332
- const CLOSING_PULL_REQUESTS_QUERY = `query($owner:String!,$name:String!,$issue:Int!,$cursor:String){repository(owner:$owner,name:$name){issue(number:$issue){closedByPullRequestsReferences(first:100,after:$cursor){nodes{number id url state title body isDraft headRefName headRefOid headRepository{nameWithOwner} baseRefName baseRefOid baseRepository{nameWithOwner} mergedAt mergeCommit{oid} labels(first:100){nodes{name}} assignees(first:100){nodes{login}} milestone{title}} pageInfo{hasNextPage endCursor}}}}}`;
333
-
334
- function inspectGitHubIssueClosingChangeRequests(
335
- client: GitHubClient,
336
- repository: string,
337
- issueNumber: number,
338
- cwd: string
339
- ) {
340
- const [owner, name] = repository.split('/');
341
- if (!owner || !name || !Number.isInteger(issueNumber) || issueNumber <= 0) return {
342
- ok: false as const,
343
- error: { code: 'PR_IDENTITY_INVALID', message: 'Repository or Issue identity is invalid', retryable: false }
344
- };
345
- const candidates: PullRequestSnapshot[] = [];
346
- let cursor: string | null = null;
347
- for (;;) {
348
- const args = [
349
- 'api', 'graphql', '-f', `query=${CLOSING_PULL_REQUESTS_QUERY}`,
350
- '-F', `owner=${owner}`, '-F', `name=${name}`, '-F', `issue=${issueNumber}`
351
- ];
352
- if (cursor) args.push('-F', `cursor=${cursor}`);
353
- const response = client.json<ClosingPullRequestPage>(args, { cwd });
354
- if (!response.ok) return response;
355
- const connection = response.value?.data?.repository?.issue?.closedByPullRequestsReferences;
356
- if (!connection || !Array.isArray(connection.nodes) || !connection.pageInfo) return {
357
- ok: false as const,
358
- error: { code: 'PR_IDENTITY_INVALID', message: 'Closing pull request response is incomplete', retryable: false }
359
- };
360
- for (const node of connection.nodes) {
361
- const normalized = normalizeClosingPullRequest(node, repository);
362
- if (!normalized) return {
363
- ok: false as const,
364
- error: { code: 'PR_IDENTITY_INVALID', message: 'Closing pull request identity is incomplete', retryable: false }
365
- };
366
- candidates.push(normalized);
367
- }
368
- if (!connection.pageInfo.hasNextPage) return { ok: true as const, value: candidates };
369
- if (!connection.pageInfo.endCursor || connection.pageInfo.endCursor === cursor) return {
370
- ok: false as const,
371
- error: { code: 'PR_IDENTITY_INVALID', message: 'Closing pull request pagination cursor is invalid', retryable: false }
372
- };
373
- cursor = connection.pageInfo.endCursor;
374
- }
375
- }
376
-
377
233
  function expectedHead(repository: string, head: string): { repository: string; ref: string } {
378
234
  const colon = head.indexOf(':');
379
235
  if (colon === -1) return { repository, ref: head };
@@ -606,15 +462,6 @@ async function inspectExternalPullRequest(
606
462
  });
607
463
  }
608
464
 
609
- function inspectGitHubPullRequest(client: GitHubClient, repository: string, number: number, cwd: string) {
610
- const fetched = client.json<RemotePullRequest>(['api', `repos/${repository}/pulls/${number}`], { cwd });
611
- if (!fetched.ok) return fetched;
612
- const pullRequest = normalizePullRequest(fetched.value, repository);
613
- return pullRequest
614
- ? { ok: true as const, value: pullRequest }
615
- : { ok: false as const, error: { code: 'PR_IDENTITY_INVALID', message: 'Remote resource is not a valid pull request', retryable: false } };
616
- }
617
-
618
465
  async function inspectPlatformPullRequest(taskRef: string, options: InspectionOptions = {}): Promise<PullRequestResult> {
619
466
  const base = await resolvedContext(taskRef, options);
620
467
  if (!base.ok) return base.output;
@@ -1656,20 +1503,6 @@ async function skipPlatformPullRequestFact(taskRef: string, options: SkipFactOpt
1656
1503
  }
1657
1504
  }
1658
1505
 
1659
- export {
1660
- bindPlatformPullRequest,
1661
- createPlatformPullRequest,
1662
- inspectGitHubPullRequest,
1663
- inspectGitHubIssueClosingChangeRequests,
1664
- inspectPlatformPullRequest,
1665
- inspectPlatformPullRequestByNumber,
1666
- normalizePullRequest,
1667
- resolveExternalPullRequest,
1668
- skipPlatformPullRequestFact,
1669
- selectExternalPullRequest,
1670
- selectPullRequest,
1671
- syncPlatformPullRequest,
1672
- syncPlatformPullRequestInLabels
1673
- };
1506
+ export { bindPlatformPullRequest, createPlatformPullRequest, inspectPlatformPullRequest, inspectPlatformPullRequestByNumber, resolveExternalPullRequest, skipPlatformPullRequestFact, selectExternalPullRequest, selectPullRequest, syncPlatformPullRequest, syncPlatformPullRequestInLabels };
1674
1507
  export type { BindOptions, CreateOptions, ExternalPullRequestResult, ExternalPullRequestSelection, PullRequestPrimaryResult, PullRequestResult, PullRequestSnapshot, ResolveExternalOptions, SkipFactOptions, SyncOptions };
1675
1508
  export { warningResultForPrimary };
@@ -0,0 +1,53 @@
1
+ import type { ResourceIdentity } from './resource-identity.ts';
2
+
3
+ export type PlatformIssueSnapshot = {
4
+ repository: string;
5
+ number: number;
6
+ identity?: ResourceIdentity;
7
+ databaseId: number | null;
8
+ nodeId: string;
9
+ url: string;
10
+ state: 'open' | 'closed';
11
+ title: string;
12
+ body: string;
13
+ labels: string[];
14
+ assignees: string[];
15
+ milestone: string | null;
16
+ issueType: string | null;
17
+ fields: Record<string, string | number | null>;
18
+ };
19
+
20
+ export type PlatformMergeability = {
21
+ state: 'mergeable' | 'conflicting' | 'unknown';
22
+ detail: string | null;
23
+ };
24
+
25
+ export type PlatformChangeRequestSnapshot = {
26
+ repository: string;
27
+ number: number;
28
+ nodeId: string;
29
+ url: string;
30
+ state: 'open' | 'closed';
31
+ title: string;
32
+ body: string;
33
+ draft: boolean;
34
+ head: { repository: string; ref: string; sha: string };
35
+ base: { repository: string; ref: string; sha: string };
36
+ mergedAt: string | null;
37
+ mergeCommitSha: string | null;
38
+ labels: string[];
39
+ assignees: string[];
40
+ milestone: string | null;
41
+ mergeability?: PlatformMergeability;
42
+ identity?: ResourceIdentity;
43
+ };
44
+
45
+ export type PlatformCheckSnapshot = {
46
+ name: string;
47
+ bucket: 'pass' | 'fail' | 'pending' | 'cancel';
48
+ workflow?: string | null;
49
+ conclusion?: string | null;
50
+ detailsUrl?: string | null;
51
+ startedAt?: string | null;
52
+ completedAt?: string | null;
53
+ };