Files
ruvnet--ruflo/scripts/inventory-capabilities.mjs
wehub-resource-sync 23f7624596
🔄 Automated Rollback Manager / 🔄 Execute Rollback (push) Blocked by required conditions
🔄 Automated Rollback Manager / ✅ Post-Rollback Verification (push) Blocked by required conditions
🔄 Automated Rollback Manager / 📊 Rollback Monitoring (push) Blocked by required conditions
🔄 Automated Rollback Manager / ⏳ Manual Rollback Approval (push) Blocked by required conditions
V3 CI/CD Pipeline / MCP protocol smoke / macos-latest (push) Waiting to run
V3 CI/CD Pipeline / Memory import smoke / macos-latest (push) Waiting to run
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / macos-latest (push) Waiting to run
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / windows-latest (push) Waiting to run
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / macos-latest (push) Waiting to run
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / windows-latest (push) Waiting to run
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / macos-latest (push) Waiting to run
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / windows-latest (push) Waiting to run
V3 CI/CD Pipeline / Witness verify (signed manifest) / macos-latest (push) Blocked by required conditions
V3 CI/CD Pipeline / Witness verify (signed manifest) / ubuntu-latest (push) Blocked by required conditions
V3 CI/CD Pipeline / Witness verify (signed manifest) / windows-latest (push) Blocked by required conditions
V3 CI/CD Pipeline / Publish to npm (alpha) (push) Blocked by required conditions
V3 CI/CD Pipeline / Smoke (no better-sqlite3) / macos-latest / Node 22 (push) Waiting to run
V3 CI/CD Pipeline / Plugin hooks smoke / macos-latest / Node 22 (push) Waiting to run
ADR-166 MCP Bridge Security Lock / Static-source security lock (push) Failing after 0s
ADR-166 MCP Bridge Security Lock / Compose default binds loopback + Mongo has auth (push) Failing after 2s
CodeQL Advanced / Analyze (rust) (push) Failing after 0s
ADR-166 MCP Bridge Security Lock / plugin-agent-federation bindHost default (push) Failing after 1s
ADR-166 MCP Bridge Security Lock / Runtime behavior — 401 + terminal gate + fail-closed (push) Failing after 4s
business-pods-smoke / smoke (push) Failing after 1s
all-plugins-smoke / smoke-all (push) Failing after 2s
CI/CD Pipeline / Security & Code Quality (push) Failing after 1s
CI/CD Pipeline / Test Suite (ubuntu-latest) (push) Failing after 1s
CI/CD Pipeline / Build & Package (macos-latest) (push) Has been skipped
CI/CD Pipeline / Build & Package (ubuntu-latest) (push) Has been skipped
CI/CD Pipeline / Build & Package (windows-latest) (push) Has been skipped
CI/CD Pipeline / Deploy & Release (push) Waiting to run
CI/CD Pipeline / CI Status (push) Waiting to run
CI/CD Pipeline / Documentation & Examples (push) Failing after 1s
Clone Tracker (14-day rolling) / Snapshot clones for ruflo ecosystem (push) Failing after 1s
CodeQL Advanced / Analyze (actions) (push) Failing after 1s
CodeQL Advanced / Analyze (javascript-typescript) (push) Failing after 1s
federation-peer-rust / stable-noop (push) Failing after 1s
metaharness-ci / score (push) Failing after 1s
metaharness-ci / router-compat (push) Failing after 0s
metaharness-ci / similarity-tests (push) Failing after 0s
no-agentbbs-smoke / smoke-without-agentbbs (push) Failing after 1s
V3 CI/CD Pipeline / Build V3 (windows-latest) (push) Has been skipped
codex-integration-audit / Codex integration audit (push) Failing after 1s
helpers-manifest-guard / guard (push) Failing after 1s
🔗 Cross-Agent Integration Tests / 🤝 Agent Coordination Tests (push) Has been skipped
🔗 Cross-Agent Integration Tests / 🧠 Memory Sharing Integration (push) Has been skipped
🔗 Cross-Agent Integration Tests / 🛡️ Fault Tolerance Tests (push) Has been skipped
🔗 Cross-Agent Integration Tests / ⚡ Performance Integration Tests (push) Has been skipped
🔗 Cross-Agent Integration Tests / 📊 Integration Test Report (push) Waiting to run
metaharness-ci / mcp-scan (push) Failing after 1s
metaharness-ci / eject-dryrun (push) Failing after 1s
metaharness-ci / metaharness-real-data (push) Failing after 0s
no-cli-optdep-bloat-2561 / guard (push) Failing after 1s
no-metaharness-smoke / smoke-without-metaharness (push) Failing after 1s
no-phantom-agentic-flow-subpath / guard (push) Failing after 1s
🔄 Automated Rollback Manager / 🚨 Failure Detection (push) Failing after 1s
V3 CI/CD Pipeline / Plugin hooks smoke / ubuntu-latest / Node 22 (push) Failing after 1s
V3 CI/CD Pipeline / ruflo-graph-intelligence build + test smoke (#2044, ADR-123) (push) Failing after 1s
CVE Audit Gate / Audit root (critical-blocking) (push) Failing after 2s
cost-tracker-smoke / smoke (push) Failing after 3s
oia-audit-weekly / audit (push) Failing after 2s
ruflo-agent-smoke / ruflo-agent structural smoke (push) Failing after 1s
📊 Status Badges Update / 📊 Update Status Badges (push) Failing after 1s
V3 CI/CD Pipeline / Static regression guards (#2267 YAML + (push) Failing after 1s
V3 CI/CD Pipeline / Test V3 Packages (push) Failing after 0s
V3 CI/CD Pipeline / agent_execute provider routing smoke (#2042) (push) Failing after 0s
CVE Audit Gate / Audit v3 (critical-blocking) (push) Failing after 1s
federation-peer-rust / stable-native (push) Failing after 2s
🔗 Cross-Agent Integration Tests / 🚀 Integration Test Setup (push) Failing after 2s
neural-trader-smoke / runtime-smoke (push) Failing after 1s
🔄 Automated Rollback Manager / 🔍 Pre-Rollback Validation (push) Waiting to run
V3 CI/CD Pipeline / Build V3 (macos-latest) (push) Has been skipped
V3 CI/CD Pipeline / Build V3 (ubuntu-latest) (push) Has been skipped
V3 CI/CD Pipeline / Type Check V3 (push) Failing after 1s
V3 CI/CD Pipeline / Smoke (no better-sqlite3) / ubuntu-latest / Node 24 (push) Failing after 1s
V3 CI/CD Pipeline / Smoke (no better-sqlite3) / ubuntu-latest / Node 22 (push) Failing after 2s
V3 CI/CD Pipeline / browser rvf create flag smoke (#2015) (push) Failing after 0s
V3 CI/CD Pipeline / Dependency review (#2046) (push) Has been skipped
V3 CI/CD Pipeline / Supply-chain audit (#2046) (push) Failing after 0s
V3 CI/CD Pipeline / witness marker drift smoke (#2021) (push) Failing after 1s
V3 CI/CD Pipeline / neural-trader portfolio CG smoke (#2068, ADR-126 Phase 3) (push) Failing after 1s
V3 CI/CD Pipeline / neural-trader backtest signing smoke (#2068, ADR-126 Phase 4) (push) Failing after 1s
V3 CI/CD Pipeline / kg-extract type-import classification smoke (#2049) (push) Failing after 0s
V3 CI/CD Pipeline / witness verify precondition smoke (#1880) (push) Failing after 2s
V3 CI/CD Pipeline / neural-trader pipeline risk-gate smoke (#2068, ADR-126 Phase 5) (push) Failing after 0s
V3 CI/CD Pipeline / neural-trader feature attribution smoke (#2068, ADR-126 Phase 6) (push) Failing after 0s
V3 CI/CD Pipeline / plugin-registry signature verification smoke (#1922, CWE-347) (push) Failing after 4s
V3 CI/CD Pipeline / memory stats legacy-DB smoke (#2120) (push) Failing after 4s
V3 CI/CD Pipeline / github deprecated actions smoke (#2089, ADR-127 Phase 3) (push) Failing after 1s
V3 CI/CD Pipeline / graph query + pathfinder smoke (ADR-130 P2+P5) (push) Has been skipped
V3 CI/CD Pipeline / graph trajectory hooks smoke (ADR-130 P3) (push) Has been skipped
V3 CI/CD Pipeline / graph plugin adapter smoke (ADR-130 P4) (push) Has been skipped
V3 CI/CD Pipeline / graph benchmark (ADR-130 P6) (push) Has been skipped
V3 CI/CD Pipeline / statusline generator delegation smoke (#2195) (push) Failing after 1s
V3 CI/CD Pipeline / wizard init regression guard (#2206 (push) Failing after 1s
V3 CI/CD Pipeline / memory no-stray-db smoke (ADR-125 P7) (push) Failing after 1s
V3 CI/CD Pipeline / github-safe injection smoke (#2089, ADR-127 Phase 1) (push) Failing after 1s
V3 CI/CD Pipeline / github actions pin smoke (#2089, ADR-127 Phase 1) (push) Failing after 1s
V3 CI/CD Pipeline / github attribution opt-in smoke (#2089, ADR-127 Phase 4) (push) Failing after 1s
V3 CI/CD Pipeline / pre-bash hook safety smoke (#2017) (push) Failing after 1s
V3 CI/CD Pipeline / Memory import smoke / ubuntu-latest (push) Failing after 0s
V3 CI/CD Pipeline / MCP protocol smoke / ubuntu-latest (push) Failing after 2s
V3 CI/CD Pipeline / ruvllm WASM auto-init smoke (#2086) (push) Failing after 4s
V3 CI/CD Pipeline / MCP paired-tool round-trip smoke (#1889) (push) Failing after 1s
V3 CI/CD Pipeline / Plugin package install-safety (#1902/#1903/#1904) (push) Failing after 1s
V3 CI/CD Pipeline / Tool description discoverability (ADR-112) (push) Failing after 3s
V3 CI/CD Pipeline / CLI npx-install smoke (#1147 / (22) (push) Failing after 1s
V3 CI/CD Pipeline / CLI npx-install smoke (#1147 / (24) (push) Failing after 1s
V3 CI/CD Pipeline / Windows hook shim smoke (#2132) / ubuntu-latest (push) Failing after 2s
V3 CI/CD Pipeline / Windows hook execution smoke (#2132) / ubuntu-latest (push) Failing after 1s
V3 CI/CD Pipeline / Windows init hooks smoke (#2132) / ubuntu-latest (push) Failing after 1s
V3 CI/CD Pipeline / Vector-index dimension audit (#1947) (push) Failing after 0s
V3 CI/CD Pipeline / Hook-command install safety (#1921) (push) Failing after 1s
V3 CI/CD Pipeline / ToolOutputGuardrail smoke (ADR-131, (push) Failing after 1s
V3 CI/CD Pipeline / init-bundle invariants smoke (#2095, ADR-128 Phase 5) (push) Failing after 1s
V3 CI/CD Pipeline / wasm provider bridge smoke (ADR-129 P1) (push) Failing after 2s
V3 CI/CD Pipeline / wasm gallery CRUD smoke (ADR-129 P3) (push) Failing after 1s
V3 CI/CD Pipeline / wasm plugin bridge smoke (ADR-129 P4) (push) Failing after 0s
V3 CI/CD Pipeline / wasm compose smoke (ADR-129 P2) (push) Failing after 4s
V3 CI/CD Pipeline / graph schema smoke (ADR-130 P1) (push) Failing after 0s
Validate Marketplace / validate (push) Failing after 1s
🔍 Verification Pipeline / 🚀 Setup Verification (push) Failing after 1s
🔍 Verification Pipeline / 🛡️ Security Verification (push) Has been skipped
🔍 Verification Pipeline / 📝 Code Quality (push) Has been skipped
🔍 Verification Pipeline / 🧪 Test Verification (${{ matrix.os }}, Node ${{ matrix.node }}) (push) Has been skipped
🔍 Verification Pipeline / 🏗️ Build Verification (push) Has been skipped
🔍 Verification Pipeline / 📚 Documentation Verification (push) Has been skipped
🔍 Verification Pipeline / ⚡ Performance Verification (push) Waiting to run
🔍 Verification Pipeline / 📊 Verification Report (push) Waiting to run
CVE Audit Gate / High-severity report (warn only) (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:02:19 +08:00

237 lines
9.4 KiB
JavaScript

#!/usr/bin/env node
/**
* Auto-extract ruflo's full capability surface — every MCP tool, CLI
* command, plugin, and agent — and render it as a markdown section
* suitable for appending to verification.md.
*
* Output is deterministic + sorted so re-running this script doesn't
* churn the file. The witness signing pass (iteration 2 of task #24)
* will consume the JSON sidecar this script writes alongside.
*
* Usage:
* node scripts/inventory-capabilities.mjs > /tmp/inventory.md
* node scripts/inventory-capabilities.mjs --json > /tmp/inventory.json
*/
import { readFileSync, readdirSync, statSync, existsSync } from 'node:fs';
import { join, basename, relative } from 'node:path';
import { fileURLToPath } from 'node:url';
const ROOT = (() => {
// Resolve project root regardless of where the script is invoked from
let dir = fileURLToPath(new URL('.', import.meta.url));
while (dir !== '/') {
if (existsSync(join(dir, 'verification.md'))) return dir;
dir = join(dir, '..');
}
throw new Error('could not find project root (looked for verification.md)');
})();
// ── MCP tools ─────────────────────────────────────────────────────────────────
const MCP_TOOLS_DIR = join(ROOT, 'v3/@claude-flow/cli/src/mcp-tools');
function extractMcpTools() {
const tools = [];
const files = readdirSync(MCP_TOOLS_DIR)
.filter(f => f.endsWith('.ts'))
.filter(f => !f.endsWith('.test.ts'))
.filter(f => !['types.ts', 'validate-input.ts', 'auto-install.ts', 'request-tracker.ts', 'agent-execute-core.ts', 'index.ts'].includes(f));
for (const file of files) {
const path = join(MCP_TOOLS_DIR, file);
const src = readFileSync(path, 'utf-8');
// Match the literal `name: 'foo_bar',` lines that the MCPTool object literals use.
const re = /name:\s*['"]([a-z_][a-z0-9_-]*)['"]\s*,/gi;
const found = new Set();
let m;
while ((m = re.exec(src)) !== null) {
found.add(m[1]);
}
// Match the description on the next line as a best-effort hint
for (const name of [...found].sort()) {
const idx = src.indexOf(`name: '${name}'`) >= 0
? src.indexOf(`name: '${name}'`)
: src.indexOf(`name: "${name}"`);
let description = '';
if (idx >= 0) {
const slice = src.slice(idx, idx + 600);
const dm = slice.match(/description:\s*['"`]([^'"`\n]+)['"`]/);
if (dm) description = dm[1].trim();
}
tools.push({
name,
description,
sourceFile: relative(ROOT, path),
});
}
}
// Dedupe across files (some tools may be re-exported); keep first occurrence
const seen = new Set();
const uniq = [];
for (const t of tools) {
if (seen.has(t.name)) continue;
seen.add(t.name);
uniq.push(t);
}
return uniq.sort((a, b) => a.name.localeCompare(b.name));
}
// ── CLI commands ──────────────────────────────────────────────────────────────
const CLI_COMMANDS_DIR = join(ROOT, 'v3/@claude-flow/cli/src/commands');
function extractCliCommands() {
const commands = [];
const files = readdirSync(CLI_COMMANDS_DIR)
.filter(f => f.endsWith('.ts'))
.filter(f => !f.endsWith('.test.ts'))
.filter(f => !['index.ts'].includes(f));
for (const file of files) {
const path = join(CLI_COMMANDS_DIR, file);
const src = readFileSync(path, 'utf-8');
// Match `export const fooCommand: Command = { name: '...', description: '...' }`
const cmdRe = /export\s+const\s+\w+Command(?::\s*Command)?\s*=\s*\{[^}]*?name:\s*['"]([\w-]+)['"][^}]*?description:\s*['"`]([^'"`\n]*)['"`]/gms;
let m;
while ((m = cmdRe.exec(src)) !== null) {
commands.push({
name: m[1],
description: m[2].trim(),
sourceFile: relative(ROOT, path),
});
}
}
return commands.sort((a, b) => a.name.localeCompare(b.name));
}
// ── Plugins ───────────────────────────────────────────────────────────────────
const PLUGINS_DIR = join(ROOT, 'plugins');
function extractPlugins() {
const plugins = [];
if (!existsSync(PLUGINS_DIR)) return plugins;
const dirs = readdirSync(PLUGINS_DIR)
.filter(d => d.startsWith('ruflo-'))
.filter(d => statSync(join(PLUGINS_DIR, d)).isDirectory());
for (const dir of dirs) {
const manifestPath = join(PLUGINS_DIR, dir, '.claude-plugin', 'plugin.json');
if (!existsSync(manifestPath)) continue;
try {
const m = JSON.parse(readFileSync(manifestPath, 'utf-8'));
plugins.push({
name: m.name || dir,
version: m.version || '0.0.0',
description: (m.description || '').trim(),
sourceFile: relative(ROOT, manifestPath),
});
} catch { /* skip malformed */ }
}
return plugins.sort((a, b) => a.name.localeCompare(b.name));
}
// ── Agents ────────────────────────────────────────────────────────────────────
function extractAgents() {
const agents = [];
// Look in plugin agent subdirs only (where the live agent definitions are)
for (const dir of readdirSync(PLUGINS_DIR)
.filter(d => statSync(join(PLUGINS_DIR, d)).isDirectory())) {
const agentDir = join(PLUGINS_DIR, dir, 'agents');
if (!existsSync(agentDir)) continue;
for (const f of readdirSync(agentDir).filter(x => x.endsWith('.md'))) {
const path = join(agentDir, f);
const src = readFileSync(path, 'utf-8');
// Frontmatter parse — name + description (CRLF-tolerant for Windows checkouts)
const fm = src.match(/^---\r?\n([\s\S]*?)\r?\n---/);
if (!fm) continue;
const yaml = fm[1];
const name = (yaml.match(/^name:\s*(.+)$/m) || [, basename(f, '.md')])[1].trim();
const description = (yaml.match(/^description:\s*(.+)$/m) || [, ''])[1].trim();
agents.push({
name,
description,
plugin: dir,
sourceFile: relative(ROOT, path),
});
}
}
return agents.sort((a, b) => a.name.localeCompare(b.name));
}
// ── Render markdown ───────────────────────────────────────────────────────────
function table(headers, rows) {
if (rows.length === 0) return '*(none found)*\n';
const lines = [
`| ${headers.join(' | ')} |`,
`|${headers.map(() => '---').join('|')}|`,
];
for (const row of rows) {
lines.push(`| ${row.map(c => String(c).replace(/\|/g, '\\|')).join(' | ')} |`);
}
return lines.join('\n') + '\n';
}
function renderMarkdown({ mcp, cli, plugins, agents }) {
const lines = [];
lines.push('## Capability inventory (auto-extracted)');
lines.push('');
lines.push(`Snapshot of every documented capability in this repository at the witnessed git commit. Regenerate with \`node scripts/inventory-capabilities.mjs\`. The output is sorted + deterministic so this section can be diff-reviewed.`);
lines.push('');
lines.push(`Coverage at this snapshot: **${mcp.length} MCP tools**, **${cli.length} CLI commands**, **${plugins.length} plugins**, **${agents.length} agent definitions**.`);
lines.push('');
lines.push(`Per-capability cryptographic witnesses (SHA-256 of the dist file containing each tool / command, signed with the existing Ed25519 manifest key) land in iteration 2 of task #24 — see \`v3/docs/adr/\` for the design ADR. Functional smoke tests (\`ruflo verify --functional\`) that round-trip each MCP tool through the in-process server are iteration 3.`);
lines.push('');
lines.push(`### MCP tools (${mcp.length})`);
lines.push('');
lines.push(table(
['Tool', 'Description', 'Source'],
mcp.map(t => [`\`${t.name}\``, t.description || '*(no description)*', `\`${t.sourceFile}\``]),
));
lines.push(`### CLI commands (${cli.length})`);
lines.push('');
lines.push(`Top-level command surface. Subcommands are documented per-command in the source file and in \`.claude-flow/CAPABILITIES.md\` after \`ruflo init\`.`);
lines.push('');
lines.push(table(
['Command', 'Description', 'Source'],
cli.map(c => [`\`ruflo ${c.name}\``, c.description || '*(no description)*', `\`${c.sourceFile}\``]),
));
lines.push(`### Plugins (${plugins.length})`);
lines.push('');
lines.push(table(
['Plugin', 'Version', 'Description'],
plugins.map(p => [`\`${p.name}\``, p.version, p.description || '*(no description)*']),
));
lines.push(`### Agents (${agents.length})`);
lines.push('');
lines.push(table(
['Agent', 'Plugin', 'Description'],
agents.map(a => [`\`${a.name}\``, a.plugin, a.description || '*(no description)*']),
));
return lines.join('\n');
}
// ── Main ──────────────────────────────────────────────────────────────────────
const inventory = {
mcp: extractMcpTools(),
cli: extractCliCommands(),
plugins: extractPlugins(),
agents: extractAgents(),
};
const flags = process.argv.slice(2);
if (flags.includes('--json')) {
process.stdout.write(JSON.stringify(inventory, null, 2) + '\n');
} else {
process.stdout.write(renderMarkdown(inventory) + '\n');
}