@cluesmith/codev 1.6.2 → 2.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/bin/porch.js +41 -0
  2. package/dist/agent-farm/cli.d.ts.map +1 -1
  3. package/dist/agent-farm/cli.js +23 -0
  4. package/dist/agent-farm/cli.js.map +1 -1
  5. package/dist/agent-farm/commands/index.d.ts +1 -0
  6. package/dist/agent-farm/commands/index.d.ts.map +1 -1
  7. package/dist/agent-farm/commands/index.js +1 -0
  8. package/dist/agent-farm/commands/index.js.map +1 -1
  9. package/dist/agent-farm/commands/kickoff.d.ts +19 -0
  10. package/dist/agent-farm/commands/kickoff.d.ts.map +1 -0
  11. package/dist/agent-farm/commands/kickoff.js +269 -0
  12. package/dist/agent-farm/commands/kickoff.js.map +1 -0
  13. package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
  14. package/dist/agent-farm/commands/spawn.js +1 -43
  15. package/dist/agent-farm/commands/spawn.js.map +1 -1
  16. package/dist/cli.d.ts.map +1 -1
  17. package/dist/cli.js +29 -0
  18. package/dist/cli.js.map +1 -1
  19. package/dist/commands/pcheck/cache.d.ts +48 -0
  20. package/dist/commands/pcheck/cache.d.ts.map +1 -0
  21. package/dist/commands/pcheck/cache.js +170 -0
  22. package/dist/commands/pcheck/cache.js.map +1 -0
  23. package/dist/commands/pcheck/evaluator.d.ts +15 -0
  24. package/dist/commands/pcheck/evaluator.d.ts.map +1 -0
  25. package/dist/commands/pcheck/evaluator.js +246 -0
  26. package/dist/commands/pcheck/evaluator.js.map +1 -0
  27. package/dist/commands/pcheck/index.d.ts +12 -0
  28. package/dist/commands/pcheck/index.d.ts.map +1 -0
  29. package/dist/commands/pcheck/index.js +249 -0
  30. package/dist/commands/pcheck/index.js.map +1 -0
  31. package/dist/commands/pcheck/parser.d.ts +39 -0
  32. package/dist/commands/pcheck/parser.d.ts.map +1 -0
  33. package/dist/commands/pcheck/parser.js +155 -0
  34. package/dist/commands/pcheck/parser.js.map +1 -0
  35. package/dist/commands/pcheck/types.d.ts +82 -0
  36. package/dist/commands/pcheck/types.d.ts.map +1 -0
  37. package/dist/commands/pcheck/types.js +5 -0
  38. package/dist/commands/pcheck/types.js.map +1 -0
  39. package/dist/commands/porch/checks.d.ts +42 -0
  40. package/dist/commands/porch/checks.d.ts.map +1 -0
  41. package/dist/commands/porch/checks.js +195 -0
  42. package/dist/commands/porch/checks.js.map +1 -0
  43. package/dist/commands/porch/consultation.d.ts +56 -0
  44. package/dist/commands/porch/consultation.d.ts.map +1 -0
  45. package/dist/commands/porch/consultation.js +330 -0
  46. package/dist/commands/porch/consultation.js.map +1 -0
  47. package/dist/commands/porch/index.d.ts +60 -0
  48. package/dist/commands/porch/index.d.ts.map +1 -0
  49. package/dist/commands/porch/index.js +828 -0
  50. package/dist/commands/porch/index.js.map +1 -0
  51. package/dist/commands/porch/notifications.d.ts +99 -0
  52. package/dist/commands/porch/notifications.d.ts.map +1 -0
  53. package/dist/commands/porch/notifications.js +223 -0
  54. package/dist/commands/porch/notifications.js.map +1 -0
  55. package/dist/commands/porch/plan-parser.d.ts +38 -0
  56. package/dist/commands/porch/plan-parser.d.ts.map +1 -0
  57. package/dist/commands/porch/plan-parser.js +166 -0
  58. package/dist/commands/porch/plan-parser.js.map +1 -0
  59. package/dist/commands/porch/protocol-loader.d.ts +46 -0
  60. package/dist/commands/porch/protocol-loader.d.ts.map +1 -0
  61. package/dist/commands/porch/protocol-loader.js +249 -0
  62. package/dist/commands/porch/protocol-loader.js.map +1 -0
  63. package/dist/commands/porch/signal-parser.d.ts +88 -0
  64. package/dist/commands/porch/signal-parser.d.ts.map +1 -0
  65. package/dist/commands/porch/signal-parser.js +148 -0
  66. package/dist/commands/porch/signal-parser.js.map +1 -0
  67. package/dist/commands/porch/state.d.ts +133 -0
  68. package/dist/commands/porch/state.d.ts.map +1 -0
  69. package/dist/commands/porch/state.js +760 -0
  70. package/dist/commands/porch/state.js.map +1 -0
  71. package/dist/commands/porch/types.d.ts +232 -0
  72. package/dist/commands/porch/types.d.ts.map +1 -0
  73. package/dist/commands/porch/types.js +7 -0
  74. package/dist/commands/porch/types.js.map +1 -0
  75. package/package.json +2 -1
  76. package/skeleton/porch/prompts/defend.md +103 -0
  77. package/skeleton/porch/prompts/diagnose.md +70 -0
  78. package/skeleton/porch/prompts/evaluate.md +132 -0
  79. package/skeleton/porch/prompts/fix.md +59 -0
  80. package/skeleton/porch/prompts/implement.md +79 -0
  81. package/skeleton/porch/prompts/plan.md +74 -0
  82. package/skeleton/porch/prompts/pr.md +84 -0
  83. package/skeleton/porch/prompts/review.md +179 -0
  84. package/skeleton/porch/prompts/specify.md +53 -0
  85. package/skeleton/porch/prompts/test.md +63 -0
  86. package/skeleton/porch/prompts/understand.md +61 -0
  87. package/skeleton/porch/prompts/verify.md +58 -0
  88. package/skeleton/porch/protocols/bugfix.json +85 -0
  89. package/skeleton/porch/protocols/spider.json +135 -0
  90. package/skeleton/porch/protocols/tick.json +76 -0
  91. package/skeleton/protocols/bugfix/protocol.json +127 -0
  92. package/skeleton/protocols/protocol-schema.json +237 -0
  93. package/skeleton/protocols/spider/protocol.json +204 -0
  94. 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":"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"}
@@ -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"}