chief-clancy 0.6.0 → 0.7.1

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 (181) hide show
  1. package/README.md +3 -2
  2. package/dist/bundle/clancy-afk.js +6 -2
  3. package/dist/bundle/clancy-once.js +49 -48
  4. package/dist/installer/hook-installer/hook-installer.d.ts +2 -0
  5. package/dist/installer/hook-installer/hook-installer.d.ts.map +1 -1
  6. package/dist/installer/hook-installer/hook-installer.js +36 -1
  7. package/dist/installer/hook-installer/hook-installer.js.map +1 -1
  8. package/dist/installer/install.js +8 -0
  9. package/dist/installer/install.js.map +1 -1
  10. package/hooks/clancy-branch-guard.js +129 -0
  11. package/hooks/clancy-context-monitor.js +134 -46
  12. package/hooks/clancy-post-compact.js +53 -0
  13. package/hooks/package.json +3 -0
  14. package/package.json +7 -3
  15. package/src/agents/verification-gate.md +128 -0
  16. package/src/roles/setup/workflows/init.md +45 -0
  17. package/src/roles/setup/workflows/scaffold.md +30 -0
  18. package/src/roles/setup/workflows/settings.md +56 -0
  19. package/src/templates/.env.example.github +19 -1
  20. package/src/templates/.env.example.jira +25 -1
  21. package/src/templates/.env.example.linear +19 -1
  22. package/dist/schemas/bitbucket-pr.d.ts +0 -137
  23. package/dist/schemas/bitbucket-pr.d.ts.map +0 -1
  24. package/dist/schemas/bitbucket-pr.js +0 -75
  25. package/dist/schemas/bitbucket-pr.js.map +0 -1
  26. package/dist/schemas/env.d.ts +0 -150
  27. package/dist/schemas/env.d.ts.map +0 -1
  28. package/dist/schemas/env.js +0 -63
  29. package/dist/schemas/env.js.map +0 -1
  30. package/dist/schemas/github-issues.d.ts +0 -105
  31. package/dist/schemas/github-issues.d.ts.map +0 -1
  32. package/dist/schemas/github-issues.js +0 -54
  33. package/dist/schemas/github-issues.js.map +0 -1
  34. package/dist/schemas/gitlab-mr.d.ts +0 -73
  35. package/dist/schemas/gitlab-mr.d.ts.map +0 -1
  36. package/dist/schemas/gitlab-mr.js +0 -33
  37. package/dist/schemas/gitlab-mr.js.map +0 -1
  38. package/dist/schemas/jira.d.ts +0 -59
  39. package/dist/schemas/jira.d.ts.map +0 -1
  40. package/dist/schemas/jira.js +0 -56
  41. package/dist/schemas/jira.js.map +0 -1
  42. package/dist/schemas/linear.d.ts +0 -108
  43. package/dist/schemas/linear.d.ts.map +0 -1
  44. package/dist/schemas/linear.js +0 -84
  45. package/dist/schemas/linear.js.map +0 -1
  46. package/dist/scripts/afk/afk.d.ts +0 -21
  47. package/dist/scripts/afk/afk.d.ts.map +0 -1
  48. package/dist/scripts/afk/afk.js +0 -118
  49. package/dist/scripts/afk/afk.js.map +0 -1
  50. package/dist/scripts/board/github/github.d.ts +0 -104
  51. package/dist/scripts/board/github/github.d.ts.map +0 -1
  52. package/dist/scripts/board/github/github.js +0 -291
  53. package/dist/scripts/board/github/github.js.map +0 -1
  54. package/dist/scripts/board/jira/jira.d.ts +0 -139
  55. package/dist/scripts/board/jira/jira.d.ts.map +0 -1
  56. package/dist/scripts/board/jira/jira.js +0 -378
  57. package/dist/scripts/board/jira/jira.js.map +0 -1
  58. package/dist/scripts/board/linear/linear.d.ts +0 -129
  59. package/dist/scripts/board/linear/linear.d.ts.map +0 -1
  60. package/dist/scripts/board/linear/linear.js +0 -393
  61. package/dist/scripts/board/linear/linear.js.map +0 -1
  62. package/dist/scripts/once/board-ops/board-ops.d.ts +0 -26
  63. package/dist/scripts/once/board-ops/board-ops.d.ts.map +0 -1
  64. package/dist/scripts/once/board-ops/board-ops.js +0 -113
  65. package/dist/scripts/once/board-ops/board-ops.js.map +0 -1
  66. package/dist/scripts/once/deliver/deliver.d.ts +0 -37
  67. package/dist/scripts/once/deliver/deliver.d.ts.map +0 -1
  68. package/dist/scripts/once/deliver/deliver.js +0 -236
  69. package/dist/scripts/once/deliver/deliver.js.map +0 -1
  70. package/dist/scripts/once/fetch-ticket/fetch-ticket.d.ts +0 -22
  71. package/dist/scripts/once/fetch-ticket/fetch-ticket.d.ts.map +0 -1
  72. package/dist/scripts/once/fetch-ticket/fetch-ticket.js +0 -123
  73. package/dist/scripts/once/fetch-ticket/fetch-ticket.js.map +0 -1
  74. package/dist/scripts/once/git-token/git-token.d.ts +0 -13
  75. package/dist/scripts/once/git-token/git-token.d.ts.map +0 -1
  76. package/dist/scripts/once/git-token/git-token.js +0 -30
  77. package/dist/scripts/once/git-token/git-token.js.map +0 -1
  78. package/dist/scripts/once/once.d.ts +0 -12
  79. package/dist/scripts/once/once.d.ts.map +0 -1
  80. package/dist/scripts/once/once.js +0 -356
  81. package/dist/scripts/once/once.js.map +0 -1
  82. package/dist/scripts/once/pr-creation/pr-creation.d.ts +0 -11
  83. package/dist/scripts/once/pr-creation/pr-creation.d.ts.map +0 -1
  84. package/dist/scripts/once/pr-creation/pr-creation.js +0 -50
  85. package/dist/scripts/once/pr-creation/pr-creation.js.map +0 -1
  86. package/dist/scripts/once/rework/rework.d.ts +0 -32
  87. package/dist/scripts/once/rework/rework.d.ts.map +0 -1
  88. package/dist/scripts/once/rework/rework.js +0 -208
  89. package/dist/scripts/once/rework/rework.js.map +0 -1
  90. package/dist/scripts/once/types/types.d.ts +0 -13
  91. package/dist/scripts/once/types/types.d.ts.map +0 -1
  92. package/dist/scripts/once/types/types.js +0 -2
  93. package/dist/scripts/once/types/types.js.map +0 -1
  94. package/dist/scripts/shared/branch/branch.d.ts +0 -50
  95. package/dist/scripts/shared/branch/branch.d.ts.map +0 -1
  96. package/dist/scripts/shared/branch/branch.js +0 -61
  97. package/dist/scripts/shared/branch/branch.js.map +0 -1
  98. package/dist/scripts/shared/claude-cli/claude-cli.d.ts +0 -31
  99. package/dist/scripts/shared/claude-cli/claude-cli.d.ts.map +0 -1
  100. package/dist/scripts/shared/claude-cli/claude-cli.js +0 -60
  101. package/dist/scripts/shared/claude-cli/claude-cli.js.map +0 -1
  102. package/dist/scripts/shared/env-schema/env-schema.d.ts +0 -27
  103. package/dist/scripts/shared/env-schema/env-schema.d.ts.map +0 -1
  104. package/dist/scripts/shared/env-schema/env-schema.js +0 -47
  105. package/dist/scripts/shared/env-schema/env-schema.js.map +0 -1
  106. package/dist/scripts/shared/feasibility/feasibility.d.ts +0 -30
  107. package/dist/scripts/shared/feasibility/feasibility.d.ts.map +0 -1
  108. package/dist/scripts/shared/feasibility/feasibility.js +0 -68
  109. package/dist/scripts/shared/feasibility/feasibility.js.map +0 -1
  110. package/dist/scripts/shared/format/format.d.ts +0 -11
  111. package/dist/scripts/shared/format/format.d.ts.map +0 -1
  112. package/dist/scripts/shared/format/format.js +0 -18
  113. package/dist/scripts/shared/format/format.js.map +0 -1
  114. package/dist/scripts/shared/git-ops/git-ops.d.ts +0 -90
  115. package/dist/scripts/shared/git-ops/git-ops.d.ts.map +0 -1
  116. package/dist/scripts/shared/git-ops/git-ops.js +0 -190
  117. package/dist/scripts/shared/git-ops/git-ops.js.map +0 -1
  118. package/dist/scripts/shared/http/http.d.ts +0 -54
  119. package/dist/scripts/shared/http/http.d.ts.map +0 -1
  120. package/dist/scripts/shared/http/http.js +0 -76
  121. package/dist/scripts/shared/http/http.js.map +0 -1
  122. package/dist/scripts/shared/notify/notify.d.ts +0 -46
  123. package/dist/scripts/shared/notify/notify.d.ts.map +0 -1
  124. package/dist/scripts/shared/notify/notify.js +0 -88
  125. package/dist/scripts/shared/notify/notify.js.map +0 -1
  126. package/dist/scripts/shared/preflight/preflight.d.ts +0 -40
  127. package/dist/scripts/shared/preflight/preflight.d.ts.map +0 -1
  128. package/dist/scripts/shared/preflight/preflight.js +0 -96
  129. package/dist/scripts/shared/preflight/preflight.js.map +0 -1
  130. package/dist/scripts/shared/progress/progress.d.ts +0 -75
  131. package/dist/scripts/shared/progress/progress.d.ts.map +0 -1
  132. package/dist/scripts/shared/progress/progress.js +0 -210
  133. package/dist/scripts/shared/progress/progress.js.map +0 -1
  134. package/dist/scripts/shared/prompt/prompt.d.ts +0 -58
  135. package/dist/scripts/shared/prompt/prompt.d.ts.map +0 -1
  136. package/dist/scripts/shared/prompt/prompt.js +0 -123
  137. package/dist/scripts/shared/prompt/prompt.js.map +0 -1
  138. package/dist/scripts/shared/pull-request/bitbucket/bitbucket.d.ts +0 -82
  139. package/dist/scripts/shared/pull-request/bitbucket/bitbucket.d.ts.map +0 -1
  140. package/dist/scripts/shared/pull-request/bitbucket/bitbucket.js +0 -301
  141. package/dist/scripts/shared/pull-request/bitbucket/bitbucket.js.map +0 -1
  142. package/dist/scripts/shared/pull-request/github/github.d.ts +0 -72
  143. package/dist/scripts/shared/pull-request/github/github.d.ts.map +0 -1
  144. package/dist/scripts/shared/pull-request/github/github.js +0 -226
  145. package/dist/scripts/shared/pull-request/github/github.js.map +0 -1
  146. package/dist/scripts/shared/pull-request/gitlab/gitlab.d.ts +0 -74
  147. package/dist/scripts/shared/pull-request/gitlab/gitlab.d.ts.map +0 -1
  148. package/dist/scripts/shared/pull-request/gitlab/gitlab.js +0 -220
  149. package/dist/scripts/shared/pull-request/gitlab/gitlab.js.map +0 -1
  150. package/dist/scripts/shared/pull-request/post-pr/post-pr.d.ts +0 -31
  151. package/dist/scripts/shared/pull-request/post-pr/post-pr.d.ts.map +0 -1
  152. package/dist/scripts/shared/pull-request/post-pr/post-pr.js +0 -61
  153. package/dist/scripts/shared/pull-request/post-pr/post-pr.js.map +0 -1
  154. package/dist/scripts/shared/pull-request/pr-body/pr-body.d.ts +0 -40
  155. package/dist/scripts/shared/pull-request/pr-body/pr-body.d.ts.map +0 -1
  156. package/dist/scripts/shared/pull-request/pr-body/pr-body.js +0 -84
  157. package/dist/scripts/shared/pull-request/pr-body/pr-body.js.map +0 -1
  158. package/dist/scripts/shared/pull-request/rework-comment/rework-comment.d.ts +0 -23
  159. package/dist/scripts/shared/pull-request/rework-comment/rework-comment.d.ts.map +0 -1
  160. package/dist/scripts/shared/pull-request/rework-comment/rework-comment.js +0 -30
  161. package/dist/scripts/shared/pull-request/rework-comment/rework-comment.js.map +0 -1
  162. package/dist/scripts/shared/remote/remote.d.ts +0 -41
  163. package/dist/scripts/shared/remote/remote.d.ts.map +0 -1
  164. package/dist/scripts/shared/remote/remote.js +0 -227
  165. package/dist/scripts/shared/remote/remote.js.map +0 -1
  166. package/dist/types/board.d.ts +0 -13
  167. package/dist/types/board.d.ts.map +0 -1
  168. package/dist/types/board.js +0 -5
  169. package/dist/types/board.js.map +0 -1
  170. package/dist/types/index.d.ts +0 -4
  171. package/dist/types/index.d.ts.map +0 -1
  172. package/dist/types/index.js +0 -2
  173. package/dist/types/index.js.map +0 -1
  174. package/dist/types/remote.d.ts +0 -55
  175. package/dist/types/remote.d.ts.map +0 -1
  176. package/dist/types/remote.js +0 -5
  177. package/dist/types/remote.js.map +0 -1
  178. package/dist/utils/parse-json/parse-json.d.ts +0 -20
  179. package/dist/utils/parse-json/parse-json.d.ts.map +0 -1
  180. package/dist/utils/parse-json/parse-json.js +0 -27
  181. package/dist/utils/parse-json/parse-json.js.map +0 -1
