@redpanda-data/docs-extensions-and-macros
Version:
Antora extensions and macros developed for Redpanda documentation.
139 lines (124 loc) • 4.63 kB
JavaScript
/**
* MCP Tools - Redpanda Connect Documentation Generation
*
* OPTIMIZATION: This tool calls CLI, doesn't use LLM directly.
* - Caches connector metadata when possible
* - Use --data-dir to avoid re-fetching
* - Consider incremental generation for updates
* - No model recommendation (CLI tool)
*/
const { execSync, spawnSync } = require('child_process');
const { findRepoRoot, MAX_EXEC_BUFFER_SIZE, DEFAULT_COMMAND_TIMEOUT } = require('./utils');
const { getAntoraStructure } = require('./antora');
const cache = require('./cache');
const fs = require('fs');
const path = require('path');
/**
* Generate Redpanda Connect connector documentation
* @param {Object} args - Arguments
* @returns {Object} Generation results
*/
function generateRpConnectDocs(args = {}) {
const repoRoot = findRepoRoot();
const structure = getAntoraStructure(repoRoot);
if (!structure.hasDocTools) {
return {
success: false,
error: 'doc-tools not found in this repository',
suggestion: 'Navigate to the docs-extensions-and-macros repository'
};
}
try {
// Build command arguments array (no shell interpolation)
const cmdArgs = ['doc-tools', 'generate', 'rpcn-connector-docs'];
// Add flags only when present, each as separate array entries
if (args.fetch_connectors) cmdArgs.push('--fetch-connectors');
if (args.draft_missing) cmdArgs.push('--draft-missing');
if (args.update_whats_new) cmdArgs.push('--update-whats-new');
if (args.include_bloblang) cmdArgs.push('--include-bloblang');
if (args.skip_cloud_detection) cmdArgs.push('--skip-cloud-detection');
if (args.skip_binary_analysis) cmdArgs.push('--skip-binary-analysis');
if (args.skip_cloud_analysis) cmdArgs.push('--skip-cloud-analysis');
if (args.skip_cgo_analysis) cmdArgs.push('--skip-cgo-analysis');
if (args.data_dir) {
cmdArgs.push('--data-dir');
cmdArgs.push(args.data_dir);
}
if (args.old_data) {
cmdArgs.push('--old-data');
cmdArgs.push(args.old_data);
}
if (args.csv) {
cmdArgs.push('--csv');
cmdArgs.push(args.csv);
}
// Default to using overrides.json from docs-data if it exists
let overridesPath = args.overrides;
if (!overridesPath) {
// Try to find docs-data/overrides.json in current directory
const defaultOverrides = path.join(process.cwd(), 'docs-data', 'overrides.json');
if (fs.existsSync(defaultOverrides)) {
overridesPath = defaultOverrides;
}
}
if (overridesPath) {
cmdArgs.push('--overrides');
cmdArgs.push(overridesPath);
}
if (args.cloud_version) {
cmdArgs.push('--cloud-version');
cmdArgs.push(args.cloud_version);
}
if (args.cgo_version) {
cmdArgs.push('--cgo-version');
cmdArgs.push(args.cgo_version);
}
const result = spawnSync('npx', cmdArgs, {
cwd: repoRoot.root,
encoding: 'utf8',
stdio: 'pipe',
maxBuffer: MAX_EXEC_BUFFER_SIZE,
timeout: DEFAULT_COMMAND_TIMEOUT
});
// Check for spawn errors
if (result.error) {
const err = new Error(`Failed to execute command: ${result.error.message}`);
err.stdout = result.stdout || '';
err.stderr = result.stderr || '';
err.status = result.status;
throw err;
}
// Check for non-zero exit codes
if (result.status !== 0) {
const errorMsg = result.stderr || `Command failed with exit code ${result.status}`;
const err = new Error(errorMsg);
err.stdout = result.stdout || '';
err.stderr = result.stderr || '';
err.status = result.status;
throw err;
}
const output = result.stdout;
const connectorsMatch = output.match(/(\d+) connectors/i);
return {
success: true,
connectors_documented: connectorsMatch ? parseInt(connectorsMatch[1]) : null,
files_generated: ['modules/reference/pages/redpanda-connect/components/'],
output: output.trim(),
summary: 'Generated Redpanda Connect connector documentation',
// Cost optimization metadata
_optimizationNotes: 'This tool calls CLI. To reduce costs: 1) Cache connector data with --data-dir, 2) Use incremental generation when possible, 3) Avoid --fetch-connectors unless needed'
};
} catch (err) {
return {
success: false,
error: err.message,
stdout: err.stdout || '',
stderr: err.stderr || '',
exitCode: err.status,
suggestion: 'Check that you have network access to fetch connector data if using --fetch-connectors'
};
}
}
module.exports = {
generateRpConnectDocs
};