pi-cicd 0.3.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +19 -0
- package/README.md +34 -40
- package/docs/API.md +61 -0
- package/docs/COMMANDS.md +138 -0
- package/docs/CONFIG.md +123 -0
- package/docs/GUIDE.md +171 -0
- package/docs/PATTERNS.md +49 -0
- package/docs/QUICKSTART.md +99 -0
- package/{dist/index.d.ts → index.ts} +26 -4
- package/install.mjs +34 -0
- package/package.json +21 -21
- package/skills/intelligent-deploy/SKILL.md +229 -0
- package/src/ci/pipeline.ts +130 -0
- package/src/ci/pr-creator.ts +74 -0
- package/src/ci/report.ts +65 -0
- package/src/ci/test-runner.ts +129 -0
- package/src/config.ts +99 -0
- package/src/deploy/canary-deploy.ts +211 -0
- package/src/deploy/landing-queue.ts +222 -0
- package/src/headless/answer-injector.ts +99 -0
- package/src/headless/exit-codes.ts +32 -0
- package/src/headless/idle-detector.ts +76 -0
- package/src/headless/jsonl-stream.ts +90 -0
- package/src/headless/orchestrator.ts +207 -0
- package/{dist/index.js → src/index.ts} +30 -9
- package/src/tools/ci_status.ts +137 -0
- package/src/types.ts +149 -0
- package/src/workflow/deployment-workflow.ts +153 -0
- package/dist/ci/pipeline.d.ts +0 -43
- package/dist/ci/pipeline.d.ts.map +0 -1
- package/dist/ci/pipeline.js +0 -107
- package/dist/ci/pipeline.js.map +0 -1
- package/dist/ci/pr-creator.d.ts +0 -17
- package/dist/ci/pr-creator.d.ts.map +0 -1
- package/dist/ci/pr-creator.js +0 -67
- package/dist/ci/pr-creator.js.map +0 -1
- package/dist/ci/report.d.ts +0 -14
- package/dist/ci/report.d.ts.map +0 -1
- package/dist/ci/report.js +0 -51
- package/dist/ci/report.js.map +0 -1
- package/dist/ci/test-runner.d.ts +0 -10
- package/dist/ci/test-runner.d.ts.map +0 -1
- package/dist/ci/test-runner.js +0 -111
- package/dist/ci/test-runner.js.map +0 -1
- package/dist/config.d.ts +0 -33
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -67
- package/dist/config.js.map +0 -1
- package/dist/deploy/canary-deploy.d.ts +0 -80
- package/dist/deploy/canary-deploy.d.ts.map +0 -1
- package/dist/deploy/canary-deploy.js +0 -145
- package/dist/deploy/canary-deploy.js.map +0 -1
- package/dist/deploy/landing-queue.d.ts +0 -83
- package/dist/deploy/landing-queue.d.ts.map +0 -1
- package/dist/deploy/landing-queue.js +0 -172
- package/dist/deploy/landing-queue.js.map +0 -1
- package/dist/headless/answer-injector.d.ts +0 -27
- package/dist/headless/answer-injector.d.ts.map +0 -1
- package/dist/headless/answer-injector.js +0 -80
- package/dist/headless/answer-injector.js.map +0 -1
- package/dist/headless/exit-codes.d.ts +0 -13
- package/dist/headless/exit-codes.d.ts.map +0 -1
- package/dist/headless/exit-codes.js +0 -29
- package/dist/headless/exit-codes.js.map +0 -1
- package/dist/headless/idle-detector.d.ts +0 -32
- package/dist/headless/idle-detector.d.ts.map +0 -1
- package/dist/headless/idle-detector.js +0 -62
- package/dist/headless/idle-detector.js.map +0 -1
- package/dist/headless/jsonl-stream.d.ts +0 -28
- package/dist/headless/jsonl-stream.d.ts.map +0 -1
- package/dist/headless/jsonl-stream.js +0 -65
- package/dist/headless/jsonl-stream.js.map +0 -1
- package/dist/headless/orchestrator.d.ts +0 -63
- package/dist/headless/orchestrator.d.ts.map +0 -1
- package/dist/headless/orchestrator.js +0 -156
- package/dist/headless/orchestrator.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/tools/ci_status.d.ts +0 -40
- package/dist/tools/ci_status.d.ts.map +0 -1
- package/dist/tools/ci_status.js +0 -110
- package/dist/tools/ci_status.js.map +0 -1
- package/dist/types.d.ts +0 -93
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -17
- package/dist/types.js.map +0 -1
- package/dist/workflow/deployment-workflow.d.ts +0 -56
- package/dist/workflow/deployment-workflow.d.ts.map +0 -1
- package/dist/workflow/deployment-workflow.js +0 -95
- package/dist/workflow/deployment-workflow.js.map +0 -1
|
@@ -1,62 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,28 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,65 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,63 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,156 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/headless/orchestrator.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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"}
|
|
@@ -1,40 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/tools/ci_status.js
DELETED
|
@@ -1,110 +0,0 @@
|
|
|
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 { isCIEndEvent } from "../headless/jsonl-stream.ts";
|
|
8
|
-
/**
|
|
9
|
-
* Simple in-memory registry of CI runs (for the status command).
|
|
10
|
-
*/
|
|
11
|
-
const runRegistry = new Map();
|
|
12
|
-
/**
|
|
13
|
-
* Register a CI run for status lookups.
|
|
14
|
-
*/
|
|
15
|
-
export function registerRun(record) {
|
|
16
|
-
runRegistry.set(record.id, record);
|
|
17
|
-
}
|
|
18
|
-
/**
|
|
19
|
-
* Clear all registered runs (useful for testing).
|
|
20
|
-
*/
|
|
21
|
-
export function clearRuns() {
|
|
22
|
-
runRegistry.clear();
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* Get a specific run by ID (prefix match supported).
|
|
26
|
-
*/
|
|
27
|
-
export function getRun(id) {
|
|
28
|
-
// Exact match first
|
|
29
|
-
if (runRegistry.has(id)) {
|
|
30
|
-
return runRegistry.get(id);
|
|
31
|
-
}
|
|
32
|
-
// Prefix match
|
|
33
|
-
for (const [key, value] of runRegistry) {
|
|
34
|
-
if (key.startsWith(id)) {
|
|
35
|
-
return value;
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
return undefined;
|
|
39
|
-
}
|
|
40
|
-
/**
|
|
41
|
-
* Handle the /ci status command.
|
|
42
|
-
*
|
|
43
|
-
* Returns a human-readable status string.
|
|
44
|
-
*/
|
|
45
|
-
export function ciStatusHandler(args) {
|
|
46
|
-
const runId = typeof args === "string" ? args : undefined;
|
|
47
|
-
if (runId) {
|
|
48
|
-
const run = getRun(runId);
|
|
49
|
-
if (!run) {
|
|
50
|
-
return `No CI run found matching: ${runId}`;
|
|
51
|
-
}
|
|
52
|
-
return formatRunStatus(run);
|
|
53
|
-
}
|
|
54
|
-
// Show all runs
|
|
55
|
-
if (runRegistry.size === 0) {
|
|
56
|
-
return "No CI runs found.";
|
|
57
|
-
}
|
|
58
|
-
const lines = [];
|
|
59
|
-
for (const run of runRegistry.values()) {
|
|
60
|
-
lines.push(formatRunStatus(run));
|
|
61
|
-
lines.push("");
|
|
62
|
-
}
|
|
63
|
-
return lines.join("\n").trimEnd();
|
|
64
|
-
}
|
|
65
|
-
function formatRunStatus(run) {
|
|
66
|
-
const lines = [];
|
|
67
|
-
lines.push(`Run: ${run.id}`);
|
|
68
|
-
lines.push(`Started: ${run.startTime}`);
|
|
69
|
-
const endEvent = run.events.find((e) => isCIEndEvent(e));
|
|
70
|
-
if (endEvent) {
|
|
71
|
-
lines.push(`Exit Code: ${endEvent.exit_code}`);
|
|
72
|
-
lines.push(`Duration: ${(endEvent.duration_ms / 1000).toFixed(1)}s`);
|
|
73
|
-
const status = endEvent.exit_code === 0
|
|
74
|
-
? "SUCCESS"
|
|
75
|
-
: endEvent.exit_code === 10
|
|
76
|
-
? "BLOCKED"
|
|
77
|
-
: endEvent.exit_code === 11
|
|
78
|
-
? "CANCELLED"
|
|
79
|
-
: "ERROR";
|
|
80
|
-
lines.push(`Status: ${status}`);
|
|
81
|
-
}
|
|
82
|
-
else {
|
|
83
|
-
lines.push("Status: RUNNING");
|
|
84
|
-
}
|
|
85
|
-
return lines.join("\n");
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Create a CI run tracker that collects events and registers the run.
|
|
89
|
-
*/
|
|
90
|
-
export function createRunTracker(runId) {
|
|
91
|
-
const collector = new CIEventCollector();
|
|
92
|
-
const startTime = new Date().toISOString();
|
|
93
|
-
return {
|
|
94
|
-
collector,
|
|
95
|
-
finalize() {
|
|
96
|
-
const events = collector.all();
|
|
97
|
-
const endEvent = events.find((e) => isCIEndEvent(e));
|
|
98
|
-
const record = {
|
|
99
|
-
id: runId,
|
|
100
|
-
startTime,
|
|
101
|
-
events,
|
|
102
|
-
exitCode: endEvent?.exit_code,
|
|
103
|
-
durationMs: endEvent?.duration_ms,
|
|
104
|
-
};
|
|
105
|
-
registerRun(record);
|
|
106
|
-
return record;
|
|
107
|
-
},
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
//# sourceMappingURL=ci_status.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ci_status.js","sourceRoot":"","sources":["../../src/tools/ci_status.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* pi-ci — Shared types for headless CI mode.
|
|
3
|
-
*
|
|
4
|
-
* Exit code contract and CI event types per SPEC.md §2.1 and §5.
|
|
5
|
-
*/
|
|
6
|
-
export declare const EXIT_CODES: {
|
|
7
|
-
readonly SUCCESS: 0;
|
|
8
|
-
readonly ERROR: 1;
|
|
9
|
-
readonly TIMEOUT: 1;
|
|
10
|
-
readonly BLOCKED: 10;
|
|
11
|
-
readonly CANCELLED: 11;
|
|
12
|
-
readonly NEEDS_INPUT: 12;
|
|
13
|
-
};
|
|
14
|
-
export type ExitCode = (typeof EXIT_CODES)[keyof typeof EXIT_CODES];
|
|
15
|
-
export type CIEventType = "ci_start" | "ci_progress" | "ci_edit" | "ci_test" | "ci_cost" | "ci_end";
|
|
16
|
-
export interface CIEventBase {
|
|
17
|
-
type: CIEventType;
|
|
18
|
-
timestamp: string;
|
|
19
|
-
}
|
|
20
|
-
export interface CIStartEvent extends CIEventBase {
|
|
21
|
-
type: "ci_start";
|
|
22
|
-
task: string;
|
|
23
|
-
mode: "single" | "plan";
|
|
24
|
-
}
|
|
25
|
-
export type CIRunPhase = "exploring" | "planning" | "implementing" | "verifying" | "reviewing";
|
|
26
|
-
export interface CIProgressEvent extends CIEventBase {
|
|
27
|
-
type: "ci_progress";
|
|
28
|
-
phase: CIRunPhase;
|
|
29
|
-
files?: string[];
|
|
30
|
-
}
|
|
31
|
-
export interface CIEditEvent extends CIEventBase {
|
|
32
|
-
type: "ci_edit";
|
|
33
|
-
file: string;
|
|
34
|
-
lines_added: number;
|
|
35
|
-
lines_removed: number;
|
|
36
|
-
}
|
|
37
|
-
export interface CITestEvent extends CIEventBase {
|
|
38
|
-
type: "ci_test";
|
|
39
|
-
command: string;
|
|
40
|
-
passed: number;
|
|
41
|
-
failed: number;
|
|
42
|
-
}
|
|
43
|
-
export interface CICostEvent extends CIEventBase {
|
|
44
|
-
type: "ci_cost";
|
|
45
|
-
tokens: {
|
|
46
|
-
input: number;
|
|
47
|
-
output: number;
|
|
48
|
-
};
|
|
49
|
-
cost_usd: number;
|
|
50
|
-
}
|
|
51
|
-
export interface CIEndEvent extends CIEventBase {
|
|
52
|
-
type: "ci_end";
|
|
53
|
-
exit_code: ExitCode;
|
|
54
|
-
duration_ms: number;
|
|
55
|
-
}
|
|
56
|
-
export type CIEvent = CIStartEvent | CIProgressEvent | CIEditEvent | CITestEvent | CICostEvent | CIEndEvent;
|
|
57
|
-
export interface AnswerEntry {
|
|
58
|
-
match: string;
|
|
59
|
-
answer: string;
|
|
60
|
-
}
|
|
61
|
-
export interface AnswerFile {
|
|
62
|
-
answers: AnswerEntry[];
|
|
63
|
-
}
|
|
64
|
-
export interface TestSummary {
|
|
65
|
-
passed: number;
|
|
66
|
-
failed: number;
|
|
67
|
-
total: number;
|
|
68
|
-
duration_ms: number;
|
|
69
|
-
}
|
|
70
|
-
export interface PROptions {
|
|
71
|
-
title: string;
|
|
72
|
-
body?: string;
|
|
73
|
-
base?: string;
|
|
74
|
-
head?: string;
|
|
75
|
-
draft?: boolean;
|
|
76
|
-
labels?: string[];
|
|
77
|
-
}
|
|
78
|
-
export interface PRResult {
|
|
79
|
-
url: string;
|
|
80
|
-
number: number;
|
|
81
|
-
}
|
|
82
|
-
export type CIPipelineMode = "single" | "plan" | "review" | "supervised";
|
|
83
|
-
export interface CIOptions {
|
|
84
|
-
prompt: string;
|
|
85
|
-
mode: CIPipelineMode;
|
|
86
|
-
answersFile?: string;
|
|
87
|
-
planFile?: string;
|
|
88
|
-
prNumber?: number;
|
|
89
|
-
resume?: string;
|
|
90
|
-
idleTimeoutMs?: number;
|
|
91
|
-
maxRetries?: number;
|
|
92
|
-
}
|
|
93
|
-
//# sourceMappingURL=types.d.ts.map
|