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,326 @@
1
+ /**
2
+ * Plugin Structure Patterns
3
+ * Detection patterns for plugin.json and structure issues
4
+ *
5
+ * @author Avi Fenesh
6
+ * @license MIT
7
+ */
8
+
9
+ /**
10
+ * Plugin structure patterns with certainty levels
11
+ * Following the slop-patterns model
12
+ */
13
+ const pluginPatterns = {
14
+ /**
15
+ * Missing additionalProperties in schema
16
+ * HIGH certainty - always fixable
17
+ */
18
+ missing_additional_properties: {
19
+ id: 'missing_additional_properties',
20
+ category: 'tool',
21
+ certainty: 'HIGH',
22
+ autoFix: true,
23
+ description: 'Schema missing additionalProperties: false',
24
+ check: (schema) => {
25
+ if (!schema || typeof schema !== 'object') return null;
26
+ if (schema.type === 'object' && schema.properties) {
27
+ if (schema.additionalProperties !== false) {
28
+ return {
29
+ issue: 'Missing additionalProperties: false',
30
+ fix: 'Add "additionalProperties": false to schema',
31
+ autoFixFn: (s) => ({ ...s, additionalProperties: false })
32
+ };
33
+ }
34
+ }
35
+ return null;
36
+ }
37
+ },
38
+
39
+ /**
40
+ * Missing required array in schema
41
+ * HIGH certainty - fixable by adding all properties
42
+ */
43
+ missing_required_fields: {
44
+ id: 'missing_required_fields',
45
+ category: 'tool',
46
+ certainty: 'HIGH',
47
+ autoFix: true,
48
+ description: 'Schema missing required field declarations',
49
+ check: (schema) => {
50
+ if (!schema || typeof schema !== 'object') return null;
51
+ if (schema.type === 'object' && schema.properties) {
52
+ const propKeys = Object.keys(schema.properties);
53
+ if (propKeys.length > 0 && (!schema.required || schema.required.length === 0)) {
54
+ return {
55
+ issue: 'No required fields declared',
56
+ fix: 'Add required array with all mandatory fields'
57
+ // autoFixFn is provided by plugin-analyzer which uses fixer.fixRequiredFields
58
+ };
59
+ }
60
+ }
61
+ return null;
62
+ }
63
+ },
64
+
65
+ /**
66
+ * Version mismatch between plugin.json and package.json
67
+ * HIGH certainty - fixable by syncing
68
+ */
69
+ version_mismatch: {
70
+ id: 'version_mismatch',
71
+ category: 'structure',
72
+ certainty: 'HIGH',
73
+ autoFix: true,
74
+ description: 'Version mismatch between plugin.json and package.json',
75
+ check: (pluginJson, packageJson) => {
76
+ if (!pluginJson || !packageJson) return null;
77
+ if (pluginJson.version !== packageJson.version) {
78
+ return {
79
+ issue: `Version mismatch: plugin.json (${pluginJson.version}) vs package.json (${packageJson.version})`,
80
+ fix: 'Sync versions',
81
+ autoFixFn: (pj) => ({ ...pj, version: packageJson.version })
82
+ };
83
+ }
84
+ return null;
85
+ }
86
+ },
87
+
88
+ /**
89
+ * Missing tool description
90
+ * HIGH certainty - must have description
91
+ */
92
+ missing_tool_description: {
93
+ id: 'missing_tool_description',
94
+ category: 'tool',
95
+ certainty: 'HIGH',
96
+ autoFix: false,
97
+ description: 'Tool definition missing description',
98
+ check: (tool) => {
99
+ if (!tool || typeof tool !== 'object') return null;
100
+ if (!tool.description || tool.description.trim() === '') {
101
+ return {
102
+ issue: 'Missing tool description',
103
+ fix: 'Add descriptive description field'
104
+ };
105
+ }
106
+ return null;
107
+ }
108
+ },
109
+
110
+ /**
111
+ * Deeply nested parameter structure
112
+ * MEDIUM certainty - may be intentional
113
+ */
114
+ deep_nesting: {
115
+ id: 'deep_nesting',
116
+ category: 'tool',
117
+ certainty: 'MEDIUM',
118
+ autoFix: false,
119
+ description: 'Parameter schema too deeply nested (>2 levels)',
120
+ maxDepth: 2,
121
+ check: (schema, depth = 0) => {
122
+ if (!schema || typeof schema !== 'object') return null;
123
+ if (depth > 2) {
124
+ return {
125
+ issue: `Schema nested ${depth} levels deep (max: 2)`,
126
+ fix: 'Flatten parameter structure'
127
+ };
128
+ }
129
+ // Check nested properties
130
+ if (schema.properties) {
131
+ for (const prop of Object.values(schema.properties)) {
132
+ const nested = pluginPatterns.deep_nesting.check(prop, depth + 1);
133
+ if (nested) return nested;
134
+ }
135
+ }
136
+ return null;
137
+ }
138
+ },
139
+
140
+ /**
141
+ * Tool description too long
142
+ * MEDIUM certainty - affects token efficiency
143
+ */
144
+ long_description: {
145
+ id: 'long_description',
146
+ category: 'tool',
147
+ certainty: 'MEDIUM',
148
+ autoFix: false,
149
+ description: 'Tool description exceeds 500 characters',
150
+ maxLength: 500,
151
+ check: (tool) => {
152
+ if (!tool || typeof tool !== 'object') return null;
153
+ if (tool.description && tool.description.length > 500) {
154
+ return {
155
+ issue: `Description too long (${tool.description.length} chars, max: 500)`,
156
+ fix: 'Shorten description for token efficiency'
157
+ };
158
+ }
159
+ return null;
160
+ }
161
+ },
162
+
163
+ /**
164
+ * Missing parameter descriptions
165
+ * MEDIUM certainty - improves clarity
166
+ */
167
+ missing_param_description: {
168
+ id: 'missing_param_description',
169
+ category: 'tool',
170
+ certainty: 'MEDIUM',
171
+ autoFix: false,
172
+ description: 'Parameter missing description',
173
+ check: (schema) => {
174
+ if (!schema || !schema.properties) return null;
175
+ const missing = [];
176
+ for (const [name, prop] of Object.entries(schema.properties)) {
177
+ if (!prop.description || prop.description.trim() === '') {
178
+ missing.push(name);
179
+ }
180
+ }
181
+ if (missing.length > 0) {
182
+ return {
183
+ issue: `Parameters missing descriptions: ${missing.join(', ')}`,
184
+ fix: 'Add descriptions to all parameters'
185
+ };
186
+ }
187
+ return null;
188
+ }
189
+ },
190
+
191
+ /**
192
+ * Too many tools in plugin
193
+ * LOW certainty - advisory
194
+ */
195
+ tool_overexposure: {
196
+ id: 'tool_overexposure',
197
+ category: 'structure',
198
+ certainty: 'LOW',
199
+ autoFix: false,
200
+ description: 'Plugin exposes many tools (consider splitting)',
201
+ maxTools: 10,
202
+ check: (pluginJson) => {
203
+ if (!pluginJson) return null;
204
+ const toolCount = (pluginJson.commands?.length || 0) + (pluginJson.agents?.length || 0);
205
+ if (toolCount > 10) {
206
+ return {
207
+ issue: `Plugin has ${toolCount} tools/commands (consider splitting)`,
208
+ fix: 'Consider splitting into multiple focused plugins'
209
+ };
210
+ }
211
+ return null;
212
+ }
213
+ },
214
+
215
+ /**
216
+ * Missing required plugin.json fields
217
+ * HIGH certainty
218
+ */
219
+ missing_required_plugin_fields: {
220
+ id: 'missing_required_plugin_fields',
221
+ category: 'structure',
222
+ certainty: 'HIGH',
223
+ autoFix: false,
224
+ description: 'Plugin.json missing required fields',
225
+ requiredFields: ['name', 'version', 'description'],
226
+ check: (pluginJson) => {
227
+ if (!pluginJson) return null;
228
+ const missing = [];
229
+ for (const field of pluginPatterns.missing_required_plugin_fields.requiredFields) {
230
+ if (!pluginJson[field]) {
231
+ missing.push(field);
232
+ }
233
+ }
234
+ if (missing.length > 0) {
235
+ return {
236
+ issue: `Missing required fields: ${missing.join(', ')}`,
237
+ fix: 'Add required fields to plugin.json'
238
+ };
239
+ }
240
+ return null;
241
+ }
242
+ },
243
+
244
+ /**
245
+ * Invalid version format
246
+ * HIGH certainty
247
+ */
248
+ invalid_version_format: {
249
+ id: 'invalid_version_format',
250
+ category: 'structure',
251
+ certainty: 'HIGH',
252
+ autoFix: false,
253
+ description: 'Version does not follow semver format',
254
+ check: (pluginJson) => {
255
+ if (!pluginJson || !pluginJson.version) return null;
256
+ const semverRegex = /^\d+\.\d+\.\d+(-[a-zA-Z0-9.]+)?(\+[a-zA-Z0-9.]+)?$/;
257
+ if (!semverRegex.test(pluginJson.version)) {
258
+ return {
259
+ issue: `Invalid version format: ${pluginJson.version}`,
260
+ fix: 'Use semver format (e.g., 1.0.0)'
261
+ };
262
+ }
263
+ return null;
264
+ }
265
+ }
266
+ };
267
+
268
+ /**
269
+ * Get all patterns
270
+ * @returns {Object} All plugin patterns
271
+ */
272
+ function getAllPatterns() {
273
+ return pluginPatterns;
274
+ }
275
+
276
+ /**
277
+ * Get patterns by certainty level
278
+ * @param {string} certainty - HIGH, MEDIUM, or LOW
279
+ * @returns {Object} Filtered patterns
280
+ */
281
+ function getPatternsByCertainty(certainty) {
282
+ const result = {};
283
+ for (const [name, pattern] of Object.entries(pluginPatterns)) {
284
+ if (pattern.certainty === certainty) {
285
+ result[name] = pattern;
286
+ }
287
+ }
288
+ return result;
289
+ }
290
+
291
+ /**
292
+ * Get patterns by category
293
+ * @param {string} category - tool, structure, security
294
+ * @returns {Object} Filtered patterns
295
+ */
296
+ function getPatternsByCategory(category) {
297
+ const result = {};
298
+ for (const [name, pattern] of Object.entries(pluginPatterns)) {
299
+ if (pattern.category === category) {
300
+ result[name] = pattern;
301
+ }
302
+ }
303
+ return result;
304
+ }
305
+
306
+ /**
307
+ * Get auto-fixable patterns
308
+ * @returns {Object} Patterns with autoFix: true
309
+ */
310
+ function getAutoFixablePatterns() {
311
+ const result = {};
312
+ for (const [name, pattern] of Object.entries(pluginPatterns)) {
313
+ if (pattern.autoFix) {
314
+ result[name] = pattern;
315
+ }
316
+ }
317
+ return result;
318
+ }
319
+
320
+ module.exports = {
321
+ pluginPatterns,
322
+ getAllPatterns,
323
+ getPatternsByCertainty,
324
+ getPatternsByCategory,
325
+ getAutoFixablePatterns
326
+ };