pi-cicd 0.1.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/README.md +62 -0
  2. package/dist/ci/pipeline.d.ts +43 -0
  3. package/dist/ci/pipeline.d.ts.map +1 -0
  4. package/dist/ci/pipeline.js +107 -0
  5. package/dist/ci/pipeline.js.map +1 -0
  6. package/dist/ci/pr-creator.d.ts +17 -0
  7. package/dist/ci/pr-creator.d.ts.map +1 -0
  8. package/dist/ci/pr-creator.js +67 -0
  9. package/dist/ci/pr-creator.js.map +1 -0
  10. package/dist/ci/report.d.ts +14 -0
  11. package/dist/ci/report.d.ts.map +1 -0
  12. package/dist/ci/report.js +51 -0
  13. package/dist/ci/report.js.map +1 -0
  14. package/dist/ci/test-runner.d.ts +10 -0
  15. package/dist/ci/test-runner.d.ts.map +1 -0
  16. package/dist/ci/test-runner.js +111 -0
  17. package/dist/ci/test-runner.js.map +1 -0
  18. package/dist/config.d.ts +33 -0
  19. package/dist/config.d.ts.map +1 -0
  20. package/dist/config.js +67 -0
  21. package/dist/config.js.map +1 -0
  22. package/dist/deploy/canary-deploy.d.ts +80 -0
  23. package/dist/deploy/canary-deploy.d.ts.map +1 -0
  24. package/dist/deploy/canary-deploy.js +145 -0
  25. package/dist/deploy/canary-deploy.js.map +1 -0
  26. package/dist/deploy/landing-queue.d.ts +83 -0
  27. package/dist/deploy/landing-queue.d.ts.map +1 -0
  28. package/dist/deploy/landing-queue.js +172 -0
  29. package/dist/deploy/landing-queue.js.map +1 -0
  30. package/dist/headless/answer-injector.d.ts +27 -0
  31. package/dist/headless/answer-injector.d.ts.map +1 -0
  32. package/dist/headless/answer-injector.js +80 -0
  33. package/dist/headless/answer-injector.js.map +1 -0
  34. package/dist/headless/exit-codes.d.ts +13 -0
  35. package/dist/headless/exit-codes.d.ts.map +1 -0
  36. package/dist/headless/exit-codes.js +29 -0
  37. package/dist/headless/exit-codes.js.map +1 -0
  38. package/dist/headless/idle-detector.d.ts +32 -0
  39. package/dist/headless/idle-detector.d.ts.map +1 -0
  40. package/dist/headless/idle-detector.js +62 -0
  41. package/dist/headless/idle-detector.js.map +1 -0
  42. package/dist/headless/jsonl-stream.d.ts +28 -0
  43. package/dist/headless/jsonl-stream.d.ts.map +1 -0
  44. package/dist/headless/jsonl-stream.js +65 -0
  45. package/dist/headless/jsonl-stream.js.map +1 -0
  46. package/dist/headless/orchestrator.d.ts +63 -0
  47. package/dist/headless/orchestrator.d.ts.map +1 -0
  48. package/dist/headless/orchestrator.js +156 -0
  49. package/dist/headless/orchestrator.js.map +1 -0
  50. package/{index.ts → dist/index.d.ts} +4 -26
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +31 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/tools/ci_status.d.ts +40 -0
  55. package/dist/tools/ci_status.d.ts.map +1 -0
  56. package/dist/tools/ci_status.js +110 -0
  57. package/dist/tools/ci_status.js.map +1 -0
  58. package/dist/types.d.ts +93 -0
  59. package/dist/types.d.ts.map +1 -0
  60. package/dist/types.js +17 -0
  61. package/dist/types.js.map +1 -0
  62. package/dist/workflow/deployment-workflow.d.ts +56 -0
  63. package/dist/workflow/deployment-workflow.d.ts.map +1 -0
  64. package/dist/workflow/deployment-workflow.js +95 -0
  65. package/dist/workflow/deployment-workflow.js.map +1 -0
  66. package/package.json +26 -26
  67. package/AGENTS.md +0 -25
  68. package/src/ci/pipeline.ts +0 -130
  69. package/src/ci/pr-creator.ts +0 -74
  70. package/src/ci/report.ts +0 -65
  71. package/src/ci/test-runner.ts +0 -129
  72. package/src/config.ts +0 -99
  73. package/src/headless/answer-injector.ts +0 -98
  74. package/src/headless/exit-codes.ts +0 -32
  75. package/src/headless/idle-detector.ts +0 -76
  76. package/src/headless/jsonl-stream.ts +0 -90
  77. package/src/headless/orchestrator.ts +0 -206
  78. package/src/tools/ci_status.ts +0 -137
  79. package/src/types.ts +0 -149
  80. package/tsconfig.json +0 -19
