@blockspool/cli 0.4.1 → 0.4.2
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/dist/bin/blockspool.d.ts +16 -0
- package/dist/bin/blockspool.d.ts.map +1 -0
- package/dist/bin/blockspool.js +45 -0
- package/dist/bin/blockspool.js.map +1 -0
- package/dist/commands/solo-auto.d.ts +6 -0
- package/dist/commands/solo-auto.d.ts.map +1 -0
- package/dist/commands/solo-auto.js +418 -0
- package/dist/commands/solo-auto.js.map +1 -0
- package/dist/commands/solo-exec.d.ts +6 -0
- package/dist/commands/solo-exec.d.ts.map +1 -0
- package/dist/commands/solo-exec.js +656 -0
- package/dist/commands/solo-exec.js.map +1 -0
- package/dist/commands/solo-inspect.d.ts +6 -0
- package/dist/commands/solo-inspect.d.ts.map +1 -0
- package/dist/commands/solo-inspect.js +690 -0
- package/dist/commands/solo-inspect.js.map +1 -0
- package/dist/commands/solo-lifecycle.d.ts +6 -0
- package/dist/commands/solo-lifecycle.d.ts.map +1 -0
- package/dist/commands/solo-lifecycle.js +188 -0
- package/dist/commands/solo-lifecycle.js.map +1 -0
- package/dist/commands/solo-nudge.d.ts +6 -0
- package/dist/commands/solo-nudge.d.ts.map +1 -0
- package/dist/commands/solo-nudge.js +49 -0
- package/dist/commands/solo-nudge.js.map +1 -0
- package/dist/commands/solo-qa.d.ts +6 -0
- package/dist/commands/solo-qa.d.ts.map +1 -0
- package/dist/commands/solo-qa.js +254 -0
- package/dist/commands/solo-qa.js.map +1 -0
- package/dist/commands/solo.d.ts +11 -0
- package/dist/commands/solo.d.ts.map +1 -0
- package/dist/commands/solo.js +43 -0
- package/dist/commands/solo.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/artifacts.d.ts +136 -0
- package/dist/lib/artifacts.d.ts.map +1 -0
- package/dist/lib/artifacts.js +146 -0
- package/dist/lib/artifacts.js.map +1 -0
- package/dist/lib/doctor.d.ts +45 -0
- package/dist/lib/doctor.d.ts.map +1 -0
- package/dist/lib/doctor.js +383 -0
- package/dist/lib/doctor.js.map +1 -0
- package/dist/lib/exec.d.ts +24 -0
- package/dist/lib/exec.d.ts.map +1 -0
- package/dist/lib/exec.js +295 -0
- package/dist/lib/exec.js.map +1 -0
- package/dist/lib/formulas.d.ts +78 -0
- package/dist/lib/formulas.d.ts.map +1 -0
- package/dist/lib/formulas.js +295 -0
- package/dist/lib/formulas.js.map +1 -0
- package/dist/lib/git.d.ts +9 -0
- package/dist/lib/git.d.ts.map +1 -0
- package/dist/lib/git.js +60 -0
- package/dist/lib/git.js.map +1 -0
- package/dist/lib/guidelines.d.ts +43 -0
- package/dist/lib/guidelines.d.ts.map +1 -0
- package/dist/lib/guidelines.js +195 -0
- package/dist/lib/guidelines.js.map +1 -0
- package/dist/lib/logger.d.ts +17 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +42 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/retention.d.ts +62 -0
- package/dist/lib/retention.d.ts.map +1 -0
- package/dist/lib/retention.js +285 -0
- package/dist/lib/retention.js.map +1 -0
- package/dist/lib/run-history.d.ts +52 -0
- package/dist/lib/run-history.d.ts.map +1 -0
- package/dist/lib/run-history.js +116 -0
- package/dist/lib/run-history.js.map +1 -0
- package/dist/lib/run-state.d.ts +58 -0
- package/dist/lib/run-state.d.ts.map +1 -0
- package/dist/lib/run-state.js +119 -0
- package/dist/lib/run-state.js.map +1 -0
- package/dist/lib/scope.d.ts +95 -0
- package/dist/lib/scope.d.ts.map +1 -0
- package/dist/lib/scope.js +291 -0
- package/dist/lib/scope.js.map +1 -0
- package/dist/lib/selection.d.ts +35 -0
- package/dist/lib/selection.d.ts.map +1 -0
- package/dist/lib/selection.js +110 -0
- package/dist/lib/selection.js.map +1 -0
- package/dist/lib/solo-auto.d.ts +87 -0
- package/dist/lib/solo-auto.d.ts.map +1 -0
- package/dist/lib/solo-auto.js +1230 -0
- package/dist/lib/solo-auto.js.map +1 -0
- package/dist/lib/solo-ci.d.ts +84 -0
- package/dist/lib/solo-ci.d.ts.map +1 -0
- package/dist/lib/solo-ci.js +300 -0
- package/dist/lib/solo-ci.js.map +1 -0
- package/dist/lib/solo-config.d.ts +155 -0
- package/dist/lib/solo-config.d.ts.map +1 -0
- package/dist/lib/solo-config.js +236 -0
- package/dist/lib/solo-config.js.map +1 -0
- package/dist/lib/solo-git.d.ts +44 -0
- package/dist/lib/solo-git.d.ts.map +1 -0
- package/dist/lib/solo-git.js +174 -0
- package/dist/lib/solo-git.js.map +1 -0
- package/dist/lib/solo-hints.d.ts +32 -0
- package/dist/lib/solo-hints.d.ts.map +1 -0
- package/dist/lib/solo-hints.js +98 -0
- package/dist/lib/solo-hints.js.map +1 -0
- package/dist/lib/solo-remote.d.ts +14 -0
- package/dist/lib/solo-remote.d.ts.map +1 -0
- package/dist/lib/solo-remote.js +48 -0
- package/dist/lib/solo-remote.js.map +1 -0
- package/dist/lib/solo-stdin.d.ts +13 -0
- package/dist/lib/solo-stdin.d.ts.map +1 -0
- package/dist/lib/solo-stdin.js +33 -0
- package/dist/lib/solo-stdin.js.map +1 -0
- package/dist/lib/solo-ticket.d.ts +213 -0
- package/dist/lib/solo-ticket.d.ts.map +1 -0
- package/dist/lib/solo-ticket.js +850 -0
- package/dist/lib/solo-ticket.js.map +1 -0
- package/dist/lib/solo-utils.d.ts +133 -0
- package/dist/lib/solo-utils.d.ts.map +1 -0
- package/dist/lib/solo-utils.js +300 -0
- package/dist/lib/solo-utils.js.map +1 -0
- package/dist/lib/spindle.d.ts +144 -0
- package/dist/lib/spindle.d.ts.map +1 -0
- package/dist/lib/spindle.js +388 -0
- package/dist/lib/spindle.js.map +1 -0
- package/dist/tui/app.d.ts +17 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +139 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/index.d.ts +8 -0
- package/dist/tui/index.d.ts.map +1 -0
- package/dist/tui/index.js +7 -0
- package/dist/tui/index.js.map +1 -0
- package/dist/tui/poller.d.ts +42 -0
- package/dist/tui/poller.d.ts.map +1 -0
- package/dist/tui/poller.js +62 -0
- package/dist/tui/poller.js.map +1 -0
- package/dist/tui/screens/overview.d.ts +9 -0
- package/dist/tui/screens/overview.d.ts.map +1 -0
- package/dist/tui/screens/overview.js +189 -0
- package/dist/tui/screens/overview.js.map +1 -0
- package/dist/tui/state.d.ts +93 -0
- package/dist/tui/state.d.ts.map +1 -0
- package/dist/tui/state.js +169 -0
- package/dist/tui/state.js.map +1 -0
- package/dist/tui/types.d.ts +18 -0
- package/dist/tui/types.d.ts.map +1 -0
- package/dist/tui/types.js +5 -0
- package/dist/tui/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hints system for live steering of auto mode.
|
|
3
|
+
*
|
|
4
|
+
* Multiple frontends (stdin listener, `solo nudge` CLI) write to
|
|
5
|
+
* `.blockspool/hints.json`. The scout loop consumes pending hints
|
|
6
|
+
* and injects them into the scout prompt via `customPrompt`.
|
|
7
|
+
*/
|
|
8
|
+
export interface Hint {
|
|
9
|
+
id: string;
|
|
10
|
+
text: string;
|
|
11
|
+
createdAt: number;
|
|
12
|
+
consumed: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Read all hints from disk, pruning stale consumed ones.
|
|
16
|
+
*/
|
|
17
|
+
export declare function readHints(repoRoot: string): Hint[];
|
|
18
|
+
/**
|
|
19
|
+
* Add a new hint. Returns the created hint.
|
|
20
|
+
*/
|
|
21
|
+
export declare function addHint(repoRoot: string, text: string): Hint;
|
|
22
|
+
/**
|
|
23
|
+
* Consume all pending (unconsumed) hints.
|
|
24
|
+
* Marks them as consumed and returns a formatted prompt block,
|
|
25
|
+
* or null if there are no pending hints.
|
|
26
|
+
*/
|
|
27
|
+
export declare function consumePendingHints(repoRoot: string): string | null;
|
|
28
|
+
/**
|
|
29
|
+
* Clear all hints.
|
|
30
|
+
*/
|
|
31
|
+
export declare function clearHints(repoRoot: string): void;
|
|
32
|
+
//# sourceMappingURL=solo-hints.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solo-hints.d.ts","sourceRoot":"","sources":["../../src/lib/solo-hints.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,IAAI;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAmBD;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,CAsBlD;AAgBD;;GAEG;AACH,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAY5D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAanE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAEjD"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hints system for live steering of auto mode.
|
|
3
|
+
*
|
|
4
|
+
* Multiple frontends (stdin listener, `solo nudge` CLI) write to
|
|
5
|
+
* `.blockspool/hints.json`. The scout loop consumes pending hints
|
|
6
|
+
* and injects them into the scout prompt via `customPrompt`.
|
|
7
|
+
*/
|
|
8
|
+
import * as fs from 'node:fs';
|
|
9
|
+
import * as path from 'node:path';
|
|
10
|
+
import * as crypto from 'node:crypto';
|
|
11
|
+
const HINTS_FILE = 'hints.json';
|
|
12
|
+
const HINTS_TMP = 'hints.json.tmp';
|
|
13
|
+
const MAX_HINT_LENGTH = 500;
|
|
14
|
+
const PRUNE_AGE_MS = 60 * 60 * 1000; // 1 hour
|
|
15
|
+
function hintsPath(repoRoot) {
|
|
16
|
+
return path.join(repoRoot, '.blockspool', HINTS_FILE);
|
|
17
|
+
}
|
|
18
|
+
function hintsTmpPath(repoRoot) {
|
|
19
|
+
return path.join(repoRoot, '.blockspool', HINTS_TMP);
|
|
20
|
+
}
|
|
21
|
+
function generateId() {
|
|
22
|
+
return crypto.randomBytes(8).toString('hex');
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Read all hints from disk, pruning stale consumed ones.
|
|
26
|
+
*/
|
|
27
|
+
export function readHints(repoRoot) {
|
|
28
|
+
const fp = hintsPath(repoRoot);
|
|
29
|
+
if (!fs.existsSync(fp))
|
|
30
|
+
return [];
|
|
31
|
+
try {
|
|
32
|
+
const raw = fs.readFileSync(fp, 'utf-8');
|
|
33
|
+
const hints = JSON.parse(raw);
|
|
34
|
+
const now = Date.now();
|
|
35
|
+
// Prune consumed hints older than 1 hour
|
|
36
|
+
const kept = hints.filter((h) => !(h.consumed && now - h.createdAt > PRUNE_AGE_MS));
|
|
37
|
+
if (kept.length !== hints.length) {
|
|
38
|
+
atomicWrite(repoRoot, kept);
|
|
39
|
+
}
|
|
40
|
+
return kept;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Atomically write hints array to disk.
|
|
48
|
+
*/
|
|
49
|
+
function atomicWrite(repoRoot, hints) {
|
|
50
|
+
const dir = path.join(repoRoot, '.blockspool');
|
|
51
|
+
if (!fs.existsSync(dir)) {
|
|
52
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
53
|
+
}
|
|
54
|
+
const tmp = hintsTmpPath(repoRoot);
|
|
55
|
+
const target = hintsPath(repoRoot);
|
|
56
|
+
fs.writeFileSync(tmp, JSON.stringify(hints, null, 2), 'utf-8');
|
|
57
|
+
fs.renameSync(tmp, target);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Add a new hint. Returns the created hint.
|
|
61
|
+
*/
|
|
62
|
+
export function addHint(repoRoot, text) {
|
|
63
|
+
const truncated = text.slice(0, MAX_HINT_LENGTH);
|
|
64
|
+
const hints = readHints(repoRoot);
|
|
65
|
+
const hint = {
|
|
66
|
+
id: generateId(),
|
|
67
|
+
text: truncated,
|
|
68
|
+
createdAt: Date.now(),
|
|
69
|
+
consumed: false,
|
|
70
|
+
};
|
|
71
|
+
hints.push(hint);
|
|
72
|
+
atomicWrite(repoRoot, hints);
|
|
73
|
+
return hint;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Consume all pending (unconsumed) hints.
|
|
77
|
+
* Marks them as consumed and returns a formatted prompt block,
|
|
78
|
+
* or null if there are no pending hints.
|
|
79
|
+
*/
|
|
80
|
+
export function consumePendingHints(repoRoot) {
|
|
81
|
+
const hints = readHints(repoRoot);
|
|
82
|
+
const pending = hints.filter((h) => !h.consumed);
|
|
83
|
+
if (pending.length === 0)
|
|
84
|
+
return null;
|
|
85
|
+
for (const h of pending) {
|
|
86
|
+
h.consumed = true;
|
|
87
|
+
}
|
|
88
|
+
atomicWrite(repoRoot, hints);
|
|
89
|
+
const lines = pending.map((h) => `- "${h.text}"`).join('\n');
|
|
90
|
+
return `\n## User Steering Hints\n${lines}`;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Clear all hints.
|
|
94
|
+
*/
|
|
95
|
+
export function clearHints(repoRoot) {
|
|
96
|
+
atomicWrite(repoRoot, []);
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=solo-hints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solo-hints.js","sourceRoot":"","sources":["../../src/lib/solo-hints.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Push safety — remote URL normalization and push-time assertion.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Normalize a git remote URL to a canonical form: `github.com/org/repo`
|
|
6
|
+
* Handles SSH (`git@github.com:org/repo.git`) and HTTPS (`https://github.com/org/repo.git`).
|
|
7
|
+
*/
|
|
8
|
+
export declare function normalizeRemoteUrl(url: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Assert that the current origin matches the allowed remote recorded at init time.
|
|
11
|
+
* Throws on mismatch. If `allowedRemote` is undefined, logs a warning but proceeds (backward compat).
|
|
12
|
+
*/
|
|
13
|
+
export declare function assertPushSafe(cwd: string, allowedRemote: string | undefined): Promise<void>;
|
|
14
|
+
//# sourceMappingURL=solo-remote.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solo-remote.d.ts","sourceRoot":"","sources":["../../src/lib/solo-remote.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAsBtD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBlG"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Push safety — remote URL normalization and push-time assertion.
|
|
3
|
+
*/
|
|
4
|
+
import { execSync } from 'node:child_process';
|
|
5
|
+
/**
|
|
6
|
+
* Normalize a git remote URL to a canonical form: `github.com/org/repo`
|
|
7
|
+
* Handles SSH (`git@github.com:org/repo.git`) and HTTPS (`https://github.com/org/repo.git`).
|
|
8
|
+
*/
|
|
9
|
+
export function normalizeRemoteUrl(url) {
|
|
10
|
+
let u = url.trim();
|
|
11
|
+
// SSH: git@github.com:org/repo.git → github.com/org/repo
|
|
12
|
+
const sshMatch = u.match(/^[\w-]+@([^:]+):(.+)$/);
|
|
13
|
+
if (sshMatch) {
|
|
14
|
+
u = `${sshMatch[1]}/${sshMatch[2]}`;
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
// HTTPS: https://github.com/org/repo.git → github.com/org/repo
|
|
18
|
+
// eslint-disable-next-line security/detect-unsafe-regex
|
|
19
|
+
const httpsMatch = u.match(/^https?:\/\/([^/]+)(\/.*)?$/i);
|
|
20
|
+
if (httpsMatch) {
|
|
21
|
+
u = `${httpsMatch[1]}${httpsMatch[2] ?? ''}`;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Strip trailing .git
|
|
25
|
+
u = u.replace(/\.git$/, '');
|
|
26
|
+
// Strip trailing slash
|
|
27
|
+
u = u.replace(/\/+$/, '');
|
|
28
|
+
return u.toLowerCase();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Assert that the current origin matches the allowed remote recorded at init time.
|
|
32
|
+
* Throws on mismatch. If `allowedRemote` is undefined, logs a warning but proceeds (backward compat).
|
|
33
|
+
*/
|
|
34
|
+
export async function assertPushSafe(cwd, allowedRemote) {
|
|
35
|
+
if (allowedRemote === undefined) {
|
|
36
|
+
console.warn('[push-safety] No allowedRemote configured — skipping push guard. Run "blockspool solo init --force" to set one.');
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const currentRemote = execSync('git remote get-url origin', { cwd, encoding: 'utf-8' }).trim();
|
|
40
|
+
const normalizedCurrent = normalizeRemoteUrl(currentRemote);
|
|
41
|
+
const normalizedAllowed = normalizeRemoteUrl(allowedRemote);
|
|
42
|
+
if (normalizedCurrent !== normalizedAllowed) {
|
|
43
|
+
throw new Error(`Push blocked: origin "${currentRemote}" (normalized: ${normalizedCurrent}) does not match ` +
|
|
44
|
+
`allowed remote "${allowedRemote}" (normalized: ${normalizedAllowed}). ` +
|
|
45
|
+
'Re-run "blockspool solo init --force" if this is intentional.');
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=solo-remote.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solo-remote.js","sourceRoot":"","sources":["../../src/lib/solo-remote.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,GAAW;IAC5C,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAEnB,yDAAyD;IACzD,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAC;IAClD,IAAI,QAAQ,EAAE,CAAC;QACb,CAAC,GAAG,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,+DAA+D;QAC/D,wDAAwD;QACxD,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAC3D,IAAI,UAAU,EAAE,CAAC;YACf,CAAC,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,sBAAsB;IACtB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC5B,uBAAuB;IACvB,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAE1B,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,aAAiC;IACjF,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,iHAAiH,CAAC,CAAC;QAChI,OAAO;IACT,CAAC;IAED,MAAM,aAAa,GAAG,QAAQ,CAAC,2BAA2B,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/F,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAC5D,MAAM,iBAAiB,GAAG,kBAAkB,CAAC,aAAa,CAAC,CAAC;IAE5D,IAAI,iBAAiB,KAAK,iBAAiB,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACb,yBAAyB,aAAa,kBAAkB,iBAAiB,mBAAmB;YAC5F,mBAAmB,aAAa,kBAAkB,iBAAiB,KAAK;YACxE,+DAA+D,CAChE,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-blocking stdin listener for live hints during auto mode.
|
|
3
|
+
*
|
|
4
|
+
* When running in a TTY, reads lines from stdin and adds them
|
|
5
|
+
* as hints via the solo-hints module.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Start listening for hint input on stdin.
|
|
9
|
+
* Returns a cleanup function that stops listening.
|
|
10
|
+
* Only activates when stdin is a TTY.
|
|
11
|
+
*/
|
|
12
|
+
export declare function startStdinListener(repoRoot: string): () => void;
|
|
13
|
+
//# sourceMappingURL=solo-stdin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solo-stdin.d.ts","sourceRoot":"","sources":["../../src/lib/solo-stdin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,IAAI,CAoB/D"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Non-blocking stdin listener for live hints during auto mode.
|
|
3
|
+
*
|
|
4
|
+
* When running in a TTY, reads lines from stdin and adds them
|
|
5
|
+
* as hints via the solo-hints module.
|
|
6
|
+
*/
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import { addHint } from './solo-hints.js';
|
|
9
|
+
/**
|
|
10
|
+
* Start listening for hint input on stdin.
|
|
11
|
+
* Returns a cleanup function that stops listening.
|
|
12
|
+
* Only activates when stdin is a TTY.
|
|
13
|
+
*/
|
|
14
|
+
export function startStdinListener(repoRoot) {
|
|
15
|
+
if (!process.stdin.isTTY) {
|
|
16
|
+
return () => { };
|
|
17
|
+
}
|
|
18
|
+
const onData = (data) => {
|
|
19
|
+
const text = data.trim();
|
|
20
|
+
if (!text)
|
|
21
|
+
return;
|
|
22
|
+
const hint = addHint(repoRoot, text);
|
|
23
|
+
console.log(chalk.yellow(`💡 Hint added: "${hint.text}"`));
|
|
24
|
+
};
|
|
25
|
+
process.stdin.setEncoding('utf8');
|
|
26
|
+
process.stdin.resume();
|
|
27
|
+
process.stdin.on('data', onData);
|
|
28
|
+
return () => {
|
|
29
|
+
process.stdin.removeListener('data', onData);
|
|
30
|
+
process.stdin.pause();
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=solo-stdin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solo-stdin.js","sourceRoot":"","sources":["../../src/lib/solo-stdin.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE1C;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACzB,OAAO,GAAG,EAAE,GAAE,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,EAAE;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI;YAAE,OAAO;QAClB,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,mBAAmB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC;IAEF,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,OAAO,GAAG,EAAE;QACV,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Solo mode ticket execution
|
|
3
|
+
*/
|
|
4
|
+
import { tickets, type StepKind } from '@blockspool/core/repos';
|
|
5
|
+
import type { SoloConfig } from './solo-config.js';
|
|
6
|
+
import { getAdapter } from './solo-config.js';
|
|
7
|
+
/**
|
|
8
|
+
* Canonical failure reasons for run results
|
|
9
|
+
*/
|
|
10
|
+
export type FailureReason = 'agent_error' | 'scope_violation' | 'spindle_abort' | 'qa_failed' | 'git_error' | 'pr_error' | 'timeout' | 'cancelled';
|
|
11
|
+
/**
|
|
12
|
+
* Outcome type for successful completions that don't involve code changes
|
|
13
|
+
*/
|
|
14
|
+
export type CompletionOutcome = 'no_changes_needed';
|
|
15
|
+
/**
|
|
16
|
+
* Spindle abort details for diagnostics
|
|
17
|
+
*/
|
|
18
|
+
export interface SpindleAbortDetails {
|
|
19
|
+
trigger: 'oscillation' | 'spinning' | 'stalling' | 'repetition' | 'token_budget';
|
|
20
|
+
confidence: number;
|
|
21
|
+
estimatedTokens: number;
|
|
22
|
+
iteration: number;
|
|
23
|
+
thresholds: {
|
|
24
|
+
similarityThreshold: number;
|
|
25
|
+
maxSimilarOutputs: number;
|
|
26
|
+
maxStallIterations: number;
|
|
27
|
+
tokenBudgetWarning: number;
|
|
28
|
+
tokenBudgetAbort: number;
|
|
29
|
+
};
|
|
30
|
+
metrics: {
|
|
31
|
+
similarityScore?: number;
|
|
32
|
+
iterationsWithoutChange?: number;
|
|
33
|
+
repeatedPatterns?: string[];
|
|
34
|
+
oscillationPattern?: string;
|
|
35
|
+
};
|
|
36
|
+
recommendations: string[];
|
|
37
|
+
artifactPath: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Result of running a ticket
|
|
41
|
+
*/
|
|
42
|
+
export interface RunTicketResult {
|
|
43
|
+
success: boolean;
|
|
44
|
+
branchName?: string;
|
|
45
|
+
prUrl?: string;
|
|
46
|
+
durationMs: number;
|
|
47
|
+
error?: string;
|
|
48
|
+
failureReason?: FailureReason;
|
|
49
|
+
completionOutcome?: CompletionOutcome;
|
|
50
|
+
spindle?: SpindleAbortDetails;
|
|
51
|
+
artifacts?: {
|
|
52
|
+
execution?: string;
|
|
53
|
+
diff?: string;
|
|
54
|
+
violations?: string;
|
|
55
|
+
spindle?: string;
|
|
56
|
+
runSummary?: string;
|
|
57
|
+
};
|
|
58
|
+
scopeExpanded?: {
|
|
59
|
+
addedPaths: string[];
|
|
60
|
+
newRetryCount: number;
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Exit codes for solo run
|
|
65
|
+
*/
|
|
66
|
+
export declare const EXIT_CODES: {
|
|
67
|
+
readonly SUCCESS: 0;
|
|
68
|
+
readonly FAILURE: 1;
|
|
69
|
+
readonly SPINDLE_ABORT: 2;
|
|
70
|
+
readonly SIGINT: 130;
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Options for running a ticket
|
|
74
|
+
*/
|
|
75
|
+
export interface RunTicketOptions {
|
|
76
|
+
ticket: Awaited<ReturnType<typeof tickets.getById>> & {};
|
|
77
|
+
repoRoot: string;
|
|
78
|
+
config: SoloConfig | null;
|
|
79
|
+
adapter: Awaited<ReturnType<typeof getAdapter>>;
|
|
80
|
+
runId: string;
|
|
81
|
+
skipQa: boolean;
|
|
82
|
+
createPr: boolean;
|
|
83
|
+
draftPr?: boolean;
|
|
84
|
+
timeoutMs: number;
|
|
85
|
+
verbose: boolean;
|
|
86
|
+
onProgress: (msg: string) => void;
|
|
87
|
+
/** Override the base branch for worktree creation (e.g. milestone branch) */
|
|
88
|
+
baseBranch?: string;
|
|
89
|
+
/** Skip pushing the branch to origin */
|
|
90
|
+
skipPush?: boolean;
|
|
91
|
+
/** Skip PR creation even if createPr is true */
|
|
92
|
+
skipPr?: boolean;
|
|
93
|
+
/** Execution backend override (default: ClaudeExecutionBackend) */
|
|
94
|
+
executionBackend?: ExecutionBackend;
|
|
95
|
+
/** Project guidelines context to prepend to execution prompt */
|
|
96
|
+
guidelinesContext?: string;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Execution step definitions
|
|
100
|
+
*/
|
|
101
|
+
declare const EXECUTE_STEPS: readonly [{
|
|
102
|
+
readonly name: "worktree";
|
|
103
|
+
readonly kind: StepKind;
|
|
104
|
+
}, {
|
|
105
|
+
readonly name: "agent";
|
|
106
|
+
readonly kind: StepKind;
|
|
107
|
+
}, {
|
|
108
|
+
readonly name: "scope";
|
|
109
|
+
readonly kind: StepKind;
|
|
110
|
+
}, {
|
|
111
|
+
readonly name: "commit";
|
|
112
|
+
readonly kind: StepKind;
|
|
113
|
+
}, {
|
|
114
|
+
readonly name: "push";
|
|
115
|
+
readonly kind: StepKind;
|
|
116
|
+
}, {
|
|
117
|
+
readonly name: "qa";
|
|
118
|
+
readonly kind: StepKind;
|
|
119
|
+
}, {
|
|
120
|
+
readonly name: "pr";
|
|
121
|
+
readonly kind: StepKind;
|
|
122
|
+
}, {
|
|
123
|
+
readonly name: "cleanup";
|
|
124
|
+
readonly kind: StepKind;
|
|
125
|
+
}];
|
|
126
|
+
export type StepName = typeof EXECUTE_STEPS[number]['name'];
|
|
127
|
+
/**
|
|
128
|
+
* Build the prompt for Claude from a ticket
|
|
129
|
+
*/
|
|
130
|
+
export declare function buildTicketPrompt(ticket: NonNullable<Awaited<ReturnType<typeof tickets.getById>>>, guidelinesContext?: string): string;
|
|
131
|
+
/**
|
|
132
|
+
* Execution result with full details for artifact storage
|
|
133
|
+
*/
|
|
134
|
+
export interface ClaudeResult {
|
|
135
|
+
success: boolean;
|
|
136
|
+
error?: string;
|
|
137
|
+
stdout: string;
|
|
138
|
+
stderr: string;
|
|
139
|
+
exitCode: number | null;
|
|
140
|
+
timedOut: boolean;
|
|
141
|
+
durationMs: number;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Pluggable execution backend interface
|
|
145
|
+
*/
|
|
146
|
+
export interface ExecutionBackend {
|
|
147
|
+
/** Human-readable name for logging */
|
|
148
|
+
readonly name: string;
|
|
149
|
+
/** Run a prompt against a worktree and return the result */
|
|
150
|
+
run(opts: {
|
|
151
|
+
worktreePath: string;
|
|
152
|
+
prompt: string;
|
|
153
|
+
timeoutMs: number;
|
|
154
|
+
verbose: boolean;
|
|
155
|
+
onProgress: (msg: string) => void;
|
|
156
|
+
}): Promise<ClaudeResult>;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Claude Code CLI execution backend (default)
|
|
160
|
+
*/
|
|
161
|
+
export declare class ClaudeExecutionBackend implements ExecutionBackend {
|
|
162
|
+
readonly name = "claude";
|
|
163
|
+
run(opts: {
|
|
164
|
+
worktreePath: string;
|
|
165
|
+
prompt: string;
|
|
166
|
+
timeoutMs: number;
|
|
167
|
+
verbose: boolean;
|
|
168
|
+
onProgress: (msg: string) => void;
|
|
169
|
+
}): Promise<ClaudeResult>;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Codex CLI execution backend
|
|
173
|
+
*
|
|
174
|
+
* Default: `--sandbox workspace-write --ask-for-approval never` (safe unattended mode).
|
|
175
|
+
* Optional: `unsafeBypassSandbox` enables `--dangerously-bypass-approvals-and-sandbox`
|
|
176
|
+
* for use inside externally hardened/isolated runners only.
|
|
177
|
+
*/
|
|
178
|
+
export declare class CodexExecutionBackend implements ExecutionBackend {
|
|
179
|
+
readonly name = "codex";
|
|
180
|
+
private apiKey?;
|
|
181
|
+
private model;
|
|
182
|
+
private unsafeBypassSandbox;
|
|
183
|
+
constructor(opts?: {
|
|
184
|
+
apiKey?: string;
|
|
185
|
+
model?: string;
|
|
186
|
+
unsafeBypassSandbox?: boolean;
|
|
187
|
+
});
|
|
188
|
+
run(opts: {
|
|
189
|
+
worktreePath: string;
|
|
190
|
+
prompt: string;
|
|
191
|
+
timeoutMs: number;
|
|
192
|
+
verbose: boolean;
|
|
193
|
+
onProgress: (msg: string) => void;
|
|
194
|
+
}): Promise<ClaudeResult>;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Run Claude Code CLI
|
|
198
|
+
*/
|
|
199
|
+
export declare function runClaude(opts: {
|
|
200
|
+
worktreePath: string;
|
|
201
|
+
prompt: string;
|
|
202
|
+
timeoutMs: number;
|
|
203
|
+
verbose: boolean;
|
|
204
|
+
onProgress: (msg: string) => void;
|
|
205
|
+
}): Promise<ClaudeResult>;
|
|
206
|
+
/**
|
|
207
|
+
* Execute a ticket in isolation with step tracking
|
|
208
|
+
*
|
|
209
|
+
* Steps tracked: worktree → agent → commit → push → qa → pr → cleanup
|
|
210
|
+
*/
|
|
211
|
+
export declare function soloRunTicket(opts: RunTicketOptions): Promise<RunTicketResult>;
|
|
212
|
+
export {};
|
|
213
|
+
//# sourceMappingURL=solo-ticket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solo-ticket.d.ts","sourceRoot":"","sources":["../../src/lib/solo-ticket.ts"],"names":[],"mappings":"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"}
|