kantban-cli 0.1.7 → 0.1.8

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 (117) hide show
  1. package/dist/client.d.ts +3 -0
  2. package/dist/client.d.ts.map +1 -1
  3. package/dist/client.js +54 -0
  4. package/dist/client.js.map +1 -1
  5. package/dist/commands/cron.js +2 -2
  6. package/dist/commands/cron.js.map +1 -1
  7. package/dist/commands/pipeline-init.d.ts +2 -0
  8. package/dist/commands/pipeline-init.d.ts.map +1 -0
  9. package/dist/commands/pipeline-init.js +100 -0
  10. package/dist/commands/pipeline-init.js.map +1 -0
  11. package/dist/commands/pipeline.d.ts.map +1 -1
  12. package/dist/commands/pipeline.js +621 -44
  13. package/dist/commands/pipeline.js.map +1 -1
  14. package/dist/lib/advisor.d.ts +108 -0
  15. package/dist/lib/advisor.d.ts.map +1 -0
  16. package/dist/lib/advisor.js +139 -0
  17. package/dist/lib/advisor.js.map +1 -0
  18. package/dist/lib/checkpoint.d.ts +15 -0
  19. package/dist/lib/checkpoint.d.ts.map +1 -0
  20. package/dist/lib/checkpoint.js +49 -0
  21. package/dist/lib/checkpoint.js.map +1 -0
  22. package/dist/lib/constraint-evaluator.d.ts.map +1 -1
  23. package/dist/lib/constraint-evaluator.js +13 -4
  24. package/dist/lib/constraint-evaluator.js.map +1 -1
  25. package/dist/lib/cost-tracker.d.ts +46 -0
  26. package/dist/lib/cost-tracker.d.ts.map +1 -0
  27. package/dist/lib/cost-tracker.js +120 -0
  28. package/dist/lib/cost-tracker.js.map +1 -0
  29. package/dist/lib/evaluator.d.ts +17 -0
  30. package/dist/lib/evaluator.d.ts.map +1 -0
  31. package/dist/lib/evaluator.js +71 -0
  32. package/dist/lib/evaluator.js.map +1 -0
  33. package/dist/lib/event-emitter.d.ts +28 -0
  34. package/dist/lib/event-emitter.d.ts.map +1 -0
  35. package/dist/lib/event-emitter.js +100 -0
  36. package/dist/lib/event-emitter.js.map +1 -0
  37. package/dist/lib/gate-config.d.ts +7 -0
  38. package/dist/lib/gate-config.d.ts.map +1 -0
  39. package/dist/lib/gate-config.js +68 -0
  40. package/dist/lib/gate-config.js.map +1 -0
  41. package/dist/lib/gate-proxy-server.d.ts +16 -0
  42. package/dist/lib/gate-proxy-server.d.ts.map +1 -0
  43. package/dist/lib/gate-proxy-server.js +385 -0
  44. package/dist/lib/gate-proxy-server.js.map +1 -0
  45. package/dist/lib/gate-proxy.d.ts +46 -0
  46. package/dist/lib/gate-proxy.d.ts.map +1 -0
  47. package/dist/lib/gate-proxy.js +104 -0
  48. package/dist/lib/gate-proxy.js.map +1 -0
  49. package/dist/lib/gate-runner.d.ts +13 -0
  50. package/dist/lib/gate-runner.d.ts.map +1 -0
  51. package/dist/lib/gate-runner.js +104 -0
  52. package/dist/lib/gate-runner.js.map +1 -0
  53. package/dist/lib/gate-snapshot.d.ts +12 -0
  54. package/dist/lib/gate-snapshot.d.ts.map +1 -0
  55. package/dist/lib/gate-snapshot.js +49 -0
  56. package/dist/lib/gate-snapshot.js.map +1 -0
  57. package/dist/lib/light-call.d.ts +37 -0
  58. package/dist/lib/light-call.d.ts.map +1 -0
  59. package/dist/lib/light-call.js +62 -0
  60. package/dist/lib/light-call.js.map +1 -0
  61. package/dist/lib/logger.d.ts +2 -0
  62. package/dist/lib/logger.d.ts.map +1 -1
  63. package/dist/lib/logger.js +55 -9
  64. package/dist/lib/logger.js.map +1 -1
  65. package/dist/lib/mcp-config.d.ts +15 -0
  66. package/dist/lib/mcp-config.d.ts.map +1 -1
  67. package/dist/lib/mcp-config.js +70 -6
  68. package/dist/lib/mcp-config.js.map +1 -1
  69. package/dist/lib/orchestrator.d.ts +166 -12
  70. package/dist/lib/orchestrator.d.ts.map +1 -1
  71. package/dist/lib/orchestrator.js +1089 -69
  72. package/dist/lib/orchestrator.js.map +1 -1
  73. package/dist/lib/parse-utils.d.ts +6 -0
  74. package/dist/lib/parse-utils.d.ts.map +1 -0
  75. package/dist/lib/parse-utils.js +64 -0
  76. package/dist/lib/parse-utils.js.map +1 -0
  77. package/dist/lib/prompt-composer.d.ts +30 -1
  78. package/dist/lib/prompt-composer.d.ts.map +1 -1
  79. package/dist/lib/prompt-composer.js +162 -27
  80. package/dist/lib/prompt-composer.js.map +1 -1
  81. package/dist/lib/ralph-loop.d.ts +78 -4
  82. package/dist/lib/ralph-loop.d.ts.map +1 -1
  83. package/dist/lib/ralph-loop.js +249 -40
  84. package/dist/lib/ralph-loop.js.map +1 -1
  85. package/dist/lib/reaper.d.ts +14 -0
  86. package/dist/lib/reaper.d.ts.map +1 -0
  87. package/dist/lib/reaper.js +114 -0
  88. package/dist/lib/reaper.js.map +1 -0
  89. package/dist/lib/replanner.d.ts +49 -0
  90. package/dist/lib/replanner.d.ts.map +1 -0
  91. package/dist/lib/replanner.js +61 -0
  92. package/dist/lib/replanner.js.map +1 -0
  93. package/dist/lib/run-memory.d.ts +37 -0
  94. package/dist/lib/run-memory.d.ts.map +1 -0
  95. package/dist/lib/run-memory.js +115 -0
  96. package/dist/lib/run-memory.js.map +1 -0
  97. package/dist/lib/stream-parser.d.ts +20 -0
  98. package/dist/lib/stream-parser.d.ts.map +1 -0
  99. package/dist/lib/stream-parser.js +65 -0
  100. package/dist/lib/stream-parser.js.map +1 -0
  101. package/dist/lib/stuck-detector.d.ts +47 -0
  102. package/dist/lib/stuck-detector.d.ts.map +1 -0
  103. package/dist/lib/stuck-detector.js +105 -0
  104. package/dist/lib/stuck-detector.js.map +1 -0
  105. package/dist/lib/tool-profiles.d.ts +19 -0
  106. package/dist/lib/tool-profiles.d.ts.map +1 -0
  107. package/dist/lib/tool-profiles.js +22 -0
  108. package/dist/lib/tool-profiles.js.map +1 -0
  109. package/dist/lib/worktree.d.ts +12 -0
  110. package/dist/lib/worktree.d.ts.map +1 -0
  111. package/dist/lib/worktree.js +29 -0
  112. package/dist/lib/worktree.js.map +1 -0
  113. package/dist/lib/ws-client.d.ts +1 -1
  114. package/dist/lib/ws-client.d.ts.map +1 -1
  115. package/dist/lib/ws-client.js +5 -2
  116. package/dist/lib/ws-client.js.map +1 -1
  117. package/package.json +3 -1
