agentsys 5.0.3 → 5.1.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/.claude-plugin/marketplace.json +21 -14
- package/.claude-plugin/plugin.json +1 -1
- package/AGENTS.md +2 -1
- package/CHANGELOG.md +18 -0
- package/README.md +7 -6
- package/adapters/codex/skills/agnix/SKILL.md +0 -1
- package/adapters/codex/skills/audit-project/SKILL.md +0 -1
- package/adapters/codex/skills/audit-project-agents/SKILL.md +0 -1
- package/adapters/codex/skills/audit-project-github/SKILL.md +0 -1
- package/adapters/codex/skills/consult/SKILL.md +132 -57
- package/adapters/codex/skills/debate/SKILL.md +214 -0
- package/adapters/codex/skills/delivery-approval/SKILL.md +0 -1
- package/adapters/codex/skills/deslop/SKILL.md +0 -1
- package/adapters/codex/skills/drift-detect/SKILL.md +0 -1
- package/adapters/codex/skills/enhance/SKILL.md +0 -1
- package/adapters/codex/skills/learn/SKILL.md +0 -1
- package/adapters/codex/skills/next-task/SKILL.md +0 -1
- package/adapters/codex/skills/perf/SKILL.md +0 -1
- package/adapters/codex/skills/repo-map/SKILL.md +0 -1
- package/adapters/codex/skills/ship/SKILL.md +0 -1
- package/adapters/codex/skills/ship-ci-review-loop/SKILL.md +0 -1
- package/adapters/codex/skills/ship-deployment/SKILL.md +0 -1
- package/adapters/codex/skills/ship-error-handling/SKILL.md +0 -1
- package/adapters/codex/skills/sync-docs/SKILL.md +0 -1
- package/adapters/opencode/agents/agent-enhancer.md +0 -1
- package/adapters/opencode/agents/agnix-agent.md +0 -1
- package/adapters/opencode/agents/ci-fixer.md +0 -1
- package/adapters/opencode/agents/ci-monitor.md +0 -1
- package/adapters/opencode/agents/claudemd-enhancer.md +0 -1
- package/adapters/opencode/agents/consult-agent.md +122 -30
- package/adapters/opencode/agents/cross-file-enhancer.md +0 -1
- package/adapters/opencode/agents/debate-orchestrator.md +169 -0
- package/adapters/opencode/agents/delivery-validator.md +0 -1
- package/adapters/opencode/agents/deslop-agent.md +0 -1
- package/adapters/opencode/agents/docs-enhancer.md +0 -1
- package/adapters/opencode/agents/exploration-agent.md +0 -1
- package/adapters/opencode/agents/hooks-enhancer.md +0 -1
- package/adapters/opencode/agents/implementation-agent.md +0 -1
- package/adapters/opencode/agents/learn-agent.md +0 -1
- package/adapters/opencode/agents/map-validator.md +0 -1
- package/adapters/opencode/agents/perf-analyzer.md +0 -1
- package/adapters/opencode/agents/perf-code-paths.md +0 -1
- package/adapters/opencode/agents/perf-investigation-logger.md +0 -1
- package/adapters/opencode/agents/perf-orchestrator.md +0 -1
- package/adapters/opencode/agents/perf-theory-gatherer.md +0 -1
- package/adapters/opencode/agents/perf-theory-tester.md +0 -1
- package/adapters/opencode/agents/plan-synthesizer.md +0 -1
- package/adapters/opencode/agents/planning-agent.md +0 -1
- package/adapters/opencode/agents/plugin-enhancer.md +0 -1
- package/adapters/opencode/agents/prompt-enhancer.md +0 -1
- package/adapters/opencode/agents/simple-fixer.md +0 -1
- package/adapters/opencode/agents/skills-enhancer.md +0 -1
- package/adapters/opencode/agents/sync-docs-agent.md +0 -1
- package/adapters/opencode/agents/task-discoverer.md +0 -1
- package/adapters/opencode/agents/test-coverage-checker.md +0 -1
- package/adapters/opencode/agents/worktree-manager.md +0 -1
- package/adapters/opencode/commands/agnix.md +0 -1
- package/adapters/opencode/commands/audit-project-agents.md +0 -1
- package/adapters/opencode/commands/audit-project-github.md +0 -1
- package/adapters/opencode/commands/audit-project.md +0 -1
- package/adapters/opencode/commands/consult.md +133 -57
- package/adapters/opencode/commands/debate.md +224 -0
- package/adapters/opencode/commands/delivery-approval.md +0 -1
- package/adapters/opencode/commands/deslop.md +0 -1
- package/adapters/opencode/commands/drift-detect.md +0 -1
- package/adapters/opencode/commands/enhance.md +0 -1
- package/adapters/opencode/commands/learn.md +0 -1
- package/adapters/opencode/commands/next-task.md +0 -1
- package/adapters/opencode/commands/perf.md +0 -1
- package/adapters/opencode/commands/repo-map.md +0 -1
- package/adapters/opencode/commands/ship-ci-review-loop.md +0 -1
- package/adapters/opencode/commands/ship-deployment.md +0 -1
- package/adapters/opencode/commands/ship-error-handling.md +0 -1
- package/adapters/opencode/commands/ship.md +0 -1
- package/adapters/opencode/commands/sync-docs.md +0 -1
- package/adapters/opencode/skills/agnix/SKILL.md +1 -2
- package/adapters/opencode/skills/consult/SKILL.md +33 -23
- package/adapters/opencode/skills/debate/SKILL.md +245 -0
- package/adapters/opencode/skills/deslop/SKILL.md +1 -2
- package/adapters/opencode/skills/discover-tasks/SKILL.md +1 -2
- package/adapters/opencode/skills/drift-analysis/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-agent-prompts/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-claude-memory/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-cross-file/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-docs/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-hooks/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-orchestrator/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-plugins/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-prompts/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-skills/SKILL.md +1 -2
- package/adapters/opencode/skills/learn/SKILL.md +1 -2
- package/adapters/opencode/skills/orchestrate-review/SKILL.md +0 -1
- package/adapters/opencode/skills/perf-analyzer/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-baseline-manager/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-benchmarker/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-code-paths/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-investigation-logger/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-profiler/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-theory-gatherer/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-theory-tester/SKILL.md +1 -2
- package/adapters/opencode/skills/repo-mapping/SKILL.md +1 -2
- package/adapters/opencode/skills/sync-docs/SKILL.md +1 -2
- package/adapters/opencode/skills/validate-delivery/SKILL.md +1 -2
- package/lib/adapter-transforms.js +24 -4
- package/package.json +1 -1
- package/plugins/agnix/.claude-plugin/plugin.json +1 -1
- package/plugins/agnix/skills/agnix/SKILL.md +1 -1
- package/plugins/audit-project/.claude-plugin/plugin.json +1 -1
- package/plugins/audit-project/lib/adapter-transforms.js +24 -4
- package/plugins/consult/.claude-plugin/plugin.json +1 -1
- package/plugins/consult/agents/consult-agent.md +122 -29
- package/plugins/consult/commands/consult.md +135 -58
- package/plugins/consult/skills/consult/SKILL.md +31 -20
- package/plugins/debate/.claude-plugin/plugin.json +21 -0
- package/plugins/debate/agents/debate-orchestrator.md +175 -0
- package/plugins/debate/commands/debate.md +221 -0
- package/plugins/debate/lib/adapter-transforms.js +298 -0
- package/plugins/debate/lib/collectors/codebase.js +392 -0
- package/plugins/debate/lib/collectors/docs-patterns.js +713 -0
- package/plugins/debate/lib/collectors/documentation.js +219 -0
- package/plugins/debate/lib/collectors/github.js +330 -0
- package/plugins/debate/lib/collectors/index.js +126 -0
- package/plugins/debate/lib/config/index.js +14 -0
- package/plugins/debate/lib/cross-platform/index.js +539 -0
- package/plugins/debate/lib/discovery/index.js +352 -0
- package/plugins/debate/lib/drift-detect/collectors.js +37 -0
- package/plugins/debate/lib/enhance/agent-analyzer.js +421 -0
- package/plugins/debate/lib/enhance/agent-patterns.js +571 -0
- package/plugins/debate/lib/enhance/auto-suppression.js +622 -0
- package/plugins/debate/lib/enhance/benchmark.js +417 -0
- package/plugins/debate/lib/enhance/cross-file-analyzer.js +930 -0
- package/plugins/debate/lib/enhance/cross-file-patterns.js +370 -0
- package/plugins/debate/lib/enhance/docs-analyzer.js +325 -0
- package/plugins/debate/lib/enhance/docs-patterns.js +671 -0
- package/plugins/debate/lib/enhance/fixer.js +721 -0
- package/plugins/debate/lib/enhance/hook-analyzer.js +135 -0
- package/plugins/debate/lib/enhance/hook-patterns.js +40 -0
- package/plugins/debate/lib/enhance/index.js +127 -0
- package/plugins/debate/lib/enhance/plugin-analyzer.js +402 -0
- package/plugins/debate/lib/enhance/plugin-patterns.js +326 -0
- package/plugins/debate/lib/enhance/projectmemory-analyzer.js +551 -0
- package/plugins/debate/lib/enhance/projectmemory-patterns.js +617 -0
- package/plugins/debate/lib/enhance/prompt-analyzer.js +457 -0
- package/plugins/debate/lib/enhance/prompt-patterns.js +1484 -0
- package/plugins/debate/lib/enhance/reporter.js +1348 -0
- package/plugins/debate/lib/enhance/security-patterns.js +284 -0
- package/plugins/debate/lib/enhance/skill-analyzer.js +182 -0
- package/plugins/debate/lib/enhance/skill-patterns.js +147 -0
- package/plugins/debate/lib/enhance/suppression.js +352 -0
- package/plugins/debate/lib/enhance/tool-patterns.js +373 -0
- package/plugins/debate/lib/index.js +270 -0
- package/plugins/debate/lib/patterns/cli-enhancers.js +611 -0
- package/plugins/debate/lib/patterns/pipeline.js +948 -0
- package/plugins/debate/lib/patterns/review-patterns.js +558 -0
- package/plugins/debate/lib/patterns/slop-analyzers.js +2305 -0
- package/plugins/debate/lib/patterns/slop-patterns.js +1187 -0
- package/plugins/debate/lib/perf/analyzer/index.js +22 -0
- package/plugins/debate/lib/perf/argument-parser.js +105 -0
- package/plugins/debate/lib/perf/baseline-comparator.js +50 -0
- package/plugins/debate/lib/perf/baseline-store.js +127 -0
- package/plugins/debate/lib/perf/benchmark-runner.js +404 -0
- package/plugins/debate/lib/perf/breaking-point-finder.js +52 -0
- package/plugins/debate/lib/perf/breaking-point-runner.js +60 -0
- package/plugins/debate/lib/perf/checkpoint.js +123 -0
- package/plugins/debate/lib/perf/code-paths.js +86 -0
- package/plugins/debate/lib/perf/consolidation.js +37 -0
- package/plugins/debate/lib/perf/constraint-runner.js +71 -0
- package/plugins/debate/lib/perf/experiment-runner.js +32 -0
- package/plugins/debate/lib/perf/index.js +41 -0
- package/plugins/debate/lib/perf/investigation-state.js +874 -0
- package/plugins/debate/lib/perf/optimization-runner.js +79 -0
- package/plugins/debate/lib/perf/profilers/go.js +22 -0
- package/plugins/debate/lib/perf/profilers/index.js +46 -0
- package/plugins/debate/lib/perf/profilers/java.js +23 -0
- package/plugins/debate/lib/perf/profilers/node.js +27 -0
- package/plugins/debate/lib/perf/profilers/python.js +23 -0
- package/plugins/debate/lib/perf/profilers/rust.js +23 -0
- package/plugins/debate/lib/perf/profiling-runner.js +75 -0
- package/plugins/debate/lib/perf/schemas.js +140 -0
- package/plugins/debate/lib/platform/detect-platform.js +413 -0
- package/plugins/debate/lib/platform/detection-configs.js +93 -0
- package/plugins/debate/lib/platform/state-dir.js +132 -0
- package/plugins/debate/lib/platform/verify-tools.js +182 -0
- package/plugins/debate/lib/repo-map/cache.js +152 -0
- package/plugins/debate/lib/repo-map/concurrency.js +29 -0
- package/plugins/debate/lib/repo-map/index.js +222 -0
- package/plugins/debate/lib/repo-map/installer.js +212 -0
- package/plugins/debate/lib/repo-map/queries/go.js +27 -0
- package/plugins/debate/lib/repo-map/queries/index.js +100 -0
- package/plugins/debate/lib/repo-map/queries/java.js +38 -0
- package/plugins/debate/lib/repo-map/queries/javascript.js +55 -0
- package/plugins/debate/lib/repo-map/queries/python.js +24 -0
- package/plugins/debate/lib/repo-map/queries/rust.js +73 -0
- package/plugins/debate/lib/repo-map/queries/typescript.js +38 -0
- package/plugins/debate/lib/repo-map/runner.js +1364 -0
- package/plugins/debate/lib/repo-map/updater.js +562 -0
- package/plugins/debate/lib/repo-map/usage-analyzer.js +407 -0
- package/plugins/debate/lib/schemas/plugin-manifest.schema.json +57 -0
- package/plugins/debate/lib/schemas/validator.js +247 -0
- package/plugins/debate/lib/sources/custom-handler.js +199 -0
- package/plugins/debate/lib/sources/policy-questions.js +246 -0
- package/plugins/debate/lib/sources/source-cache.js +165 -0
- package/plugins/debate/lib/state/workflow-state.js +576 -0
- package/plugins/debate/lib/types/agent-frontmatter.d.ts +134 -0
- package/plugins/debate/lib/types/command-frontmatter.d.ts +107 -0
- package/plugins/debate/lib/types/hook-frontmatter.d.ts +115 -0
- package/plugins/debate/lib/types/index.d.ts +84 -0
- package/plugins/debate/lib/types/plugin-manifest.d.ts +102 -0
- package/plugins/debate/lib/types/skill-frontmatter.d.ts +89 -0
- package/plugins/debate/lib/utils/atomic-write.js +94 -0
- package/plugins/debate/lib/utils/cache-manager.js +159 -0
- package/plugins/debate/lib/utils/command-parser.js +0 -0
- package/plugins/debate/lib/utils/context-optimizer.js +300 -0
- package/plugins/debate/lib/utils/deprecation.js +37 -0
- package/plugins/debate/lib/utils/shell-escape.js +88 -0
- package/plugins/debate/lib/utils/state-helpers.js +61 -0
- package/plugins/debate/skills/debate/SKILL.md +264 -0
- package/plugins/deslop/.claude-plugin/plugin.json +1 -1
- package/plugins/deslop/lib/adapter-transforms.js +24 -4
- package/plugins/deslop/skills/deslop/SKILL.md +1 -1
- package/plugins/drift-detect/.claude-plugin/plugin.json +1 -1
- package/plugins/drift-detect/lib/adapter-transforms.js +24 -4
- package/plugins/drift-detect/skills/drift-analysis/SKILL.md +1 -1
- package/plugins/enhance/.claude-plugin/plugin.json +1 -1
- package/plugins/enhance/lib/adapter-transforms.js +24 -4
- package/plugins/enhance/skills/enhance-agent-prompts/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-claude-memory/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-cross-file/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-docs/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-hooks/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-orchestrator/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-plugins/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-prompts/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-skills/SKILL.md +1 -1
- package/plugins/learn/.claude-plugin/plugin.json +1 -1
- package/plugins/learn/agents/learn-agent.md +1 -1
- package/plugins/learn/lib/adapter-transforms.js +24 -4
- package/plugins/learn/skills/learn/SKILL.md +1 -1
- package/plugins/next-task/.claude-plugin/plugin.json +1 -1
- package/plugins/next-task/agents/exploration-agent.md +1 -1
- package/plugins/next-task/lib/adapter-transforms.js +24 -4
- package/plugins/next-task/skills/discover-tasks/SKILL.md +1 -1
- package/plugins/next-task/skills/validate-delivery/SKILL.md +1 -1
- package/plugins/perf/.claude-plugin/plugin.json +1 -1
- package/plugins/perf/lib/adapter-transforms.js +24 -4
- package/plugins/perf/skills/perf-analyzer/SKILL.md +1 -1
- package/plugins/perf/skills/perf-baseline-manager/SKILL.md +1 -1
- package/plugins/perf/skills/perf-benchmarker/SKILL.md +1 -1
- package/plugins/perf/skills/perf-code-paths/SKILL.md +1 -1
- package/plugins/perf/skills/perf-investigation-logger/SKILL.md +1 -1
- package/plugins/perf/skills/perf-profiler/SKILL.md +1 -1
- package/plugins/perf/skills/perf-theory-gatherer/SKILL.md +1 -1
- package/plugins/perf/skills/perf-theory-tester/SKILL.md +1 -1
- package/plugins/repo-map/.claude-plugin/plugin.json +1 -1
- package/plugins/repo-map/lib/adapter-transforms.js +24 -4
- package/plugins/ship/.claude-plugin/plugin.json +1 -1
- package/plugins/ship/lib/adapter-transforms.js +24 -4
- package/plugins/sync-docs/.claude-plugin/plugin.json +1 -1
- package/plugins/sync-docs/lib/adapter-transforms.js +24 -4
- package/plugins/sync-docs/skills/sync-docs/SKILL.md +1 -1
- package/scripts/gen-adapters.js +6 -7
- package/scripts/generate-docs.js +4 -2
- package/scripts/plugins.txt +1 -0
- package/site/content.json +6 -6
|
@@ -0,0 +1,1348 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin Analysis Reporter
|
|
3
|
+
* Generates markdown reports for plugin analysis results
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Generate a markdown report from analysis results
|
|
8
|
+
* @param {Object} results - Analysis results
|
|
9
|
+
* @param {string} results.pluginName - Name of analyzed plugin
|
|
10
|
+
* @param {Array} results.toolIssues - Tool definition issues
|
|
11
|
+
* @param {Array} results.structureIssues - Plugin structure issues
|
|
12
|
+
* @param {Array} results.securityIssues - Security issues
|
|
13
|
+
* @param {Object} options - Report options
|
|
14
|
+
* @param {boolean} options.verbose - Include LOW certainty issues
|
|
15
|
+
* @param {boolean} options.compact - Use compact format
|
|
16
|
+
* @returns {string} Markdown report
|
|
17
|
+
*/
|
|
18
|
+
function generateReport(results, options = {}) {
|
|
19
|
+
const { verbose = false, compact = false } = options;
|
|
20
|
+
|
|
21
|
+
// Filter issues by certainty
|
|
22
|
+
const filterIssues = (issues) => {
|
|
23
|
+
if (verbose) return issues;
|
|
24
|
+
return issues.filter(i => i.certainty !== 'LOW');
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const toolIssues = filterIssues(results.toolIssues || []);
|
|
28
|
+
const structureIssues = filterIssues(results.structureIssues || []);
|
|
29
|
+
const securityIssues = filterIssues(results.securityIssues || []);
|
|
30
|
+
|
|
31
|
+
const totalIssues = toolIssues.length + structureIssues.length + securityIssues.length;
|
|
32
|
+
|
|
33
|
+
if (compact) {
|
|
34
|
+
return generateCompactReport(results.pluginName, toolIssues, structureIssues, securityIssues);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const lines = [];
|
|
38
|
+
|
|
39
|
+
// Header
|
|
40
|
+
lines.push(`## Plugin Analysis: ${results.pluginName}`);
|
|
41
|
+
lines.push('');
|
|
42
|
+
lines.push(`**Analyzed**: ${new Date().toISOString()}`);
|
|
43
|
+
lines.push(`**Files scanned**: ${results.filesScanned || 0}`);
|
|
44
|
+
lines.push('');
|
|
45
|
+
|
|
46
|
+
// Summary
|
|
47
|
+
lines.push('### Summary');
|
|
48
|
+
lines.push('');
|
|
49
|
+
|
|
50
|
+
const highCount = countByCertainty([...toolIssues, ...structureIssues, ...securityIssues], 'HIGH');
|
|
51
|
+
const mediumCount = countByCertainty([...toolIssues, ...structureIssues, ...securityIssues], 'MEDIUM');
|
|
52
|
+
const lowCount = verbose ? countByCertainty([...toolIssues, ...structureIssues, ...securityIssues], 'LOW') : 0;
|
|
53
|
+
|
|
54
|
+
lines.push(`| Certainty | Count |`);
|
|
55
|
+
lines.push(`|-----------|-------|`);
|
|
56
|
+
lines.push(`| HIGH | ${highCount} |`);
|
|
57
|
+
lines.push(`| MEDIUM | ${mediumCount} |`);
|
|
58
|
+
if (verbose) {
|
|
59
|
+
lines.push(`| LOW | ${lowCount} |`);
|
|
60
|
+
}
|
|
61
|
+
lines.push(`| **Total** | **${totalIssues}** |`);
|
|
62
|
+
lines.push('');
|
|
63
|
+
|
|
64
|
+
// Tool Issues
|
|
65
|
+
if (toolIssues.length > 0) {
|
|
66
|
+
lines.push(`### Tool Definitions (${toolIssues.length} issues)`);
|
|
67
|
+
lines.push('');
|
|
68
|
+
lines.push('| Tool | Issue | Fix | Certainty |');
|
|
69
|
+
lines.push('|------|-------|-----|-----------|');
|
|
70
|
+
for (const issue of toolIssues) {
|
|
71
|
+
lines.push(`| ${issue.tool || '-'} | ${issue.issue} | ${issue.fix || '-'} | ${issue.certainty} |`);
|
|
72
|
+
}
|
|
73
|
+
lines.push('');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Structure Issues
|
|
77
|
+
if (structureIssues.length > 0) {
|
|
78
|
+
lines.push(`### Structure (${structureIssues.length} issues)`);
|
|
79
|
+
lines.push('');
|
|
80
|
+
lines.push('| File | Issue | Certainty |');
|
|
81
|
+
lines.push('|------|-------|-----------|');
|
|
82
|
+
for (const issue of structureIssues) {
|
|
83
|
+
lines.push(`| ${issue.file || '-'} | ${issue.issue} | ${issue.certainty} |`);
|
|
84
|
+
}
|
|
85
|
+
lines.push('');
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Security Issues
|
|
89
|
+
if (securityIssues.length > 0) {
|
|
90
|
+
lines.push(`### Security (${securityIssues.length} issues)`);
|
|
91
|
+
lines.push('');
|
|
92
|
+
lines.push('| File | Line | Issue | Certainty |');
|
|
93
|
+
lines.push('|------|------|-------|-----------|');
|
|
94
|
+
for (const issue of securityIssues) {
|
|
95
|
+
lines.push(`| ${issue.file || '-'} | ${issue.line || '-'} | ${issue.issue} | ${issue.certainty} |`);
|
|
96
|
+
}
|
|
97
|
+
lines.push('');
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// No issues
|
|
101
|
+
if (totalIssues === 0) {
|
|
102
|
+
lines.push('No issues found.');
|
|
103
|
+
lines.push('');
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return lines.join('\n');
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
function generateCompactReport(pluginName, toolIssues, structureIssues, securityIssues) {
|
|
110
|
+
const lines = [];
|
|
111
|
+
|
|
112
|
+
lines.push(`## ${pluginName}: ${toolIssues.length + structureIssues.length + securityIssues.length} issues`);
|
|
113
|
+
lines.push('');
|
|
114
|
+
|
|
115
|
+
const allIssues = [
|
|
116
|
+
...toolIssues.map(i => ({ ...i, category: 'Tool' })),
|
|
117
|
+
...structureIssues.map(i => ({ ...i, category: 'Structure' })),
|
|
118
|
+
...securityIssues.map(i => ({ ...i, category: 'Security' }))
|
|
119
|
+
];
|
|
120
|
+
|
|
121
|
+
// Sort by certainty (HIGH first)
|
|
122
|
+
const certOrder = { HIGH: 0, MEDIUM: 1, LOW: 2 };
|
|
123
|
+
allIssues.sort((a, b) => certOrder[a.certainty] - certOrder[b.certainty]);
|
|
124
|
+
|
|
125
|
+
if (allIssues.length > 0) {
|
|
126
|
+
lines.push('| Category | Issue | Certainty |');
|
|
127
|
+
lines.push('|----------|-------|-----------|');
|
|
128
|
+
for (const issue of allIssues) {
|
|
129
|
+
lines.push(`| ${issue.category} | ${issue.issue} | ${issue.certainty} |`);
|
|
130
|
+
}
|
|
131
|
+
} else {
|
|
132
|
+
lines.push('No issues found.');
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
return lines.join('\n');
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
function countByCertainty(issues, certainty) {
|
|
139
|
+
return issues.filter(i => i.certainty === certainty).length;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Generate a diff display for a fix
|
|
144
|
+
* @param {string} original - Original content
|
|
145
|
+
* @param {string} modified - Modified content
|
|
146
|
+
* @param {string} filePath - File path
|
|
147
|
+
* @returns {string} Diff display
|
|
148
|
+
*/
|
|
149
|
+
function generateDiff(original, modified, filePath) {
|
|
150
|
+
const lines = [];
|
|
151
|
+
|
|
152
|
+
lines.push(`\`\`\`diff`);
|
|
153
|
+
lines.push(`--- a/${filePath}`);
|
|
154
|
+
lines.push(`+++ b/${filePath}`);
|
|
155
|
+
|
|
156
|
+
const origLines = original.split('\n');
|
|
157
|
+
const modLines = modified.split('\n');
|
|
158
|
+
const maxLines = Math.max(origLines.length, modLines.length);
|
|
159
|
+
for (let i = 0; i < maxLines; i++) {
|
|
160
|
+
const origLine = origLines[i];
|
|
161
|
+
const modLine = modLines[i];
|
|
162
|
+
|
|
163
|
+
if (origLine === modLine) {
|
|
164
|
+
if (origLine !== undefined) {
|
|
165
|
+
lines.push(` ${origLine}`);
|
|
166
|
+
}
|
|
167
|
+
} else {
|
|
168
|
+
if (origLine !== undefined) {
|
|
169
|
+
lines.push(`-${origLine}`);
|
|
170
|
+
}
|
|
171
|
+
if (modLine !== undefined) {
|
|
172
|
+
lines.push(`+${modLine}`);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
lines.push(`\`\`\``);
|
|
178
|
+
|
|
179
|
+
return lines.join('\n');
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Generate a summary report for multiple plugins
|
|
184
|
+
* @param {Array} allResults - Array of plugin analysis results
|
|
185
|
+
* @param {Object} options - Report options
|
|
186
|
+
* @returns {string} Summary markdown report
|
|
187
|
+
*/
|
|
188
|
+
function generateSummaryReport(allResults, options = {}) {
|
|
189
|
+
const lines = [];
|
|
190
|
+
|
|
191
|
+
lines.push('# Plugin Analysis Summary');
|
|
192
|
+
lines.push('');
|
|
193
|
+
lines.push(`**Analyzed**: ${allResults.length} plugins`);
|
|
194
|
+
lines.push(`**Date**: ${new Date().toISOString()}`);
|
|
195
|
+
lines.push('');
|
|
196
|
+
|
|
197
|
+
// Overall stats
|
|
198
|
+
let totalHigh = 0;
|
|
199
|
+
let totalMedium = 0;
|
|
200
|
+
let totalLow = 0;
|
|
201
|
+
|
|
202
|
+
for (const result of allResults) {
|
|
203
|
+
const allIssues = [
|
|
204
|
+
...(result.toolIssues || []),
|
|
205
|
+
...(result.structureIssues || []),
|
|
206
|
+
...(result.securityIssues || [])
|
|
207
|
+
];
|
|
208
|
+
totalHigh += countByCertainty(allIssues, 'HIGH');
|
|
209
|
+
totalMedium += countByCertainty(allIssues, 'MEDIUM');
|
|
210
|
+
totalLow += countByCertainty(allIssues, 'LOW');
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
lines.push('## Overall');
|
|
214
|
+
lines.push('');
|
|
215
|
+
lines.push('| Certainty | Count |');
|
|
216
|
+
lines.push('|-----------|-------|');
|
|
217
|
+
lines.push(`| HIGH | ${totalHigh} |`);
|
|
218
|
+
lines.push(`| MEDIUM | ${totalMedium} |`);
|
|
219
|
+
if (options.verbose) {
|
|
220
|
+
lines.push(`| LOW | ${totalLow} |`);
|
|
221
|
+
}
|
|
222
|
+
lines.push('');
|
|
223
|
+
|
|
224
|
+
lines.push('## By Plugin');
|
|
225
|
+
lines.push('');
|
|
226
|
+
lines.push('| Plugin | HIGH | MEDIUM | LOW | Total |');
|
|
227
|
+
lines.push('|--------|------|--------|-----|-------|');
|
|
228
|
+
|
|
229
|
+
for (const result of allResults) {
|
|
230
|
+
const allIssues = [
|
|
231
|
+
...(result.toolIssues || []),
|
|
232
|
+
...(result.structureIssues || []),
|
|
233
|
+
...(result.securityIssues || [])
|
|
234
|
+
];
|
|
235
|
+
const h = countByCertainty(allIssues, 'HIGH');
|
|
236
|
+
const m = countByCertainty(allIssues, 'MEDIUM');
|
|
237
|
+
const l = countByCertainty(allIssues, 'LOW');
|
|
238
|
+
lines.push(`| ${result.pluginName} | ${h} | ${m} | ${l} | ${h + m + l} |`);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
lines.push('');
|
|
242
|
+
|
|
243
|
+
return lines.join('\n');
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Generate report for a single agent analysis
|
|
248
|
+
* @param {Object} results - Agent analysis results
|
|
249
|
+
* @param {Object} options - Report options
|
|
250
|
+
* @returns {string} Markdown report
|
|
251
|
+
*/
|
|
252
|
+
function generateAgentReport(results, options = {}) {
|
|
253
|
+
const lines = [];
|
|
254
|
+
|
|
255
|
+
lines.push(`# Agent Analysis: ${results.agentName}`);
|
|
256
|
+
lines.push('');
|
|
257
|
+
lines.push(`**File**: ${results.agentPath}`);
|
|
258
|
+
lines.push(`**Analyzed**: ${new Date().toISOString()}`);
|
|
259
|
+
lines.push('');
|
|
260
|
+
|
|
261
|
+
const allIssues = [
|
|
262
|
+
...(results.structureIssues || []),
|
|
263
|
+
...(results.toolIssues || []),
|
|
264
|
+
...(results.xmlIssues || []),
|
|
265
|
+
...(results.cotIssues || []),
|
|
266
|
+
...(results.exampleIssues || []),
|
|
267
|
+
...(results.antiPatternIssues || []),
|
|
268
|
+
...(results.crossPlatformIssues || [])
|
|
269
|
+
];
|
|
270
|
+
|
|
271
|
+
// Count by certainty
|
|
272
|
+
const highCount = countByCertainty(allIssues, 'HIGH');
|
|
273
|
+
const mediumCount = countByCertainty(allIssues, 'MEDIUM');
|
|
274
|
+
const lowCount = countByCertainty(allIssues, 'LOW');
|
|
275
|
+
|
|
276
|
+
lines.push('## Summary');
|
|
277
|
+
lines.push('');
|
|
278
|
+
lines.push('| Certainty | Count |');
|
|
279
|
+
lines.push('|-----------|-------|');
|
|
280
|
+
lines.push(`| HIGH | ${highCount} |`);
|
|
281
|
+
lines.push(`| MEDIUM | ${mediumCount} |`);
|
|
282
|
+
if (options.verbose) {
|
|
283
|
+
lines.push(`| LOW | ${lowCount} |`);
|
|
284
|
+
}
|
|
285
|
+
lines.push('');
|
|
286
|
+
|
|
287
|
+
if (results.structureIssues && results.structureIssues.length > 0) {
|
|
288
|
+
lines.push(`### Structure Issues (${results.structureIssues.length})`);
|
|
289
|
+
lines.push('');
|
|
290
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
291
|
+
lines.push('|-------|-----|-----------|');
|
|
292
|
+
for (const issue of results.structureIssues) {
|
|
293
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
294
|
+
}
|
|
295
|
+
lines.push('');
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
if (results.toolIssues && results.toolIssues.length > 0) {
|
|
299
|
+
lines.push(`### Tool Issues (${results.toolIssues.length})`);
|
|
300
|
+
lines.push('');
|
|
301
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
302
|
+
lines.push('|-------|-----|-----------|');
|
|
303
|
+
for (const issue of results.toolIssues) {
|
|
304
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
305
|
+
}
|
|
306
|
+
lines.push('');
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
if (results.xmlIssues && results.xmlIssues.length > 0) {
|
|
310
|
+
lines.push(`### XML Structure Issues (${results.xmlIssues.length})`);
|
|
311
|
+
lines.push('');
|
|
312
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
313
|
+
lines.push('|-------|-----|-----------|');
|
|
314
|
+
for (const issue of results.xmlIssues) {
|
|
315
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
316
|
+
}
|
|
317
|
+
lines.push('');
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if (results.cotIssues && results.cotIssues.length > 0) {
|
|
321
|
+
lines.push(`### Chain-of-Thought Issues (${results.cotIssues.length})`);
|
|
322
|
+
lines.push('');
|
|
323
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
324
|
+
lines.push('|-------|-----|-----------|');
|
|
325
|
+
for (const issue of results.cotIssues) {
|
|
326
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
327
|
+
}
|
|
328
|
+
lines.push('');
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
if (results.exampleIssues && results.exampleIssues.length > 0) {
|
|
332
|
+
lines.push(`### Example Issues (${results.exampleIssues.length})`);
|
|
333
|
+
lines.push('');
|
|
334
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
335
|
+
lines.push('|-------|-----|-----------|');
|
|
336
|
+
for (const issue of results.exampleIssues) {
|
|
337
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
338
|
+
}
|
|
339
|
+
lines.push('');
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
if (results.antiPatternIssues && results.antiPatternIssues.length > 0) {
|
|
343
|
+
lines.push(`### Anti-Pattern Issues (${results.antiPatternIssues.length})`);
|
|
344
|
+
lines.push('');
|
|
345
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
346
|
+
lines.push('|-------|-----|-----------|');
|
|
347
|
+
for (const issue of results.antiPatternIssues) {
|
|
348
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
349
|
+
}
|
|
350
|
+
lines.push('');
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Cross-Platform Issues
|
|
354
|
+
if (results.crossPlatformIssues && results.crossPlatformIssues.length > 0) {
|
|
355
|
+
lines.push(`### Cross-Platform Issues (${results.crossPlatformIssues.length})`);
|
|
356
|
+
lines.push('');
|
|
357
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
358
|
+
lines.push('|-------|-----|-----------|');
|
|
359
|
+
for (const issue of results.crossPlatformIssues) {
|
|
360
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
361
|
+
}
|
|
362
|
+
lines.push('');
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
return lines.join('\n');
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Generate summary report for multiple agent analyses
|
|
370
|
+
* @param {Array} allResults - Array of agent analysis results
|
|
371
|
+
* @param {Object} options - Report options
|
|
372
|
+
* @returns {string} Markdown report
|
|
373
|
+
*/
|
|
374
|
+
function generateAgentSummaryReport(allResults, options = {}) {
|
|
375
|
+
const lines = [];
|
|
376
|
+
|
|
377
|
+
lines.push('# Agent Analysis Summary');
|
|
378
|
+
lines.push('');
|
|
379
|
+
lines.push(`**Analyzed**: ${allResults.length} agents`);
|
|
380
|
+
lines.push(`**Date**: ${new Date().toISOString()}`);
|
|
381
|
+
lines.push('');
|
|
382
|
+
|
|
383
|
+
// Overall stats
|
|
384
|
+
let totalHigh = 0;
|
|
385
|
+
let totalMedium = 0;
|
|
386
|
+
let totalLow = 0;
|
|
387
|
+
|
|
388
|
+
for (const result of allResults) {
|
|
389
|
+
const allIssues = [
|
|
390
|
+
...(result.structureIssues || []),
|
|
391
|
+
...(result.toolIssues || []),
|
|
392
|
+
...(result.xmlIssues || []),
|
|
393
|
+
...(result.cotIssues || []),
|
|
394
|
+
...(result.exampleIssues || []),
|
|
395
|
+
...(result.antiPatternIssues || []),
|
|
396
|
+
...(result.crossPlatformIssues || [])
|
|
397
|
+
];
|
|
398
|
+
totalHigh += countByCertainty(allIssues, 'HIGH');
|
|
399
|
+
totalMedium += countByCertainty(allIssues, 'MEDIUM');
|
|
400
|
+
totalLow += countByCertainty(allIssues, 'LOW');
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
lines.push('## Overall');
|
|
404
|
+
lines.push('');
|
|
405
|
+
lines.push('| Certainty | Count |');
|
|
406
|
+
lines.push('|-----------|-------|');
|
|
407
|
+
lines.push(`| HIGH | ${totalHigh} |`);
|
|
408
|
+
lines.push(`| MEDIUM | ${totalMedium} |`);
|
|
409
|
+
if (options.verbose) {
|
|
410
|
+
lines.push(`| LOW | ${totalLow} |`);
|
|
411
|
+
}
|
|
412
|
+
lines.push('');
|
|
413
|
+
|
|
414
|
+
lines.push('## By Agent');
|
|
415
|
+
lines.push('');
|
|
416
|
+
lines.push('| Agent | HIGH | MEDIUM | LOW | Total |');
|
|
417
|
+
lines.push('|-------|------|--------|-----|-------|');
|
|
418
|
+
|
|
419
|
+
for (const result of allResults) {
|
|
420
|
+
const allIssues = [
|
|
421
|
+
...(result.structureIssues || []),
|
|
422
|
+
...(result.toolIssues || []),
|
|
423
|
+
...(result.xmlIssues || []),
|
|
424
|
+
...(result.cotIssues || []),
|
|
425
|
+
...(result.exampleIssues || []),
|
|
426
|
+
...(result.antiPatternIssues || []),
|
|
427
|
+
...(result.crossPlatformIssues || [])
|
|
428
|
+
];
|
|
429
|
+
const h = countByCertainty(allIssues, 'HIGH');
|
|
430
|
+
const m = countByCertainty(allIssues, 'MEDIUM');
|
|
431
|
+
const l = countByCertainty(allIssues, 'LOW');
|
|
432
|
+
lines.push(`| ${result.agentName} | ${h} | ${m} | ${l} | ${h + m + l} |`);
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
lines.push('');
|
|
436
|
+
|
|
437
|
+
return lines.join('\n');
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* Generate report for a single documentation analysis
|
|
442
|
+
* @param {Object} results - Docs analysis results
|
|
443
|
+
* @param {Object} options - Report options
|
|
444
|
+
* @returns {string} Markdown report
|
|
445
|
+
*/
|
|
446
|
+
function generateDocsReport(results, options = {}) {
|
|
447
|
+
const lines = [];
|
|
448
|
+
|
|
449
|
+
lines.push(`# Documentation Analysis: ${results.docName}`);
|
|
450
|
+
lines.push('');
|
|
451
|
+
lines.push(`**File**: ${results.docPath}`);
|
|
452
|
+
lines.push(`**Mode**: ${results.mode === 'ai' ? 'AI-only (RAG optimized)' : 'Both audiences'}`);
|
|
453
|
+
lines.push(`**Token Count**: ~${results.tokenCount}`);
|
|
454
|
+
lines.push(`**Analyzed**: ${new Date().toISOString()}`);
|
|
455
|
+
lines.push('');
|
|
456
|
+
|
|
457
|
+
// Collect all issues
|
|
458
|
+
const allIssues = [
|
|
459
|
+
...(results.linkIssues || []),
|
|
460
|
+
...(results.structureIssues || []),
|
|
461
|
+
...(results.codeIssues || []),
|
|
462
|
+
...(results.efficiencyIssues || []),
|
|
463
|
+
...(results.ragIssues || []),
|
|
464
|
+
...(results.balanceIssues || [])
|
|
465
|
+
];
|
|
466
|
+
|
|
467
|
+
// Count by certainty
|
|
468
|
+
const highCount = countByCertainty(allIssues, 'HIGH');
|
|
469
|
+
const mediumCount = countByCertainty(allIssues, 'MEDIUM');
|
|
470
|
+
const lowCount = countByCertainty(allIssues, 'LOW');
|
|
471
|
+
|
|
472
|
+
lines.push('## Summary');
|
|
473
|
+
lines.push('');
|
|
474
|
+
lines.push('| Certainty | Count |');
|
|
475
|
+
lines.push('|-----------|-------|');
|
|
476
|
+
lines.push(`| HIGH | ${highCount} |`);
|
|
477
|
+
lines.push(`| MEDIUM | ${mediumCount} |`);
|
|
478
|
+
if (options.verbose) {
|
|
479
|
+
lines.push(`| LOW | ${lowCount} |`);
|
|
480
|
+
}
|
|
481
|
+
lines.push('');
|
|
482
|
+
|
|
483
|
+
// Link Issues
|
|
484
|
+
if (results.linkIssues && results.linkIssues.length > 0) {
|
|
485
|
+
lines.push(`### Link Issues (${results.linkIssues.length})`);
|
|
486
|
+
lines.push('');
|
|
487
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
488
|
+
lines.push('|-------|-----|-----------|');
|
|
489
|
+
for (const issue of results.linkIssues) {
|
|
490
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
491
|
+
}
|
|
492
|
+
lines.push('');
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// Structure Issues
|
|
496
|
+
if (results.structureIssues && results.structureIssues.length > 0) {
|
|
497
|
+
lines.push(`### Structure Issues (${results.structureIssues.length})`);
|
|
498
|
+
lines.push('');
|
|
499
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
500
|
+
lines.push('|-------|-----|-----------|');
|
|
501
|
+
for (const issue of results.structureIssues) {
|
|
502
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
503
|
+
}
|
|
504
|
+
lines.push('');
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
// Code Issues
|
|
508
|
+
if (results.codeIssues && results.codeIssues.length > 0) {
|
|
509
|
+
lines.push(`### Code Block Issues (${results.codeIssues.length})`);
|
|
510
|
+
lines.push('');
|
|
511
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
512
|
+
lines.push('|-------|-----|-----------|');
|
|
513
|
+
for (const issue of results.codeIssues) {
|
|
514
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
515
|
+
}
|
|
516
|
+
lines.push('');
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
// Efficiency Issues (AI mode)
|
|
520
|
+
if (results.efficiencyIssues && results.efficiencyIssues.length > 0) {
|
|
521
|
+
lines.push(`### Efficiency Issues (${results.efficiencyIssues.length})`);
|
|
522
|
+
lines.push('');
|
|
523
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
524
|
+
lines.push('|-------|-----|-----------|');
|
|
525
|
+
for (const issue of results.efficiencyIssues) {
|
|
526
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
527
|
+
}
|
|
528
|
+
lines.push('');
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
// RAG Issues (AI mode)
|
|
532
|
+
if (results.ragIssues && results.ragIssues.length > 0) {
|
|
533
|
+
lines.push(`### RAG Optimization Issues (${results.ragIssues.length})`);
|
|
534
|
+
lines.push('');
|
|
535
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
536
|
+
lines.push('|-------|-----|-----------|');
|
|
537
|
+
for (const issue of results.ragIssues) {
|
|
538
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
539
|
+
}
|
|
540
|
+
lines.push('');
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// Balance Issues (both mode)
|
|
544
|
+
if (results.balanceIssues && results.balanceIssues.length > 0) {
|
|
545
|
+
lines.push(`### Balance Suggestions (${results.balanceIssues.length})`);
|
|
546
|
+
lines.push('');
|
|
547
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
548
|
+
lines.push('|-------|-----|-----------|');
|
|
549
|
+
for (const issue of results.balanceIssues) {
|
|
550
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
551
|
+
}
|
|
552
|
+
lines.push('');
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
// No issues
|
|
556
|
+
if (allIssues.length === 0) {
|
|
557
|
+
lines.push('No issues found.');
|
|
558
|
+
lines.push('');
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
return lines.join('\n');
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
/**
|
|
565
|
+
* Generate summary report for multiple documentation analyses
|
|
566
|
+
* @param {Array} allResults - Array of docs analysis results
|
|
567
|
+
* @param {Object} options - Report options
|
|
568
|
+
* @returns {string} Markdown report
|
|
569
|
+
*/
|
|
570
|
+
function generateDocsSummaryReport(allResults, options = {}) {
|
|
571
|
+
const lines = [];
|
|
572
|
+
|
|
573
|
+
// Determine mode from first result
|
|
574
|
+
const mode = allResults[0]?.mode || 'both';
|
|
575
|
+
|
|
576
|
+
lines.push('# Documentation Analysis Summary');
|
|
577
|
+
lines.push('');
|
|
578
|
+
lines.push(`**Analyzed**: ${allResults.length} documents`);
|
|
579
|
+
lines.push(`**Mode**: ${mode === 'ai' ? 'AI-only (RAG optimized)' : 'Both audiences'}`);
|
|
580
|
+
lines.push(`**Date**: ${new Date().toISOString()}`);
|
|
581
|
+
lines.push('');
|
|
582
|
+
|
|
583
|
+
// Overall stats
|
|
584
|
+
let totalHigh = 0;
|
|
585
|
+
let totalMedium = 0;
|
|
586
|
+
let totalLow = 0;
|
|
587
|
+
let totalTokens = 0;
|
|
588
|
+
|
|
589
|
+
for (const result of allResults) {
|
|
590
|
+
const allIssues = [
|
|
591
|
+
...(result.linkIssues || []),
|
|
592
|
+
...(result.structureIssues || []),
|
|
593
|
+
...(result.codeIssues || []),
|
|
594
|
+
...(result.efficiencyIssues || []),
|
|
595
|
+
...(result.ragIssues || []),
|
|
596
|
+
...(result.balanceIssues || [])
|
|
597
|
+
];
|
|
598
|
+
totalHigh += countByCertainty(allIssues, 'HIGH');
|
|
599
|
+
totalMedium += countByCertainty(allIssues, 'MEDIUM');
|
|
600
|
+
totalLow += countByCertainty(allIssues, 'LOW');
|
|
601
|
+
totalTokens += result.tokenCount || 0;
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
lines.push('## Overall');
|
|
605
|
+
lines.push('');
|
|
606
|
+
lines.push(`**Total Tokens**: ~${totalTokens}`);
|
|
607
|
+
lines.push('');
|
|
608
|
+
lines.push('| Certainty | Count |');
|
|
609
|
+
lines.push('|-----------|-------|');
|
|
610
|
+
lines.push(`| HIGH | ${totalHigh} |`);
|
|
611
|
+
lines.push(`| MEDIUM | ${totalMedium} |`);
|
|
612
|
+
if (options.verbose) {
|
|
613
|
+
lines.push(`| LOW | ${totalLow} |`);
|
|
614
|
+
}
|
|
615
|
+
lines.push('');
|
|
616
|
+
|
|
617
|
+
// Per-document summary
|
|
618
|
+
lines.push('## By Document');
|
|
619
|
+
lines.push('');
|
|
620
|
+
lines.push('| Document | Tokens | HIGH | MEDIUM | LOW | Total |');
|
|
621
|
+
lines.push('|----------|--------|------|--------|-----|-------|');
|
|
622
|
+
|
|
623
|
+
for (const result of allResults) {
|
|
624
|
+
const allIssues = [
|
|
625
|
+
...(result.linkIssues || []),
|
|
626
|
+
...(result.structureIssues || []),
|
|
627
|
+
...(result.codeIssues || []),
|
|
628
|
+
...(result.efficiencyIssues || []),
|
|
629
|
+
...(result.ragIssues || []),
|
|
630
|
+
...(result.balanceIssues || [])
|
|
631
|
+
];
|
|
632
|
+
const h = countByCertainty(allIssues, 'HIGH');
|
|
633
|
+
const m = countByCertainty(allIssues, 'MEDIUM');
|
|
634
|
+
const l = countByCertainty(allIssues, 'LOW');
|
|
635
|
+
lines.push(`| ${result.docName} | ${result.tokenCount} | ${h} | ${m} | ${l} | ${h + m + l} |`);
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
lines.push('');
|
|
639
|
+
|
|
640
|
+
return lines.join('\n');
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
/**
|
|
644
|
+
* Generate report for project memory file analysis
|
|
645
|
+
* @param {Object} results - Project memory analysis results
|
|
646
|
+
* @param {Object} options - Report options
|
|
647
|
+
* @returns {string} Markdown report
|
|
648
|
+
*/
|
|
649
|
+
function generateProjectMemoryReport(results, options = {}) {
|
|
650
|
+
const lines = [];
|
|
651
|
+
|
|
652
|
+
if (results.error) {
|
|
653
|
+
lines.push(`# Project Memory Analysis: Error`);
|
|
654
|
+
lines.push('');
|
|
655
|
+
lines.push(`**Error**: ${results.error}`);
|
|
656
|
+
lines.push('');
|
|
657
|
+
if (results.searchedPaths) {
|
|
658
|
+
lines.push('Searched paths:');
|
|
659
|
+
for (const p of results.searchedPaths) {
|
|
660
|
+
lines.push(`- ${p}`);
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
return lines.join('\n');
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
lines.push(`# Project Memory Analysis: ${results.fileName}`);
|
|
667
|
+
lines.push('');
|
|
668
|
+
lines.push(`**File**: ${results.filePath}`);
|
|
669
|
+
lines.push(`**Type**: ${results.fileType === 'agents' ? 'AGENTS.md (cross-platform)' : 'CLAUDE.md'}`);
|
|
670
|
+
lines.push(`**Analyzed**: ${new Date().toISOString()}`);
|
|
671
|
+
lines.push('');
|
|
672
|
+
|
|
673
|
+
if (results.metrics) {
|
|
674
|
+
lines.push('## Metrics');
|
|
675
|
+
lines.push('');
|
|
676
|
+
lines.push('| Metric | Value |');
|
|
677
|
+
lines.push('|--------|-------|');
|
|
678
|
+
lines.push(`| Estimated Tokens | ${results.metrics.estimatedTokens} |`);
|
|
679
|
+
lines.push(`| Characters | ${results.metrics.characterCount} |`);
|
|
680
|
+
lines.push(`| Lines | ${results.metrics.lineCount} |`);
|
|
681
|
+
lines.push(`| Words | ${results.metrics.wordCount} |`);
|
|
682
|
+
if (results.metrics.readmeOverlap !== undefined) {
|
|
683
|
+
lines.push(`| README Overlap | ${Math.round(results.metrics.readmeOverlap * 100)}% |`);
|
|
684
|
+
}
|
|
685
|
+
lines.push('');
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
const allIssues = [
|
|
689
|
+
...(results.structureIssues || []),
|
|
690
|
+
...(results.referenceIssues || []),
|
|
691
|
+
...(results.efficiencyIssues || []),
|
|
692
|
+
...(results.qualityIssues || []),
|
|
693
|
+
...(results.crossPlatformIssues || [])
|
|
694
|
+
];
|
|
695
|
+
|
|
696
|
+
// Count by certainty
|
|
697
|
+
const highCount = countByCertainty(allIssues, 'HIGH');
|
|
698
|
+
const mediumCount = countByCertainty(allIssues, 'MEDIUM');
|
|
699
|
+
const lowCount = countByCertainty(allIssues, 'LOW');
|
|
700
|
+
|
|
701
|
+
lines.push('## Summary');
|
|
702
|
+
lines.push('');
|
|
703
|
+
lines.push('| Certainty | Count |');
|
|
704
|
+
lines.push('|-----------|-------|');
|
|
705
|
+
lines.push(`| HIGH | ${highCount} |`);
|
|
706
|
+
lines.push(`| MEDIUM | ${mediumCount} |`);
|
|
707
|
+
if (options.verbose) {
|
|
708
|
+
lines.push(`| LOW | ${lowCount} |`);
|
|
709
|
+
}
|
|
710
|
+
lines.push(`| **Total** | **${allIssues.length}** |`);
|
|
711
|
+
lines.push('');
|
|
712
|
+
|
|
713
|
+
if (results.structureIssues && results.structureIssues.length > 0) {
|
|
714
|
+
lines.push(`### Structure Issues (${results.structureIssues.length})`);
|
|
715
|
+
lines.push('');
|
|
716
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
717
|
+
lines.push('|-------|-----|-----------|');
|
|
718
|
+
for (const issue of results.structureIssues) {
|
|
719
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
720
|
+
}
|
|
721
|
+
lines.push('');
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
if (results.referenceIssues && results.referenceIssues.length > 0) {
|
|
725
|
+
lines.push(`### Reference Issues (${results.referenceIssues.length})`);
|
|
726
|
+
lines.push('');
|
|
727
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
728
|
+
lines.push('|-------|-----|-----------|');
|
|
729
|
+
for (const issue of results.referenceIssues) {
|
|
730
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
731
|
+
}
|
|
732
|
+
lines.push('');
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
if (results.efficiencyIssues && results.efficiencyIssues.length > 0) {
|
|
736
|
+
lines.push(`### Efficiency Issues (${results.efficiencyIssues.length})`);
|
|
737
|
+
lines.push('');
|
|
738
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
739
|
+
lines.push('|-------|-----|-----------|');
|
|
740
|
+
for (const issue of results.efficiencyIssues) {
|
|
741
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
742
|
+
}
|
|
743
|
+
lines.push('');
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
if (results.qualityIssues && results.qualityIssues.length > 0) {
|
|
747
|
+
lines.push(`### Quality Issues (${results.qualityIssues.length})`);
|
|
748
|
+
lines.push('');
|
|
749
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
750
|
+
lines.push('|-------|-----|-----------|');
|
|
751
|
+
for (const issue of results.qualityIssues) {
|
|
752
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
753
|
+
}
|
|
754
|
+
lines.push('');
|
|
755
|
+
}
|
|
756
|
+
|
|
757
|
+
// Cross-Platform Issues
|
|
758
|
+
if (results.crossPlatformIssues && results.crossPlatformIssues.length > 0) {
|
|
759
|
+
lines.push(`### Cross-Platform Issues (${results.crossPlatformIssues.length})`);
|
|
760
|
+
lines.push('');
|
|
761
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
762
|
+
lines.push('|-------|-----|-----------|');
|
|
763
|
+
for (const issue of results.crossPlatformIssues) {
|
|
764
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
765
|
+
}
|
|
766
|
+
lines.push('');
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
if (allIssues.length === 0) {
|
|
770
|
+
lines.push('No issues found.');
|
|
771
|
+
lines.push('');
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
return lines.join('\n');
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
/**
|
|
778
|
+
* Generate summary report for multiple project memory analyses
|
|
779
|
+
* @param {Array} allResults - Array of project memory analysis results
|
|
780
|
+
* @param {Object} options - Report options
|
|
781
|
+
* @returns {string} Markdown report
|
|
782
|
+
*/
|
|
783
|
+
function generateProjectMemorySummaryReport(allResults, options = {}) {
|
|
784
|
+
const lines = [];
|
|
785
|
+
|
|
786
|
+
lines.push('# Project Memory Analysis Summary');
|
|
787
|
+
lines.push('');
|
|
788
|
+
lines.push(`**Analyzed**: ${allResults.length} files`);
|
|
789
|
+
lines.push(`**Date**: ${new Date().toISOString()}`);
|
|
790
|
+
lines.push('');
|
|
791
|
+
|
|
792
|
+
// Overall stats
|
|
793
|
+
let totalHigh = 0;
|
|
794
|
+
let totalMedium = 0;
|
|
795
|
+
let totalLow = 0;
|
|
796
|
+
let totalTokens = 0;
|
|
797
|
+
|
|
798
|
+
for (const result of allResults) {
|
|
799
|
+
if (result.error) continue;
|
|
800
|
+
|
|
801
|
+
const allIssues = [
|
|
802
|
+
...(result.structureIssues || []),
|
|
803
|
+
...(result.referenceIssues || []),
|
|
804
|
+
...(result.efficiencyIssues || []),
|
|
805
|
+
...(result.qualityIssues || []),
|
|
806
|
+
...(result.crossPlatformIssues || [])
|
|
807
|
+
];
|
|
808
|
+
totalHigh += countByCertainty(allIssues, 'HIGH');
|
|
809
|
+
totalMedium += countByCertainty(allIssues, 'MEDIUM');
|
|
810
|
+
totalLow += countByCertainty(allIssues, 'LOW');
|
|
811
|
+
|
|
812
|
+
if (result.metrics) {
|
|
813
|
+
totalTokens += result.metrics.estimatedTokens || 0;
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
lines.push('## Overall');
|
|
818
|
+
lines.push('');
|
|
819
|
+
lines.push('| Metric | Value |');
|
|
820
|
+
lines.push('|--------|-------|');
|
|
821
|
+
lines.push(`| Total Tokens | ${totalTokens} |`);
|
|
822
|
+
lines.push(`| HIGH Issues | ${totalHigh} |`);
|
|
823
|
+
lines.push(`| MEDIUM Issues | ${totalMedium} |`);
|
|
824
|
+
if (options.verbose) {
|
|
825
|
+
lines.push(`| LOW Issues | ${totalLow} |`);
|
|
826
|
+
}
|
|
827
|
+
lines.push('');
|
|
828
|
+
|
|
829
|
+
lines.push('## By File');
|
|
830
|
+
lines.push('');
|
|
831
|
+
lines.push('| File | Tokens | HIGH | MEDIUM | LOW | Total |');
|
|
832
|
+
lines.push('|------|--------|------|--------|-----|-------|');
|
|
833
|
+
|
|
834
|
+
for (const result of allResults) {
|
|
835
|
+
if (result.error) {
|
|
836
|
+
lines.push(`| ${result.filePath || 'Unknown'} | - | Error | - | - | - |`);
|
|
837
|
+
continue;
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
const allIssues = [
|
|
841
|
+
...(result.structureIssues || []),
|
|
842
|
+
...(result.referenceIssues || []),
|
|
843
|
+
...(result.efficiencyIssues || []),
|
|
844
|
+
...(result.qualityIssues || []),
|
|
845
|
+
...(result.crossPlatformIssues || [])
|
|
846
|
+
];
|
|
847
|
+
const h = countByCertainty(allIssues, 'HIGH');
|
|
848
|
+
const m = countByCertainty(allIssues, 'MEDIUM');
|
|
849
|
+
const l = countByCertainty(allIssues, 'LOW');
|
|
850
|
+
const tokens = result.metrics?.estimatedTokens || '-';
|
|
851
|
+
lines.push(`| ${result.fileName} | ${tokens} | ${h} | ${m} | ${l} | ${h + m + l} |`);
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
lines.push('');
|
|
855
|
+
|
|
856
|
+
return lines.join('\n');
|
|
857
|
+
}
|
|
858
|
+
/**
|
|
859
|
+
* Generate report for a single prompt analysis
|
|
860
|
+
* @param {Object} results - Prompt analysis results
|
|
861
|
+
* @param {Object} options - Report options
|
|
862
|
+
* @returns {string} Markdown report
|
|
863
|
+
*/
|
|
864
|
+
function generatePromptReport(results, options = {}) {
|
|
865
|
+
const lines = [];
|
|
866
|
+
|
|
867
|
+
lines.push(`# Prompt Analysis: ${results.promptName}`);
|
|
868
|
+
lines.push('');
|
|
869
|
+
lines.push(`**File**: ${results.promptPath}`);
|
|
870
|
+
lines.push(`**Type**: ${results.promptType || 'unknown'}`);
|
|
871
|
+
lines.push(`**Token Count**: ~${results.tokenCount}`);
|
|
872
|
+
lines.push(`**Analyzed**: ${new Date().toISOString()}`);
|
|
873
|
+
lines.push('');
|
|
874
|
+
|
|
875
|
+
// Collect all issues
|
|
876
|
+
const allIssues = [
|
|
877
|
+
...(results.clarityIssues || []),
|
|
878
|
+
...(results.structureIssues || []),
|
|
879
|
+
...(results.exampleIssues || []),
|
|
880
|
+
...(results.contextIssues || []),
|
|
881
|
+
...(results.outputIssues || []),
|
|
882
|
+
...(results.antiPatternIssues || []),
|
|
883
|
+
...(results.codeValidationIssues || [])
|
|
884
|
+
];
|
|
885
|
+
|
|
886
|
+
// Count by certainty
|
|
887
|
+
const highCount = countByCertainty(allIssues, 'HIGH');
|
|
888
|
+
const mediumCount = countByCertainty(allIssues, 'MEDIUM');
|
|
889
|
+
const lowCount = countByCertainty(allIssues, 'LOW');
|
|
890
|
+
|
|
891
|
+
lines.push('## Summary');
|
|
892
|
+
lines.push('');
|
|
893
|
+
lines.push('| Certainty | Count |');
|
|
894
|
+
lines.push('|-----------|-------|');
|
|
895
|
+
lines.push(`| HIGH | ${highCount} |`);
|
|
896
|
+
lines.push(`| MEDIUM | ${mediumCount} |`);
|
|
897
|
+
if (options.verbose) {
|
|
898
|
+
lines.push(`| LOW | ${lowCount} |`);
|
|
899
|
+
}
|
|
900
|
+
lines.push('');
|
|
901
|
+
|
|
902
|
+
// Clarity Issues
|
|
903
|
+
if (results.clarityIssues && results.clarityIssues.length > 0) {
|
|
904
|
+
lines.push(`### Clarity Issues (${results.clarityIssues.length})`);
|
|
905
|
+
lines.push('');
|
|
906
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
907
|
+
lines.push('|-------|-----|-----------|');
|
|
908
|
+
for (const issue of results.clarityIssues) {
|
|
909
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
910
|
+
}
|
|
911
|
+
lines.push('');
|
|
912
|
+
}
|
|
913
|
+
|
|
914
|
+
// Structure Issues
|
|
915
|
+
if (results.structureIssues && results.structureIssues.length > 0) {
|
|
916
|
+
lines.push(`### Structure Issues (${results.structureIssues.length})`);
|
|
917
|
+
lines.push('');
|
|
918
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
919
|
+
lines.push('|-------|-----|-----------|');
|
|
920
|
+
for (const issue of results.structureIssues) {
|
|
921
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
922
|
+
}
|
|
923
|
+
lines.push('');
|
|
924
|
+
}
|
|
925
|
+
|
|
926
|
+
// Example Issues
|
|
927
|
+
if (results.exampleIssues && results.exampleIssues.length > 0) {
|
|
928
|
+
lines.push(`### Example Issues (${results.exampleIssues.length})`);
|
|
929
|
+
lines.push('');
|
|
930
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
931
|
+
lines.push('|-------|-----|-----------|');
|
|
932
|
+
for (const issue of results.exampleIssues) {
|
|
933
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
934
|
+
}
|
|
935
|
+
lines.push('');
|
|
936
|
+
}
|
|
937
|
+
|
|
938
|
+
// Context Issues
|
|
939
|
+
if (results.contextIssues && results.contextIssues.length > 0) {
|
|
940
|
+
lines.push(`### Context Issues (${results.contextIssues.length})`);
|
|
941
|
+
lines.push('');
|
|
942
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
943
|
+
lines.push('|-------|-----|-----------|');
|
|
944
|
+
for (const issue of results.contextIssues) {
|
|
945
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
946
|
+
}
|
|
947
|
+
lines.push('');
|
|
948
|
+
}
|
|
949
|
+
|
|
950
|
+
// Output Issues
|
|
951
|
+
if (results.outputIssues && results.outputIssues.length > 0) {
|
|
952
|
+
lines.push(`### Output Format Issues (${results.outputIssues.length})`);
|
|
953
|
+
lines.push('');
|
|
954
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
955
|
+
lines.push('|-------|-----|-----------|');
|
|
956
|
+
for (const issue of results.outputIssues) {
|
|
957
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
958
|
+
}
|
|
959
|
+
lines.push('');
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
// Anti-Pattern Issues
|
|
963
|
+
if (results.antiPatternIssues && results.antiPatternIssues.length > 0) {
|
|
964
|
+
lines.push(`### Anti-Pattern Issues (${results.antiPatternIssues.length})`);
|
|
965
|
+
lines.push('');
|
|
966
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
967
|
+
lines.push('|-------|-----|-----------|');
|
|
968
|
+
for (const issue of results.antiPatternIssues) {
|
|
969
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
970
|
+
}
|
|
971
|
+
lines.push('');
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
// Code Validation Issues
|
|
975
|
+
if (results.codeValidationIssues && results.codeValidationIssues.length > 0) {
|
|
976
|
+
lines.push(`### Code Validation Issues (${results.codeValidationIssues.length})`);
|
|
977
|
+
lines.push('');
|
|
978
|
+
lines.push('| Issue | Fix | Certainty |');
|
|
979
|
+
lines.push('|-------|-----|-----------|');
|
|
980
|
+
for (const issue of results.codeValidationIssues) {
|
|
981
|
+
lines.push(`| ${issue.issue} | ${issue.fix || 'N/A'} | ${issue.certainty} |`);
|
|
982
|
+
}
|
|
983
|
+
lines.push('');
|
|
984
|
+
}
|
|
985
|
+
|
|
986
|
+
// No issues
|
|
987
|
+
if (allIssues.length === 0) {
|
|
988
|
+
lines.push('No issues found.');
|
|
989
|
+
lines.push('');
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
return lines.join('\n');
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
/**
|
|
996
|
+
* Generate summary report for multiple prompt analyses
|
|
997
|
+
* @param {Array} allResults - Array of prompt analysis results
|
|
998
|
+
* @param {Object} options - Report options
|
|
999
|
+
* @returns {string} Markdown report
|
|
1000
|
+
*/
|
|
1001
|
+
function generatePromptSummaryReport(allResults, options = {}) {
|
|
1002
|
+
const lines = [];
|
|
1003
|
+
|
|
1004
|
+
lines.push('# Prompt Analysis Summary');
|
|
1005
|
+
lines.push('');
|
|
1006
|
+
lines.push(`**Analyzed**: ${allResults.length} prompts`);
|
|
1007
|
+
lines.push(`**Date**: ${new Date().toISOString()}`);
|
|
1008
|
+
lines.push('');
|
|
1009
|
+
|
|
1010
|
+
// Overall stats
|
|
1011
|
+
let totalHigh = 0;
|
|
1012
|
+
let totalMedium = 0;
|
|
1013
|
+
let totalLow = 0;
|
|
1014
|
+
let totalTokens = 0;
|
|
1015
|
+
|
|
1016
|
+
for (const result of allResults) {
|
|
1017
|
+
const allIssues = [
|
|
1018
|
+
...(result.clarityIssues || []),
|
|
1019
|
+
...(result.structureIssues || []),
|
|
1020
|
+
...(result.exampleIssues || []),
|
|
1021
|
+
...(result.contextIssues || []),
|
|
1022
|
+
...(result.outputIssues || []),
|
|
1023
|
+
...(result.antiPatternIssues || []),
|
|
1024
|
+
...(result.codeValidationIssues || [])
|
|
1025
|
+
];
|
|
1026
|
+
totalHigh += countByCertainty(allIssues, 'HIGH');
|
|
1027
|
+
totalMedium += countByCertainty(allIssues, 'MEDIUM');
|
|
1028
|
+
totalLow += countByCertainty(allIssues, 'LOW');
|
|
1029
|
+
totalTokens += result.tokenCount || 0;
|
|
1030
|
+
}
|
|
1031
|
+
|
|
1032
|
+
lines.push('## Overall');
|
|
1033
|
+
lines.push('');
|
|
1034
|
+
lines.push(`**Total Tokens**: ~${totalTokens}`);
|
|
1035
|
+
lines.push('');
|
|
1036
|
+
lines.push('| Certainty | Count |');
|
|
1037
|
+
lines.push('|-----------|-------|');
|
|
1038
|
+
lines.push(`| HIGH | ${totalHigh} |`);
|
|
1039
|
+
lines.push(`| MEDIUM | ${totalMedium} |`);
|
|
1040
|
+
if (options.verbose) {
|
|
1041
|
+
lines.push(`| LOW | ${totalLow} |`);
|
|
1042
|
+
}
|
|
1043
|
+
lines.push('');
|
|
1044
|
+
|
|
1045
|
+
// Per-prompt summary
|
|
1046
|
+
lines.push('## By Prompt');
|
|
1047
|
+
lines.push('');
|
|
1048
|
+
lines.push('| Prompt | Type | Tokens | HIGH | MEDIUM | LOW | Total |');
|
|
1049
|
+
lines.push('|--------|------|--------|------|--------|-----|-------|');
|
|
1050
|
+
|
|
1051
|
+
for (const result of allResults) {
|
|
1052
|
+
const allIssues = [
|
|
1053
|
+
...(result.clarityIssues || []),
|
|
1054
|
+
...(result.structureIssues || []),
|
|
1055
|
+
...(result.exampleIssues || []),
|
|
1056
|
+
...(result.contextIssues || []),
|
|
1057
|
+
...(result.outputIssues || []),
|
|
1058
|
+
...(result.antiPatternIssues || []),
|
|
1059
|
+
...(result.codeValidationIssues || [])
|
|
1060
|
+
];
|
|
1061
|
+
const h = countByCertainty(allIssues, 'HIGH');
|
|
1062
|
+
const m = countByCertainty(allIssues, 'MEDIUM');
|
|
1063
|
+
const l = countByCertainty(allIssues, 'LOW');
|
|
1064
|
+
lines.push(`| ${result.promptName} | ${result.promptType || '-'} | ${result.tokenCount} | ${h} | ${m} | ${l} | ${h + m + l} |`);
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
lines.push('');
|
|
1068
|
+
|
|
1069
|
+
return lines.join('\n');
|
|
1070
|
+
}
|
|
1071
|
+
|
|
1072
|
+
/**
|
|
1073
|
+
* Generate unified report for orchestrator aggregated results
|
|
1074
|
+
* @param {Object} aggregatedResults - Aggregated results from all enhancers
|
|
1075
|
+
* @param {Array} aggregatedResults.findings - All findings from all enhancers
|
|
1076
|
+
* @param {Object} aggregatedResults.byEnhancer - Summary counts per enhancer
|
|
1077
|
+
* @param {Object} aggregatedResults.totals - Overall totals
|
|
1078
|
+
* @param {Object} options - Report options
|
|
1079
|
+
* @param {boolean} options.verbose - Include LOW certainty issues
|
|
1080
|
+
* @param {boolean} options.showAutoFixable - Highlight auto-fixable issues
|
|
1081
|
+
* @param {string} options.targetPath - Target path analyzed
|
|
1082
|
+
* @returns {string} Unified markdown report
|
|
1083
|
+
*/
|
|
1084
|
+
function generateOrchestratorReport(aggregatedResults, options = {}) {
|
|
1085
|
+
const { verbose = false, showAutoFixable = false, targetPath = '.' } = options;
|
|
1086
|
+
const lines = [];
|
|
1087
|
+
|
|
1088
|
+
// Header
|
|
1089
|
+
lines.push('# Enhancement Analysis Report');
|
|
1090
|
+
lines.push('');
|
|
1091
|
+
lines.push(`**Target**: ${targetPath}`);
|
|
1092
|
+
lines.push(`**Analyzed**: ${new Date().toISOString()}`);
|
|
1093
|
+
lines.push(`**Enhancers Run**: ${Object.keys(aggregatedResults?.byEnhancer || {}).join(', ') || 'none'}`);
|
|
1094
|
+
lines.push('');
|
|
1095
|
+
|
|
1096
|
+
// Deduplicate findings - ensure array input
|
|
1097
|
+
const rawFindings = Array.isArray(aggregatedResults?.findings) ? aggregatedResults.findings : [];
|
|
1098
|
+
const dedupedFindings = deduplicateOrchestratorFindings(rawFindings);
|
|
1099
|
+
|
|
1100
|
+
// Count auto-fixable
|
|
1101
|
+
const autoFixableCount = dedupedFindings.filter(f => f.certainty === 'HIGH' && f.autoFixable).length;
|
|
1102
|
+
|
|
1103
|
+
// Executive Summary Table
|
|
1104
|
+
lines.push('## Executive Summary');
|
|
1105
|
+
lines.push('');
|
|
1106
|
+
lines.push('| Enhancer | HIGH | MEDIUM | LOW | Auto-Fixable |');
|
|
1107
|
+
lines.push('|----------|------|--------|-----|--------------|');
|
|
1108
|
+
|
|
1109
|
+
const enhancerTypes = ['plugin', 'agent', 'claudemd', 'docs', 'prompt', 'hooks', 'skills'];
|
|
1110
|
+
let totalHigh = 0, totalMedium = 0, totalLow = 0, totalAutoFix = 0;
|
|
1111
|
+
|
|
1112
|
+
for (const enhancer of enhancerTypes) {
|
|
1113
|
+
const enhancerFindings = dedupedFindings.filter(f => f.source === enhancer);
|
|
1114
|
+
const high = enhancerFindings.filter(f => f.certainty === 'HIGH').length;
|
|
1115
|
+
const medium = enhancerFindings.filter(f => f.certainty === 'MEDIUM').length;
|
|
1116
|
+
const low = enhancerFindings.filter(f => f.certainty === 'LOW').length;
|
|
1117
|
+
const autoFix = enhancerFindings.filter(f => f.certainty === 'HIGH' && f.autoFixable).length;
|
|
1118
|
+
|
|
1119
|
+
if (high > 0 || medium > 0 || low > 0) {
|
|
1120
|
+
lines.push(`| ${enhancer} | ${high} | ${medium} | ${low} | ${autoFix} |`);
|
|
1121
|
+
totalHigh += high;
|
|
1122
|
+
totalMedium += medium;
|
|
1123
|
+
totalLow += low;
|
|
1124
|
+
totalAutoFix += autoFix;
|
|
1125
|
+
}
|
|
1126
|
+
}
|
|
1127
|
+
|
|
1128
|
+
lines.push(`| **Total** | **${totalHigh}** | **${totalMedium}** | **${totalLow}** | **${totalAutoFix}** |`);
|
|
1129
|
+
lines.push('');
|
|
1130
|
+
|
|
1131
|
+
// Auto-Learned Suppressions Section (before "Clean" status)
|
|
1132
|
+
if (options.autoLearned && options.autoLearned.length > 0) {
|
|
1133
|
+
lines.push('## Auto-Learned Suppressions');
|
|
1134
|
+
lines.push('');
|
|
1135
|
+
lines.push(`Learned ${options.autoLearned.length} new false positives:`);
|
|
1136
|
+
lines.push('');
|
|
1137
|
+
|
|
1138
|
+
// Group by pattern
|
|
1139
|
+
const byPattern = {};
|
|
1140
|
+
options.autoLearned.forEach(s => {
|
|
1141
|
+
if (!byPattern[s.patternId]) {
|
|
1142
|
+
byPattern[s.patternId] = [];
|
|
1143
|
+
}
|
|
1144
|
+
byPattern[s.patternId].push(s);
|
|
1145
|
+
});
|
|
1146
|
+
|
|
1147
|
+
for (const [patternId, items] of Object.entries(byPattern)) {
|
|
1148
|
+
const maxConf = Math.max(...items.map(i => i.confidence || 0));
|
|
1149
|
+
lines.push(`- **${patternId}**: ${items.length} file(s) (confidence: ${(maxConf * 100).toFixed(0)}%)`);
|
|
1150
|
+
}
|
|
1151
|
+
lines.push('');
|
|
1152
|
+
}
|
|
1153
|
+
|
|
1154
|
+
// No issues case
|
|
1155
|
+
if (dedupedFindings.length === 0) {
|
|
1156
|
+
lines.push('## Status: Clean');
|
|
1157
|
+
lines.push('');
|
|
1158
|
+
lines.push('No issues found.');
|
|
1159
|
+
lines.push('');
|
|
1160
|
+
return lines.join('\n');
|
|
1161
|
+
}
|
|
1162
|
+
|
|
1163
|
+
lines.push('---');
|
|
1164
|
+
lines.push('');
|
|
1165
|
+
|
|
1166
|
+
// HIGH Certainty Issues
|
|
1167
|
+
const highFindings = dedupedFindings.filter(f => f.certainty === 'HIGH');
|
|
1168
|
+
if (highFindings.length > 0) {
|
|
1169
|
+
lines.push(`## HIGH Certainty Issues (${highFindings.length})`);
|
|
1170
|
+
lines.push('');
|
|
1171
|
+
lines.push('Issues that should be fixed. Auto-fixable issues marked with [AF].');
|
|
1172
|
+
lines.push('');
|
|
1173
|
+
|
|
1174
|
+
// Group by source
|
|
1175
|
+
const bySource = groupBySource(highFindings);
|
|
1176
|
+
for (const [source, findings] of Object.entries(bySource)) {
|
|
1177
|
+
lines.push(`### ${capitalizeFirst(source)} Issues (${findings.length})`);
|
|
1178
|
+
lines.push('');
|
|
1179
|
+
lines.push('| File | Line | Issue | Fix | [AF] |');
|
|
1180
|
+
lines.push('|------|------|-------|-----|------|');
|
|
1181
|
+
for (const finding of findings) {
|
|
1182
|
+
const af = finding.autoFixable ? 'Yes' : 'No';
|
|
1183
|
+
const line = finding.line || '-';
|
|
1184
|
+
lines.push(`| ${finding.file || '-'} | ${line} | ${finding.issue} | ${finding.fix || '-'} | ${af} |`);
|
|
1185
|
+
}
|
|
1186
|
+
lines.push('');
|
|
1187
|
+
}
|
|
1188
|
+
|
|
1189
|
+
lines.push('---');
|
|
1190
|
+
lines.push('');
|
|
1191
|
+
}
|
|
1192
|
+
|
|
1193
|
+
// MEDIUM Certainty Issues
|
|
1194
|
+
const mediumFindings = dedupedFindings.filter(f => f.certainty === 'MEDIUM');
|
|
1195
|
+
if (mediumFindings.length > 0) {
|
|
1196
|
+
lines.push(`## MEDIUM Certainty Issues (${mediumFindings.length})`);
|
|
1197
|
+
lines.push('');
|
|
1198
|
+
lines.push('Issues that likely need attention. Verify context before fixing.');
|
|
1199
|
+
lines.push('');
|
|
1200
|
+
|
|
1201
|
+
const bySource = groupBySource(mediumFindings);
|
|
1202
|
+
for (const [source, findings] of Object.entries(bySource)) {
|
|
1203
|
+
lines.push(`### ${capitalizeFirst(source)} Issues (${findings.length})`);
|
|
1204
|
+
lines.push('');
|
|
1205
|
+
lines.push('| File | Line | Issue | Fix |');
|
|
1206
|
+
lines.push('|------|------|-------|-----|');
|
|
1207
|
+
for (const finding of findings) {
|
|
1208
|
+
const line = finding.line || '-';
|
|
1209
|
+
lines.push(`| ${finding.file || '-'} | ${line} | ${finding.issue} | ${finding.fix || '-'} |`);
|
|
1210
|
+
}
|
|
1211
|
+
lines.push('');
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1214
|
+
lines.push('---');
|
|
1215
|
+
lines.push('');
|
|
1216
|
+
}
|
|
1217
|
+
|
|
1218
|
+
// LOW Certainty Issues (verbose only)
|
|
1219
|
+
const lowFindings = dedupedFindings.filter(f => f.certainty === 'LOW');
|
|
1220
|
+
if (verbose && lowFindings.length > 0) {
|
|
1221
|
+
lines.push(`## LOW Certainty Issues (${lowFindings.length})`);
|
|
1222
|
+
lines.push('');
|
|
1223
|
+
lines.push('Advisory suggestions. Consider based on project needs.');
|
|
1224
|
+
lines.push('');
|
|
1225
|
+
|
|
1226
|
+
const bySource = groupBySource(lowFindings);
|
|
1227
|
+
for (const [source, findings] of Object.entries(bySource)) {
|
|
1228
|
+
lines.push(`### ${capitalizeFirst(source)} Issues (${findings.length})`);
|
|
1229
|
+
lines.push('');
|
|
1230
|
+
lines.push('| File | Line | Issue | Fix |');
|
|
1231
|
+
lines.push('|------|------|-------|-----|');
|
|
1232
|
+
for (const finding of findings) {
|
|
1233
|
+
const line = finding.line || '-';
|
|
1234
|
+
lines.push(`| ${finding.file || '-'} | ${line} | ${finding.issue} | ${finding.fix || '-'} |`);
|
|
1235
|
+
}
|
|
1236
|
+
lines.push('');
|
|
1237
|
+
}
|
|
1238
|
+
|
|
1239
|
+
lines.push('---');
|
|
1240
|
+
lines.push('');
|
|
1241
|
+
}
|
|
1242
|
+
|
|
1243
|
+
// Auto-Fix Summary
|
|
1244
|
+
if (showAutoFixable && autoFixableCount > 0) {
|
|
1245
|
+
lines.push('## Auto-Fix Summary');
|
|
1246
|
+
lines.push('');
|
|
1247
|
+
lines.push(`**${autoFixableCount} issues can be automatically fixed** with \`--apply\` flag:`);
|
|
1248
|
+
lines.push('');
|
|
1249
|
+
lines.push('| Enhancer | Issue Type | Count |');
|
|
1250
|
+
lines.push('|----------|------------|-------|');
|
|
1251
|
+
|
|
1252
|
+
// Group auto-fixable by enhancer and issue type
|
|
1253
|
+
const autoFixable = dedupedFindings.filter(f => f.certainty === 'HIGH' && f.autoFixable);
|
|
1254
|
+
const grouped = {};
|
|
1255
|
+
for (const finding of autoFixable) {
|
|
1256
|
+
const key = `${finding.source}|${finding.category || 'general'}`;
|
|
1257
|
+
if (!grouped[key]) {
|
|
1258
|
+
grouped[key] = { source: finding.source, category: finding.category || 'general', count: 0 };
|
|
1259
|
+
}
|
|
1260
|
+
grouped[key].count++;
|
|
1261
|
+
}
|
|
1262
|
+
|
|
1263
|
+
for (const item of Object.values(grouped)) {
|
|
1264
|
+
lines.push(`| ${item.source} | ${item.category} | ${item.count} |`);
|
|
1265
|
+
}
|
|
1266
|
+
lines.push(`| **Total** | | **${autoFixableCount}** |`);
|
|
1267
|
+
lines.push('');
|
|
1268
|
+
lines.push('Run `/enhance --apply` to fix these automatically.');
|
|
1269
|
+
lines.push('');
|
|
1270
|
+
}
|
|
1271
|
+
|
|
1272
|
+
return lines.join('\n');
|
|
1273
|
+
}
|
|
1274
|
+
|
|
1275
|
+
/**
|
|
1276
|
+
* Deduplicate findings from multiple enhancers
|
|
1277
|
+
* @param {Array} findings - All findings
|
|
1278
|
+
* @returns {Array} Deduplicated findings
|
|
1279
|
+
*/
|
|
1280
|
+
function deduplicateOrchestratorFindings(findings) {
|
|
1281
|
+
const seen = new Map();
|
|
1282
|
+
|
|
1283
|
+
for (const finding of findings) {
|
|
1284
|
+
// Create hash for deduplication
|
|
1285
|
+
const hash = [
|
|
1286
|
+
finding.file || '',
|
|
1287
|
+
finding.line || 0,
|
|
1288
|
+
(finding.issue || '').toLowerCase().trim()
|
|
1289
|
+
].join('|');
|
|
1290
|
+
|
|
1291
|
+
if (!seen.has(hash)) {
|
|
1292
|
+
seen.set(hash, { ...finding, sources: [finding.source] });
|
|
1293
|
+
} else {
|
|
1294
|
+
// Merge sources if same issue found by multiple enhancers
|
|
1295
|
+
const existing = seen.get(hash);
|
|
1296
|
+
if (!existing.sources.includes(finding.source)) {
|
|
1297
|
+
existing.sources.push(finding.source);
|
|
1298
|
+
}
|
|
1299
|
+
// Prefer auto-fixable version
|
|
1300
|
+
if (finding.autoFixable && !existing.autoFixable) {
|
|
1301
|
+
existing.autoFixable = true;
|
|
1302
|
+
}
|
|
1303
|
+
}
|
|
1304
|
+
}
|
|
1305
|
+
|
|
1306
|
+
return Array.from(seen.values());
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
/**
|
|
1310
|
+
* Group findings by source enhancer
|
|
1311
|
+
* @param {Array} findings - Findings to group
|
|
1312
|
+
* @returns {Object} Grouped findings
|
|
1313
|
+
*/
|
|
1314
|
+
function groupBySource(findings) {
|
|
1315
|
+
const grouped = {};
|
|
1316
|
+
for (const finding of findings) {
|
|
1317
|
+
const source = finding.source || 'unknown';
|
|
1318
|
+
if (!grouped[source]) grouped[source] = [];
|
|
1319
|
+
grouped[source].push(finding);
|
|
1320
|
+
}
|
|
1321
|
+
return grouped;
|
|
1322
|
+
}
|
|
1323
|
+
|
|
1324
|
+
/**
|
|
1325
|
+
* Capitalize first letter
|
|
1326
|
+
* @param {string} str - String to capitalize
|
|
1327
|
+
* @returns {string} Capitalized string
|
|
1328
|
+
*/
|
|
1329
|
+
function capitalizeFirst(str) {
|
|
1330
|
+
if (!str) return '';
|
|
1331
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
1332
|
+
}
|
|
1333
|
+
|
|
1334
|
+
module.exports = {
|
|
1335
|
+
generateReport,
|
|
1336
|
+
generateDiff,
|
|
1337
|
+
generateSummaryReport,
|
|
1338
|
+
generateAgentReport,
|
|
1339
|
+
generateAgentSummaryReport,
|
|
1340
|
+
generateDocsReport,
|
|
1341
|
+
generateDocsSummaryReport,
|
|
1342
|
+
generateProjectMemoryReport,
|
|
1343
|
+
generateProjectMemorySummaryReport,
|
|
1344
|
+
generatePromptReport,
|
|
1345
|
+
generatePromptSummaryReport,
|
|
1346
|
+
generateOrchestratorReport,
|
|
1347
|
+
deduplicateOrchestratorFindings
|
|
1348
|
+
};
|