@kb-labs/review-entry 2.94.0 → 2.96.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/run.js +4 -9
- package/dist/commands/run.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/dist/manifest.d.ts +8 -5
- package/dist/manifest.js +6 -4
- package/dist/manifest.js.map +1 -1
- package/package.json +16 -6
package/dist/commands/run.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineCommand, useConfig, useLoader } from '@kb-labs/sdk';
|
|
1
|
+
import { defineCommand, useConfig, useLoader, validationError, handleError } from '@kb-labs/sdk';
|
|
2
2
|
import { resolveGitScope, getReposWithChanges, runReview } from '@kb-labs/review-core';
|
|
3
3
|
import * as path from 'path';
|
|
4
4
|
import { realpath } from 'fs/promises';
|
|
@@ -195,7 +195,7 @@ var run_default = defineCommand({
|
|
|
195
195
|
if (files.length === 0) {
|
|
196
196
|
loader.fail("No files to review");
|
|
197
197
|
const hint = scope === "staged" ? "No staged files found. Stage files with `git add` first, or use `--scope=changed`." : "No changed files found. Use `--scope=all` to review all files, or `--files` to specify files explicitly.";
|
|
198
|
-
ctx.
|
|
198
|
+
validationError(ctx, hint, void 0, flags.json);
|
|
199
199
|
return { exitCode: 1, result: { passed: false, issues: [], summary: hint } };
|
|
200
200
|
}
|
|
201
201
|
const result = await runReview({
|
|
@@ -318,14 +318,9 @@ var run_default = defineCommand({
|
|
|
318
318
|
} catch (error) {
|
|
319
319
|
const message = error instanceof Error ? error.message : String(error);
|
|
320
320
|
loader.fail(`Review failed: ${message}`);
|
|
321
|
-
ctx.
|
|
321
|
+
handleError(ctx, error, flags.json);
|
|
322
322
|
ctx.platform.logger?.error?.("review:run failed", error instanceof Error ? error : new Error(message));
|
|
323
|
-
|
|
324
|
-
passed: false,
|
|
325
|
-
issues: [],
|
|
326
|
-
summary: `Review error: ${message}`
|
|
327
|
-
};
|
|
328
|
-
return { exitCode: 1, result: errorReport };
|
|
323
|
+
return { exitCode: 1, result: { passed: false, issues: [], summary: `Review error: ${message}` } };
|
|
329
324
|
}
|
|
330
325
|
}
|
|
331
326
|
}
|
package/dist/commands/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/commands/run.ts"],"names":["relative"],"mappings":"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","file":"run.js","sourcesContent":["/**\n * review:run command\n * Run code review analysis\n */\n\nimport {\n defineCommand,\n useLoader,\n useConfig,\n type PluginContextV3,\n type CLIInput,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport type { ReviewMode, ReviewResult, InputFile } from '@kb-labs/review-contracts';\nimport { runReview, resolveGitScope, getReposWithChanges } from '@kb-labs/review-core';\nimport * as path from 'node:path';\nimport { realpath } from 'node:fs/promises';\n\n/**\n * Flags for review:run command\n */\ntype RunFlags = {\n mode?: ReviewMode;\n scope?: 'all' | 'changed' | 'staged';\n repos?: string[];\n task?: string;\n preset?: string;\n files?: string[];\n eslintConfig?: string;\n cwd?: string;\n json?: boolean;\n agent?: boolean;\n};\n\n/**\n * Agent-friendly review report.\n * Simplified format for automated workflows.\n */\ninterface AgentReviewReport {\n /** Can the agent proceed (commit/merge)? */\n passed: boolean;\n /** Issues that must be fixed before proceeding */\n issues: Array<{\n file: string;\n line: number;\n problem: string;\n fix: string;\n severity: 'blocker' | 'high' | 'medium' | 'low' | 'info';\n /** Rule ID (e.g., \"rule:security/no-eval\" or \"llm-lite:security\") */\n ruleId: string;\n /** Source: \"rule\" (matched project rule) or \"llm\" (ad-hoc finding) */\n source: 'rule' | 'llm';\n /** Confidence score (0.0-1.0) from verification engine */\n confidence: number;\n }>;\n /** One-line summary for logs */\n summary: string;\n}\n\n/**\n * Severity order for sorting (lower = more critical)\n */\nconst SEVERITY_ORDER: Record<string, number> = {\n blocker: 0,\n high: 1,\n medium: 2,\n low: 3,\n info: 4,\n};\n\n/**\n * Security-sensitive patterns for file filtering.\n * Shared across all file filtering operations for consistency.\n */\nconst SECURITY_IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.git/**',\n '**/.kb/analytics/**',\n '**/.kb/cache/**',\n '**/.kb/storage/**',\n '**/.kb/database/**',\n '**/.env',\n '**/.env.*',\n '**/.ssh/**',\n '**/credentials/**',\n '**/password/**',\n '**/*.pem',\n '**/*.key',\n '**/*.secret',\n] as const;\n\n/**\n * Regex patterns for additional security filtering.\n * Used as a second layer of defense after glob ignore.\n */\nconst SECURITY_REGEX_PATTERNS = [\n /node_modules/,\n /\\.git\\//,\n /\\.env$/,\n /\\.env\\./,\n /\\.ssh/,\n /\\/etc\\//,\n /\\/usr\\//,\n /\\/var\\//,\n /credentials/i,\n /password/i,\n /\\.pem$/,\n /\\.key$/,\n /\\.secret$/,\n] as const;\n\n/**\n * Validate that a file path is within the allowed directory.\n * Prevents path traversal attacks including symlink bypass.\n * Uses fs.realpath() to resolve symlinks and path.relative() for cross-platform safety.\n */\nasync function isPathWithinCwd(filePath: string, cwd: string): Promise<boolean> {\n try {\n const resolvedPath = path.resolve(cwd, filePath);\n const resolvedCwd = path.resolve(cwd);\n\n // Resolve symlinks to prevent symlink bypass attacks\n const realPath = await realpath(resolvedPath).catch(() => resolvedPath);\n const realCwd = await realpath(resolvedCwd).catch(() => resolvedCwd);\n\n const relative = path.relative(realCwd, realPath);\n // Path is within cwd if relative path exists, doesn't start with '..', and isn't absolute\n return relative !== '' && !relative.startsWith('..') && !path.isAbsolute(relative);\n } catch {\n // If path doesn't exist or can't be resolved, reject it\n return false;\n }\n}\n\n/**\n * Filter file paths for security concerns.\n */\nasync function filterSecurePaths(filePaths: string[], cwd: string): Promise<string[]> {\n const results = await Promise.all(\n filePaths.map(async filePath => {\n // Path traversal check (including symlink resolution)\n if (!await isPathWithinCwd(filePath, cwd)) {\n return null;\n }\n // Security pattern check\n if (SECURITY_REGEX_PATTERNS.some(pattern => pattern.test(filePath))) {\n return null;\n }\n return filePath;\n })\n );\n return results.filter((p): p is string => p !== null);\n}\n\n/**\n * Transform ReviewResult to agent-friendly format\n */\nfunction toAgentReport(result: ReviewResult): AgentReviewReport {\n // Blocking issues = blocker and high severity only\n // Medium/low/info are acceptable and don't block the review\n const blockingIssues = result.findings.filter(\n f => f.severity === 'blocker' || f.severity === 'high'\n );\n\n // Pass when no blocking issues (medium and below are acceptable)\n const passed = blockingIssues.length === 0;\n\n // Sort by severity: blocker > high > medium > low > info\n const sortedFindings = [...result.findings].sort((a, b) => {\n const aOrder = SEVERITY_ORDER[a.severity] ?? 5;\n const bOrder = SEVERITY_ORDER[b.severity] ?? 5;\n return aOrder - bOrder;\n });\n\n const issues = sortedFindings.map(f => ({\n file: f.file,\n line: f.line,\n problem: f.message,\n fix: f.suggestion ?? 'Review and fix manually',\n severity: f.severity as 'blocker' | 'high' | 'medium' | 'low' | 'info',\n ruleId: f.ruleId ?? 'unknown',\n source: (f.ruleId?.startsWith('rule:') ? 'rule' : 'llm') as 'rule' | 'llm',\n // Map categorical confidence to numeric score (default 0.5 for undefined/unknown)\n confidence: f.confidence === 'certain' ? 1.0\n : f.confidence === 'likely' ? 0.8\n : f.confidence === 'heuristic' ? 0.6\n : 0.5,\n }));\n\n // Count non-blocking issues for summary\n const mediumCount = result.findings.filter(f => f.severity === 'medium').length;\n const lowCount = result.findings.filter(f => f.severity === 'low').length;\n const infoCount = result.findings.filter(f => f.severity === 'info').length;\n const nonBlockingCount = mediumCount + lowCount + infoCount;\n\n const summary = passed\n ? nonBlockingCount > 0\n ? `Review passed. ${nonBlockingCount} non-blocking issue(s) found (${mediumCount} medium, ${lowCount} low, ${infoCount} info).`\n : 'Review passed. No issues found.'\n : `Review failed. ${blockingIssues.length} blocking issue(s) must be fixed.`;\n\n return { passed, issues, summary };\n}\n\nexport default defineCommand<unknown, CLIInput<RunFlags>, AgentReviewReport>({\n id: 'review:run',\n description: 'Run code review analysis',\n\n handler: {\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Main orchestration handler: coordinates input modes (repos/files/scope), git resolution, security filtering, output formats (agent/json/human), and severity-based exit codes\n async execute(ctx: PluginContextV3, input: CLIInput<RunFlags>): Promise<CommandResult<AgentReviewReport>> {\n const startTime = Date.now();\n\n // Extract flags from input\n const flags = input.flags;\n\n // Parse input\n const mode = flags.mode ?? 'heuristic';\n const scope = flags.scope ?? 'changed';\n\n // Use --cwd flag if provided, otherwise use current directory where command was run\n const cwd = flags.cwd ?? ctx.cwd ?? process.cwd();\n\n // Load config\n const fileConfig = await useConfig<{ eslintConfig?: string }>();\n\n // Show progress\n const loader = useLoader(`Running ${mode} analysis...`);\n loader.start();\n\n try {\n // Collect files based on scope\n let files: InputFile[] = [];\n let repoScope: string[] | undefined;\n\n // If --repos flag is provided, use git-scope resolver\n // Normalize repos to array (may come as string from CLI)\n const reposInput = flags.repos\n ? (Array.isArray(flags.repos) ? flags.repos : [flags.repos])\n : undefined;\n\n if (reposInput && reposInput.length > 0) {\n repoScope = reposInput;\n\n const scopedFiles = await resolveGitScope({\n cwd,\n repos: repoScope,\n includeStaged: scope === 'staged' || scope === 'changed',\n includeUnstaged: scope === 'changed',\n // Include untracked (new) files when explicitly scoping to repos\n includeUntracked: true,\n });\n\n files = scopedFiles.files;\n } else if (flags.files) {\n // Expand glob patterns first, then read files\n const filePatterns = Array.isArray(flags.files) ? flags.files : [flags.files];\n const expanded: string[] = [];\n for (const pattern of filePatterns) {\n const matches = await ctx.runtime.fs.glob(pattern, {\n cwd,\n ignore: [...SECURITY_IGNORE_PATTERNS],\n });\n expanded.push(...matches);\n }\n const safeFilePaths = await filterSecurePaths(expanded, cwd);\n\n const fileReadResults = await Promise.allSettled(\n safeFilePaths.map(async (filePath) => ({\n path: filePath,\n content: await ctx.runtime.fs.readFile(filePath, 'utf-8'),\n }))\n );\n\n files = fileReadResults\n .filter((r): r is PromiseFulfilledResult<InputFile> => r.status === 'fulfilled')\n .map(r => r.value);\n } else {\n // Resolve files based on file scope (all/changed/staged)\n let filePaths: string[] = [];\n\n switch (scope) {\n case 'all':\n filePaths = await ctx.runtime.fs.glob('**/*', { cwd, ignore: [...SECURITY_IGNORE_PATTERNS] });\n break;\n\n case 'staged':\n const reposWithChanges = await getReposWithChanges(cwd);\n if (reposWithChanges.length > 0) {\n const scopedFiles = await resolveGitScope({\n cwd,\n repos: reposWithChanges,\n includeStaged: true,\n includeUnstaged: false,\n includeUntracked: false,\n });\n files = scopedFiles.files;\n repoScope = reposWithChanges;\n }\n break;\n\n case 'changed':\n default:\n const changedRepos = await getReposWithChanges(cwd);\n if (changedRepos.length > 0) {\n const scopedFiles = await resolveGitScope({\n cwd,\n repos: changedRepos,\n includeStaged: true,\n includeUnstaged: true,\n includeUntracked: true,\n });\n files = scopedFiles.files;\n repoScope = changedRepos;\n }\n break;\n }\n\n // If we used glob fallback, read file contents\n if (files.length === 0 && filePaths.length > 0) {\n // Apply security filtering (path traversal + pattern matching)\n const safeFilePaths = await filterSecurePaths(filePaths, cwd);\n\n // Read files with individual error handling\n const fileReadResults = await Promise.allSettled(\n safeFilePaths.map(async (filePath) => ({\n path: filePath,\n content: await ctx.runtime.fs.readFile(filePath, 'utf-8'),\n }))\n );\n\n // Collect successful reads, skip failed ones\n files = fileReadResults\n .filter((r): r is PromiseFulfilledResult<InputFile> => r.status === 'fulfilled')\n .map(r => r.value);\n }\n }\n\n // No files found — give a clear, actionable message instead of a cryptic engine error\n if (files.length === 0) {\n loader.fail('No files to review');\n const hint = scope === 'staged'\n ? 'No staged files found. Stage files with `git add` first, or use `--scope=changed`.'\n : 'No changed files found. Use `--scope=all` to review all files, or `--files` to specify files explicitly.';\n ctx.ui?.error?.(hint);\n return { exitCode: 1, result: { passed: false, issues: [], summary: hint } };\n }\n\n // Run review\n const result = await runReview({\n files,\n mode,\n presetId: flags.preset ?? 'default',\n cwd,\n taskContext: flags.task,\n repoScope,\n config: {\n eslintConfig: flags.eslintConfig ?? fileConfig?.eslintConfig,\n },\n });\n\n loader.succeed(`Found ${result.findings.length} issue(s)`);\n\n // Output results\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else {\n // Build sections\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n // Summary section\n const counts = {\n blocker: result.findings.filter((f) => f.severity === 'blocker').length,\n high: result.findings.filter((f) => f.severity === 'high').length,\n medium: result.findings.filter((f) => f.severity === 'medium').length,\n low: result.findings.filter((f) => f.severity === 'low').length,\n info: result.findings.filter((f) => f.severity === 'info').length,\n };\n\n const summaryItems: string[] = [\n `Files: ${result.metadata.analyzedFiles}`,\n `Findings: ${result.findings.length}`,\n ];\n\n // Show task context if provided\n if (flags.task) {\n summaryItems.push(`Task: ${flags.task}`);\n }\n\n // Show repo scope if used\n if (repoScope && repoScope.length > 0) {\n summaryItems.push(`Repos: ${repoScope.join(', ')}`);\n }\n\n if (counts.blocker > 0) {\n summaryItems.push(`Blocker: ${counts.blocker}`);\n }\n if (counts.high > 0) {\n summaryItems.push(`High: ${counts.high}`);\n }\n if (counts.medium > 0) {\n summaryItems.push(`Medium: ${counts.medium}`);\n }\n if (counts.low > 0) {\n summaryItems.push(`Low: ${counts.low}`);\n }\n if (counts.info > 0) {\n summaryItems.push(`Info: ${counts.info}`);\n }\n\n summaryItems.push(`Engines: ${result.metadata.engines.join(', ')}`);\n\n\n\n // Show incremental stats if available (LLM modes with caching)\n const incr = result.metadata.incremental;\n if (incr) {\n if (incr.cachedFiles > 0) {\n summaryItems.push(`Cached: ${incr.cachedFiles} file(s) skipped`);\n }\n if (incr.newFindings > 0 || incr.knownFindings > 0 || incr.cachedFindings > 0) {\n const parts: string[] = [];\n if (incr.newFindings > 0) {\n parts.push(`${incr.newFindings} new`);\n }\n if (incr.knownFindings > 0) {\n parts.push(`${incr.knownFindings} known`);\n }\n if (incr.cachedFindings > 0) {\n parts.push(`${incr.cachedFindings} cached`);\n }\n summaryItems.push(`Breakdown: ${parts.join(', ')}`);\n }\n }\n\n sections.push({\n header: 'Summary',\n items: summaryItems,\n });\n\n // Findings section (top 10, sorted by severity)\n if (result.findings.length > 0) {\n // Sort by severity: blocker > high > medium > low > info\n const sortedFindings = [...result.findings].sort((a, b) => {\n const aOrder = SEVERITY_ORDER[a.severity] ?? 5;\n const bOrder = SEVERITY_ORDER[b.severity] ?? 5;\n return aOrder - bOrder;\n });\n\n const topFindings = sortedFindings.slice(0, 10);\n const findingsItems = topFindings.map((f) => {\n const loc = `${f.file}:${f.line}`;\n const severity = f.severity.toUpperCase();\n return `[${severity}] ${loc} - ${f.message}`;\n });\n\n if (result.findings.length > 10) {\n findingsItems.push(`... and ${result.findings.length - 10} more`);\n }\n\n sections.push({\n header: 'Findings',\n items: findingsItems,\n });\n }\n\n const timing = Date.now() - startTime;\n\n if (result.findings.length === 0) {\n ctx.ui?.success?.('No issues found', {\n title: 'Code Review',\n sections,\n timing,\n });\n } else {\n ctx.ui?.warn?.(`Found ${result.findings.length} issue(s)`, {\n title: 'Code Review',\n sections,\n timing,\n });\n }\n }\n\n // Exit code based on severity\n const blockerCount = result.findings.filter((f) => f.severity === 'blocker').length;\n const highCount = result.findings.filter((f) => f.severity === 'high').length;\n const agentReport = toAgentReport(result);\n\n if (blockerCount > 0) {\n return { exitCode: 1, result: agentReport };\n }\n\n if (mode === 'heuristic' && highCount > 0) {\n // In CI mode (heuristic), fail on high severity\n return { exitCode: 1, result: agentReport };\n }\n\n return { exitCode: 0, result: agentReport };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n loader.fail(`Review failed: ${message}`);\n ctx.ui?.error?.(message);\n ctx.platform.logger?.error?.('review:run failed', error instanceof Error ? error : new Error(message));\n const errorReport: AgentReviewReport = {\n passed: false,\n issues: [],\n summary: `Review error: ${message}`,\n };\n return { exitCode: 1, result: errorReport };\n }\n },\n },\n});\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/commands/run.ts"],"names":["relative"],"mappings":"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","file":"run.js","sourcesContent":["/**\n * review:run command\n * Run code review analysis\n */\n\nimport {\n defineCommand,\n useLoader,\n useConfig,\n validationError,\n handleError,\n type PluginContextV3,\n type CLIInput,\n type CommandResult,\n} from '@kb-labs/sdk';\nimport type { ReviewMode, ReviewResult, InputFile } from '@kb-labs/review-contracts';\nimport { runReview, resolveGitScope, getReposWithChanges } from '@kb-labs/review-core';\nimport * as path from 'node:path';\nimport { realpath } from 'node:fs/promises';\n\n/**\n * Flags for review:run command\n */\ntype RunFlags = {\n mode?: ReviewMode;\n scope?: 'all' | 'changed' | 'staged';\n repos?: string[];\n task?: string;\n preset?: string;\n files?: string[];\n eslintConfig?: string;\n cwd?: string;\n json?: boolean;\n agent?: boolean;\n};\n\n/**\n * Agent-friendly review report.\n * Simplified format for automated workflows.\n */\ninterface AgentReviewReport {\n /** Can the agent proceed (commit/merge)? */\n passed: boolean;\n /** Issues that must be fixed before proceeding */\n issues: Array<{\n file: string;\n line: number;\n problem: string;\n fix: string;\n severity: 'blocker' | 'high' | 'medium' | 'low' | 'info';\n /** Rule ID (e.g., \"rule:security/no-eval\" or \"llm-lite:security\") */\n ruleId: string;\n /** Source: \"rule\" (matched project rule) or \"llm\" (ad-hoc finding) */\n source: 'rule' | 'llm';\n /** Confidence score (0.0-1.0) from verification engine */\n confidence: number;\n }>;\n /** One-line summary for logs */\n summary: string;\n}\n\n/**\n * Severity order for sorting (lower = more critical)\n */\nconst SEVERITY_ORDER: Record<string, number> = {\n blocker: 0,\n high: 1,\n medium: 2,\n low: 3,\n info: 4,\n};\n\n/**\n * Security-sensitive patterns for file filtering.\n * Shared across all file filtering operations for consistency.\n */\nconst SECURITY_IGNORE_PATTERNS = [\n '**/node_modules/**',\n '**/dist/**',\n '**/build/**',\n '**/.git/**',\n '**/.kb/analytics/**',\n '**/.kb/cache/**',\n '**/.kb/storage/**',\n '**/.kb/database/**',\n '**/.env',\n '**/.env.*',\n '**/.ssh/**',\n '**/credentials/**',\n '**/password/**',\n '**/*.pem',\n '**/*.key',\n '**/*.secret',\n] as const;\n\n/**\n * Regex patterns for additional security filtering.\n * Used as a second layer of defense after glob ignore.\n */\nconst SECURITY_REGEX_PATTERNS = [\n /node_modules/,\n /\\.git\\//,\n /\\.env$/,\n /\\.env\\./,\n /\\.ssh/,\n /\\/etc\\//,\n /\\/usr\\//,\n /\\/var\\//,\n /credentials/i,\n /password/i,\n /\\.pem$/,\n /\\.key$/,\n /\\.secret$/,\n] as const;\n\n/**\n * Validate that a file path is within the allowed directory.\n * Prevents path traversal attacks including symlink bypass.\n * Uses fs.realpath() to resolve symlinks and path.relative() for cross-platform safety.\n */\nasync function isPathWithinCwd(filePath: string, cwd: string): Promise<boolean> {\n try {\n const resolvedPath = path.resolve(cwd, filePath);\n const resolvedCwd = path.resolve(cwd);\n\n // Resolve symlinks to prevent symlink bypass attacks\n const realPath = await realpath(resolvedPath).catch(() => resolvedPath);\n const realCwd = await realpath(resolvedCwd).catch(() => resolvedCwd);\n\n const relative = path.relative(realCwd, realPath);\n // Path is within cwd if relative path exists, doesn't start with '..', and isn't absolute\n return relative !== '' && !relative.startsWith('..') && !path.isAbsolute(relative);\n } catch {\n // If path doesn't exist or can't be resolved, reject it\n return false;\n }\n}\n\n/**\n * Filter file paths for security concerns.\n */\nasync function filterSecurePaths(filePaths: string[], cwd: string): Promise<string[]> {\n const results = await Promise.all(\n filePaths.map(async filePath => {\n // Path traversal check (including symlink resolution)\n if (!await isPathWithinCwd(filePath, cwd)) {\n return null;\n }\n // Security pattern check\n if (SECURITY_REGEX_PATTERNS.some(pattern => pattern.test(filePath))) {\n return null;\n }\n return filePath;\n })\n );\n return results.filter((p): p is string => p !== null);\n}\n\n/**\n * Transform ReviewResult to agent-friendly format\n */\nfunction toAgentReport(result: ReviewResult): AgentReviewReport {\n // Blocking issues = blocker and high severity only\n // Medium/low/info are acceptable and don't block the review\n const blockingIssues = result.findings.filter(\n f => f.severity === 'blocker' || f.severity === 'high'\n );\n\n // Pass when no blocking issues (medium and below are acceptable)\n const passed = blockingIssues.length === 0;\n\n // Sort by severity: blocker > high > medium > low > info\n const sortedFindings = [...result.findings].sort((a, b) => {\n const aOrder = SEVERITY_ORDER[a.severity] ?? 5;\n const bOrder = SEVERITY_ORDER[b.severity] ?? 5;\n return aOrder - bOrder;\n });\n\n const issues = sortedFindings.map(f => ({\n file: f.file,\n line: f.line,\n problem: f.message,\n fix: f.suggestion ?? 'Review and fix manually',\n severity: f.severity as 'blocker' | 'high' | 'medium' | 'low' | 'info',\n ruleId: f.ruleId ?? 'unknown',\n source: (f.ruleId?.startsWith('rule:') ? 'rule' : 'llm') as 'rule' | 'llm',\n // Map categorical confidence to numeric score (default 0.5 for undefined/unknown)\n confidence: f.confidence === 'certain' ? 1.0\n : f.confidence === 'likely' ? 0.8\n : f.confidence === 'heuristic' ? 0.6\n : 0.5,\n }));\n\n // Count non-blocking issues for summary\n const mediumCount = result.findings.filter(f => f.severity === 'medium').length;\n const lowCount = result.findings.filter(f => f.severity === 'low').length;\n const infoCount = result.findings.filter(f => f.severity === 'info').length;\n const nonBlockingCount = mediumCount + lowCount + infoCount;\n\n const summary = passed\n ? nonBlockingCount > 0\n ? `Review passed. ${nonBlockingCount} non-blocking issue(s) found (${mediumCount} medium, ${lowCount} low, ${infoCount} info).`\n : 'Review passed. No issues found.'\n : `Review failed. ${blockingIssues.length} blocking issue(s) must be fixed.`;\n\n return { passed, issues, summary };\n}\n\nexport default defineCommand<unknown, CLIInput<RunFlags>, AgentReviewReport>({\n id: 'review:run',\n description: 'Run code review analysis',\n\n handler: {\n // eslint-disable-next-line sonarjs/cognitive-complexity -- Main orchestration handler: coordinates input modes (repos/files/scope), git resolution, security filtering, output formats (agent/json/human), and severity-based exit codes\n async execute(ctx: PluginContextV3, input: CLIInput<RunFlags>): Promise<CommandResult<AgentReviewReport>> {\n const startTime = Date.now();\n\n // Extract flags from input\n const flags = input.flags;\n\n // Parse input\n const mode = flags.mode ?? 'heuristic';\n const scope = flags.scope ?? 'changed';\n\n // Use --cwd flag if provided, otherwise use current directory where command was run\n const cwd = flags.cwd ?? ctx.cwd ?? process.cwd();\n\n // Load config\n const fileConfig = await useConfig<{ eslintConfig?: string }>();\n\n // Show progress\n const loader = useLoader(`Running ${mode} analysis...`);\n loader.start();\n\n try {\n // Collect files based on scope\n let files: InputFile[] = [];\n let repoScope: string[] | undefined;\n\n // If --repos flag is provided, use git-scope resolver\n // Normalize repos to array (may come as string from CLI)\n const reposInput = flags.repos\n ? (Array.isArray(flags.repos) ? flags.repos : [flags.repos])\n : undefined;\n\n if (reposInput && reposInput.length > 0) {\n repoScope = reposInput;\n\n const scopedFiles = await resolveGitScope({\n cwd,\n repos: repoScope,\n includeStaged: scope === 'staged' || scope === 'changed',\n includeUnstaged: scope === 'changed',\n // Include untracked (new) files when explicitly scoping to repos\n includeUntracked: true,\n });\n\n files = scopedFiles.files;\n } else if (flags.files) {\n // Expand glob patterns first, then read files\n const filePatterns = Array.isArray(flags.files) ? flags.files : [flags.files];\n const expanded: string[] = [];\n for (const pattern of filePatterns) {\n const matches = await ctx.runtime.fs.glob(pattern, {\n cwd,\n ignore: [...SECURITY_IGNORE_PATTERNS],\n });\n expanded.push(...matches);\n }\n const safeFilePaths = await filterSecurePaths(expanded, cwd);\n\n const fileReadResults = await Promise.allSettled(\n safeFilePaths.map(async (filePath) => ({\n path: filePath,\n content: await ctx.runtime.fs.readFile(filePath, 'utf-8'),\n }))\n );\n\n files = fileReadResults\n .filter((r): r is PromiseFulfilledResult<InputFile> => r.status === 'fulfilled')\n .map(r => r.value);\n } else {\n // Resolve files based on file scope (all/changed/staged)\n let filePaths: string[] = [];\n\n switch (scope) {\n case 'all':\n filePaths = await ctx.runtime.fs.glob('**/*', { cwd, ignore: [...SECURITY_IGNORE_PATTERNS] });\n break;\n\n case 'staged':\n const reposWithChanges = await getReposWithChanges(cwd);\n if (reposWithChanges.length > 0) {\n const scopedFiles = await resolveGitScope({\n cwd,\n repos: reposWithChanges,\n includeStaged: true,\n includeUnstaged: false,\n includeUntracked: false,\n });\n files = scopedFiles.files;\n repoScope = reposWithChanges;\n }\n break;\n\n case 'changed':\n default:\n const changedRepos = await getReposWithChanges(cwd);\n if (changedRepos.length > 0) {\n const scopedFiles = await resolveGitScope({\n cwd,\n repos: changedRepos,\n includeStaged: true,\n includeUnstaged: true,\n includeUntracked: true,\n });\n files = scopedFiles.files;\n repoScope = changedRepos;\n }\n break;\n }\n\n // If we used glob fallback, read file contents\n if (files.length === 0 && filePaths.length > 0) {\n // Apply security filtering (path traversal + pattern matching)\n const safeFilePaths = await filterSecurePaths(filePaths, cwd);\n\n // Read files with individual error handling\n const fileReadResults = await Promise.allSettled(\n safeFilePaths.map(async (filePath) => ({\n path: filePath,\n content: await ctx.runtime.fs.readFile(filePath, 'utf-8'),\n }))\n );\n\n // Collect successful reads, skip failed ones\n files = fileReadResults\n .filter((r): r is PromiseFulfilledResult<InputFile> => r.status === 'fulfilled')\n .map(r => r.value);\n }\n }\n\n // No files found — give a clear, actionable message instead of a cryptic engine error\n if (files.length === 0) {\n loader.fail('No files to review');\n const hint = scope === 'staged'\n ? 'No staged files found. Stage files with `git add` first, or use `--scope=changed`.'\n : 'No changed files found. Use `--scope=all` to review all files, or `--files` to specify files explicitly.';\n validationError(ctx, hint, undefined, flags.json);\n return { exitCode: 1, result: { passed: false, issues: [], summary: hint } };\n }\n\n // Run review\n const result = await runReview({\n files,\n mode,\n presetId: flags.preset ?? 'default',\n cwd,\n taskContext: flags.task,\n repoScope,\n config: {\n eslintConfig: flags.eslintConfig ?? fileConfig?.eslintConfig,\n },\n });\n\n loader.succeed(`Found ${result.findings.length} issue(s)`);\n\n // Output results\n if (flags.json) {\n ctx.ui?.json?.(result);\n } else {\n // Build sections\n const sections: Array<{ header?: string; items: string[] }> = [];\n\n // Summary section\n const counts = {\n blocker: result.findings.filter((f) => f.severity === 'blocker').length,\n high: result.findings.filter((f) => f.severity === 'high').length,\n medium: result.findings.filter((f) => f.severity === 'medium').length,\n low: result.findings.filter((f) => f.severity === 'low').length,\n info: result.findings.filter((f) => f.severity === 'info').length,\n };\n\n const summaryItems: string[] = [\n `Files: ${result.metadata.analyzedFiles}`,\n `Findings: ${result.findings.length}`,\n ];\n\n // Show task context if provided\n if (flags.task) {\n summaryItems.push(`Task: ${flags.task}`);\n }\n\n // Show repo scope if used\n if (repoScope && repoScope.length > 0) {\n summaryItems.push(`Repos: ${repoScope.join(', ')}`);\n }\n\n if (counts.blocker > 0) {\n summaryItems.push(`Blocker: ${counts.blocker}`);\n }\n if (counts.high > 0) {\n summaryItems.push(`High: ${counts.high}`);\n }\n if (counts.medium > 0) {\n summaryItems.push(`Medium: ${counts.medium}`);\n }\n if (counts.low > 0) {\n summaryItems.push(`Low: ${counts.low}`);\n }\n if (counts.info > 0) {\n summaryItems.push(`Info: ${counts.info}`);\n }\n\n summaryItems.push(`Engines: ${result.metadata.engines.join(', ')}`);\n\n\n\n // Show incremental stats if available (LLM modes with caching)\n const incr = result.metadata.incremental;\n if (incr) {\n if (incr.cachedFiles > 0) {\n summaryItems.push(`Cached: ${incr.cachedFiles} file(s) skipped`);\n }\n if (incr.newFindings > 0 || incr.knownFindings > 0 || incr.cachedFindings > 0) {\n const parts: string[] = [];\n if (incr.newFindings > 0) {\n parts.push(`${incr.newFindings} new`);\n }\n if (incr.knownFindings > 0) {\n parts.push(`${incr.knownFindings} known`);\n }\n if (incr.cachedFindings > 0) {\n parts.push(`${incr.cachedFindings} cached`);\n }\n summaryItems.push(`Breakdown: ${parts.join(', ')}`);\n }\n }\n\n sections.push({\n header: 'Summary',\n items: summaryItems,\n });\n\n // Findings section (top 10, sorted by severity)\n if (result.findings.length > 0) {\n // Sort by severity: blocker > high > medium > low > info\n const sortedFindings = [...result.findings].sort((a, b) => {\n const aOrder = SEVERITY_ORDER[a.severity] ?? 5;\n const bOrder = SEVERITY_ORDER[b.severity] ?? 5;\n return aOrder - bOrder;\n });\n\n const topFindings = sortedFindings.slice(0, 10);\n const findingsItems = topFindings.map((f) => {\n const loc = `${f.file}:${f.line}`;\n const severity = f.severity.toUpperCase();\n return `[${severity}] ${loc} - ${f.message}`;\n });\n\n if (result.findings.length > 10) {\n findingsItems.push(`... and ${result.findings.length - 10} more`);\n }\n\n sections.push({\n header: 'Findings',\n items: findingsItems,\n });\n }\n\n const timing = Date.now() - startTime;\n\n if (result.findings.length === 0) {\n ctx.ui?.success?.('No issues found', {\n title: 'Code Review',\n sections,\n timing,\n });\n } else {\n ctx.ui?.warn?.(`Found ${result.findings.length} issue(s)`, {\n title: 'Code Review',\n sections,\n timing,\n });\n }\n }\n\n // Exit code based on severity\n const blockerCount = result.findings.filter((f) => f.severity === 'blocker').length;\n const highCount = result.findings.filter((f) => f.severity === 'high').length;\n const agentReport = toAgentReport(result);\n\n if (blockerCount > 0) {\n return { exitCode: 1, result: agentReport };\n }\n\n if (mode === 'heuristic' && highCount > 0) {\n // In CI mode (heuristic), fail on high severity\n return { exitCode: 1, result: agentReport };\n }\n\n return { exitCode: 0, result: agentReport };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n loader.fail(`Review failed: ${message}`);\n handleError(ctx, error, flags.json);\n ctx.platform.logger?.error?.('review:run failed', error instanceof Error ? error : new Error(message));\n return { exitCode: 1, result: { passed: false, issues: [], summary: `Review error: ${message}` } };\n }\n },\n },\n});\n"]}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -64,7 +64,7 @@ var manifest = {
|
|
|
64
64
|
version: "0.1.0",
|
|
65
65
|
display: {
|
|
66
66
|
name: "AI Review",
|
|
67
|
-
description: "AI
|
|
67
|
+
description: "AI code review with heuristic engines and LLM",
|
|
68
68
|
tags: ["code-review", "linting", "ai", "quality"]
|
|
69
69
|
},
|
|
70
70
|
// Configuration section in kb.config.json
|
|
@@ -76,14 +76,16 @@ var manifest = {
|
|
|
76
76
|
},
|
|
77
77
|
// CLI commands
|
|
78
78
|
cli: {
|
|
79
|
+
groupMeta: [
|
|
80
|
+
{ path: "review", describe: "AI code review" }
|
|
81
|
+
],
|
|
79
82
|
commands: [
|
|
80
83
|
{
|
|
81
|
-
|
|
82
|
-
group: "review",
|
|
84
|
+
path: "review run",
|
|
83
85
|
describe: "Run code review analysis",
|
|
86
|
+
operationType: "execute",
|
|
84
87
|
longDescription: "Analyzes code using heuristic engines (ESLint, Ruff, etc.) and optionally LLM analyzers. Supports three modes: heuristic (CI, fast), full (local, comprehensive), llm (deep analysis).",
|
|
85
88
|
handler: "./commands/run.js#default",
|
|
86
|
-
handlerPath: "./commands/run.js",
|
|
87
89
|
flags: defineCommandFlags(runFlags.schema),
|
|
88
90
|
examples: [
|
|
89
91
|
"kb review run",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/flags.ts","../src/manifest.ts","../src/formatters/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Command flags definitions for AI Review plugin\n */\n\nimport { defineFlags } from '@kb-labs/sdk';\n\n/**\n * Flags for review:run command\n */\nexport const runFlags = defineFlags({\n mode: {\n type: 'string',\n description: 'Review mode: heuristic (CI), full (local), llm (deep)',\n choices: ['heuristic', 'full', 'llm'],\n default: 'heuristic',\n },\n scope: {\n type: 'string',\n description: 'File scope: all, changed (vs main), staged',\n choices: ['all', 'changed', 'staged'],\n default: 'changed',\n },\n repos: {\n type: 'array',\n description: 'Repository scope (submodule names to include, e.g., --repos kb-labs-core kb-labs-cli)',\n },\n task: {\n type: 'string',\n description: 'Task context - describe what the changes are trying to achieve',\n },\n preset: {\n type: 'string',\n description: 'Preset ID (e.g., typescript-strict)',\n },\n files: {\n type: 'array',\n description: 'File patterns to analyze',\n },\n eslintConfig: {\n type: 'string',\n description: 'ESLint config file path',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\n","/**\n * KB Labs AI Review Plugin - Manifest V3\n */\n\nimport {\n defineCommandFlags,\n combinePermissions,\n gitWorkflowPreset,\n kbPlatformPreset,\n} from '@kb-labs/sdk';\nimport { runFlags } from './commands/flags.js';\n\n/**\n * Build permissions:\n * - gitWorkflow: HOME, USER, GIT_* for git operations\n * - kbPlatform: KB_* env vars and .kb/ directory\n * - Custom: file read access, LLM, cache, analytics\n */\nconst pluginPermissions = combinePermissions()\n .with(gitWorkflowPreset)\n .with(kbPlatformPreset)\n .withFs({\n mode: 'read',\n allow: ['**/*'],\n })\n .withPlatform({\n llm: true, // LLM for full/llm modes\n cache: ['review:'], // Cache namespace prefix\n analytics: true, // Track review events\n })\n .withQuotas({\n timeoutMs: 600000, // 10 min for deep analysis\n memoryMb: 512,\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/review',\n version: '0.1.0',\n\n display: {\n name: 'AI Review',\n description: 'AI-powered code review with heuristic engines (ESLint, Ruff, etc.) and LLM analyzers.',\n tags: ['code-review', 'linting', 'ai', 'quality'],\n },\n\n // Configuration section in kb.config.json\n configSection: 'review',\n\n // Platform requirements\n platform: {\n requires: ['storage', 'cache'],\n optional: ['llm', 'analytics', 'logger'],\n },\n\n // CLI commands\n cli: {\n commands: [\n {\n id: 'run',\n group: 'review',\n describe: 'Run code review analysis',\n longDescription:\n 'Analyzes code using heuristic engines (ESLint, Ruff, etc.) and optionally LLM analyzers. ' +\n 'Supports three modes: heuristic (CI, fast), full (local, comprehensive), llm (deep analysis).',\n\n handler: './commands/run.js#default',\n handlerPath: './commands/run.js',\n\n flags: defineCommandFlags(runFlags.schema),\n\n examples: [\n 'kb review run',\n 'kb review run --mode=full',\n 'kb review run --scope=staged',\n 'kb review run --preset=typescript-strict',\n 'kb review run --files=\"src/**/*.ts\"',\n 'kb review run --json',\n ],\n },\n ],\n },\n\n // Permissions\n permissions: pluginPermissions,\n};\n\nexport default manifest;\n","/**\n * @module @kb-labs/review-cli/formatters\n * Output formatters for code review results.\n */\n\nimport type { ReviewFinding, ReviewResult } from '@kb-labs/review-contracts';\nimport chalk from 'chalk';\n\n/**\n * Format findings as text.\n */\nexport function formatFindings(findings: ReviewFinding[]): string {\n if (findings.length === 0) {\n return chalk.green('✓ No issues found!');\n }\n\n const lines: string[] = [];\n\n // Group by severity\n const byFile = new Map<string, ReviewFinding[]>();\n\n for (const finding of findings) {\n if (!byFile.has(finding.file)) {\n byFile.set(finding.file, []);\n }\n byFile.get(finding.file)!.push(finding);\n }\n\n // Format by file\n for (const [file, fileFindings] of byFile) {\n lines.push('');\n lines.push(chalk.bold.white(file));\n\n for (const finding of fileFindings) {\n const severity = formatSeverity(finding.severity);\n const location = chalk.dim(`${finding.line}:${finding.column ?? 0}`);\n const message = finding.message;\n const sourceTag = formatSource(finding.source, finding.ruleId);\n\n lines.push(` ${location} ${severity} ${message} ${sourceTag}`);\n\n // Show fix hint if available\n if (finding.fix && finding.automated) {\n lines.push(chalk.dim(' ⚡ Auto-fixable'));\n }\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format source tag (rule vs llm).\n * Shows whether finding came from a project rule or LLM ad-hoc analysis.\n */\nfunction formatSource(source: string, ruleId: string): string {\n // Parse ruleId format: \"rule:category/name\" or \"llm-lite:category\"\n if (ruleId.startsWith('rule:')) {\n // Project rule - show rule ID with green highlight\n const projectRuleId = ruleId.slice(5); // Remove \"rule:\" prefix\n return chalk.green(`[rule:${projectRuleId}]`);\n } else if (ruleId.startsWith('llm-lite:')) {\n // LLM ad-hoc finding - show category with dim styling\n const category = ruleId.slice(9); // Remove \"llm-lite:\" prefix\n return chalk.dim(`[llm:${category}]`);\n } else {\n // Legacy format - just show the ruleId\n return chalk.dim(`[${ruleId}]`);\n }\n}\n\n/**\n * Format severity with color.\n */\nfunction formatSeverity(severity: string): string {\n switch (severity) {\n case 'blocker':\n return chalk.bgRed.white(' BLOCKER ');\n case 'high':\n return chalk.red('error');\n case 'medium':\n return chalk.yellow('warning');\n case 'low':\n return chalk.blue('info');\n case 'info':\n return chalk.gray('hint');\n default:\n return severity;\n }\n}\n\n/**\n * Format summary statistics.\n */\nexport function formatSummary(result: ReviewResult): string {\n const lines: string[] = [];\n\n lines.push('');\n lines.push(chalk.bold('Summary'));\n lines.push('─'.repeat(50));\n\n // Count by severity\n const counts = {\n blocker: 0,\n high: 0,\n medium: 0,\n low: 0,\n info: 0,\n };\n\n // Count by source (rule vs llm)\n const sourceCounts = {\n rule: 0,\n llm: 0,\n };\n\n for (const finding of result.findings) {\n counts[finding.severity]++;\n\n // Count by source based on ruleId format\n if (finding.ruleId.startsWith('rule:')) {\n sourceCounts.rule++;\n } else {\n sourceCounts.llm++;\n }\n }\n\n // Format counts\n if (counts.blocker > 0) {\n lines.push(chalk.red(` Blocker: ${counts.blocker}`));\n }\n if (counts.high > 0) {\n lines.push(chalk.red(` High: ${counts.high}`));\n }\n if (counts.medium > 0) {\n lines.push(chalk.yellow(` Medium: ${counts.medium}`));\n }\n if (counts.low > 0) {\n lines.push(chalk.blue(` Low: ${counts.low}`));\n }\n if (counts.info > 0) {\n lines.push(chalk.gray(` Info: ${counts.info}`));\n }\n\n lines.push('');\n lines.push(` Total: ${result.findings.length}`);\n lines.push(` Files: ${result.metadata.analyzedFiles}`);\n lines.push(` Time: ${result.metadata.durationMs}ms`);\n lines.push(` Engines: ${result.metadata.engines.join(', ')}`);\n\n // Show source breakdown if there are findings\n if (result.findings.length > 0) {\n lines.push('');\n lines.push(chalk.bold(' Finding Sources:'));\n if (sourceCounts.rule > 0) {\n lines.push(chalk.green(` From rules: ${sourceCounts.rule}`));\n }\n if (sourceCounts.llm > 0) {\n lines.push(chalk.dim(` LLM ad-hoc: ${sourceCounts.llm}`));\n }\n }\n\n return lines.join('\\n');\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/flags.ts","../src/manifest.ts","../src/formatters/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Command flags definitions for AI Review plugin\n */\n\nimport { defineFlags } from '@kb-labs/sdk';\n\n/**\n * Flags for review:run command\n */\nexport const runFlags = defineFlags({\n mode: {\n type: 'string',\n description: 'Review mode: heuristic (CI), full (local), llm (deep)',\n choices: ['heuristic', 'full', 'llm'],\n default: 'heuristic',\n },\n scope: {\n type: 'string',\n description: 'File scope: all, changed (vs main), staged',\n choices: ['all', 'changed', 'staged'],\n default: 'changed',\n },\n repos: {\n type: 'array',\n description: 'Repository scope (submodule names to include, e.g., --repos kb-labs-core kb-labs-cli)',\n },\n task: {\n type: 'string',\n description: 'Task context - describe what the changes are trying to achieve',\n },\n preset: {\n type: 'string',\n description: 'Preset ID (e.g., typescript-strict)',\n },\n files: {\n type: 'array',\n description: 'File patterns to analyze',\n },\n eslintConfig: {\n type: 'string',\n description: 'ESLint config file path',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\n","/**\n * KB Labs AI Review Plugin - Manifest V3\n */\n\nimport {\n defineCommandFlags,\n combinePermissions,\n gitWorkflowPreset,\n kbPlatformPreset,\n} from '@kb-labs/sdk';\nimport { runFlags } from './commands/flags.js';\n\n/**\n * Build permissions:\n * - gitWorkflow: HOME, USER, GIT_* for git operations\n * - kbPlatform: KB_* env vars and .kb/ directory\n * - Custom: file read access, LLM, cache, analytics\n */\nconst pluginPermissions = combinePermissions()\n .with(gitWorkflowPreset)\n .with(kbPlatformPreset)\n .withFs({\n mode: 'read',\n allow: ['**/*'],\n })\n .withPlatform({\n llm: true, // LLM for full/llm modes\n cache: ['review:'], // Cache namespace prefix\n analytics: true, // Track review events\n })\n .withQuotas({\n timeoutMs: 600000, // 10 min for deep analysis\n memoryMb: 512,\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/review',\n version: '0.1.0',\n\n display: {\n name: 'AI Review',\n description: 'AI code review with heuristic engines and LLM',\n tags: ['code-review', 'linting', 'ai', 'quality'],\n },\n\n // Configuration section in kb.config.json\n configSection: 'review',\n\n // Platform requirements\n platform: {\n requires: ['storage', 'cache'],\n optional: ['llm', 'analytics', 'logger'],\n },\n\n // CLI commands\n cli: {\n groupMeta: [\n { path: 'review', describe: 'AI code review' },\n ],\n commands: [\n {\n path: 'review run',\n describe: 'Run code review analysis',\n operationType: 'execute' as const,\n longDescription:\n 'Analyzes code using heuristic engines (ESLint, Ruff, etc.) and optionally LLM analyzers. ' +\n 'Supports three modes: heuristic (CI, fast), full (local, comprehensive), llm (deep analysis).',\n\n handler: './commands/run.js#default',\n\n flags: defineCommandFlags(runFlags.schema),\n\n examples: [\n 'kb review run',\n 'kb review run --mode=full',\n 'kb review run --scope=staged',\n 'kb review run --preset=typescript-strict',\n 'kb review run --files=\"src/**/*.ts\"',\n 'kb review run --json',\n ],\n },\n ],\n },\n\n // Permissions\n permissions: pluginPermissions,\n};\n\nexport default manifest;\n","/**\n * @module @kb-labs/review-cli/formatters\n * Output formatters for code review results.\n */\n\nimport type { ReviewFinding, ReviewResult } from '@kb-labs/review-contracts';\nimport chalk from 'chalk';\n\n/**\n * Format findings as text.\n */\nexport function formatFindings(findings: ReviewFinding[]): string {\n if (findings.length === 0) {\n return chalk.green('✓ No issues found!');\n }\n\n const lines: string[] = [];\n\n // Group by severity\n const byFile = new Map<string, ReviewFinding[]>();\n\n for (const finding of findings) {\n if (!byFile.has(finding.file)) {\n byFile.set(finding.file, []);\n }\n byFile.get(finding.file)!.push(finding);\n }\n\n // Format by file\n for (const [file, fileFindings] of byFile) {\n lines.push('');\n lines.push(chalk.bold.white(file));\n\n for (const finding of fileFindings) {\n const severity = formatSeverity(finding.severity);\n const location = chalk.dim(`${finding.line}:${finding.column ?? 0}`);\n const message = finding.message;\n const sourceTag = formatSource(finding.source, finding.ruleId);\n\n lines.push(` ${location} ${severity} ${message} ${sourceTag}`);\n\n // Show fix hint if available\n if (finding.fix && finding.automated) {\n lines.push(chalk.dim(' ⚡ Auto-fixable'));\n }\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Format source tag (rule vs llm).\n * Shows whether finding came from a project rule or LLM ad-hoc analysis.\n */\nfunction formatSource(source: string, ruleId: string): string {\n // Parse ruleId format: \"rule:category/name\" or \"llm-lite:category\"\n if (ruleId.startsWith('rule:')) {\n // Project rule - show rule ID with green highlight\n const projectRuleId = ruleId.slice(5); // Remove \"rule:\" prefix\n return chalk.green(`[rule:${projectRuleId}]`);\n } else if (ruleId.startsWith('llm-lite:')) {\n // LLM ad-hoc finding - show category with dim styling\n const category = ruleId.slice(9); // Remove \"llm-lite:\" prefix\n return chalk.dim(`[llm:${category}]`);\n } else {\n // Legacy format - just show the ruleId\n return chalk.dim(`[${ruleId}]`);\n }\n}\n\n/**\n * Format severity with color.\n */\nfunction formatSeverity(severity: string): string {\n switch (severity) {\n case 'blocker':\n return chalk.bgRed.white(' BLOCKER ');\n case 'high':\n return chalk.red('error');\n case 'medium':\n return chalk.yellow('warning');\n case 'low':\n return chalk.blue('info');\n case 'info':\n return chalk.gray('hint');\n default:\n return severity;\n }\n}\n\n/**\n * Format summary statistics.\n */\nexport function formatSummary(result: ReviewResult): string {\n const lines: string[] = [];\n\n lines.push('');\n lines.push(chalk.bold('Summary'));\n lines.push('─'.repeat(50));\n\n // Count by severity\n const counts = {\n blocker: 0,\n high: 0,\n medium: 0,\n low: 0,\n info: 0,\n };\n\n // Count by source (rule vs llm)\n const sourceCounts = {\n rule: 0,\n llm: 0,\n };\n\n for (const finding of result.findings) {\n counts[finding.severity]++;\n\n // Count by source based on ruleId format\n if (finding.ruleId.startsWith('rule:')) {\n sourceCounts.rule++;\n } else {\n sourceCounts.llm++;\n }\n }\n\n // Format counts\n if (counts.blocker > 0) {\n lines.push(chalk.red(` Blocker: ${counts.blocker}`));\n }\n if (counts.high > 0) {\n lines.push(chalk.red(` High: ${counts.high}`));\n }\n if (counts.medium > 0) {\n lines.push(chalk.yellow(` Medium: ${counts.medium}`));\n }\n if (counts.low > 0) {\n lines.push(chalk.blue(` Low: ${counts.low}`));\n }\n if (counts.info > 0) {\n lines.push(chalk.gray(` Info: ${counts.info}`));\n }\n\n lines.push('');\n lines.push(` Total: ${result.findings.length}`);\n lines.push(` Files: ${result.metadata.analyzedFiles}`);\n lines.push(` Time: ${result.metadata.durationMs}ms`);\n lines.push(` Engines: ${result.metadata.engines.join(', ')}`);\n\n // Show source breakdown if there are findings\n if (result.findings.length > 0) {\n lines.push('');\n lines.push(chalk.bold(' Finding Sources:'));\n if (sourceCounts.rule > 0) {\n lines.push(chalk.green(` From rules: ${sourceCounts.rule}`));\n }\n if (sourceCounts.llm > 0) {\n lines.push(chalk.dim(` LLM ad-hoc: ${sourceCounts.llm}`));\n }\n }\n\n return lines.join('\\n');\n}\n"]}
|
package/dist/manifest.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as _kb_labs_plugin_contracts from '@kb-labs/plugin-contracts';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* KB Labs AI Review Plugin - Manifest V3
|
|
@@ -18,13 +18,16 @@ declare const manifest: {
|
|
|
18
18
|
optional: string[];
|
|
19
19
|
};
|
|
20
20
|
cli: {
|
|
21
|
+
groupMeta: {
|
|
22
|
+
path: string;
|
|
23
|
+
describe: string;
|
|
24
|
+
}[];
|
|
21
25
|
commands: {
|
|
22
|
-
|
|
23
|
-
group: string;
|
|
26
|
+
path: string;
|
|
24
27
|
describe: string;
|
|
28
|
+
operationType: "execute";
|
|
25
29
|
longDescription: string;
|
|
26
30
|
handler: string;
|
|
27
|
-
handlerPath: string;
|
|
28
31
|
flags: {
|
|
29
32
|
name: string;
|
|
30
33
|
type: "string" | "boolean" | "number" | "array";
|
|
@@ -37,7 +40,7 @@ declare const manifest: {
|
|
|
37
40
|
examples: string[];
|
|
38
41
|
}[];
|
|
39
42
|
};
|
|
40
|
-
permissions:
|
|
43
|
+
permissions: _kb_labs_plugin_contracts.PermissionSpec;
|
|
41
44
|
};
|
|
42
45
|
|
|
43
46
|
export { manifest as default, manifest };
|
package/dist/manifest.js
CHANGED
|
@@ -63,7 +63,7 @@ var manifest = {
|
|
|
63
63
|
version: "0.1.0",
|
|
64
64
|
display: {
|
|
65
65
|
name: "AI Review",
|
|
66
|
-
description: "AI
|
|
66
|
+
description: "AI code review with heuristic engines and LLM",
|
|
67
67
|
tags: ["code-review", "linting", "ai", "quality"]
|
|
68
68
|
},
|
|
69
69
|
// Configuration section in kb.config.json
|
|
@@ -75,14 +75,16 @@ var manifest = {
|
|
|
75
75
|
},
|
|
76
76
|
// CLI commands
|
|
77
77
|
cli: {
|
|
78
|
+
groupMeta: [
|
|
79
|
+
{ path: "review", describe: "AI code review" }
|
|
80
|
+
],
|
|
78
81
|
commands: [
|
|
79
82
|
{
|
|
80
|
-
|
|
81
|
-
group: "review",
|
|
83
|
+
path: "review run",
|
|
82
84
|
describe: "Run code review analysis",
|
|
85
|
+
operationType: "execute",
|
|
83
86
|
longDescription: "Analyzes code using heuristic engines (ESLint, Ruff, etc.) and optionally LLM analyzers. Supports three modes: heuristic (CI, fast), full (local, comprehensive), llm (deep analysis).",
|
|
84
87
|
handler: "./commands/run.js#default",
|
|
85
|
-
handlerPath: "./commands/run.js",
|
|
86
88
|
flags: defineCommandFlags(runFlags.schema),
|
|
87
89
|
examples: [
|
|
88
90
|
"kb review run",
|
package/dist/manifest.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/flags.ts","../src/manifest.ts"],"names":[],"mappings":";;;AASO,IAAM,WAAW,WAAA,CAAY;AAAA,EAClC,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,uDAAA;AAAA,IACb,OAAA,EAAS,CAAC,WAAA,EAAa,MAAA,EAAQ,KAAK,CAAA;AAAA,IACpC,OAAA,EAAS;AAAA,GACX;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa,4CAAA;AAAA,IACb,OAAA,EAAS,CAAC,KAAA,EAAO,SAAA,EAAW,QAAQ,CAAA;AAAA,IACpC,OAAA,EAAS;AAAA,GACX;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,OAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,QAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,OAAA,EAAS;AAAA;AAEb,CAAC,CAAA;;;AC7BD,IAAM,iBAAA,GAAoB,oBAAmB,CAC1C,IAAA,CAAK,iBAAiB,CAAA,CACtB,IAAA,CAAK,gBAAgB,CAAA,CACrB,MAAA,CAAO;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,CAAC,MAAM;AAChB,CAAC,EACA,YAAA,CAAa;AAAA,EACZ,GAAA,EAAK,IAAA;AAAA;AAAA,EACL,KAAA,EAAO,CAAC,SAAS,CAAA;AAAA;AAAA,EACjB,SAAA,EAAW;AAAA;AACb,CAAC,EACA,UAAA,CAAW;AAAA,EACV,SAAA,EAAW,GAAA;AAAA;AAAA,EACX,QAAA,EAAU;AACZ,CAAC,EACA,KAAA,EAAM;AAEF,IAAM,QAAA,GAAW;AAAA,EACtB,MAAA,EAAQ,aAAA;AAAA,EACR,EAAA,EAAI,iBAAA;AAAA,EACJ,OAAA,EAAS,OAAA;AAAA,EAET,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa
|
|
1
|
+
{"version":3,"sources":["../src/commands/flags.ts","../src/manifest.ts"],"names":[],"mappings":"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","file":"manifest.js","sourcesContent":["/**\n * Command flags definitions for AI Review plugin\n */\n\nimport { defineFlags } from '@kb-labs/sdk';\n\n/**\n * Flags for review:run command\n */\nexport const runFlags = defineFlags({\n mode: {\n type: 'string',\n description: 'Review mode: heuristic (CI), full (local), llm (deep)',\n choices: ['heuristic', 'full', 'llm'],\n default: 'heuristic',\n },\n scope: {\n type: 'string',\n description: 'File scope: all, changed (vs main), staged',\n choices: ['all', 'changed', 'staged'],\n default: 'changed',\n },\n repos: {\n type: 'array',\n description: 'Repository scope (submodule names to include, e.g., --repos kb-labs-core kb-labs-cli)',\n },\n task: {\n type: 'string',\n description: 'Task context - describe what the changes are trying to achieve',\n },\n preset: {\n type: 'string',\n description: 'Preset ID (e.g., typescript-strict)',\n },\n files: {\n type: 'array',\n description: 'File patterns to analyze',\n },\n eslintConfig: {\n type: 'string',\n description: 'ESLint config file path',\n },\n json: {\n type: 'boolean',\n description: 'Output JSON',\n default: false,\n },\n});\n","/**\n * KB Labs AI Review Plugin - Manifest V3\n */\n\nimport {\n defineCommandFlags,\n combinePermissions,\n gitWorkflowPreset,\n kbPlatformPreset,\n} from '@kb-labs/sdk';\nimport { runFlags } from './commands/flags.js';\n\n/**\n * Build permissions:\n * - gitWorkflow: HOME, USER, GIT_* for git operations\n * - kbPlatform: KB_* env vars and .kb/ directory\n * - Custom: file read access, LLM, cache, analytics\n */\nconst pluginPermissions = combinePermissions()\n .with(gitWorkflowPreset)\n .with(kbPlatformPreset)\n .withFs({\n mode: 'read',\n allow: ['**/*'],\n })\n .withPlatform({\n llm: true, // LLM for full/llm modes\n cache: ['review:'], // Cache namespace prefix\n analytics: true, // Track review events\n })\n .withQuotas({\n timeoutMs: 600000, // 10 min for deep analysis\n memoryMb: 512,\n })\n .build();\n\nexport const manifest = {\n schema: 'kb.plugin/3',\n id: '@kb-labs/review',\n version: '0.1.0',\n\n display: {\n name: 'AI Review',\n description: 'AI code review with heuristic engines and LLM',\n tags: ['code-review', 'linting', 'ai', 'quality'],\n },\n\n // Configuration section in kb.config.json\n configSection: 'review',\n\n // Platform requirements\n platform: {\n requires: ['storage', 'cache'],\n optional: ['llm', 'analytics', 'logger'],\n },\n\n // CLI commands\n cli: {\n groupMeta: [\n { path: 'review', describe: 'AI code review' },\n ],\n commands: [\n {\n path: 'review run',\n describe: 'Run code review analysis',\n operationType: 'execute' as const,\n longDescription:\n 'Analyzes code using heuristic engines (ESLint, Ruff, etc.) and optionally LLM analyzers. ' +\n 'Supports three modes: heuristic (CI, fast), full (local, comprehensive), llm (deep analysis).',\n\n handler: './commands/run.js#default',\n\n flags: defineCommandFlags(runFlags.schema),\n\n examples: [\n 'kb review run',\n 'kb review run --mode=full',\n 'kb review run --scope=staged',\n 'kb review run --preset=typescript-strict',\n 'kb review run --files=\"src/**/*.ts\"',\n 'kb review run --json',\n ],\n },\n ],\n },\n\n // Permissions\n permissions: pluginPermissions,\n};\n\nexport default manifest;\n"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kb-labs/review-entry",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.96.0",
|
|
4
|
+
"description": "CLI commands and manifest for the AI code review plugin",
|
|
4
5
|
"type": "module",
|
|
5
6
|
"exports": {
|
|
6
7
|
".": {
|
|
7
8
|
"types": "./dist/index.d.ts",
|
|
8
9
|
"import": "./dist/index.js"
|
|
10
|
+
},
|
|
11
|
+
"./plugin-manifest": {
|
|
12
|
+
"types": "./dist/manifest.d.ts",
|
|
13
|
+
"import": "./dist/manifest.js"
|
|
9
14
|
}
|
|
10
15
|
},
|
|
11
16
|
"files": [
|
|
@@ -13,18 +18,19 @@
|
|
|
13
18
|
],
|
|
14
19
|
"dependencies": {
|
|
15
20
|
"chalk": "^5.3.0",
|
|
21
|
+
"@kb-labs/shared-cli-ui": "2.96.0",
|
|
22
|
+
"@kb-labs/review-core": "2.96.0",
|
|
16
23
|
"@kb-labs/sdk": "2.21.2",
|
|
17
|
-
"@kb-labs/
|
|
18
|
-
"@kb-labs/review-contracts": "2.94.0",
|
|
19
|
-
"@kb-labs/review-core": "2.94.0"
|
|
24
|
+
"@kb-labs/review-contracts": "2.96.0"
|
|
20
25
|
},
|
|
21
26
|
"devDependencies": {
|
|
22
27
|
"@types/node": "^24.3.3",
|
|
23
28
|
"rimraf": "^6.0.1",
|
|
24
29
|
"tsup": "^8.5.0",
|
|
25
30
|
"typescript": "^5.6.3",
|
|
26
|
-
"vitest": "^3.2.
|
|
27
|
-
"@kb-labs/devkit": "2.
|
|
31
|
+
"vitest": "^3.2.6",
|
|
32
|
+
"@kb-labs/devkit": "2.96.0",
|
|
33
|
+
"@kb-labs/shared-testing-e2e": "2.96.0"
|
|
28
34
|
},
|
|
29
35
|
"engines": {
|
|
30
36
|
"node": ">=20.0.0",
|
|
@@ -33,6 +39,9 @@
|
|
|
33
39
|
"kb": {
|
|
34
40
|
"manifest": "./dist/manifest.js"
|
|
35
41
|
},
|
|
42
|
+
"sideEffects": false,
|
|
43
|
+
"main": "./dist/index.js",
|
|
44
|
+
"types": "./dist/index.d.ts",
|
|
36
45
|
"scripts": {
|
|
37
46
|
"build": "tsup",
|
|
38
47
|
"clean": "rimraf dist",
|
|
@@ -40,6 +49,7 @@
|
|
|
40
49
|
"lint": "eslint src --ext .ts",
|
|
41
50
|
"lint:fix": "eslint . --fix",
|
|
42
51
|
"test": "vitest run --passWithNoTests",
|
|
52
|
+
"test:cli": "vitest run --config vitest.cli.config.ts --passWithNoTests",
|
|
43
53
|
"test:watch": "vitest",
|
|
44
54
|
"type-check": "tsc --noEmit"
|
|
45
55
|
}
|