@generacy-ai/generacy 0.3.4 → 0.5.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 (247) hide show
  1. package/README.md +153 -0
  2. package/dist/cli/commands/cluster/scaffolder.d.ts.map +1 -1
  3. package/dist/cli/commands/cluster/scaffolder.js +2 -0
  4. package/dist/cli/commands/cluster/scaffolder.js.map +1 -1
  5. package/dist/cli/commands/cockpit/advance.d.ts +42 -0
  6. package/dist/cli/commands/cockpit/advance.d.ts.map +1 -0
  7. package/dist/cli/commands/cockpit/advance.js +136 -0
  8. package/dist/cli/commands/cockpit/advance.js.map +1 -0
  9. package/dist/cli/commands/cockpit/clarification-comment-finder.d.ts +13 -0
  10. package/dist/cli/commands/cockpit/clarification-comment-finder.d.ts.map +1 -0
  11. package/dist/cli/commands/cockpit/clarification-comment-finder.js +31 -0
  12. package/dist/cli/commands/cockpit/clarification-comment-finder.js.map +1 -0
  13. package/dist/cli/commands/cockpit/code-references.d.ts +27 -0
  14. package/dist/cli/commands/cockpit/code-references.d.ts.map +1 -0
  15. package/dist/cli/commands/cockpit/code-references.js +48 -0
  16. package/dist/cli/commands/cockpit/code-references.js.map +1 -0
  17. package/dist/cli/commands/cockpit/context.d.ts +90 -0
  18. package/dist/cli/commands/cockpit/context.d.ts.map +1 -0
  19. package/dist/cli/commands/cockpit/context.js +280 -0
  20. package/dist/cli/commands/cockpit/context.js.map +1 -0
  21. package/dist/cli/commands/cockpit/exit.d.ts +12 -0
  22. package/dist/cli/commands/cockpit/exit.d.ts.map +1 -0
  23. package/dist/cli/commands/cockpit/exit.js +18 -0
  24. package/dist/cli/commands/cockpit/exit.js.map +1 -0
  25. package/dist/cli/commands/cockpit/gate-vocabulary.d.ts +48 -0
  26. package/dist/cli/commands/cockpit/gate-vocabulary.d.ts.map +1 -0
  27. package/dist/cli/commands/cockpit/gate-vocabulary.js +96 -0
  28. package/dist/cli/commands/cockpit/gate-vocabulary.js.map +1 -0
  29. package/dist/cli/commands/cockpit/index.d.ts +20 -0
  30. package/dist/cli/commands/cockpit/index.d.ts.map +1 -0
  31. package/dist/cli/commands/cockpit/index.js +42 -0
  32. package/dist/cli/commands/cockpit/index.js.map +1 -0
  33. package/dist/cli/commands/cockpit/manual-advance-marker.d.ts +18 -0
  34. package/dist/cli/commands/cockpit/manual-advance-marker.d.ts.map +1 -0
  35. package/dist/cli/commands/cockpit/manual-advance-marker.js +43 -0
  36. package/dist/cli/commands/cockpit/manual-advance-marker.js.map +1 -0
  37. package/dist/cli/commands/cockpit/mcp/errors.d.ts +54 -0
  38. package/dist/cli/commands/cockpit/mcp/errors.d.ts.map +1 -0
  39. package/dist/cli/commands/cockpit/mcp/errors.js +190 -0
  40. package/dist/cli/commands/cockpit/mcp/errors.js.map +1 -0
  41. package/dist/cli/commands/cockpit/mcp/event-bus-registry.d.ts +59 -0
  42. package/dist/cli/commands/cockpit/mcp/event-bus-registry.d.ts.map +1 -0
  43. package/dist/cli/commands/cockpit/mcp/event-bus-registry.js +305 -0
  44. package/dist/cli/commands/cockpit/mcp/event-bus-registry.js.map +1 -0
  45. package/dist/cli/commands/cockpit/mcp/event-bus.d.ts +82 -0
  46. package/dist/cli/commands/cockpit/mcp/event-bus.d.ts.map +1 -0
  47. package/dist/cli/commands/cockpit/mcp/event-bus.js +230 -0
  48. package/dist/cli/commands/cockpit/mcp/event-bus.js.map +1 -0
  49. package/dist/cli/commands/cockpit/mcp/index.d.ts +17 -0
  50. package/dist/cli/commands/cockpit/mcp/index.d.ts.map +1 -0
  51. package/dist/cli/commands/cockpit/mcp/index.js +37 -0
  52. package/dist/cli/commands/cockpit/mcp/index.js.map +1 -0
  53. package/dist/cli/commands/cockpit/mcp/ref-input.d.ts +52 -0
  54. package/dist/cli/commands/cockpit/mcp/ref-input.d.ts.map +1 -0
  55. package/dist/cli/commands/cockpit/mcp/ref-input.js +132 -0
  56. package/dist/cli/commands/cockpit/mcp/ref-input.js.map +1 -0
  57. package/dist/cli/commands/cockpit/mcp/schemas.d.ts +422 -0
  58. package/dist/cli/commands/cockpit/mcp/schemas.d.ts.map +1 -0
  59. package/dist/cli/commands/cockpit/mcp/schemas.js +97 -0
  60. package/dist/cli/commands/cockpit/mcp/schemas.js.map +1 -0
  61. package/dist/cli/commands/cockpit/mcp/server.d.ts +17 -0
  62. package/dist/cli/commands/cockpit/mcp/server.d.ts.map +1 -0
  63. package/dist/cli/commands/cockpit/mcp/server.js +72 -0
  64. package/dist/cli/commands/cockpit/mcp/server.js.map +1 -0
  65. package/dist/cli/commands/cockpit/mcp/tools/cockpit_advance.d.ts +42 -0
  66. package/dist/cli/commands/cockpit/mcp/tools/cockpit_advance.d.ts.map +1 -0
  67. package/dist/cli/commands/cockpit/mcp/tools/cockpit_advance.js +73 -0
  68. package/dist/cli/commands/cockpit/mcp/tools/cockpit_advance.js.map +1 -0
  69. package/dist/cli/commands/cockpit/mcp/tools/cockpit_await_events.d.ts +34 -0
  70. package/dist/cli/commands/cockpit/mcp/tools/cockpit_await_events.d.ts.map +1 -0
  71. package/dist/cli/commands/cockpit/mcp/tools/cockpit_await_events.js +115 -0
  72. package/dist/cli/commands/cockpit/mcp/tools/cockpit_await_events.js.map +1 -0
  73. package/dist/cli/commands/cockpit/mcp/tools/cockpit_context.d.ts +21 -0
  74. package/dist/cli/commands/cockpit/mcp/tools/cockpit_context.d.ts.map +1 -0
  75. package/dist/cli/commands/cockpit/mcp/tools/cockpit_context.js +35 -0
  76. package/dist/cli/commands/cockpit/mcp/tools/cockpit_context.js.map +1 -0
  77. package/dist/cli/commands/cockpit/mcp/tools/cockpit_merge.d.ts +43 -0
  78. package/dist/cli/commands/cockpit/mcp/tools/cockpit_merge.d.ts.map +1 -0
  79. package/dist/cli/commands/cockpit/mcp/tools/cockpit_merge.js +99 -0
  80. package/dist/cli/commands/cockpit/mcp/tools/cockpit_merge.js.map +1 -0
  81. package/dist/cli/commands/cockpit/mcp/tools/cockpit_queue.d.ts +59 -0
  82. package/dist/cli/commands/cockpit/mcp/tools/cockpit_queue.d.ts.map +1 -0
  83. package/dist/cli/commands/cockpit/mcp/tools/cockpit_queue.js +106 -0
  84. package/dist/cli/commands/cockpit/mcp/tools/cockpit_queue.js.map +1 -0
  85. package/dist/cli/commands/cockpit/mcp/tools/cockpit_resume.d.ts +38 -0
  86. package/dist/cli/commands/cockpit/mcp/tools/cockpit_resume.d.ts.map +1 -0
  87. package/dist/cli/commands/cockpit/mcp/tools/cockpit_resume.js +79 -0
  88. package/dist/cli/commands/cockpit/mcp/tools/cockpit_resume.js.map +1 -0
  89. package/dist/cli/commands/cockpit/mcp/tools/cockpit_scope_add.d.ts +31 -0
  90. package/dist/cli/commands/cockpit/mcp/tools/cockpit_scope_add.d.ts.map +1 -0
  91. package/dist/cli/commands/cockpit/mcp/tools/cockpit_scope_add.js +81 -0
  92. package/dist/cli/commands/cockpit/mcp/tools/cockpit_scope_add.js.map +1 -0
  93. package/dist/cli/commands/cockpit/mcp/tools/cockpit_scope_remove.d.ts +30 -0
  94. package/dist/cli/commands/cockpit/mcp/tools/cockpit_scope_remove.d.ts.map +1 -0
  95. package/dist/cli/commands/cockpit/mcp/tools/cockpit_scope_remove.js +80 -0
  96. package/dist/cli/commands/cockpit/mcp/tools/cockpit_scope_remove.js.map +1 -0
  97. package/dist/cli/commands/cockpit/mcp/tools/cockpit_status.d.ts +21 -0
  98. package/dist/cli/commands/cockpit/mcp/tools/cockpit_status.d.ts.map +1 -0
  99. package/dist/cli/commands/cockpit/mcp/tools/cockpit_status.js +59 -0
  100. package/dist/cli/commands/cockpit/mcp/tools/cockpit_status.js.map +1 -0
  101. package/dist/cli/commands/cockpit/merge.d.ts +42 -0
  102. package/dist/cli/commands/cockpit/merge.d.ts.map +1 -0
  103. package/dist/cli/commands/cockpit/merge.js +360 -0
  104. package/dist/cli/commands/cockpit/merge.js.map +1 -0
  105. package/dist/cli/commands/cockpit/plan-dependency-extractor.d.ts +30 -0
  106. package/dist/cli/commands/cockpit/plan-dependency-extractor.d.ts.map +1 -0
  107. package/dist/cli/commands/cockpit/plan-dependency-extractor.js +135 -0
  108. package/dist/cli/commands/cockpit/plan-dependency-extractor.js.map +1 -0
  109. package/dist/cli/commands/cockpit/queue.d.ts +100 -0
  110. package/dist/cli/commands/cockpit/queue.d.ts.map +1 -0
  111. package/dist/cli/commands/cockpit/queue.js +551 -0
  112. package/dist/cli/commands/cockpit/queue.js.map +1 -0
  113. package/dist/cli/commands/cockpit/resolver.d.ts +70 -0
  114. package/dist/cli/commands/cockpit/resolver.d.ts.map +1 -0
  115. package/dist/cli/commands/cockpit/resolver.js +117 -0
  116. package/dist/cli/commands/cockpit/resolver.js.map +1 -0
  117. package/dist/cli/commands/cockpit/resume.d.ts +38 -0
  118. package/dist/cli/commands/cockpit/resume.d.ts.map +1 -0
  119. package/dist/cli/commands/cockpit/resume.js +167 -0
  120. package/dist/cli/commands/cockpit/resume.js.map +1 -0
  121. package/dist/cli/commands/cockpit/scope/errors.d.ts +21 -0
  122. package/dist/cli/commands/cockpit/scope/errors.d.ts.map +1 -0
  123. package/dist/cli/commands/cockpit/scope/errors.js +17 -0
  124. package/dist/cli/commands/cockpit/scope/errors.js.map +1 -0
  125. package/dist/cli/commands/cockpit/scope/retry.d.ts +24 -0
  126. package/dist/cli/commands/cockpit/scope/retry.d.ts.map +1 -0
  127. package/dist/cli/commands/cockpit/scope/retry.js +52 -0
  128. package/dist/cli/commands/cockpit/scope/retry.js.map +1 -0
  129. package/dist/cli/commands/cockpit/scope/writer.d.ts +21 -0
  130. package/dist/cli/commands/cockpit/scope/writer.d.ts.map +1 -0
  131. package/dist/cli/commands/cockpit/scope/writer.js +141 -0
  132. package/dist/cli/commands/cockpit/scope/writer.js.map +1 -0
  133. package/dist/cli/commands/cockpit/scope.d.ts +22 -0
  134. package/dist/cli/commands/cockpit/scope.d.ts.map +1 -0
  135. package/dist/cli/commands/cockpit/scope.js +110 -0
  136. package/dist/cli/commands/cockpit/scope.js.map +1 -0
  137. package/dist/cli/commands/cockpit/shared/classify-issue.d.ts +12 -0
  138. package/dist/cli/commands/cockpit/shared/classify-issue.d.ts.map +1 -0
  139. package/dist/cli/commands/cockpit/shared/classify-issue.js +10 -0
  140. package/dist/cli/commands/cockpit/shared/classify-issue.js.map +1 -0
  141. package/dist/cli/commands/cockpit/shared/failing-check-json.d.ts +53 -0
  142. package/dist/cli/commands/cockpit/shared/failing-check-json.d.ts.map +1 -0
  143. package/dist/cli/commands/cockpit/shared/failing-check-json.js +170 -0
  144. package/dist/cli/commands/cockpit/shared/failing-check-json.js.map +1 -0
  145. package/dist/cli/commands/cockpit/shared/identity.d.ts +54 -0
  146. package/dist/cli/commands/cockpit/shared/identity.d.ts.map +1 -0
  147. package/dist/cli/commands/cockpit/shared/identity.js +65 -0
  148. package/dist/cli/commands/cockpit/shared/identity.js.map +1 -0
  149. package/dist/cli/commands/cockpit/shared/is-done-snapshot.d.ts +16 -0
  150. package/dist/cli/commands/cockpit/shared/is-done-snapshot.d.ts.map +1 -0
  151. package/dist/cli/commands/cockpit/shared/is-done-snapshot.js +17 -0
  152. package/dist/cli/commands/cockpit/shared/is-done-snapshot.js.map +1 -0
  153. package/dist/cli/commands/cockpit/shared/pagination.d.ts +17 -0
  154. package/dist/cli/commands/cockpit/shared/pagination.d.ts.map +1 -0
  155. package/dist/cli/commands/cockpit/shared/pagination.js +50 -0
  156. package/dist/cli/commands/cockpit/shared/pagination.js.map +1 -0
  157. package/dist/cli/commands/cockpit/shared/pr-link.d.ts +8 -0
  158. package/dist/cli/commands/cockpit/shared/pr-link.d.ts.map +1 -0
  159. package/dist/cli/commands/cockpit/shared/pr-link.js +15 -0
  160. package/dist/cli/commands/cockpit/shared/pr-link.js.map +1 -0
  161. package/dist/cli/commands/cockpit/shared/required-checks.d.ts +17 -0
  162. package/dist/cli/commands/cockpit/shared/required-checks.d.ts.map +1 -0
  163. package/dist/cli/commands/cockpit/shared/required-checks.js +38 -0
  164. package/dist/cli/commands/cockpit/shared/required-checks.js.map +1 -0
  165. package/dist/cli/commands/cockpit/shared/review-context-json.d.ts +29 -0
  166. package/dist/cli/commands/cockpit/shared/review-context-json.d.ts.map +1 -0
  167. package/dist/cli/commands/cockpit/shared/review-context-json.js +28 -0
  168. package/dist/cli/commands/cockpit/shared/review-context-json.js.map +1 -0
  169. package/dist/cli/commands/cockpit/status/color.d.ts +11 -0
  170. package/dist/cli/commands/cockpit/status/color.d.ts.map +1 -0
  171. package/dist/cli/commands/cockpit/status/color.js +33 -0
  172. package/dist/cli/commands/cockpit/status/color.js.map +1 -0
  173. package/dist/cli/commands/cockpit/status/group.d.ts +10 -0
  174. package/dist/cli/commands/cockpit/status/group.d.ts.map +1 -0
  175. package/dist/cli/commands/cockpit/status/group.js +50 -0
  176. package/dist/cli/commands/cockpit/status/group.js.map +1 -0
  177. package/dist/cli/commands/cockpit/status/render-table.d.ts +24 -0
  178. package/dist/cli/commands/cockpit/status/render-table.d.ts.map +1 -0
  179. package/dist/cli/commands/cockpit/status/render-table.js +71 -0
  180. package/dist/cli/commands/cockpit/status/render-table.js.map +1 -0
  181. package/dist/cli/commands/cockpit/status/row.d.ts +18 -0
  182. package/dist/cli/commands/cockpit/status/row.d.ts.map +1 -0
  183. package/dist/cli/commands/cockpit/status/row.js +17 -0
  184. package/dist/cli/commands/cockpit/status/row.js.map +1 -0
  185. package/dist/cli/commands/cockpit/status.d.ts +18 -0
  186. package/dist/cli/commands/cockpit/status.d.ts.map +1 -0
  187. package/dist/cli/commands/cockpit/status.js +153 -0
  188. package/dist/cli/commands/cockpit/status.js.map +1 -0
  189. package/dist/cli/commands/cockpit/watch/actionable.d.ts +15 -0
  190. package/dist/cli/commands/cockpit/watch/actionable.d.ts.map +1 -0
  191. package/dist/cli/commands/cockpit/watch/actionable.js +32 -0
  192. package/dist/cli/commands/cockpit/watch/actionable.js.map +1 -0
  193. package/dist/cli/commands/cockpit/watch/aggregate-emit.d.ts +107 -0
  194. package/dist/cli/commands/cockpit/watch/aggregate-emit.d.ts.map +1 -0
  195. package/dist/cli/commands/cockpit/watch/aggregate-emit.js +41 -0
  196. package/dist/cli/commands/cockpit/watch/aggregate-emit.js.map +1 -0
  197. package/dist/cli/commands/cockpit/watch/aggregate.d.ts +25 -0
  198. package/dist/cli/commands/cockpit/watch/aggregate.d.ts.map +1 -0
  199. package/dist/cli/commands/cockpit/watch/aggregate.js +67 -0
  200. package/dist/cli/commands/cockpit/watch/aggregate.js.map +1 -0
  201. package/dist/cli/commands/cockpit/watch/check-rollup.d.ts +9 -0
  202. package/dist/cli/commands/cockpit/watch/check-rollup.d.ts.map +1 -0
  203. package/dist/cli/commands/cockpit/watch/check-rollup.js +22 -0
  204. package/dist/cli/commands/cockpit/watch/check-rollup.js.map +1 -0
  205. package/dist/cli/commands/cockpit/watch/diff.d.ts +33 -0
  206. package/dist/cli/commands/cockpit/watch/diff.d.ts.map +1 -0
  207. package/dist/cli/commands/cockpit/watch/diff.js +93 -0
  208. package/dist/cli/commands/cockpit/watch/diff.js.map +1 -0
  209. package/dist/cli/commands/cockpit/watch/emit.d.ts +58 -0
  210. package/dist/cli/commands/cockpit/watch/emit.d.ts.map +1 -0
  211. package/dist/cli/commands/cockpit/watch/emit.js +30 -0
  212. package/dist/cli/commands/cockpit/watch/emit.js.map +1 -0
  213. package/dist/cli/commands/cockpit/watch/poll-loop.d.ts +29 -0
  214. package/dist/cli/commands/cockpit/watch/poll-loop.d.ts.map +1 -0
  215. package/dist/cli/commands/cockpit/watch/poll-loop.js +81 -0
  216. package/dist/cli/commands/cockpit/watch/poll-loop.js.map +1 -0
  217. package/dist/cli/commands/cockpit/watch/pr-state.d.ts +17 -0
  218. package/dist/cli/commands/cockpit/watch/pr-state.d.ts.map +1 -0
  219. package/dist/cli/commands/cockpit/watch/pr-state.js +33 -0
  220. package/dist/cli/commands/cockpit/watch/pr-state.js.map +1 -0
  221. package/dist/cli/commands/cockpit/watch/snapshot.d.ts +33 -0
  222. package/dist/cli/commands/cockpit/watch/snapshot.d.ts.map +1 -0
  223. package/dist/cli/commands/cockpit/watch/snapshot.js +30 -0
  224. package/dist/cli/commands/cockpit/watch/snapshot.js.map +1 -0
  225. package/dist/cli/commands/cockpit/watch/stream-event.d.ts +82 -0
  226. package/dist/cli/commands/cockpit/watch/stream-event.d.ts.map +1 -0
  227. package/dist/cli/commands/cockpit/watch/stream-event.js +9 -0
  228. package/dist/cli/commands/cockpit/watch/stream-event.js.map +1 -0
  229. package/dist/cli/commands/cockpit/watch.d.ts +22 -0
  230. package/dist/cli/commands/cockpit/watch.d.ts.map +1 -0
  231. package/dist/cli/commands/cockpit/watch.js +186 -0
  232. package/dist/cli/commands/cockpit/watch.js.map +1 -0
  233. package/dist/cli/commands/setup/build.d.ts.map +1 -1
  234. package/dist/cli/commands/setup/build.js +59 -0
  235. package/dist/cli/commands/setup/build.js.map +1 -1
  236. package/dist/cli/index.d.ts.map +1 -1
  237. package/dist/cli/index.js +2 -0
  238. package/dist/cli/index.js.map +1 -1
  239. package/dist/config/schema.d.ts +788 -0
  240. package/dist/config/schema.d.ts.map +1 -1
  241. package/dist/config/schema.js +12 -1
  242. package/dist/config/schema.js.map +1 -1
  243. package/dist/index.d.ts +2 -0
  244. package/dist/index.d.ts.map +1 -1
  245. package/dist/index.js +2 -0
  246. package/dist/index.js.map +1 -1
  247. package/package.json +12 -6
