@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.
- package/bin/porch.js +41 -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,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parser for checks.yaml protocol definition files
|
|
3
|
+
*/
|
|
4
|
+
import { readFileSync, existsSync } from 'node:fs';
|
|
5
|
+
import { join, dirname } from 'node:path';
|
|
6
|
+
import { parse as parseYaml } from 'yaml';
|
|
7
|
+
import { glob } from 'glob';
|
|
8
|
+
/**
|
|
9
|
+
* Find the codev directory in the current project
|
|
10
|
+
*/
|
|
11
|
+
function findCodevDir(startDir = process.cwd()) {
|
|
12
|
+
let dir = startDir;
|
|
13
|
+
while (dir !== '/') {
|
|
14
|
+
if (existsSync(join(dir, 'codev'))) {
|
|
15
|
+
return join(dir, 'codev');
|
|
16
|
+
}
|
|
17
|
+
dir = dirname(dir);
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Load a checks.yaml file from a protocol directory
|
|
23
|
+
*/
|
|
24
|
+
export function loadChecksFile(protocol) {
|
|
25
|
+
const codevDir = findCodevDir();
|
|
26
|
+
if (!codevDir) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
// Try both codev/protocols/ and codev-skeleton/protocols/
|
|
30
|
+
const possiblePaths = [
|
|
31
|
+
join(codevDir, 'protocols', protocol, 'checks.yaml'),
|
|
32
|
+
join(dirname(codevDir), 'codev-skeleton', 'protocols', protocol, 'checks.yaml'),
|
|
33
|
+
];
|
|
34
|
+
for (const checksPath of possiblePaths) {
|
|
35
|
+
if (existsSync(checksPath)) {
|
|
36
|
+
const content = readFileSync(checksPath, 'utf-8');
|
|
37
|
+
const parsed = parseYaml(content);
|
|
38
|
+
// Validate structure
|
|
39
|
+
if (!parsed.checks || !parsed.gates) {
|
|
40
|
+
throw new Error(`Invalid checks.yaml: missing 'checks' or 'gates' section in ${checksPath}`);
|
|
41
|
+
}
|
|
42
|
+
return parsed;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Detect the protocol for a given project
|
|
49
|
+
* Looks at the spec file to determine which protocol to use
|
|
50
|
+
*/
|
|
51
|
+
export function detectProtocol(projectId) {
|
|
52
|
+
const codevDir = findCodevDir();
|
|
53
|
+
if (!codevDir) {
|
|
54
|
+
return 'spider'; // Default
|
|
55
|
+
}
|
|
56
|
+
// Try to find the spec file
|
|
57
|
+
const specPattern = join(codevDir, 'specs', `${projectId}-*.md`);
|
|
58
|
+
const specFiles = glob.sync(specPattern);
|
|
59
|
+
if (specFiles.length === 0) {
|
|
60
|
+
return 'spider'; // Default
|
|
61
|
+
}
|
|
62
|
+
// Read the spec and look for protocol declaration
|
|
63
|
+
const specContent = readFileSync(specFiles[0], 'utf-8');
|
|
64
|
+
// Look for **Protocol**: TICK/SPIDER/BUGFIX pattern
|
|
65
|
+
const protocolMatch = specContent.match(/\*\*Protocol\*\*:\s*(\w+)/i);
|
|
66
|
+
if (protocolMatch) {
|
|
67
|
+
return protocolMatch[1].toLowerCase();
|
|
68
|
+
}
|
|
69
|
+
return 'spider'; // Default
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Expand a pattern with context variables
|
|
73
|
+
* Replaces {project} with the actual project ID
|
|
74
|
+
*/
|
|
75
|
+
export function expandPattern(pattern, context) {
|
|
76
|
+
return pattern.replace(/\{project\}/g, context.project);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Find the actual file matching a pattern
|
|
80
|
+
*/
|
|
81
|
+
export function resolveFile(pattern, context) {
|
|
82
|
+
const expanded = expandPattern(pattern, context);
|
|
83
|
+
const matches = glob.sync(expanded);
|
|
84
|
+
return matches.length > 0 ? matches[0] : null;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Resolve all files for a check
|
|
88
|
+
* Handles both single file and files array
|
|
89
|
+
*/
|
|
90
|
+
export function resolveFiles(check, context) {
|
|
91
|
+
if (check.type === 'llm_check') {
|
|
92
|
+
if (check.files) {
|
|
93
|
+
return check.files.map(f => expandPattern(f, context));
|
|
94
|
+
}
|
|
95
|
+
else if (check.file) {
|
|
96
|
+
return [expandPattern(check.file, context)];
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
else if (check.type === 'file_exists' || check.type === 'file_not_exists') {
|
|
100
|
+
return [expandPattern(check.pattern, context)];
|
|
101
|
+
}
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Get all available protocols with checks.yaml files
|
|
106
|
+
*/
|
|
107
|
+
export function getAvailableProtocols() {
|
|
108
|
+
const codevDir = findCodevDir();
|
|
109
|
+
if (!codevDir) {
|
|
110
|
+
return [];
|
|
111
|
+
}
|
|
112
|
+
const protocols = [];
|
|
113
|
+
// Check codev/protocols/
|
|
114
|
+
const protocolsDir = join(codevDir, 'protocols');
|
|
115
|
+
if (existsSync(protocolsDir)) {
|
|
116
|
+
const entries = glob.sync(join(protocolsDir, '*/checks.yaml'));
|
|
117
|
+
for (const entry of entries) {
|
|
118
|
+
const protocol = dirname(entry).split('/').pop();
|
|
119
|
+
if (protocol) {
|
|
120
|
+
protocols.push(protocol);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Check codev-skeleton/protocols/
|
|
125
|
+
const skeletonDir = join(dirname(codevDir), 'codev-skeleton', 'protocols');
|
|
126
|
+
if (existsSync(skeletonDir)) {
|
|
127
|
+
const entries = glob.sync(join(skeletonDir, '*/checks.yaml'));
|
|
128
|
+
for (const entry of entries) {
|
|
129
|
+
const protocol = dirname(entry).split('/').pop();
|
|
130
|
+
if (protocol && !protocols.includes(protocol)) {
|
|
131
|
+
protocols.push(protocol);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
return protocols;
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* List all checks and gates in a protocol
|
|
139
|
+
*/
|
|
140
|
+
export function listChecksAndGates(protocol) {
|
|
141
|
+
const checksFile = loadChecksFile(protocol);
|
|
142
|
+
if (!checksFile) {
|
|
143
|
+
return { checks: {}, gates: {} };
|
|
144
|
+
}
|
|
145
|
+
const checks = {};
|
|
146
|
+
for (const [id, check] of Object.entries(checksFile.checks)) {
|
|
147
|
+
checks[id] = check.description;
|
|
148
|
+
}
|
|
149
|
+
const gates = {};
|
|
150
|
+
for (const [id, gate] of Object.entries(checksFile.gates)) {
|
|
151
|
+
gates[id] = gate.description;
|
|
152
|
+
}
|
|
153
|
+
return { checks, gates };
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/commands/pcheck/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for pcheck - Protocol Check command
|
|
3
|
+
*/
|
|
4
|
+
export type CheckType = 'file_exists' | 'file_not_exists' | 'llm_check' | 'command';
|
|
5
|
+
export interface BaseCheck {
|
|
6
|
+
type: CheckType;
|
|
7
|
+
description: string;
|
|
8
|
+
}
|
|
9
|
+
export interface FileExistsCheck extends BaseCheck {
|
|
10
|
+
type: 'file_exists';
|
|
11
|
+
pattern: string;
|
|
12
|
+
}
|
|
13
|
+
export interface FileNotExistsCheck extends BaseCheck {
|
|
14
|
+
type: 'file_not_exists';
|
|
15
|
+
pattern: string;
|
|
16
|
+
}
|
|
17
|
+
export interface LlmCheck extends BaseCheck {
|
|
18
|
+
type: 'llm_check';
|
|
19
|
+
file?: string;
|
|
20
|
+
files?: string[];
|
|
21
|
+
question: string;
|
|
22
|
+
expect?: boolean;
|
|
23
|
+
}
|
|
24
|
+
export interface CommandCheck extends BaseCheck {
|
|
25
|
+
type: 'command';
|
|
26
|
+
run: string;
|
|
27
|
+
exit_code?: number;
|
|
28
|
+
stdout?: string;
|
|
29
|
+
}
|
|
30
|
+
export type Check = FileExistsCheck | FileNotExistsCheck | LlmCheck | CommandCheck;
|
|
31
|
+
export interface Gate {
|
|
32
|
+
description: string;
|
|
33
|
+
all: string[];
|
|
34
|
+
guidance?: {
|
|
35
|
+
pass: string;
|
|
36
|
+
fail: string;
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
export interface ChecksFile {
|
|
40
|
+
checks: Record<string, Check>;
|
|
41
|
+
gates: Record<string, Gate>;
|
|
42
|
+
}
|
|
43
|
+
export interface CheckResult {
|
|
44
|
+
id: string;
|
|
45
|
+
pass: boolean;
|
|
46
|
+
description: string;
|
|
47
|
+
reasoning?: string;
|
|
48
|
+
cached?: boolean;
|
|
49
|
+
duration_ms?: number;
|
|
50
|
+
}
|
|
51
|
+
export interface GateResult {
|
|
52
|
+
id: string;
|
|
53
|
+
pass: boolean;
|
|
54
|
+
description: string;
|
|
55
|
+
checks: CheckResult[];
|
|
56
|
+
guidance?: string;
|
|
57
|
+
}
|
|
58
|
+
export interface EvaluationContext {
|
|
59
|
+
project: string;
|
|
60
|
+
protocol?: string;
|
|
61
|
+
verbose?: boolean;
|
|
62
|
+
}
|
|
63
|
+
export interface CacheEntry {
|
|
64
|
+
checkId: string;
|
|
65
|
+
contentHash: string;
|
|
66
|
+
pass: boolean;
|
|
67
|
+
reasoning?: string;
|
|
68
|
+
timestamp: number;
|
|
69
|
+
}
|
|
70
|
+
export interface CacheFile {
|
|
71
|
+
version: number;
|
|
72
|
+
entries: Record<string, CacheEntry>;
|
|
73
|
+
}
|
|
74
|
+
export interface PcheckOptions {
|
|
75
|
+
project?: string;
|
|
76
|
+
list?: boolean;
|
|
77
|
+
next?: boolean;
|
|
78
|
+
protocol?: string;
|
|
79
|
+
verbose?: boolean;
|
|
80
|
+
noCache?: boolean;
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/commands/pcheck/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,iBAAiB,GAAG,WAAW,GAAG,SAAS,CAAC;AAGpF,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,eAAgB,SAAQ,SAAS;IAChD,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,kBAAmB,SAAQ,SAAS;IACnD,IAAI,EAAE,iBAAiB,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,QAAS,SAAQ,SAAS;IACzC,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAGD,MAAM,WAAW,YAAa,SAAQ,SAAS;IAC7C,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,MAAM,KAAK,GAAG,eAAe,GAAG,kBAAkB,GAAG,QAAQ,GAAG,YAAY,CAAC;AAGnF,MAAM,WAAW,IAAI;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,EAAE,CAAC;IACd,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAGD,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;CAC7B;AAGD,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAGD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAGD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACrC;AAGD,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/commands/pcheck/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defense Checks
|
|
3
|
+
*
|
|
4
|
+
* Runs build/test commands defined in protocol phases.
|
|
5
|
+
* Supports retry logic and configurable failure behavior.
|
|
6
|
+
*/
|
|
7
|
+
import type { Check, Phase } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Result of a single check
|
|
10
|
+
*/
|
|
11
|
+
export interface CheckResult {
|
|
12
|
+
name: string;
|
|
13
|
+
success: boolean;
|
|
14
|
+
output: string;
|
|
15
|
+
error?: string;
|
|
16
|
+
attempts: number;
|
|
17
|
+
duration: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Result of running all checks for a phase
|
|
21
|
+
*/
|
|
22
|
+
export interface ChecksResult {
|
|
23
|
+
success: boolean;
|
|
24
|
+
checks: CheckResult[];
|
|
25
|
+
returnTo?: string;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Run all checks for a phase
|
|
29
|
+
*/
|
|
30
|
+
export declare function runPhaseChecks(phase: Phase, options?: {
|
|
31
|
+
cwd?: string;
|
|
32
|
+
dryRun?: boolean;
|
|
33
|
+
}): Promise<ChecksResult>;
|
|
34
|
+
/**
|
|
35
|
+
* Create default checks for common phases
|
|
36
|
+
*/
|
|
37
|
+
export declare function getDefaultChecks(phaseName: string): Record<string, Check>;
|
|
38
|
+
/**
|
|
39
|
+
* Format check results for display
|
|
40
|
+
*/
|
|
41
|
+
export declare function formatCheckResults(results: ChecksResult): string;
|
|
42
|
+
//# sourceMappingURL=checks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/checks.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA+HD;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,KAAK,EACZ,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,OAAO,CAAC;CACb,GACL,OAAO,CAAC,YAAY,CAAC,CA6CvB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAqBzE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAuBhE"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defense Checks
|
|
3
|
+
*
|
|
4
|
+
* Runs build/test commands defined in protocol phases.
|
|
5
|
+
* Supports retry logic and configurable failure behavior.
|
|
6
|
+
*/
|
|
7
|
+
import { spawn } from 'node:child_process';
|
|
8
|
+
import chalk from 'chalk';
|
|
9
|
+
/**
|
|
10
|
+
* Run a single command with timeout
|
|
11
|
+
*/
|
|
12
|
+
async function runCommand(command, options = {}) {
|
|
13
|
+
const startTime = Date.now();
|
|
14
|
+
const timeout = options.timeout || 300000; // 5 minutes default
|
|
15
|
+
return new Promise((resolve) => {
|
|
16
|
+
const [cmd, ...args] = command.split(/\s+/);
|
|
17
|
+
const proc = spawn(cmd, args, {
|
|
18
|
+
cwd: options.cwd,
|
|
19
|
+
shell: true,
|
|
20
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
21
|
+
});
|
|
22
|
+
let output = '';
|
|
23
|
+
let stderr = '';
|
|
24
|
+
let timedOut = false;
|
|
25
|
+
const timeoutId = setTimeout(() => {
|
|
26
|
+
timedOut = true;
|
|
27
|
+
proc.kill('SIGTERM');
|
|
28
|
+
}, timeout);
|
|
29
|
+
proc.stdout.on('data', (data) => {
|
|
30
|
+
output += data.toString();
|
|
31
|
+
});
|
|
32
|
+
proc.stderr.on('data', (data) => {
|
|
33
|
+
stderr += data.toString();
|
|
34
|
+
});
|
|
35
|
+
proc.on('close', (code) => {
|
|
36
|
+
clearTimeout(timeoutId);
|
|
37
|
+
const duration = Date.now() - startTime;
|
|
38
|
+
if (timedOut) {
|
|
39
|
+
resolve({
|
|
40
|
+
success: false,
|
|
41
|
+
output,
|
|
42
|
+
error: `Command timed out after ${timeout}ms`,
|
|
43
|
+
duration,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
resolve({
|
|
48
|
+
success: code === 0,
|
|
49
|
+
output: output + stderr,
|
|
50
|
+
error: code !== 0 ? `Exit code: ${code}` : undefined,
|
|
51
|
+
duration,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
proc.on('error', (err) => {
|
|
56
|
+
clearTimeout(timeoutId);
|
|
57
|
+
resolve({
|
|
58
|
+
success: false,
|
|
59
|
+
output: '',
|
|
60
|
+
error: err.message,
|
|
61
|
+
duration: Date.now() - startTime,
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Run a check with retry logic
|
|
68
|
+
*/
|
|
69
|
+
async function runCheckWithRetry(name, check, options = {}) {
|
|
70
|
+
const maxRetries = check.max_retries || 3;
|
|
71
|
+
const retryDelay = check.retry_delay || 5; // seconds
|
|
72
|
+
let attempts = 0;
|
|
73
|
+
let lastResult = null;
|
|
74
|
+
while (attempts < maxRetries) {
|
|
75
|
+
attempts++;
|
|
76
|
+
console.log(chalk.blue(`[check] Running ${name} (attempt ${attempts}/${maxRetries}): ${check.command}`));
|
|
77
|
+
lastResult = await runCommand(check.command, options);
|
|
78
|
+
if (lastResult.success) {
|
|
79
|
+
console.log(chalk.green(`[check] ${name} passed (${lastResult.duration}ms)`));
|
|
80
|
+
return {
|
|
81
|
+
name,
|
|
82
|
+
success: true,
|
|
83
|
+
output: lastResult.output,
|
|
84
|
+
attempts,
|
|
85
|
+
duration: lastResult.duration,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
console.log(chalk.yellow(`[check] ${name} failed: ${lastResult.error}`));
|
|
89
|
+
// Only retry if on_fail is 'retry'
|
|
90
|
+
if (check.on_fail !== 'retry' || attempts >= maxRetries) {
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
console.log(chalk.blue(`[check] Retrying in ${retryDelay}s...`));
|
|
94
|
+
await new Promise(r => setTimeout(r, retryDelay * 1000));
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
name,
|
|
98
|
+
success: false,
|
|
99
|
+
output: lastResult?.output || '',
|
|
100
|
+
error: lastResult?.error,
|
|
101
|
+
attempts,
|
|
102
|
+
duration: lastResult?.duration || 0,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Run all checks for a phase
|
|
107
|
+
*/
|
|
108
|
+
export async function runPhaseChecks(phase, options = {}) {
|
|
109
|
+
if (!phase.checks || Object.keys(phase.checks).length === 0) {
|
|
110
|
+
return { success: true, checks: [] };
|
|
111
|
+
}
|
|
112
|
+
if (options.dryRun) {
|
|
113
|
+
console.log(chalk.yellow(`[check] [DRY RUN] Would run checks for phase ${phase.id}:`));
|
|
114
|
+
for (const [name, check] of Object.entries(phase.checks)) {
|
|
115
|
+
console.log(chalk.yellow(` - ${name}: ${check.command}`));
|
|
116
|
+
}
|
|
117
|
+
return { success: true, checks: [] };
|
|
118
|
+
}
|
|
119
|
+
const results = [];
|
|
120
|
+
let returnTo;
|
|
121
|
+
for (const [name, check] of Object.entries(phase.checks)) {
|
|
122
|
+
const result = await runCheckWithRetry(name, check, { cwd: options.cwd });
|
|
123
|
+
results.push(result);
|
|
124
|
+
if (!result.success) {
|
|
125
|
+
console.log(chalk.red(`[check] ${name} failed after ${result.attempts} attempts`));
|
|
126
|
+
// Determine failure action
|
|
127
|
+
if (check.on_fail === 'retry') {
|
|
128
|
+
// Already retried, now fail
|
|
129
|
+
returnTo = undefined;
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
// on_fail specifies a phase to return to
|
|
133
|
+
returnTo = check.on_fail;
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
checks: results,
|
|
138
|
+
returnTo,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
console.log(chalk.green(`[check] All checks passed for phase ${phase.id}`));
|
|
143
|
+
return {
|
|
144
|
+
success: true,
|
|
145
|
+
checks: results,
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Create default checks for common phases
|
|
150
|
+
*/
|
|
151
|
+
export function getDefaultChecks(phaseName) {
|
|
152
|
+
switch (phaseName.toLowerCase()) {
|
|
153
|
+
case 'implement':
|
|
154
|
+
return {
|
|
155
|
+
build: {
|
|
156
|
+
command: 'npm run build',
|
|
157
|
+
on_fail: 'retry',
|
|
158
|
+
max_retries: 2,
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
case 'defend':
|
|
162
|
+
return {
|
|
163
|
+
tests: {
|
|
164
|
+
command: 'npm test',
|
|
165
|
+
on_fail: 'implement', // Return to implement on test failure
|
|
166
|
+
max_retries: 1,
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
default:
|
|
170
|
+
return {};
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Format check results for display
|
|
175
|
+
*/
|
|
176
|
+
export function formatCheckResults(results) {
|
|
177
|
+
if (results.checks.length === 0) {
|
|
178
|
+
return 'No checks ran';
|
|
179
|
+
}
|
|
180
|
+
const lines = ['Check Results:'];
|
|
181
|
+
for (const check of results.checks) {
|
|
182
|
+
const status = check.success ? '✓' : '✗';
|
|
183
|
+
const duration = `(${check.duration}ms)`;
|
|
184
|
+
const attempts = check.attempts > 1 ? ` [${check.attempts} attempts]` : '';
|
|
185
|
+
lines.push(` ${status} ${check.name} ${duration}${attempts}`);
|
|
186
|
+
if (!check.success && check.error) {
|
|
187
|
+
lines.push(` Error: ${check.error}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
if (results.returnTo) {
|
|
191
|
+
lines.push(` → Returning to phase: ${results.returnTo}`);
|
|
192
|
+
}
|
|
193
|
+
return lines.join('\n');
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"checks.js","sourceRoot":"","sources":["../../../src/commands/porch/checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-Agent Consultation
|
|
3
|
+
*
|
|
4
|
+
* Runs parallel 3-way consultations with external AI models (gemini, codex, claude)
|
|
5
|
+
* and collects feedback with APPROVE/REQUEST_CHANGES verdicts.
|
|
6
|
+
*/
|
|
7
|
+
import type { ConsultationConfig, ConsultationFeedback, ConsultationResult, ConsultationVerdict } from './types.js';
|
|
8
|
+
/**
|
|
9
|
+
* Parse verdict from consultation output
|
|
10
|
+
* Looks for APPROVE or REQUEST_CHANGES markers
|
|
11
|
+
*/
|
|
12
|
+
export declare function parseVerdict(output: string): ConsultationVerdict;
|
|
13
|
+
/**
|
|
14
|
+
* Extract summary from consultation output
|
|
15
|
+
* Takes the first paragraph or bullet points
|
|
16
|
+
*/
|
|
17
|
+
export declare function extractSummary(output: string, maxLength?: number): string;
|
|
18
|
+
/**
|
|
19
|
+
* Run parallel 3-way consultation
|
|
20
|
+
*/
|
|
21
|
+
export declare function runParallelConsultation(config: ConsultationConfig, context: {
|
|
22
|
+
subcommand: string;
|
|
23
|
+
identifier: string;
|
|
24
|
+
cwd?: string;
|
|
25
|
+
timeout?: number;
|
|
26
|
+
dryRun?: boolean;
|
|
27
|
+
}): Promise<ConsultationFeedback[]>;
|
|
28
|
+
/**
|
|
29
|
+
* Run consultation loop with revision support
|
|
30
|
+
*
|
|
31
|
+
* If any model returns REQUEST_CHANGES, allows revision and re-consultation
|
|
32
|
+
* up to max_rounds times.
|
|
33
|
+
*/
|
|
34
|
+
export declare function runConsultationLoop(config: ConsultationConfig, context: {
|
|
35
|
+
subcommand: string;
|
|
36
|
+
identifier: string;
|
|
37
|
+
cwd?: string;
|
|
38
|
+
timeout?: number;
|
|
39
|
+
dryRun?: boolean;
|
|
40
|
+
onRevisionNeeded?: (feedback: ConsultationFeedback[]) => Promise<boolean>;
|
|
41
|
+
}): Promise<ConsultationResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Format consultation results for display
|
|
44
|
+
*/
|
|
45
|
+
export declare function formatConsultationResults(result: ConsultationResult): string;
|
|
46
|
+
/**
|
|
47
|
+
* Check if a phase has consultation configured
|
|
48
|
+
*/
|
|
49
|
+
export declare function hasConsultation(phaseConfig: {
|
|
50
|
+
consultation?: ConsultationConfig;
|
|
51
|
+
}): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Get the default consultation config for common review types
|
|
54
|
+
*/
|
|
55
|
+
export declare function getDefaultConsultationConfig(type: string): ConsultationConfig;
|
|
56
|
+
//# sourceMappingURL=consultation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consultation.d.ts","sourceRoot":"","sources":["../../../src/commands/porch/consultation.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EACV,kBAAkB,EAClB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AA0EpB;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,mBAAmB,CAwBhE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,CAuB9E;AA4BD;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE;IACP,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,GACA,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAqFjC;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,kBAAkB,EAC1B,OAAO,EAAE;IACP,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,oBAAoB,EAAE,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAC3E,GACA,OAAO,CAAC,kBAAkB,CAAC,CAiD7B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,kBAAkB,GAAG,MAAM,CAiB5E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE;IAAE,YAAY,CAAC,EAAE,kBAAkB,CAAA;CAAE,GAAG,OAAO,CAI3F;AAED;;GAEG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAyC7E"}
|