claude-flow-novice
Version:
Claude Flow Novice - Advanced orchestration platform for multi-agent AI workflows with CFN Loop architecture Includes Local RuVector Accelerator and all CFN skills for complete functionality.
196 lines (169 loc) • 4.95 kB
text/typescript
/**
* CLI for processing Loop 2 (Validator) agent outputs
* Supports single validator processing or consensus calculation
*
* Usage (single validator):
* npx ts-node src/cli/process-loop2.ts \
* --validator-id "reviewer-1" \
* --output "Validation feedback..." \
* --iteration 1
*
* Usage (consensus from multiple):
* npx ts-node src/cli/process-loop2.ts \
* --consensus \
* --results-file ./results.json \
* --threshold 0.75
*
* Output: JSON with Loop2Result or ConsensusResult
*/
import * as fs from 'fs';
import {
parseLoop2Output,
calculateConsensus,
Loop2Result,
ConsensusResult,
formatAsJson,
parseJson,
} from '../output-processor';
interface Loop2Options {
validatorId?: string;
output?: string;
iteration?: number;
consensus?: boolean;
resultsFile?: string;
threshold?: number;
}
/**
* Parse command line arguments
*/
function parseArgs(): Loop2Options {
const args = process.argv.slice(2);
const options: Partial<Loop2Options> = {};
for (let i = 0; i < args.length; i++) {
const arg = args[i];
switch (arg) {
case '--validator-id':
options.validatorId = args[++i];
break;
case '--output':
options.output = args[++i];
break;
case '--output-file':
const filePath = args[++i];
if (fs.existsSync(filePath)) {
options.output = fs.readFileSync(filePath, 'utf-8');
} else {
throw new Error(`Output file not found: ${filePath}`);
}
break;
case '--iteration':
options.iteration = parseInt(args[++i], 10);
break;
case '--consensus':
options.consensus = true;
break;
case '--results-file':
options.resultsFile = args[++i];
break;
case '--threshold':
options.threshold = parseFloat(args[++i]);
break;
case '--help':
case '-h':
printHelp();
process.exit(0);
break;
default:
console.error(`Unknown option: ${arg}`);
process.exit(1);
}
}
return options as Loop2Options;
}
/**
* Print help message
*/
function printHelp(): void {
console.log(`
Process Loop 2 Validator Output
Usage:
npx ts-node src/cli/process-loop2.ts [OPTIONS]
Single Validator Mode:
--validator-id <id> Validator identifier (required)
--output <text> Validator output text (required)
--output-file <path> Alternative: read output from file
--iteration <n> Iteration number (default: 1)
Consensus Mode:
--consensus Calculate consensus from multiple results
--results-file <path> File containing JSON array of Loop2Result
--threshold <n> Minimum score to pass (default: 0.70)
Other:
--help, -h Show this help message
Examples:
# Process single validator
npx ts-node src/cli/process-loop2.ts \\
--validator-id "reviewer-1" \\
--output "Validation results: confidence 0.85"
# Calculate consensus
npx ts-node src/cli/process-loop2.ts \\
--consensus \\
--results-file ./validator-results.json \\
--threshold 0.75
`);
}
/**
* Process single validator output
*/
function processSingleValidator(options: Loop2Options): Loop2Result {
if (!options.validatorId || !options.output) {
throw new Error(
'Single validator mode requires --validator-id and --output'
);
}
return parseLoop2Output(
options.output,
options.validatorId,
options.iteration || 1
);
}
/**
* Process consensus from multiple validators
*/
function processConsensus(options: Loop2Options): ConsensusResult {
if (!options.resultsFile) {
throw new Error('Consensus mode requires --results-file');
}
if (!fs.existsSync(options.resultsFile)) {
throw new Error(`Results file not found: ${options.resultsFile}`);
}
const content = fs.readFileSync(options.resultsFile, 'utf-8');
const results = parseJson<Loop2Result[]>(content);
if (!Array.isArray(results)) {
throw new Error('Results file must contain JSON array of Loop2Result');
}
return calculateConsensus(results, options.threshold || 0.7);
}
/**
* Main entry point
*/
async function main(): Promise<void> {
try {
const options = parseArgs();
let result: Loop2Result | ConsensusResult;
if (options.consensus) {
result = processConsensus(options);
} else {
result = processSingleValidator(options);
}
// Output JSON
console.log(formatAsJson(result));
} catch (error) {
console.error(
'Error processing Loop 2 output:',
error instanceof Error ? error.message : String(error)
);
process.exit(1);
}
}
main();