kantban-cli 0.1.8 → 0.1.10

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 (155) hide show
  1. package/dist/chunk-ZCUIGFSP.js +4111 -0
  2. package/dist/chunk-ZCUIGFSP.js.map +1 -0
  3. package/dist/context-7YDNTI3P.js +30 -0
  4. package/dist/context-7YDNTI3P.js.map +1 -0
  5. package/dist/cron-OKQP6QDF.js +112 -0
  6. package/dist/cron-OKQP6QDF.js.map +1 -0
  7. package/dist/index.d.ts +0 -2
  8. package/dist/index.js +179 -44
  9. package/dist/index.js.map +1 -1
  10. package/dist/pipeline-HTGCXNPL.js +4049 -0
  11. package/dist/pipeline-HTGCXNPL.js.map +1 -0
  12. package/dist/pipeline-init-IGZZOOLK.js +103 -0
  13. package/dist/pipeline-init-IGZZOOLK.js.map +1 -0
  14. package/dist/status-4GFXMVIM.js +128 -0
  15. package/dist/status-4GFXMVIM.js.map +1 -0
  16. package/dist/work-2V33NZAT.js +81 -0
  17. package/dist/work-2V33NZAT.js.map +1 -0
  18. package/package.json +5 -4
  19. package/dist/client.d.ts +0 -38
  20. package/dist/client.d.ts.map +0 -1
  21. package/dist/client.js +0 -163
  22. package/dist/client.js.map +0 -1
  23. package/dist/commands/context.d.ts +0 -3
  24. package/dist/commands/context.d.ts.map +0 -1
  25. package/dist/commands/context.js +0 -27
  26. package/dist/commands/context.js.map +0 -1
  27. package/dist/commands/cron.d.ts +0 -3
  28. package/dist/commands/cron.d.ts.map +0 -1
  29. package/dist/commands/cron.js +0 -106
  30. package/dist/commands/cron.js.map +0 -1
  31. package/dist/commands/pipeline-init.d.ts +0 -2
  32. package/dist/commands/pipeline-init.d.ts.map +0 -1
  33. package/dist/commands/pipeline-init.js +0 -100
  34. package/dist/commands/pipeline-init.js.map +0 -1
  35. package/dist/commands/pipeline.d.ts +0 -4
  36. package/dist/commands/pipeline.d.ts.map +0 -1
  37. package/dist/commands/pipeline.js +0 -1222
  38. package/dist/commands/pipeline.js.map +0 -1
  39. package/dist/commands/status.d.ts +0 -3
  40. package/dist/commands/status.d.ts.map +0 -1
  41. package/dist/commands/status.js +0 -135
  42. package/dist/commands/status.js.map +0 -1
  43. package/dist/commands/work.d.ts +0 -3
  44. package/dist/commands/work.d.ts.map +0 -1
  45. package/dist/commands/work.js +0 -76
  46. package/dist/commands/work.js.map +0 -1
  47. package/dist/index.d.ts.map +0 -1
  48. package/dist/lib/advisor.d.ts +0 -108
  49. package/dist/lib/advisor.d.ts.map +0 -1
  50. package/dist/lib/advisor.js +0 -139
  51. package/dist/lib/advisor.js.map +0 -1
  52. package/dist/lib/checkpoint.d.ts +0 -15
  53. package/dist/lib/checkpoint.d.ts.map +0 -1
  54. package/dist/lib/checkpoint.js +0 -49
  55. package/dist/lib/checkpoint.js.map +0 -1
  56. package/dist/lib/constraint-evaluator.d.ts +0 -40
  57. package/dist/lib/constraint-evaluator.d.ts.map +0 -1
  58. package/dist/lib/constraint-evaluator.js +0 -189
  59. package/dist/lib/constraint-evaluator.js.map +0 -1
  60. package/dist/lib/cost-tracker.d.ts +0 -46
  61. package/dist/lib/cost-tracker.d.ts.map +0 -1
  62. package/dist/lib/cost-tracker.js +0 -120
  63. package/dist/lib/cost-tracker.js.map +0 -1
  64. package/dist/lib/evaluator.d.ts +0 -17
  65. package/dist/lib/evaluator.d.ts.map +0 -1
  66. package/dist/lib/evaluator.js +0 -71
  67. package/dist/lib/evaluator.js.map +0 -1
  68. package/dist/lib/event-emitter.d.ts +0 -28
  69. package/dist/lib/event-emitter.d.ts.map +0 -1
  70. package/dist/lib/event-emitter.js +0 -100
  71. package/dist/lib/event-emitter.js.map +0 -1
  72. package/dist/lib/event-queue.d.ts +0 -28
  73. package/dist/lib/event-queue.d.ts.map +0 -1
  74. package/dist/lib/event-queue.js +0 -73
  75. package/dist/lib/event-queue.js.map +0 -1
  76. package/dist/lib/gate-config.d.ts +0 -7
  77. package/dist/lib/gate-config.d.ts.map +0 -1
  78. package/dist/lib/gate-config.js +0 -68
  79. package/dist/lib/gate-config.js.map +0 -1
  80. package/dist/lib/gate-proxy-server.d.ts +0 -16
  81. package/dist/lib/gate-proxy-server.d.ts.map +0 -1
  82. package/dist/lib/gate-proxy-server.js +0 -385
  83. package/dist/lib/gate-proxy-server.js.map +0 -1
  84. package/dist/lib/gate-proxy.d.ts +0 -46
  85. package/dist/lib/gate-proxy.d.ts.map +0 -1
  86. package/dist/lib/gate-proxy.js +0 -104
  87. package/dist/lib/gate-proxy.js.map +0 -1
  88. package/dist/lib/gate-runner.d.ts +0 -13
  89. package/dist/lib/gate-runner.d.ts.map +0 -1
  90. package/dist/lib/gate-runner.js +0 -104
  91. package/dist/lib/gate-runner.js.map +0 -1
  92. package/dist/lib/gate-snapshot.d.ts +0 -12
  93. package/dist/lib/gate-snapshot.d.ts.map +0 -1
  94. package/dist/lib/gate-snapshot.js +0 -49
  95. package/dist/lib/gate-snapshot.js.map +0 -1
  96. package/dist/lib/light-call.d.ts +0 -37
  97. package/dist/lib/light-call.d.ts.map +0 -1
  98. package/dist/lib/light-call.js +0 -62
  99. package/dist/lib/light-call.js.map +0 -1
  100. package/dist/lib/logger.d.ts +0 -22
  101. package/dist/lib/logger.d.ts.map +0 -1
  102. package/dist/lib/logger.js +0 -98
  103. package/dist/lib/logger.js.map +0 -1
  104. package/dist/lib/mcp-config.d.ts +0 -24
  105. package/dist/lib/mcp-config.d.ts.map +0 -1
  106. package/dist/lib/mcp-config.js +0 -115
  107. package/dist/lib/mcp-config.js.map +0 -1
  108. package/dist/lib/orchestrator.d.ts +0 -392
  109. package/dist/lib/orchestrator.d.ts.map +0 -1
  110. package/dist/lib/orchestrator.js +0 -1636
  111. package/dist/lib/orchestrator.js.map +0 -1
  112. package/dist/lib/parse-utils.d.ts +0 -6
  113. package/dist/lib/parse-utils.d.ts.map +0 -1
  114. package/dist/lib/parse-utils.js +0 -64
  115. package/dist/lib/parse-utils.js.map +0 -1
  116. package/dist/lib/prompt-composer.d.ts +0 -131
  117. package/dist/lib/prompt-composer.d.ts.map +0 -1
  118. package/dist/lib/prompt-composer.js +0 -317
  119. package/dist/lib/prompt-composer.js.map +0 -1
  120. package/dist/lib/ralph-loop.d.ts +0 -123
  121. package/dist/lib/ralph-loop.d.ts.map +0 -1
  122. package/dist/lib/ralph-loop.js +0 -383
  123. package/dist/lib/ralph-loop.js.map +0 -1
  124. package/dist/lib/reaper.d.ts +0 -14
  125. package/dist/lib/reaper.d.ts.map +0 -1
  126. package/dist/lib/reaper.js +0 -114
  127. package/dist/lib/reaper.js.map +0 -1
  128. package/dist/lib/replanner.d.ts +0 -49
  129. package/dist/lib/replanner.d.ts.map +0 -1
  130. package/dist/lib/replanner.js +0 -61
  131. package/dist/lib/replanner.js.map +0 -1
  132. package/dist/lib/run-memory.d.ts +0 -37
  133. package/dist/lib/run-memory.d.ts.map +0 -1
  134. package/dist/lib/run-memory.js +0 -115
  135. package/dist/lib/run-memory.js.map +0 -1
  136. package/dist/lib/stream-parser.d.ts +0 -20
  137. package/dist/lib/stream-parser.d.ts.map +0 -1
  138. package/dist/lib/stream-parser.js +0 -65
  139. package/dist/lib/stream-parser.js.map +0 -1
  140. package/dist/lib/stuck-detector.d.ts +0 -47
  141. package/dist/lib/stuck-detector.d.ts.map +0 -1
  142. package/dist/lib/stuck-detector.js +0 -105
  143. package/dist/lib/stuck-detector.js.map +0 -1
  144. package/dist/lib/tool-profiles.d.ts +0 -19
  145. package/dist/lib/tool-profiles.d.ts.map +0 -1
  146. package/dist/lib/tool-profiles.js +0 -22
  147. package/dist/lib/tool-profiles.js.map +0 -1
  148. package/dist/lib/worktree.d.ts +0 -12
  149. package/dist/lib/worktree.d.ts.map +0 -1
  150. package/dist/lib/worktree.js +0 -29
  151. package/dist/lib/worktree.js.map +0 -1
  152. package/dist/lib/ws-client.d.ts +0 -31
  153. package/dist/lib/ws-client.d.ts.map +0 -1
  154. package/dist/lib/ws-client.js +0 -113
  155. package/dist/lib/ws-client.js.map +0 -1
