claude-flow
Version:
Ruflo - Enterprise AI agent orchestration for Claude Code. Deploy 60+ specialized agents in coordinated swarms with self-learning, fault-tolerant consensus, vector memory, and MCP integration
92 lines (84 loc) • 4.27 kB
JavaScript
export const meta = {
name: 'plugin-contract-audit',
description: 'Run every ruflo plugin smoke contract, fan diagnosis agents out over the failures, and report a punch list',
phases: [
{ title: 'Sweep', detail: 'run all plugins/*/scripts/smoke.sh, collect pass/fail' },
{ title: 'Diagnose', detail: 'one agent per failing plugin — root cause + minimal fix' },
{ title: 'Report', detail: 'assemble the audit summary' },
],
}
// args (all optional):
// string → only audit plugins whose name contains this substring
// { filter?: string, → same substring filter
// diagnose?: boolean } → set false to skip the Diagnose phase (sweep only)
const opts = typeof args === 'string' ? { filter: args } : (args || {})
const FILTER = opts.filter || ''
const DIAGNOSE = opts.diagnose !== false
const SWEEP_SCHEMA = {
type: 'object', additionalProperties: false,
required: ['results'],
properties: {
results: {
type: 'array',
items: {
type: 'object', additionalProperties: false,
required: ['plugin', 'passed', 'failed'],
properties: {
plugin: { type: 'string' },
passed: { type: 'integer' },
failed: { type: 'integer' },
exitCode: { type: 'integer' },
failingChecks: { type: 'array', items: { type: 'string' } },
},
},
},
notes: { type: 'string' },
},
}
const DIAGNOSIS_SCHEMA = {
type: 'object', additionalProperties: false,
required: ['plugin', 'rootCause', 'proposedFix', 'confident'],
properties: {
plugin: { type: 'string' },
rootCause: { type: 'string' },
proposedFix: { type: 'string' },
files: { type: 'array', items: { type: 'string' } },
confident: { type: 'boolean' },
},
}
phase('Sweep')
const filterClause = FILTER
? `Only audit plugins whose directory name contains "${FILTER}". `
: ''
const sweep = await agent(
`From the repo root, audit every ruflo plugin's smoke contract. ${filterClause}For each script matching the glob plugins/*/scripts/smoke.sh, run it with bash and capture its output and exit code. Each smoke script prints a trailing "N passed, M failed" line.
For every plugin report: plugin (the directory name under plugins/), passed (integer), failed (integer), exitCode (integer), and failingChecks (the "→ ..." lines that printed FAIL, verbatim, empty array if none).
Do NOT modify any files — this is read/run only. Return every audited plugin via the schema, not just the failing ones.`,
{ label: 'sweep:all-smokes', phase: 'Sweep', schema: SWEEP_SCHEMA, agentType: 'tester' }
)
const results = (sweep?.results || []).filter((r) => !FILTER || r.plugin.includes(FILTER))
const failures = results.filter((r) => r.failed > 0 || (r.exitCode && r.exitCode !== 0))
log(`Sweep: ${results.length} plugins audited, ${failures.length} failing`)
let diagnoses = []
if (DIAGNOSE && failures.length) {
phase('Diagnose')
diagnoses = (await parallel(
failures.map((f) => () =>
agent(
`Plugin "${f.plugin}" fails its smoke contract (plugins/${f.plugin}/scripts/smoke.sh): ${f.failed} check(s) failed. Failing checks:\n${(f.failingChecks || []).join('\n') || '(not captured — re-run the smoke script to see them)'}\n\nRead plugins/${f.plugin}/scripts/smoke.sh and the plugin files it inspects (plugin.json, README.md, skills, agents, commands, docs/adrs). Determine the ROOT CAUSE of each failing check and propose a MINIMAL fix. Distinguish a stale assertion in smoke.sh (the contract drifted from reality) from a genuine plugin defect. Do NOT edit anything — report only, via the schema, with confident=true only if the root cause is unambiguous.`,
{ label: `diagnose:${f.plugin}`, phase: 'Diagnose', schema: DIAGNOSIS_SCHEMA, agentType: 'code-analyzer' }
)
)
)).filter(Boolean)
log(`Diagnose: ${diagnoses.length}/${failures.length} diagnosed`)
}
phase('Report')
const summary = {
audited: results.length,
passing: results.length - failures.length,
failing: failures.length,
failingPlugins: failures.map((f) => ({ plugin: f.plugin, failed: f.failed })),
diagnoses,
}
log(`Report: ${summary.passing}/${summary.audited} plugins pass their contract`)
return summary