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.
Files changed (264) hide show
  1. package/.claude-plugin/marketplace.json +21 -14
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/AGENTS.md +2 -1
  4. package/CHANGELOG.md +18 -0
  5. package/README.md +7 -6
  6. package/adapters/codex/skills/agnix/SKILL.md +0 -1
  7. package/adapters/codex/skills/audit-project/SKILL.md +0 -1
  8. package/adapters/codex/skills/audit-project-agents/SKILL.md +0 -1
  9. package/adapters/codex/skills/audit-project-github/SKILL.md +0 -1
  10. package/adapters/codex/skills/consult/SKILL.md +132 -57
  11. package/adapters/codex/skills/debate/SKILL.md +214 -0
  12. package/adapters/codex/skills/delivery-approval/SKILL.md +0 -1
  13. package/adapters/codex/skills/deslop/SKILL.md +0 -1
  14. package/adapters/codex/skills/drift-detect/SKILL.md +0 -1
  15. package/adapters/codex/skills/enhance/SKILL.md +0 -1
  16. package/adapters/codex/skills/learn/SKILL.md +0 -1
  17. package/adapters/codex/skills/next-task/SKILL.md +0 -1
  18. package/adapters/codex/skills/perf/SKILL.md +0 -1
  19. package/adapters/codex/skills/repo-map/SKILL.md +0 -1
  20. package/adapters/codex/skills/ship/SKILL.md +0 -1
  21. package/adapters/codex/skills/ship-ci-review-loop/SKILL.md +0 -1
  22. package/adapters/codex/skills/ship-deployment/SKILL.md +0 -1
  23. package/adapters/codex/skills/ship-error-handling/SKILL.md +0 -1
  24. package/adapters/codex/skills/sync-docs/SKILL.md +0 -1
  25. package/adapters/opencode/agents/agent-enhancer.md +0 -1
  26. package/adapters/opencode/agents/agnix-agent.md +0 -1
  27. package/adapters/opencode/agents/ci-fixer.md +0 -1
  28. package/adapters/opencode/agents/ci-monitor.md +0 -1
  29. package/adapters/opencode/agents/claudemd-enhancer.md +0 -1
  30. package/adapters/opencode/agents/consult-agent.md +122 -30
  31. package/adapters/opencode/agents/cross-file-enhancer.md +0 -1
  32. package/adapters/opencode/agents/debate-orchestrator.md +169 -0
  33. package/adapters/opencode/agents/delivery-validator.md +0 -1
  34. package/adapters/opencode/agents/deslop-agent.md +0 -1
  35. package/adapters/opencode/agents/docs-enhancer.md +0 -1
  36. package/adapters/opencode/agents/exploration-agent.md +0 -1
  37. package/adapters/opencode/agents/hooks-enhancer.md +0 -1
  38. package/adapters/opencode/agents/implementation-agent.md +0 -1
  39. package/adapters/opencode/agents/learn-agent.md +0 -1
  40. package/adapters/opencode/agents/map-validator.md +0 -1
  41. package/adapters/opencode/agents/perf-analyzer.md +0 -1
  42. package/adapters/opencode/agents/perf-code-paths.md +0 -1
  43. package/adapters/opencode/agents/perf-investigation-logger.md +0 -1
  44. package/adapters/opencode/agents/perf-orchestrator.md +0 -1
  45. package/adapters/opencode/agents/perf-theory-gatherer.md +0 -1
  46. package/adapters/opencode/agents/perf-theory-tester.md +0 -1
  47. package/adapters/opencode/agents/plan-synthesizer.md +0 -1
  48. package/adapters/opencode/agents/planning-agent.md +0 -1
  49. package/adapters/opencode/agents/plugin-enhancer.md +0 -1
  50. package/adapters/opencode/agents/prompt-enhancer.md +0 -1
  51. package/adapters/opencode/agents/simple-fixer.md +0 -1
  52. package/adapters/opencode/agents/skills-enhancer.md +0 -1
  53. package/adapters/opencode/agents/sync-docs-agent.md +0 -1
  54. package/adapters/opencode/agents/task-discoverer.md +0 -1
  55. package/adapters/opencode/agents/test-coverage-checker.md +0 -1
  56. package/adapters/opencode/agents/worktree-manager.md +0 -1
  57. package/adapters/opencode/commands/agnix.md +0 -1
  58. package/adapters/opencode/commands/audit-project-agents.md +0 -1
  59. package/adapters/opencode/commands/audit-project-github.md +0 -1
  60. package/adapters/opencode/commands/audit-project.md +0 -1
  61. package/adapters/opencode/commands/consult.md +133 -57
  62. package/adapters/opencode/commands/debate.md +224 -0
  63. package/adapters/opencode/commands/delivery-approval.md +0 -1
  64. package/adapters/opencode/commands/deslop.md +0 -1
  65. package/adapters/opencode/commands/drift-detect.md +0 -1
  66. package/adapters/opencode/commands/enhance.md +0 -1
  67. package/adapters/opencode/commands/learn.md +0 -1
  68. package/adapters/opencode/commands/next-task.md +0 -1
  69. package/adapters/opencode/commands/perf.md +0 -1
  70. package/adapters/opencode/commands/repo-map.md +0 -1
  71. package/adapters/opencode/commands/ship-ci-review-loop.md +0 -1
  72. package/adapters/opencode/commands/ship-deployment.md +0 -1
  73. package/adapters/opencode/commands/ship-error-handling.md +0 -1
  74. package/adapters/opencode/commands/ship.md +0 -1
  75. package/adapters/opencode/commands/sync-docs.md +0 -1
  76. package/adapters/opencode/skills/agnix/SKILL.md +1 -2
  77. package/adapters/opencode/skills/consult/SKILL.md +33 -23
  78. package/adapters/opencode/skills/debate/SKILL.md +245 -0
  79. package/adapters/opencode/skills/deslop/SKILL.md +1 -2
  80. package/adapters/opencode/skills/discover-tasks/SKILL.md +1 -2
  81. package/adapters/opencode/skills/drift-analysis/SKILL.md +1 -2
  82. package/adapters/opencode/skills/enhance-agent-prompts/SKILL.md +1 -2
  83. package/adapters/opencode/skills/enhance-claude-memory/SKILL.md +1 -2
  84. package/adapters/opencode/skills/enhance-cross-file/SKILL.md +1 -2
  85. package/adapters/opencode/skills/enhance-docs/SKILL.md +1 -2
  86. package/adapters/opencode/skills/enhance-hooks/SKILL.md +1 -2
  87. package/adapters/opencode/skills/enhance-orchestrator/SKILL.md +1 -2
  88. package/adapters/opencode/skills/enhance-plugins/SKILL.md +1 -2
  89. package/adapters/opencode/skills/enhance-prompts/SKILL.md +1 -2
  90. package/adapters/opencode/skills/enhance-skills/SKILL.md +1 -2
  91. package/adapters/opencode/skills/learn/SKILL.md +1 -2
  92. package/adapters/opencode/skills/orchestrate-review/SKILL.md +0 -1
  93. package/adapters/opencode/skills/perf-analyzer/SKILL.md +1 -2
  94. package/adapters/opencode/skills/perf-baseline-manager/SKILL.md +1 -2
  95. package/adapters/opencode/skills/perf-benchmarker/SKILL.md +1 -2
  96. package/adapters/opencode/skills/perf-code-paths/SKILL.md +1 -2
  97. package/adapters/opencode/skills/perf-investigation-logger/SKILL.md +1 -2
  98. package/adapters/opencode/skills/perf-profiler/SKILL.md +1 -2
  99. package/adapters/opencode/skills/perf-theory-gatherer/SKILL.md +1 -2
  100. package/adapters/opencode/skills/perf-theory-tester/SKILL.md +1 -2
  101. package/adapters/opencode/skills/repo-mapping/SKILL.md +1 -2
  102. package/adapters/opencode/skills/sync-docs/SKILL.md +1 -2
  103. package/adapters/opencode/skills/validate-delivery/SKILL.md +1 -2
  104. package/lib/adapter-transforms.js +24 -4
  105. package/package.json +1 -1
  106. package/plugins/agnix/.claude-plugin/plugin.json +1 -1
  107. package/plugins/agnix/skills/agnix/SKILL.md +1 -1
  108. package/plugins/audit-project/.claude-plugin/plugin.json +1 -1
  109. package/plugins/audit-project/lib/adapter-transforms.js +24 -4
  110. package/plugins/consult/.claude-plugin/plugin.json +1 -1
  111. package/plugins/consult/agents/consult-agent.md +122 -29
  112. package/plugins/consult/commands/consult.md +135 -58
  113. package/plugins/consult/skills/consult/SKILL.md +31 -20
  114. package/plugins/debate/.claude-plugin/plugin.json +21 -0
  115. package/plugins/debate/agents/debate-orchestrator.md +175 -0
  116. package/plugins/debate/commands/debate.md +221 -0
  117. package/plugins/debate/lib/adapter-transforms.js +298 -0
  118. package/plugins/debate/lib/collectors/codebase.js +392 -0
  119. package/plugins/debate/lib/collectors/docs-patterns.js +713 -0
  120. package/plugins/debate/lib/collectors/documentation.js +219 -0
  121. package/plugins/debate/lib/collectors/github.js +330 -0
  122. package/plugins/debate/lib/collectors/index.js +126 -0
  123. package/plugins/debate/lib/config/index.js +14 -0
  124. package/plugins/debate/lib/cross-platform/index.js +539 -0
  125. package/plugins/debate/lib/discovery/index.js +352 -0
  126. package/plugins/debate/lib/drift-detect/collectors.js +37 -0
  127. package/plugins/debate/lib/enhance/agent-analyzer.js +421 -0
  128. package/plugins/debate/lib/enhance/agent-patterns.js +571 -0
  129. package/plugins/debate/lib/enhance/auto-suppression.js +622 -0
  130. package/plugins/debate/lib/enhance/benchmark.js +417 -0
  131. package/plugins/debate/lib/enhance/cross-file-analyzer.js +930 -0
  132. package/plugins/debate/lib/enhance/cross-file-patterns.js +370 -0
  133. package/plugins/debate/lib/enhance/docs-analyzer.js +325 -0
  134. package/plugins/debate/lib/enhance/docs-patterns.js +671 -0
  135. package/plugins/debate/lib/enhance/fixer.js +721 -0
  136. package/plugins/debate/lib/enhance/hook-analyzer.js +135 -0
  137. package/plugins/debate/lib/enhance/hook-patterns.js +40 -0
  138. package/plugins/debate/lib/enhance/index.js +127 -0
  139. package/plugins/debate/lib/enhance/plugin-analyzer.js +402 -0
  140. package/plugins/debate/lib/enhance/plugin-patterns.js +326 -0
  141. package/plugins/debate/lib/enhance/projectmemory-analyzer.js +551 -0
  142. package/plugins/debate/lib/enhance/projectmemory-patterns.js +617 -0
  143. package/plugins/debate/lib/enhance/prompt-analyzer.js +457 -0
  144. package/plugins/debate/lib/enhance/prompt-patterns.js +1484 -0
  145. package/plugins/debate/lib/enhance/reporter.js +1348 -0
  146. package/plugins/debate/lib/enhance/security-patterns.js +284 -0
  147. package/plugins/debate/lib/enhance/skill-analyzer.js +182 -0
  148. package/plugins/debate/lib/enhance/skill-patterns.js +147 -0
  149. package/plugins/debate/lib/enhance/suppression.js +352 -0
  150. package/plugins/debate/lib/enhance/tool-patterns.js +373 -0
  151. package/plugins/debate/lib/index.js +270 -0
  152. package/plugins/debate/lib/patterns/cli-enhancers.js +611 -0
  153. package/plugins/debate/lib/patterns/pipeline.js +948 -0
  154. package/plugins/debate/lib/patterns/review-patterns.js +558 -0
  155. package/plugins/debate/lib/patterns/slop-analyzers.js +2305 -0
  156. package/plugins/debate/lib/patterns/slop-patterns.js +1187 -0
  157. package/plugins/debate/lib/perf/analyzer/index.js +22 -0
  158. package/plugins/debate/lib/perf/argument-parser.js +105 -0
  159. package/plugins/debate/lib/perf/baseline-comparator.js +50 -0
  160. package/plugins/debate/lib/perf/baseline-store.js +127 -0
  161. package/plugins/debate/lib/perf/benchmark-runner.js +404 -0
  162. package/plugins/debate/lib/perf/breaking-point-finder.js +52 -0
  163. package/plugins/debate/lib/perf/breaking-point-runner.js +60 -0
  164. package/plugins/debate/lib/perf/checkpoint.js +123 -0
  165. package/plugins/debate/lib/perf/code-paths.js +86 -0
  166. package/plugins/debate/lib/perf/consolidation.js +37 -0
  167. package/plugins/debate/lib/perf/constraint-runner.js +71 -0
  168. package/plugins/debate/lib/perf/experiment-runner.js +32 -0
  169. package/plugins/debate/lib/perf/index.js +41 -0
  170. package/plugins/debate/lib/perf/investigation-state.js +874 -0
  171. package/plugins/debate/lib/perf/optimization-runner.js +79 -0
  172. package/plugins/debate/lib/perf/profilers/go.js +22 -0
  173. package/plugins/debate/lib/perf/profilers/index.js +46 -0
  174. package/plugins/debate/lib/perf/profilers/java.js +23 -0
  175. package/plugins/debate/lib/perf/profilers/node.js +27 -0
  176. package/plugins/debate/lib/perf/profilers/python.js +23 -0
  177. package/plugins/debate/lib/perf/profilers/rust.js +23 -0
  178. package/plugins/debate/lib/perf/profiling-runner.js +75 -0
  179. package/plugins/debate/lib/perf/schemas.js +140 -0
  180. package/plugins/debate/lib/platform/detect-platform.js +413 -0
  181. package/plugins/debate/lib/platform/detection-configs.js +93 -0
  182. package/plugins/debate/lib/platform/state-dir.js +132 -0
  183. package/plugins/debate/lib/platform/verify-tools.js +182 -0
  184. package/plugins/debate/lib/repo-map/cache.js +152 -0
  185. package/plugins/debate/lib/repo-map/concurrency.js +29 -0
  186. package/plugins/debate/lib/repo-map/index.js +222 -0
  187. package/plugins/debate/lib/repo-map/installer.js +212 -0
  188. package/plugins/debate/lib/repo-map/queries/go.js +27 -0
  189. package/plugins/debate/lib/repo-map/queries/index.js +100 -0
  190. package/plugins/debate/lib/repo-map/queries/java.js +38 -0
  191. package/plugins/debate/lib/repo-map/queries/javascript.js +55 -0
  192. package/plugins/debate/lib/repo-map/queries/python.js +24 -0
  193. package/plugins/debate/lib/repo-map/queries/rust.js +73 -0
  194. package/plugins/debate/lib/repo-map/queries/typescript.js +38 -0
  195. package/plugins/debate/lib/repo-map/runner.js +1364 -0
  196. package/plugins/debate/lib/repo-map/updater.js +562 -0
  197. package/plugins/debate/lib/repo-map/usage-analyzer.js +407 -0
  198. package/plugins/debate/lib/schemas/plugin-manifest.schema.json +57 -0
  199. package/plugins/debate/lib/schemas/validator.js +247 -0
  200. package/plugins/debate/lib/sources/custom-handler.js +199 -0
  201. package/plugins/debate/lib/sources/policy-questions.js +246 -0
  202. package/plugins/debate/lib/sources/source-cache.js +165 -0
  203. package/plugins/debate/lib/state/workflow-state.js +576 -0
  204. package/plugins/debate/lib/types/agent-frontmatter.d.ts +134 -0
  205. package/plugins/debate/lib/types/command-frontmatter.d.ts +107 -0
  206. package/plugins/debate/lib/types/hook-frontmatter.d.ts +115 -0
  207. package/plugins/debate/lib/types/index.d.ts +84 -0
  208. package/plugins/debate/lib/types/plugin-manifest.d.ts +102 -0
  209. package/plugins/debate/lib/types/skill-frontmatter.d.ts +89 -0
  210. package/plugins/debate/lib/utils/atomic-write.js +94 -0
  211. package/plugins/debate/lib/utils/cache-manager.js +159 -0
  212. package/plugins/debate/lib/utils/command-parser.js +0 -0
  213. package/plugins/debate/lib/utils/context-optimizer.js +300 -0
  214. package/plugins/debate/lib/utils/deprecation.js +37 -0
  215. package/plugins/debate/lib/utils/shell-escape.js +88 -0
  216. package/plugins/debate/lib/utils/state-helpers.js +61 -0
  217. package/plugins/debate/skills/debate/SKILL.md +264 -0
  218. package/plugins/deslop/.claude-plugin/plugin.json +1 -1
  219. package/plugins/deslop/lib/adapter-transforms.js +24 -4
  220. package/plugins/deslop/skills/deslop/SKILL.md +1 -1
  221. package/plugins/drift-detect/.claude-plugin/plugin.json +1 -1
  222. package/plugins/drift-detect/lib/adapter-transforms.js +24 -4
  223. package/plugins/drift-detect/skills/drift-analysis/SKILL.md +1 -1
  224. package/plugins/enhance/.claude-plugin/plugin.json +1 -1
  225. package/plugins/enhance/lib/adapter-transforms.js +24 -4
  226. package/plugins/enhance/skills/enhance-agent-prompts/SKILL.md +1 -1
  227. package/plugins/enhance/skills/enhance-claude-memory/SKILL.md +1 -1
  228. package/plugins/enhance/skills/enhance-cross-file/SKILL.md +1 -1
  229. package/plugins/enhance/skills/enhance-docs/SKILL.md +1 -1
  230. package/plugins/enhance/skills/enhance-hooks/SKILL.md +1 -1
  231. package/plugins/enhance/skills/enhance-orchestrator/SKILL.md +1 -1
  232. package/plugins/enhance/skills/enhance-plugins/SKILL.md +1 -1
  233. package/plugins/enhance/skills/enhance-prompts/SKILL.md +1 -1
  234. package/plugins/enhance/skills/enhance-skills/SKILL.md +1 -1
  235. package/plugins/learn/.claude-plugin/plugin.json +1 -1
  236. package/plugins/learn/agents/learn-agent.md +1 -1
  237. package/plugins/learn/lib/adapter-transforms.js +24 -4
  238. package/plugins/learn/skills/learn/SKILL.md +1 -1
  239. package/plugins/next-task/.claude-plugin/plugin.json +1 -1
  240. package/plugins/next-task/agents/exploration-agent.md +1 -1
  241. package/plugins/next-task/lib/adapter-transforms.js +24 -4
  242. package/plugins/next-task/skills/discover-tasks/SKILL.md +1 -1
  243. package/plugins/next-task/skills/validate-delivery/SKILL.md +1 -1
  244. package/plugins/perf/.claude-plugin/plugin.json +1 -1
  245. package/plugins/perf/lib/adapter-transforms.js +24 -4
  246. package/plugins/perf/skills/perf-analyzer/SKILL.md +1 -1
  247. package/plugins/perf/skills/perf-baseline-manager/SKILL.md +1 -1
  248. package/plugins/perf/skills/perf-benchmarker/SKILL.md +1 -1
  249. package/plugins/perf/skills/perf-code-paths/SKILL.md +1 -1
  250. package/plugins/perf/skills/perf-investigation-logger/SKILL.md +1 -1
  251. package/plugins/perf/skills/perf-profiler/SKILL.md +1 -1
  252. package/plugins/perf/skills/perf-theory-gatherer/SKILL.md +1 -1
  253. package/plugins/perf/skills/perf-theory-tester/SKILL.md +1 -1
  254. package/plugins/repo-map/.claude-plugin/plugin.json +1 -1
  255. package/plugins/repo-map/lib/adapter-transforms.js +24 -4
  256. package/plugins/ship/.claude-plugin/plugin.json +1 -1
  257. package/plugins/ship/lib/adapter-transforms.js +24 -4
  258. package/plugins/sync-docs/.claude-plugin/plugin.json +1 -1
  259. package/plugins/sync-docs/lib/adapter-transforms.js +24 -4
  260. package/plugins/sync-docs/skills/sync-docs/SKILL.md +1 -1
  261. package/scripts/gen-adapters.js +6 -7
  262. package/scripts/generate-docs.js +4 -2
  263. package/scripts/plugins.txt +1 -0
  264. 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
+ };