@@ -0,0 +1,80 @@
1
+ import { normalizeIssueRef } from '../ref-input.js';
2
+ import { wrapToolBoundary } from '../errors.js';
3
+ import { CockpitScopeRemoveInputSchema, } from '../schemas.js';
4
+ import { writeScopeWithRetry } from '../../scope/retry.js';
5
+ import { ScopeContendedError } from '../../scope/errors.js';
6
+ function isScopeNotFoundError(err) {
7
+ const msg = err instanceof Error ? err.message : String(err);
8
+ return /404|not found|no such/i.test(msg);
9
+ }
10
+ export function cockpitScopeRemove(input, deps = {}) {
11
+ return wrapToolBoundary(async () => {
12
+ const parsed = CockpitScopeRemoveInputSchema.safeParse(input);
13
+ if (!parsed.success) {
14
+ return {
15
+ status: 'error',
16
+ class: 'invalid-args',
17
+ detail: parsed.error.issues.map((i) => i.message).join('; '),
18
+ };
19
+ }
20
+ const scopeN = await normalizeIssueRef(parsed.data.scope, {
21
+ expects: 'issue',
22
+ ...(deps.runner != null ? { runner: deps.runner } : {}),
23
+ ...(deps.gh != null ? { gh: deps.gh } : {}),
24
+ });
25
+ if (!scopeN.ok)
26
+ return scopeN.error;
27
+ const refN = await normalizeIssueRef(parsed.data.issue, {
28
+ expects: 'issue',
29
+ ...(deps.runner != null ? { runner: deps.runner } : {}),
30
+ ...(deps.gh != null ? { gh: deps.gh } : {}),
31
+ });
32
+ if (!refN.ok)
33
+ return refN.error;
34
+ const gh = deps.gh ?? scopeN.value.gh;
35
+ const scope = { repo: scopeN.value.ref.nwo, number: scopeN.value.ref.number };
36
+ const ref = { repo: refN.value.ref.nwo, number: refN.value.ref.number };
37
+ try {
38
+ const result = await writeScopeWithRetry({
39
+ gh,
40
+ scope,
41
+ mutation: { kind: 'remove', ref },
42
+ });
43
+ return {
44
+ status: 'ok',
45
+ data: {
46
+ scope: {
47
+ owner: scopeN.value.ref.owner,
48
+ repo: scopeN.value.ref.repo,
49
+ number: scopeN.value.ref.number,
50
+ },
51
+ ref: {
52
+ owner: refN.value.ref.owner,
53
+ repo: refN.value.ref.repo,
54
+ number: refN.value.ref.number,
55
+ },
56
+ alreadyAbsent: result.noop,
57
+ attempts: result.attempts,
58
+ },
59
+ };
60
+ }
61
+ catch (err) {
62
+ if (err instanceof ScopeContendedError) {
63
+ return {
64
+ status: 'error',
65
+ class: 'contended',
66
+ detail: `${err.code} after ${err.attempts} attempts`,
67
+ };
68
+ }
69
+ if (isScopeNotFoundError(err)) {
70
+ return {
71
+ status: 'error',
72
+ class: 'scope-not-found',
73
+ detail: `scope issue ${scope.repo}#${scope.number} not found`,
74
+ };
75
+ }
76
+ throw err;
77
+ }
78
+ });
79
+ }
80
+ //# sourceMappingURL=cockpit_scope_remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cockpit_scope_remove.js","sourceRoot":"","sources":["../../../../../../src/cli/commands/cockpit/mcp/tools/cockpit_scope_remove.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * `cockpit_status` MCP tool handler.
3
+ *
4
+ * Wraps `runStatus({json: true})` with an in-memory stdout sink; parses the
5
+ * single-line JSON envelope the CLI already emits and returns it verbatim
6
+ * as `data`. No stdout ever reaches the MCP transport (which uses stdout
7
+ * for JSON-RPC).
8
+ */
9
+ import type { CommandRunner, GhWrapper } from '@generacy-ai/cockpit';
10
+ import { type ToolResult } from '../errors.js';
11
+ import { type EpicRefInput } from '../schemas.js';
12
+ export interface CockpitStatusInput {
13
+ epic: EpicRefInput;
14
+ }
15
+ export type CockpitStatusData = unknown;
16
+ export interface CockpitStatusDeps {
17
+ runner?: CommandRunner;
18
+ gh?: GhWrapper;
19
+ }
20
+ export declare function cockpitStatus(input: CockpitStatusInput, deps?: CockpitStatusDeps): Promise<ToolResult<CockpitStatusData>>;
21
+ //# sourceMappingURL=cockpit_status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cockpit_status.d.ts","sourceRoot":"","sources":["../../../../../../src/cli/commands/cockpit/mcp/tools/cockpit_status.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGrE,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AACjE,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAEvB,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,YAAY,CAAC;CACpB;AAED,MAAM,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAExC,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,EAAE,CAAC,EAAE,SAAS,CAAC;CAChB;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE,kBAAkB,EACzB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAwDxC"}
@@ -0,0 +1,59 @@
1
+ import { runStatus } from '../../status.js';
2
+ import { normalizeIssueRef } from '../ref-input.js';
3
+ import { wrapToolBoundary } from '../errors.js';
4
+ import { CockpitStatusInputSchema, } from '../schemas.js';
5
+ export function cockpitStatus(input, deps = {}) {
6
+ return wrapToolBoundary(async () => {
7
+ const parsed = CockpitStatusInputSchema.safeParse(input);
8
+ if (!parsed.success) {
9
+ return {
10
+ status: 'error',
11
+ class: 'invalid-args',
12
+ detail: parsed.error.issues.map((i) => i.message).join('; '),
13
+ };
14
+ }
15
+ const normalized = await normalizeIssueRef(parsed.data.epic, {
16
+ expects: 'issue',
17
+ ...(deps.runner != null ? { runner: deps.runner } : {}),
18
+ ...(deps.gh != null ? { gh: deps.gh } : {}),
19
+ });
20
+ if (!normalized.ok)
21
+ return normalized.error;
22
+ const captured = [];
23
+ const stderrLines = [];
24
+ const statusDeps = {
25
+ gh: deps.gh ?? normalized.value.gh,
26
+ ...(deps.runner != null ? { runner: deps.runner } : {}),
27
+ stdout: (line) => captured.push(line),
28
+ stderr: (line) => stderrLines.push(line),
29
+ };
30
+ const epicArg = `${normalized.value.ref.nwo}#${normalized.value.ref.number}`;
31
+ const code = await runStatus(epicArg, { json: true }, statusDeps);
32
+ if (code !== 0) {
33
+ const detail = stderrLines.join('\n') || `runStatus exited ${code}`;
34
+ const cls = code === 2 ? 'invalid-args' : 'transport';
35
+ return { status: 'error', class: cls, detail };
36
+ }
37
+ const line = captured.find((l) => l.trim().length > 0);
38
+ if (line == null) {
39
+ return {
40
+ status: 'error',
41
+ class: 'internal',
42
+ detail: 'runStatus produced no JSON envelope',
43
+ };
44
+ }
45
+ let parsedJson;
46
+ try {
47
+ parsedJson = JSON.parse(line);
48
+ }
49
+ catch (err) {
50
+ return {
51
+ status: 'error',
52
+ class: 'internal',
53
+ detail: `runStatus JSON envelope parse failed: ${err instanceof Error ? err.message : String(err)}`,
54
+ };
55
+ }
56
+ return { status: 'ok', data: parsedJson };
57
+ });
58
+ }
59
+ //# sourceMappingURL=cockpit_status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cockpit_status.js","sourceRoot":"","sources":["../../../../../../src/cli/commands/cockpit/mcp/tools/cockpit_status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { Command } from 'commander';
2
+ import type { Logger } from 'pino';
3
+ import type { GhWrapper } from '@generacy-ai/cockpit';
4
+ export interface RunMergeInput {
5
+ gh: GhWrapper;
6
+ issue: number;
7
+ repo: string;
8
+ logger: Logger;
9
+ }
10
+ export interface RunMergeResult {
11
+ exitCode: 0 | 1 | 2 | 3;
12
+ stdout: string;
13
+ /**
14
+ * #928 — the PR number the CLI operated on. Set on exit-0 (the PR that was
15
+ * merged), on the pr-flag paths (mirrors the caller's `--pr <n>`), and on
16
+ * the resolver's non-terminal red paths where a PR was identified. Absent
17
+ * on `unresolved` / `pr-number` (no PR to name).
18
+ */
19
+ prNumber?: number;
20
+ }
21
+ export interface RunMergeWithExplicitPrInput {
22
+ gh: GhWrapper;
23
+ /** The `<ref>` issue number — authorization source for `completed:validate`. */
24
+ issue: number;
25
+ repo: string;
26
+ /** The operator-supplied `--pr <number>` value. Positive integer, validated. */
27
+ prNumber: number;
28
+ logger: Logger;
29
+ }
30
+ /**
31
+ * FR-005 — Commander parser for `--pr <number>`. See contracts/pr-flag-cli.md §2.
32
+ * Throws `CockpitExit(2)` on any malformed input.
33
+ */
34
+ export declare function parsePrFlag(input: string): number;
35
+ export declare function runMerge(input: RunMergeInput): Promise<RunMergeResult>;
36
+ /**
37
+ * FR-005..FR-008 — `--pr <number>` escape hatch. Skips the tier-1/2/3 resolver
38
+ * chain but keeps every safety precondition. Gate order per contracts/pr-flag-cli.md §3.
39
+ */
40
+ export declare function runMergeWithExplicitPr(input: RunMergeWithExplicitPrInput): Promise<RunMergeResult>;
41
+ export declare function cockpitMergeCommand(): Command;
42
+ //# sourceMappingURL=merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/cockpit/merge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EACV,SAAS,EAIV,MAAM,sBAAsB,CAAC;AA8B9B,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,SAAS,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,2BAA2B;IAC1C,EAAE,EAAE,SAAS,CAAC;IACd,gFAAgF;IAChF,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAgBjD;AAsOD,wBAAsB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC,CA8G5E;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,cAAc,CAAC,CAsEzB;AAED,wBAAgB,mBAAmB,IAAI,OAAO,CA4C7C"}
@@ -0,0 +1,360 @@
1
+ import { Command } from 'commander';
2
+ import { getLogger } from '../../utils/logger.js';
3
+ import { CockpitExit } from './exit.js';
4
+ import { resolveIssueContext } from './resolver.js';
5
+ import { classifyChecks } from './shared/required-checks.js';
6
+ import { buildFailingCheckPayload, serializeFailingCheckJson, } from './shared/failing-check-json.js';
7
+ function toPrCandidates(refs) {
8
+ return refs.map((r) => ({
9
+ number: r.number,
10
+ url: r.url,
11
+ isDraft: r.draft,
12
+ headRefName: r.headRefName,
13
+ }));
14
+ }
15
+ // Workflow labels (`waiting-for:*`, `completed:*`) are issue-scoped per the
16
+ // #807-Q2 label protocol. runMerge reads `completed:validate` from
17
+ // IssueStateResult.labels, never from PullRequestDetail.labels.
18
+ const COMPLETED_VALIDATE_LABEL = 'completed:validate';
19
+ /**
20
+ * FR-005 — Commander parser for `--pr <number>`. See contracts/pr-flag-cli.md §2.
21
+ * Throws `CockpitExit(2)` on any malformed input.
22
+ */
23
+ export function parsePrFlag(input) {
24
+ const trimmed = input.trim();
25
+ if (trimmed.length === 0 || !/^\d+$/.test(trimmed)) {
26
+ throw new CockpitExit(2, `merge: --pr must be a positive integer, got: "${input}"`);
27
+ }
28
+ const n = Number.parseInt(trimmed, 10);
29
+ if (!Number.isSafeInteger(n) || n <= 0) {
30
+ throw new CockpitExit(2, `merge: --pr must be a positive integer, got: "${input}"`);
31
+ }
32
+ return n;
33
+ }
34
+ function parseIssueRef(repo, issue) {
35
+ const [owner, name] = repo.split('/');
36
+ if (!owner || !name) {
37
+ throw new Error(`runMerge: repo must be "owner/name", got: ${repo}`);
38
+ }
39
+ return { owner, repo: name, number: issue };
40
+ }
41
+ async function classifyAndDeleteBranch(ctx) {
42
+ const { gh, pr, issueRef, logger } = ctx;
43
+ if (pr.headRepositoryOwner != null &&
44
+ pr.headRepositoryOwner !== issueRef.owner) {
45
+ logger.info({ pr: pr.number, headRef: pr.head, headOwner: pr.headRepositoryOwner }, 'branch deletion skipped: cross-fork PR');
46
+ return 'merged (branch delete skipped: cross-fork PR)\n';
47
+ }
48
+ const repo = `${issueRef.owner}/${issueRef.repo}`;
49
+ const result = await gh.deleteHeadRef(repo, pr.head);
50
+ switch (result.outcome) {
51
+ case 'deleted':
52
+ return 'merged and branch deleted\n';
53
+ case 'already-gone':
54
+ logger.info({ pr: pr.number, headRef: pr.head }, 'branch was already deleted');
55
+ return 'merged (branch was already deleted)\n';
56
+ case 'delete-failed':
57
+ logger.warn({ pr: pr.number, repo, headRef: pr.head, stderr: result.stderr }, 'branch deletion failed');
58
+ return `merged (branch delete failed: ${result.stderr ?? ''})\n`;
59
+ }
60
+ }
61
+ /**
62
+ * Shared merge-tail helper. Fetches issue state, checks completed:validate,
63
+ * fetches required checks, classifies, merges, deletes branch. Extracted from
64
+ * runMerge for reuse by runMergeWithExplicitPr per contracts/pr-flag-cli.md §5.
65
+ */
66
+ async function assertCompletedValidateAndMerge(input) {
67
+ const { gh, repo, issue, issueRef, prNumber, logger, exitPolicy, linkMethod, } = input;
68
+ const refuseExit = exitPolicy === 'pr-flag' ? 3 : 1;
69
+ const pr = await gh.getPullRequestDetail(repo, prNumber);
70
+ let issueState;
71
+ try {
72
+ issueState = await gh.fetchIssueState(repo, issue);
73
+ }
74
+ catch (err) {
75
+ logger.error({ issue, repo, err }, 'Failed to fetch issue state');
76
+ return {
77
+ exitCode: 1,
78
+ stdout: serializeFailingCheckJson(buildFailingCheckPayload({
79
+ reason: 'unresolved',
80
+ pr: null,
81
+ issue: issueRef,
82
+ })),
83
+ };
84
+ }
85
+ if (issueState.state === 'CLOSED') {
86
+ logger.error({
87
+ issue,
88
+ repo,
89
+ state: issueState.state,
90
+ stateReason: issueState.stateReason,
91
+ }, 'Issue is CLOSED');
92
+ return {
93
+ exitCode: refuseExit,
94
+ stdout: serializeFailingCheckJson(buildFailingCheckPayload({
95
+ reason: 'unresolved',
96
+ pr: { number: pr.number, url: pr.url },
97
+ issue: {
98
+ ...issueRef,
99
+ state: issueState.state,
100
+ stateReason: issueState.stateReason,
101
+ },
102
+ })),
103
+ };
104
+ }
105
+ if (!issueState.labels.includes(COMPLETED_VALIDATE_LABEL)) {
106
+ logger.error({ issue, repo, missingLabel: COMPLETED_VALIDATE_LABEL }, 'Issue missing completed:validate label');
107
+ const prPayload = linkMethod !== undefined
108
+ ? { number: pr.number, url: pr.url, linkMethod }
109
+ : // `missing-label` builder invariant I-9 requires linkMethod. Use the
110
+ // dedicated pr-flag `missing-label` payload variant: since the shared
111
+ // builder requires linkMethod for `missing-label`, we synthesize a
112
+ // sentinel for the pr-flag path so both share the schema shape.
113
+ { number: pr.number, url: pr.url, linkMethod: 'closing-refs' };
114
+ return {
115
+ exitCode: refuseExit,
116
+ stdout: serializeFailingCheckJson(buildFailingCheckPayload({
117
+ reason: 'missing-label',
118
+ pr: prPayload,
119
+ issue: issueRef,
120
+ })),
121
+ };
122
+ }
123
+ const [required, actualChecks] = await Promise.all([
124
+ gh.getRequiredCheckNames(repo, pr.base),
125
+ gh.getPullRequestCheckRuns(repo, pr.number),
126
+ ]);
127
+ if (required.source === 'fallback-pr-checks') {
128
+ logger.warn('required-check set derived from PR check list; token cannot read branch protection');
129
+ }
130
+ const noActual = actualChecks.length === 0;
131
+ const noRequired = required.source === 'branch-protection'
132
+ ? (required.names?.length ?? 0) === 0
133
+ : true;
134
+ if (noActual && noRequired) {
135
+ await gh.mergePullRequest(repo, pr.number, { squash: true });
136
+ logger.info({ pr: pr.number }, 'PR merged');
137
+ const deletionSuffix = await classifyAndDeleteBranch({
138
+ gh,
139
+ pr,
140
+ issueRef,
141
+ logger,
142
+ });
143
+ return {
144
+ exitCode: 0,
145
+ stdout: 'no checks configured and none required — proceeding on completed:validate\n' +
146
+ deletionSuffix,
147
+ prNumber: pr.number,
148
+ };
149
+ }
150
+ const { failingChecks, ok } = classifyChecks({ required, actual: actualChecks });
151
+ if (!ok) {
152
+ logger.error({ pr: pr.number, failing: failingChecks.length }, 'PR has failing or pending required checks');
153
+ const prPayload = linkMethod !== undefined
154
+ ? { number: pr.number, url: pr.url, linkMethod }
155
+ : { number: pr.number, url: pr.url, linkMethod: 'closing-refs' };
156
+ return {
157
+ exitCode: refuseExit,
158
+ stdout: serializeFailingCheckJson(buildFailingCheckPayload({
159
+ reason: 'checks-failing',
160
+ pr: prPayload,
161
+ failingChecks,
162
+ issue: issueRef,
163
+ })),
164
+ };
165
+ }
166
+ await gh.mergePullRequest(repo, pr.number, { squash: true });
167
+ logger.info({ pr: pr.number }, 'PR merged');
168
+ const deletionSuffix = await classifyAndDeleteBranch({
169
+ gh,
170
+ pr,
171
+ issueRef,
172
+ logger,
173
+ });
174
+ return { exitCode: 0, stdout: deletionSuffix, prNumber: pr.number };
175
+ }
176
+ export async function runMerge(input) {
177
+ const { gh, issue, repo, logger } = input;
178
+ const issueRef = parseIssueRef(repo, issue);
179
+ const resolution = await gh.resolveIssueToPRRef(repo, issue);
180
+ if (resolution.kind === 'unresolved') {
181
+ logger.error({ issue, repo }, 'No PR resolved for issue');
182
+ return {
183
+ exitCode: 1,
184
+ stdout: serializeFailingCheckJson(buildFailingCheckPayload({
185
+ reason: 'unresolved',
186
+ pr: null,
187
+ issue: issueRef,
188
+ })),
189
+ };
190
+ }
191
+ // #928 — the caller's `<issue>` argument is itself a PR node. Emit a
192
+ // typed refusal at exit-2 with guidance copy; the MCP envelope maps this
193
+ // reason to `class: 'wrong-kind'`. Closes #906 on the CLI at the same time.
194
+ if (resolution.kind === 'pr-number') {
195
+ logger.error({ issue, repo }, `#${issue} is a pull request, not an issue`);
196
+ return {
197
+ exitCode: 2,
198
+ stdout: serializeFailingCheckJson(buildFailingCheckPayload({
199
+ reason: 'pr-number',
200
+ pr: null,
201
+ issue: issueRef,
202
+ hint: `#${issue} is a pull request; pass the issue number ` +
203
+ `(e.g. the issue whose closing PR is #${issue}).`,
204
+ })),
205
+ };
206
+ }
207
+ if (resolution.kind === 'pr-is-draft') {
208
+ logger.error({
209
+ issue,
210
+ repo,
211
+ linkMethod: resolution.linkMethod,
212
+ candidates: resolution.candidates.map((c) => c.number),
213
+ }, 'Resolved PRs are drafts');
214
+ return {
215
+ exitCode: 1,
216
+ stdout: serializeFailingCheckJson(buildFailingCheckPayload({
217
+ reason: 'pr-is-draft',
218
+ pr: null,
219
+ candidates: toPrCandidates(resolution.candidates),
220
+ linkMethod: resolution.linkMethod,
221
+ issue: issueRef,
222
+ })),
223
+ };
224
+ }
225
+ if (resolution.kind === 'ambiguous') {
226
+ logger.error({
227
+ issue,
228
+ repo,
229
+ linkMethod: resolution.linkMethod,
230
+ candidates: resolution.candidates.map((c) => c.number),
231
+ }, 'Multiple PRs resolved for issue');
232
+ return {
233
+ exitCode: 1,
234
+ stdout: serializeFailingCheckJson(buildFailingCheckPayload({
235
+ reason: 'ambiguous-resolution',
236
+ pr: null,
237
+ candidates: toPrCandidates(resolution.candidates),
238
+ linkMethod: resolution.linkMethod,
239
+ issue: issueRef,
240
+ })),
241
+ };
242
+ }
243
+ // Exhaustiveness guard — after the branches above, resolution.kind is
244
+ // 'resolved'. Adding a new arm to PullRequestRefResolution surfaces here
245
+ // at build time.
246
+ const _exhaustive = resolution.kind;
247
+ void _exhaustive;
248
+ const prRef = resolution.ref;
249
+ const linkMethod = resolution.linkMethod;
250
+ // FR-004: log the resolved PR + tier BEFORE any subsequent gh call so a
251
+ // later failure never erases the evidence of which PR was targeted.
252
+ logger.info({ pr: prRef.number, linkMethod }, `resolved PR #${prRef.number} via ${linkMethod}`);
253
+ return assertCompletedValidateAndMerge({
254
+ gh,
255
+ repo,
256
+ issue,
257
+ issueRef,
258
+ prNumber: prRef.number,
259
+ logger,
260
+ exitPolicy: 'resolver',
261
+ linkMethod,
262
+ });
263
+ }
264
+ /**
265
+ * FR-005..FR-008 — `--pr <number>` escape hatch. Skips the tier-1/2/3 resolver
266
+ * chain but keeps every safety precondition. Gate order per contracts/pr-flag-cli.md §3.
267
+ */
268
+ export async function runMergeWithExplicitPr(input) {
269
+ const { gh, issue, repo, prNumber, logger } = input;
270
+ const issueRef = parseIssueRef(repo, issue);
271
+ const pr = await gh.getPullRequestGraphqlDetail(repo, prNumber);
272
+ // Gate 1 — FR-006a linkage.
273
+ const declares = pr.closingIssuesReferences.some((l) => l.nameWithOwner === repo && l.number === issue);
274
+ if (!declares) {
275
+ const kind = pr.closingIssuesReferences.length === 0 ? 'empty-refs' : 'mismatch';
276
+ const message = kind === 'empty-refs'
277
+ ? `--pr ${prNumber} refused: PR #${prNumber} declares no closing issues. Add ${repo}#${issue} via the PR's Development sidebar link, then re-run.`
278
+ : `--pr ${prNumber} refused: PR #${prNumber} does not declare ${repo}#${issue} as a closing issue. Add ${repo}#${issue} via the PR's Development sidebar link, then re-run.`;
279
+ logger.error({ pr: prNumber, issue, repo, kind }, `--pr linkage refused: ${kind}`);
280
+ return {
281
+ exitCode: 3,
282
+ stdout: serializeFailingCheckJson(buildFailingCheckPayload({
283
+ reason: 'pr-flag-linkage-refused',
284
+ pr: { number: prNumber, url: '' },
285
+ kind,
286
+ message,
287
+ issue: issueRef,
288
+ })),
289
+ };
290
+ }
291
+ // Gate 2 — FR-006b state classifier.
292
+ if (pr.state === 'MERGED') {
293
+ logger.info({ pr: prNumber }, `PR #${prNumber} already merged, no-op`);
294
+ return {
295
+ exitCode: 0,
296
+ stdout: `PR #${prNumber} already merged, no-op\n`,
297
+ prNumber,
298
+ };
299
+ }
300
+ if (pr.state === 'CLOSED') {
301
+ logger.error({ pr: prNumber }, 'PR is closed without merge');
302
+ return {
303
+ exitCode: 3,
304
+ stdout: serializeFailingCheckJson(buildFailingCheckPayload({
305
+ reason: 'pr-flag-closed-unmerged',
306
+ pr: { number: prNumber, url: '' },
307
+ message: `--pr ${prNumber} refused: PR #${prNumber} is closed without merge.`,
308
+ issue: issueRef,
309
+ })),
310
+ };
311
+ }
312
+ // state === 'OPEN' → continue.
313
+ // Gates 3 & 4 — delegate to shared tail with pr-flag exitPolicy.
314
+ return assertCompletedValidateAndMerge({
315
+ gh,
316
+ repo,
317
+ issue,
318
+ issueRef,
319
+ prNumber,
320
+ logger,
321
+ exitPolicy: 'pr-flag',
322
+ });
323
+ }
324
+ export function cockpitMergeCommand() {
325
+ const cmd = new Command('merge');
326
+ cmd
327
+ .description('Squash-merge the PR for <issue> iff it carries completed:validate and every required check is green')
328
+ .argument('<issue>', 'GitHub issue number')
329
+ .option('--repo <repo>', 'Owner/name (inferred from cwd if absent)')
330
+ .option('--pr <number>', 'Escape hatch — target this PR directly, skipping issue→PR resolution. ' +
331
+ '<issue> remains required as the authorization source for completed:validate. ' +
332
+ 'Enforces linkage verification and all safety preconditions; never bypasses safety.', parsePrFlag)
333
+ .action(async (issueArg, opts) => {
334
+ const logger = getLogger();
335
+ const ctx = await resolveIssueContext({
336
+ issue: issueArg,
337
+ repo: opts.repo,
338
+ });
339
+ const result = opts.pr != null
340
+ ? await runMergeWithExplicitPr({
341
+ gh: ctx.gh,
342
+ issue: ctx.ref.number,
343
+ repo: ctx.repo,
344
+ prNumber: opts.pr,
345
+ logger,
346
+ })
347
+ : await runMerge({
348
+ gh: ctx.gh,
349
+ issue: ctx.ref.number,
350
+ repo: ctx.repo,
351
+ logger,
352
+ });
353
+ if (result.stdout.length > 0) {
354
+ process.stdout.write(result.stdout);
355
+ }
356
+ process.exit(result.exitCode);
357
+ });
358
+ return cmd;
359
+ }
360
+ //# sourceMappingURL=merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../../../src/cli/commands/cockpit/merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Extracts declared cross-issue dependencies from a spec's `plan.md` file.
3
+ *
4
+ * v1 heuristic (contracts/plan-dependency-warning.md §Extractor):
5
+ * - Trigger verbs: `must be merged`, `must merge first`, `depends on`, `depends-on`,
6
+ * `requires`, `extends`, `blocked by`, `prerequisite`.
7
+ * - Extract `#\d+` (bare) → `{ defaultOwner, defaultRepo, N }`
8
+ * - Extract `[\w-]+/[\w-]+#\d+` → cross-repo
9
+ * - Search the trigger line PLUS the immediately-following line (wrapping tolerance).
10
+ * - Skip fenced code blocks (` ``` `) and inline code (backticks).
11
+ * - De-duplicate by `owner/repo/number`, preserving first-occurrence order.
12
+ *
13
+ * `originatingText` is derived from the trigger line, bounded to 120 chars.
14
+ */
15
+ export interface DependencyRef {
16
+ owner: string;
17
+ repo: string;
18
+ number: number;
19
+ /** The originating span from the plan.md line (bounded to 120 chars). */
20
+ originatingText: string;
21
+ }
22
+ /**
23
+ * Extract dependency refs from `plan.md` markdown.
24
+ *
25
+ * @param planMarkdown Raw markdown body.
26
+ * @param defaultOwner Owner for bare `#N` refs (typically the current issue's owner).
27
+ * @param defaultRepo Repo for bare `#N` refs (typically the current issue's repo).
28
+ */
29
+ export declare function extractPlanDependencies(planMarkdown: string, defaultOwner: string, defaultRepo: string): DependencyRef[];
30
+ //# sourceMappingURL=plan-dependency-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-dependency-extractor.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/cockpit/plan-dependency-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,eAAe,EAAE,MAAM,CAAC;CACzB;AAsCD;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAClB,aAAa,EAAE,CAuFjB"}