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
@@ -18,10 +18,30 @@ function transformBodyForOpenCode(content, repoRoot) {
18
18
  content = content.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, '${PLUGIN_ROOT}');
19
19
  content = content.replace(/\$CLAUDE_PLUGIN_ROOT/g, '$PLUGIN_ROOT');
20
20
 
21
- content = content.replace(/\.claude\//g, '.opencode/');
22
- content = content.replace(/\.claude'/g, ".opencode'");
23
- content = content.replace(/\.claude"/g, '.opencode"');
24
- content = content.replace(/\.claude`/g, '.opencode`');
21
+ // Replace .claude/ paths with .opencode/ but preserve platform documentation lists
22
+ // that enumerate all three platforms (Claude Code: .claude/, OpenCode: .opencode/, Codex: .codex/)
23
+ // Also preserve {AI_STATE_DIR} references which are platform-agnostic
24
+ content = content.replace(/\.claude\//g, (match, offset) => {
25
+ const context = content.substring(Math.max(0, offset - 60), offset + match.length + 10);
26
+ // Skip if inside a platform enumeration (e.g., "Claude Code: `.claude/`")
27
+ if (/Claude Code:/.test(context)) return match;
28
+ return '.opencode/';
29
+ });
30
+ content = content.replace(/\.claude'/g, (match, offset) => {
31
+ const context = content.substring(Math.max(0, offset - 60), offset + match.length + 10);
32
+ if (/Claude Code:/.test(context)) return match;
33
+ return ".opencode'";
34
+ });
35
+ content = content.replace(/\.claude"/g, (match, offset) => {
36
+ const context = content.substring(Math.max(0, offset - 60), offset + match.length + 10);
37
+ if (/Claude Code:/.test(context)) return match;
38
+ return '.opencode"';
39
+ });
40
+ content = content.replace(/\.claude`/g, (match, offset) => {
41
+ const context = content.substring(Math.max(0, offset - 60), offset + match.length + 10);
42
+ if (/Claude Code:/.test(context)) return match;
43
+ return '.opencode`';
44
+ });
25
45
 
26
46
  const plugins = discovery.discoverPlugins(repoRoot);
27
47
  if (plugins.length > 0) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentsys",
3
- "version": "5.0.3",
3
+ "version": "5.1.0",
4
4
  "description": "A modular runtime and orchestration system for AI agents - works with Claude Code, OpenCode, and Codex CLI",
5
5
  "main": "lib/platform/detect-platform.js",
6
6
  "type": "commonjs",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agnix",
3
- "version": "5.0.3",
3
+ "version": "5.1.0",
4
4
  "description": "Lint agent configurations before they break your workflow. Validates Skills, Hooks, MCP, Memory, Plugins.",
