@cluesmith/codev 1.6.2 → 2.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/porch.js +7 -0
- package/dist/agent-farm/cli.d.ts.map +1 -1
- package/dist/agent-farm/cli.js +23 -0
- package/dist/agent-farm/cli.js.map +1 -1
- package/dist/agent-farm/commands/index.d.ts +1 -0
- package/dist/agent-farm/commands/index.d.ts.map +1 -1
- package/dist/agent-farm/commands/index.js +1 -0
- package/dist/agent-farm/commands/index.js.map +1 -1
- package/dist/agent-farm/commands/kickoff.d.ts +19 -0
- package/dist/agent-farm/commands/kickoff.d.ts.map +1 -0
- package/dist/agent-farm/commands/kickoff.js +269 -0
- package/dist/agent-farm/commands/kickoff.js.map +1 -0
- package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
- package/dist/agent-farm/commands/spawn.js +1 -43
- package/dist/agent-farm/commands/spawn.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +29 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/pcheck/cache.d.ts +48 -0
- package/dist/commands/pcheck/cache.d.ts.map +1 -0
- package/dist/commands/pcheck/cache.js +170 -0
- package/dist/commands/pcheck/cache.js.map +1 -0
- package/dist/commands/pcheck/evaluator.d.ts +15 -0
- package/dist/commands/pcheck/evaluator.d.ts.map +1 -0
- package/dist/commands/pcheck/evaluator.js +246 -0
- package/dist/commands/pcheck/evaluator.js.map +1 -0
- package/dist/commands/pcheck/index.d.ts +12 -0
- package/dist/commands/pcheck/index.d.ts.map +1 -0
- package/dist/commands/pcheck/index.js +249 -0
- package/dist/commands/pcheck/index.js.map +1 -0
- package/dist/commands/pcheck/parser.d.ts +39 -0
- package/dist/commands/pcheck/parser.d.ts.map +1 -0
- package/dist/commands/pcheck/parser.js +155 -0
- package/dist/commands/pcheck/parser.js.map +1 -0
- package/dist/commands/pcheck/types.d.ts +82 -0
- package/dist/commands/pcheck/types.d.ts.map +1 -0
- package/dist/commands/pcheck/types.js +5 -0
- package/dist/commands/pcheck/types.js.map +1 -0
- package/dist/commands/porch/checks.d.ts +42 -0
- package/dist/commands/porch/checks.d.ts.map +1 -0
- package/dist/commands/porch/checks.js +195 -0
- package/dist/commands/porch/checks.js.map +1 -0
- package/dist/commands/porch/consultation.d.ts +56 -0
- package/dist/commands/porch/consultation.d.ts.map +1 -0
- package/dist/commands/porch/consultation.js +330 -0
- package/dist/commands/porch/consultation.js.map +1 -0
- package/dist/commands/porch/index.d.ts +60 -0
- package/dist/commands/porch/index.d.ts.map +1 -0
- package/dist/commands/porch/index.js +828 -0
- package/dist/commands/porch/index.js.map +1 -0
- package/dist/commands/porch/notifications.d.ts +99 -0
- package/dist/commands/porch/notifications.d.ts.map +1 -0
- package/dist/commands/porch/notifications.js +223 -0
- package/dist/commands/porch/notifications.js.map +1 -0
- package/dist/commands/porch/plan-parser.d.ts +38 -0
- package/dist/commands/porch/plan-parser.d.ts.map +1 -0
- package/dist/commands/porch/plan-parser.js +166 -0
- package/dist/commands/porch/plan-parser.js.map +1 -0
- package/dist/commands/porch/protocol-loader.d.ts +46 -0
- package/dist/commands/porch/protocol-loader.d.ts.map +1 -0
- package/dist/commands/porch/protocol-loader.js +249 -0
- package/dist/commands/porch/protocol-loader.js.map +1 -0
- package/dist/commands/porch/signal-parser.d.ts +88 -0
- package/dist/commands/porch/signal-parser.d.ts.map +1 -0
- package/dist/commands/porch/signal-parser.js +148 -0
- package/dist/commands/porch/signal-parser.js.map +1 -0
- package/dist/commands/porch/state.d.ts +133 -0
- package/dist/commands/porch/state.d.ts.map +1 -0
- package/dist/commands/porch/state.js +760 -0
- package/dist/commands/porch/state.js.map +1 -0
- package/dist/commands/porch/types.d.ts +232 -0
- package/dist/commands/porch/types.d.ts.map +1 -0
- package/dist/commands/porch/types.js +7 -0
- package/dist/commands/porch/types.js.map +1 -0
- package/package.json +2 -1
- package/skeleton/porch/prompts/defend.md +103 -0
- package/skeleton/porch/prompts/diagnose.md +70 -0
- package/skeleton/porch/prompts/evaluate.md +132 -0
- package/skeleton/porch/prompts/fix.md +59 -0
- package/skeleton/porch/prompts/implement.md +79 -0
- package/skeleton/porch/prompts/plan.md +74 -0
- package/skeleton/porch/prompts/pr.md +84 -0
- package/skeleton/porch/prompts/review.md +179 -0
- package/skeleton/porch/prompts/specify.md +53 -0
- package/skeleton/porch/prompts/test.md +63 -0
- package/skeleton/porch/prompts/understand.md +61 -0
- package/skeleton/porch/prompts/verify.md +58 -0
- package/skeleton/porch/protocols/bugfix.json +85 -0
- package/skeleton/porch/protocols/spider.json +135 -0
- package/skeleton/porch/protocols/tick.json +76 -0
- package/skeleton/protocols/bugfix/protocol.json +127 -0
- package/skeleton/protocols/protocol-schema.json +237 -0
- package/skeleton/protocols/spider/protocol.json +204 -0
- package/skeleton/protocols/tick/protocol.json +151 -0
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Check evaluator for pcheck command
|
|
3
|
+
*
|
|
4
|
+
* Evaluates different types of checks:
|
|
5
|
+
* - file_exists: Check if a file matches a glob pattern
|
|
6
|
+
* - file_not_exists: Inverse of above
|
|
7
|
+
* - llm_check: Semantic check using Claude Haiku
|
|
8
|
+
* - command: Execute a shell command and check result
|
|
9
|
+
*/
|
|
10
|
+
import { readFileSync } from 'node:fs';
|
|
11
|
+
import { execSync } from 'node:child_process';
|
|
12
|
+
import { glob } from 'glob';
|
|
13
|
+
import Anthropic from '@anthropic-ai/sdk';
|
|
14
|
+
import { expandPattern } from './parser.js';
|
|
15
|
+
import { getCachedResult, setCachedResult } from './cache.js';
|
|
16
|
+
// Initialize Anthropic client lazily
|
|
17
|
+
let anthropicClient = null;
|
|
18
|
+
function getAnthropicClient() {
|
|
19
|
+
if (!anthropicClient) {
|
|
20
|
+
anthropicClient = new Anthropic();
|
|
21
|
+
}
|
|
22
|
+
return anthropicClient;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Evaluate a file_exists check
|
|
26
|
+
*/
|
|
27
|
+
async function evaluateFileExists(check, context) {
|
|
28
|
+
const start = Date.now();
|
|
29
|
+
const pattern = expandPattern(check.pattern, context);
|
|
30
|
+
const matches = glob.sync(pattern);
|
|
31
|
+
const pass = matches.length > 0;
|
|
32
|
+
return {
|
|
33
|
+
id: '', // Will be set by caller
|
|
34
|
+
pass,
|
|
35
|
+
description: check.description,
|
|
36
|
+
reasoning: pass
|
|
37
|
+
? `Found: ${matches[0]}`
|
|
38
|
+
: `No files matching: ${pattern}`,
|
|
39
|
+
duration_ms: Date.now() - start,
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Evaluate a file_not_exists check
|
|
44
|
+
*/
|
|
45
|
+
async function evaluateFileNotExists(check, context) {
|
|
46
|
+
const start = Date.now();
|
|
47
|
+
const pattern = expandPattern(check.pattern, context);
|
|
48
|
+
const matches = glob.sync(pattern);
|
|
49
|
+
const pass = matches.length === 0;
|
|
50
|
+
return {
|
|
51
|
+
id: '',
|
|
52
|
+
pass,
|
|
53
|
+
description: check.description,
|
|
54
|
+
reasoning: pass
|
|
55
|
+
? `No files matching: ${pattern}`
|
|
56
|
+
: `Found (should not exist): ${matches[0]}`,
|
|
57
|
+
duration_ms: Date.now() - start,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Evaluate an LLM check using Claude Haiku
|
|
62
|
+
*/
|
|
63
|
+
async function evaluateLlmCheck(checkId, check, context, useCache) {
|
|
64
|
+
const start = Date.now();
|
|
65
|
+
// Resolve file paths
|
|
66
|
+
const patterns = check.files ?? (check.file ? [check.file] : []);
|
|
67
|
+
const resolvedPaths = patterns.map(p => expandPattern(p, context));
|
|
68
|
+
const actualFiles = [];
|
|
69
|
+
for (const pattern of resolvedPaths) {
|
|
70
|
+
const matches = glob.sync(pattern);
|
|
71
|
+
if (matches.length > 0) {
|
|
72
|
+
actualFiles.push(matches[0]);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// If any required file is missing, fail immediately
|
|
76
|
+
if (actualFiles.length !== resolvedPaths.length) {
|
|
77
|
+
const missing = resolvedPaths.filter(p => !glob.sync(p).length);
|
|
78
|
+
return {
|
|
79
|
+
id: '',
|
|
80
|
+
pass: false,
|
|
81
|
+
description: check.description,
|
|
82
|
+
reasoning: `Missing files: ${missing.join(', ')}`,
|
|
83
|
+
duration_ms: Date.now() - start,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
// Check cache
|
|
87
|
+
if (useCache) {
|
|
88
|
+
const cached = getCachedResult(checkId, actualFiles);
|
|
89
|
+
if (cached) {
|
|
90
|
+
return {
|
|
91
|
+
id: '',
|
|
92
|
+
pass: cached.pass,
|
|
93
|
+
description: check.description,
|
|
94
|
+
reasoning: cached.reasoning,
|
|
95
|
+
cached: true,
|
|
96
|
+
duration_ms: Date.now() - start,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Read file contents
|
|
101
|
+
const contents = actualFiles.map(f => readFileSync(f, 'utf-8'));
|
|
102
|
+
// Build prompt
|
|
103
|
+
const filesContext = contents.map((content, i) => {
|
|
104
|
+
const filename = actualFiles[i].split('/').pop();
|
|
105
|
+
return `--- ${filename} ---\n${content}`;
|
|
106
|
+
}).join('\n\n');
|
|
107
|
+
const prompt = `Based on the following document(s), answer YES or NO to this question:
|
|
108
|
+
|
|
109
|
+
${check.question}
|
|
110
|
+
|
|
111
|
+
${filesContext}
|
|
112
|
+
|
|
113
|
+
Answer with just YES or NO on the first line, followed by a brief explanation on the next line.`;
|
|
114
|
+
try {
|
|
115
|
+
const client = getAnthropicClient();
|
|
116
|
+
const response = await client.messages.create({
|
|
117
|
+
model: 'claude-3-5-haiku-latest',
|
|
118
|
+
max_tokens: 256,
|
|
119
|
+
messages: [{ role: 'user', content: prompt }],
|
|
120
|
+
});
|
|
121
|
+
// Extract response text
|
|
122
|
+
const responseText = response.content[0].type === 'text'
|
|
123
|
+
? response.content[0].text
|
|
124
|
+
: '';
|
|
125
|
+
// Parse YES/NO answer
|
|
126
|
+
const firstLine = responseText.trim().split('\n')[0].toUpperCase();
|
|
127
|
+
const answer = firstLine.startsWith('YES');
|
|
128
|
+
const pass = check.expect === false ? !answer : answer;
|
|
129
|
+
// Cache the result
|
|
130
|
+
if (useCache) {
|
|
131
|
+
setCachedResult(checkId, actualFiles, pass, responseText);
|
|
132
|
+
}
|
|
133
|
+
return {
|
|
134
|
+
id: '',
|
|
135
|
+
pass,
|
|
136
|
+
description: check.description,
|
|
137
|
+
reasoning: responseText,
|
|
138
|
+
cached: false,
|
|
139
|
+
duration_ms: Date.now() - start,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
catch (error) {
|
|
143
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
144
|
+
return {
|
|
145
|
+
id: '',
|
|
146
|
+
pass: false,
|
|
147
|
+
description: check.description,
|
|
148
|
+
reasoning: `LLM check failed: ${errorMessage}`,
|
|
149
|
+
duration_ms: Date.now() - start,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Evaluate a command check
|
|
155
|
+
*/
|
|
156
|
+
async function evaluateCommand(check, context) {
|
|
157
|
+
const start = Date.now();
|
|
158
|
+
// Expand any variables in the command
|
|
159
|
+
const command = expandPattern(check.run, context);
|
|
160
|
+
try {
|
|
161
|
+
const output = execSync(command, {
|
|
162
|
+
encoding: 'utf-8',
|
|
163
|
+
timeout: 60000, // 60 second timeout
|
|
164
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
165
|
+
}).trim();
|
|
166
|
+
let pass = true;
|
|
167
|
+
let reasoning = `Command succeeded`;
|
|
168
|
+
// Check exit code (0 by default for success)
|
|
169
|
+
if (check.exit_code !== undefined) {
|
|
170
|
+
// If we got here, exit code was 0
|
|
171
|
+
pass = pass && (check.exit_code === 0);
|
|
172
|
+
reasoning = pass ? reasoning : `Expected exit code ${check.exit_code}, got 0`;
|
|
173
|
+
}
|
|
174
|
+
// Check stdout
|
|
175
|
+
if (check.stdout !== undefined) {
|
|
176
|
+
const stdoutMatch = output === check.stdout;
|
|
177
|
+
pass = pass && stdoutMatch;
|
|
178
|
+
if (!stdoutMatch) {
|
|
179
|
+
reasoning = `Expected stdout "${check.stdout}", got "${output}"`;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
return {
|
|
183
|
+
id: '',
|
|
184
|
+
pass,
|
|
185
|
+
description: check.description,
|
|
186
|
+
reasoning,
|
|
187
|
+
duration_ms: Date.now() - start,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
catch (error) {
|
|
191
|
+
let exitCode = 1;
|
|
192
|
+
let stderr = '';
|
|
193
|
+
if (error && typeof error === 'object') {
|
|
194
|
+
const execError = error;
|
|
195
|
+
exitCode = execError.status ?? 1;
|
|
196
|
+
stderr = execError.stderr ?? '';
|
|
197
|
+
}
|
|
198
|
+
// If we expected a non-zero exit code, this might be a pass
|
|
199
|
+
if (check.exit_code !== undefined && check.exit_code === exitCode) {
|
|
200
|
+
return {
|
|
201
|
+
id: '',
|
|
202
|
+
pass: true,
|
|
203
|
+
description: check.description,
|
|
204
|
+
reasoning: `Exit code ${exitCode} as expected`,
|
|
205
|
+
duration_ms: Date.now() - start,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
return {
|
|
209
|
+
id: '',
|
|
210
|
+
pass: false,
|
|
211
|
+
description: check.description,
|
|
212
|
+
reasoning: `Command failed with exit code ${exitCode}${stderr ? `: ${stderr.trim()}` : ''}`,
|
|
213
|
+
duration_ms: Date.now() - start,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Evaluate a single check
|
|
219
|
+
*/
|
|
220
|
+
export async function evaluateCheck(checkId, check, context, useCache = true) {
|
|
221
|
+
let result;
|
|
222
|
+
switch (check.type) {
|
|
223
|
+
case 'file_exists':
|
|
224
|
+
result = await evaluateFileExists(check, context);
|
|
225
|
+
break;
|
|
226
|
+
case 'file_not_exists':
|
|
227
|
+
result = await evaluateFileNotExists(check, context);
|
|
228
|
+
break;
|
|
229
|
+
case 'llm_check':
|
|
230
|
+
result = await evaluateLlmCheck(checkId, check, context, useCache);
|
|
231
|
+
break;
|
|
232
|
+
case 'command':
|
|
233
|
+
result = await evaluateCommand(check, context);
|
|
234
|
+
break;
|
|
235
|
+
default:
|
|
236
|
+
result = {
|
|
237
|
+
id: checkId,
|
|
238
|
+
pass: false,
|
|
239
|
+
description: 'Unknown check type',
|
|
240
|
+
reasoning: `Unsupported check type`,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
result.id = checkId;
|
|
244
|
+
return result;
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=evaluator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../src/commands/pcheck/evaluator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codev pcheck - Protocol Check command
|
|
3
|
+
*
|
|
4
|
+
* Evaluate declarative protocol checks defined in checks.yaml files.
|
|
5
|
+
* Supports semantic (LLM-based) evaluation for human-written content.
|
|
6
|
+
*/
|
|
7
|
+
import type { PcheckOptions } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Main pcheck command
|
|
10
|
+
*/
|
|
11
|
+
export declare function pcheck(target: string | undefined, options: PcheckOptions): Promise<number>;
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/pcheck/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAoD,MAAM,YAAY,CAAC;AAwMlG;;GAEG;AACH,wBAAsB,MAAM,CAC1B,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,MAAM,CAAC,CAsFjB"}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* codev pcheck - Protocol Check command
|
|
3
|
+
*
|
|
4
|
+
* Evaluate declarative protocol checks defined in checks.yaml files.
|
|
5
|
+
* Supports semantic (LLM-based) evaluation for human-written content.
|
|
6
|
+
*/
|
|
7
|
+
import chalk from 'chalk';
|
|
8
|
+
import { loadChecksFile, detectProtocol, listChecksAndGates, getAvailableProtocols } from './parser.js';
|
|
9
|
+
import { evaluateCheck } from './evaluator.js';
|
|
10
|
+
/**
|
|
11
|
+
* Print a check result with colored status
|
|
12
|
+
*/
|
|
13
|
+
function printCheckResult(result) {
|
|
14
|
+
const icon = result.pass
|
|
15
|
+
? chalk.green('✓')
|
|
16
|
+
: chalk.red('✗');
|
|
17
|
+
const cached = result.cached ? chalk.dim(' (cached)') : '';
|
|
18
|
+
const duration = result.duration_ms ? chalk.dim(` ${result.duration_ms}ms`) : '';
|
|
19
|
+
console.log(`${icon} ${result.id.padEnd(28)} ${result.description}${cached}${duration}`);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Print detailed reasoning if verbose mode
|
|
23
|
+
*/
|
|
24
|
+
function printReasoning(result, verbose) {
|
|
25
|
+
if (verbose && result.reasoning) {
|
|
26
|
+
const lines = result.reasoning.split('\n');
|
|
27
|
+
for (const line of lines) {
|
|
28
|
+
console.log(chalk.dim(` ${line}`));
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Evaluate a gate, including resolving nested gates
|
|
34
|
+
*/
|
|
35
|
+
async function evaluateGate(gateId, checksFile, context, evaluated = new Set()) {
|
|
36
|
+
const gate = checksFile.gates[gateId];
|
|
37
|
+
if (!gate) {
|
|
38
|
+
return {
|
|
39
|
+
id: gateId,
|
|
40
|
+
pass: false,
|
|
41
|
+
description: 'Unknown gate',
|
|
42
|
+
checks: [],
|
|
43
|
+
guidance: `Gate '${gateId}' not found`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const results = [];
|
|
47
|
+
let allPass = true;
|
|
48
|
+
for (const itemId of gate.all) {
|
|
49
|
+
// Check if this is a gate reference
|
|
50
|
+
if (checksFile.gates[itemId]) {
|
|
51
|
+
// Prevent infinite recursion
|
|
52
|
+
if (evaluated.has(itemId)) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
evaluated.add(itemId);
|
|
56
|
+
// Recursively evaluate the nested gate
|
|
57
|
+
const nestedResult = await evaluateGate(itemId, checksFile, context, evaluated);
|
|
58
|
+
results.push(...nestedResult.checks);
|
|
59
|
+
allPass = allPass && nestedResult.pass;
|
|
60
|
+
}
|
|
61
|
+
else if (checksFile.checks[itemId]) {
|
|
62
|
+
// It's a check
|
|
63
|
+
const check = checksFile.checks[itemId];
|
|
64
|
+
const result = await evaluateCheck(itemId, check, { project: context.project, verbose: context.verbose }, !context.noCache);
|
|
65
|
+
results.push(result);
|
|
66
|
+
allPass = allPass && result.pass;
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
// Unknown item
|
|
70
|
+
results.push({
|
|
71
|
+
id: itemId,
|
|
72
|
+
pass: false,
|
|
73
|
+
description: 'Unknown check or gate',
|
|
74
|
+
reasoning: `'${itemId}' not found in checks or gates`,
|
|
75
|
+
});
|
|
76
|
+
allPass = false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
// Determine guidance
|
|
80
|
+
const guidance = allPass
|
|
81
|
+
? gate.guidance?.pass?.replace(/\{project\}/g, context.project)
|
|
82
|
+
: gate.guidance?.fail?.replace(/\{project\}/g, context.project);
|
|
83
|
+
return {
|
|
84
|
+
id: gateId,
|
|
85
|
+
pass: allPass,
|
|
86
|
+
description: gate.description,
|
|
87
|
+
checks: results,
|
|
88
|
+
guidance,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Determine the next action based on current gate states
|
|
93
|
+
*/
|
|
94
|
+
async function determineNextAction(checksFile, context) {
|
|
95
|
+
// Evaluate gates in order of progression
|
|
96
|
+
const gateOrder = ['spec_ready', 'plan_ready', 'pr_ready'];
|
|
97
|
+
const gateStatus = new Map();
|
|
98
|
+
for (const gateId of gateOrder) {
|
|
99
|
+
if (checksFile.gates[gateId]) {
|
|
100
|
+
const result = await evaluateGate(gateId, checksFile, context);
|
|
101
|
+
gateStatus.set(gateId, result.pass);
|
|
102
|
+
// If this gate fails, provide guidance
|
|
103
|
+
if (!result.pass) {
|
|
104
|
+
// Find the first failing check
|
|
105
|
+
const failingCheck = result.checks.find(c => !c.pass);
|
|
106
|
+
if (failingCheck) {
|
|
107
|
+
const check = checksFile.checks[failingCheck.id];
|
|
108
|
+
if (check) {
|
|
109
|
+
return formatNextAction(gateId, failingCheck, check, context);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return result.guidance ?? 'Fix failing checks';
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return 'All gates pass! Ready to proceed.';
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Format a detailed next action message
|
|
120
|
+
*/
|
|
121
|
+
function formatNextAction(gateId, failingCheck, check, context) {
|
|
122
|
+
let action = `Current state: `;
|
|
123
|
+
// Show gate status
|
|
124
|
+
const gateOrder = ['spec_ready', 'plan_ready', 'pr_ready'];
|
|
125
|
+
const statusParts = [];
|
|
126
|
+
for (const g of gateOrder) {
|
|
127
|
+
if (g === gateId) {
|
|
128
|
+
statusParts.push(`${g} ✗`);
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
statusParts.push(`${g} ✓`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
action += statusParts.join(', ') + '\n\n';
|
|
136
|
+
action += `Next action: ${failingCheck.description}\n`;
|
|
137
|
+
// Provide specific guidance based on check type
|
|
138
|
+
if (check.type === 'file_exists') {
|
|
139
|
+
const pattern = check.pattern.replace(/\{project\}/g, context.project);
|
|
140
|
+
action += ` Create: ${pattern}\n`;
|
|
141
|
+
}
|
|
142
|
+
else if (check.type === 'llm_check') {
|
|
143
|
+
const file = check.file ?? check.files?.[0] ?? '';
|
|
144
|
+
const pattern = file.replace(/\{project\}/g, context.project);
|
|
145
|
+
action += ` Edit: ${pattern}\n`;
|
|
146
|
+
action += ` Ensure: ${check.question}\n`;
|
|
147
|
+
}
|
|
148
|
+
else if (check.type === 'command') {
|
|
149
|
+
action += ` Run: ${check.run}\n`;
|
|
150
|
+
action += ` Fix any issues and retry\n`;
|
|
151
|
+
}
|
|
152
|
+
return action;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* List all available checks and gates
|
|
156
|
+
*/
|
|
157
|
+
function handleList(protocol) {
|
|
158
|
+
const { checks, gates } = listChecksAndGates(protocol);
|
|
159
|
+
console.log(`Protocol: ${chalk.cyan(protocol)}\n`);
|
|
160
|
+
console.log(chalk.bold('Checks:'));
|
|
161
|
+
for (const [id, desc] of Object.entries(checks)) {
|
|
162
|
+
console.log(` ${id.padEnd(28)} ${chalk.dim(desc)}`);
|
|
163
|
+
}
|
|
164
|
+
console.log('');
|
|
165
|
+
console.log(chalk.bold('Gates:'));
|
|
166
|
+
for (const [id, desc] of Object.entries(gates)) {
|
|
167
|
+
console.log(` ${id.padEnd(28)} ${chalk.dim(desc)}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Main pcheck command
|
|
172
|
+
*/
|
|
173
|
+
export async function pcheck(target, options) {
|
|
174
|
+
// Handle --list
|
|
175
|
+
if (options.list || target === 'list') {
|
|
176
|
+
const protocol = options.protocol ?? 'spider';
|
|
177
|
+
handleList(protocol);
|
|
178
|
+
return 0;
|
|
179
|
+
}
|
|
180
|
+
// Require project for check operations
|
|
181
|
+
if (!options.project) {
|
|
182
|
+
console.error(chalk.red('Error: --project is required'));
|
|
183
|
+
console.error('Usage: codev pcheck <gate> --project <id>');
|
|
184
|
+
return 1;
|
|
185
|
+
}
|
|
186
|
+
// Detect or use specified protocol
|
|
187
|
+
const protocol = options.protocol ?? detectProtocol(options.project);
|
|
188
|
+
// Load checks file
|
|
189
|
+
const checksFile = loadChecksFile(protocol);
|
|
190
|
+
if (!checksFile) {
|
|
191
|
+
console.error(chalk.red(`Error: No checks.yaml found for protocol '${protocol}'`));
|
|
192
|
+
console.error(`Available protocols: ${getAvailableProtocols().join(', ')}`);
|
|
193
|
+
return 1;
|
|
194
|
+
}
|
|
195
|
+
const context = {
|
|
196
|
+
project: options.project,
|
|
197
|
+
verbose: options.verbose,
|
|
198
|
+
noCache: options.noCache,
|
|
199
|
+
};
|
|
200
|
+
// Handle --next
|
|
201
|
+
if (options.next) {
|
|
202
|
+
const nextAction = await determineNextAction(checksFile, context);
|
|
203
|
+
console.log(nextAction);
|
|
204
|
+
return 0;
|
|
205
|
+
}
|
|
206
|
+
// Evaluate specific gate or check
|
|
207
|
+
if (!target) {
|
|
208
|
+
console.error(chalk.red('Error: Specify a gate or check to evaluate'));
|
|
209
|
+
console.error('Usage: codev pcheck <gate> --project <id>');
|
|
210
|
+
console.error(' or: codev pcheck --list');
|
|
211
|
+
console.error(' or: codev pcheck --next --project <id>');
|
|
212
|
+
return 1;
|
|
213
|
+
}
|
|
214
|
+
// Check if target is a gate or individual check
|
|
215
|
+
if (checksFile.gates[target]) {
|
|
216
|
+
const result = await evaluateGate(target, checksFile, context);
|
|
217
|
+
console.log(`Checking gate: ${chalk.cyan(target)} (${result.description})\n`);
|
|
218
|
+
for (const checkResult of result.checks) {
|
|
219
|
+
printCheckResult(checkResult);
|
|
220
|
+
printReasoning(checkResult, !!options.verbose);
|
|
221
|
+
}
|
|
222
|
+
console.log('');
|
|
223
|
+
if (result.pass) {
|
|
224
|
+
console.log(chalk.green('PASSED') + `: All checks passed`);
|
|
225
|
+
}
|
|
226
|
+
else {
|
|
227
|
+
const failCount = result.checks.filter(c => !c.pass).length;
|
|
228
|
+
console.log(chalk.red('BLOCKED') + `: ${failCount} check${failCount > 1 ? 's' : ''} failed`);
|
|
229
|
+
}
|
|
230
|
+
if (result.guidance) {
|
|
231
|
+
console.log(`\nGuidance: ${result.guidance}`);
|
|
232
|
+
}
|
|
233
|
+
return result.pass ? 0 : 1;
|
|
234
|
+
}
|
|
235
|
+
else if (checksFile.checks[target]) {
|
|
236
|
+
// Individual check
|
|
237
|
+
const check = checksFile.checks[target];
|
|
238
|
+
const result = await evaluateCheck(target, check, context, !options.noCache);
|
|
239
|
+
printCheckResult(result);
|
|
240
|
+
printReasoning(result, true); // Always show reasoning for individual checks
|
|
241
|
+
return result.pass ? 0 : 1;
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
console.error(chalk.red(`Error: Unknown gate or check '${target}'`));
|
|
245
|
+
console.error(`Run 'codev pcheck --list' to see available checks and gates`);
|
|
246
|
+
return 1;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/commands/pcheck/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,kBAAkB,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACxG,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;GAEG;AACH,SAAS,gBAAgB,CAAC,MAAmB;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI;QACtB,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC;QAClB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAEnB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,WAAW,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEjF,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,GAAG,MAAM,GAAG,QAAQ,EAAE,CAAC,CAAC;AAC3F,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,MAAmB,EAAE,OAAgB;IAC3D,IAAI,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC3C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,YAAY,CACzB,MAAc,EACd,UAAsB,EACtB,OAAkE,EAClE,YAAyB,IAAI,GAAG,EAAE;IAElC,MAAM,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,KAAK;YACX,WAAW,EAAE,cAAc;YAC3B,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,SAAS,MAAM,aAAa;SACvC,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,IAAI,OAAO,GAAG,IAAI,CAAC;IAEnB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,oCAAoC;QACpC,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,6BAA6B;YAC7B,IAAI,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC1B,SAAS;YACX,CAAC;YACD,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAEtB,uCAAuC;YACvC,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;YAChF,OAAO,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACrC,OAAO,GAAG,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC;QACzC,CAAC;aAAM,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,eAAe;YACf,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,aAAa,CAChC,MAAM,EACN,KAAK,EACL,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,EACtD,CAAC,OAAO,CAAC,OAAO,CACjB,CAAC;YACF,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrB,OAAO,GAAG,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,eAAe;YACf,OAAO,CAAC,IAAI,CAAC;gBACX,EAAE,EAAE,MAAM;gBACV,IAAI,EAAE,KAAK;gBACX,WAAW,EAAE,uBAAuB;gBACpC,SAAS,EAAE,IAAI,MAAM,gCAAgC;aACtD,CAAC,CAAC;YACH,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;IACH,CAAC;IAED,qBAAqB;IACrB,MAAM,QAAQ,GAAG,OAAO;QACtB,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC;QAC/D,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAElE,OAAO;QACL,EAAE,EAAE,MAAM;QACV,IAAI,EAAE,OAAO;QACb,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,OAAO;QACf,QAAQ;KACT,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,mBAAmB,CAChC,UAAsB,EACtB,OAA4B;IAE5B,yCAAyC;IACzC,MAAM,SAAS,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IAC3D,MAAM,UAAU,GAAyB,IAAI,GAAG,EAAE,CAAC;IAEnD,KAAK,MAAM,MAAM,IAAI,SAAS,EAAE,CAAC;QAC/B,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;YAC/D,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;YAEpC,uCAAuC;YACvC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjB,+BAA+B;gBAC/B,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACtD,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;oBACjD,IAAI,KAAK,EAAE,CAAC;wBACV,OAAO,gBAAgB,CAAC,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;oBAChE,CAAC;gBACH,CAAC;gBACD,OAAO,MAAM,CAAC,QAAQ,IAAI,oBAAoB,CAAC;YACjD,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,mCAAmC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,MAAc,EACd,YAAyB,EACzB,KAAY,EACZ,OAA4B;IAE5B,IAAI,MAAM,GAAG,iBAAiB,CAAC;IAE/B,mBAAmB;IACnB,MAAM,SAAS,GAAG,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,MAAM,EAAE,CAAC;YACjB,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC3B,MAAM;QACR,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;IAE1C,MAAM,IAAI,gBAAgB,YAAY,CAAC,WAAW,IAAI,CAAC;IAEvD,gDAAgD;IAChD,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACjC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QACvE,MAAM,IAAI,aAAa,OAAO,IAAI,CAAC;IACrC,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9D,MAAM,IAAI,WAAW,OAAO,IAAI,CAAC;QACjC,MAAM,IAAI,aAAa,KAAK,CAAC,QAAQ,IAAI,CAAC;IAC5C,CAAC;SAAM,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,IAAI,UAAU,KAAK,CAAC,GAAG,IAAI,CAAC;QAClC,MAAM,IAAI,8BAA8B,CAAC;IAC3C,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,QAAgB;IAClC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC;IAEvD,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAEnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACnC,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,MAA0B,EAC1B,OAAsB;IAEtB,gBAAgB;IAChB,IAAI,OAAO,CAAC,IAAI,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,QAAQ,CAAC;QAC9C,UAAU,CAAC,QAAQ,CAAC,CAAC;QACrB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,uCAAuC;IACvC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACzD,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,mCAAmC;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,cAAc,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAErE,mBAAmB;IACnB,MAAM,UAAU,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6CAA6C,QAAQ,GAAG,CAAC,CAAC,CAAC;QACnF,OAAO,CAAC,KAAK,CAAC,wBAAwB,qBAAqB,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5E,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG;QACd,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;IAEF,gBAAgB;IAChB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,MAAM,UAAU,GAAG,MAAM,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QAClE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxB,OAAO,CAAC,CAAC;IACX,CAAC;IAED,kCAAkC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACvE,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAC5C,OAAO,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,gDAAgD;IAChD,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QAE/D,OAAO,CAAC,GAAG,CAAC,kBAAkB,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,MAAM,CAAC,WAAW,KAAK,CAAC,CAAC;QAE9E,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YACxC,gBAAgB,CAAC,WAAW,CAAC,CAAC;YAC9B,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACjD,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,qBAAqB,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;YAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,KAAK,SAAS,SAAS,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;QAC/F,CAAC;QAED,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;SAAM,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,mBAAmB;QACnB,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE7E,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACzB,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAE,8CAA8C;QAE7E,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,iCAAiC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC7E,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for checks.yaml protocol definition files
|
|
3
|
+
*/
|
|
4
|
+
import type { ChecksFile, Check, EvaluationContext } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Load a checks.yaml file from a protocol directory
|
|
7
|
+
*/
|
|
8
|
+
export declare function loadChecksFile(protocol: string): ChecksFile | null;
|
|
9
|
+
/**
|
|
10
|
+
* Detect the protocol for a given project
|
|
11
|
+
* Looks at the spec file to determine which protocol to use
|
|
12
|
+
*/
|
|
13
|
+
export declare function detectProtocol(projectId: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Expand a pattern with context variables
|
|
16
|
+
* Replaces {project} with the actual project ID
|
|
17
|
+
*/
|
|
18
|
+
export declare function expandPattern(pattern: string, context: EvaluationContext): string;
|
|
19
|
+
/**
|
|
20
|
+
* Find the actual file matching a pattern
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveFile(pattern: string, context: EvaluationContext): string | null;
|
|
23
|
+
/**
|
|
24
|
+
* Resolve all files for a check
|
|
25
|
+
* Handles both single file and files array
|
|
26
|
+
*/
|
|
27
|
+
export declare function resolveFiles(check: Check, context: EvaluationContext): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Get all available protocols with checks.yaml files
|
|
30
|
+
*/
|
|
31
|
+
export declare function getAvailableProtocols(): string[];
|
|
32
|
+
/**
|
|
33
|
+
* List all checks and gates in a protocol
|
|
34
|
+
*/
|
|
35
|
+
export declare function listChecksAndGates(protocol: string): {
|
|
36
|
+
checks: Record<string, string>;
|
|
37
|
+
gates: Record<string, string>;
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/commands/pcheck/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAQ,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAgB7E;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CA2BlE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAwBxD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAEjF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAItF;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,iBAAiB,GAAG,MAAM,EAAE,CAW/E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAiChD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAiBtH"}
|