@@ -1,393 +0,0 @@
1
- /**
2
- * Clancy Linear board script.
3
- *
4
- * Fetches an issue from Linear's GraphQL API, creates branches,
5
- * invokes Claude, pushes feature branches, and creates PRs.
6
- *
7
- * Important: Linear personal API keys do NOT use "Bearer" prefix.
8
- * Only OAuth tokens use "Bearer". This is intentional per Linear docs.
9
- */
10
- import { linearIssueRelationsResponseSchema, linearIssueSearchResponseSchema, linearIssueUpdateResponseSchema, linearIssuesResponseSchema, linearViewerResponseSchema, linearWorkflowStatesResponseSchema, } from '../../../schemas/linear.js';
11
- const SAFE_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;
12
- const LINEAR_API_URL = 'https://api.linear.app/graphql';
13
- /**
14
- * Validate that a team ID is safe for use in GraphQL variables.
15
- *
16
- * @param teamId - The Linear team ID to validate.
17
- * @returns `true` if the ID matches the safe pattern.
18
- */
19
- export function isValidTeamId(teamId) {
20
- return SAFE_ID_PATTERN.test(teamId);
21
- }
22
- /**
23
- * Make a GraphQL request to the Linear API.
24
- *
25
- * Personal API keys are passed directly (no "Bearer" prefix).
26
- *
27
- * @param apiKey - The Linear personal API key.
28
- * @param query - The GraphQL query string.
29
- * @param variables - The GraphQL variables object.
30
- * @returns The raw JSON response, or `undefined` on failure.
31
- */
32
- export async function linearGraphql(apiKey, query, variables) {
33
- let response;
34
- try {
35
- response = await fetch(LINEAR_API_URL, {
36
- method: 'POST',
37
- headers: {
38
- Authorization: apiKey,
39
- 'Content-Type': 'application/json',
40
- },
41
- body: JSON.stringify({ query, variables }),
42
- });
43
- }
44
- catch (err) {
45
- console.warn(`⚠ Linear API request failed: ${err instanceof Error ? err.message : String(err)}`);
46
- return undefined;
47
- }
48
- if (!response.ok) {
49
- console.warn(`⚠ Linear API returned HTTP ${response.status}`);
50
- return undefined;
51
- }
52
- try {
53
- return await response.json();
54
- }
55
- catch {
56
- console.warn('⚠ Linear API returned invalid JSON');
57
- return undefined;
58
- }
59
- }
60
- /**
61
- * Ping the Linear API to verify connectivity and credentials.
62
- *
63
- * @param apiKey - The Linear personal API key.
64
- * @returns An object with `ok` and optional `error` message.
65
- */
66
- export async function pingLinear(apiKey) {
67
- let response;
68
- try {
69
- response = await fetch(LINEAR_API_URL, {
70
- method: 'POST',
71
- headers: {
72
- Authorization: apiKey,
73
- 'Content-Type': 'application/json',
74
- },
75
- body: JSON.stringify({ query: '{ viewer { id } }' }),
76
- });
77
- }
78
- catch {
79
- return { ok: false, error: '✗ Could not reach Linear — check network' };
80
- }
81
- if (!response.ok) {
82
- if (response.status === 401 || response.status === 403) {
83
- return {
84
- ok: false,
85
- error: '✗ Linear auth failed — check LINEAR_API_KEY',
86
- };
87
- }
88
- return {
89
- ok: false,
90
- error: `✗ Linear API returned HTTP ${response.status}`,
91
- };
92
- }
93
- try {
94
- const json = await response.json();
95
- const parsed = linearViewerResponseSchema.safeParse(json);
96
- if (parsed.success && parsed.data.data?.viewer?.id)
97
- return { ok: true };
98
- }
99
- catch {
100
- // Invalid JSON — treat as auth issue
101
- }
102
- return { ok: false, error: '✗ Linear auth failed — check LINEAR_API_KEY' };
103
- }
104
- /**
105
- * Fetch the next available issue from Linear.
106
- *
107
- * Filters by `state.type: "unstarted"` (enum, works regardless of team
108
- * column naming) and optionally by label.
109
- *
110
- * @param env - The Linear environment variables.
111
- * @returns The fetched ticket with optional parent info, or `undefined` if none available.
112
- */
113
- export async function fetchIssue(env) {
114
- const results = await fetchIssues(env, false, 1);
115
- return results[0];
116
- }
117
- /**
118
- * Fetch multiple candidate issues from Linear.
119
- *
120
- * @param env - The Linear environment variables.
121
- * @param excludeHitl - If `true`, excludes issues with the `clancy:hitl` label.
122
- * @param limit - Maximum number of results to return (default: 5).
123
- * @returns Array of fetched tickets (may be empty).
124
- */
125
- export async function fetchIssues(env, excludeHitl, limit = 5) {
126
- const label = env.CLANCY_LABEL?.trim();
127
- const hasLabel = Boolean(label);
128
- const labelFilter = hasLabel ? 'labels: { name: { eq: $label } }' : '';
129
- // Build variable declarations for the query
130
- const varDecls = [
131
- '$teamId: String!',
132
- ...(hasLabel ? ['$label: String!'] : []),
133
- ];
134
- // Build filter parts
135
- const filterParts = [
136
- 'state: { type: { eq: "unstarted" } }',
137
- 'team: { id: { eq: $teamId } }',
138
- labelFilter,
139
- ].filter(Boolean);
140
- const query = `
141
- query(${varDecls.join(', ')}) {
142
- viewer {
143
- assignedIssues(
144
- filter: {
145
- ${filterParts.join('\n ')}
146
- }
147
- first: ${excludeHitl ? limit * 3 : limit}
148
- orderBy: priority
149
- ) {
150
- nodes {
151
- id
152
- identifier
153
- title
154
- description
155
- parent { identifier title }
156
- labels { nodes { name } }
157
- }
158
- }
159
- }
160
- }
161
- `;
162
- const variables = {
163
- teamId: env.LINEAR_TEAM_ID,
164
- };
165
- if (hasLabel)
166
- variables.label = label;
167
- const raw = await linearGraphql(env.LINEAR_API_KEY, query, variables);
168
- const parsed = linearIssuesResponseSchema.safeParse(raw);
169
- if (!parsed.success) {
170
- console.warn(`⚠ Unexpected Linear response shape: ${parsed.error.message}`);
171
- return [];
172
- }
173
- let nodes = parsed.data.data?.viewer?.assignedIssues?.nodes;
174
- if (!nodes?.length)
175
- return [];
176
- // HITL/AFK filtering: exclude issues with clancy:hitl label (using parsed schema data)
177
- if (excludeHitl) {
178
- nodes = nodes.filter((n) => !n.labels?.nodes?.some((l) => l.name === 'clancy:hitl'));
179
- }
180
- // Trim to requested limit after filtering
181
- nodes = nodes.slice(0, limit);
182
- return nodes.map((issue) => ({
183
- key: issue.identifier,
184
- title: issue.title,
185
- description: issue.description ?? '',
186
- provider: 'linear',
187
- issueId: issue.id,
188
- parentIdentifier: issue.parent?.identifier,
189
- }));
190
- }
191
- /**
192
- * Check whether a Linear issue is blocked by unresolved blockers.
193
- *
194
- * Queries the issue's relations for `blockedBy` type relationships and checks
195
- * if any blocking issues have an unresolved state (not "completed" or "canceled").
196
- *
197
- * @param apiKey - The Linear personal API key.
198
- * @param issueId - The Linear issue UUID.
199
- * @returns `true` if any blocker is unresolved, `false` otherwise.
200
- */
201
- export async function fetchBlockerStatus(apiKey, issueId) {
202
- const query = `
203
- query($issueId: String!) {
204
- issue(id: $issueId) {
205
- relations {
206
- nodes {
207
- type
208
- relatedIssue {
209
- state { type }
210
- }
211
- }
212
- }
213
- }
214
- }
215
- `;
216
- const raw = await linearGraphql(apiKey, query, { issueId });
217
- const parsed = linearIssueRelationsResponseSchema.safeParse(raw);
218
- if (!parsed.success)
219
- return false;
220
- const relations = parsed.data.data?.issue?.relations?.nodes ?? [];
221
- const doneTypes = new Set(['completed', 'canceled']);
222
- return relations.some((rel) => {
223
- if (rel.type !== 'blockedBy')
224
- return false;
225
- const stateType = rel.relatedIssue?.state?.type;
226
- if (!stateType)
227
- return false;
228
- return !doneTypes.has(stateType);
229
- });
230
- }
231
- /**
232
- * Fetch the children status of a Linear parent issue (dual-mode).
233
- *
234
- * Tries the `Epic: {identifier}` text convention first (searches for issues
235
- * with "Epic: {parentIdentifier}" in their description). If no results, falls
236
- * back to the native `children` API for backward compatibility.
237
- *
238
- * @param apiKey - The Linear personal API key.
239
- * @param parentId - The Linear parent issue UUID.
240
- * @param parentIdentifier - The Linear parent identifier (e.g., `'ENG-42'`).
241
- * Required for Epic: text convention search. Falls back to native API only if not provided.
242
- * @returns The children status, or `undefined` on failure.
243
- */
244
- export async function fetchChildrenStatus(apiKey, parentId, parentIdentifier) {
245
- try {
246
- // Mode 1: Try Epic: text convention (only if identifier is available)
247
- if (parentIdentifier) {
248
- const epicTextResult = await fetchChildrenByDescription(apiKey, `Epic: ${parentIdentifier}`);
249
- if (epicTextResult && epicTextResult.total > 0)
250
- return epicTextResult;
251
- }
252
- // Mode 2: Fall back to native children API
253
- return await fetchChildrenByNativeApi(apiKey, parentId);
254
- }
255
- catch {
256
- return undefined;
257
- }
258
- }
259
- /**
260
- * Fetch children status by searching for a description substring.
261
- *
262
- * @param apiKey - The Linear personal API key.
263
- * @param descriptionRef - The description substring to search for.
264
- * @returns The children status, or `undefined` on failure.
265
- */
266
- async function fetchChildrenByDescription(apiKey, descriptionRef) {
267
- const query = `
268
- query($filter: String!) {
269
- issueSearch(query: $filter) {
270
- nodes {
271
- state { type }
272
- }
273
- }
274
- }
275
- `;
276
- const raw = await linearGraphql(apiKey, query, { filter: descriptionRef });
277
- const parsed = linearIssueSearchResponseSchema.safeParse(raw);
278
- if (!parsed.success)
279
- return undefined;
280
- const nodes = parsed.data.data?.issueSearch?.nodes ?? [];
281
- const total = nodes.length;
282
- const doneTypes = new Set(['completed', 'canceled']);
283
- const incomplete = nodes.filter((n) => !n.state?.type || !doneTypes.has(n.state.type)).length;
284
- return { total, incomplete };
285
- }
286
- /**
287
- * Fetch children status using the native parent-child API.
288
- *
289
- * @param apiKey - The Linear personal API key.
290
- * @param parentId - The Linear parent issue UUID.
291
- * @returns The children status, or `undefined` on failure.
292
- */
293
- async function fetchChildrenByNativeApi(apiKey, parentId) {
294
- const query = `
295
- query($issueId: String!) {
296
- issue(id: $issueId) {
297
- children {
298
- nodes {
299
- state { type }
300
- }
301
- }
302
- }
303
- }
304
- `;
305
- const raw = await linearGraphql(apiKey, query, { issueId: parentId });
306
- if (!raw || typeof raw !== 'object')
307
- return undefined;
308
- const data = raw;
309
- const nodes = data.data?.issue?.children?.nodes;
310
- if (!nodes)
311
- return undefined;
312
- const total = nodes.length;
313
- const doneTypes = new Set(['completed', 'canceled']);
314
- const incomplete = nodes.filter((n) => !n.state?.type || !doneTypes.has(n.state.type)).length;
315
- return { total, incomplete };
316
- }
317
- /**
318
- * Look up a Linear workflow state ID by name and team.
319
- *
320
- * @param apiKey - The Linear personal API key.
321
- * @param teamId - The Linear team ID.
322
- * @param stateName - The workflow state name (e.g., `'In Progress'`).
323
- * @returns The state ID, or `undefined` if not found.
324
- */
325
- export async function lookupWorkflowStateId(apiKey, teamId, stateName) {
326
- const query = `
327
- query($teamId: String!, $name: String!) {
328
- workflowStates(filter: {
329
- team: { id: { eq: $teamId } }
330
- name: { eq: $name }
331
- }) {
332
- nodes { id }
333
- }
334
- }
335
- `;
336
- const raw = await linearGraphql(apiKey, query, { teamId, name: stateName });
337
- const parsed = linearWorkflowStatesResponseSchema.safeParse(raw);
338
- if (!parsed.success) {
339
- console.warn(`⚠ Unexpected Linear workflowStates response: ${parsed.error.message}`);
340
- return undefined;
341
- }
342
- return parsed.data.data?.workflowStates?.nodes?.[0]?.id;
343
- }
344
- /**
345
- * Execute a state transition on a Linear issue.
346
- *
347
- * @param apiKey - The Linear personal API key.
348
- * @param issueId - The Linear issue internal ID.
349
- * @param stateId - The target workflow state ID.
350
- * @returns `true` if the mutation succeeded.
351
- */
352
- export async function executeStateTransition(apiKey, issueId, stateId) {
353
- const mutation = `
354
- mutation($issueId: String!, $stateId: String!) {
355
- issueUpdate(id: $issueId, input: { stateId: $stateId }) {
356
- success
357
- }
358
- }
359
- `;
360
- const raw = await linearGraphql(apiKey, mutation, { issueId, stateId });
361
- const parsed = linearIssueUpdateResponseSchema.safeParse(raw);
362
- if (!parsed.success) {
363
- console.warn(`⚠ Unexpected Linear issueUpdate response: ${parsed.error.message}`);
364
- return false;
365
- }
366
- return parsed.data.data?.issueUpdate?.success === true;
367
- }
368
- /**
369
- * Transition a Linear issue to a new workflow state.
370
- *
371
- * Looks up the workflow state ID by name, then executes the `issueUpdate` mutation.
372
- * Best-effort — never throws on failure.
373
- *
374
- * @param apiKey - The Linear personal API key.
375
- * @param teamId - The Linear team ID.
376
- * @param issueId - The Linear issue internal ID.
377
- * @param stateName - The target workflow state name (e.g., `'In Progress'`).
378
- * @returns `true` if the transition succeeded.
379
- */
380
- export async function transitionIssue(apiKey, teamId, issueId, stateName) {
381
- try {
382
- const stateId = await lookupWorkflowStateId(apiKey, teamId, stateName);
383
- if (!stateId) {
384
- console.warn(`⚠ Linear workflow state "${stateName}" not found — check team configuration`);
385
- return false;
386
- }
387
- return await executeStateTransition(apiKey, issueId, stateId);
388
- }
389
- catch {
390
- return false;
391
- }
392
- }
393
- //# sourceMappingURL=linear.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"linear.js","sourceRoot":"","sources":["../../../../src/scripts/board/linear/linear.ts"],"names":[],"mappings":"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"}
@@ -1,26 +0,0 @@
1
- import type { BoardConfig, SharedEnv } from '../../../scripts/shared/env-schema/env-schema.js';
2
- import type { FetchedTicket } from '../types/types.js';
3
- /** Type-safe access to shared env vars across all board configs. */
4
- export declare function sharedEnv(config: BoardConfig): SharedEnv;
5
- export declare function pingBoard(config: BoardConfig): Promise<{
6
- ok: boolean;
7
- error?: string;
8
- }>;
9
- export declare function validateInputs(config: BoardConfig): string | undefined;
10
- export declare function transitionToStatus(config: BoardConfig, ticket: FetchedTicket, statusName: string): Promise<void>;
11
- /**
12
- * Fetch the children status of an epic/parent ticket on the board.
13
- *
14
- * Dispatches to the correct board module. Returns `{ total, incomplete }`
15
- * for epic completion detection and single-child skip optimisation.
16
- *
17
- * @param config - The board configuration.
18
- * @param parentKey - The parent ticket key (e.g., `'PROJ-100'`, `'#50'`, `'ENG-42'`).
19
- * @param parentId - Optional parent UUID (Linear only).
20
- * @returns The children status, or `undefined` on failure.
21
- */
22
- export declare function fetchEpicChildrenStatus(config: BoardConfig, parentKey: string, parentId?: string): Promise<{
23
- total: number;
24
- incomplete: number;
25
- } | undefined>;
26
- //# sourceMappingURL=board-ops.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"board-ops.d.ts","sourceRoot":"","sources":["../../../../src/scripts/once/board-ops/board-ops.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACV,MAAM,2CAA2C,CAAC;AAEnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvD,oEAAoE;AACpE,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAExD;AAID,wBAAsB,SAAS,CAC7B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAc1C;AAID,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CA8BtE;AAID,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAmCf;AAID;;;;;;;;;;GAUG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,WAAW,EACnB,SAAS,EAAE,MAAM,EACjB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAAC,CA2B5D"}
@@ -1,113 +0,0 @@
1
- import { fetchChildrenStatus as fetchGitHubChildrenStatus, isValidRepo, pingGitHub, } from '../../../scripts/board/github/github.js';
2
- import { buildAuthHeader, fetchChildrenStatus as fetchJiraChildrenStatus, isSafeJqlValue, pingJira, transitionIssue as transitionJiraIssue, } from '../../../scripts/board/jira/jira.js';
3
- import { fetchChildrenStatus as fetchLinearChildrenStatus, isValidTeamId, pingLinear, transitionIssue as transitionLinearIssue, } from '../../../scripts/board/linear/linear.js';
4
- // ─── Helpers ──────────────────────────────────────────────────────────────────
5
- /** Type-safe access to shared env vars across all board configs. */
6
- export function sharedEnv(config) {
7
- return config.env;
8
- }
9
- // ─── Board-specific ping ─────────────────────────────────────────────────────
10
- export async function pingBoard(config) {
11
- switch (config.provider) {
12
- case 'jira': {
13
- const { env } = config;
14
- const auth = buildAuthHeader(env.JIRA_USER, env.JIRA_API_TOKEN);
15
- return pingJira(env.JIRA_BASE_URL, env.JIRA_PROJECT_KEY, auth);
16
- }
17
- case 'github':
18
- return pingGitHub(config.env.GITHUB_TOKEN, config.env.GITHUB_REPO);
19
- case 'linear':
20
- return pingLinear(config.env.LINEAR_API_KEY);
21
- }
22
- }
23
- // ─── Board-specific validation ───────────────────────────────────────────────
24
- export function validateInputs(config) {
25
- switch (config.provider) {
26
- case 'jira': {
27
- const { env } = config;
28
- if (!isSafeJqlValue(env.JIRA_PROJECT_KEY)) {
29
- return '✗ JIRA_PROJECT_KEY contains invalid characters';
30
- }
31
- if (env.CLANCY_LABEL && !isSafeJqlValue(env.CLANCY_LABEL)) {
32
- return '✗ CLANCY_LABEL contains invalid characters';
33
- }
34
- if (env.CLANCY_JQL_STATUS && !isSafeJqlValue(env.CLANCY_JQL_STATUS)) {
35
- return '✗ CLANCY_JQL_STATUS contains invalid characters';
36
- }
37
- return undefined;
38
- }
39
- case 'github': {
40
- if (!isValidRepo(config.env.GITHUB_REPO)) {
41
- return '✗ GITHUB_REPO format is invalid — expected owner/repo';
42
- }
43
- return undefined;
44
- }
45
- case 'linear': {
46
- if (!isValidTeamId(config.env.LINEAR_TEAM_ID)) {
47
- return '✗ LINEAR_TEAM_ID contains invalid characters';
48
- }
49
- return undefined;
50
- }
51
- }
52
- }
53
- // ─── Board-specific transitions ──────────────────────────────────────────────
54
- export async function transitionToStatus(config, ticket, statusName) {
55
- switch (config.provider) {
56
- case 'jira': {
57
- const { env } = config;
58
- const auth = buildAuthHeader(env.JIRA_USER, env.JIRA_API_TOKEN);
59
- const issueKey = ticket.key;
60
- const ok = await transitionJiraIssue(env.JIRA_BASE_URL, auth, issueKey, statusName);
61
- if (ok)
62
- console.log(` → Transitioned to ${statusName}`);
63
- break;
64
- }
65
- case 'github': {
66
- // GitHub Issues only has open/closed — status transitions not applicable
67
- // closeIssue is called separately after merge
68
- break;
69
- }
70
- case 'linear': {
71
- const { env } = config;
72
- if (!ticket.linearIssueId)
73
- break;
74
- const ok = await transitionLinearIssue(env.LINEAR_API_KEY, env.LINEAR_TEAM_ID, ticket.linearIssueId, statusName);
75
- if (ok)
76
- console.log(` → Transitioned to ${statusName}`);
77
- break;
78
- }
79
- }
80
- }
81
- // ─── Epic children status ───────────────────────────────────────────────────
82
- /**
83
- * Fetch the children status of an epic/parent ticket on the board.
84
- *
85
- * Dispatches to the correct board module. Returns `{ total, incomplete }`
86
- * for epic completion detection and single-child skip optimisation.
87
- *
88
- * @param config - The board configuration.
89
- * @param parentKey - The parent ticket key (e.g., `'PROJ-100'`, `'#50'`, `'ENG-42'`).
90
- * @param parentId - Optional parent UUID (Linear only).
91
- * @returns The children status, or `undefined` on failure.
92
- */
93
- export async function fetchEpicChildrenStatus(config, parentKey, parentId) {
94
- switch (config.provider) {
95
- case 'jira': {
96
- const { env } = config;
97
- const auth = buildAuthHeader(env.JIRA_USER, env.JIRA_API_TOKEN);
98
- return fetchJiraChildrenStatus(env.JIRA_BASE_URL, auth, parentKey);
99
- }
100
- case 'github': {
101
- const issueNumber = parseInt(parentKey.replace('#', ''), 10);
102
- if (Number.isNaN(issueNumber))
103
- return undefined;
104
- return fetchGitHubChildrenStatus(config.env.GITHUB_TOKEN, config.env.GITHUB_REPO, issueNumber);
105
- }
106
- case 'linear': {
107
- if (!parentId)
108
- return undefined;
109
- return fetchLinearChildrenStatus(config.env.LINEAR_API_KEY, parentId, parentKey);
110
- }
111
- }
112
- }
113
- //# sourceMappingURL=board-ops.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"board-ops.js","sourceRoot":"","sources":["../../../../src/scripts/once/board-ops/board-ops.ts"],"names":[],"mappings":"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"}
@@ -1,37 +0,0 @@
1
- import type { BoardConfig } from '../../../scripts/shared/env-schema/env-schema.js';
2
- import type { FetchedTicket } from '../types/types.js';
3
- /**
4
- * Ensure the epic branch exists locally and on the remote.
5
- *
6
- * - If it exists on the remote, fetches it locally.
7
- * - If it only exists locally but not on the remote, refuses to overwrite
8
- * and prints migration instructions (safety guard for mid-upgrade users).
9
- * - If it doesn't exist at all, creates from `origin/{baseBranch}` and pushes.
10
- *
11
- * @param epicBranch - The epic branch name (e.g., `'epic/proj-100'`).
12
- * @param baseBranch - The base branch name (e.g., `'main'`).
13
- * @returns `true` if the branch is ready, `false` if creation was blocked.
14
- */
15
- export declare function ensureEpicBranch(epicBranch: string, baseBranch: string): boolean;
16
- /**
17
- * PR flow: push branch to remote, create PR/MR, transition to In Review.
18
- *
19
- * @param parent - Optional parent key for progress logging (epic branch flow).
20
- * @returns `false` if the push failed (caller should handle early return).
21
- */
22
- export declare function deliverViaPullRequest(config: BoardConfig, ticket: FetchedTicket, ticketBranch: string, targetBranch: string, startTime: number, skipLog?: boolean, parent?: string): Promise<boolean>;
23
- /**
24
- * Create the final PR from the epic branch to the base branch.
25
- *
26
- * Called when all children of an epic are done. Builds a PR body listing
27
- * all child tickets, creates the PR, and logs EPIC_PR_CREATED.
28
- *
29
- * @param config - The board configuration.
30
- * @param epicKey - The epic ticket key (e.g., `'PROJ-100'`).
31
- * @param epicTitle - The epic ticket title.
32
- * @param epicBranch - The epic branch name (e.g., `'epic/proj-100'`).
33
- * @param baseBranch - The base branch name (e.g., `'main'`).
34
- * @returns `true` if the PR was created successfully.
35
- */
36
- export declare function deliverEpicToBase(config: BoardConfig, epicKey: string, epicTitle: string, epicBranch: string, baseBranch: string): Promise<boolean>;
37
- //# sourceMappingURL=deliver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"deliver.d.ts","sourceRoot":"","sources":["../../../../src/scripts/once/deliver/deliver.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAC;AAyB7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAgET;AAID;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,WAAW,EACnB,MAAM,EAAE,aAAa,EACrB,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,OAAO,UAAQ,EACf,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAiKlB;AAID;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,WAAW,EACnB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CA6FlB"}