@@ -1,104 +0,0 @@
1
- import { execFile } from 'node:child_process';
2
- import { parseTimeout } from './gate-config.js';
3
- export async function runGate(gate, options = {}) {
4
- const timeoutMs = gate.timeout ? parseTimeout(gate.timeout) : (options.timeoutMs ?? 60_000);
5
- const start = Date.now();
6
- return new Promise((resolve) => {
7
- // SECURITY: gate.run is an operator-authored shell command from pipeline.gates.yaml.
8
- // It is executed with full process privileges via `sh -c`. This is intentional —
9
- // gates are trusted operator code, not user input. If gate config sources are ever
10
- // extended to accept user-supplied values, sanitization must be added here.
11
- const child = execFile('sh', ['-c', gate.run], {
12
- timeout: timeoutMs,
13
- cwd: options.cwd,
14
- env: { ...process.env, ...options.env },
15
- maxBuffer: options.maxBuffer ?? 1024 * 1024, // 1MB output cap
16
- }, (error, stdout, stderr) => {
17
- const duration_ms = Date.now() - start;
18
- const output = (stdout + stderr).trim();
19
- const timed_out = error?.killed === true;
20
- const buffer_exceeded = error?.code === 'ERR_CHILD_PROCESS_STDIO_MAXBUFFER';
21
- if (error) {
22
- let annotation = '';
23
- if (timed_out)
24
- annotation = `\n[TIMED OUT after ${timeoutMs}ms]`;
25
- else if (buffer_exceeded)
26
- annotation = `\n[OUTPUT TRUNCATED — buffer limit exceeded]`;
27
- resolve({
28
- name: gate.name,
29
- passed: false,
30
- required: gate.required ?? true,
31
- duration_ms,
32
- output: output + annotation,
33
- stderr: stderr.trim(),
34
- exit_code: child.exitCode ?? (typeof error.code === 'number' ? error.code : 1),
35
- timed_out: timed_out || buffer_exceeded,
36
- });
37
- return;
38
- }
39
- resolve({
40
- name: gate.name,
41
- passed: true,
42
- required: gate.required ?? true,
43
- duration_ms,
44
- output,
45
- stderr: stderr.trim(),
46
- exit_code: 0,
47
- timed_out: false,
48
- });
49
- });
50
- });
51
- }
52
- /** Format gate failures into a structured error string for agent/CLI display. */
53
- export function formatGateErrors(results) {
54
- const failures = results.filter((r) => !r.passed);
55
- if (failures.length === 0)
56
- return 'All gates passed.';
57
- return failures
58
- .map((r) => {
59
- const lines = [`Gate "${r.name}" (${r.required ? 'required' : 'advisory'}): FAILED`];
60
- lines.push(` Exit code: ${r.exit_code}`);
61
- if (r.timed_out)
62
- lines.push(' Timed out: yes');
63
- if (r.output) {
64
- const stderr = r.output.split('\n').slice(-20).join('\n');
65
- lines.push(` Output:\n ${stderr.replace(/\n/g, '\n ')}`);
66
- }
67
- return lines.join('\n');
68
- })
69
- .join('\n\n');
70
- }
71
- export async function runGates(gates, options = {}) {
72
- const results = [];
73
- const totalStart = Date.now();
74
- for (const gate of gates) {
75
- // Check total timeout
76
- if (options.totalTimeoutMs) {
77
- const elapsed = Date.now() - totalStart;
78
- if (elapsed >= options.totalTimeoutMs) {
79
- // Remaining gates get timed-out results
80
- results.push({
81
- name: gate.name,
82
- passed: false,
83
- required: gate.required ?? true,
84
- duration_ms: 0,
85
- output: '[SKIPPED — total timeout exceeded]',
86
- stderr: '',
87
- exit_code: -1,
88
- timed_out: true,
89
- });
90
- continue;
91
- }
92
- // Reduce per-gate timeout by elapsed time
93
- const remainingMs = options.totalTimeoutMs - elapsed;
94
- const gateTimeout = gate.timeout ? parseTimeout(gate.timeout) : (options.timeoutMs ?? 60_000);
95
- const effectiveTimeout = Math.min(gateTimeout, remainingMs);
96
- results.push(await runGate(gate, { ...options, timeoutMs: effectiveTimeout }));
97
- }
98
- else {
99
- results.push(await runGate(gate, options));
100
- }
101
- }
102
- return results;
103
- }
104
- //# sourceMappingURL=gate-runner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gate-runner.js","sourceRoot":"","sources":["../../src/lib/gate-runner.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import type { GateResult, GateSnapshot, GateDelta } from '@kantban/types';
2
- export declare function computeDelta(previous: GateSnapshot | undefined, currentResults: GateResult[]): GateDelta;
3
- export declare class GateSnapshotStore {
4
- private snapshots;
5
- record(ticketId: string, iteration: number, results: GateResult[]): GateSnapshot;
6
- getLatest(ticketId: string): GateSnapshot | undefined;
7
- getRecent(ticketId: string, count: number): GateSnapshot[];
8
- clear(ticketId: string): void;
9
- /** Returns all ticket IDs that have at least one snapshot recorded. */
10
- getAllTicketIds(): string[];
11
- }
12
- //# sourceMappingURL=gate-snapshot.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gate-snapshot.d.ts","sourceRoot":"","sources":["../../src/lib/gate-snapshot.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAI1E,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,YAAY,GAAG,SAAS,EAClC,cAAc,EAAE,UAAU,EAAE,GAC3B,SAAS,CAUX;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,SAAS,CAA0C;IAE3D,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,YAAY;IAsBhF,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAKrD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE;IAK1D,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI7B,uEAAuE;IACvE,eAAe,IAAI,MAAM,EAAE;CAG5B"}
@@ -1,49 +0,0 @@
1
- const MAX_SNAPSHOTS_PER_TICKET = 100;
2
- export function computeDelta(previous, currentResults) {
3
- if (!previous)
4
- return 'first_check';
5
- const prevPassing = previous.results.filter((r) => r.passed).length;
6
- const currPassing = currentResults.filter((r) => r.passed).length;
7
- if (currPassing > prevPassing)
8
- return 'improved';
9
- if (currPassing < prevPassing)
10
- return 'regressed';
11
- return 'same';
12
- }
13
- export class GateSnapshotStore {
14
- snapshots = new Map();
15
- record(ticketId, iteration, results) {
16
- const previous = this.getLatest(ticketId);
17
- const delta = computeDelta(previous, results);
18
- const snapshot = {
19
- timestamp: new Date().toISOString(),
20
- iteration,
21
- results,
22
- all_required_passed: results.filter((r) => r.required).every((r) => r.passed),
23
- delta_from_previous: delta,
24
- };
25
- const existing = this.snapshots.get(ticketId) ?? [];
26
- existing.push(snapshot);
27
- if (existing.length > MAX_SNAPSHOTS_PER_TICKET) {
28
- existing.splice(0, existing.length - MAX_SNAPSHOTS_PER_TICKET);
29
- }
30
- this.snapshots.set(ticketId, existing);
31
- return snapshot;
32
- }
33
- getLatest(ticketId) {
34
- const snaps = this.snapshots.get(ticketId);
35
- return snaps?.[snaps.length - 1];
36
- }
37
- getRecent(ticketId, count) {
38
- const snaps = this.snapshots.get(ticketId) ?? [];
39
- return snaps.slice(-count);
40
- }
41
- clear(ticketId) {
42
- this.snapshots.delete(ticketId);
43
- }
44
- /** Returns all ticket IDs that have at least one snapshot recorded. */
45
- getAllTicketIds() {
46
- return Array.from(this.snapshots.keys());
47
- }
48
- }
49
- //# sourceMappingURL=gate-snapshot.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"gate-snapshot.js","sourceRoot":"","sources":["../../src/lib/gate-snapshot.ts"],"names":[],"mappings":"AAEA,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAErC,MAAM,UAAU,YAAY,CAC1B,QAAkC,EAClC,cAA4B;IAE5B,IAAI,CAAC,QAAQ;QAAE,OAAO,aAAa,CAAC;IAEpC,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IACpE,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC;IAElE,IAAI,WAAW,GAAG,WAAW;QAAE,OAAO,UAAU,CAAC;IACjD,IAAI,WAAW,GAAG,WAAW;QAAE,OAAO,WAAW,CAAC;IAElD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,OAAO,iBAAiB;IACpB,SAAS,GAAgC,IAAI,GAAG,EAAE,CAAC;IAE3D,MAAM,CAAC,QAAgB,EAAE,SAAiB,EAAE,OAAqB;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAE9C,MAAM,QAAQ,GAAiB;YAC7B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS;YACT,OAAO;YACP,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;YAC7E,mBAAmB,EAAE,KAAK;SAC3B,CAAC;QAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACpD,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,IAAI,QAAQ,CAAC,MAAM,GAAG,wBAAwB,EAAE,CAAC;YAC/C,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,wBAAwB,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAEvC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,SAAS,CAAC,QAAgB;QACxB,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3C,OAAO,KAAK,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,SAAS,CAAC,QAAgB,EAAE,KAAa;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;QACjD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,QAAgB;QACpB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,uEAAuE;IACvE,eAAe;QACb,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;CACF"}
@@ -1,37 +0,0 @@
1
- import { z } from 'zod';
2
- export interface LightCallContext {
3
- ticketId: string;
4
- ticketNumber: number;
5
- ticketTitle: string;
6
- ticketDescription?: string;
7
- columnName: string;
8
- fieldValues: Array<{
9
- field_name: string;
10
- value: unknown;
11
- }>;
12
- toolPrefix: string;
13
- projectId: string;
14
- availableColumns?: Array<{
15
- id: string;
16
- name: string;
17
- }>;
18
- transitionRules?: string;
19
- }
20
- declare const LightResponseSchema: z.ZodObject<{
21
- action: z.ZodEnum<["move_ticket", "set_field_value", "create_comment", "archive_ticket", "no_action"]>;
22
- params: z.ZodRecord<z.ZodString, z.ZodUnknown>;
23
- reason: z.ZodString;
24
- }, "strip", z.ZodTypeAny, {
25
- params: Record<string, unknown>;
26
- action: "move_ticket" | "set_field_value" | "archive_ticket" | "create_comment" | "no_action";
27
- reason: string;
28
- }, {
29
- params: Record<string, unknown>;
30
- action: "move_ticket" | "set_field_value" | "archive_ticket" | "create_comment" | "no_action";
31
- reason: string;
32
- }>;
33
- export type LightResponse = z.infer<typeof LightResponseSchema>;
34
- export declare function composeLightPrompt(ctx: LightCallContext): string;
35
- export declare function parseLightResponse(raw: string): LightResponse;
36
- export {};
37
- //# sourceMappingURL=light-call.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"light-call.d.ts","sourceRoot":"","sources":["../../src/lib/light-call.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC3D,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,QAAA,MAAM,mBAAmB;;;;;;;;;;;;EAIvB,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,gBAAgB,GAAG,MAAM,CA+ChE;AAED,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,aAAa,CAc7D"}
@@ -1,62 +0,0 @@
1
- import { z } from 'zod';
2
- import { parseJsonFromLlmOutput } from './parse-utils.js';
3
- const LightResponseSchema = z.object({
4
- action: z.enum(['move_ticket', 'set_field_value', 'create_comment', 'archive_ticket', 'no_action']),
5
- params: z.record(z.string(), z.unknown()),
6
- reason: z.string(),
7
- });
8
- export function composeLightPrompt(ctx) {
9
- const fieldLines = ctx.fieldValues.length > 0
10
- ? ctx.fieldValues.map(f => ` ${f.field_name}: ${f.value != null ? JSON.stringify(f.value) : '(not set)'}`).join('\n')
11
- : ' (none)';
12
- const parts = [];
13
- parts.push(`Ticket #${String(ctx.ticketNumber)}: "${ctx.ticketTitle}"
14
- Column: ${ctx.columnName}
15
- Project: ${ctx.projectId}
16
- Tool prefix: ${ctx.toolPrefix}`);
17
- if (ctx.ticketDescription) {
18
- const truncated = ctx.ticketDescription.length > 300
19
- ? ctx.ticketDescription.slice(0, 300) + '...'
20
- : ctx.ticketDescription;
21
- parts.push(`Description: ${truncated}`);
22
- }
23
- parts.push(`\nField values:\n${fieldLines}`);
24
- if (ctx.availableColumns && ctx.availableColumns.length > 0) {
25
- const colLines = ctx.availableColumns.map(c => ` ${c.name} (${c.id})`).join('\n');
26
- parts.push(`Available columns:\n${colLines}`);
27
- }
28
- if (ctx.transitionRules) {
29
- parts.push(`Transition rules:\n${ctx.transitionRules}`);
30
- }
31
- parts.push(`Decide the single best next action for this ticket.
32
- Respond with ONLY a JSON object — no markdown, no explanation outside the JSON:
33
-
34
- {
35
- "action": "<move_ticket|set_field_value|create_comment|archive_ticket|no_action>",
36
- "params": { /* action-specific params */ },
37
- "reason": "<one sentence>"
38
- }
39
-
40
- Action params shapes:
41
- - move_ticket: { column_id: string }
42
- - set_field_value: { field_name: string, value: unknown }
43
- - create_comment: { body: string }
44
- - archive_ticket: {}
45
- - no_action: {}`);
46
- return parts.join('\n');
47
- }
48
- export function parseLightResponse(raw) {
49
- let parsed;
50
- try {
51
- parsed = parseJsonFromLlmOutput(raw);
52
- }
53
- catch (err) {
54
- throw new Error(`LightResponse: ${err instanceof Error ? err.message : String(err)}`);
55
- }
56
- const result = LightResponseSchema.safeParse(parsed);
57
- if (!result.success) {
58
- throw new Error(`LightResponse: validation failed — ${result.error.message}`);
59
- }
60
- return result.data;
61
- }
62
- //# sourceMappingURL=light-call.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"light-call.js","sourceRoot":"","sources":["../../src/lib/light-call.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- export interface IterationLogData {
2
- promptSize: number;
3
- exitCode: number;
4
- duration: number;
5
- tokenUsage?: {
6
- input: number;
7
- output: number;
8
- cost?: number;
9
- };
10
- outcome: string;
11
- }
12
- export declare class PipelineLogger {
13
- private boardDir;
14
- private writeCount;
15
- constructor(baseDir: string, boardId: string);
16
- orchestrator(message: string): void;
17
- private rotateIfNeeded;
18
- iteration(ticketNumber: string, iterationNum: number, data: IterationLogData): void;
19
- formatConsole(ticketNumber: string, columnName: string, iteration: number, status: string): string;
20
- pruneOldLogs(retentionDays: number): void;
21
- }
22
- //# sourceMappingURL=logger.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9D,OAAO,EAAE,MAAM,CAAC;CACjB;AASD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,UAAU,CAAK;gBAEX,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAK5C,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAanC,OAAO,CAAC,cAAc;IAmBtB,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,gBAAgB,GAAG,IAAI;IAanF,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM;IAOlG,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI;CA0B1C"}
@@ -1,98 +0,0 @@
1
- import { mkdirSync, writeFileSync, appendFileSync, readdirSync, rmSync, statSync, renameSync } from 'node:fs';
2
- import { join } from 'node:path';
3
- /** Maximum orchestrator.log size before rotation (5 MB). */
4
- const MAX_LOG_BYTES = 5 * 1024 * 1024;
5
- /** Number of rotated log files to keep (orchestrator.log.1, .2, .3). */
6
- const MAX_ROTATED_FILES = 3;
7
- /** How often (in write count) to check file size — avoids stat on every write. */
8
- const ROTATION_CHECK_INTERVAL = 100;
9
- export class PipelineLogger {
10
- boardDir;
11
- writeCount = 0;
12
- constructor(baseDir, boardId) {
13
- this.boardDir = join(baseDir, boardId);
14
- mkdirSync(this.boardDir, { recursive: true });
15
- }
16
- orchestrator(message) {
17
- const logPath = join(this.boardDir, 'orchestrator.log');
18
- const entry = `[${new Date().toISOString()}] ${message}\n`;
19
- appendFileSync(logPath, entry);
20
- // Periodically check if log needs rotation
21
- this.writeCount++;
22
- if (this.writeCount >= ROTATION_CHECK_INTERVAL) {
23
- this.writeCount = 0;
24
- this.rotateIfNeeded(logPath);
25
- }
26
- }
27
- rotateIfNeeded(logPath) {
28
- try {
29
- const stat = statSync(logPath);
30
- if (stat.size < MAX_LOG_BYTES)
31
- return;
32
- // Rotate: .3 → delete, .2 → .3, .1 → .2, current → .1
33
- for (let i = MAX_ROTATED_FILES; i >= 1; i--) {
34
- const from = i === 1 ? logPath : `${logPath}.${String(i - 1)}`;
35
- const to = `${logPath}.${String(i)}`;
36
- try {
37
- if (i === MAX_ROTATED_FILES) {
38
- try {
39
- rmSync(to, { force: true });
40
- }
41
- catch { /* ignore */ }
42
- }
43
- renameSync(from, to);
44
- }
45
- catch { /* file may not exist */ }
46
- }
47
- }
48
- catch { /* stat failed — file doesn't exist yet */ }
49
- }
50
- iteration(ticketNumber, iterationNum, data) {
51
- const ticketDir = join(this.boardDir, ticketNumber);
52
- mkdirSync(ticketDir, { recursive: true });
53
- const padded = String(iterationNum).padStart(3, '0');
54
- const logPath = join(ticketDir, `iteration-${padded}.log`);
55
- const entry = {
56
- timestamp: new Date().toISOString(),
57
- iteration: iterationNum,
58
- ...data,
59
- };
60
- writeFileSync(logPath, JSON.stringify(entry, null, 2));
61
- }
62
- formatConsole(ticketNumber, columnName, iteration, status) {
63
- const time = new Date().toLocaleTimeString('en-US', { hour12: false });
64
- const ticket = ticketNumber.padEnd(10);
65
- const col = columnName.padEnd(12);
66
- return `[${time}] ${ticket} ${col} iter:${iteration} ${status}`;
67
- }
68
- pruneOldLogs(retentionDays) {
69
- const cutoff = Date.now() - (retentionDays * 24 * 60 * 60 * 1000);
70
- try {
71
- const entries = readdirSync(this.boardDir, { withFileTypes: true });
72
- for (const entry of entries) {
73
- const fullPath = join(this.boardDir, entry.name);
74
- if (entry.isDirectory() && entry.name !== '.') {
75
- try {
76
- const stat = statSync(fullPath);
77
- if (stat.mtimeMs < cutoff) {
78
- rmSync(fullPath, { recursive: true, force: true });
79
- }
80
- }
81
- catch { /* skip if stat fails */ }
82
- }
83
- // Prune old rotated orchestrator logs
84
- if (entry.isFile() && /^orchestrator\.log\.\d+$/.test(entry.name)) {
85
- try {
86
- const stat = statSync(fullPath);
87
- if (stat.mtimeMs < cutoff) {
88
- rmSync(fullPath, { force: true });
89
- }
90
- }
91
- catch { /* skip if stat fails */ }
92
- }
93
- }
94
- }
95
- catch { /* skip if dir doesn't exist */ }
96
- }
97
- }
98
- //# sourceMappingURL=logger.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/lib/logger.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- /**
2
- * Generate (or overwrite) a stable MCP config file for the given board.
3
- * Uses a deterministic path (~/.kantban/pipelines/<boardId>/mcp-config.json)
4
- * so that child claude -p processes can always find it, even if the
5
- * orchestrator restarts between iterations.
6
- */
7
- export declare function generateMcpConfig(apiUrl: string, apiToken: string, boardId: string): string;
8
- export declare function cleanupMcpConfig(filePath: string): void;
9
- /**
10
- * Generate an MCP config file that includes BOTH the kantban server AND the
11
- * gate proxy server for a specific column. The gate proxy runs as a local
12
- * Node process bundled with the CLI and enforces column-level gates during
13
- * pipeline execution.
14
- *
15
- * The file is written to a deterministic, column-scoped path:
16
- * ~/.kantban/pipelines/<boardId>/mcp-config-<columnId>.json
17
- */
18
- export declare function generateGateProxyMcpConfig(apiUrl: string, apiToken: string, boardId: string, gateConfigPath: string, columnId: string, columnName: string, projectId: string): string;
19
- /**
20
- * Remove all gate-proxy MCP config files for a given pipeline directory.
21
- * Called on shutdown to ensure credentials don't persist on disk.
22
- */
23
- export declare function cleanupGateProxyConfigs(pipelineDir: string): void;
24
- //# sourceMappingURL=mcp-config.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-config.d.ts","sourceRoot":"","sources":["../../src/lib/mcp-config.ts"],"names":[],"mappings":"AAQA;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAmC3F;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAQvD;AAED;;;;;;;;GAQG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,GAChB,MAAM,CAmCR;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CASjE"}
@@ -1,115 +0,0 @@
1
- import { writeFileSync, unlinkSync, mkdirSync, existsSync, readdirSync } from 'node:fs';
2
- import { join, dirname } from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- import { homedir } from 'node:os';
5
- const __filename = fileURLToPath(import.meta.url);
6
- const __dirname = dirname(__filename);
7
- /**
8
- * Generate (or overwrite) a stable MCP config file for the given board.
9
- * Uses a deterministic path (~/.kantban/pipelines/<boardId>/mcp-config.json)
10
- * so that child claude -p processes can always find it, even if the
11
- * orchestrator restarts between iterations.
12
- */
13
- export function generateMcpConfig(apiUrl, apiToken, boardId) {
14
- // Use local MCP server if running from the monorepo (dev mode),
15
- // otherwise fall back to the published npm package.
16
- const localMcpPath = join(__dirname, '..', '..', '..', 'mcp', 'dist', 'index.js');
17
- const useLocal = existsSync(localMcpPath);
18
- const kantbanServer = useLocal
19
- ? {
20
- command: 'node',
21
- args: [localMcpPath],
22
- env: {
23
- KANTBAN_API_TOKEN: apiToken,
24
- KANTBAN_API_URL: apiUrl,
25
- },
26
- }
27
- : {
28
- command: 'npx',
29
- args: ['-y', 'kantban-mcp@latest'],
30
- env: {
31
- KANTBAN_API_TOKEN: apiToken,
32
- KANTBAN_API_URL: apiUrl,
33
- },
34
- };
35
- const config = {
36
- mcpServers: {
37
- kantban: kantbanServer,
38
- },
39
- };
40
- const dir = join(homedir(), '.kantban', 'pipelines', boardId);
41
- mkdirSync(dir, { recursive: true, mode: 0o700 });
42
- const filePath = join(dir, 'mcp-config.json');
43
- writeFileSync(filePath, JSON.stringify(config, null, 2), { mode: 0o600 });
44
- return filePath;
45
- }
46
- export function cleanupMcpConfig(filePath) {
47
- try {
48
- if (existsSync(filePath)) {
49
- unlinkSync(filePath);
50
- }
51
- }
52
- catch {
53
- // Non-critical — file may already be gone
54
- }
55
- }
56
- /**
57
- * Generate an MCP config file that includes BOTH the kantban server AND the
58
- * gate proxy server for a specific column. The gate proxy runs as a local
59
- * Node process bundled with the CLI and enforces column-level gates during
60
- * pipeline execution.
61
- *
62
- * The file is written to a deterministic, column-scoped path:
63
- * ~/.kantban/pipelines/<boardId>/mcp-config-<columnId>.json
64
- */
65
- export function generateGateProxyMcpConfig(apiUrl, apiToken, boardId, gateConfigPath, columnId, columnName, projectId) {
66
- const localMcpPath = join(__dirname, '..', '..', '..', 'mcp', 'dist', 'index.js');
67
- const useLocal = existsSync(localMcpPath);
68
- const kantbanServer = useLocal
69
- ? { command: 'node', args: [localMcpPath], env: { KANTBAN_API_TOKEN: apiToken, KANTBAN_API_URL: apiUrl } }
70
- : { command: 'npx', args: ['-y', 'kantban-mcp@latest'], env: { KANTBAN_API_TOKEN: apiToken, KANTBAN_API_URL: apiUrl } };
71
- // Gate proxy runs as a local Node script bundled with the CLI
72
- const gateProxyPath = join(__dirname, 'gate-proxy-server.js');
73
- const gateProxyServer = {
74
- command: 'node',
75
- args: [gateProxyPath],
76
- env: {
77
- GATE_CONFIG_PATH: gateConfigPath,
78
- COLUMN_ID: columnId,
79
- COLUMN_NAME: columnName,
80
- PROJECT_ID: projectId,
81
- KANTBAN_API_TOKEN: apiToken,
82
- KANTBAN_API_URL: apiUrl,
83
- },
84
- };
85
- const config = {
86
- mcpServers: {
87
- kantban: kantbanServer,
88
- 'kantban-gates': gateProxyServer,
89
- },
90
- };
91
- const dir = join(homedir(), '.kantban', 'pipelines', boardId);
92
- mkdirSync(dir, { recursive: true, mode: 0o700 });
93
- const filePath = join(dir, `mcp-config-${columnId}.json`);
94
- writeFileSync(filePath, JSON.stringify(config, null, 2), { mode: 0o600 });
95
- return filePath;
96
- }
97
- /**
98
- * Remove all gate-proxy MCP config files for a given pipeline directory.
99
- * Called on shutdown to ensure credentials don't persist on disk.
100
- */
101
- export function cleanupGateProxyConfigs(pipelineDir) {
102
- try {
103
- const files = readdirSync(pipelineDir);
104
- for (const f of files) {
105
- if (f.startsWith('mcp-config-') && f.endsWith('.json')) {
106
- try {
107
- unlinkSync(join(pipelineDir, f));
108
- }
109
- catch { /* ignore */ }
110
- }
111
- }
112
- }
113
- catch { /* directory may not exist */ }
114
- }
115
- //# sourceMappingURL=mcp-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mcp-config.js","sourceRoot":"","sources":["../../src/lib/mcp-config.ts"],"names":[],"mappings":"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"}