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,571 @@
1
+ /**
2
+ * Agent Prompt Patterns
3
+ * Detection patterns for agent prompt engineering best practices
4
+ *
5
+ * @author Avi Fenesh
6
+ * @license MIT
7
+ */
8
+
9
+ /**
10
+ * Agent prompt patterns with certainty levels
11
+ * Following the plugin-patterns model
12
+ */
13
+ const agentPatterns = {
14
+ /**
15
+ * Missing YAML frontmatter
16
+ * HIGH certainty - always fixable
17
+ */
18
+ missing_frontmatter: {
19
+ id: 'missing_frontmatter',
20
+ category: 'structure',
21
+ certainty: 'HIGH',
22
+ autoFix: true,
23
+ description: 'Agent prompt missing YAML frontmatter (---...---)',
24
+ check: (content) => {
25
+ if (!content || typeof content !== 'string') return null;
26
+
27
+ // Check if frontmatter exists
28
+ const hasFrontmatter = content.trim().startsWith('---');
29
+
30
+ if (!hasFrontmatter) {
31
+ return {
32
+ issue: 'Missing YAML frontmatter',
33
+ fix: 'Add frontmatter with name, description, tools, model'
34
+ };
35
+ }
36
+ return null;
37
+ }
38
+ },
39
+
40
+ /**
41
+ * Missing name field in frontmatter
42
+ * HIGH certainty - requires manual fix (name is context-dependent)
43
+ */
44
+ missing_name: {
45
+ id: 'missing_name',
46
+ category: 'structure',
47
+ certainty: 'HIGH',
48
+ autoFix: false,
49
+ description: 'Frontmatter missing "name" field',
50
+ check: (frontmatter) => {
51
+ if (!frontmatter || typeof frontmatter !== 'object') return null;
52
+
53
+ if (!frontmatter.name || (typeof frontmatter.name === 'string' && frontmatter.name.trim() === '')) {
54
+ return {
55
+ issue: 'Frontmatter missing "name" field',
56
+ fix: 'Add "name" field to frontmatter'
57
+ };
58
+ }
59
+ return null;
60
+ }
61
+ },
62
+
63
+ /**
64
+ * Missing description field in frontmatter
65
+ * HIGH certainty - requires manual fix (description is context-dependent)
66
+ */
67
+ missing_description: {
68
+ id: 'missing_description',
69
+ category: 'structure',
70
+ certainty: 'HIGH',
71
+ autoFix: false,
72
+ description: 'Frontmatter missing "description" field',
73
+ check: (frontmatter) => {
74
+ if (!frontmatter || typeof frontmatter !== 'object') return null;
75
+
76
+ if (!frontmatter.description || (typeof frontmatter.description === 'string' && frontmatter.description.trim() === '')) {
77
+ return {
78
+ issue: 'Frontmatter missing "description" field',
79
+ fix: 'Add "description" field to frontmatter'
80
+ };
81
+ }
82
+ return null;
83
+ }
84
+ },
85
+
86
+ /**
87
+ * Missing role section
88
+ * HIGH certainty - should have clear role definition
89
+ */
90
+ missing_role: {
91
+ id: 'missing_role',
92
+ category: 'structure',
93
+ certainty: 'HIGH',
94
+ autoFix: true,
95
+ description: 'No role section ("You are..." or "## Role")',
96
+ check: (content) => {
97
+ if (!content || typeof content !== 'string') return null;
98
+
99
+ // Look for role indicators (various forms)
100
+ const hasYouAre = /you are/i.test(content);
101
+ const hasYouPerform = /you (?:perform|handle|execute|do|manage|coordinate|analyze|review|create|design|implement|validate|update|check|monitor)/i.test(content);
102
+ const hasRoleSection = /##\s+(?:your\s+)?role|\*\*(?:your\s+)?role\*\*/i.test(content);
103
+
104
+ if (!hasYouAre && !hasYouPerform && !hasRoleSection) {
105
+ return {
106
+ issue: 'Missing role definition',
107
+ fix: 'Add role section explaining agent purpose'
108
+ };
109
+ }
110
+ return null;
111
+ }
112
+ },
113
+
114
+ /**
115
+ * Missing output format specification
116
+ * HIGH certainty - agents should specify output format
117
+ */
118
+ missing_output_format: {
119
+ id: 'missing_output_format',
120
+ category: 'structure',
121
+ certainty: 'HIGH',
122
+ autoFix: false,
123
+ description: 'No output format specification',
124
+ check: (content) => {
125
+ if (!content || typeof content !== 'string') return null;
126
+
127
+ // Look for output format indicators
128
+ const hasOutputFormat = /##\s+output\s+format/i.test(content);
129
+ const hasFormatSection = /##\s+format/i.test(content);
130
+ const hasResponseFormat = /##\s+response/i.test(content);
131
+
132
+ if (!hasOutputFormat && !hasFormatSection && !hasResponseFormat) {
133
+ return {
134
+ issue: 'Missing output format specification',
135
+ fix: 'Add section specifying expected output format'
136
+ };
137
+ }
138
+ return null;
139
+ }
140
+ },
141
+
142
+ /**
143
+ * Missing constraints section
144
+ * HIGH certainty - agents should have clear constraints
145
+ */
146
+ missing_constraints: {
147
+ id: 'missing_constraints',
148
+ category: 'structure',
149
+ certainty: 'HIGH',
150
+ autoFix: false,
151
+ description: 'No constraints section',
152
+ check: (content) => {
153
+ if (!content || typeof content !== 'string') return null;
154
+
155
+ // Look for constraints indicators (H2 or H3)
156
+ const hasConstraints = /#{2,3}\s+constraints/i.test(content);
157
+ const hasDontSection = /#{2,3}\s+(?:what\s+)?(?:this\s+agent\s+)?(?:you\s+)?(?:must\s+)?not\s+do/i.test(content);
158
+ const hasRulesSection = /#{2,3}\s+rules/i.test(content);
159
+ const hasWorkflowGates = /#{2,3}\s+workflow\s+gates/i.test(content);
160
+
161
+ if (!hasConstraints && !hasDontSection && !hasRulesSection && !hasWorkflowGates) {
162
+ return {
163
+ issue: 'Missing constraints section',
164
+ fix: 'Add section defining agent limitations and boundaries'
165
+ };
166
+ }
167
+ return null;
168
+ }
169
+ },
170
+
171
+ /**
172
+ * Unrestricted tools in frontmatter
173
+ * HIGH certainty - no tools field means all tools allowed
174
+ */
175
+ unrestricted_tools: {
176
+ id: 'unrestricted_tools',
177
+ category: 'tool',
178
+ certainty: 'HIGH',
179
+ autoFix: false,
180
+ description: 'No "tools" field in frontmatter (all tools allowed)',
181
+ check: (frontmatter) => {
182
+ if (!frontmatter || typeof frontmatter !== 'object') return null;
183
+
184
+ if (!frontmatter.tools) {
185
+ return {
186
+ issue: 'No tools restriction - agent has access to all tools',
187
+ fix: 'Add "tools" field to frontmatter with specific tools needed'
188
+ };
189
+ }
190
+ return null;
191
+ }
192
+ },
193
+
194
+ /**
195
+ * Unrestricted Bash tool
196
+ * HIGH certainty - Bash without restrictions is dangerous
197
+ */
198
+ unrestricted_bash: {
199
+ id: 'unrestricted_bash',
200
+ category: 'tool',
201
+ certainty: 'HIGH',
202
+ autoFix: true,
203
+ description: 'Has "Bash" without restrictions (should be "Bash(git:*)" etc)',
204
+ check: (frontmatter) => {
205
+ if (!frontmatter || typeof frontmatter !== 'object') return null;
206
+
207
+ if (frontmatter.tools) {
208
+ const toolsArray = Array.isArray(frontmatter.tools)
209
+ ? frontmatter.tools
210
+ : frontmatter.tools.split(',').map(t => t.trim());
211
+
212
+ const hasUnrestrictedBash = toolsArray.some(t =>
213
+ t === 'Bash' || t === 'bash'
214
+ );
215
+
216
+ if (hasUnrestrictedBash) {
217
+ return {
218
+ issue: 'Unrestricted Bash access',
219
+ fix: 'Replace "Bash" with "Bash(git:*)" or specific scope'
220
+ };
221
+ }
222
+ }
223
+ return null;
224
+ }
225
+ },
226
+
227
+ /**
228
+ * Missing XML structure for complex data
229
+ * MEDIUM certainty - beneficial for structured prompts
230
+ */
231
+ missing_xml_structure: {
232
+ id: 'missing_xml_structure',
233
+ category: 'xml',
234
+ certainty: 'MEDIUM',
235
+ autoFix: false,
236
+ description: 'Could benefit from XML tags for structure',
237
+ check: (content) => {
238
+ if (!content || typeof content !== 'string') return null;
239
+
240
+ // Check if content is complex enough to benefit from XML
241
+ const sectionCount = (content.match(/##\s+/g) || []).length;
242
+ const hasLists = /^\s*[-*]\s+/m.test(content);
243
+ const hasCodeBlocks = /```/g.test(content);
244
+
245
+ // If complex but no XML tags
246
+ if (sectionCount >= 5 || (hasLists && hasCodeBlocks)) {
247
+ const hasXML = /<\w+>/.test(content);
248
+
249
+ if (!hasXML) {
250
+ return {
251
+ issue: 'Complex prompt without XML structure',
252
+ fix: 'Consider using XML tags for key sections (e.g., <rules>, <examples>)'
253
+ };
254
+ }
255
+ }
256
+ return null;
257
+ }
258
+ },
259
+
260
+ /**
261
+ * Unnecessary step-by-step reasoning
262
+ * MEDIUM certainty - step-by-step on simple tasks
263
+ */
264
+ unnecessary_cot: {
265
+ id: 'unnecessary_cot',
266
+ category: 'cot',
267
+ certainty: 'MEDIUM',
268
+ autoFix: false,
269
+ description: 'Step-by-step reasoning on simple tasks',
270
+ check: (content) => {
271
+ if (!content || typeof content !== 'string') return null;
272
+
273
+ // Look for step-by-step language
274
+ const hasStepByStep = /step[- ]by[- ]step/i.test(content);
275
+ const hasThinkingTags = /<thinking>/i.test(content);
276
+
277
+ // Check if task is simple (short prompt, few sections)
278
+ const wordCount = content.split(/\s+/).length;
279
+ const sectionCount = (content.match(/##\s+/g) || []).length;
280
+
281
+ if ((hasStepByStep || hasThinkingTags) && wordCount < 500 && sectionCount < 4) {
282
+ return {
283
+ issue: 'Unnecessary chain-of-thought for simple task',
284
+ fix: 'Remove step-by-step instructions for straightforward operations'
285
+ };
286
+ }
287
+ return null;
288
+ }
289
+ },
290
+
291
+ /**
292
+ * Missing chain-of-thought for complex reasoning
293
+ * MEDIUM certainty - complex tasks benefit from CoT
294
+ */
295
+ missing_cot: {
296
+ id: 'missing_cot',
297
+ category: 'cot',
298
+ certainty: 'MEDIUM',
299
+ autoFix: false,
300
+ description: 'Complex reasoning without thinking guidance',
301
+ check: (content) => {
302
+ if (!content || typeof content !== 'string') return null;
303
+
304
+ // Check if task is complex
305
+ const wordCount = content.split(/\s+/).length;
306
+ const sectionCount = (content.match(/##\s+/g) || []).length;
307
+ const hasAnalysis = /analy[sz]e|evaluate|assess|review/i.test(content);
308
+
309
+ // Look for CoT indicators
310
+ const hasStepByStep = /step[- ]by[- ]step/i.test(content);
311
+ const hasThinkingTags = /<thinking>/i.test(content);
312
+ const hasReasoningGuidance = /reasoning|think\s+through/i.test(content);
313
+
314
+ if (wordCount > 1000 && sectionCount >= 5 && hasAnalysis) {
315
+ if (!hasStepByStep && !hasThinkingTags && !hasReasoningGuidance) {
316
+ return {
317
+ issue: 'Complex task without reasoning guidance',
318
+ fix: 'Add chain-of-thought instructions or <thinking> tags'
319
+ };
320
+ }
321
+ }
322
+ return null;
323
+ }
324
+ },
325
+
326
+ /**
327
+ * Suboptimal example count
328
+ * LOW certainty - 2-5 examples is generally optimal
329
+ */
330
+ example_count_suboptimal: {
331
+ id: 'example_count_suboptimal',
332
+ category: 'example',
333
+ certainty: 'LOW',
334
+ autoFix: false,
335
+ description: 'Not 2-5 examples',
336
+ check: (content) => {
337
+ if (!content || typeof content !== 'string') return null;
338
+
339
+ // Count example sections
340
+ const exampleCount = (content.match(/##\s+example/gi) || []).length;
341
+ const goodExample = (content.match(/<good[- ]?example>/gi) || []).length;
342
+ const badExample = (content.match(/<bad[- ]?example>/gi) || []).length;
343
+
344
+ const totalExamples = exampleCount + goodExample + badExample;
345
+
346
+ if (totalExamples > 0 && (totalExamples < 2 || totalExamples > 5)) {
347
+ return {
348
+ issue: `Found ${totalExamples} examples (optimal: 2-5)`,
349
+ fix: totalExamples < 2
350
+ ? 'Consider adding more examples for clarity'
351
+ : 'Consider reducing examples to avoid token bloat'
352
+ };
353
+ }
354
+ return null;
355
+ }
356
+ },
357
+
358
+ /**
359
+ * Vague instructions
360
+ * MEDIUM certainty - fuzzy language reduces effectiveness
361
+ */
362
+ vague_instructions: {
363
+ id: 'vague_instructions',
364
+ category: 'anti-pattern',
365
+ certainty: 'MEDIUM',
366
+ autoFix: false,
367
+ description: 'Fuzzy language like "usually", "sometimes"',
368
+ check: (content) => {
369
+ if (!content || typeof content !== 'string') return null;
370
+
371
+ // Look for vague words
372
+ const vagueWords = [
373
+ 'usually', 'sometimes', 'often', 'rarely', 'maybe',
374
+ 'might', 'could', 'should probably', 'try to',
375
+ 'as much as possible', 'if possible'
376
+ ];
377
+
378
+ const found = [];
379
+ for (const word of vagueWords) {
380
+ const regex = new RegExp(`\\b${word}\\b`, 'gi');
381
+ if (regex.test(content)) {
382
+ found.push(word);
383
+ }
384
+ }
385
+
386
+ if (found.length > 3) {
387
+ return {
388
+ issue: `Found vague language: ${found.slice(0, 3).join(', ')}...`,
389
+ fix: 'Replace fuzzy language with clear, definitive instructions'
390
+ };
391
+ }
392
+ return null;
393
+ }
394
+ },
395
+
396
+ /**
397
+ * Prompt bloat
398
+ * LOW certainty - long prompts use more tokens
399
+ */
400
+ prompt_bloat: {
401
+ id: 'prompt_bloat',
402
+ category: 'anti-pattern',
403
+ certainty: 'LOW',
404
+ autoFix: false,
405
+ description: 'Token count > 2000',
406
+ maxTokens: 2000,
407
+ check: (content) => {
408
+ if (!content || typeof content !== 'string') return null;
409
+
410
+ // Rough token estimate (1 token ≈ 4 characters)
411
+ const estimatedTokens = Math.ceil(content.length / 4);
412
+
413
+ if (estimatedTokens > 2000) {
414
+ return {
415
+ issue: `Prompt ~${estimatedTokens} tokens (max recommended: 2000)`,
416
+ fix: 'Simplify prompt, remove redundant sections, or use XML for compression'
417
+ };
418
+ }
419
+ return null;
420
+ }
421
+ },
422
+
423
+ // ============================================
424
+ // CROSS-PLATFORM COMPATIBILITY PATTERNS
425
+ // ============================================
426
+
427
+ /**
428
+ * Hardcoded .claude/ state directory
429
+ * HIGH certainty - breaks OpenCode/Codex
430
+ */
431
+ hardcoded_claude_dir: {
432
+ id: 'hardcoded_claude_dir',
433
+ category: 'cross-platform',
434
+ certainty: 'HIGH',
435
+ autoFix: false,
436
+ description: 'Hardcoded .claude/ directory (breaks OpenCode/Codex)',
437
+ check: (content) => {
438
+ if (!content || typeof content !== 'string') return null;
439
+
440
+ // Look for hardcoded .claude/ references
441
+ const hasHardcoded = /\.claude\//.test(content);
442
+ // Exclude if using AI_STATE_DIR
443
+ const usesEnvVar = /AI_STATE_DIR|\$\{.*STATE.*\}/i.test(content);
444
+
445
+ if (hasHardcoded && !usesEnvVar) {
446
+ return {
447
+ issue: 'Hardcoded .claude/ directory path',
448
+ fix: 'Use AI_STATE_DIR env var or platform detection for cross-platform support'
449
+ };
450
+ }
451
+ return null;
452
+ }
453
+ },
454
+
455
+ /**
456
+ * CLAUDE.md reference without AGENTS.md
457
+ * MEDIUM certainty - OpenCode/Codex use AGENTS.md
458
+ */
459
+ claude_md_reference: {
460
+ id: 'claude_md_reference',
461
+ category: 'cross-platform',
462
+ certainty: 'MEDIUM',
463
+ autoFix: false,
464
+ description: 'References CLAUDE.md without also checking AGENTS.md',
465
+ check: (content) => {
466
+ if (!content || typeof content !== 'string') return null;
467
+
468
+ const hasClaudeMd = /CLAUDE\.md/i.test(content);
469
+ const hasAgentsMd = /AGENTS\.md/i.test(content);
470
+
471
+ // Only flag if mentions CLAUDE.md but not AGENTS.md
472
+ if (hasClaudeMd && !hasAgentsMd) {
473
+ return {
474
+ issue: 'References CLAUDE.md without AGENTS.md',
475
+ fix: 'Also check for AGENTS.md (used by OpenCode/Codex)'
476
+ };
477
+ }
478
+ return null;
479
+ }
480
+ },
481
+
482
+ /**
483
+ * Missing XML for cross-model compatibility
484
+ * LOW certainty - XML helps both Claude and GPT-4
485
+ */
486
+ no_xml_for_data: {
487
+ id: 'no_xml_for_data',
488
+ category: 'cross-platform',
489
+ certainty: 'LOW',
490
+ autoFix: false,
491
+ description: 'Data blocks without XML tags (helps both Claude and GPT-4)',
492
+ check: (content) => {
493
+ if (!content || typeof content !== 'string') return null;
494
+
495
+ // Check if has code blocks or lists but no XML
496
+ const hasCodeBlocks = /```[\s\S]+?```/.test(content);
497
+ const hasLists = /^[-*]\s+.+$/m.test(content);
498
+ const hasXML = /<\w+>[\s\S]*?<\/\w+>/.test(content);
499
+ const sectionCount = (content.match(/^##\s+/gm) || []).length;
500
+
501
+ // Complex content without XML
502
+ if ((hasCodeBlocks || hasLists) && sectionCount >= 4 && !hasXML) {
503
+ return {
504
+ issue: 'Complex content without XML tags',
505
+ fix: 'Wrap data blocks in XML tags (e.g., <context>, <rules>) for cross-model compatibility'
506
+ };
507
+ }
508
+ return null;
509
+ }
510
+ }
511
+ };
512
+
513
+ /**
514
+ * Get all patterns
515
+ * @returns {Object} All agent patterns
516
+ */
517
+ function getAllPatterns() {
518
+ return agentPatterns;
519
+ }
520
+
521
+ /**
522
+ * Get patterns by certainty level
523
+ * @param {string} certainty - HIGH, MEDIUM, or LOW
524
+ * @returns {Object} Filtered patterns
525
+ */
526
+ function getPatternsByCertainty(certainty) {
527
+ const result = {};
528
+ for (const [name, pattern] of Object.entries(agentPatterns)) {
529
+ if (pattern.certainty === certainty) {
530
+ result[name] = pattern;
531
+ }
532
+ }
533
+ return result;
534
+ }
535
+
536
+ /**
537
+ * Get patterns by category
538
+ * @param {string} category - structure, tool, xml, cot, example, anti-pattern
539
+ * @returns {Object} Filtered patterns
540
+ */
541
+ function getPatternsByCategory(category) {
542
+ const result = {};
543
+ for (const [name, pattern] of Object.entries(agentPatterns)) {
544
+ if (pattern.category === category) {
545
+ result[name] = pattern;
546
+ }
547
+ }
548
+ return result;
549
+ }
550
+
551
+ /**
552
+ * Get auto-fixable patterns
553
+ * @returns {Object} Patterns with autoFix: true
554
+ */
555
+ function getAutoFixablePatterns() {
556
+ const result = {};
557
+ for (const [name, pattern] of Object.entries(agentPatterns)) {
558
+ if (pattern.autoFix) {
559
+ result[name] = pattern;
560
+ }
561
+ }
562
+ return result;
563
+ }
564
+
565
+ module.exports = {
566
+ agentPatterns,
567
+ getAllPatterns,
568
+ getPatternsByCertainty,
569
+ getPatternsByCategory,
570
+ getAutoFixablePatterns
571
+ };