#!/usr/bin/env node const { parseArgs, } = require('../tools/erp_task_dispatcher'); const { readTaskFile, resolvePath, } = require('./run_erp_task'); const { validateTaskEnvelope } = require('../tools/erp_task_contract'); function validateTaskFile(taskPath) { const input = readTaskFile(taskPath); const validation = validateTaskEnvelope(input); const task = validation.task || {}; return { valid: validation.valid, status: validation.status, operation: task.operation || (validation.envelope && validation.envelope.operation) || null, route: task.route || (validation.envelope && validation.envelope.route) || null, taskId: task.taskId || null, violations: validation.violations || [], }; } function helpText() { return [ 'Usage:', ' node scripts/validate_erp_task.js --task task.json [--json]', '', 'Validates the structured ERP task without invoking an ERP executor.', ].join('\n'); } async function main(argv = process.argv.slice(2)) { const args = parseArgs(argv); if (args.help || !args.task) { console.log(helpText()); process.exitCode = args.help ? 0 : 1; return; } const result = validateTaskFile(resolvePath(args.task)); if (args.json) console.log(JSON.stringify(result, null, 2)); else if (result.valid) { console.log('valid: ' + result.operation + (result.route ? ' (' + result.route + ')' : '')); } else { console.log('invalid: ' + (result.violations.join('; ') || result.status)); } process.exitCode = result.valid ? 0 : 2; } if (require.main === module) { main().catch((error) => { console.error(error.stack || error.message); process.exitCode = 1; }); } module.exports = { validateTaskFile, main, };