@@ -0,0 +1,385 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * gate-proxy-server.ts — MCP stdio server for gate enforcement.
4
+ *
5
+ * Spawned by the pipeline orchestrator as a child process. Reads gate config
6
+ * from env vars, instantiates GateProxy, and exposes three MCP tools over
7
+ * JSON-RPC on stdin/stdout:
8
+ *
9
+ * - kantban_run_gates — Run column gates and report results
10
+ * - kantban_move_ticket — Run gates then forward move to KantBan API
11
+ * - kantban_complete_task — Run gates then forward complete to KantBan API
12
+ *
13
+ * Uses raw JSON-RPC (no @modelcontextprotocol/sdk dependency).
14
+ */
15
+ import { readFileSync } from 'node:fs';
16
+ import { createInterface } from 'node:readline';
17
+ import { parseGateConfig } from './gate-config.js';
18
+ import { runGates, formatGateErrors } from './gate-runner.js';
19
+ import { GateProxy } from './gate-proxy.js';
20
+ import { fetchWithRetry } from '../client.js';
21
+ // ── UUID validation ──────────────────────────────────────────────────────
22
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
23
+ function validateUuid(value, name) {
24
+ if (typeof value !== 'string' || !UUID_RE.test(value)) {
25
+ throw new Error(`Invalid ${name}: expected UUID, got "${String(value)}"`);
26
+ }
27
+ return value;
28
+ }
29
+ // ── env ──────────────────────────────────────────────────────────────────
30
+ const GATE_CONFIG_PATH = process.env['GATE_CONFIG_PATH'];
31
+ const COLUMN_ID = process.env['COLUMN_ID'];
32
+ const COLUMN_NAME = process.env['COLUMN_NAME'];
33
+ const PROJECT_ID = process.env['PROJECT_ID'];
34
+ const API_TOKEN = process.env['KANTBAN_API_TOKEN'];
35
+ const API_URL = process.env['KANTBAN_API_URL'];
36
+ function requireEnv(name, value) {
37
+ if (!value) {
38
+ process.stderr.write(`gate-proxy-server: missing required env var ${name}\n`);
39
+ process.exit(1);
40
+ }
41
+ return value;
42
+ }
43
+ const gateConfigPath = requireEnv('GATE_CONFIG_PATH', GATE_CONFIG_PATH);
44
+ const columnId = requireEnv('COLUMN_ID', COLUMN_ID);
45
+ const columnName = requireEnv('COLUMN_NAME', COLUMN_NAME);
46
+ const projectId = requireEnv('PROJECT_ID', PROJECT_ID);
47
+ const apiToken = requireEnv('KANTBAN_API_TOKEN', API_TOKEN);
48
+ const apiUrl = requireEnv('KANTBAN_API_URL', API_URL);
49
+ // ── gate config ──────────────────────────────────────────────────────────
50
+ const yamlContent = readFileSync(gateConfigPath, 'utf-8');
51
+ const gateConfig = parseGateConfig(yamlContent);
52
+ // ── API helpers ──────────────────────────────────────────────────────────
53
+ function apiHeaders() {
54
+ return {
55
+ 'Authorization': `Bearer ${apiToken}`,
56
+ 'Content-Type': 'application/json',
57
+ 'X-KantBan-Via': 'cli-gate-proxy',
58
+ };
59
+ }
60
+ async function apiPost(path, body) {
61
+ const url = new URL(path, apiUrl);
62
+ const res = await fetchWithRetry(url.toString(), {
63
+ method: 'POST',
64
+ headers: apiHeaders(),
65
+ body: JSON.stringify(body),
66
+ });
67
+ if (!res.ok) {
68
+ const text = await res.text();
69
+ throw new Error(`API error ${res.status}: ${text}`);
70
+ }
71
+ const json = (await res.json());
72
+ if (!json.success)
73
+ throw new Error('API responded with success: false');
74
+ return json.data;
75
+ }
76
+ async function apiPatch(path, body) {
77
+ const url = new URL(path, apiUrl);
78
+ const res = await fetchWithRetry(url.toString(), {
79
+ method: 'PATCH',
80
+ headers: apiHeaders(),
81
+ body: JSON.stringify(body),
82
+ });
83
+ if (!res.ok) {
84
+ const text = await res.text();
85
+ throw new Error(`API error ${res.status}: ${text}`);
86
+ }
87
+ const json = (await res.json());
88
+ if (!json.success)
89
+ throw new Error('API responded with success: false');
90
+ return json.data;
91
+ }
92
+ async function apiGet(path, params) {
93
+ const url = new URL(path, apiUrl);
94
+ if (params) {
95
+ for (const [k, v] of Object.entries(params)) {
96
+ url.searchParams.set(k, v);
97
+ }
98
+ }
99
+ const res = await fetchWithRetry(url.toString(), {
100
+ headers: apiHeaders(),
101
+ });
102
+ if (!res.ok) {
103
+ const text = await res.text();
104
+ throw new Error(`API error ${res.status}: ${text}`);
105
+ }
106
+ const json = (await res.json());
107
+ if (!json.success)
108
+ throw new Error('API responded with success: false');
109
+ return json.data;
110
+ }
111
+ // ── GateProxy deps ──────────────────────────────────────────────────────
112
+ const deps = {
113
+ runGates,
114
+ async forwardMoveTicket(args) {
115
+ const ticketProjectId = validateUuid(args['projectId'], 'projectId');
116
+ const ticketId = validateUuid(args['ticketId'], 'ticketId');
117
+ const body = { ...args };
118
+ delete body['projectId'];
119
+ delete body['ticketId'];
120
+ return apiPatch(`/projects/${ticketProjectId}/tickets/${ticketId}/move`, body);
121
+ },
122
+ async forwardCompleteTask(args) {
123
+ const projectId = validateUuid(args['projectId'], 'projectId');
124
+ const ticketId = validateUuid(args['ticketId'], 'ticketId');
125
+ const body = { ...args };
126
+ delete body['projectId'];
127
+ delete body['ticketId'];
128
+ return apiPost(`/projects/${projectId}/tickets/${ticketId}/complete`, body);
129
+ },
130
+ async getTicketGateWaivers(ticketId) {
131
+ try {
132
+ // Field values require both projectId and ticketId in the path.
133
+ // projectId is injected as an env var (PROJECT_ID) at server startup.
134
+ validateUuid(ticketId, 'ticketId');
135
+ const data = (await apiGet(`/projects/${projectId}/tickets/${ticketId}/field-values`));
136
+ const waiver = data.find((fv) => fv.field_name === 'gate_waiver');
137
+ if (!waiver)
138
+ return [];
139
+ if (Array.isArray(waiver.value)) {
140
+ return waiver.value.filter((v) => typeof v === 'string' && v.length > 0);
141
+ }
142
+ return [];
143
+ }
144
+ catch (err) {
145
+ process.stderr.write(`gate-proxy-server: waiver fetch failed (running all gates): ${err instanceof Error ? err.message : String(err)}\n`);
146
+ return [];
147
+ }
148
+ },
149
+ };
150
+ const proxy = new GateProxy(gateConfig, deps);
151
+ // ── Tool definitions ────────────────────────────────────────────────────
152
+ const TOOLS = [
153
+ {
154
+ name: 'kantban_run_gates',
155
+ description: 'Run all configured gates for the current column and report results. ' +
156
+ 'Use this to check gate status before attempting to move a ticket. ' +
157
+ 'Pass ticketId to filter out waived gates for that ticket.',
158
+ inputSchema: {
159
+ type: 'object',
160
+ properties: {
161
+ ticketId: { type: 'string', description: 'Ticket ID (UUID) — filters out waived gates for this ticket' },
162
+ },
163
+ required: [],
164
+ },
165
+ },
166
+ {
167
+ name: 'kantban_move_ticket',
168
+ description: 'Move a ticket to a different column. Gates are automatically enforced — ' +
169
+ 'if any required gate fails, the move is blocked and failure details are returned.',
170
+ inputSchema: {
171
+ type: 'object',
172
+ properties: {
173
+ projectId: { type: 'string', description: 'Project ID (UUID)' },
174
+ ticketId: { type: 'string', description: 'Ticket ID (UUID)' },
175
+ columnId: { type: 'string', description: 'Target column ID (UUID)' },
176
+ currentColumnName: { type: 'string', description: 'Current column name' },
177
+ handoff: {
178
+ type: 'object',
179
+ description: 'Structured handoff data for the next pipeline stage',
180
+ additionalProperties: true,
181
+ },
182
+ },
183
+ required: ['projectId', 'ticketId', 'columnId'],
184
+ },
185
+ },
186
+ {
187
+ name: 'kantban_complete_task',
188
+ description: 'Mark a ticket as complete. Gates are automatically enforced — ' +
189
+ 'if any required gate fails, the completion is blocked and failure details are returned.',
190
+ inputSchema: {
191
+ type: 'object',
192
+ properties: {
193
+ projectId: { type: 'string', description: 'Project ID (UUID)' },
194
+ ticketId: { type: 'string', description: 'Ticket ID (UUID)' },
195
+ currentColumnName: { type: 'string', description: 'Current column name' },
196
+ moveToColumn: { type: 'string', description: 'Column name to move the ticket to (e.g. "Done")' },
197
+ completionComment: { type: 'string', description: 'Comment to add upon completion' },
198
+ handoff: {
199
+ type: 'object',
200
+ description: 'Structured handoff data for the next pipeline stage',
201
+ additionalProperties: true,
202
+ },
203
+ },
204
+ required: ['projectId', 'ticketId'],
205
+ },
206
+ },
207
+ ];
208
+ // ── Tool handlers ───────────────────────────────────────────────────────
209
+ async function handleToolCall(name, args) {
210
+ try {
211
+ switch (name) {
212
+ case 'kantban_run_gates': {
213
+ const ticketIdArg = args['ticketId'];
214
+ if (ticketIdArg)
215
+ validateUuid(ticketIdArg, 'ticketId');
216
+ const result = await proxy.handleRunGates(columnName, ticketIdArg);
217
+ return {
218
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
219
+ };
220
+ }
221
+ case 'kantban_move_ticket': {
222
+ const moveProjectId = validateUuid(args['projectId'], 'projectId');
223
+ const moveTicketId = validateUuid(args['ticketId'], 'ticketId');
224
+ const moveColumnId = validateUuid(args['columnId'], 'columnId');
225
+ const result = await proxy.handleMoveTicket({
226
+ projectId: moveProjectId,
227
+ ticketId: moveTicketId,
228
+ columnId: moveColumnId,
229
+ currentColumnName: args['currentColumnName'] ?? columnName,
230
+ args: {
231
+ ...(args['handoff'] !== undefined ? { handoff: args['handoff'] } : {}),
232
+ ...(args['column_id'] !== undefined ? { column_id: args['column_id'] } : {}),
233
+ },
234
+ });
235
+ const isError = result.error === 'GATE_FAILURE';
236
+ if (isError && result.results) {
237
+ process.stderr.write(`gate-proxy-server: move blocked\n${formatGateErrors(result.results)}`);
238
+ }
239
+ return {
240
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
241
+ ...(isError ? { isError: true } : {}),
242
+ };
243
+ }
244
+ case 'kantban_complete_task': {
245
+ const completeProjectId = validateUuid(args['projectId'], 'projectId');
246
+ const completeTicketId = validateUuid(args['ticketId'], 'ticketId');
247
+ const result = await proxy.handleCompleteTask({
248
+ projectId: completeProjectId,
249
+ ticketId: completeTicketId,
250
+ currentColumnName: args['currentColumnName'] ?? columnName,
251
+ args: {
252
+ ...(args['moveToColumn'] !== undefined ? { moveToColumn: args['moveToColumn'] } : {}),
253
+ ...(args['completionComment'] !== undefined ? { completionComment: args['completionComment'] } : {}),
254
+ ...(args['handoff'] !== undefined ? { handoff: args['handoff'] } : {}),
255
+ },
256
+ });
257
+ const isError = result.error === 'GATE_FAILURE';
258
+ if (isError && result.results) {
259
+ process.stderr.write(`gate-proxy-server: complete blocked\n${formatGateErrors(result.results)}`);
260
+ }
261
+ return {
262
+ content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
263
+ ...(isError ? { isError: true } : {}),
264
+ };
265
+ }
266
+ default:
267
+ return {
268
+ content: [{ type: 'text', text: `Unknown tool: ${name}` }],
269
+ isError: true,
270
+ };
271
+ }
272
+ }
273
+ catch (err) {
274
+ const message = err instanceof Error ? err.message : String(err);
275
+ return {
276
+ content: [{ type: 'text', text: `Error: ${message}` }],
277
+ isError: true,
278
+ };
279
+ }
280
+ }
281
+ // ── JSON-RPC dispatch ───────────────────────────────────────────────────
282
+ function sendResponse(response) {
283
+ const json = JSON.stringify(response);
284
+ process.stdout.write(json + '\n');
285
+ }
286
+ async function handleMessage(msg) {
287
+ const { id, method, params } = msg;
288
+ switch (method) {
289
+ case 'initialize': {
290
+ sendResponse({
291
+ jsonrpc: '2.0',
292
+ id,
293
+ result: {
294
+ protocolVersion: '2024-11-05',
295
+ capabilities: { tools: {} },
296
+ serverInfo: {
297
+ name: 'kantban-gates',
298
+ version: '0.1.0',
299
+ },
300
+ },
301
+ });
302
+ return;
303
+ }
304
+ case 'notifications/initialized': {
305
+ // Client acknowledgement — no response needed for notifications
306
+ return;
307
+ }
308
+ case 'tools/list': {
309
+ sendResponse({
310
+ jsonrpc: '2.0',
311
+ id,
312
+ result: { tools: TOOLS },
313
+ });
314
+ return;
315
+ }
316
+ case 'tools/call': {
317
+ const toolName = params?.['name'];
318
+ const toolArgs = params?.['arguments'] ?? {};
319
+ if (!toolName) {
320
+ sendResponse({
321
+ jsonrpc: '2.0',
322
+ id,
323
+ error: { code: -32602, message: 'Missing tool name' },
324
+ });
325
+ return;
326
+ }
327
+ const result = await handleToolCall(toolName, toolArgs);
328
+ sendResponse({
329
+ jsonrpc: '2.0',
330
+ id,
331
+ result,
332
+ });
333
+ return;
334
+ }
335
+ case 'ping': {
336
+ sendResponse({ jsonrpc: '2.0', id, result: {} });
337
+ return;
338
+ }
339
+ default: {
340
+ // Unknown method — return method not found per JSON-RPC spec
341
+ if (method.startsWith('notifications/')) {
342
+ // Notifications don't get responses
343
+ return;
344
+ }
345
+ sendResponse({
346
+ jsonrpc: '2.0',
347
+ id,
348
+ error: { code: -32601, message: `Method not found: ${method}` },
349
+ });
350
+ }
351
+ }
352
+ }
353
+ // ── stdin reader ────────────────────────────────────────────────────────
354
+ const rl = createInterface({ input: process.stdin });
355
+ // Serialize message processing to prevent concurrent double-moves
356
+ let messageQueue = Promise.resolve();
357
+ rl.on('line', (line) => {
358
+ const trimmed = line.trim();
359
+ if (!trimmed)
360
+ return;
361
+ let msg;
362
+ try {
363
+ msg = JSON.parse(trimmed);
364
+ }
365
+ catch {
366
+ sendResponse({
367
+ jsonrpc: '2.0',
368
+ id: null,
369
+ error: { code: -32700, message: 'Parse error' },
370
+ });
371
+ return;
372
+ }
373
+ messageQueue = messageQueue.then(() => handleMessage(msg)).catch((err) => {
374
+ process.stderr.write(`gate-proxy-server: unhandled error in message handler: ${err instanceof Error ? err.message : String(err)}\n`);
375
+ });
376
+ });
377
+ rl.on('close', () => {
378
+ process.exit(0);
379
+ });
380
+ // Suppress unhandled rejection crashes — log to stderr and continue
381
+ process.on('unhandledRejection', (err) => {
382
+ process.stderr.write(`gate-proxy-server: unhandled rejection: ${err instanceof Error ? err.message : String(err)}\n`);
383
+ });
384
+ process.stderr.write(`gate-proxy-server: started (column="${columnName}", gates=${gateConfig.default.length})\n`);
385
+ //# sourceMappingURL=gate-proxy-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-proxy-server.js","sourceRoot":"","sources":["../../src/lib/gate-proxy-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { GateConfig, GateDefinition, GateResult } from '@kantban/types';
2
+ export interface GateProxyDeps {
3
+ runGates: (gates: GateDefinition[], options?: {
4
+ cwd?: string;
5
+ env?: Record<string, string>;
6
+ totalTimeoutMs?: number;
7
+ }) => Promise<GateResult[]>;
8
+ forwardMoveTicket: (args: Record<string, unknown>) => Promise<unknown>;
9
+ forwardCompleteTask: (args: Record<string, unknown>) => Promise<unknown>;
10
+ getTicketGateWaivers: (ticketId: string) => Promise<string[]>;
11
+ }
12
+ export interface RunGatesResult {
13
+ passed: boolean;
14
+ results: GateResult[];
15
+ }
16
+ export interface MoveArgs {
17
+ projectId: string;
18
+ ticketId: string;
19
+ columnId: string;
20
+ currentColumnName: string;
21
+ args: Record<string, unknown>;
22
+ }
23
+ export interface CompleteArgs {
24
+ projectId: string;
25
+ ticketId: string;
26
+ currentColumnName: string;
27
+ args: Record<string, unknown>;
28
+ }
29
+ export interface InterceptResult {
30
+ error?: 'GATE_FAILURE';
31
+ message?: string;
32
+ formatted?: string;
33
+ results?: GateResult[];
34
+ hint?: string;
35
+ forwardResult?: unknown;
36
+ }
37
+ export declare class GateProxy {
38
+ private config;
39
+ private deps;
40
+ constructor(config: GateConfig, deps: GateProxyDeps);
41
+ private buildRunOptions;
42
+ handleRunGates(columnName: string, ticketId?: string): Promise<RunGatesResult>;
43
+ handleMoveTicket(move: MoveArgs): Promise<InterceptResult>;
44
+ handleCompleteTask(complete: CompleteArgs): Promise<InterceptResult>;
45
+ }
46
+ //# sourceMappingURL=gate-proxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-proxy.d.ts","sourceRoot":"","sources":["../../src/lib/gate-proxy.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE7E,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,EAAE,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAAC,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;IAChJ,iBAAiB,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvE,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,cAAc,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,IAAI,CAAgB;gBAEhB,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa;IAKnD,OAAO,CAAC,eAAe;IAUjB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAiB9E,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,eAAe,CAAC;IAwC1D,kBAAkB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;CAoC3E"}
@@ -0,0 +1,104 @@
1
+ import { resolveGatesForColumn, parseTimeout } from './gate-config.js';
2
+ import { formatGateErrors } from './gate-runner.js';
3
+ export class GateProxy {
4
+ config;
5
+ deps;
6
+ constructor(config, deps) {
7
+ this.config = config;
8
+ this.deps = deps;
9
+ }
10
+ buildRunOptions() {
11
+ const opts = {};
12
+ if (this.config.settings?.cwd !== undefined)
13
+ opts.cwd = this.config.settings.cwd;
14
+ if (this.config.settings?.env !== undefined)
15
+ opts.env = this.config.settings.env;
16
+ if (this.config.settings?.total_timeout !== undefined) {
17
+ opts.totalTimeoutMs = parseTimeout(this.config.settings.total_timeout);
18
+ }
19
+ return opts;
20
+ }
21
+ async handleRunGates(columnName, ticketId) {
22
+ const allGates = resolveGatesForColumn(this.config, columnName);
23
+ let gates = allGates;
24
+ if (ticketId) {
25
+ const waivers = await this.deps.getTicketGateWaivers(ticketId);
26
+ const waiverSet = new Set(waivers);
27
+ gates = allGates.filter((g) => !waiverSet.has(g.name));
28
+ }
29
+ const results = await this.deps.runGates(gates, this.buildRunOptions());
30
+ return {
31
+ passed: results.filter((r) => r.required).every((r) => r.passed),
32
+ results,
33
+ };
34
+ }
35
+ async handleMoveTicket(move) {
36
+ const allGates = resolveGatesForColumn(this.config, move.currentColumnName);
37
+ // Filter out waived gates
38
+ const waivers = await this.deps.getTicketGateWaivers(move.ticketId);
39
+ const waiverSet = new Set(waivers);
40
+ const gates = allGates.filter((g) => !waiverSet.has(g.name));
41
+ let results;
42
+ try {
43
+ results = await this.deps.runGates(gates, this.buildRunOptions());
44
+ }
45
+ catch (err) {
46
+ return {
47
+ error: 'GATE_FAILURE',
48
+ message: `Gate evaluation error: ${err instanceof Error ? err.message : String(err)}`,
49
+ hint: 'Fix the gate environment and retry',
50
+ };
51
+ }
52
+ const requiredFailures = results.filter((r) => r.required && !r.passed);
53
+ if (requiredFailures.length > 0) {
54
+ return {
55
+ error: 'GATE_FAILURE',
56
+ message: `Cannot move ticket — ${requiredFailures.length} required gate(s) failed`,
57
+ formatted: formatGateErrors(results.filter((r) => r.required)),
58
+ results,
59
+ hint: 'Fix the failing gate(s) and try move_ticket again',
60
+ };
61
+ }
62
+ const forwardResult = await this.deps.forwardMoveTicket({
63
+ ...move.args,
64
+ projectId: move.projectId,
65
+ ticketId: move.ticketId,
66
+ column_id: move.columnId,
67
+ });
68
+ return { forwardResult };
69
+ }
70
+ async handleCompleteTask(complete) {
71
+ const allGates = resolveGatesForColumn(this.config, complete.currentColumnName);
72
+ const waivers = await this.deps.getTicketGateWaivers(complete.ticketId);
73
+ const waiverSet = new Set(waivers);
74
+ const gates = allGates.filter((g) => !waiverSet.has(g.name));
75
+ let results;
76
+ try {
77
+ results = await this.deps.runGates(gates, this.buildRunOptions());
78
+ }
79
+ catch (err) {
80
+ return {
81
+ error: 'GATE_FAILURE',
82
+ message: `Gate evaluation error: ${err instanceof Error ? err.message : String(err)}`,
83
+ hint: 'Fix the gate environment and retry',
84
+ };
85
+ }
86
+ const requiredFailures = results.filter((r) => r.required && !r.passed);
87
+ if (requiredFailures.length > 0) {
88
+ return {
89
+ error: 'GATE_FAILURE',
90
+ message: `Cannot complete task — ${requiredFailures.length} required gate(s) failed`,
91
+ formatted: formatGateErrors(results.filter((r) => r.required)),
92
+ results,
93
+ hint: 'Fix the failing gate(s) and try complete_task again',
94
+ };
95
+ }
96
+ const forwardResult = await this.deps.forwardCompleteTask({
97
+ ...complete.args,
98
+ projectId: complete.projectId,
99
+ ticketId: complete.ticketId,
100
+ });
101
+ return { forwardResult };
102
+ }
103
+ }
104
+ //# sourceMappingURL=gate-proxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-proxy.js","sourceRoot":"","sources":["../../src/lib/gate-proxy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { GateDefinition, GateResult } from '@kantban/types';
2
+ export interface RunOptions {
3
+ timeoutMs?: number;
4
+ totalTimeoutMs?: number;
5
+ cwd?: string;
6
+ env?: Record<string, string>;
7
+ maxBuffer?: number;
8
+ }
9
+ export declare function runGate(gate: GateDefinition, options?: RunOptions): Promise<GateResult>;
10
+ /** Format gate failures into a structured error string for agent/CLI display. */
11
+ export declare function formatGateErrors(results: GateResult[]): string;
12
+ export declare function runGates(gates: GateDefinition[], options?: RunOptions): Promise<GateResult[]>;
13
+ //# sourceMappingURL=gate-runner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gate-runner.d.ts","sourceRoot":"","sources":["../../src/lib/gate-runner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEjE,MAAM,WAAW,UAAU;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAsB,OAAO,CAC3B,IAAI,EAAE,cAAc,EACpB,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,UAAU,CAAC,CAkDrB;AAED,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,MAAM,CAgB9D;AAED,wBAAsB,QAAQ,CAC5B,KAAK,EAAE,cAAc,EAAE,EACvB,OAAO,GAAE,UAAe,GACvB,OAAO,CAAC,UAAU,EAAE,CAAC,CAiCvB"}