@zhixuan92/multi-model-agent-core 0.4.0 → 1.1.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/README.md +33 -93
- package/dist/config/load.js +9 -9
- package/dist/config/load.js.map +1 -1
- package/dist/config/schema.d.ts +169 -275
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +31 -40
- package/dist/config/schema.js.map +1 -1
- package/dist/cost/cost-meter.d.ts +13 -0
- package/dist/cost/cost-meter.d.ts.map +1 -0
- package/dist/cost/cost-meter.js +20 -0
- package/dist/cost/cost-meter.js.map +1 -0
- package/dist/delegate-with-escalation.d.ts +1 -28
- package/dist/delegate-with-escalation.d.ts.map +1 -1
- package/dist/delegate-with-escalation.js +9 -89
- package/dist/delegate-with-escalation.js.map +1 -1
- package/dist/error-codes.d.ts +4 -0
- package/dist/error-codes.d.ts.map +1 -0
- package/dist/error-codes.js +16 -0
- package/dist/error-codes.js.map +1 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -5
- package/dist/index.js.map +1 -1
- package/dist/model-profiles.json +10 -5
- package/dist/provider.d.ts +2 -2
- package/dist/provider.d.ts.map +1 -1
- package/dist/provider.js +10 -13
- package/dist/provider.js.map +1 -1
- package/dist/readiness/normalization-budget.d.ts +2 -0
- package/dist/readiness/normalization-budget.d.ts.map +1 -0
- package/dist/readiness/normalization-budget.js +9 -0
- package/dist/readiness/normalization-budget.js.map +1 -0
- package/dist/readiness/normalize-brief.d.ts +17 -0
- package/dist/readiness/normalize-brief.d.ts.map +1 -0
- package/dist/readiness/normalize-brief.js +124 -0
- package/dist/readiness/normalize-brief.js.map +1 -0
- package/dist/readiness/readiness.d.ts +16 -0
- package/dist/readiness/readiness.d.ts.map +1 -0
- package/dist/readiness/readiness.js +160 -0
- package/dist/readiness/readiness.js.map +1 -0
- package/dist/reporting/structured-report.d.ts +18 -0
- package/dist/reporting/structured-report.d.ts.map +1 -0
- package/dist/reporting/structured-report.js +100 -0
- package/dist/reporting/structured-report.js.map +1 -0
- package/dist/review/aggregate-result.d.ts +3 -0
- package/dist/review/aggregate-result.d.ts.map +1 -0
- package/dist/review/aggregate-result.js +31 -0
- package/dist/review/aggregate-result.js.map +1 -0
- package/dist/review/quality-reviewer.d.ts +13 -0
- package/dist/review/quality-reviewer.d.ts.map +1 -0
- package/dist/review/quality-reviewer.js +39 -0
- package/dist/review/quality-reviewer.js.map +1 -0
- package/dist/review/reviewer-prompt.d.ts +10 -0
- package/dist/review/reviewer-prompt.d.ts.map +1 -0
- package/dist/review/reviewer-prompt.js +58 -0
- package/dist/review/reviewer-prompt.js.map +1 -0
- package/dist/review/spec-reviewer.d.ts +13 -0
- package/dist/review/spec-reviewer.d.ts.map +1 -0
- package/dist/review/spec-reviewer.js +37 -0
- package/dist/review/spec-reviewer.js.map +1 -0
- package/dist/routing/model-profiles.d.ts +5 -0
- package/dist/routing/model-profiles.d.ts.map +1 -1
- package/dist/routing/model-profiles.js +5 -0
- package/dist/routing/model-profiles.js.map +1 -1
- package/dist/routing/resolve-agent.d.ts +8 -0
- package/dist/routing/resolve-agent.d.ts.map +1 -0
- package/dist/routing/resolve-agent.js +45 -0
- package/dist/routing/resolve-agent.js.map +1 -0
- package/dist/run-tasks.d.ts +0 -23
- package/dist/run-tasks.d.ts.map +1 -1
- package/dist/run-tasks.js +241 -72
- package/dist/run-tasks.js.map +1 -1
- package/dist/runners/claude-runner.d.ts +2 -2
- package/dist/runners/claude-runner.d.ts.map +1 -1
- package/dist/runners/claude-runner.js +76 -28
- package/dist/runners/claude-runner.js.map +1 -1
- package/dist/runners/codex-runner.d.ts +2 -2
- package/dist/runners/codex-runner.d.ts.map +1 -1
- package/dist/runners/codex-runner.js +77 -24
- package/dist/runners/codex-runner.js.map +1 -1
- package/dist/runners/openai-runner.d.ts +2 -2
- package/dist/runners/openai-runner.d.ts.map +1 -1
- package/dist/runners/openai-runner.js +141 -22
- package/dist/runners/openai-runner.js.map +1 -1
- package/dist/runners/prevention.d.ts +2 -0
- package/dist/runners/prevention.d.ts.map +1 -1
- package/dist/runners/prevention.js +12 -0
- package/dist/runners/prevention.js.map +1 -1
- package/dist/runners/supervision.d.ts +1 -5
- package/dist/runners/supervision.d.ts.map +1 -1
- package/dist/runners/supervision.js +0 -68
- package/dist/runners/supervision.js.map +1 -1
- package/dist/tools/call-cache.d.ts +16 -0
- package/dist/tools/call-cache.d.ts.map +1 -0
- package/dist/tools/call-cache.js +28 -0
- package/dist/tools/call-cache.js.map +1 -0
- package/dist/tools/claude-adapter.d.ts +2 -2
- package/dist/tools/claude-adapter.d.ts.map +1 -1
- package/dist/tools/claude-adapter.js +12 -5
- package/dist/tools/claude-adapter.js.map +1 -1
- package/dist/tools/definitions.d.ts +4 -0
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js +4 -0
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/openai-adapter.d.ts +4 -4
- package/dist/tools/openai-adapter.d.ts.map +1 -1
- package/dist/tools/openai-adapter.js +9 -2
- package/dist/tools/openai-adapter.js.map +1 -1
- package/dist/types.d.ts +79 -31
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +48 -16
- package/dist/routing/capabilities.d.ts +0 -3
- package/dist/routing/capabilities.d.ts.map +0 -1
- package/dist/routing/capabilities.js +0 -26
- package/dist/routing/capabilities.js.map +0 -1
- package/dist/routing/get-provider-eligibility.d.ts +0 -8
- package/dist/routing/get-provider-eligibility.d.ts.map +0 -1
- package/dist/routing/get-provider-eligibility.js +0 -53
- package/dist/routing/get-provider-eligibility.js.map +0 -1
- package/dist/routing/resolve-task-capabilities.d.ts +0 -7
- package/dist/routing/resolve-task-capabilities.d.ts.map +0 -1
- package/dist/routing/resolve-task-capabilities.js +0 -19
- package/dist/routing/resolve-task-capabilities.js.map +0 -1
- package/dist/routing/select-provider-for-task.d.ts +0 -18
- package/dist/routing/select-provider-for-task.d.ts.map +0 -1
- package/dist/routing/select-provider-for-task.js +0 -50
- package/dist/routing/select-provider-for-task.js.map +0 -1
package/dist/provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalization-budget.d.ts","sourceRoot":"","sources":["../../src/readiness/normalization-budget.ts"],"names":[],"mappings":"AAAA,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAKjF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function computeNormalizationBudget(maxCostUSD) {
|
|
2
|
+
const FLAT_CEIL = 0.01;
|
|
3
|
+
if (maxCostUSD === undefined)
|
|
4
|
+
return FLAT_CEIL;
|
|
5
|
+
if (maxCostUSD <= 0)
|
|
6
|
+
return 0;
|
|
7
|
+
return Math.min(FLAT_CEIL, 0.2 * maxCostUSD);
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=normalization-budget.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalization-budget.js","sourceRoot":"","sources":["../../src/readiness/normalization-budget.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,0BAA0B,CAAC,UAA8B;IACvE,MAAM,SAAS,GAAG,IAAI,CAAC;IACvB,IAAI,UAAU,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC/C,IAAI,UAAU,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC9B,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,GAAG,UAAU,CAAC,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { TaskSpec, MultiModelConfig } from '../types.js';
|
|
2
|
+
export interface NormalizationDecision {
|
|
3
|
+
original: string;
|
|
4
|
+
resolved: string;
|
|
5
|
+
reason: string;
|
|
6
|
+
}
|
|
7
|
+
export interface NormalizationResult {
|
|
8
|
+
normalizedPrompt: string;
|
|
9
|
+
decisions: NormalizationDecision[];
|
|
10
|
+
writeSet: string[];
|
|
11
|
+
verificationPlan: string[];
|
|
12
|
+
unresolved: string[];
|
|
13
|
+
spentCostUSD: number;
|
|
14
|
+
skipped: boolean;
|
|
15
|
+
}
|
|
16
|
+
export declare function normalizeBrief(task: TaskSpec, config: MultiModelConfig): Promise<NormalizationResult>;
|
|
17
|
+
//# sourceMappingURL=normalize-brief.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-brief.d.ts","sourceRoot":"","sources":["../../src/readiness/normalize-brief.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAK9D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,qBAAqB,EAAE,CAAC;IACnC,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AA4BD,wBAAsB,cAAc,CAClC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,mBAAmB,CAAC,CA2C9B"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { createProvider } from '../provider.js';
|
|
2
|
+
import { delegateWithEscalation } from '../delegate-with-escalation.js';
|
|
3
|
+
import { computeNormalizationBudget } from './normalization-budget.js';
|
|
4
|
+
const NORMALIZER_PROMPT = `You are a brief normalizer. Given a task brief, analyze it for vagueness and provide concrete normalization.
|
|
5
|
+
|
|
6
|
+
Brief to normalize:
|
|
7
|
+
{prompt}
|
|
8
|
+
|
|
9
|
+
Respond with a structured normalization using these sections:
|
|
10
|
+
|
|
11
|
+
## Summary
|
|
12
|
+
One sentence summary of what needs to be done.
|
|
13
|
+
|
|
14
|
+
## Normalization decisions
|
|
15
|
+
- "original phrase" → "concrete interpretation"
|
|
16
|
+
List each vague element and its concrete resolution.
|
|
17
|
+
|
|
18
|
+
## Files to change
|
|
19
|
+
List the specific files that need modification.
|
|
20
|
+
|
|
21
|
+
## Verification plan
|
|
22
|
+
How to verify the task is done correctly.
|
|
23
|
+
|
|
24
|
+
## Unresolved
|
|
25
|
+
Any elements that still need clarification.
|
|
26
|
+
|
|
27
|
+
## Done condition
|
|
28
|
+
The specific criterion for marking this task complete.`;
|
|
29
|
+
export async function normalizeBrief(task, config) {
|
|
30
|
+
const budget = computeNormalizationBudget(task.maxCostUSD);
|
|
31
|
+
const normalizerTask = {
|
|
32
|
+
prompt: NORMALIZER_PROMPT.replace('{prompt}', task.prompt),
|
|
33
|
+
agentType: 'standard',
|
|
34
|
+
briefQualityPolicy: 'off',
|
|
35
|
+
maxCostUSD: budget,
|
|
36
|
+
tools: 'none',
|
|
37
|
+
};
|
|
38
|
+
try {
|
|
39
|
+
const provider = createProvider('standard', config);
|
|
40
|
+
const result = await delegateWithEscalation(normalizerTask, [provider], { explicitlyPinned: true });
|
|
41
|
+
if (result.status !== 'ok') {
|
|
42
|
+
return {
|
|
43
|
+
normalizedPrompt: task.prompt,
|
|
44
|
+
decisions: [],
|
|
45
|
+
writeSet: [],
|
|
46
|
+
verificationPlan: [],
|
|
47
|
+
unresolved: ['Normalization failed: ' + (result.error || result.status)],
|
|
48
|
+
spentCostUSD: result.usage.costUSD ?? 0,
|
|
49
|
+
skipped: true,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
return parseNormalizationReport(result.output, task.prompt, result.usage.costUSD ?? 0);
|
|
53
|
+
}
|
|
54
|
+
catch (err) {
|
|
55
|
+
return {
|
|
56
|
+
normalizedPrompt: task.prompt,
|
|
57
|
+
decisions: [],
|
|
58
|
+
writeSet: [],
|
|
59
|
+
verificationPlan: [],
|
|
60
|
+
unresolved: [err instanceof Error ? err.message : String(err)],
|
|
61
|
+
spentCostUSD: 0,
|
|
62
|
+
skipped: true,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function parseNormalizationReport(output, originalPrompt, costUSD) {
|
|
67
|
+
const decisions = [];
|
|
68
|
+
const writeSet = [];
|
|
69
|
+
const verificationPlan = [];
|
|
70
|
+
const unresolved = [];
|
|
71
|
+
const decisionMatch = output.match(/## Normalization decisions\n([\s\S]*?)(?=\n##|\n##|$)/i);
|
|
72
|
+
if (decisionMatch) {
|
|
73
|
+
const lines = decisionMatch[1].split('\n').filter(l => l.trim().startsWith('-'));
|
|
74
|
+
for (const line of lines) {
|
|
75
|
+
const match = line.match(/- "([^"]+)" → "?([^"\n]+)"?/);
|
|
76
|
+
if (match) {
|
|
77
|
+
decisions.push({ original: match[1], resolved: match[2], reason: 'normalized' });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
const filesMatch = output.match(/## Files to change\n([\s\S]*?)(?=\n##|\n##|$)/i);
|
|
82
|
+
if (filesMatch) {
|
|
83
|
+
const lines = filesMatch[1].split('\n').filter(l => l.trim() && !l.trim().startsWith('#'));
|
|
84
|
+
for (const line of lines) {
|
|
85
|
+
const file = line.replace(/^[-*]\s*/, '').trim();
|
|
86
|
+
if (file && !file.startsWith('#')) {
|
|
87
|
+
writeSet.push(file);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
const verifyMatch = output.match(/## Verification plan\n([\s\S]*?)(?=\n##|\n##|$)/i);
|
|
92
|
+
if (verifyMatch) {
|
|
93
|
+
const lines = verifyMatch[1].split('\n').filter(l => l.trim() && !l.trim().startsWith('#'));
|
|
94
|
+
for (const line of lines) {
|
|
95
|
+
const item = line.replace(/^[-*]\s*/, '').trim();
|
|
96
|
+
if (item && !item.startsWith('#')) {
|
|
97
|
+
verificationPlan.push(item);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
const unresolvedMatch = output.match(/## Unresolved\n([\s\S]*?)(?=\n##|\n##|$)/i);
|
|
102
|
+
if (unresolvedMatch) {
|
|
103
|
+
const lines = unresolvedMatch[1].split('\n').filter(l => l.trim() && !l.trim().startsWith('#'));
|
|
104
|
+
for (const line of lines) {
|
|
105
|
+
const item = line.replace(/^[-*]\s*/, '').trim();
|
|
106
|
+
if (item && !item.startsWith('#')) {
|
|
107
|
+
unresolved.push(item);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const normalizedPrompt = decisions.length > 0
|
|
112
|
+
? decisions.reduce((prompt, d) => prompt.replace(d.original, d.resolved), originalPrompt)
|
|
113
|
+
: originalPrompt;
|
|
114
|
+
return {
|
|
115
|
+
normalizedPrompt,
|
|
116
|
+
decisions,
|
|
117
|
+
writeSet,
|
|
118
|
+
verificationPlan,
|
|
119
|
+
unresolved,
|
|
120
|
+
spentCostUSD: costUSD,
|
|
121
|
+
skipped: false,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=normalize-brief.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"normalize-brief.js","sourceRoot":"","sources":["../../src/readiness/normalize-brief.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAkBvE,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;uDAwB6B,CAAC;AAExD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAc,EACd,MAAwB;IAExB,MAAM,MAAM,GAAG,0BAA0B,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE3D,MAAM,cAAc,GAAa;QAC/B,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;QAC1D,SAAS,EAAE,UAAU;QACrB,kBAAkB,EAAE,KAAK;QACzB,UAAU,EAAE,MAAM;QAClB,KAAK,EAAE,MAAM;KACd,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,sBAAsB,CACzC,cAAc,EACd,CAAC,QAAQ,CAAC,EACV,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAC3B,CAAC;QAEF,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC3B,OAAO;gBACL,gBAAgB,EAAE,IAAI,CAAC,MAAM;gBAC7B,SAAS,EAAE,EAAE;gBACb,QAAQ,EAAE,EAAE;gBACZ,gBAAgB,EAAE,EAAE;gBACpB,UAAU,EAAE,CAAC,wBAAwB,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC;gBACxE,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC;gBACvC,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,OAAO,wBAAwB,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IACzF,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,gBAAgB,EAAE,IAAI,CAAC,MAAM;YAC7B,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE,EAAE;YACZ,gBAAgB,EAAE,EAAE;YACpB,UAAU,EAAE,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9D,YAAY,EAAE,CAAC;YACf,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,wBAAwB,CAC/B,MAAc,EACd,cAAsB,EACtB,OAAe;IAEf,MAAM,SAAS,GAA4B,EAAE,CAAC;IAC9C,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,gBAAgB,GAAa,EAAE,CAAC;IACtC,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,MAAM,aAAa,GAAG,MAAM,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC7F,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,KAAK,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QACjF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;YACxD,IAAI,KAAK,EAAE,CAAC;gBACV,SAAS,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;IAClF,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACjD,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACrF,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5F,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACjD,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAClF,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAChG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACjD,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBAClC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;QAC3C,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;QACzF,CAAC,CAAC,cAAc,CAAC;IAEnB,OAAO;QACL,gBAAgB;QAChB,SAAS;QACT,QAAQ;QACR,gBAAgB;QAChB,UAAU;QACV,YAAY,EAAE,OAAO;QACrB,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ReadinessResult, BriefQualityPolicy } from '../types.js';
|
|
2
|
+
export declare function hasScopePillar(prompt: string): boolean;
|
|
3
|
+
export declare function hasInputsPillar(prompt: string): boolean;
|
|
4
|
+
export declare function hasDoneConditionPillar(prompt: string): boolean;
|
|
5
|
+
export declare function hasOutputContractPillar(prompt: string, disableStructuredReport?: boolean): boolean;
|
|
6
|
+
export declare function detectOutsourcedDiscovery(prompt: string): boolean;
|
|
7
|
+
export declare function detectBrittleLineAnchors(prompt: string): boolean;
|
|
8
|
+
export declare function detectMixedEnvironmentActions(prompt: string): boolean;
|
|
9
|
+
export declare function detectConcretePath(prompt: string): boolean;
|
|
10
|
+
export declare function detectNamedCodeArtifact(prompt: string): boolean;
|
|
11
|
+
export declare function detectReasonableLength(prompt: string): boolean;
|
|
12
|
+
export declare function evaluateReadiness(task: {
|
|
13
|
+
prompt: string;
|
|
14
|
+
briefQualityPolicy?: BriefQualityPolicy;
|
|
15
|
+
}, mode?: BriefQualityPolicy): ReadinessResult;
|
|
16
|
+
//# sourceMappingURL=readiness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness.d.ts","sourceRoot":"","sources":["../../src/readiness/readiness.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiC,eAAe,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEtG,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAgBtD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAUvD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAe9D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,uBAAuB,CAAC,EAAE,OAAO,GAAG,OAAO,CAMlG;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGjE;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAMhE;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAIrE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,kBAAkB,CAAC,EAAE,kBAAkB,CAAA;CAAE,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,eAAe,CA6C/I"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
export function hasScopePillar(prompt) {
|
|
2
|
+
if (!prompt.trim())
|
|
3
|
+
return false;
|
|
4
|
+
// File path with extension
|
|
5
|
+
if (/\/[\w.-]+\.\w+/.test(prompt))
|
|
6
|
+
return true;
|
|
7
|
+
// Directory path (packages/, src/, etc.)
|
|
8
|
+
if (/\b(packages|src|tests|docs|scripts|layout)\/[\w/.-]/.test(prompt))
|
|
9
|
+
return true;
|
|
10
|
+
// Glob pattern
|
|
11
|
+
if (/\*\*\/\*\.?\w+/.test(prompt))
|
|
12
|
+
return true;
|
|
13
|
+
// Backtick-wrapped module/identifier
|
|
14
|
+
if (/`[\w-]+`/.test(prompt))
|
|
15
|
+
return true;
|
|
16
|
+
// Out-of-bounds clause
|
|
17
|
+
if (/do not modify|don't modify|no changes? to|exclude|except/.test(prompt))
|
|
18
|
+
return true;
|
|
19
|
+
// Bare topic noun (too vague)
|
|
20
|
+
if (/^(fix|update|change|refactor|improve|add|remove)\s+\w+\s+(stuff|things?|items?|files?|code|logic)\.?$/i.test(prompt))
|
|
21
|
+
return false;
|
|
22
|
+
if (/^(fix|update|change)\s+\w+\.?$/.test(prompt))
|
|
23
|
+
return false;
|
|
24
|
+
return prompt.length > 20 && /[.\s]/.test(prompt);
|
|
25
|
+
}
|
|
26
|
+
export function hasInputsPillar(prompt) {
|
|
27
|
+
// File reference
|
|
28
|
+
if (/\b[\w-]+\.(ts|js|tsx|jsx|json|md|yml|yaml|toml|ini|cfg|conf)\b/.test(prompt))
|
|
29
|
+
return true;
|
|
30
|
+
// Fenced code block
|
|
31
|
+
if (/```[\s\S]*?```/.test(prompt))
|
|
32
|
+
return true;
|
|
33
|
+
// "follow/match/based on X" pattern
|
|
34
|
+
if (/follow (the )?pattern (in|from|of)|match (the )?pattern|based on [\w.-]+/.test(prompt))
|
|
35
|
+
return true;
|
|
36
|
+
// Backtick identifier
|
|
37
|
+
if (/`[\w/.-]+`/.test(prompt))
|
|
38
|
+
return true;
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
export function hasDoneConditionPillar(prompt) {
|
|
42
|
+
const lc = prompt.toLowerCase();
|
|
43
|
+
// Explicit done-when phrases
|
|
44
|
+
if (/done when|success criteria:|complete when|finished when/.test(lc))
|
|
45
|
+
return true;
|
|
46
|
+
// Test pass phrase
|
|
47
|
+
if (/tsc passes?|tests? (all )?pass|eslint|fmt|lint|build(ing)? (succeeds?|passes?)/.test(lc))
|
|
48
|
+
return true;
|
|
49
|
+
// Test file reference
|
|
50
|
+
if (/tests?\/[\w/.-]+\.test\.(ts|js)/.test(prompt))
|
|
51
|
+
return true;
|
|
52
|
+
// expectedCoverage reference
|
|
53
|
+
if (/expectedcoverage|requiredmarkers/.test(lc))
|
|
54
|
+
return true;
|
|
55
|
+
// HTTP status codes as done condition
|
|
56
|
+
if (/status code (200|201|204|4\d{2}|5\d{2})/.test(prompt))
|
|
57
|
+
return true;
|
|
58
|
+
// Behavior checklist
|
|
59
|
+
if (/should (be|have|do)|verify |confirm |check(ing)? /.test(lc))
|
|
60
|
+
return true;
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
export function hasOutputContractPillar(prompt, disableStructuredReport) {
|
|
64
|
+
if (!disableStructuredReport)
|
|
65
|
+
return true;
|
|
66
|
+
// Has explicit format instructions
|
|
67
|
+
if (/return (json|yaml|xml|csv|object|array)|output (should be|as|format)|format( ted)? (as|with)/i.test(prompt))
|
|
68
|
+
return true;
|
|
69
|
+
if (/expectedcoverage|requiredmarkers/.test(prompt.toLowerCase()))
|
|
70
|
+
return true;
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
export function detectOutsourcedDiscovery(prompt) {
|
|
74
|
+
const lc = prompt.toLowerCase();
|
|
75
|
+
return /find (out |the )?(right|correct)|figure out|verify the exact|determine (the |which )|look up|check (the )?(right|correct) (file|import|path|function)|follow the same (pattern|logic)|based on the same/.test(lc);
|
|
76
|
+
}
|
|
77
|
+
export function detectBrittleLineAnchors(prompt) {
|
|
78
|
+
// Has "lines X-Y" or "lines X–Y" without a semantic anchor nearby
|
|
79
|
+
if (!/lines?\s+\d+[\s–-]+\d+/i.test(prompt))
|
|
80
|
+
return false;
|
|
81
|
+
// Check if there's a backtick identifier near the line range (semantic anchor)
|
|
82
|
+
if (/\`[\w`]+\`\s*\(?\s*lines?\s*\d+/i.test(prompt))
|
|
83
|
+
return false;
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
export function detectMixedEnvironmentActions(prompt) {
|
|
87
|
+
const lc = prompt.toLowerCase();
|
|
88
|
+
return /&&?\s*(git\s+(commit|push|pull|merge|rebase)|npm\s+(publish|version)|docker\s+(build|run|push)|deploy|release)/.test(lc) ||
|
|
89
|
+
/(commit|push|pull|merge)\s+(and|&|then)\s+(commit|push|build)/.test(lc);
|
|
90
|
+
}
|
|
91
|
+
export function detectConcretePath(prompt) {
|
|
92
|
+
return /\/[\w.-]+\.\w+/.test(prompt);
|
|
93
|
+
}
|
|
94
|
+
export function detectNamedCodeArtifact(prompt) {
|
|
95
|
+
return /`[\w`]+\`/.test(prompt);
|
|
96
|
+
}
|
|
97
|
+
export function detectReasonableLength(prompt) {
|
|
98
|
+
return prompt.length >= 50 && prompt.length <= 500;
|
|
99
|
+
}
|
|
100
|
+
export function evaluateReadiness(task, mode) {
|
|
101
|
+
const policy = mode ?? task.briefQualityPolicy ?? 'normalize';
|
|
102
|
+
if (policy === 'off') {
|
|
103
|
+
return { action: 'ignored', missingPillars: [], layer2Warnings: [], layer3Hints: [], briefQualityWarnings: [] };
|
|
104
|
+
}
|
|
105
|
+
const missingPillars = [];
|
|
106
|
+
if (!hasScopePillar(task.prompt))
|
|
107
|
+
missingPillars.push('scope');
|
|
108
|
+
if (!hasInputsPillar(task.prompt))
|
|
109
|
+
missingPillars.push('inputs');
|
|
110
|
+
if (!hasDoneConditionPillar(task.prompt))
|
|
111
|
+
missingPillars.push('done_condition');
|
|
112
|
+
if (!hasOutputContractPillar(task.prompt, false))
|
|
113
|
+
missingPillars.push('output_contract');
|
|
114
|
+
const layer2Warnings = [];
|
|
115
|
+
if (detectOutsourcedDiscovery(task.prompt))
|
|
116
|
+
layer2Warnings.push('outsourced_discovery');
|
|
117
|
+
if (detectBrittleLineAnchors(task.prompt))
|
|
118
|
+
layer2Warnings.push('brittle_line_anchors');
|
|
119
|
+
if (detectMixedEnvironmentActions(task.prompt))
|
|
120
|
+
layer2Warnings.push('mixed_environment_actions');
|
|
121
|
+
const layer3Hints = [];
|
|
122
|
+
if (detectConcretePath(task.prompt))
|
|
123
|
+
layer3Hints.push('concrete_path');
|
|
124
|
+
if (detectNamedCodeArtifact(task.prompt))
|
|
125
|
+
layer3Hints.push('named_code_artifact');
|
|
126
|
+
const reasonableLength = detectReasonableLength(task.prompt);
|
|
127
|
+
if (!reasonableLength)
|
|
128
|
+
layer3Hints.push('reasonable_length');
|
|
129
|
+
const briefQualityWarnings = [...layer2Warnings];
|
|
130
|
+
if (missingPillars.includes('scope'))
|
|
131
|
+
briefQualityWarnings.push('bare_topic_noun');
|
|
132
|
+
if (missingPillars.includes('done_condition'))
|
|
133
|
+
briefQualityWarnings.push('no_done_condition');
|
|
134
|
+
if (missingPillars.includes('output_contract'))
|
|
135
|
+
briefQualityWarnings.push('no_output_contract');
|
|
136
|
+
if (task.prompt.length < 50)
|
|
137
|
+
briefQualityWarnings.push('tiny_brief');
|
|
138
|
+
if (task.prompt.length > 500)
|
|
139
|
+
briefQualityWarnings.push('huge_brief');
|
|
140
|
+
let action = 'warn';
|
|
141
|
+
if (policy === 'normalize') {
|
|
142
|
+
if (missingPillars.length > 0)
|
|
143
|
+
action = 'refuse';
|
|
144
|
+
else if (layer2Warnings.length > 0)
|
|
145
|
+
action = 'normalize';
|
|
146
|
+
else
|
|
147
|
+
action = 'warn';
|
|
148
|
+
}
|
|
149
|
+
else if (policy === 'strict') {
|
|
150
|
+
if (missingPillars.length > 0)
|
|
151
|
+
action = 'refuse';
|
|
152
|
+
else
|
|
153
|
+
action = 'warn';
|
|
154
|
+
}
|
|
155
|
+
else if (policy === 'warn') {
|
|
156
|
+
action = 'warn';
|
|
157
|
+
}
|
|
158
|
+
return { action, missingPillars, layer2Warnings, layer3Hints, briefQualityWarnings };
|
|
159
|
+
}
|
|
160
|
+
//# sourceMappingURL=readiness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"readiness.js","sourceRoot":"","sources":["../../src/readiness/readiness.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare const structuredReportSuffix: string;
|
|
2
|
+
export interface FileChange {
|
|
3
|
+
path: string;
|
|
4
|
+
summary: string;
|
|
5
|
+
}
|
|
6
|
+
export interface ParsedStructuredReport {
|
|
7
|
+
summary: string | null;
|
|
8
|
+
filesChanged: FileChange[];
|
|
9
|
+
normalizationDecisions: string[][];
|
|
10
|
+
validationsRun: Array<{
|
|
11
|
+
command: string;
|
|
12
|
+
result: string;
|
|
13
|
+
}>;
|
|
14
|
+
deviationsFromBrief: string[];
|
|
15
|
+
unresolved: string[];
|
|
16
|
+
}
|
|
17
|
+
export declare function parseStructuredReport(output: string): ParsedStructuredReport;
|
|
18
|
+
//# sourceMappingURL=structured-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-report.d.ts","sourceRoot":"","sources":["../../src/reporting/structured-report.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,QAkB3B,CAAC;AAET,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,YAAY,EAAE,UAAU,EAAE,CAAC;IAC3B,sBAAsB,EAAE,MAAM,EAAE,EAAE,CAAC;IACnC,cAAc,EAAE,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC3D,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,sBAAsB,CAsB5E"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export const structuredReportSuffix = `
|
|
2
|
+
## Summary
|
|
3
|
+
One-line summary of what was done.
|
|
4
|
+
|
|
5
|
+
## Files changed
|
|
6
|
+
List of files modified, added, or deleted.
|
|
7
|
+
|
|
8
|
+
## Normalization decisions
|
|
9
|
+
Any brief normalization decisions made during execution.
|
|
10
|
+
|
|
11
|
+
## Validations run
|
|
12
|
+
Checks performed to verify correctness (e.g., "tsc passes", "tests pass").
|
|
13
|
+
|
|
14
|
+
## Deviations from brief
|
|
15
|
+
Any intentional or unintentional deviations from the original brief.
|
|
16
|
+
|
|
17
|
+
## Unresolved
|
|
18
|
+
Open questions, incomplete items, or items requiring further investigation.
|
|
19
|
+
`.trim();
|
|
20
|
+
export function parseStructuredReport(output) {
|
|
21
|
+
if (!output || !output.trim()) {
|
|
22
|
+
return {
|
|
23
|
+
summary: null,
|
|
24
|
+
filesChanged: [],
|
|
25
|
+
normalizationDecisions: [],
|
|
26
|
+
validationsRun: [],
|
|
27
|
+
deviationsFromBrief: [],
|
|
28
|
+
unresolved: [],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const sections = extractSections(output);
|
|
32
|
+
return {
|
|
33
|
+
summary: sections['summary']?.[0] ?? null,
|
|
34
|
+
filesChanged: parseFilesChanged(sections['files changed']),
|
|
35
|
+
normalizationDecisions: parseNormalizationDecisions(sections['normalization decisions']),
|
|
36
|
+
validationsRun: parseValidationsRun(sections['validations run']),
|
|
37
|
+
deviationsFromBrief: sections['deviations from brief'] ?? [],
|
|
38
|
+
unresolved: sections['unresolved'] ?? [],
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function extractSections(output) {
|
|
42
|
+
const sections = {};
|
|
43
|
+
const parts = output.split(/(?=^##\s)/m);
|
|
44
|
+
for (const part of parts) {
|
|
45
|
+
const trimmed = part.trim();
|
|
46
|
+
if (!trimmed.startsWith('## '))
|
|
47
|
+
continue;
|
|
48
|
+
const firstNewline = trimmed.indexOf('\n');
|
|
49
|
+
if (firstNewline === -1)
|
|
50
|
+
continue;
|
|
51
|
+
const header = trimmed.slice(3, firstNewline).toLowerCase().trim();
|
|
52
|
+
const content = trimmed.slice(firstNewline + 1).trim();
|
|
53
|
+
if (header && content) {
|
|
54
|
+
sections[header] = content.split('\n').map(l => l.trim()).filter(Boolean);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return sections;
|
|
58
|
+
}
|
|
59
|
+
function parseListSection(lines) {
|
|
60
|
+
if (!lines)
|
|
61
|
+
return [];
|
|
62
|
+
return lines
|
|
63
|
+
.map(l => l.replace(/^[-*]\s*/, '').trim())
|
|
64
|
+
.filter(l => l && !l.startsWith('#'));
|
|
65
|
+
}
|
|
66
|
+
function parseFilesChanged(lines) {
|
|
67
|
+
if (!lines)
|
|
68
|
+
return [];
|
|
69
|
+
return lines
|
|
70
|
+
.map(l => l.replace(/^[-*]\s*/, '').trim())
|
|
71
|
+
.filter(l => l && !l.startsWith('#'))
|
|
72
|
+
.map(l => {
|
|
73
|
+
const colonIdx = l.indexOf(':');
|
|
74
|
+
if (colonIdx === -1)
|
|
75
|
+
return { path: l, summary: '' };
|
|
76
|
+
return { path: l.slice(0, colonIdx).trim(), summary: l.slice(colonIdx + 1).trim() };
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
function parseValidationsRun(lines) {
|
|
80
|
+
if (!lines)
|
|
81
|
+
return [];
|
|
82
|
+
return lines
|
|
83
|
+
.map(l => l.replace(/^[-*]\s*/, '').trim())
|
|
84
|
+
.filter(l => l && !l.startsWith('#'))
|
|
85
|
+
.map(l => {
|
|
86
|
+
const colonIdx = l.indexOf(':');
|
|
87
|
+
if (colonIdx === -1)
|
|
88
|
+
return { command: l, result: '' };
|
|
89
|
+
return { command: l.slice(0, colonIdx).trim(), result: l.slice(colonIdx + 1).trim() };
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
function parseNormalizationDecisions(lines) {
|
|
93
|
+
if (!lines)
|
|
94
|
+
return [];
|
|
95
|
+
return lines
|
|
96
|
+
.map(l => l.replace(/^[-*]\s*/, '').trim())
|
|
97
|
+
.filter(l => l.includes('→'))
|
|
98
|
+
.map(l => [l]);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=structured-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-report.js","sourceRoot":"","sources":["../../src/reporting/structured-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { ParsedStructuredReport } from '../reporting/structured-report.js';
|
|
2
|
+
export declare function aggregateResult(implReport: ParsedStructuredReport, specReport: ParsedStructuredReport | undefined, qualityReport: ParsedStructuredReport | undefined, specStatus: 'approved' | 'changes_required' | 'not_run', qualityStatus: 'approved' | 'changes_required' | 'not_run'): ParsedStructuredReport;
|
|
3
|
+
//# sourceMappingURL=aggregate-result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate-result.d.ts","sourceRoot":"","sources":["../../src/review/aggregate-result.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAEhF,wBAAgB,eAAe,CAC7B,UAAU,EAAE,sBAAsB,EAClC,UAAU,EAAE,sBAAsB,GAAG,SAAS,EAC9C,aAAa,EAAE,sBAAsB,GAAG,SAAS,EACjD,UAAU,EAAE,UAAU,GAAG,kBAAkB,GAAG,SAAS,EACvD,aAAa,EAAE,UAAU,GAAG,kBAAkB,GAAG,SAAS,GACzD,sBAAsB,CA+BxB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export function aggregateResult(implReport, specReport, qualityReport, specStatus, qualityStatus) {
|
|
2
|
+
const prefix = specStatus === 'changes_required'
|
|
3
|
+
? '[Spec review exhausted] '
|
|
4
|
+
: qualityStatus === 'changes_required'
|
|
5
|
+
? '[Quality review exhausted] '
|
|
6
|
+
: '[Reviewed] ';
|
|
7
|
+
return {
|
|
8
|
+
summary: `${prefix}${implReport.summary ?? ''}`,
|
|
9
|
+
filesChanged: [
|
|
10
|
+
...implReport.filesChanged,
|
|
11
|
+
...(qualityReport?.filesChanged ?? []),
|
|
12
|
+
],
|
|
13
|
+
normalizationDecisions: implReport.normalizationDecisions,
|
|
14
|
+
validationsRun: [
|
|
15
|
+
...implReport.validationsRun,
|
|
16
|
+
...(specReport?.validationsRun ?? []),
|
|
17
|
+
...(qualityReport?.validationsRun ?? []),
|
|
18
|
+
],
|
|
19
|
+
deviationsFromBrief: [
|
|
20
|
+
...(implReport.deviationsFromBrief ?? []),
|
|
21
|
+
...(specReport?.deviationsFromBrief ?? []),
|
|
22
|
+
...(qualityReport?.deviationsFromBrief ?? []),
|
|
23
|
+
],
|
|
24
|
+
unresolved: [
|
|
25
|
+
...(implReport.unresolved ?? []),
|
|
26
|
+
...(specReport?.unresolved ?? []),
|
|
27
|
+
...(qualityReport?.unresolved ?? []),
|
|
28
|
+
],
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=aggregate-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aggregate-result.js","sourceRoot":"","sources":["../../src/review/aggregate-result.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAC7B,UAAkC,EAClC,UAA8C,EAC9C,aAAiD,EACjD,UAAuD,EACvD,aAA0D;IAE1D,MAAM,MAAM,GACV,UAAU,KAAK,kBAAkB;QAC/B,CAAC,CAAC,0BAA0B;QAC5B,CAAC,CAAC,aAAa,KAAK,kBAAkB;YACpC,CAAC,CAAC,6BAA6B;YAC/B,CAAC,CAAC,aAAa,CAAC;IAEtB,OAAO;QACL,OAAO,EAAE,GAAG,MAAM,GAAG,UAAU,CAAC,OAAO,IAAI,EAAE,EAAE;QAC/C,YAAY,EAAE;YACZ,GAAG,UAAU,CAAC,YAAY;YAC1B,GAAG,CAAC,aAAa,EAAE,YAAY,IAAI,EAAE,CAAC;SACvC;QACD,sBAAsB,EAAE,UAAU,CAAC,sBAAsB;QACzD,cAAc,EAAE;YACd,GAAG,UAAU,CAAC,cAAc;YAC5B,GAAG,CAAC,UAAU,EAAE,cAAc,IAAI,EAAE,CAAC;YACrC,GAAG,CAAC,aAAa,EAAE,cAAc,IAAI,EAAE,CAAC;SACzC;QACD,mBAAmB,EAAE;YACnB,GAAG,CAAC,UAAU,CAAC,mBAAmB,IAAI,EAAE,CAAC;YACzC,GAAG,CAAC,UAAU,EAAE,mBAAmB,IAAI,EAAE,CAAC;YAC1C,GAAG,CAAC,aAAa,EAAE,mBAAmB,IAAI,EAAE,CAAC;SAC9C;QACD,UAAU,EAAE;YACV,GAAG,CAAC,UAAU,CAAC,UAAU,IAAI,EAAE,CAAC;YAChC,GAAG,CAAC,UAAU,EAAE,UAAU,IAAI,EAAE,CAAC;YACjC,GAAG,CAAC,aAAa,EAAE,UAAU,IAAI,EAAE,CAAC;SACrC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Provider } from '../types.js';
|
|
2
|
+
import type { ParsedStructuredReport } from '../reporting/structured-report.js';
|
|
3
|
+
export interface QualityReviewResult {
|
|
4
|
+
status: 'approved' | 'changes_required' | 'not_run';
|
|
5
|
+
report?: ParsedStructuredReport;
|
|
6
|
+
findings: string[];
|
|
7
|
+
}
|
|
8
|
+
export declare function runQualityReview(reviewerProvider: Provider, packet: {
|
|
9
|
+
normalizedPrompt: string;
|
|
10
|
+
scope: string[];
|
|
11
|
+
doneCondition: string;
|
|
12
|
+
}, implReport: ParsedStructuredReport, fileContents: Record<string, string>, toolCallLog: string[], filesWritten: string[]): Promise<QualityReviewResult>;
|
|
13
|
+
//# sourceMappingURL=quality-reviewer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-reviewer.d.ts","sourceRoot":"","sources":["../../src/review/quality-reviewer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAG5C,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAGhF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,UAAU,GAAG,kBAAkB,GAAG,SAAS,CAAC;IACpD,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAsB,gBAAgB,CACpC,gBAAgB,EAAE,QAAQ,EAC1B,MAAM,EAAE;IAAE,gBAAgB,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,EAC5E,UAAU,EAAE,sBAAsB,EAClC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,WAAW,EAAE,MAAM,EAAE,EACrB,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAAC,mBAAmB,CAAC,CA4C9B"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { delegateWithEscalation } from '../delegate-with-escalation.js';
|
|
2
|
+
import { buildQualityReviewPrompt } from './reviewer-prompt.js';
|
|
3
|
+
import { parseStructuredReport } from '../reporting/structured-report.js';
|
|
4
|
+
export async function runQualityReview(reviewerProvider, packet, implReport, fileContents, toolCallLog, filesWritten) {
|
|
5
|
+
if (filesWritten.length === 0) {
|
|
6
|
+
return { status: 'not_run', findings: [] };
|
|
7
|
+
}
|
|
8
|
+
let result;
|
|
9
|
+
try {
|
|
10
|
+
const reviewerSlot = reviewerProvider.name === 'standard' ? 'standard' : 'complex';
|
|
11
|
+
result = await delegateWithEscalation({
|
|
12
|
+
prompt: buildQualityReviewPrompt(packet, implReport, fileContents, toolCallLog),
|
|
13
|
+
agentType: reviewerSlot,
|
|
14
|
+
briefQualityPolicy: 'off',
|
|
15
|
+
maxTurns: 20,
|
|
16
|
+
timeoutMs: 120_000,
|
|
17
|
+
}, [reviewerProvider], { explicitlyPinned: true });
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return { status: 'not_run', findings: [] };
|
|
21
|
+
}
|
|
22
|
+
if (result.status !== 'ok') {
|
|
23
|
+
return { status: 'not_run', findings: [] };
|
|
24
|
+
}
|
|
25
|
+
const report = parseStructuredReport(result.output);
|
|
26
|
+
if (!report.summary) {
|
|
27
|
+
return { status: 'not_run', findings: [] };
|
|
28
|
+
}
|
|
29
|
+
const summaryLower = report.summary.toLowerCase();
|
|
30
|
+
if (summaryLower.includes('changes_required')) {
|
|
31
|
+
return {
|
|
32
|
+
status: 'changes_required',
|
|
33
|
+
report,
|
|
34
|
+
findings: [...(report.deviationsFromBrief ?? []), ...(report.unresolved ?? [])],
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return { status: 'approved', report, findings: [] };
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=quality-reviewer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality-reviewer.js","sourceRoot":"","sources":["../../src/review/quality-reviewer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAEhE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAQ1E,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,gBAA0B,EAC1B,MAA4E,EAC5E,UAAkC,EAClC,YAAoC,EACpC,WAAqB,EACrB,YAAsB;IAEtB,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7C,CAAC;IAED,IAAI,MAAM,CAAC;IACX,IAAI,CAAC;QACH,MAAM,YAAY,GAChB,gBAAgB,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC;QAChE,MAAM,GAAG,MAAM,sBAAsB,CACnC;YACE,MAAM,EAAE,wBAAwB,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,CAAC;YAC/E,SAAS,EAAE,YAAY;YACvB,kBAAkB,EAAE,KAAK;YACzB,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,OAAO;SACnB,EACD,CAAC,gBAAgB,CAAC,EAClB,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAC3B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7C,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3B,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,MAAM,GAAG,qBAAqB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC7C,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;IAElD,IAAI,YAAY,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;QAC9C,OAAO;YACL,MAAM,EAAE,kBAAkB;YAC1B,MAAM;YACN,QAAQ,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,mBAAmB,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;SAChF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ParsedStructuredReport } from '../reporting/structured-report.js';
|
|
2
|
+
interface ReviewerPacketInput {
|
|
3
|
+
normalizedPrompt: string;
|
|
4
|
+
scope: string[];
|
|
5
|
+
doneCondition: string;
|
|
6
|
+
}
|
|
7
|
+
export declare function buildSpecReviewPrompt(packet: ReviewerPacketInput, implReport: ParsedStructuredReport, fileContents: Record<string, string>, toolCallLog: string[]): string;
|
|
8
|
+
export declare function buildQualityReviewPrompt(packet: ReviewerPacketInput, implReport: ParsedStructuredReport, fileContents: Record<string, string>, toolCallLog: string[]): string;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=reviewer-prompt.d.ts.map
|