@@ -0,0 +1,29 @@
1
+ /**
2
+ * pi-ci — Exit code resolution helpers.
3
+ */
4
+ import { EXIT_CODES } from "../types.ts";
5
+ /**
6
+ * Map a symbolic status string to a numeric exit code.
7
+ *
8
+ * Unknown / unexpected statuses resolve to ERROR (1).
9
+ */
10
+ export function resolveExitCode(status) {
11
+ switch (status) {
12
+ case "success":
13
+ return EXIT_CODES.SUCCESS;
14
+ case "error":
15
+ case "timeout":
16
+ return EXIT_CODES.ERROR;
17
+ case "blocked":
18
+ return EXIT_CODES.BLOCKED;
19
+ case "cancelled":
20
+ return EXIT_CODES.CANCELLED;
21
+ case "needs_input":
22
+ case "needs-input":
23
+ return EXIT_CODES.NEEDS_INPUT;
24
+ default:
25
+ return EXIT_CODES.ERROR;
26
+ }
27
+ }
28
+ export { EXIT_CODES };
29
+ //# sourceMappingURL=exit-codes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exit-codes.js","sourceRoot":"","sources":["../../src/headless/exit-codes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAiB,MAAM,aAAa,CAAC;AAExD;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,SAAS;YACZ,OAAO,UAAU,CAAC,OAAO,CAAC;QAC5B,KAAK,OAAO,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,KAAK,SAAS;YACZ,OAAO,UAAU,CAAC,OAAO,CAAC;QAC5B,KAAK,WAAW;YACd,OAAO,UAAU,CAAC,SAAS,CAAC;QAC9B,KAAK,aAAa,CAAC;QACnB,KAAK,aAAa;YAChB,OAAO,UAAU,CAAC,WAAW,CAAC;QAChC;YACE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,OAAO,EAAE,UAAU,EAAE,CAAC"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * pi-ci — Idle timeout detection.
3
+ *
4
+ * If no activity is detected within the configured timeout, the callback fires.
5
+ */
6
+ export interface IdleDetectorOptions {
7
+ /** Timeout in milliseconds. Default: 15 000. */
8
+ idleTimeoutMs?: number;
9
+ /** Called when the idle timeout is reached. */
10
+ onTimeout: () => void;
11
+ }
12
+ export declare class IdleDetector {
13
+ private readonly idleTimeoutMs;
14
+ private readonly onTimeout;
15
+ private timer;
16
+ private _running;
17
+ private _fired;
18
+ constructor(options: IdleDetectorOptions);
19
+ /** Whether the detector is currently running. */
20
+ get running(): boolean;
21
+ /** Whether the timeout has already fired. */
22
+ get fired(): boolean;
23
+ /** Start the idle timer. Safe to call multiple times (no-op if already running). */
24
+ start(): void;
25
+ /** Reset the idle timer. If not running, this is a no-op. */
26
+ reset(): void;
27
+ /** Stop the idle timer. */
28
+ stop(): void;
29
+ private scheduleTimer;
30
+ private clearTimer;
31
+ }
32
+ //# sourceMappingURL=idle-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-detector.d.ts","sourceRoot":"","sources":["../../src/headless/idle-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,mBAAmB;IAClC,gDAAgD;IAChD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,IAAI,CAAC;CACvB;AAID,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAa;IACvC,OAAO,CAAC,KAAK,CAA8C;IAC3D,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,MAAM,CAAS;gBAEX,OAAO,EAAE,mBAAmB;IAKxC,iDAAiD;IACjD,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,6CAA6C;IAC7C,IAAI,KAAK,IAAI,OAAO,CAEnB;IAED,oFAAoF;IACpF,KAAK,IAAI,IAAI;IAOb,6DAA6D;IAC7D,KAAK,IAAI,IAAI;IAMb,2BAA2B;IAC3B,IAAI,IAAI,IAAI;IAMZ,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,UAAU;CAMnB"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * pi-ci — Idle timeout detection.
3
+ *
4
+ * If no activity is detected within the configured timeout, the callback fires.
5
+ */
6
+ const DEFAULT_IDLE_TIMEOUT_MS = 15_000;
7
+ export class IdleDetector {
8
+ idleTimeoutMs;
9
+ onTimeout;
10
+ timer = null;
11
+ _running = false;
12
+ _fired = false;
13
+ constructor(options) {
14
+ this.idleTimeoutMs = options.idleTimeoutMs ?? DEFAULT_IDLE_TIMEOUT_MS;
15
+ this.onTimeout = options.onTimeout;
16
+ }
17
+ /** Whether the detector is currently running. */
18
+ get running() {
19
+ return this._running;
20
+ }
21
+ /** Whether the timeout has already fired. */
22
+ get fired() {
23
+ return this._fired;
24
+ }
25
+ /** Start the idle timer. Safe to call multiple times (no-op if already running). */
26
+ start() {
27
+ if (this._running)
28
+ return;
29
+ this._running = true;
30
+ this._fired = false;
31
+ this.scheduleTimer();
32
+ }
33
+ /** Reset the idle timer. If not running, this is a no-op. */
34
+ reset() {
35
+ if (!this._running)
36
+ return;
37
+ this.clearTimer();
38
+ this.scheduleTimer();
39
+ }
40
+ /** Stop the idle timer. */
41
+ stop() {
42
+ this._running = false;
43
+ this._fired = false;
44
+ this.clearTimer();
45
+ }
46
+ scheduleTimer() {
47
+ this.timer = setTimeout(() => {
48
+ if (this._running) {
49
+ this._running = false;
50
+ this._fired = true;
51
+ this.onTimeout();
52
+ }
53
+ }, this.idleTimeoutMs);
54
+ }
55
+ clearTimer() {
56
+ if (this.timer !== null) {
57
+ clearTimeout(this.timer);
58
+ this.timer = null;
59
+ }
60
+ }
61
+ }
62
+ //# sourceMappingURL=idle-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-detector.js","sourceRoot":"","sources":["../../src/headless/idle-detector.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AASH,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAEvC,MAAM,OAAO,YAAY;IACN,aAAa,CAAS;IACtB,SAAS,CAAa;IAC/B,KAAK,GAAyC,IAAI,CAAC;IACnD,QAAQ,GAAG,KAAK,CAAC;IACjB,MAAM,GAAG,KAAK,CAAC;IAEvB,YAAY,OAA4B;QACtC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,uBAAuB,CAAC;QACtE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACrC,CAAC;IAED,iDAAiD;IACjD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAED,6CAA6C;IAC7C,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,oFAAoF;IACpF,KAAK;QACH,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,6DAA6D;IAC7D,KAAK;QACH,IAAI,CAAC,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC3B,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,2BAA2B;IAC3B,IAAI;QACF,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,MAAM,GAAG,KAAK,CAAC;QACpB,IAAI,CAAC,UAAU,EAAE,CAAC;IACpB,CAAC;IAEO,aAAa;QACnB,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3B,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;gBACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IACzB,CAAC;IAEO,UAAU;QAChB,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,EAAE,CAAC;YACxB,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * pi-ci — JSONL event stream utilities.
3
+ *
4
+ * Writes CI events as single-line JSON to a writable stream and provides
5
+ * type-guard helpers for event discrimination.
6
+ */
7
+ import type { Writable } from "node:stream";
8
+ import type { CIEvent, CIStartEvent, CIProgressEvent, CIEditEvent, CITestEvent, CICostEvent, CIEndEvent } from "../types.ts";
9
+ /**
10
+ * Serialise a CI event and write it as a single JSONL line to the stream.
11
+ */
12
+ export declare function writeCIEvent(stream: Writable, event: CIEvent): void;
13
+ export declare class CIEventCollector {
14
+ private readonly events;
15
+ /** Record an event. Auto-fills timestamp if missing. */
16
+ emit(event: CIEvent): void;
17
+ /** Return all collected events in order. */
18
+ all(): CIEvent[];
19
+ /** Reset the collector. */
20
+ clear(): void;
21
+ }
22
+ export declare function isCIStartEvent(e: CIEvent): e is CIStartEvent;
23
+ export declare function isCIProgressEvent(e: CIEvent): e is CIProgressEvent;
24
+ export declare function isCIEditEvent(e: CIEvent): e is CIEditEvent;
25
+ export declare function isCITestEvent(e: CIEvent): e is CITestEvent;
26
+ export declare function isCICostEvent(e: CIEvent): e is CICostEvent;
27
+ export declare function isCIEndEvent(e: CIEvent): e is CIEndEvent;
28
+ //# sourceMappingURL=jsonl-stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl-stream.d.ts","sourceRoot":"","sources":["../../src/headless/jsonl-stream.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EACZ,eAAe,EACf,WAAW,EACX,WAAW,EACX,WAAW,EACX,UAAU,EACX,MAAM,aAAa,CAAC;AAgBrB;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAGnE;AAMD,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IAExC,wDAAwD;IACxD,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAI1B,4CAA4C;IAC5C,GAAG,IAAI,OAAO,EAAE;IAIhB,2BAA2B;IAC3B,KAAK,IAAI,IAAI;CAGd;AAMD,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,YAAY,CAE5D;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,eAAe,CAElE;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,WAAW,CAE1D;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,WAAW,CAE1D;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,WAAW,CAE1D;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,OAAO,GAAG,CAAC,IAAI,UAAU,CAExD"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * pi-ci — JSONL event stream utilities.
3
+ *
4
+ * Writes CI events as single-line JSON to a writable stream and provides
5
+ * type-guard helpers for event discrimination.
6
+ */
7
+ // ---------------------------------------------------------------------------
8
+ // Write helpers
9
+ // ---------------------------------------------------------------------------
10
+ /**
11
+ * Ensure an event has a timestamp, injecting `now` if missing.
12
+ */
13
+ function ensureTimestamp(event) {
14
+ if (!event.timestamp) {
15
+ return { ...event, timestamp: new Date().toISOString() };
16
+ }
17
+ return event;
18
+ }
19
+ /**
20
+ * Serialise a CI event and write it as a single JSONL line to the stream.
21
+ */
22
+ export function writeCIEvent(stream, event) {
23
+ const stamped = ensureTimestamp(event);
24
+ stream.write(JSON.stringify(stamped) + "\n");
25
+ }
26
+ // ---------------------------------------------------------------------------
27
+ // Event emitter (collects events for reporting)
28
+ // ---------------------------------------------------------------------------
29
+ export class CIEventCollector {
30
+ events = [];
31
+ /** Record an event. Auto-fills timestamp if missing. */
32
+ emit(event) {
33
+ this.events.push(ensureTimestamp(event));
34
+ }
35
+ /** Return all collected events in order. */
36
+ all() {
37
+ return [...this.events];
38
+ }
39
+ /** Reset the collector. */
40
+ clear() {
41
+ this.events.length = 0;
42
+ }
43
+ }
44
+ // ---------------------------------------------------------------------------
45
+ // Type guards
46
+ // ---------------------------------------------------------------------------
47
+ export function isCIStartEvent(e) {
48
+ return e.type === "ci_start";
49
+ }
50
+ export function isCIProgressEvent(e) {
51
+ return e.type === "ci_progress";
52
+ }
53
+ export function isCIEditEvent(e) {
54
+ return e.type === "ci_edit";
55
+ }
56
+ export function isCITestEvent(e) {
57
+ return e.type === "ci_test";
58
+ }
59
+ export function isCICostEvent(e) {
60
+ return e.type === "ci_cost";
61
+ }
62
+ export function isCIEndEvent(e) {
63
+ return e.type === "ci_end";
64
+ }
65
+ //# sourceMappingURL=jsonl-stream.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonl-stream.js","sourceRoot":"","sources":["../../src/headless/jsonl-stream.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;GAEG;AACH,SAAS,eAAe,CAAoB,KAAQ;IAClD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,EAAE,GAAG,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;IAC3D,CAAC;IACD,OAAO,KAAkC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,MAAgB,EAAE,KAAc;IAC3D,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AAC/C,CAAC;AAED,8EAA8E;AAC9E,gDAAgD;AAChD,8EAA8E;AAE9E,MAAM,OAAO,gBAAgB;IACV,MAAM,GAAc,EAAE,CAAC;IAExC,wDAAwD;IACxD,IAAI,CAAC,KAAc;QACjB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,4CAA4C;IAC5C,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,2BAA2B;IAC3B,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACzB,CAAC;CACF;AAED,8EAA8E;AAC9E,cAAc;AACd,8EAA8E;AAE9E,MAAM,UAAU,cAAc,CAAC,CAAU;IACvC,OAAO,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,CAAU;IAC1C,OAAO,CAAC,CAAC,IAAI,KAAK,aAAa,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,OAAO,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,OAAO,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,OAAO,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;AAC7B,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * pi-ci — Headless orchestrator.
3
+ *
4
+ * Ties together exit codes, answer injection, idle detection, and JSONL
5
+ * streaming into a single execution loop.
6
+ */
7
+ import type { ExitCode, CIEvent, CIOptions } from "../types.ts";
8
+ import type { AnswerEntry } from "../types.ts";
9
+ import type { Writable } from "node:stream";
10
+ export interface OrchestratorResult {
11
+ exitCode: ExitCode;
12
+ events: CIEvent[];
13
+ durationMs: number;
14
+ }
15
+ export interface OrchestratorHooks {
16
+ /** Called for each step of execution. Return a status string to signal completion. */
17
+ executeStep: (prompt: string, injectAnswer: (question: string) => string | undefined) => Promise<StepResult>;
18
+ /** Optional writable for JSONL streaming. */
19
+ outputStream?: Writable;
20
+ }
21
+ export interface StepResult {
22
+ status: string;
23
+ edits?: {
24
+ file: string;
25
+ lines_added: number;
26
+ lines_removed: number;
27
+ }[];
28
+ tests?: {
29
+ command: string;
30
+ passed: number;
31
+ failed: number;
32
+ }[];
33
+ cost?: {
34
+ tokens: {
35
+ input: number;
36
+ output: number;
37
+ };
38
+ cost_usd: number;
39
+ };
40
+ }
41
+ export declare class HeadlessOrchestrator {
42
+ private readonly collector;
43
+ private readonly answers;
44
+ private readonly idleTimeoutMs;
45
+ private readonly maxRetries;
46
+ private readonly hooks;
47
+ constructor(answers: AnswerEntry[], options: CIOptions, hooks: OrchestratorHooks);
48
+ /**
49
+ * Run the orchestrator loop.
50
+ *
51
+ * 1. Emit ci_start
52
+ * 2. Execute steps via the hook, checking for answer injection
53
+ * 3. On idle timeout → retry with exponential backoff
54
+ * 4. Emit ci_end with the resolved exit code
55
+ */
56
+ run(prompt: string, mode: "single" | "plan"): Promise<OrchestratorResult>;
57
+ /**
58
+ * Single attempt: run with idle detection.
59
+ */
60
+ private runAttempt;
61
+ private emit;
62
+ }
63
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/headless/orchestrator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAIhE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,sFAAsF;IACtF,WAAW,EAAE,CACX,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,KACnD,OAAO,CAAC,UAAU,CAAC,CAAC;IACzB,6CAA6C;IAC7C,YAAY,CAAC,EAAE,QAAQ,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvE,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC9D,IAAI,CAAC,EAAE;QAAE,MAAM,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CACxE;AAQD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0B;IACpD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAS;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoB;gBAGxC,OAAO,EAAE,WAAW,EAAE,EACtB,OAAO,EAAE,SAAS,EAClB,KAAK,EAAE,iBAAiB;IAQ1B;;;;;;;OAOG;IACG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAiD/E;;OAEG;YACW,UAAU;IAyExB,OAAO,CAAC,IAAI;CAMb"}
@@ -0,0 +1,156 @@
1
+ /**
2
+ * pi-ci — Headless orchestrator.
3
+ *
4
+ * Ties together exit codes, answer injection, idle detection, and JSONL
5
+ * streaming into a single execution loop.
6
+ */
7
+ import { EXIT_CODES } from "../types.ts";
8
+ import { resolveExitCode } from "./exit-codes.ts";
9
+ import { matchAnswer } from "./answer-injector.ts";
10
+ import { IdleDetector } from "./idle-detector.ts";
11
+ import { CIEventCollector, writeCIEvent } from "./jsonl-stream.ts";
12
+ const RESTART_CONFIG = {
13
+ baseDelayMs: 5_000,
14
+ maxDelayMs: 30_000,
15
+ backoffMultiplier: 2,
16
+ };
17
+ export class HeadlessOrchestrator {
18
+ collector = new CIEventCollector();
19
+ answers;
20
+ idleTimeoutMs;
21
+ maxRetries;
22
+ hooks;
23
+ constructor(answers, options, hooks) {
24
+ this.answers = answers;
25
+ this.idleTimeoutMs = options.idleTimeoutMs ?? 15_000;
26
+ this.maxRetries = options.maxRetries ?? 3;
27
+ this.hooks = hooks;
28
+ }
29
+ /**
30
+ * Run the orchestrator loop.
31
+ *
32
+ * 1. Emit ci_start
33
+ * 2. Execute steps via the hook, checking for answer injection
34
+ * 3. On idle timeout → retry with exponential backoff
35
+ * 4. Emit ci_end with the resolved exit code
36
+ */
37
+ async run(prompt, mode) {
38
+ const startTime = Date.now();
39
+ const startEvent = {
40
+ type: "ci_start",
41
+ timestamp: new Date().toISOString(),
42
+ task: prompt,
43
+ mode,
44
+ };
45
+ this.emit(startEvent);
46
+ let lastExitCode = EXIT_CODES.ERROR;
47
+ let retries = 0;
48
+ while (retries <= this.maxRetries) {
49
+ const result = await this.runAttempt(prompt);
50
+ lastExitCode = result;
51
+ if (lastExitCode === EXIT_CODES.SUCCESS)
52
+ break;
53
+ if (lastExitCode === EXIT_CODES.BLOCKED || lastExitCode === EXIT_CODES.CANCELLED)
54
+ break;
55
+ // Retry on error/timeout
56
+ retries++;
57
+ if (retries <= this.maxRetries) {
58
+ const delay = Math.min(RESTART_CONFIG.baseDelayMs *
59
+ Math.pow(RESTART_CONFIG.backoffMultiplier, retries - 1), RESTART_CONFIG.maxDelayMs);
60
+ await sleep(delay);
61
+ }
62
+ }
63
+ const durationMs = Date.now() - startTime;
64
+ const endEvent = {
65
+ type: "ci_end",
66
+ timestamp: new Date().toISOString(),
67
+ exit_code: lastExitCode,
68
+ duration_ms: durationMs,
69
+ };
70
+ this.emit(endEvent);
71
+ return {
72
+ exitCode: lastExitCode,
73
+ events: this.collector.all(),
74
+ durationMs,
75
+ };
76
+ }
77
+ /**
78
+ * Single attempt: run with idle detection.
79
+ */
80
+ async runAttempt(prompt) {
81
+ return new Promise((resolve) => {
82
+ let settled = false;
83
+ const idle = new IdleDetector({
84
+ idleTimeoutMs: this.idleTimeoutMs,
85
+ onTimeout: () => {
86
+ if (!settled) {
87
+ settled = true;
88
+ resolve(EXIT_CODES.TIMEOUT);
89
+ }
90
+ },
91
+ });
92
+ const injectAnswer = (question) => {
93
+ idle.reset();
94
+ return matchAnswer(this.answers, question);
95
+ };
96
+ idle.start();
97
+ this.hooks
98
+ .executeStep(prompt, injectAnswer)
99
+ .then((stepResult) => {
100
+ if (!settled) {
101
+ settled = true;
102
+ idle.stop();
103
+ // Emit detail events
104
+ if (stepResult.edits) {
105
+ for (const edit of stepResult.edits) {
106
+ this.emit({
107
+ type: "ci_edit",
108
+ timestamp: new Date().toISOString(),
109
+ file: edit.file,
110
+ lines_added: edit.lines_added,
111
+ lines_removed: edit.lines_removed,
112
+ });
113
+ }
114
+ }
115
+ if (stepResult.tests) {
116
+ for (const t of stepResult.tests) {
117
+ this.emit({
118
+ type: "ci_test",
119
+ timestamp: new Date().toISOString(),
120
+ command: t.command,
121
+ passed: t.passed,
122
+ failed: t.failed,
123
+ });
124
+ }
125
+ }
126
+ if (stepResult.cost) {
127
+ this.emit({
128
+ type: "ci_cost",
129
+ timestamp: new Date().toISOString(),
130
+ tokens: stepResult.cost.tokens,
131
+ cost_usd: stepResult.cost.cost_usd,
132
+ });
133
+ }
134
+ resolve(resolveExitCode(stepResult.status));
135
+ }
136
+ })
137
+ .catch(() => {
138
+ if (!settled) {
139
+ settled = true;
140
+ idle.stop();
141
+ resolve(EXIT_CODES.ERROR);
142
+ }
143
+ });
144
+ });
145
+ }
146
+ emit(event) {
147
+ this.collector.emit(event);
148
+ if (this.hooks.outputStream) {
149
+ writeCIEvent(this.hooks.outputStream, event);
150
+ }
151
+ }
152
+ }
153
+ function sleep(ms) {
154
+ return new Promise((r) => setTimeout(r, ms));
155
+ }
156
+ //# sourceMappingURL=orchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/headless/orchestrator.ts"],"names":[],"mappings":"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"}
@@ -3,20 +3,6 @@
3
3
  *
