@promptwheel/core 0.6.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.
- package/dist/codebase-index/index.d.ts +23 -0
- package/dist/codebase-index/index.d.ts.map +1 -0
- package/dist/codebase-index/index.js +361 -0
- package/dist/codebase-index/index.js.map +1 -0
- package/dist/codebase-index/shared.d.ts +95 -0
- package/dist/codebase-index/shared.d.ts.map +1 -0
- package/dist/codebase-index/shared.js +319 -0
- package/dist/codebase-index/shared.js.map +1 -0
- package/dist/config/defaults.d.ts +45 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +79 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/critic/shared.d.ts +49 -0
- package/dist/critic/shared.d.ts.map +1 -0
- package/dist/critic/shared.js +204 -0
- package/dist/critic/shared.js.map +1 -0
- package/dist/db/adapter.d.ts +191 -0
- package/dist/db/adapter.d.ts.map +1 -0
- package/dist/db/adapter.js +40 -0
- package/dist/db/adapter.js.map +1 -0
- package/dist/db/contract.d.ts +47 -0
- package/dist/db/contract.d.ts.map +1 -0
- package/dist/db/contract.js +258 -0
- package/dist/db/contract.js.map +1 -0
- package/dist/db/index.d.ts +6 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +7 -0
- package/dist/db/index.js.map +1 -0
- package/dist/dedup/shared.d.ts +82 -0
- package/dist/dedup/shared.d.ts.map +1 -0
- package/dist/dedup/shared.js +215 -0
- package/dist/dedup/shared.js.map +1 -0
- package/dist/exec/index.d.ts +5 -0
- package/dist/exec/index.d.ts.map +1 -0
- package/dist/exec/index.js +5 -0
- package/dist/exec/index.js.map +1 -0
- package/dist/exec/types.d.ts +64 -0
- package/dist/exec/types.d.ts.map +1 -0
- package/dist/exec/types.js +8 -0
- package/dist/exec/types.js.map +1 -0
- package/dist/formulas/shared.d.ts +42 -0
- package/dist/formulas/shared.d.ts.map +1 -0
- package/dist/formulas/shared.js +204 -0
- package/dist/formulas/shared.js.map +1 -0
- package/dist/guidelines/shared.d.ts +46 -0
- package/dist/guidelines/shared.d.ts.map +1 -0
- package/dist/guidelines/shared.js +128 -0
- package/dist/guidelines/shared.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/learnings/shared.d.ts +112 -0
- package/dist/learnings/shared.d.ts.map +1 -0
- package/dist/learnings/shared.js +402 -0
- package/dist/learnings/shared.js.map +1 -0
- package/dist/proposals/shared.d.ts +137 -0
- package/dist/proposals/shared.d.ts.map +1 -0
- package/dist/proposals/shared.js +254 -0
- package/dist/proposals/shared.js.map +1 -0
- package/dist/repos/index.d.ts +15 -0
- package/dist/repos/index.d.ts.map +1 -0
- package/dist/repos/index.js +11 -0
- package/dist/repos/index.js.map +1 -0
- package/dist/repos/projects.d.ts +41 -0
- package/dist/repos/projects.d.ts.map +1 -0
- package/dist/repos/projects.js +75 -0
- package/dist/repos/projects.js.map +1 -0
- package/dist/repos/run_steps.d.ts +152 -0
- package/dist/repos/run_steps.d.ts.map +1 -0
- package/dist/repos/run_steps.js +328 -0
- package/dist/repos/run_steps.js.map +1 -0
- package/dist/repos/runs.d.ts +92 -0
- package/dist/repos/runs.d.ts.map +1 -0
- package/dist/repos/runs.js +185 -0
- package/dist/repos/runs.js.map +1 -0
- package/dist/repos/tickets.d.ts +71 -0
- package/dist/repos/tickets.d.ts.map +1 -0
- package/dist/repos/tickets.js +158 -0
- package/dist/repos/tickets.js.map +1 -0
- package/dist/scope/shared.d.ts +67 -0
- package/dist/scope/shared.d.ts.map +1 -0
- package/dist/scope/shared.js +355 -0
- package/dist/scope/shared.js.map +1 -0
- package/dist/scout/index.d.ts +18 -0
- package/dist/scout/index.d.ts.map +1 -0
- package/dist/scout/index.js +445 -0
- package/dist/scout/index.js.map +1 -0
- package/dist/scout/kimi-runner.d.ts +21 -0
- package/dist/scout/kimi-runner.d.ts.map +1 -0
- package/dist/scout/kimi-runner.js +76 -0
- package/dist/scout/kimi-runner.js.map +1 -0
- package/dist/scout/mcp-batch-server.d.ts +37 -0
- package/dist/scout/mcp-batch-server.d.ts.map +1 -0
- package/dist/scout/mcp-batch-server.js +144 -0
- package/dist/scout/mcp-batch-server.js.map +1 -0
- package/dist/scout/openai-local-runner.d.ts +20 -0
- package/dist/scout/openai-local-runner.d.ts.map +1 -0
- package/dist/scout/openai-local-runner.js +82 -0
- package/dist/scout/openai-local-runner.js.map +1 -0
- package/dist/scout/prompt.d.ts +49 -0
- package/dist/scout/prompt.d.ts.map +1 -0
- package/dist/scout/prompt.js +153 -0
- package/dist/scout/prompt.js.map +1 -0
- package/dist/scout/runner.d.ts +101 -0
- package/dist/scout/runner.d.ts.map +1 -0
- package/dist/scout/runner.js +521 -0
- package/dist/scout/runner.js.map +1 -0
- package/dist/scout/scanner.d.ts +61 -0
- package/dist/scout/scanner.d.ts.map +1 -0
- package/dist/scout/scanner.js +315 -0
- package/dist/scout/scanner.js.map +1 -0
- package/dist/scout/types.d.ts +221 -0
- package/dist/scout/types.d.ts.map +1 -0
- package/dist/scout/types.js +44 -0
- package/dist/scout/types.js.map +1 -0
- package/dist/sectors/shared.d.ts +146 -0
- package/dist/sectors/shared.d.ts.map +1 -0
- package/dist/sectors/shared.js +408 -0
- package/dist/sectors/shared.js.map +1 -0
- package/dist/services/index.d.ts +10 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +9 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/qa.d.ts +76 -0
- package/dist/services/qa.d.ts.map +1 -0
- package/dist/services/qa.js +228 -0
- package/dist/services/qa.js.map +1 -0
- package/dist/services/scout.d.ts +164 -0
- package/dist/services/scout.d.ts.map +1 -0
- package/dist/services/scout.js +215 -0
- package/dist/services/scout.js.map +1 -0
- package/dist/spindle/shared.d.ts +14 -0
- package/dist/spindle/shared.d.ts.map +1 -0
- package/dist/spindle/shared.js +65 -0
- package/dist/spindle/shared.js.map +1 -0
- package/dist/tools/shared.d.ts +35 -0
- package/dist/tools/shared.d.ts.map +1 -0
- package/dist/tools/shared.js +247 -0
- package/dist/tools/shared.js.map +1 -0
- package/dist/trace/shared.d.ts +147 -0
- package/dist/trace/shared.d.ts.map +1 -0
- package/dist/trace/shared.js +414 -0
- package/dist/trace/shared.js.map +1 -0
- package/dist/trajectory/shared.d.ts +69 -0
- package/dist/trajectory/shared.d.ts.map +1 -0
- package/dist/trajectory/shared.js +336 -0
- package/dist/trajectory/shared.js.map +1 -0
- package/dist/utils/id.d.ts +12 -0
- package/dist/utils/id.d.ts.map +1 -0
- package/dist/utils/id.js +24 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/id.test.d.ts +5 -0
- package/dist/utils/id.test.d.ts.map +1 -0
- package/dist/utils/id.test.js +173 -0
- package/dist/utils/id.test.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/json.d.ts +9 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/json.js +19 -0
- package/dist/utils/json.js.map +1 -0
- package/dist/waves/shared.d.ts +106 -0
- package/dist/waves/shared.d.ts.map +1 -0
- package/dist/waves/shared.js +356 -0
- package/dist/waves/shared.js.map +1 -0
- package/package.json +126 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QA Service - Run local QA commands and record results
|
|
3
|
+
*
|
|
4
|
+
* This is pure orchestration: no FS writes, no raw SQL.
|
|
5
|
+
* Uses repos + ExecRunner for all operations.
|
|
6
|
+
*/
|
|
7
|
+
import type { DatabaseAdapter } from '../db/adapter.js';
|
|
8
|
+
import type { ExecRunner } from '../exec/types.js';
|
|
9
|
+
import * as runs from '../repos/runs.js';
|
|
10
|
+
import * as runSteps from '../repos/run_steps.js';
|
|
11
|
+
export interface QaLogger {
|
|
12
|
+
info: (msg: string) => void;
|
|
13
|
+
warn?: (msg: string) => void;
|
|
14
|
+
error: (msg: string) => void;
|
|
15
|
+
debug?: (msg: string) => void;
|
|
16
|
+
}
|
|
17
|
+
export interface QaCommand {
|
|
18
|
+
name: string;
|
|
19
|
+
cmd: string;
|
|
20
|
+
cwd?: string;
|
|
21
|
+
env?: Record<string, string | undefined>;
|
|
22
|
+
timeoutMs?: number;
|
|
23
|
+
}
|
|
24
|
+
export interface QaArtifactsConfig {
|
|
25
|
+
dir: string;
|
|
26
|
+
maxLogBytes: number;
|
|
27
|
+
tailBytes: number;
|
|
28
|
+
}
|
|
29
|
+
export interface QaRetryConfig {
|
|
30
|
+
enabled: boolean;
|
|
31
|
+
maxAttempts: number;
|
|
32
|
+
}
|
|
33
|
+
export interface QaConfig {
|
|
34
|
+
commands: QaCommand[];
|
|
35
|
+
artifacts: QaArtifactsConfig;
|
|
36
|
+
retry: QaRetryConfig;
|
|
37
|
+
}
|
|
38
|
+
export interface QaDeps {
|
|
39
|
+
db: DatabaseAdapter;
|
|
40
|
+
exec: ExecRunner;
|
|
41
|
+
logger: QaLogger;
|
|
42
|
+
}
|
|
43
|
+
export interface QaRunOptions {
|
|
44
|
+
projectId: string;
|
|
45
|
+
repoRoot: string;
|
|
46
|
+
config: QaConfig;
|
|
47
|
+
maxAttemptsOverride?: number;
|
|
48
|
+
signal?: AbortSignal;
|
|
49
|
+
}
|
|
50
|
+
export interface QaRunResult {
|
|
51
|
+
runId: string;
|
|
52
|
+
projectId: string;
|
|
53
|
+
status: 'success' | 'failed' | 'canceled';
|
|
54
|
+
attempts: number;
|
|
55
|
+
latestAttempt: number;
|
|
56
|
+
failedAt?: {
|
|
57
|
+
attempt: number;
|
|
58
|
+
stepName: string;
|
|
59
|
+
};
|
|
60
|
+
startedAtMs: number;
|
|
61
|
+
endedAtMs: number;
|
|
62
|
+
durationMs: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Run QA commands and record results
|
|
66
|
+
*/
|
|
67
|
+
export declare function runQa(deps: QaDeps, opts: QaRunOptions): Promise<QaRunResult>;
|
|
68
|
+
/**
|
|
69
|
+
* Get QA run details with step information
|
|
70
|
+
*/
|
|
71
|
+
export declare function getQaRunDetails(db: DatabaseAdapter, runId: string): Promise<{
|
|
72
|
+
run: runs.Run | null;
|
|
73
|
+
steps: runSteps.RunStep[];
|
|
74
|
+
summary: runSteps.StepSummary;
|
|
75
|
+
} | null>;
|
|
76
|
+
//# sourceMappingURL=qa.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qa.d.ts","sourceRoot":"","sources":["../../src/services/qa.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAc,MAAM,kBAAkB,CAAC;AAE/D,OAAO,KAAK,IAAI,MAAM,kBAAkB,CAAC;AACzC,OAAO,KAAK,QAAQ,MAAM,uBAAuB,CAAC;AAElD,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,SAAS,EAAE,CAAC;IACtB,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,EAAE,aAAa,CAAC;CACtB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,eAAe,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,QAAQ,CAAC;IACjB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE;QACT,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;IACF,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAaD;;GAEG;AACH,wBAAsB,KAAK,CACzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,WAAW,CAAC,CAmOtB;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,EAAE,EAAE,eAAe,EACnB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;IACT,GAAG,EAAE,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;IACrB,KAAK,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC;IAC1B,OAAO,EAAE,QAAQ,CAAC,WAAW,CAAC;CAC/B,GAAG,IAAI,CAAC,CAQR"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QA Service - Run local QA commands and record results
|
|
3
|
+
*
|
|
4
|
+
* This is pure orchestration: no FS writes, no raw SQL.
|
|
5
|
+
* Uses repos + ExecRunner for all operations.
|
|
6
|
+
*/
|
|
7
|
+
import * as path from 'node:path';
|
|
8
|
+
import * as runs from '../repos/runs.js';
|
|
9
|
+
import * as runSteps from '../repos/run_steps.js';
|
|
10
|
+
function resolveCwd(repoRootAbs, cwd) {
|
|
11
|
+
if (!cwd || cwd === '.')
|
|
12
|
+
return repoRootAbs;
|
|
13
|
+
return path.isAbsolute(cwd) ? cwd : path.join(repoRootAbs, cwd);
|
|
14
|
+
}
|
|
15
|
+
function execStatusToStepStatus(exec) {
|
|
16
|
+
if (exec.status === 'success')
|
|
17
|
+
return 'success';
|
|
18
|
+
if (exec.status === 'canceled')
|
|
19
|
+
return 'canceled';
|
|
20
|
+
return 'failed';
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Run QA commands and record results
|
|
24
|
+
*/
|
|
25
|
+
export async function runQa(deps, opts) {
|
|
26
|
+
const { db, exec, logger } = deps;
|
|
27
|
+
const { projectId, repoRoot, config, signal } = opts;
|
|
28
|
+
if (!config.commands?.length) {
|
|
29
|
+
throw new Error('QA config has no commands. Add qa.commands to .promptwheel/config.json');
|
|
30
|
+
}
|
|
31
|
+
// Validate unique step names
|
|
32
|
+
const names = new Set();
|
|
33
|
+
for (const c of config.commands) {
|
|
34
|
+
if (!c.name?.trim())
|
|
35
|
+
throw new Error('QA command is missing a name');
|
|
36
|
+
if (!c.cmd?.trim())
|
|
37
|
+
throw new Error(`QA command "${c.name}" is missing cmd`);
|
|
38
|
+
if (names.has(c.name))
|
|
39
|
+
throw new Error(`Duplicate QA command name: "${c.name}"`);
|
|
40
|
+
names.add(c.name);
|
|
41
|
+
}
|
|
42
|
+
const startedAtMs = Date.now();
|
|
43
|
+
// Determine max attempts
|
|
44
|
+
const maxAttempts = opts.maxAttemptsOverride ??
|
|
45
|
+
(config.retry.enabled ? config.retry.maxAttempts : 1);
|
|
46
|
+
// Create the run
|
|
47
|
+
const run = await runs.create(db, {
|
|
48
|
+
projectId,
|
|
49
|
+
type: 'qa',
|
|
50
|
+
maxIterations: maxAttempts,
|
|
51
|
+
metadata: {
|
|
52
|
+
maxAttempts,
|
|
53
|
+
commandCount: config.commands.length,
|
|
54
|
+
},
|
|
55
|
+
});
|
|
56
|
+
logger.info(`QA run started: ${run.id}`);
|
|
57
|
+
let latestAttempt = 1;
|
|
58
|
+
let finalStatus = 'failed';
|
|
59
|
+
let failedAt;
|
|
60
|
+
// Check for early cancellation
|
|
61
|
+
if (signal?.aborted) {
|
|
62
|
+
await runs.markFailure(db, run.id, 'Canceled before start', { attempts: 0 });
|
|
63
|
+
return {
|
|
64
|
+
runId: run.id,
|
|
65
|
+
projectId,
|
|
66
|
+
status: 'canceled',
|
|
67
|
+
attempts: 0,
|
|
68
|
+
latestAttempt: 0,
|
|
69
|
+
startedAtMs,
|
|
70
|
+
endedAtMs: Date.now(),
|
|
71
|
+
durationMs: Date.now() - startedAtMs,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
// Attempt loop
|
|
75
|
+
for (let attempt = 1; attempt <= maxAttempts; attempt++) {
|
|
76
|
+
latestAttempt = attempt;
|
|
77
|
+
logger.info(`Attempt ${attempt}/${maxAttempts}`);
|
|
78
|
+
// Pre-create steps as queued
|
|
79
|
+
const createdSteps = await runSteps.createMany(db, run.id, config.commands.map((c) => ({
|
|
80
|
+
name: c.name,
|
|
81
|
+
cmd: c.cmd,
|
|
82
|
+
cwd: c.cwd ?? '.',
|
|
83
|
+
timeoutMs: c.timeoutMs,
|
|
84
|
+
})), attempt);
|
|
85
|
+
let attemptFailed = false;
|
|
86
|
+
for (const step of createdSteps) {
|
|
87
|
+
// Check for cancellation before each step
|
|
88
|
+
if (signal?.aborted) {
|
|
89
|
+
await runSteps.markCanceled(db, step.id, 'Canceled by user');
|
|
90
|
+
// Cancel remaining steps
|
|
91
|
+
for (const remaining of createdSteps) {
|
|
92
|
+
if (remaining.ordinal > step.ordinal) {
|
|
93
|
+
await runSteps.markCanceled(db, remaining.id, 'Canceled by user');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
finalStatus = 'canceled';
|
|
97
|
+
failedAt = { attempt, stepName: step.name };
|
|
98
|
+
attemptFailed = true;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
await runSteps.markStarted(db, step.id);
|
|
102
|
+
const cmdCfg = config.commands[step.ordinal];
|
|
103
|
+
const cwdAbs = resolveCwd(repoRoot, cmdCfg.cwd ?? step.cwd ?? '.');
|
|
104
|
+
const execRes = await exec.run({
|
|
105
|
+
cmd: cmdCfg.cmd,
|
|
106
|
+
cwd: cwdAbs,
|
|
107
|
+
env: cmdCfg.env,
|
|
108
|
+
timeoutMs: cmdCfg.timeoutMs ?? step.timeoutMs ?? undefined,
|
|
109
|
+
signal,
|
|
110
|
+
repoRoot,
|
|
111
|
+
artifactsDir: config.artifacts.dir,
|
|
112
|
+
runId: run.id,
|
|
113
|
+
attempt,
|
|
114
|
+
stepName: step.name,
|
|
115
|
+
ordinal: step.ordinal,
|
|
116
|
+
maxLogBytes: config.artifacts.maxLogBytes,
|
|
117
|
+
tailBytes: config.artifacts.tailBytes,
|
|
118
|
+
});
|
|
119
|
+
const stepStatus = execStatusToStepStatus(execRes);
|
|
120
|
+
if (stepStatus === 'success') {
|
|
121
|
+
await runSteps.markSuccess(db, step.id, {
|
|
122
|
+
exitCode: execRes.exitCode ?? 0,
|
|
123
|
+
stdoutPath: execRes.stdout.path,
|
|
124
|
+
stderrPath: execRes.stderr.path,
|
|
125
|
+
stdoutBytes: execRes.stdout.bytes,
|
|
126
|
+
stderrBytes: execRes.stderr.bytes,
|
|
127
|
+
stdoutTruncated: execRes.stdout.truncated,
|
|
128
|
+
stderrTruncated: execRes.stderr.truncated,
|
|
129
|
+
stdoutTail: execRes.stdout.tail,
|
|
130
|
+
stderrTail: execRes.stderr.tail,
|
|
131
|
+
metadata: { execStatus: execRes.status },
|
|
132
|
+
});
|
|
133
|
+
logger.info(` ✓ ${step.name}`);
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
// Failed or canceled
|
|
137
|
+
attemptFailed = true;
|
|
138
|
+
const errorMessage = execRes.errorMessage ??
|
|
139
|
+
(execRes.status === 'timeout'
|
|
140
|
+
? `Timed out after ${cmdCfg.timeoutMs ?? step.timeoutMs ?? 'unknown'}ms`
|
|
141
|
+
: execRes.status === 'canceled'
|
|
142
|
+
? 'Canceled'
|
|
143
|
+
: `Exited with code ${execRes.exitCode ?? 'unknown'}`);
|
|
144
|
+
if (stepStatus === 'canceled') {
|
|
145
|
+
await runSteps.markCanceled(db, step.id, errorMessage);
|
|
146
|
+
finalStatus = 'canceled';
|
|
147
|
+
}
|
|
148
|
+
else {
|
|
149
|
+
await runSteps.markFailed(db, step.id, {
|
|
150
|
+
exitCode: execRes.exitCode ?? undefined,
|
|
151
|
+
signal: execRes.signal ?? undefined,
|
|
152
|
+
errorMessage,
|
|
153
|
+
stdoutPath: execRes.stdout.path,
|
|
154
|
+
stderrPath: execRes.stderr.path,
|
|
155
|
+
stdoutBytes: execRes.stdout.bytes,
|
|
156
|
+
stderrBytes: execRes.stderr.bytes,
|
|
157
|
+
stdoutTruncated: execRes.stdout.truncated,
|
|
158
|
+
stderrTruncated: execRes.stderr.truncated,
|
|
159
|
+
stdoutTail: execRes.stdout.tail,
|
|
160
|
+
stderrTail: execRes.stderr.tail,
|
|
161
|
+
metadata: { execStatus: execRes.status },
|
|
162
|
+
});
|
|
163
|
+
finalStatus = 'failed';
|
|
164
|
+
}
|
|
165
|
+
logger.error(` ✗ ${step.name}: ${errorMessage}`);
|
|
166
|
+
failedAt = { attempt, stepName: step.name };
|
|
167
|
+
// Cancel remaining queued steps in this attempt
|
|
168
|
+
for (const remaining of createdSteps) {
|
|
169
|
+
if (remaining.ordinal <= step.ordinal)
|
|
170
|
+
continue;
|
|
171
|
+
await runSteps.markSkipped(db, remaining.id, `Skipped (previous step "${step.name}" ${stepStatus})`);
|
|
172
|
+
}
|
|
173
|
+
break;
|
|
174
|
+
}
|
|
175
|
+
if (!attemptFailed) {
|
|
176
|
+
finalStatus = 'success';
|
|
177
|
+
failedAt = undefined;
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
180
|
+
// If canceled, don't retry
|
|
181
|
+
if (finalStatus === 'canceled') {
|
|
182
|
+
break;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const endedAtMs = Date.now();
|
|
186
|
+
// Finalize run
|
|
187
|
+
if (finalStatus === 'success') {
|
|
188
|
+
await runs.markSuccess(db, run.id, {
|
|
189
|
+
attempts: latestAttempt,
|
|
190
|
+
durationMs: endedAtMs - startedAtMs,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
const errorMsg = failedAt
|
|
195
|
+
? `Failed at ${failedAt.stepName} (attempt ${failedAt.attempt})`
|
|
196
|
+
: finalStatus === 'canceled'
|
|
197
|
+
? 'QA canceled'
|
|
198
|
+
: 'QA failed';
|
|
199
|
+
await runs.markFailure(db, run.id, errorMsg, {
|
|
200
|
+
attempts: latestAttempt,
|
|
201
|
+
failedAt,
|
|
202
|
+
durationMs: endedAtMs - startedAtMs,
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
return {
|
|
206
|
+
runId: run.id,
|
|
207
|
+
projectId,
|
|
208
|
+
status: finalStatus,
|
|
209
|
+
attempts: latestAttempt,
|
|
210
|
+
latestAttempt,
|
|
211
|
+
failedAt,
|
|
212
|
+
startedAtMs,
|
|
213
|
+
endedAtMs,
|
|
214
|
+
durationMs: endedAtMs - startedAtMs,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get QA run details with step information
|
|
219
|
+
*/
|
|
220
|
+
export async function getQaRunDetails(db, runId) {
|
|
221
|
+
const run = await runs.getById(db, runId);
|
|
222
|
+
if (!run)
|
|
223
|
+
return null;
|
|
224
|
+
const steps = await runSteps.listByRun(db, runId);
|
|
225
|
+
const summary = await runSteps.getSummary(db, runId);
|
|
226
|
+
return { run, steps, summary };
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=qa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qa.js","sourceRoot":"","sources":["../../src/services/qa.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scout Service - Orchestrates codebase scanning and ticket creation
|
|
3
|
+
*
|
|
4
|
+
* This is pure orchestration - it coordinates between:
|
|
5
|
+
* - File scanning (scanner.ts)
|
|
6
|
+
* - LLM analysis (runner.ts)
|
|
7
|
+
* - Data persistence (repos/*)
|
|
8
|
+
*
|
|
9
|
+
* It accepts dependencies via ScoutDeps, making it testable and adapter-agnostic.
|
|
10
|
+
*/
|
|
11
|
+
import type { DatabaseAdapter } from '../db/adapter.js';
|
|
12
|
+
import * as projects from '../repos/projects.js';
|
|
13
|
+
import * as tickets from '../repos/tickets.js';
|
|
14
|
+
import * as runs from '../repos/runs.js';
|
|
15
|
+
import { type TicketProposal, type ScoutBackend, type ProposalCategory } from '../scout/index.js';
|
|
16
|
+
/**
|
|
17
|
+
* Dependencies for the scout service
|
|
18
|
+
*/
|
|
19
|
+
export interface ScoutDeps {
|
|
20
|
+
/** Database adapter */
|
|
21
|
+
db: DatabaseAdapter;
|
|
22
|
+
/** Git operations */
|
|
23
|
+
git: GitService;
|
|
24
|
+
/** Logger */
|
|
25
|
+
logger?: Logger;
|
|
26
|
+
/** Clock for timestamps (useful for testing) */
|
|
27
|
+
clock?: () => Date;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Git service interface
|
|
31
|
+
*/
|
|
32
|
+
export interface GitService {
|
|
33
|
+
/** Find repository root from a path */
|
|
34
|
+
findRepoRoot(path: string): Promise<string | null>;
|
|
35
|
+
/** Get remote URL */
|
|
36
|
+
getRemoteUrl(repoRoot: string): Promise<string | null>;
|
|
37
|
+
/** Generate deterministic project ID from repo */
|
|
38
|
+
getProjectId(repoRoot: string, remoteUrl: string | null): string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Logger interface
|
|
42
|
+
*/
|
|
43
|
+
export interface Logger {
|
|
44
|
+
debug(msg: string, data?: Record<string, unknown>): void;
|
|
45
|
+
info(msg: string, data?: Record<string, unknown>): void;
|
|
46
|
+
warn(msg: string, data?: Record<string, unknown>): void;
|
|
47
|
+
error(msg: string, data?: Record<string, unknown>): void;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Scout options
|
|
51
|
+
*/
|
|
52
|
+
export interface ScoutRepoOptions {
|
|
53
|
+
/** Path to scan (defaults to repo root) */
|
|
54
|
+
path?: string;
|
|
55
|
+
/** Glob pattern for files */
|
|
56
|
+
scope?: string;
|
|
57
|
+
/** Filter to categories */
|
|
58
|
+
types?: ProposalCategory[];
|
|
59
|
+
/** Categories to exclude */
|
|
60
|
+
excludeTypes?: ProposalCategory[];
|
|
61
|
+
/** Maximum proposals */
|
|
62
|
+
maxProposals?: number;
|
|
63
|
+
/** Minimum confidence threshold */
|
|
64
|
+
minConfidence?: number;
|
|
65
|
+
/** Model to use */
|
|
66
|
+
model?: 'haiku' | 'sonnet' | 'opus';
|
|
67
|
+
/** Custom prompt from formula — tells the AI what to focus on */
|
|
68
|
+
customPrompt?: string;
|
|
69
|
+
/** Timeout per batch */
|
|
70
|
+
timeoutMs?: number;
|
|
71
|
+
/** Abort signal */
|
|
72
|
+
signal?: AbortSignal;
|
|
73
|
+
/** Progress callback */
|
|
74
|
+
onProgress?: (progress: ScoutProgress) => void;
|
|
75
|
+
/** Raw output streaming callback (per-batch stdout/stderr) */
|
|
76
|
+
onRawOutput?: (batchIndex: number, chunk: string) => void;
|
|
77
|
+
/** Auto-create tickets from proposals */
|
|
78
|
+
autoApprove?: boolean;
|
|
79
|
+
/** Scout backend override (default: ClaudeScoutBackend) */
|
|
80
|
+
backend?: ScoutBackend;
|
|
81
|
+
/** Files the scout can read but must NOT propose changes to */
|
|
82
|
+
protectedFiles?: string[];
|
|
83
|
+
/** Token budget per scout batch (default: auto based on backend) */
|
|
84
|
+
batchTokenBudget?: number;
|
|
85
|
+
/** Maximum files to scan per cycle (default: 60) */
|
|
86
|
+
maxFiles?: number;
|
|
87
|
+
/** Max parallel scout batches (default: auto — 4 for codex, 3 for claude) */
|
|
88
|
+
scoutConcurrency?: number;
|
|
89
|
+
/** Module groups for dependency-aware batching */
|
|
90
|
+
moduleGroups?: import('../scout/scanner.js').ModuleGroup[];
|
|
91
|
+
/** Coverage context passed through to the scout prompt */
|
|
92
|
+
coverageContext?: {
|
|
93
|
+
sectorPath: string;
|
|
94
|
+
scannedSectors: number;
|
|
95
|
+
totalSectors: number;
|
|
96
|
+
percent: number;
|
|
97
|
+
sectorPercent: number;
|
|
98
|
+
classificationConfidence: string;
|
|
99
|
+
scanCount: number;
|
|
100
|
+
proposalYield: number;
|
|
101
|
+
sectorSummary?: string;
|
|
102
|
+
sectorDifficulty?: 'easy' | 'moderate' | 'hard';
|
|
103
|
+
sectorCategoryAffinity?: {
|
|
104
|
+
boost: string[];
|
|
105
|
+
suppress: string[];
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Scout progress
|
|
111
|
+
*/
|
|
112
|
+
export interface BatchStatus {
|
|
113
|
+
index: number;
|
|
114
|
+
status: 'waiting' | 'running' | 'done' | 'failed';
|
|
115
|
+
proposals?: number;
|
|
116
|
+
startedAt?: number;
|
|
117
|
+
durationMs?: number;
|
|
118
|
+
error?: string;
|
|
119
|
+
}
|
|
120
|
+
export interface ScoutProgress {
|
|
121
|
+
phase: 'init' | 'scanning' | 'analyzing' | 'storing' | 'complete';
|
|
122
|
+
filesScanned?: number;
|
|
123
|
+
totalFiles?: number;
|
|
124
|
+
proposalsFound?: number;
|
|
125
|
+
ticketsCreated?: number;
|
|
126
|
+
message?: string;
|
|
127
|
+
/** Per-batch status for multi-line display */
|
|
128
|
+
batchStatuses?: BatchStatus[];
|
|
129
|
+
totalBatches?: number;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Scout result
|
|
133
|
+
*/
|
|
134
|
+
export interface ScoutRepoResult {
|
|
135
|
+
success: boolean;
|
|
136
|
+
project: projects.Project;
|
|
137
|
+
run: runs.Run;
|
|
138
|
+
proposals: TicketProposal[];
|
|
139
|
+
tickets: tickets.Ticket[];
|
|
140
|
+
errors: string[];
|
|
141
|
+
scannedFiles: number;
|
|
142
|
+
durationMs: number;
|
|
143
|
+
sectorReclassification?: {
|
|
144
|
+
production?: boolean;
|
|
145
|
+
confidence?: string;
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Scout a repository for improvement opportunities
|
|
150
|
+
*
|
|
151
|
+
* This is the main entry point for the scout service. It:
|
|
152
|
+
* 1. Resolves the repository root
|
|
153
|
+
* 2. Ensures the project exists in the database
|
|
154
|
+
* 3. Creates a scout run
|
|
155
|
+
* 4. Scans files and generates proposals
|
|
156
|
+
* 5. Optionally creates tickets from proposals
|
|
157
|
+
* 6. Records the run outcome
|
|
158
|
+
*/
|
|
159
|
+
export declare function scoutRepo(deps: ScoutDeps, opts?: ScoutRepoOptions): Promise<ScoutRepoResult>;
|
|
160
|
+
/**
|
|
161
|
+
* Approve specific proposals and create tickets
|
|
162
|
+
*/
|
|
163
|
+
export declare function approveProposals(deps: ScoutDeps, projectId: string, proposals: TicketProposal[]): Promise<tickets.Ticket[]>;
|
|
164
|
+
//# sourceMappingURL=scout.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scout.d.ts","sourceRoot":"","sources":["../../src/services/scout.ts"],"names":[],"mappings":"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"}
|