@paysdoc/devplatform 1.0.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 (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +122 -0
  3. package/dist/git/bootstrapIdentity.d.ts +50 -0
  4. package/dist/git/bootstrapIdentity.d.ts.map +1 -0
  5. package/dist/git/bootstrapIdentity.js +72 -0
  6. package/dist/git/bootstrapIdentity.js.map +1 -0
  7. package/dist/git/branchOps.d.ts +27 -0
  8. package/dist/git/branchOps.d.ts.map +1 -0
  9. package/dist/git/branchOps.js +91 -0
  10. package/dist/git/branchOps.js.map +1 -0
  11. package/dist/git/claimOps.d.ts +40 -0
  12. package/dist/git/claimOps.d.ts.map +1 -0
  13. package/dist/git/claimOps.js +44 -0
  14. package/dist/git/claimOps.js.map +1 -0
  15. package/dist/git/commitOps.d.ts +35 -0
  16. package/dist/git/commitOps.d.ts.map +1 -0
  17. package/dist/git/commitOps.js +131 -0
  18. package/dist/git/commitOps.js.map +1 -0
  19. package/dist/git/consoleLogger.d.ts +8 -0
  20. package/dist/git/consoleLogger.d.ts.map +1 -0
  21. package/dist/git/consoleLogger.js +9 -0
  22. package/dist/git/consoleLogger.js.map +1 -0
  23. package/dist/git/gitContext.d.ts +150 -0
  24. package/dist/git/gitContext.d.ts.map +1 -0
  25. package/dist/git/gitContext.js +405 -0
  26. package/dist/git/gitContext.js.map +1 -0
  27. package/dist/git/gitReadOps.d.ts +33 -0
  28. package/dist/git/gitReadOps.d.ts.map +1 -0
  29. package/dist/git/gitReadOps.js +38 -0
  30. package/dist/git/gitReadOps.js.map +1 -0
  31. package/dist/git/index.d.ts +49 -0
  32. package/dist/git/index.d.ts.map +1 -0
  33. package/dist/git/index.js +44 -0
  34. package/dist/git/index.js.map +1 -0
  35. package/dist/git/processCleanup.d.ts +7 -0
  36. package/dist/git/processCleanup.d.ts.map +1 -0
  37. package/dist/git/processCleanup.js +45 -0
  38. package/dist/git/processCleanup.js.map +1 -0
  39. package/dist/git/remoteOps.d.ts +25 -0
  40. package/dist/git/remoteOps.d.ts.map +1 -0
  41. package/dist/git/remoteOps.js +30 -0
  42. package/dist/git/remoteOps.js.map +1 -0
  43. package/dist/git/repoWorkspace.d.ts +72 -0
  44. package/dist/git/repoWorkspace.d.ts.map +1 -0
  45. package/dist/git/repoWorkspace.js +85 -0
  46. package/dist/git/repoWorkspace.js.map +1 -0
  47. package/dist/git/types.d.ts +182 -0
  48. package/dist/git/types.d.ts.map +1 -0
  49. package/dist/git/types.js +10 -0
  50. package/dist/git/types.js.map +1 -0
  51. package/dist/git/workingDirectoryGuard.d.ts +39 -0
  52. package/dist/git/workingDirectoryGuard.d.ts.map +1 -0
  53. package/dist/git/workingDirectoryGuard.js +53 -0
  54. package/dist/git/workingDirectoryGuard.js.map +1 -0
  55. package/dist/git/worktreeCreateOps.d.ts +45 -0
  56. package/dist/git/worktreeCreateOps.d.ts.map +1 -0
  57. package/dist/git/worktreeCreateOps.js +208 -0
  58. package/dist/git/worktreeCreateOps.js.map +1 -0
  59. package/dist/git/worktreeProbeOps.d.ts +17 -0
  60. package/dist/git/worktreeProbeOps.d.ts.map +1 -0
  61. package/dist/git/worktreeProbeOps.js +66 -0
  62. package/dist/git/worktreeProbeOps.js.map +1 -0
  63. package/dist/git/worktreeQueryOps.d.ts +45 -0
  64. package/dist/git/worktreeQueryOps.d.ts.map +1 -0
  65. package/dist/git/worktreeQueryOps.js +129 -0
  66. package/dist/git/worktreeQueryOps.js.map +1 -0
  67. package/dist/git/worktreeRemoveOps.d.ts +27 -0
  68. package/dist/git/worktreeRemoveOps.d.ts.map +1 -0
  69. package/dist/git/worktreeRemoveOps.js +132 -0
  70. package/dist/git/worktreeRemoveOps.js.map +1 -0
  71. package/dist/git/worktreeResetOps.d.ts +18 -0
  72. package/dist/git/worktreeResetOps.d.ts.map +1 -0
  73. package/dist/git/worktreeResetOps.js +68 -0
  74. package/dist/git/worktreeResetOps.js.map +1 -0
  75. package/dist/index.d.ts +13 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +13 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/providers/forgeProviders.d.ts +72 -0
  80. package/dist/providers/forgeProviders.d.ts.map +1 -0
  81. package/dist/providers/forgeProviders.js +112 -0
  82. package/dist/providers/forgeProviders.js.map +1 -0
  83. package/dist/providers/github/appAuth.d.ts +70 -0
  84. package/dist/providers/github/appAuth.d.ts.map +1 -0
  85. package/dist/providers/github/appAuth.js +243 -0
  86. package/dist/providers/github/appAuth.js.map +1 -0
  87. package/dist/providers/github/cloneUrl.d.ts +12 -0
  88. package/dist/providers/github/cloneUrl.d.ts.map +1 -0
  89. package/dist/providers/github/cloneUrl.js +20 -0
  90. package/dist/providers/github/cloneUrl.js.map +1 -0
  91. package/dist/providers/github/commands/boardCommands.d.ts +22 -0
  92. package/dist/providers/github/commands/boardCommands.d.ts.map +1 -0
  93. package/dist/providers/github/commands/boardCommands.js +66 -0
  94. package/dist/providers/github/commands/boardCommands.js.map +1 -0
  95. package/dist/providers/github/commands/issueCommands.d.ts +21 -0
  96. package/dist/providers/github/commands/issueCommands.d.ts.map +1 -0
  97. package/dist/providers/github/commands/issueCommands.js +50 -0
  98. package/dist/providers/github/commands/issueCommands.js.map +1 -0
  99. package/dist/providers/github/commands/labelCommands.d.ts +3 -0
  100. package/dist/providers/github/commands/labelCommands.d.ts.map +1 -0
  101. package/dist/providers/github/commands/labelCommands.js +8 -0
  102. package/dist/providers/github/commands/labelCommands.js.map +1 -0
  103. package/dist/providers/github/commands/prCommands.d.ts +14 -0
  104. package/dist/providers/github/commands/prCommands.d.ts.map +1 -0
  105. package/dist/providers/github/commands/prCommands.js +46 -0
  106. package/dist/providers/github/commands/prCommands.js.map +1 -0
  107. package/dist/providers/github/commands/secretCommands.d.ts +2 -0
  108. package/dist/providers/github/commands/secretCommands.d.ts.map +1 -0
  109. package/dist/providers/github/commands/secretCommands.js +5 -0
  110. package/dist/providers/github/commands/secretCommands.js.map +1 -0
  111. package/dist/providers/github/contextBinding.d.ts +11 -0
  112. package/dist/providers/github/contextBinding.d.ts.map +1 -0
  113. package/dist/providers/github/contextBinding.js +15 -0
  114. package/dist/providers/github/contextBinding.js.map +1 -0
  115. package/dist/providers/github/domain/issue.d.ts +94 -0
  116. package/dist/providers/github/domain/issue.d.ts.map +1 -0
  117. package/dist/providers/github/domain/issue.js +7 -0
  118. package/dist/providers/github/domain/issue.js.map +1 -0
  119. package/dist/providers/github/domain/pullRequest.d.ts +55 -0
  120. package/dist/providers/github/domain/pullRequest.d.ts.map +1 -0
  121. package/dist/providers/github/domain/pullRequest.js +9 -0
  122. package/dist/providers/github/domain/pullRequest.js.map +1 -0
  123. package/dist/providers/github/ghAuthToken.d.ts +28 -0
  124. package/dist/providers/github/ghAuthToken.d.ts.map +1 -0
  125. package/dist/providers/github/ghAuthToken.js +39 -0
  126. package/dist/providers/github/ghAuthToken.js.map +1 -0
  127. package/dist/providers/github/ghCommandRunner.d.ts +20 -0
  128. package/dist/providers/github/ghCommandRunner.d.ts.map +1 -0
  129. package/dist/providers/github/ghCommandRunner.js +21 -0
  130. package/dist/providers/github/ghCommandRunner.js.map +1 -0
  131. package/dist/providers/github/ghIssueApi.d.ts +29 -0
  132. package/dist/providers/github/ghIssueApi.d.ts.map +1 -0
  133. package/dist/providers/github/ghIssueApi.js +37 -0
  134. package/dist/providers/github/ghIssueApi.js.map +1 -0
  135. package/dist/providers/github/ghIssueParsers.d.ts +28 -0
  136. package/dist/providers/github/ghIssueParsers.d.ts.map +1 -0
  137. package/dist/providers/github/ghIssueParsers.js +105 -0
  138. package/dist/providers/github/ghIssueParsers.js.map +1 -0
  139. package/dist/providers/github/ghPrApi.d.ts +27 -0
  140. package/dist/providers/github/ghPrApi.d.ts.map +1 -0
  141. package/dist/providers/github/ghPrApi.js +32 -0
  142. package/dist/providers/github/ghPrApi.js.map +1 -0
  143. package/dist/providers/github/ghPrParsers.d.ts +57 -0
  144. package/dist/providers/github/ghPrParsers.d.ts.map +1 -0
  145. package/dist/providers/github/ghPrParsers.js +135 -0
  146. package/dist/providers/github/ghPrParsers.js.map +1 -0
  147. package/dist/providers/github/ghRepoApi.d.ts +33 -0
  148. package/dist/providers/github/ghRepoApi.d.ts.map +1 -0
  149. package/dist/providers/github/ghRepoApi.js +89 -0
  150. package/dist/providers/github/ghRepoApi.js.map +1 -0
  151. package/dist/providers/github/githubBoardManager.d.ts +39 -0
  152. package/dist/providers/github/githubBoardManager.d.ts.map +1 -0
  153. package/dist/providers/github/githubBoardManager.js +166 -0
  154. package/dist/providers/github/githubBoardManager.js.map +1 -0
  155. package/dist/providers/github/githubCodeHost.d.ts +73 -0
  156. package/dist/providers/github/githubCodeHost.d.ts.map +1 -0
  157. package/dist/providers/github/githubCodeHost.js +217 -0
  158. package/dist/providers/github/githubCodeHost.js.map +1 -0
  159. package/dist/providers/github/githubIdentity.d.ts +51 -0
  160. package/dist/providers/github/githubIdentity.d.ts.map +1 -0
  161. package/dist/providers/github/githubIdentity.js +110 -0
  162. package/dist/providers/github/githubIdentity.js.map +1 -0
  163. package/dist/providers/github/githubIssueTracker.d.ts +69 -0
  164. package/dist/providers/github/githubIssueTracker.d.ts.map +1 -0
  165. package/dist/providers/github/githubIssueTracker.js +209 -0
  166. package/dist/providers/github/githubIssueTracker.js.map +1 -0
  167. package/dist/providers/github/githubTokenProvider.d.ts +41 -0
  168. package/dist/providers/github/githubTokenProvider.d.ts.map +1 -0
  169. package/dist/providers/github/githubTokenProvider.js +51 -0
  170. package/dist/providers/github/githubTokenProvider.js.map +1 -0
  171. package/dist/providers/github/index.d.ts +10 -0
  172. package/dist/providers/github/index.d.ts.map +1 -0
  173. package/dist/providers/github/index.js +5 -0
  174. package/dist/providers/github/index.js.map +1 -0
  175. package/dist/providers/github/mappers.d.ts +40 -0
  176. package/dist/providers/github/mappers.d.ts.map +1 -0
  177. package/dist/providers/github/mappers.js +103 -0
  178. package/dist/providers/github/mappers.js.map +1 -0
  179. package/dist/providers/github/tokenResolver.d.ts +37 -0
  180. package/dist/providers/github/tokenResolver.d.ts.map +1 -0
  181. package/dist/providers/github/tokenResolver.js +43 -0
  182. package/dist/providers/github/tokenResolver.js.map +1 -0
  183. package/dist/providers/gitlab/gitlabApiClient.d.ts +45 -0
  184. package/dist/providers/gitlab/gitlabApiClient.d.ts.map +1 -0
  185. package/dist/providers/gitlab/gitlabApiClient.js +95 -0
  186. package/dist/providers/gitlab/gitlabApiClient.js.map +1 -0
  187. package/dist/providers/gitlab/gitlabBoardManager.d.ts +11 -0
  188. package/dist/providers/gitlab/gitlabBoardManager.d.ts.map +1 -0
  189. package/dist/providers/gitlab/gitlabBoardManager.js +27 -0
  190. package/dist/providers/gitlab/gitlabBoardManager.js.map +1 -0
  191. package/dist/providers/gitlab/gitlabCodeHost.d.ts +49 -0
  192. package/dist/providers/gitlab/gitlabCodeHost.d.ts.map +1 -0
  193. package/dist/providers/gitlab/gitlabCodeHost.js +109 -0
  194. package/dist/providers/gitlab/gitlabCodeHost.js.map +1 -0
  195. package/dist/providers/gitlab/gitlabTypes.d.ts +46 -0
  196. package/dist/providers/gitlab/gitlabTypes.d.ts.map +1 -0
  197. package/dist/providers/gitlab/gitlabTypes.js +6 -0
  198. package/dist/providers/gitlab/gitlabTypes.js.map +1 -0
  199. package/dist/providers/gitlab/index.d.ts +5 -0
  200. package/dist/providers/gitlab/index.d.ts.map +1 -0
  201. package/dist/providers/gitlab/index.js +4 -0
  202. package/dist/providers/gitlab/index.js.map +1 -0
  203. package/dist/providers/gitlab/mappers.d.ts +26 -0
  204. package/dist/providers/gitlab/mappers.d.ts.map +1 -0
  205. package/dist/providers/gitlab/mappers.js +63 -0
  206. package/dist/providers/gitlab/mappers.js.map +1 -0
  207. package/dist/providers/index.d.ts +7 -0
  208. package/dist/providers/index.d.ts.map +1 -0
  209. package/dist/providers/index.js +7 -0
  210. package/dist/providers/index.js.map +1 -0
  211. package/dist/providers/jira/adfConverter.d.ts +32 -0
  212. package/dist/providers/jira/adfConverter.d.ts.map +1 -0
  213. package/dist/providers/jira/adfConverter.js +144 -0
  214. package/dist/providers/jira/adfConverter.js.map +1 -0
  215. package/dist/providers/jira/index.d.ts +8 -0
  216. package/dist/providers/jira/index.d.ts.map +1 -0
  217. package/dist/providers/jira/index.js +5 -0
  218. package/dist/providers/jira/index.js.map +1 -0
  219. package/dist/providers/jira/jiraApiClient.d.ts +42 -0
  220. package/dist/providers/jira/jiraApiClient.d.ts.map +1 -0
  221. package/dist/providers/jira/jiraApiClient.js +84 -0
  222. package/dist/providers/jira/jiraApiClient.js.map +1 -0
  223. package/dist/providers/jira/jiraBoardManager.d.ts +11 -0
  224. package/dist/providers/jira/jiraBoardManager.d.ts.map +1 -0
  225. package/dist/providers/jira/jiraBoardManager.js +27 -0
  226. package/dist/providers/jira/jiraBoardManager.js.map +1 -0
  227. package/dist/providers/jira/jiraIssueTracker.d.ts +53 -0
  228. package/dist/providers/jira/jiraIssueTracker.d.ts.map +1 -0
  229. package/dist/providers/jira/jiraIssueTracker.js +231 -0
  230. package/dist/providers/jira/jiraIssueTracker.js.map +1 -0
  231. package/dist/providers/jira/jiraTypes.d.ts +61 -0
  232. package/dist/providers/jira/jiraTypes.d.ts.map +1 -0
  233. package/dist/providers/jira/jiraTypes.js +6 -0
  234. package/dist/providers/jira/jiraTypes.js.map +1 -0
  235. package/dist/providers/types.d.ts +271 -0
  236. package/dist/providers/types.d.ts.map +1 -0
  237. package/dist/providers/types.js +52 -0
  238. package/dist/providers/types.js.map +1 -0
  239. package/dist/providers/workspaceValidation.d.ts +18 -0
  240. package/dist/providers/workspaceValidation.d.ts.map +1 -0
  241. package/dist/providers/workspaceValidation.js +37 -0
  242. package/dist/providers/workspaceValidation.js.map +1 -0
  243. package/package.json +66 -0
@@ -0,0 +1,243 @@
1
+ /**
2
+ * GitHub App token mint — GitHub forge adapter (issue #792; originally
3
+ * absorbed into the gitContext package by issue #700).
4
+ *
5
+ * This module is structurally exempt from the git/gh guard
6
+ * (adws/providers/github/ is skipped by directory). It owns the JWT dance and
7
+ * installation-token exchange; callers should route through
8
+ * resolveContextToken for veracity.
9
+ *
10
+ * Configuration is INJECTED, never read from process.env — see
11
+ * {@link GitHubAppConfig}. The ADW wiring shim (adws/github/githubAppAuth.ts)
12
+ * is the sole site that reads GITHUB_APP_ID/GITHUB_APP_SLUG/
13
+ * GITHUB_APP_PRIVATE_KEY_PATH and passes them in as a value.
14
+ *
15
+ * No ADW-global imports. The log seam defaults to a no-op to keep the package
16
+ * standalone-reusable.
17
+ *
18
+ * The bearer credential travels to curl over its `--config` stdin channel —
19
+ * never as a command-line argument — so it cannot appear in a thrown
20
+ * `execFileSync` error or in the process table (issue #780).
21
+ */
22
+ import * as crypto from 'crypto';
23
+ import * as fs from 'fs';
24
+ import { execFileSync } from 'child_process';
25
+ /** Cache of installation tokens keyed by `owner/repo`. */
26
+ const tokenCache = new Map();
27
+ /** Cache of installation IDs keyed by `owner/repo`. */
28
+ const installationIdCache = new Map();
29
+ /** Refresh the token 5 minutes before it expires. */
30
+ const REFRESH_BUFFER_MS = 5 * 60 * 1000;
31
+ /** Production GitHub API origin. Overridable via AppAuthDeps.apiBaseUrl for hermetic testing. */
32
+ export const GITHUB_API_BASE_URL = 'https://api.github.com';
33
+ // ---------------------------------------------------------------------------
34
+ // Public API
35
+ // ---------------------------------------------------------------------------
36
+ /** Returns true if the injected GitHub App configuration is complete. */
37
+ export function isGitHubAppConfigured(config) {
38
+ return Boolean(config.appId && config.appSlug && config.privateKeyPath);
39
+ }
40
+ /**
41
+ * Returns a valid GitHub App installation token for the given repo,
42
+ * refreshing if needed. Throws if the App is not installed on owner/repo.
43
+ *
44
+ * Assumes `isGitHubAppConfigured(config)` was checked first, exactly as
45
+ * before configuration was injected — but fails with a named error rather
46
+ * than a `TypeError` from `fs.readFileSync(undefined)` if it was not.
47
+ */
48
+ export function getInstallationToken(config, owner, repo, deps = {}) {
49
+ if (!config.appId || !config.privateKeyPath) {
50
+ throw new Error(`getInstallationToken: GitHub App is not configured (missing ${!config.appId ? 'appId' : 'privateKeyPath'})`);
51
+ }
52
+ const appId = config.appId;
53
+ const keyPath = config.privateKeyPath;
54
+ const key = `${owner}/${repo}`;
55
+ const cached = tokenCache.get(key);
56
+ if (cached && cached.expiresAt.getTime() - Date.now() > REFRESH_BUFFER_MS) {
57
+ return cached.token;
58
+ }
59
+ const runCurl = deps.runCurl ?? execCurl;
60
+ const baseUrl = deps.apiBaseUrl ?? GITHUB_API_BASE_URL;
61
+ const jwt = createAppJWT(appId, keyPath);
62
+ const installationId = resolveInstallationId(jwt, owner, repo, baseUrl, runCurl);
63
+ const tokenEntry = fetchInstallationToken(jwt, installationId, baseUrl, runCurl);
64
+ tokenCache.set(key, tokenEntry);
65
+ return tokenEntry.token;
66
+ }
67
+ /** Clears both module-level caches. Test-only — production never needs to reset them. */
68
+ export function clearAppAuthCaches() {
69
+ tokenCache.clear();
70
+ installationIdCache.clear();
71
+ }
72
+ // ---------------------------------------------------------------------------
73
+ // Sanitized GitHub API request helpers — the credential travels on curl's
74
+ // `--config` stdin channel, never as a command-line argument, so it cannot
75
+ // appear in a thrown execFileSync error or in `ps` output. Failure messages
76
+ // are composed from the HTTP status and, at most, GitHub's `message` field —
77
+ // never a raw response body.
78
+ // ---------------------------------------------------------------------------
79
+ const BEARER_PATTERN = /Bearer\s+\S+/g;
80
+ /** Rewrites any `Bearer <token>` fragment to `Bearer [REDACTED]`. Final net over untrusted text (curl stderr, GitHub error bodies) — the credential is already structurally absent by construction. */
81
+ export function redactBearerTokens(text) {
82
+ return text.replace(BEARER_PATTERN, 'Bearer [REDACTED]');
83
+ }
84
+ /** Builds a curl `--config` payload carrying the URL, headers (including the bearer credential) and method — never a command-line argument. */
85
+ export function buildCurlConfig(request) {
86
+ const lines = [
87
+ 'silent',
88
+ 'show-error',
89
+ `header = "Authorization: Bearer ${request.jwt}"`,
90
+ 'header = "Accept: application/vnd.github+json"',
91
+ 'header = "X-GitHub-Api-Version: 2022-11-28"',
92
+ 'write-out = "\\n%{http_code}"',
93
+ `url = "${request.url}"`,
94
+ ];
95
+ if (request.method === 'POST') {
96
+ lines.push('request = "POST"');
97
+ }
98
+ return `${lines.join('\n')}\n`;
99
+ }
100
+ /** Composes the sanitized failure shape the issue asks for: `GitHub App <operation> failed for <subject>: <detail>`. */
101
+ export function describeApiFailure(input) {
102
+ return `GitHub App ${input.operation} failed for ${input.subject}: ${redactBearerTokens(input.detail)}`;
103
+ }
104
+ /**
105
+ * Non-echoing detail builder for a non-2xx response — at most GitHub's own
106
+ * `message` field (fixed vocabulary: "Not Found", "Bad credentials", ...),
107
+ * never the raw body, since a body may itself carry a credential under an
108
+ * unexpected key.
109
+ */
110
+ function describeStatus(status, body) {
111
+ try {
112
+ const parsed = JSON.parse(body);
113
+ if (parsed && typeof parsed === 'object' && 'message' in parsed) {
114
+ const message = parsed.message;
115
+ if (typeof message === 'string') {
116
+ return `HTTP ${status} (${redactBearerTokens(message)})`;
117
+ }
118
+ }
119
+ return `HTTP ${status}`;
120
+ }
121
+ catch {
122
+ return `HTTP ${status} (${body.length} bytes, unparseable)`;
123
+ }
124
+ }
125
+ const CURL_ARGS = ['--config', '-'];
126
+ const execCurl = (args, stdinConfig) => execFileSync('curl', [...args], {
127
+ input: stdinConfig,
128
+ encoding: 'utf-8',
129
+ stdio: ['pipe', 'pipe', 'pipe'],
130
+ });
131
+ function isCurlExecError(error) {
132
+ return typeof error === 'object' && error !== null && 'message' in error;
133
+ }
134
+ /** Single chokepoint for every GitHub API call. Never lets a credential-bearing subprocess error escape unsanitized. */
135
+ function requestGitHubApi(request, runCurl) {
136
+ let raw;
137
+ try {
138
+ raw = runCurl(CURL_ARGS, buildCurlConfig(request));
139
+ }
140
+ catch (error) {
141
+ const status = isCurlExecError(error) && typeof error.status === 'number' ? error.status : -1;
142
+ const stderrRaw = isCurlExecError(error) && error.stderr !== undefined
143
+ ? (typeof error.stderr === 'string' ? error.stderr : error.stderr.toString('utf-8'))
144
+ : '';
145
+ throw new Error(describeApiFailure({
146
+ operation: request.operation,
147
+ subject: request.subject,
148
+ detail: `curl exit ${status} (${redactBearerTokens(stderrRaw.trim())})`,
149
+ }));
150
+ }
151
+ const cut = raw.lastIndexOf('\n');
152
+ if (cut < 0) {
153
+ throw new Error(describeApiFailure({
154
+ operation: request.operation,
155
+ subject: request.subject,
156
+ detail: 'no HTTP status returned',
157
+ }));
158
+ }
159
+ return { status: Number(raw.slice(cut + 1).trim()), body: raw.slice(0, cut) };
160
+ }
161
+ /** Parses a response body, rethrowing a sanitized failure on malformed JSON. */
162
+ function parseJsonBody(body, context) {
163
+ try {
164
+ return JSON.parse(body);
165
+ }
166
+ catch {
167
+ throw new Error(describeApiFailure({
168
+ operation: context.operation,
169
+ subject: context.subject,
170
+ detail: `HTTP ${context.status} — unparseable response body (${body.length} bytes)`,
171
+ }));
172
+ }
173
+ }
174
+ // Private mint internals
175
+ function createAppJWT(appId, privateKeyPath) {
176
+ const privateKey = fs.readFileSync(privateKeyPath, 'utf-8');
177
+ const now = Math.floor(Date.now() / 1000);
178
+ const header = { alg: 'RS256', typ: 'JWT' };
179
+ const payload = { iat: now - 60, exp: now + 600, iss: appId };
180
+ const encode = (obj) => Buffer.from(JSON.stringify(obj)).toString('base64url');
181
+ const headerB64 = encode(header);
182
+ const payloadB64 = encode(payload);
183
+ const signingInput = `${headerB64}.${payloadB64}`;
184
+ const signature = crypto
185
+ .createSign('RSA-SHA256')
186
+ .update(signingInput)
187
+ .sign(privateKey, 'base64url');
188
+ return `${signingInput}.${signature}`;
189
+ }
190
+ function resolveInstallationId(jwt, owner, repo, baseUrl, runCurl) {
191
+ const key = `${owner}/${repo}`;
192
+ const cached = installationIdCache.get(key);
193
+ if (cached)
194
+ return cached;
195
+ const { status, body } = requestGitHubApi({
196
+ jwt,
197
+ url: `${baseUrl}/repos/${owner}/${repo}/installation`,
198
+ method: 'GET',
199
+ operation: 'installation lookup',
200
+ subject: key,
201
+ }, runCurl);
202
+ if (status < 200 || status >= 300) {
203
+ throw new Error(describeApiFailure({ operation: 'installation lookup', subject: key, detail: describeStatus(status, body) }));
204
+ }
205
+ const parsed = parseJsonBody(body, { operation: 'installation lookup', subject: key, status });
206
+ if (!parsed.id) {
207
+ throw new Error(describeApiFailure({
208
+ operation: 'installation lookup',
209
+ subject: key,
210
+ detail: `HTTP ${status} — response did not contain an installation id (${body.length} bytes)`,
211
+ }));
212
+ }
213
+ const id = String(parsed.id);
214
+ installationIdCache.set(key, id);
215
+ return id;
216
+ }
217
+ function fetchInstallationToken(jwt, installationId, baseUrl, runCurl) {
218
+ const subject = `installation ${installationId}`;
219
+ const { status, body } = requestGitHubApi({
220
+ jwt,
221
+ url: `${baseUrl}/app/installations/${installationId}/access_tokens`,
222
+ method: 'POST',
223
+ operation: 'token exchange',
224
+ subject,
225
+ }, runCurl);
226
+ if (status < 200 || status >= 300) {
227
+ throw new Error(describeApiFailure({ operation: 'token exchange', subject, detail: describeStatus(status, body) }));
228
+ }
229
+ const parsed = parseJsonBody(body, { operation: 'token exchange', subject, status });
230
+ if (!parsed.token) {
231
+ throw new Error(describeApiFailure({
232
+ operation: 'token exchange',
233
+ subject,
234
+ detail: `HTTP ${status} — response did not contain an installation token (${body.length} bytes)`,
235
+ }));
236
+ }
237
+ return {
238
+ token: parsed.token,
239
+ expiresAt: new Date(parsed.expires_at ?? ''),
240
+ installationId,
241
+ };
242
+ }
243
+ //# sourceMappingURL=appAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appAuth.js","sourceRoot":"","sources":["../../../src/providers/github/appAuth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * GitHub clone-URL construction (issue #793, PRD story 14) — the HTTPS→SSH
3
+ * rewrite the core used to apply silently. ADW's wiring layer
4
+ * (`adws/core/targetRepoManager.ts`) calls this before handing the core a
5
+ * clone URL; the core itself clones exactly what it is given.
6
+ */
7
+ /**
8
+ * Converts an HTTPS GitHub clone URL to SSH format.
9
+ * Non-HTTPS URLs (e.g., already SSH, another forge, empty) are returned unchanged.
10
+ */
11
+ export declare function convertToSshUrl(cloneUrl: string): string;
12
+ //# sourceMappingURL=cloneUrl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloneUrl.d.ts","sourceRoot":"","sources":["../../../src/providers/github/cloneUrl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKxD"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * GitHub clone-URL construction (issue #793, PRD story 14) — the HTTPS→SSH
3
+ * rewrite the core used to apply silently. ADW's wiring layer
4
+ * (`adws/core/targetRepoManager.ts`) calls this before handing the core a
5
+ * clone URL; the core itself clones exactly what it is given.
6
+ */
7
+ import { parseGitHubRemoteUrl } from './githubIdentity.js';
8
+ /**
9
+ * Converts an HTTPS GitHub clone URL to SSH format.
10
+ * Non-HTTPS URLs (e.g., already SSH, another forge, empty) are returned unchanged.
11
+ */
12
+ export function convertToSshUrl(cloneUrl) {
13
+ if (!cloneUrl.startsWith('https://github.com/'))
14
+ return cloneUrl;
15
+ const info = parseGitHubRemoteUrl(cloneUrl);
16
+ if (!info)
17
+ return cloneUrl;
18
+ return `git@github.com:${info.owner}/${info.repo}.git`;
19
+ }
20
+ //# sourceMappingURL=cloneUrl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cloneUrl.js","sourceRoot":"","sources":["../../../src/providers/github/cloneUrl.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,qBAAqB,CAAC;QAAE,OAAO,QAAQ,CAAC;IACjE,MAAM,IAAI,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,CAAC;IAC3B,OAAO,kBAAkB,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,MAAM,CAAC;AACzD,CAAC"}
@@ -0,0 +1,22 @@
1
+ export declare function graphQLInputCmd(): string;
2
+ export declare function graphQLCmd(query: string, variables?: Record<string, string | number>): string;
3
+ export declare function projectQueryCmd(owner: string, repo: string): string;
4
+ export declare function itemQueryCmd(owner: string, repo: string, issueNumber: number): string;
5
+ export declare function fieldQueryCmd(projectId: string): string;
6
+ export declare function moveStatusCmd(projectId: string, itemId: string, fieldId: string, optionId: string): string;
7
+ export declare function parseProjectId(result: string): string | null;
8
+ export declare function parseIssueItem(result: string, projectId: string): {
9
+ itemId: string;
10
+ currentStatus: string | null;
11
+ } | null;
12
+ /**
13
+ * Returns:
14
+ * { fieldId, optionId } — proceed with the mutation
15
+ * 'already_at_status' — fuzzy-resolved option name matches current status; no-op
16
+ * null — no matching option found
17
+ */
18
+ export declare function parseStatusField(result: string, targetStatus: string, currentStatus: string | null): {
19
+ fieldId: string;
20
+ optionId: string;
21
+ } | 'already_at_status' | null;
22
+ //# sourceMappingURL=boardCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boardCommands.d.ts","sourceRoot":"","sources":["../../../../src/providers/github/commands/boardCommands.ts"],"names":[],"mappings":"AAYA,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAQ7F;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAErF;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE1G;AAID,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM5D;AAED,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAYzD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GAAG,IAAI,GAC3B;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,mBAAmB,GAAG,IAAI,CAapE"}
@@ -0,0 +1,66 @@
1
+ // GraphQL query strings for Projects V2 board operations — GitHub forge adapter (#792).
2
+ const QUERY_PROJECT = `query($owner:String!,$repo:String!){repository(owner:$owner,name:$repo){projectsV2(first:1){nodes{id}}}}`;
3
+ const QUERY_ITEM = `query($owner:String!,$repo:String!,$number:Int!){repository(owner:$owner,name:$repo){issue(number:$number){projectItems(first:50){nodes{id project{id} fieldValueByName(name:"Status"){...on ProjectV2ItemFieldSingleSelectValue{name}}}}}}}`;
4
+ const QUERY_FIELD = `query($projectId:ID!){node(id:$projectId){...on ProjectV2{field(name:"Status"){...on ProjectV2SingleSelectField{id options{id name}}}}}}`;
5
+ const MUTATION_MOVE = `mutation($projectId:ID!,$itemId:ID!,$fieldId:ID!,$optionId:String!){updateProjectV2ItemFieldValue(input:{projectId:$projectId itemId:$itemId fieldId:$fieldId value:{singleSelectOptionId:$optionId}}){projectV2Item{id}}}`;
6
+ // ── Command builders ───────────────────────────────────────────────────────
7
+ export function graphQLInputCmd() {
8
+ return 'gh api graphql --input -';
9
+ }
10
+ export function graphQLCmd(query, variables) {
11
+ const varArgs = variables
12
+ ? Object.entries(variables)
13
+ .map(([k, v]) => (typeof v === 'number' ? `-F ${k}=${v}` : `-f ${k}='${v}'`))
14
+ .join(' ')
15
+ : '';
16
+ const sep = varArgs ? ' ' : '';
17
+ return `gh api graphql -f query='${query}'${sep}${varArgs}`;
18
+ }
19
+ export function projectQueryCmd(owner, repo) {
20
+ return `gh api graphql -f query='${QUERY_PROJECT}' -f owner='${owner}' -f repo='${repo}'`;
21
+ }
22
+ export function itemQueryCmd(owner, repo, issueNumber) {
23
+ return `gh api graphql -f query='${QUERY_ITEM}' -f owner='${owner}' -f repo='${repo}' -F number=${issueNumber}`;
24
+ }
25
+ export function fieldQueryCmd(projectId) {
26
+ return `gh api graphql -f query='${QUERY_FIELD}' -f projectId='${projectId}'`;
27
+ }
28
+ export function moveStatusCmd(projectId, itemId, fieldId, optionId) {
29
+ return `gh api graphql -f query='${MUTATION_MOVE}' -f projectId='${projectId}' -f itemId='${itemId}' -f fieldId='${fieldId}' -f optionId='${optionId}'`;
30
+ }
31
+ // ── Response parsers ───────────────────────────────────────────────────────
32
+ export function parseProjectId(result) {
33
+ const parsed = JSON.parse(result);
34
+ const nodes = parsed?.data?.repository?.projectsV2?.nodes;
35
+ return (nodes && nodes.length > 0) ? nodes[0].id : null;
36
+ }
37
+ export function parseIssueItem(result, projectId) {
38
+ const parsed = JSON.parse(result);
39
+ const items = parsed?.data?.repository?.issue?.projectItems?.nodes ?? [];
40
+ const match = items.find((item) => item.project.id === projectId);
41
+ if (!match)
42
+ return null;
43
+ return { itemId: match.id, currentStatus: match.fieldValueByName?.name ?? null };
44
+ }
45
+ /**
46
+ * Returns:
47
+ * { fieldId, optionId } — proceed with the mutation
48
+ * 'already_at_status' — fuzzy-resolved option name matches current status; no-op
49
+ * null — no matching option found
50
+ */
51
+ export function parseStatusField(result, targetStatus, currentStatus) {
52
+ const parsed = JSON.parse(result);
53
+ const field = parsed?.data?.node?.field;
54
+ if (!field)
55
+ return null;
56
+ const target = targetStatus.toLowerCase();
57
+ const exact = field.options.find((o) => o.name.toLowerCase() === target);
58
+ const fuzzy = field.options.find((o) => o.name.toLowerCase().includes(target));
59
+ const matched = exact ?? fuzzy ?? null;
60
+ if (!matched)
61
+ return null;
62
+ if (currentStatus?.toLowerCase() === matched.name.toLowerCase())
63
+ return 'already_at_status';
64
+ return { fieldId: field.id, optionId: matched.id };
65
+ }
66
+ //# sourceMappingURL=boardCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boardCommands.js","sourceRoot":"","sources":["../../../../src/providers/github/commands/boardCommands.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ export interface ListOpenIssuesOptions {
2
+ readonly fields: readonly string[];
3
+ readonly search?: string;
4
+ readonly limit?: number;
5
+ readonly state?: 'open' | 'closed' | 'all';
6
+ }
7
+ export declare function listOpenIssuesCmd(owner: string, repo: string, opts: ListOpenIssuesOptions): string;
8
+ export declare function issueCommentsCmd(owner: string, repo: string, issueNumber: number): string;
9
+ export declare function fetchIssueCmd(owner: string, repo: string, issueNumber: number): string;
10
+ export declare function commentOnIssueCmd(owner: string, repo: string, issueNumber: number): string;
11
+ export declare function issueStateCmd(owner: string, repo: string, issueNumber: number): string;
12
+ export declare function closeIssueCmd(owner: string, repo: string, issueNumber: number): string;
13
+ export declare function issueTitleCmd(owner: string, repo: string, issueNumber: number): string;
14
+ export declare function fetchIssueCommentsCmd(owner: string, repo: string, issueNumber: number): string;
15
+ export declare function issueHasLabelCmd(owner: string, repo: string, issueNumber: number): string;
16
+ export declare function addIssueLabelCmd(owner: string, repo: string, issueNumber: number, labelName: string): string;
17
+ export declare function createIssueCmd(owner: string, repo: string, title: string): string;
18
+ export declare function updateIssueBodyCmd(owner: string, repo: string, issueNumber: number): string;
19
+ export declare function findOpenUpgradeIssueCmd(owner: string, repo: string): string;
20
+ export declare function deleteIssueCommentCmd(owner: string, repo: string, commentId: number): string;
21
+ //# sourceMappingURL=issueCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issueCommands.d.ts","sourceRoot":"","sources":["../../../../src/providers/github/commands/issueCommands.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CAC5C;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,GAAG,MAAM,CAKlG;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE1F;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEtF;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE9F;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5G;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAE3F;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE3E;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5F"}
@@ -0,0 +1,50 @@
1
+ // gh CLI command strings for issue read/write operations — GitHub forge adapter (#792).
2
+ const ISSUE_FIELDS = 'number,title,body,state,author,assignees,labels,milestone,comments,createdAt,updatedAt,closedAt,url';
3
+ export function listOpenIssuesCmd(owner, repo, opts) {
4
+ let cmd = `gh issue list --repo ${owner}/${repo} --state ${opts.state ?? 'open'} --json ${opts.fields.join(',')}`;
5
+ if (opts.search !== undefined)
6
+ cmd += ` --search "${opts.search}"`;
7
+ if (opts.limit !== undefined)
8
+ cmd += ` --limit ${opts.limit}`;
9
+ return cmd;
10
+ }
11
+ export function issueCommentsCmd(owner, repo, issueNumber) {
12
+ return `gh issue view ${issueNumber} --repo ${owner}/${repo} --json comments --jq '.comments'`;
13
+ }
14
+ export function fetchIssueCmd(owner, repo, issueNumber) {
15
+ return `gh issue view ${issueNumber} --repo ${owner}/${repo} --json ${ISSUE_FIELDS}`;
16
+ }
17
+ export function commentOnIssueCmd(owner, repo, issueNumber) {
18
+ return `gh issue comment ${issueNumber} --repo ${owner}/${repo} --body-file -`;
19
+ }
20
+ export function issueStateCmd(owner, repo, issueNumber) {
21
+ return `gh issue view ${issueNumber} --repo ${owner}/${repo} --json state`;
22
+ }
23
+ export function closeIssueCmd(owner, repo, issueNumber) {
24
+ return `gh issue close ${issueNumber} --repo ${owner}/${repo}`;
25
+ }
26
+ export function issueTitleCmd(owner, repo, issueNumber) {
27
+ return `gh issue view ${issueNumber} --repo ${owner}/${repo} --json title`;
28
+ }
29
+ export function fetchIssueCommentsCmd(owner, repo, issueNumber) {
30
+ return `gh api repos/${owner}/${repo}/issues/${issueNumber}/comments --paginate`;
31
+ }
32
+ export function issueHasLabelCmd(owner, repo, issueNumber) {
33
+ return `gh issue view ${issueNumber} --repo ${owner}/${repo} --json labels`;
34
+ }
35
+ export function addIssueLabelCmd(owner, repo, issueNumber, labelName) {
36
+ return `gh issue edit ${issueNumber} --repo ${owner}/${repo} --add-label ${labelName}`;
37
+ }
38
+ export function createIssueCmd(owner, repo, title) {
39
+ return `gh issue create --repo ${owner}/${repo} --title '${title}' --body-file -`;
40
+ }
41
+ export function updateIssueBodyCmd(owner, repo, issueNumber) {
42
+ return `gh issue edit ${issueNumber} --repo ${owner}/${repo} --body-file -`;
43
+ }
44
+ export function findOpenUpgradeIssueCmd(owner, repo) {
45
+ return `gh issue list --repo ${owner}/${repo} --label 'adw:upgrade' --state open --json number --limit 1`;
46
+ }
47
+ export function deleteIssueCommentCmd(owner, repo, commentId) {
48
+ return `gh api -X DELETE repos/${owner}/${repo}/issues/comments/${commentId}`;
49
+ }
50
+ //# sourceMappingURL=issueCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"issueCommands.js","sourceRoot":"","sources":["../../../../src/providers/github/commands/issueCommands.ts"],"names":[],"mappings":"AAAA,wFAAwF;AAExF,MAAM,YAAY,GAChB,qGAAqG,CAAC;AASxG,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,IAAY,EAAE,IAA2B;IACxF,IAAI,GAAG,GAAG,wBAAwB,KAAK,IAAI,IAAI,YAAY,IAAI,CAAC,KAAK,IAAI,MAAM,WAAW,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IAClH,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,GAAG,IAAI,cAAc,IAAI,CAAC,MAAM,GAAG,CAAC;IACnE,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,GAAG,IAAI,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC;IAC9D,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,IAAY,EAAE,WAAmB;IAC/E,OAAO,iBAAiB,WAAW,WAAW,KAAK,IAAI,IAAI,mCAAmC,CAAC;AACjG,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,IAAY,EAAE,WAAmB;IAC5E,OAAO,iBAAiB,WAAW,WAAW,KAAK,IAAI,IAAI,WAAW,YAAY,EAAE,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,IAAY,EAAE,WAAmB;IAChF,OAAO,oBAAoB,WAAW,WAAW,KAAK,IAAI,IAAI,gBAAgB,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,IAAY,EAAE,WAAmB;IAC5E,OAAO,iBAAiB,WAAW,WAAW,KAAK,IAAI,IAAI,eAAe,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,IAAY,EAAE,WAAmB;IAC5E,OAAO,kBAAkB,WAAW,WAAW,KAAK,IAAI,IAAI,EAAE,CAAC;AACjE,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,IAAY,EAAE,WAAmB;IAC5E,OAAO,iBAAiB,WAAW,WAAW,KAAK,IAAI,IAAI,eAAe,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,IAAY,EAAE,WAAmB;IACpF,OAAO,gBAAgB,KAAK,IAAI,IAAI,WAAW,WAAW,sBAAsB,CAAC;AACnF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,IAAY,EAAE,WAAmB;IAC/E,OAAO,iBAAiB,WAAW,WAAW,KAAK,IAAI,IAAI,gBAAgB,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,IAAY,EAAE,WAAmB,EAAE,SAAiB;IAClG,OAAO,iBAAiB,WAAW,WAAW,KAAK,IAAI,IAAI,gBAAgB,SAAS,EAAE,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,IAAY,EAAE,KAAa;IACvE,OAAO,0BAA0B,KAAK,IAAI,IAAI,aAAa,KAAK,iBAAiB,CAAC;AACpF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,IAAY,EAAE,WAAmB;IACjF,OAAO,iBAAiB,WAAW,WAAW,KAAK,IAAI,IAAI,gBAAgB,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,KAAa,EAAE,IAAY;IACjE,OAAO,wBAAwB,KAAK,IAAI,IAAI,6DAA6D,CAAC;AAC5G,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAa,EAAE,IAAY,EAAE,SAAiB;IAClF,OAAO,0BAA0B,KAAK,IAAI,IAAI,oBAAoB,SAAS,EAAE,CAAC;AAChF,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function createLabelCmd(owner: string, repo: string, name: string, color: string, description: string): string;
2
+ export declare function applyLabelCmd(owner: string, repo: string, issueNumber: number, labelName: string): string;
3
+ //# sourceMappingURL=labelCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labelCommands.d.ts","sourceRoot":"","sources":["../../../../src/providers/github/commands/labelCommands.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAEpH;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAEzG"}
@@ -0,0 +1,8 @@
1
+ // gh CLI command strings for label create/apply operations — GitHub forge adapter (#792).
2
+ export function createLabelCmd(owner, repo, name, color, description) {
3
+ return `gh label create '${name}' --repo ${owner}/${repo} --color ${color} --description '${description}' --force`;
4
+ }
5
+ export function applyLabelCmd(owner, repo, issueNumber, labelName) {
6
+ return `gh issue edit ${issueNumber} --repo ${owner}/${repo} --add-label '${labelName}'`;
7
+ }
8
+ //# sourceMappingURL=labelCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labelCommands.js","sourceRoot":"","sources":["../../../../src/providers/github/commands/labelCommands.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,IAAY,EAAE,IAAY,EAAE,KAAa,EAAE,WAAmB;IAC1G,OAAO,oBAAoB,IAAI,YAAY,KAAK,IAAI,IAAI,YAAY,KAAK,mBAAmB,WAAW,WAAW,CAAC;AACrH,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa,EAAE,IAAY,EAAE,WAAmB,EAAE,SAAiB;IAC/F,OAAO,iBAAiB,WAAW,WAAW,KAAK,IAAI,IAAI,iBAAiB,SAAS,GAAG,CAAC;AAC3F,CAAC"}
@@ -0,0 +1,14 @@
1
+ export declare function findPRByBranchCmd(owner: string, repo: string, branchName: string): string;
2
+ export declare function fetchPRDetailsCmd(owner: string, repo: string, prNumber: number): string;
3
+ export declare function fetchPRReviewsCmd(owner: string, repo: string, prNumber: number): string;
4
+ export declare function fetchPRReviewCommentsCmd(owner: string, repo: string, prNumber: number): string;
5
+ export declare function commentOnPRCmd(owner: string, repo: string, prNumber: number): string;
6
+ export declare function mergePRCmd(owner: string, repo: string, prNumber: number): string;
7
+ export declare function approvePRCmd(owner: string, repo: string, prNumber: number): string;
8
+ export declare function prApprovalStateCmd(owner: string, repo: string, prNumber: number): string;
9
+ export declare function fetchPRListCmd(owner: string, repo: string): string;
10
+ export declare function fetchAllPRsCmd(owner: string, repo: string): string;
11
+ export declare function prChangedFilesCmd(owner: string, repo: string, prNumber: number): string;
12
+ export declare function createPRCmd(owner: string, repo: string, title: string, headBranch: string, baseBranch?: string, labels?: readonly string[]): string;
13
+ export declare function fetchMergedPRsCmd(owner: string, repo: string, limit?: number): string;
14
+ //# sourceMappingURL=prCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prCommands.d.ts","sourceRoot":"","sources":["../../../../src/providers/github/commands/prCommands.ts"],"names":[],"mappings":"AAEA,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEzF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvF;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE9F;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEpF;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEhF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAExF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEvF;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAOnJ;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,MAAM,CAElF"}
@@ -0,0 +1,46 @@
1
+ // gh CLI command strings for PR list/create/merge/review operations — GitHub forge adapter (#792).
2
+ export function findPRByBranchCmd(owner, repo, branchName) {
3
+ return `gh pr list --repo ${owner}/${repo} --head "${branchName}" --state all --json number,state,headRefName,baseRefName,updatedAt,labels --limit 20`;
4
+ }
5
+ export function fetchPRDetailsCmd(owner, repo, prNumber) {
6
+ return `gh pr view ${prNumber} --repo ${owner}/${repo} --json number,title,body,state,headRefName,baseRefName,url`;
7
+ }
8
+ export function fetchPRReviewsCmd(owner, repo, prNumber) {
9
+ return `gh api repos/${owner}/${repo}/pulls/${prNumber}/reviews --paginate`;
10
+ }
11
+ export function fetchPRReviewCommentsCmd(owner, repo, prNumber) {
12
+ return `gh api repos/${owner}/${repo}/pulls/${prNumber}/comments --paginate`;
13
+ }
14
+ export function commentOnPRCmd(owner, repo, prNumber) {
15
+ return `gh pr comment ${prNumber} --repo ${owner}/${repo} --body-file -`;
16
+ }
17
+ export function mergePRCmd(owner, repo, prNumber) {
18
+ return `gh pr merge ${prNumber} --merge --repo ${owner}/${repo}`;
19
+ }
20
+ export function approvePRCmd(owner, repo, prNumber) {
21
+ return `gh pr review ${prNumber} --approve --repo ${owner}/${repo}`;
22
+ }
23
+ export function prApprovalStateCmd(owner, repo, prNumber) {
24
+ return `gh pr view ${prNumber} --repo ${owner}/${repo} --json reviewDecision,reviews`;
25
+ }
26
+ export function fetchPRListCmd(owner, repo) {
27
+ return `gh pr list --repo ${owner}/${repo} --state open --json number,headRefName,updatedAt`;
28
+ }
29
+ export function fetchAllPRsCmd(owner, repo) {
30
+ return `gh pr list --repo ${owner}/${repo} --state all --json number,body,state,mergedAt --limit 200`;
31
+ }
32
+ export function prChangedFilesCmd(owner, repo, prNumber) {
33
+ return `gh pr view ${prNumber} --repo ${owner}/${repo} --json files`;
34
+ }
35
+ export function createPRCmd(owner, repo, title, headBranch, baseBranch, labels) {
36
+ const baseArg = baseBranch ? ` --base ${baseBranch}` : '';
37
+ const labelArgs = (labels ?? []).map(l => ` --label '${l}'`).join('');
38
+ // --head must be explicit: gh otherwise infers it from the cwd's current
39
+ // branch (the context base path, on the default branch), producing an
40
+ // empty-diff PR against the wrong head.
41
+ return `gh pr create --repo ${owner}/${repo} --title '${title}' --head "${headBranch}" --body-file -${baseArg}${labelArgs}`;
42
+ }
43
+ export function fetchMergedPRsCmd(owner, repo, limit = 200) {
44
+ return `gh pr list --repo ${owner}/${repo} --state merged --json body,mergedAt --limit ${limit}`;
45
+ }
46
+ //# sourceMappingURL=prCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prCommands.js","sourceRoot":"","sources":["../../../../src/providers/github/commands/prCommands.ts"],"names":[],"mappings":"AAAA,mGAAmG;AAEnG,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,IAAY,EAAE,UAAkB;IAC/E,OAAO,qBAAqB,KAAK,IAAI,IAAI,YAAY,UAAU,uFAAuF,CAAC;AACzJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,IAAY,EAAE,QAAgB;IAC7E,OAAO,cAAc,QAAQ,WAAW,KAAK,IAAI,IAAI,6DAA6D,CAAC;AACrH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,IAAY,EAAE,QAAgB;IAC7E,OAAO,gBAAgB,KAAK,IAAI,IAAI,UAAU,QAAQ,qBAAqB,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,KAAa,EAAE,IAAY,EAAE,QAAgB;IACpF,OAAO,gBAAgB,KAAK,IAAI,IAAI,UAAU,QAAQ,sBAAsB,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,IAAY,EAAE,QAAgB;IAC1E,OAAO,iBAAiB,QAAQ,WAAW,KAAK,IAAI,IAAI,gBAAgB,CAAC;AAC3E,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa,EAAE,IAAY,EAAE,QAAgB;IACtE,OAAO,eAAe,QAAQ,mBAAmB,KAAK,IAAI,IAAI,EAAE,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,IAAY,EAAE,QAAgB;IACxE,OAAO,gBAAgB,QAAQ,qBAAqB,KAAK,IAAI,IAAI,EAAE,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,KAAa,EAAE,IAAY,EAAE,QAAgB;IAC9E,OAAO,cAAc,QAAQ,WAAW,KAAK,IAAI,IAAI,gCAAgC,CAAC;AACxF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,IAAY;IACxD,OAAO,qBAAqB,KAAK,IAAI,IAAI,mDAAmD,CAAC;AAC/F,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa,EAAE,IAAY;IACxD,OAAO,qBAAqB,KAAK,IAAI,IAAI,4DAA4D,CAAC;AACxG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,IAAY,EAAE,QAAgB;IAC7E,OAAO,cAAc,QAAQ,WAAW,KAAK,IAAI,IAAI,eAAe,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAa,EAAE,IAAY,EAAE,KAAa,EAAE,UAAkB,EAAE,UAAmB,EAAE,MAA0B;IACzI,MAAM,OAAO,GAAG,UAAU,CAAC,CAAC,CAAC,WAAW,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1D,MAAM,SAAS,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtE,yEAAyE;IACzE,sEAAsE;IACtE,wCAAwC;IACxC,OAAO,uBAAuB,KAAK,IAAI,IAAI,aAAa,KAAK,aAAa,UAAU,kBAAkB,OAAO,GAAG,SAAS,EAAE,CAAC;AAC9H,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa,EAAE,IAAY,EAAE,KAAK,GAAG,GAAG;IACxE,OAAO,qBAAqB,KAAK,IAAI,IAAI,gDAAgD,KAAK,EAAE,CAAC;AACnG,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function setSecretCmd(owner: string, repo: string, name: string): string;
2
+ //# sourceMappingURL=secretCommands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secretCommands.d.ts","sourceRoot":"","sources":["../../../../src/providers/github/commands/secretCommands.ts"],"names":[],"mappings":"AAEA,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAE9E"}
@@ -0,0 +1,5 @@
1
+ // gh CLI command strings for GitHub Actions secret operations — GitHub forge adapter (#792).
2
+ export function setSecretCmd(owner, repo, name) {
3
+ return `gh secret set ${name} --repo ${owner}/${repo} --body -`;
4
+ }
5
+ //# sourceMappingURL=secretCommands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secretCommands.js","sourceRoot":"","sources":["../../../../src/providers/github/commands/secretCommands.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAE7F,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,IAAY,EAAE,IAAY;IACpE,OAAO,iBAAiB,IAAI,WAAW,KAAK,IAAI,IAAI,WAAW,CAAC;AAClE,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Case-insensitive owner/repo cross-check shared by the three GitHub port
3
+ * factories — refuses a `GitContext` bound to a different repository than
4
+ * the caller's declared `RepoIdentifier`. Mirrors `sameRepoIdentity` in
5
+ * `adws/core/repoIdentityCrossCheck.ts`, which the adapter cannot import.
6
+ * `platform` is deliberately not compared.
7
+ */
8
+ import type { GitContext } from '../../git/index.js';
9
+ import type { RepoIdentifier } from '../types.js';
10
+ export declare function assertContextBoundTo(ctx: Pick<GitContext, 'owner' | 'repo'>, repoId: RepoIdentifier, factoryName: string): void;
11
+ //# sourceMappingURL=contextBinding.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextBinding.d.ts","sourceRoot":"","sources":["../../../src/providers/github/contextBinding.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,MAAM,CAAC,EACvC,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,MAAM,GAClB,IAAI,CAQN"}