4
4
  * Registers the /ci status command and CI lifecycle hooks.
5
5
  */
6
-
7
- import type { CIEvent, CIOptions, ExitCode } from "./src/types.ts";
8
- import { EXIT_CODES } from "./src/types.ts";
9
- import {
10
- ciStatusHandler,
11
- createRunTracker,
12
- clearRuns,
13
- registerRun,
14
- type CIRunRecord,
15
- } from "./src/tools/ci_status.ts";
16
- import { CIPipeline, type PipelineResult } from "./src/ci/pipeline.ts";
17
- import { generateReport } from "./src/ci/report.ts";
18
-
19
- // Re-export for consumers
20
6
  export { EXIT_CODES } from "./src/types.ts";
21
7
  export { resolveExitCode } from "./src/headless/exit-codes.ts";
22
8
  export { loadAnswers, matchAnswer, parseAnswers } from "./src/headless/answer-injector.ts";
@@ -30,23 +16,15 @@ export { generateReport } from "./src/ci/report.ts";
30
16
  export { ciStatusHandler, registerRun, clearRuns, createRunTracker } from "./src/tools/ci_status.ts";
31
17
  export { loadCiConfig, DEFAULT_CONFIG } from "./src/config.ts";
32
18
  export type { PiCiConfig } from "./src/config.ts";