5
5
  "author": {
6
6
  "name": "Avi Fenesh",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: agnix
3
3
  description: "Use when user asks to 'lint agent configs', 'validate skills', 'check CLAUDE.md', 'validate hooks', 'lint MCP'. Validates agent configuration files against 155 rules across 10+ AI tools."
4
- version: 5.0.3
4
+ version: 5.1.0
5
5
  argument-hint: "[path] [--fix] [--strict] [--target=claude-code|cursor|codex]"
6
6
  ---
7
7
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "audit-project",
3
- "version": "5.0.3",
3
+ "version": "5.1.0",
4
4
  "description": "Multi-agent iterative code review until zero issues remain",
5
5
  "author": {
6
6
  "name": "Avi Fenesh",
@@ -18,10 +18,30 @@ function transformBodyForOpenCode(content, repoRoot) {
18
18
  content = content.replace(/\$\{CLAUDE_PLUGIN_ROOT\}/g, '${PLUGIN_ROOT}');
19
19
  content = content.replace(/\$CLAUDE_PLUGIN_ROOT/g, '$PLUGIN_ROOT');
20
20
 
21
- content = content.replace(/\.claude\//g, '.opencode/');
22
- content = content.replace(/\.claude'/g, ".opencode'");
23
- content = content.replace(/\.claude"/g, '.opencode"');
24
- content = content.replace(/\.claude`/g, '.opencode`');
21
+ // Replace .claude/ paths with .opencode/ but preserve platform documentation lists
22
+ // that enumerate all three platforms (Claude Code: .claude/, OpenCode: .opencode/, Codex: .codex/)
23
+ // Also preserve {AI_STATE_DIR} references which are platform-agnostic
24
+ content = content.replace(/\.claude\//g, (match, offset) => {
25
+ const context = content.substring(Math.max(0, offset - 60), offset + match.length + 10);
26
+ // Skip if inside a platform enumeration (e.g., "Claude Code: `.claude/`")
27
+ if (/Claude Code:/.test(context)) return match;
28
+ return '.opencode/';
29
+ });
30
+ content = content.replace(/\.claude'/g, (match, offset) => {
31
+ const context = content.substring(Math.max(0, offset - 60), offset + match.length + 10);
32
+ if (/Claude Code:/.test(context)) return match;
33
+ return ".opencode'";
34
+ });
35
+ content = content.replace(/\.claude"/g, (match, offset) => {
36
+ const context = content.substring(Math.max(0, offset - 60), offset + match.length + 10);
37
+ if (/Claude Code:/.test(context)) return match;
38
+ return '.opencode"';
39
+ });
40
+ content = content.replace(/\.claude`/g, (match, offset) => {
41
+ const context = content.substring(Math.max(0, offset - 60), offset + match.length + 10);
42
+ if (/Claude Code:/.test(context)) return match;
43
+ return '.opencode`';
44
+ });
25
45
 
26
46
  const plugins = discovery.discoverPlugins(repoRoot);
27
47
  if (plugins.length > 0) {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "consult",
3
- "version": "5.0.3",
3
+ "version": "5.1.0",
4
4
  "description": "Cross-tool AI consultation: get second opinions from Gemini, Codex, Claude, OpenCode, or Copilot CLI",
5
5
  "author": {
6
6
  "name": "Avi Fenesh",
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: consult-agent
3
- description: "Execute cross-tool AI consultations via Task spawning. Use when agents or workflows need a second opinion from Gemini, Codex, Claude, OpenCode, or Copilot."
3
+ description: "Execute cross-tool AI consultations via Task spawning. Use when agents or workflows need a second opinion from Gemini, Codex, Claude, OpenCode, or Copilot. Supports multi-instance parallel consultations (count > 1)."
4
4
  tools:
5
5
  - Skill
6
6
  - Bash(claude:*)
@@ -22,11 +22,13 @@ model: sonnet
22
22
 
23
23
  You are the programmatic interface for cross-tool AI consultations. The consult plugin follows the standard Command -> Agent -> Skill pattern:
24
24
 
25
- - **Command** (`/consult`): User-facing entry point. Handles interactive parameter selection (tool picker, effort picker, model picker via AskUserQuestion). Invokes the consult skill directly. Does NOT spawn this agent.
26
- - **Agent** (this file): Programmatic entry point for other agents and workflows via Task(). Requires all parameters pre-resolved by the caller. Invokes the consult skill, then executes the CLI command it returns via Bash.
27
- - **Skill** (`consult`): Implementation source of truth. Provides provider configurations, model mappings, command templates, context packaging, and output parsing logic. Both the command and this agent invoke the skill before executing anything.
25
+ - **Command** (`/consult`): User-facing entry point. Handles natural language parsing and interactive parameter selection. For single instance (count=1), invokes the consult skill directly. For multi-instance (count>1), spawns this agent.
26
+ - **Agent** (this file): Programmatic entry point. Requires all parameters pre-resolved by the caller. Handles both single-instance (invoke skill) and multi-instance (parallel execution). Used by the command for multi-instance and by other agents/workflows via Task().
27
+ - **Skill** (`consult`): Implementation source of truth. Provides provider configurations, model mappings, command templates, context packaging, and output parsing logic.
28
28
 
29
- Use this agent when the /consult command is not available (e.g., from other agents or automated workflows that need a second opinion).
29
+ Use this agent for:
30
+ 1. Multi-instance consultations (count > 1) dispatched by the /consult command
31
+ 2. Programmatic consultations from other agents or automated workflows
30
32
 
31
33
  ## Why Sonnet Model
32
34
 
@@ -48,13 +50,28 @@ Extract from prompt. ALL parameters MUST be pre-resolved by the caller (the /con
48
50
  - **context**: Context mode (diff, file, none) - default: none
49
51
  - **continueSession**: Session ID or true/false
50
52
  - **sessionFile**: Path to session state file
53
+ - **count**: Number of parallel instances (1-5, default: 1)
51
54
 
52
55
  If any required parameter is missing, return an error as plain JSON:
53
56
  ```json
54
57
  {"error": "Missing required parameter: [param]. The caller must resolve all parameters before spawning this agent."}
55
58
  ```
56
59
 
57
- ### 2. Invoke Consult Skill (MUST)
60
+ ### 2. Route: Single vs Multi-Instance
61
+
62
+ If both `continueSession` is set and `count > 1`, return:
63
+ ```json
64
+ {"error": "Cannot use --continue with count > 1. Session resume applies to a single tool session."}
65
+ ```
66
+
67
+ Validate count: if provided, must be 1-5. If out of range, return `{"error": "Instance count must be 1-5. Got: [count]"}`.
68
+
69
+ If `count` is 1 (or not provided), follow the **Single Instance** path (Step 3).
70
+ If `count` is 2-5, follow the **Multi-Instance** path (Step 4).
71
+
72
+ ### 3. Single Instance (count=1)
73
+
74
+ #### 3a. Invoke Consult Skill (MUST)
58
75
 
59
76
  You MUST invoke the `consult` skill using the Skill tool. Pass all parsed arguments. The skill is the authoritative source for provider configurations, model mappings, command building, context packaging, session loading, and output parsing. Do not bypass the skill.
60
77
 
@@ -65,11 +82,11 @@ Args: [question] --tool=[tool] --effort=[effort] [--model=[model]] [--context=[c
65
82
  Example: "Review this function" --tool=claude --effort=high --model=opus
66
83
  ```
67
84
 
68
- ### 3. Execute Command
85
+ #### 3b. Execute Command
69
86
 
70
87
  Run the CLI command returned by the skill via Bash with a 120-second timeout.
71
88
 
72
- ### 4. Parse and Return Result
89
+ #### 3c. Parse and Return Result
73
90
 
74
91
  Parse the response using the method specified by the skill for the target tool, then format and display the result as human-friendly text:
75
92
 
@@ -82,10 +99,105 @@ The results of the consultation are:
82
99
 
83
100
  Set `continuable: true` for Claude, Gemini, Codex, and OpenCode (tools with session resume support). Only Copilot is non-continuable. Each tool uses a different resume mechanism: Claude/Gemini use `--resume`, Codex uses `codex exec resume`, OpenCode uses `--session`/`--continue`.
84
101
 
85
- ### 5. Save Session State
102
+ #### 3d. Save Session State
86
103
 
87
104
  Write session state to the sessionFile path provided by the command for continuity.
88
105
 
106
+ ### 4. Multi-Instance (count > 1)
107
+
108
+ When count > 1, execute N parallel consultations with the same tool and parameters.
109
+
110
+ #### 4a. Invoke Consult Skill Once
111
+
112
+ Invoke the `consult` skill once to get the resolved command template and provider configuration. This gives you the exact CLI command to run for this tool/model/effort combination. Do NOT execute the command from the skill response yet.
113
+
114
+ #### 4b. Write Indexed Temp Files
115
+
116
+ Write the question to N indexed temp files using the Write tool:
117
+ - `{AI_STATE_DIR}/consult/question-1.tmp`
118
+ - `{AI_STATE_DIR}/consult/question-2.tmp`
119
+ - ... through `question-{count}.tmp`
120
+
121
+ Platform state directory:
122
+ - Claude Code: `.claude/`
123
+ - OpenCode: `.opencode/`
124
+ - Codex CLI: `.codex/`
125
+
126
+ All temp files contain the same question text (with context prepended if applicable).
127
+
128
+ #### 4c. Execute N Commands in Parallel
129
+
130
+ Run N Bash commands **in parallel** (multiple Bash tool calls in a single message). Each command uses the template from Step 4a but points to its own indexed temp file. Set 120-second timeout on each.
131
+
132
+ Example for 3 parallel Codex calls:
133
+ ```
134
+ Bash: codex exec "$(cat "{AI_STATE_DIR}/consult/question-1.tmp")" --json -m "gpt-5.3-codex" -c model_reasoning_effort="high"
135
+ Bash: codex exec "$(cat "{AI_STATE_DIR}/consult/question-2.tmp")" --json -m "gpt-5.3-codex" -c model_reasoning_effort="high"
136
+ Bash: codex exec "$(cat "{AI_STATE_DIR}/consult/question-3.tmp")" --json -m "gpt-5.3-codex" -c model_reasoning_effort="high"
137
+ ```
138
+
139
+ #### 4d. Parse and Format Results
140
+
141
+ Parse each response using the skill's output parsing rules for the target tool. Format as numbered responses:
142
+
143
+ ```
144
+ # Multi-Consultation Results
145
+
146
+ Tool: {tool}, Model: {model}, Effort: {effort}, Instances: {count}
147
+
148
+ ---
149
+
150
+ ## Response 1 (Duration: {duration_ms}ms)
151
+
152
+ {response_1}
153
+
154
+ ---
155
+
156
+ ## Response 2 (Duration: {duration_ms}ms)
157
+
158
+ {response_2}
159
+
160
+ ---
161
+
162
+ [... for each instance ...]
163
+
164
+ ---
165
+
166
+ ## Synthesis
167
+
168
+ Key agreement points:
169
+ - [Common themes across responses]
170
+
171
+ Key differences:
172
+ - [Where responses diverge]
173
+ ```
174
+
175
+ If some instances failed but others succeeded, show the successful responses and note failures:
176
+ `[WARN] Instance {N} failed: {error}. Showing {M} of {count} responses.`
177
+
178
+ #### 4e. Clean Up and Save State
179
+
180
+ 1. Delete all indexed temp files (`question-1.tmp` through `question-{count}.tmp`)
181
+ 2. Save multi-session state to `{AI_STATE_DIR}/consult/last-multi-session.json`:
182
+
183
+ ```json
184
+ {
185
+ "tool": "codex",
186
+ "model": "gpt-5.3-codex",
187
+ "effort": "high",
188
+ "count": 3,
189
+ "timestamp": "{ISO 8601 timestamp of execution}",
190
+ "question": "original question text",
191
+ "sessions": [
192
+ {"session_id": "abc-123", "continuable": true},
193
+ {"session_id": "def-456", "continuable": true},
194
+ {"session_id": "ghi-789", "continuable": true}
195
+ ]
196
+ }
197
+ ```
198
+
199
+ 3. Also save the first session to `{AI_STATE_DIR}/consult/last-session.json` (standard format) so `--continue` works.
200
+
89
201
  ## Error Handling
90
202
 
91
203
  | Error | Action |
@@ -98,26 +210,7 @@ Write session state to the sessionFile path provided by the command for continui
98
210
 
99
211
  ## Output Sanitization
100
212
 
101
- Before including any consulted tool's response in the output, scan the response text and redact matches for these patterns:
102
-
103
- | Pattern | Description | Replacement |
104
- |---------|-------------|-------------|
105
- | `sk-[a-zA-Z0-9_-]{20,}` | Anthropic API keys | `[REDACTED_API_KEY]` |
106
- | `sk-proj-[a-zA-Z0-9_-]{20,}` | OpenAI project keys | `[REDACTED_API_KEY]` |
107
- | `sk-ant-[a-zA-Z0-9_-]{20,}` | Anthropic API keys (ant prefix) | `[REDACTED_API_KEY]` |
108
- | `AIza[a-zA-Z0-9_-]{30,}` | Google API keys | `[REDACTED_API_KEY]` |
109
- | `ghp_[a-zA-Z0-9]{36,}` | GitHub personal access tokens | `[REDACTED_TOKEN]` |
110
- | `gho_[a-zA-Z0-9]{36,}` | GitHub OAuth tokens | `[REDACTED_TOKEN]` |
111
- | `github_pat_[a-zA-Z0-9_]{20,}` | GitHub fine-grained PATs | `[REDACTED_TOKEN]` |
112
- | `ANTHROPIC_API_KEY=[^\s]+` | Key assignment in env output | `ANTHROPIC_API_KEY=[REDACTED]` |
113
- | `OPENAI_API_KEY=[^\s]+` | Key assignment in env output | `OPENAI_API_KEY=[REDACTED]` |
114
- | `GOOGLE_API_KEY=[^\s]+` | Key assignment in env output | `GOOGLE_API_KEY=[REDACTED]` |
115
- | `GEMINI_API_KEY=[^\s]+` | Key assignment in env output | `GEMINI_API_KEY=[REDACTED]` |
116
- | `AKIA[A-Z0-9]{16}` | AWS access keys | `[REDACTED_AWS_KEY]` |
117
- | `ASIA[A-Z0-9]{16}` | AWS session tokens | `[REDACTED_AWS_KEY]` |
118
- | `Bearer [a-zA-Z0-9_-]{20,}` | Authorization headers | `Bearer [REDACTED]` |
119
-
120
- Apply redaction to the full response text before inserting into the result JSON. If any redaction occurs, append a note: `[WARN] Sensitive tokens were redacted from the response.`
213
+ Apply the redaction patterns from the consult skill (`plugins/consult/skills/consult/SKILL.md`, Output Sanitization section). The skill is the canonical source for all redaction patterns.
121
214
 
122
215
  ## Critical Constraints
123
216
 
@@ -1,61 +1,88 @@
1
1
  ---
2
2
  name: consult
3
3
  description: Consult another AI CLI tool for a second opinion. Use when you want to cross-check ideas, get alternative approaches, or validate decisions with Gemini, Codex, Claude, OpenCode, or Copilot.
4
- codex-description: 'Use when user asks to "consult gemini", "ask codex", "get second opinion", "cross-check with claude", "consult another AI", "ask opencode", "copilot opinion". Queries another AI CLI tool and returns the response.'
5
- argument-hint: "[question] [--tool=gemini|codex|claude|opencode|copilot] [--effort=low|medium|high|max] [--model=MODEL] [--context=diff|file=PATH|none] [--continue]"
6
- allowed-tools: Skill, Bash(git:*), Bash(claude:*), Bash(gemini:*), Bash(codex:*), Bash(opencode:*), Bash(copilot:*), Bash(where.exe:*), Bash(which:*), Read, Write, AskUserQuestion
4
+ codex-description: 'Use when user asks to "consult gemini", "ask codex", "get second opinion", "cross-check with claude", "consult another AI", "ask opencode", "copilot opinion", "ask 3 codex", "multi-consult". Queries another AI CLI tool and returns the response.'
5
+ argument-hint: "[natural language or flags] [--tool] [--effort] [--model] [--context] [--continue] [--count=N]"
6
+ allowed-tools: Skill, Task, Bash(git:*), Bash(claude:*), Bash(gemini:*), Bash(codex:*), Bash(opencode:*), Bash(copilot:*), Bash(where.exe:*), Bash(which:*), Read, Write, AskUserQuestion
7
7
  ---
8
8
 
9
9
  # /consult - Cross-Tool AI Consultation
10
10
 
11
- You are executing the /consult command. Your job is to consult another AI CLI tool, get its response, and present the results to the user.
11
+ You are executing the /consult command. Your job is to parse the user's request (natural language or flags), resolve missing parameters interactively, and execute the consultation.
12
12
 
13
13
  ## Constraints
14
14
 
15
15
  - NEVER expose API keys in commands or output
16
16
  - NEVER run with permission-bypassing flags (`--dangerously-skip-permissions`, `bypassPermissions`)
17
- - MUST use safe-mode defaults (`-a suggest` for Codex, `--allowedTools "Read,Glob,Grep"` for Claude)
17
+ - MUST use safe-mode defaults (`--allowedTools "Read,Glob,Grep"` for Claude, `-c model_reasoning_effort` for Codex)
18
18
  - MUST enforce 120s timeout on all tool executions
19
- - MUST validate `--tool` against allow-list: gemini, codex, claude, opencode, copilot (reject all others)
19
+ - MUST validate tool names against allow-list: gemini, codex, claude, opencode, copilot (reject all others)
20
20
  - MUST validate `--context=file=PATH` is within the project directory (reject absolute paths outside cwd)
21
21
  - MUST quote all user-provided values in shell commands to prevent injection
22
22
  - NEVER execute tools the user has not explicitly requested
23
23
 
24
- ## Arguments
24
+ ## Execution
25
25
 
26
- Parse from $ARGUMENTS:
26
+ ### Phase 1: Parse Input (Flags + Natural Language)
27
27
 
28
- - **question**: What to ask the consulted tool (required unless --continue)
29
- - **--tool**: Target tool: `gemini`, `codex`, `claude`, `opencode`, `copilot` (interactive picker if omitted)
30
- - **--effort**: Thinking effort: `low`, `medium`, `high`, `max` (interactive picker if omitted)
31
- - **--model**: Specific model name (interactive picker if omitted). Free text.
32
- - **--context**: Auto-include context: `diff` (git diff), `file=PATH` (attach specific file), `none` (default)
33
- - **--continue**: Continue last consultation session, or `--continue=SESSION_ID` for specific session
28
+ Parse `$ARGUMENTS` using both explicit flags and natural language extraction. Flags always take priority over NLP when both provide the same parameter.
34
29
 
35
- ## Execution
30
+ #### Step 1a: Extract explicit flags
31
+
32
+ Look for and remove these flags from `$ARGUMENTS`:
33
+
34
+ 1. `--tool=VALUE` or `--tool VALUE` where VALUE is one of: gemini, codex, claude, opencode, copilot
35
+ 2. `--effort=VALUE` or `--effort VALUE` where VALUE is one of: low, medium, high, max
36
+ 3. `--model=VALUE` or `--model VALUE` (any string, including quoted)
37
+ 4. `--context=VALUE` where VALUE is: diff, file=PATH, or none
38
+ 5. `--continue` (optionally `--continue=SESSION_ID`)
39
+ 6. `--count=N` where N is 1-5
40
+
41
+ Remove all matched flags and their values from `$ARGUMENTS`.
42
+
43
+ #### Step 1b: Natural language extraction (on remaining text)
44
+
45
+ After removing flags, parse the remaining text for these patterns:
36
46
 
37
- ### Phase 1: Parse Arguments
47
+ **Tool extraction** (case-insensitive):
48
+ - "with {tool}" (e.g., "with codex") -> tool
49
+ - "ask {tool}" (e.g., "ask gemini") -> tool
50
+ - "consult {tool}" -> tool
51
+ - "{tool} about" (e.g., "codex about") -> tool
52
+ - Tool names: claude, gemini, codex, opencode, copilot
38
53
 
39
- Extract these values from `$ARGUMENTS`:
54
+ **Count extraction**:
55
+ - "ask {N} {tool}" (e.g., "ask 3 codex") -> count=N, tool
56
+ - "{N} {tool}" (e.g., "3 codex") -> count=N, tool
57
+ - "{N} instances" -> count=N
58
+ - "few instances" / "multiple" / "several" -> count=ambiguous (ask user in Phase 2)
40
59
 
41
- 1. Look for `--tool=VALUE` or `--tool VALUE` where VALUE MUST be one of: gemini, codex, claude, opencode, copilot (reject others)
42
- 2. Look for `--effort=VALUE` or `--effort VALUE` where VALUE MUST be one of: low, medium, high, max
43
- 3. Look for `--model=VALUE` or `--model VALUE` (any string, including quoted strings like `"my model"`)
44
- 4. Look for `--context=VALUE` where VALUE is: diff, file=PATH, or none
45
- 5. Look for `--continue` (optionally `--continue=SESSION_ID`)
46
- 6. Remove all matched flags (including their values) from `$ARGUMENTS`. Handle quoted flag values (e.g., `--model "gpt 4"`) by removing the entire quoted string. Everything remaining is the **question**.
60
+ **Count validation**: After extracting count (from flags or NLP), validate: 1 <= count <= 5. If count < 1 or count > 5, show `[ERROR] Instance count must be 1-5. Got: {count}` and stop.
47
61
 
48
- If no question text and no `--continue` flag found, show:
62
+ **Effort extraction**:
63
+ - "quick" / "fast" / "brief" -> effort=low
64
+ - "thorough" / "deep" / "carefully" / "detailed" -> effort=high
65
+ - "maximum" / "max effort" / "exhaustive" -> effort=max
66
+
67
+ **Question extraction**:
68
+ - Text after "about" is the question (e.g., "with codex about my auth approach" -> question="my auth approach")
69
+ - If no "about" pattern, everything remaining after removing tool/count/effort markers is the question
70
+
71
+ **Precedence rule**: Flags from Step 1a always override NLP from Step 1b.
72
+
73
+ If no question text and no `--continue` flag found after both steps:
49
74
  ```
50
- [ERROR] Usage: /consult "your question" [--tool=gemini|codex|claude|opencode|copilot] [--effort=low|medium|high|max]
75
+ [ERROR] Usage: /consult "your question" or /consult with gemini about your question
51
76
  ```
52
77
 
53
- ### Phase 2: Interactive Parameter Selection
78
+ ### Phase 2: Interactive Parameter Resolution
54
79
 
55
- MUST resolve ALL missing parameters interactively before Phase 3. ONLY skip this phase if ALL of --tool, --effort, AND --model are explicitly provided by the user in $ARGUMENTS. Do NOT silently default any parameter.
80
+ MUST resolve ALL missing parameters interactively. ONLY skip this phase if ALL required params (tool, effort, model) are resolved AND either a question exists or --continue is present. Do NOT silently default any parameter.
56
81
 
57
82
  #### Step 2a: Handle --continue
58
83
 
84
+ **Note:** `--continue` and `--count > 1` are mutually exclusive. Session resume applies to a single tool session. If both are present, show `[ERROR] Cannot use --continue with --count > 1. Use --continue for single session resume.` and stop.
85
+
59
86
  If `--continue` is present:
60
87
  1. Read the session file at `{AI_STATE_DIR}/consult/last-session.json`
61
88
 
@@ -66,9 +93,9 @@ If `--continue` is present:
66
93
  2. If the file exists, restore the saved tool, session_id, and model from it
67
94
  3. If the file does not exist, show `[WARN] No previous session found` and proceed as a fresh consultation
68
95
 
69
- #### Step 2b: Batch Selection (tool + effort)
96
+ #### Step 2b: Detect installed tools
70
97
 
71
- First, detect which tools are installed by running all 5 checks **in parallel** via Bash:
98
+ Run all 5 checks **in parallel** via Bash:
72
99
 
73
100
  - `where.exe <tool> 2>nul && echo FOUND || echo NOTFOUND` (Windows)
74
101
  - `which <tool> 2>/dev/null && echo FOUND || echo NOTFOUND` (Unix)
@@ -77,12 +104,14 @@ Check for: claude, gemini, codex, opencode, copilot.
77
104
 
78
105
  If zero tools are installed: `[ERROR] No AI CLI tools found. Install at least one: npm i -g @anthropic-ai/claude-code, npm i -g @openai/codex, npm i -g opencode-ai`
79
106
 
80
- Then use a SINGLE AskUserQuestion call to ask all missing parameters at once. Include only the questions for parameters NOT already provided in $ARGUMENTS:
107
+ #### Step 2c: Batch selection for missing params
108
+
109
+ Use a SINGLE AskUserQuestion call to ask all missing parameters at once. Include ONLY questions for parameters NOT already resolved from Phase 1:
81
110
 
82
111
  ```
83
112
  AskUserQuestion:
84
113
  questions:
85
- - header: "AI Tool" # SKIP if --tool provided
114
+ - header: "AI Tool" # SKIP if tool resolved
86
115
  question: "Which AI tool should I consult?"
87
116
  multiSelect: false
88
117
  options (only if installed):
@@ -92,7 +121,7 @@ AskUserQuestion:
92
121
  - label: "OpenCode" description: "Flexible model choice"
93
122
  - label: "Copilot" description: "GitHub-integrated AI"
94
123
 
95
- - header: "Effort" # SKIP if --effort provided
124
+ - header: "Effort" # SKIP if effort resolved
96
125
  question: "What thinking effort level?"
97
126
  multiSelect: false
98
127
  options:
@@ -100,16 +129,29 @@ AskUserQuestion:
100
129
  - label: "Low" description: "Fast, minimal reasoning"
101
130
  - label: "High" description: "Thorough analysis"
102
131
  - label: "Max" description: "Maximum reasoning depth"
132
+
133
+ - header: "Instances" # SKIP if count resolved or not hinted
134
+ question: "How many parallel consultations?"
135
+ multiSelect: false
136
+ options:
137
+ - label: "1 (Single)" description: "Standard single consultation"
138
+ - label: "2 (Compare)" description: "Two responses to compare"
139
+ - label: "3 (Panel)" description: "Three perspectives"
140
+ - label: "5 (Full spread)" description: "Five diverse perspectives"
103
141
  ```
104
142
 
105
- Map tool choice to lowercase: "Claude" -> "claude", "Codex" -> "codex", etc.
106
- Map effort choice: "Medium (Recommended)" -> "medium", "Low" -> "low", "High" -> "high", "Max" -> "max".
143
+ ONLY show the Instances question if:
144
+ - The user explicitly mentioned multiple instances (e.g., "few", "multiple", "several")
145
+ - The count was set but ambiguous
146
+ Do NOT show Instances question for simple single-tool requests. Default count=1 silently when no multi-instance intent detected.
107
147
 
108
- IMPORTANT: Do NOT skip any missing parameter. Do NOT silently default --effort to "medium" or --tool to any value. Present pickers for ALL unresolved parameters.
148
+ Map tool choice to lowercase: "Claude" -> "claude", "Codex" -> "codex", etc.
149
+ Map effort choice: "Medium (Recommended)" -> "medium", "Low" -> "low", etc.
150
+ Map count choice: "1 (Single)" -> 1, "2 (Compare)" -> 2, "3 (Panel)" -> 3.
109
151
 
110
- #### Step 2c: Model Selection (MUST ask if no --model)
152
+ #### Step 2d: Model selection (MUST ask if no --model)
111
153
 
112
- After tool is resolved (from Step 2b or $ARGUMENTS), present a model picker with options specific to the selected tool. The user can always type a custom model name via the "Other" option.
154
+ After tool is resolved, present a model picker with options specific to the selected tool. The user can always type a custom model name via the "Other" option.
113
155
 
114
156
  **For Claude:**
115
157
  ```
@@ -149,7 +191,7 @@ AskUserQuestion:
149
191
  - label: "gpt-5.3-codex" description: "Latest, most capable coding model"
150
192
  - label: "gpt-5.2-codex" description: "Strong coding model"
151
193
  - label: "gpt-5.2" description: "General purpose GPT-5.2"
152
- - label: "gpt-5-codex-mini" description: "Cost-effective, 4x more usage"
194
+ - label: "gpt-5.3-codex-spark" description: "Cost-effective, 4x more usage"
153
195
  ```
154
196
 
155
197
  **For OpenCode:**
@@ -176,17 +218,21 @@ AskUserQuestion:
176
218
  options:
177
219
  - label: "claude-sonnet-4-5" description: "Default Copilot model"
178
220
  - label: "claude-opus-4-6" description: "Most capable Claude model"
179
- - label: "gpt-5.3-codex" description: "OpenAI GPT-5.3 Codex"
221
+ - label: "gpt-5.3-codex" description: "OpenAI GPT-5.3 Codex"
180
222
  - label: "gemini-3-pro" description: "Google Gemini 3 Pro"
181
223
  ```
182
224
 
183
- Map the user's choice to the model string (strip " (Recommended)" suffix if present). Pass the selected model to the skill via `--model`.
225
+ Map the user's choice to the model string (strip " (Recommended)" suffix if present).
184
226
 
185
- IMPORTANT: Do NOT skip this step. Do NOT silently use a default model. If --model was not explicitly provided in $ARGUMENTS, you MUST present this picker. The model lists above are current as of Feb 2026 - the user may type any model name supported by their tool via the "Other" option.
227
+ IMPORTANT: Do NOT skip model selection. Do NOT silently use a default model. If --model was not explicitly provided, you MUST present this picker.
186
228
 
187
- ### Phase 3: Invoke Consult Skill
229
+ ### Phase 3: Execute Consultation
188
230
 
189
- With all parameters resolved (tool, effort, model, question, and optionally context, continue), invoke the `consult` skill using the Skill tool:
231
+ With all parameters resolved (tool, effort, model, question, count, and optionally context/continue):
232
+
233
+ #### Single instance (count=1, the default)
234
+
235
+ Invoke the `consult` skill directly using the Skill tool:
190
236
 
191
237
  ```
192
238
  Skill: consult
@@ -195,15 +241,35 @@ Args: "[question]" --tool=[tool] --effort=[effort] --model=[model] [--context=[c
195
241
  Example: "Is this the right approach?" --tool=gemini --effort=high --model=gemini-3-pro
196
242
  ```
197
243
 
198
- The skill handles the full consultation lifecycle: it resolves the model from the effort level, builds the CLI command, packages any context, executes the command via Bash with a 120-second timeout, and returns a plain JSON result.
244
+ The skill handles the full consultation lifecycle: model resolution, command building, context packaging, execution with 120s timeout, and returns a plain JSON result.
199
245
 
200
- ### Phase 4: Parse Skill Output
246
+ #### Multi-instance (count > 1)
201
247
 
202
- The skill returns a plain JSON object containing: `tool`, `model`, `effort`, `duration_ms`, `response`, `session_id`, and `continuable`. Parse the JSON directly from the skill output.
248
+ Spawn the `consult:consult-agent` via the Task tool with all resolved parameters:
203
249
 
204
- ### Phase 5: Present Results
250
+ ```
251
+ Task:
252
+ subagent_type: "consult:consult-agent"
253
+ prompt: |
254
+ Execute a multi-instance consultation with these pre-resolved parameters:
255
+ - tool: [tool]
256
+ - model: [model]
257
+ - effort: [effort]
258
+ - question: [question]
259
+ - count: [count]
260
+ - context: [context or none]
261
+
262
+ Run [count] parallel consultations with the same tool and parameters.
263
+ Return all responses formatted with numbered headers and a brief synthesis.
264
+ ```
265
+
266
+ The agent handles parallel execution, temp file management, result parsing, and synthesis.
267
+
268
+ ### Phase 4: Present Results
205
269
 
206
- After parsing the JSON, format and display the result as human-friendly text:
270
+ #### Single instance
271
+
272
+ Parse the skill's plain JSON output and display:
207
273
 
208
274
  ```
209
275
  Tool: {tool}, Model: {model}, Effort: {effort}, Duration: {duration_ms}ms.
@@ -214,12 +280,11 @@ The results of the consultation are:
214
280
 
215
281
  For continuable tools (Claude, Gemini, Codex, OpenCode), display: `Session: {session_id} - use /consult --continue to resume`
216
282
 
217
- Save session state for continuable tools (Claude, Gemini, Codex, OpenCode) to `{AI_STATE_DIR}/consult/last-session.json`.
283
+ Save session state to `{AI_STATE_DIR}/consult/last-session.json`.
284
+
285
+ #### Multi-instance
218
286
 
219
- Platform state directory:
220
- - Claude Code: `.claude/`
221
- - OpenCode: `.opencode/`
222
- - Codex CLI: `.codex/`
287
+ Display the agent's formatted output directly. The agent returns numbered responses with a synthesis section.
223
288
 
224
289
  On failure: `[ERROR] Consultation Failed: {specific error message}`
225
290
 
@@ -227,22 +292,34 @@ On failure: `[ERROR] Consultation Failed: {specific error message}`
227
292
 
228
293
  | Error | Output |
229
294
  |-------|--------|
230
- | No question provided | `[ERROR] Usage: /consult "your question" [--tool=gemini\|codex\|claude\|opencode\|copilot] [--effort=low\|medium\|high\|max]` |
295
+ | No question provided | `[ERROR] Usage: /consult "your question" or /consult with gemini about your question` |
231
296
  | Tool not installed | `[ERROR] {tool} is not installed. Install with: {install command from skill}` |
232
297
  | Tool execution fails | `[ERROR] {tool} failed: {error}. Try a different tool with --tool=[other]` |
233
298
  | Timeout (>120s) | `[ERROR] {tool} timed out after 120s. Try --effort=low for faster response` |
234
299
  | No tools available | `[ERROR] No AI CLI tools found. Install: npm i -g @anthropic-ai/claude-code` |
235
300
  | Session not found | `[WARN] No previous session found. Starting fresh consultation.` |
236
301
  | API key missing | `[ERROR] {tool} requires API key. Set {env var} (see skill for details)` |
302
+ | Count out of range | `[ERROR] Instance count must be 1-5. Got: {count}` |
303
+ | Multi-instance partial failure | Show successful responses, note failures |
237
304
 
238
305
  ## Example Usage
239
306
 
240
307
  ```bash
241
- /consult "Is this the right approach for error handling?" --tool=gemini --effort=high
242
- /consult "Review this function for performance issues" --tool=codex
243
- /consult "What alternative patterns would you suggest?" --tool=claude --effort=max
308
+ # Natural language (NLP parsing)
309
+ /consult with codex about my auth approach
310
+ /consult ask 3 codex about this design
311
+ /consult gemini should I use redis or postgres
312
+ /consult thoroughly ask claude about error handling
313
+ /consult codex few instances about performance
314
+
315
+ # Explicit flags (backward compatible)
316
+ /consult "Is this the right approach?" --tool=gemini --effort=high
317
+ /consult "Review this function" --tool=codex --count=3
244
318
  /consult "Suggest improvements" --tool=opencode --model=github-copilot/claude-opus-4-6
245
- /consult "Continue from where we left off" --continue
319
+ /consult --continue
246
320
  /consult "Explain this error" --context=diff --tool=gemini
247
321
  /consult "Review this file" --context=file=src/index.js --tool=claude
322
+
323
+ # Mixed (flags + natural language)
324
+ /consult with gemini --effort=max about database schema design
248
325
  ```