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,421 @@
1
+ /**
2
+ * Agent Analyzer
3
+ * Main orchestrator for agent prompt optimization analysis
4
+ *
5
+ * @author Avi Fenesh
6
+ * @license MIT
7
+ */
8
+
9
+ const fs = require('fs');
10
+ const path = require('path');
11
+ const { agentPatterns } = require('./agent-patterns');
12
+
13
+ /**
14
+ * Parse YAML frontmatter from markdown content
15
+ * @param {string} content - Markdown file content
16
+ * @returns {Object} { frontmatter, body }
17
+ */
18
+ function parseMarkdownFrontmatter(content) {
19
+ if (!content || typeof content !== 'string') {
20
+ return { frontmatter: null, body: content };
21
+ }
22
+
23
+ const trimmed = content.trim();
24
+
25
+ // Check if starts with ---
26
+ if (!trimmed.startsWith('---')) {
27
+ return { frontmatter: null, body: content };
28
+ }
29
+
30
+ // Find closing ---
31
+ const lines = trimmed.split('\n');
32
+ let endIndex = -1;
33
+
34
+ for (let i = 1; i < lines.length; i++) {
35
+ if (lines[i].trim() === '---') {
36
+ endIndex = i;
37
+ break;
38
+ }
39
+ }
40
+
41
+ if (endIndex === -1) {
42
+ return { frontmatter: null, body: content };
43
+ }
44
+
45
+ // Parse frontmatter as simple key: value pairs
46
+ const frontmatter = {};
47
+ const fmLines = lines.slice(1, endIndex);
48
+
49
+ for (const line of fmLines) {
50
+ const colonIndex = line.indexOf(':');
51
+ if (colonIndex > 0) {
52
+ const key = line.substring(0, colonIndex).trim();
53
+ const value = line.substring(colonIndex + 1).trim();
54
+ frontmatter[key] = value;
55
+ }
56
+ }
57
+
58
+ // Body is everything after closing ---
59
+ const body = lines.slice(endIndex + 1).join('\n');
60
+
61
+ return { frontmatter, body };
62
+ }
63
+
64
+ /**
65
+ * Analyze a single agent file
66
+ * @param {string} agentPath - Path to agent markdown file
67
+ * @param {Object} options - Analysis options
68
+ * @param {boolean} options.verbose - Include LOW certainty issues
69
+ * @returns {Object} Analysis results
70
+ */
71
+ function analyzeAgent(agentPath, options = {}) {
72
+ const results = {
73
+ agentName: path.basename(agentPath, '.md'),
74
+ agentPath,
75
+ frontmatter: null,
76
+ structureIssues: [],
77
+ toolIssues: [],
78
+ xmlIssues: [],
79
+ cotIssues: [],
80
+ exampleIssues: [],
81
+ antiPatternIssues: [],
82
+ crossPlatformIssues: []
83
+ };
84
+
85
+ // Read file
86
+ if (!fs.existsSync(agentPath)) {
87
+ results.structureIssues.push({
88
+ issue: 'File not found',
89
+ file: agentPath,
90
+ certainty: 'HIGH',
91
+ patternId: 'file_not_found'
92
+ });
93
+ return results;
94
+ }
95
+
96
+ let content;
97
+ try {
98
+ content = fs.readFileSync(agentPath, 'utf8');
99
+ } catch (err) {
100
+ results.structureIssues.push({
101
+ issue: `Failed to read file: ${err.message}`,
102
+ file: agentPath,
103
+ certainty: 'HIGH',
104
+ patternId: 'read_error'
105
+ });
106
+ return results;
107
+ }
108
+
109
+ // Parse frontmatter
110
+ const { frontmatter } = parseMarkdownFrontmatter(content);
111
+ results.frontmatter = frontmatter;
112
+
113
+ // Check for missing frontmatter
114
+ const missingFmPattern = agentPatterns.missing_frontmatter;
115
+ const missingFmResult = missingFmPattern.check(content);
116
+ if (missingFmResult) {
117
+ results.structureIssues.push({
118
+ ...missingFmResult,
119
+ file: agentPath,
120
+ certainty: missingFmPattern.certainty,
121
+ patternId: missingFmPattern.id
122
+ });
123
+ }
124
+
125
+ // If frontmatter exists, check its fields
126
+ if (frontmatter) {
127
+ // Check for missing name
128
+ const missingNamePattern = agentPatterns.missing_name;
129
+ const missingNameResult = missingNamePattern.check(frontmatter);
130
+ if (missingNameResult) {
131
+ results.structureIssues.push({
132
+ ...missingNameResult,
133
+ file: agentPath,
134
+ certainty: missingNamePattern.certainty,
135
+ patternId: missingNamePattern.id
136
+ });
137
+ }
138
+
139
+ // Check for missing description
140
+ const missingDescPattern = agentPatterns.missing_description;
141
+ const missingDescResult = missingDescPattern.check(frontmatter);
142
+ if (missingDescResult) {
143
+ results.structureIssues.push({
144
+ ...missingDescResult,
145
+ file: agentPath,
146
+ certainty: missingDescPattern.certainty,
147
+ patternId: missingDescPattern.id
148
+ });
149
+ }
150
+
151
+ // Check for unrestricted tools
152
+ const unrestrictedToolsPattern = agentPatterns.unrestricted_tools;
153
+ const unrestrictedToolsResult = unrestrictedToolsPattern.check(frontmatter);
154
+ if (unrestrictedToolsResult) {
155
+ results.toolIssues.push({
156
+ ...unrestrictedToolsResult,
157
+ file: agentPath,
158
+ certainty: unrestrictedToolsPattern.certainty,
159
+ patternId: unrestrictedToolsPattern.id
160
+ });
161
+ }
162
+
163
+ // Check for unrestricted Bash
164
+ const unrestrictedBashPattern = agentPatterns.unrestricted_bash;
165
+ const unrestrictedBashResult = unrestrictedBashPattern.check(frontmatter);
166
+ if (unrestrictedBashResult) {
167
+ results.toolIssues.push({
168
+ ...unrestrictedBashResult,
169
+ file: agentPath,
170
+ filePath: agentPath,
171
+ certainty: unrestrictedBashPattern.certainty,
172
+ patternId: unrestrictedBashPattern.id
173
+ });
174
+ }
175
+ }
176
+
177
+ // Check for missing role
178
+ const missingRolePattern = agentPatterns.missing_role;
179
+ const missingRoleResult = missingRolePattern.check(content);
180
+ if (missingRoleResult) {
181
+ results.structureIssues.push({
182
+ ...missingRoleResult,
183
+ file: agentPath,
184
+ filePath: agentPath,
185
+ certainty: missingRolePattern.certainty,
186
+ patternId: missingRolePattern.id
187
+ });
188
+ }
189
+
190
+ // Check for missing output format
191
+ const missingOutputPattern = agentPatterns.missing_output_format;
192
+ const missingOutputResult = missingOutputPattern.check(content);
193
+ if (missingOutputResult) {
194
+ results.structureIssues.push({
195
+ ...missingOutputResult,
196
+ file: agentPath,
197
+ certainty: missingOutputPattern.certainty,
198
+ patternId: missingOutputPattern.id
199
+ });
200
+ }
201
+
202
+ // Check for missing constraints
203
+ const missingConstraintsPattern = agentPatterns.missing_constraints;
204
+ const missingConstraintsResult = missingConstraintsPattern.check(content);
205
+ if (missingConstraintsResult) {
206
+ results.structureIssues.push({
207
+ ...missingConstraintsResult,
208
+ file: agentPath,
209
+ certainty: missingConstraintsPattern.certainty,
210
+ patternId: missingConstraintsPattern.id
211
+ });
212
+ }
213
+
214
+ // Check for missing XML structure
215
+ const missingXmlPattern = agentPatterns.missing_xml_structure;
216
+ const missingXmlResult = missingXmlPattern.check(content);
217
+ if (missingXmlResult && (options.verbose || missingXmlPattern.certainty !== 'LOW')) {
218
+ results.xmlIssues.push({
219
+ ...missingXmlResult,
220
+ file: agentPath,
221
+ certainty: missingXmlPattern.certainty,
222
+ patternId: missingXmlPattern.id
223
+ });
224
+ }
225
+
226
+ // Check for unnecessary CoT
227
+ const unnecessaryCotPattern = agentPatterns.unnecessary_cot;
228
+ const unnecessaryCotResult = unnecessaryCotPattern.check(content);
229
+ if (unnecessaryCotResult && (options.verbose || unnecessaryCotPattern.certainty !== 'LOW')) {
230
+ results.cotIssues.push({
231
+ ...unnecessaryCotResult,
232
+ file: agentPath,
233
+ certainty: unnecessaryCotPattern.certainty,
234
+ patternId: unnecessaryCotPattern.id
235
+ });
236
+ }
237
+
238
+ // Check for missing CoT
239
+ const missingCotPattern = agentPatterns.missing_cot;
240
+ const missingCotResult = missingCotPattern.check(content);
241
+ if (missingCotResult && (options.verbose || missingCotPattern.certainty !== 'LOW')) {
242
+ results.cotIssues.push({
243
+ ...missingCotResult,
244
+ file: agentPath,
245
+ certainty: missingCotPattern.certainty,
246
+ patternId: missingCotPattern.id
247
+ });
248
+ }
249
+
250
+ // Check example count
251
+ const exampleCountPattern = agentPatterns.example_count_suboptimal;
252
+ const exampleCountResult = exampleCountPattern.check(content);
253
+ if (exampleCountResult && options.verbose) {
254
+ results.exampleIssues.push({
255
+ ...exampleCountResult,
256
+ file: agentPath,
257
+ certainty: exampleCountPattern.certainty,
258
+ patternId: exampleCountPattern.id
259
+ });
260
+ }
261
+
262
+ // Check for vague instructions
263
+ const vaguePattern = agentPatterns.vague_instructions;
264
+ const vagueResult = vaguePattern.check(content);
265
+ if (vagueResult && (options.verbose || vaguePattern.certainty !== 'LOW')) {
266
+ results.antiPatternIssues.push({
267
+ ...vagueResult,
268
+ file: agentPath,
269
+ certainty: vaguePattern.certainty,
270
+ patternId: vaguePattern.id
271
+ });
272
+ }
273
+
274
+ // Check for prompt bloat
275
+ const bloatPattern = agentPatterns.prompt_bloat;
276
+ const bloatResult = bloatPattern.check(content);
277
+ if (bloatResult && options.verbose) {
278
+ results.antiPatternIssues.push({
279
+ ...bloatResult,
280
+ file: agentPath,
281
+ certainty: bloatPattern.certainty,
282
+ patternId: bloatPattern.id
283
+ });
284
+ }
285
+
286
+ // Cross-platform compatibility checks
287
+ const crossPlatformPatterns = [
288
+ 'hardcoded_claude_dir',
289
+ 'claude_md_reference',
290
+ 'no_xml_for_data'
291
+ ];
292
+
293
+ for (const patternName of crossPlatformPatterns) {
294
+ const pattern = agentPatterns[patternName];
295
+ if (!pattern) continue;
296
+
297
+ const result = pattern.check(content);
298
+ if (result && (options.verbose || pattern.certainty !== 'LOW')) {
299
+ results.crossPlatformIssues.push({
300
+ ...result,
301
+ file: agentPath,
302
+ certainty: pattern.certainty,
303
+ patternId: pattern.id
304
+ });
305
+ }
306
+ }
307
+
308
+ return results;
309
+ }
310
+
311
+ /**
312
+ * Analyze all agents in a directory
313
+ * @param {string} agentsDir - Path to agents directory
314
+ * @param {Object} options - Analysis options
315
+ * @returns {Array} Array of analysis results
316
+ */
317
+ function analyzeAllAgents(agentsDir, options = {}) {
318
+ const results = [];
319
+
320
+ if (!fs.existsSync(agentsDir)) {
321
+ return results;
322
+ }
323
+
324
+ const agentFiles = fs.readdirSync(agentsDir)
325
+ .filter(f => f.endsWith('.md') && f !== 'README.md');
326
+
327
+ for (const agentFile of agentFiles) {
328
+ const agentPath = path.join(agentsDir, agentFile);
329
+ const result = analyzeAgent(agentPath, options);
330
+ results.push(result);
331
+ }
332
+
333
+ return results;
334
+ }
335
+
336
+ /**
337
+ * Main analyze function
338
+ * @param {Object} options - Analysis options
339
+ * @param {string} options.agent - Specific agent name (optional)
340
+ * @param {string} options.agentsDir - Path to agents directory
341
+ * @param {boolean} options.verbose - Include LOW certainty issues
342
+ * @returns {Object|Array} Analysis results
343
+ */
344
+ function analyze(options = {}) {
345
+ const {
346
+ agent,
347
+ agentsDir = 'plugins/enhance/agents',
348
+ verbose = false
349
+ } = options;
350
+
351
+ if (agent) {
352
+ // Analyze single agent
353
+ const agentPath = agent.endsWith('.md')
354
+ ? path.join(agentsDir, agent)
355
+ : path.join(agentsDir, `${agent}.md`);
356
+ return analyzeAgent(agentPath, { verbose });
357
+ } else {
358
+ // Analyze all agents
359
+ return analyzeAllAgents(agentsDir, { verbose });
360
+ }
361
+ }
362
+
363
+ /**
364
+ * Apply fixes to analysis results
365
+ * @param {Object|Array} results - Analysis results
366
+ * @param {Object} options - Fix options
367
+ * @returns {Object} Fix results
368
+ */
369
+ function applyFixes(results, options = {}) {
370
+ const fixer = require('./fixer');
371
+
372
+ // Collect all issues
373
+ let allIssues = [];
374
+
375
+ if (Array.isArray(results)) {
376
+ for (const r of results) {
377
+ allIssues.push(...(r.structureIssues || []));
378
+ allIssues.push(...(r.toolIssues || []));
379
+ allIssues.push(...(r.xmlIssues || []));
380
+ allIssues.push(...(r.cotIssues || []));
381
+ allIssues.push(...(r.exampleIssues || []));
382
+ allIssues.push(...(r.antiPatternIssues || []));
383
+ allIssues.push(...(r.crossPlatformIssues || []));
384
+ }
385
+ } else {
386
+ allIssues.push(...(results.structureIssues || []));
387
+ allIssues.push(...(results.toolIssues || []));
388
+ allIssues.push(...(results.xmlIssues || []));
389
+ allIssues.push(...(results.cotIssues || []));
390
+ allIssues.push(...(results.exampleIssues || []));
391
+ allIssues.push(...(results.antiPatternIssues || []));
392
+ allIssues.push(...(results.crossPlatformIssues || []));
393
+ }
394
+
395
+ return fixer.applyFixes(allIssues, options);
396
+ }
397
+
398
+ /**
399
+ * Generate report from analysis results
400
+ * @param {Object|Array} results - Analysis results
401
+ * @param {Object} options - Report options
402
+ * @returns {string} Markdown report
403
+ */
404
+ function generateReport(results, options = {}) {
405
+ const reporter = require('./reporter');
406
+
407
+ if (Array.isArray(results)) {
408
+ return reporter.generateAgentSummaryReport(results, options);
409
+ } else {
410
+ return reporter.generateAgentReport(results, options);
411
+ }
412
+ }
413
+
414
+ module.exports = {
415
+ parseMarkdownFrontmatter,
416
+ analyzeAgent,
417
+ analyzeAllAgents,
418
+ analyze,
419
+ applyFixes,
420
+ generateReport
421
+ };