33
-
34
19
  /**
35
20
  * Extension API type (minimal — avoids hard dep on pi-coding-agent types).
36
21
  */
37
22
  interface ExtensionAPI {
38
- registerCommand?: (name: string, handler: (args: unknown) => string | Promise<string>) => void;
39
- on?: (event: string, handler: (...args: unknown[]) => void) => void;
23
+ registerCommand?: (name: string, handler: (args: unknown) => string | Promise<string>) => void;
24
+ on?: (event: string, handler: (...args: unknown[]) => void) => void;
40
25
  }
41
-
42
26
  /**
43
27
  * Default export — Pi extension registration.
44
28
  */
45
- export default function piCiExtension(pi: ExtensionAPI): void {
46
- // Register /ci status command
47
- if (pi.registerCommand) {
48
- pi.registerCommand("ci", (args: unknown) => {
49
- return ciStatusHandler(args);
50
- });
51
- }
52
- }
29
+ export default function piCiExtension(pi: ExtensionAPI): void;
30
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACrG,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC/D,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAElD;;GAEG;AACH,UAAU,YAAY;IACpB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC;IAC/F,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;CACrE;AAED;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAO5D"}
package/dist/index.js ADDED
@@ -0,0 +1,31 @@
1
+ /**
2
+ * pi-ci — Pi extension entry point.
3
+ *
4
+ * Registers the /ci status command and CI lifecycle hooks.
5
+ */
6
+ import { ciStatusHandler, } from "./src/tools/ci_status.ts";
7
+ // Re-export for consumers
8
+ export { EXIT_CODES } from "./src/types.ts";
9
+ export { resolveExitCode } from "./src/headless/exit-codes.ts";
10
+ export { loadAnswers, matchAnswer, parseAnswers } from "./src/headless/answer-injector.ts";
11
+ export { IdleDetector } from "./src/headless/idle-detector.ts";
12
+ export { CIEventCollector, writeCIEvent } from "./src/headless/jsonl-stream.ts";
13
+ export { HeadlessOrchestrator } from "./src/headless/orchestrator.ts";
14
+ export { CIPipeline } from "./src/ci/pipeline.ts";
15
+ export { createPR, detectBaseBranch } from "./src/ci/pr-creator.ts";
16
+ export { parseTestResults } from "./src/ci/test-runner.ts";
17
+ export { generateReport } from "./src/ci/report.ts";
18
+ export { ciStatusHandler, registerRun, clearRuns, createRunTracker } from "./src/tools/ci_status.ts";
19
+ export { loadCiConfig, DEFAULT_CONFIG } from "./src/config.ts";
20
+ /**
21
+ * Default export — Pi extension registration.
22
+ */
23
+ export default function piCiExtension(pi) {
24
+ // Register /ci status command
25
+ if (pi.registerCommand) {
26
+ pi.registerCommand("ci", (args) => {
27
+ return ciStatusHandler(args);
28
+ });
29
+ }
30
+ }
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EACL,eAAe,GAKhB,MAAM,0BAA0B,CAAC;AAIlC,0BAA0B;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACrG,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAW/D;;GAEG;AACH,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,EAAgB;IACpD,8BAA8B;IAC9B,IAAI,EAAE,CAAC,eAAe,EAAE,CAAC;QACvB,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,IAAa,EAAE,EAAE;YACzC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * pi-ci — /ci status command handler.
3
+ *
4
+ * Shows the status of the current or last CI run.
5
+ */
6
+ import { CIEventCollector } from "../headless/jsonl-stream.ts";
7
+ import type { CIEvent, ExitCode } from "../types.ts";
8
+ export interface CIRunRecord {
9
+ id: string;
10
+ startTime: string;
11
+ events: CIEvent[];
12
+ exitCode?: ExitCode;
13
+ durationMs?: number;
14
+ }
15
+ /**
16
+ * Register a CI run for status lookups.
17
+ */
18
+ export declare function registerRun(record: CIRunRecord): void;
19
+ /**
20
+ * Clear all registered runs (useful for testing).
21
+ */
22
+ export declare function clearRuns(): void;
23
+ /**
24
+ * Get a specific run by ID (prefix match supported).
25
+ */
26
+ export declare function getRun(id: string): CIRunRecord | undefined;
27
+ /**
28
+ * Handle the /ci status command.
29
+ *
30
+ * Returns a human-readable status string.
31
+ */
32
+ export declare function ciStatusHandler(args: unknown): string;
33
+ /**
34
+ * Create a CI run tracker that collects events and registers the run.
35
+ */
36
+ export declare function createRunTracker(runId: string): {
37
+ collector: CIEventCollector;
38
+ finalize: () => CIRunRecord;
39
+ };
40
+ //# sourceMappingURL=ci_status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ci_status.d.ts","sourceRoot":"","sources":["../../src/tools/ci_status.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAE/D,OAAO,KAAK,EAAE,OAAO,EAAc,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGjE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAErD;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,IAAI,CAEhC;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAY1D;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAsBrD;AA4BD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG;IAC/C,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,MAAM,WAAW,CAAC;CAC7B,CAoBA"}