@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,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,5 @@
1
+ /**
2
+ * Type definitions for pcheck - Protocol Check command
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -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"}