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.
- package/.claude-plugin/marketplace.json +21 -14
- package/.claude-plugin/plugin.json +1 -1
- package/AGENTS.md +2 -1
- package/CHANGELOG.md +18 -0
- package/README.md +7 -6
- package/adapters/codex/skills/agnix/SKILL.md +0 -1
- package/adapters/codex/skills/audit-project/SKILL.md +0 -1
- package/adapters/codex/skills/audit-project-agents/SKILL.md +0 -1
- package/adapters/codex/skills/audit-project-github/SKILL.md +0 -1
- package/adapters/codex/skills/consult/SKILL.md +132 -57
- package/adapters/codex/skills/debate/SKILL.md +214 -0
- package/adapters/codex/skills/delivery-approval/SKILL.md +0 -1
- package/adapters/codex/skills/deslop/SKILL.md +0 -1
- package/adapters/codex/skills/drift-detect/SKILL.md +0 -1
- package/adapters/codex/skills/enhance/SKILL.md +0 -1
- package/adapters/codex/skills/learn/SKILL.md +0 -1
- package/adapters/codex/skills/next-task/SKILL.md +0 -1
- package/adapters/codex/skills/perf/SKILL.md +0 -1
- package/adapters/codex/skills/repo-map/SKILL.md +0 -1
- package/adapters/codex/skills/ship/SKILL.md +0 -1
- package/adapters/codex/skills/ship-ci-review-loop/SKILL.md +0 -1
- package/adapters/codex/skills/ship-deployment/SKILL.md +0 -1
- package/adapters/codex/skills/ship-error-handling/SKILL.md +0 -1
- package/adapters/codex/skills/sync-docs/SKILL.md +0 -1
- package/adapters/opencode/agents/agent-enhancer.md +0 -1
- package/adapters/opencode/agents/agnix-agent.md +0 -1
- package/adapters/opencode/agents/ci-fixer.md +0 -1
- package/adapters/opencode/agents/ci-monitor.md +0 -1
- package/adapters/opencode/agents/claudemd-enhancer.md +0 -1
- package/adapters/opencode/agents/consult-agent.md +122 -30
- package/adapters/opencode/agents/cross-file-enhancer.md +0 -1
- package/adapters/opencode/agents/debate-orchestrator.md +169 -0
- package/adapters/opencode/agents/delivery-validator.md +0 -1
- package/adapters/opencode/agents/deslop-agent.md +0 -1
- package/adapters/opencode/agents/docs-enhancer.md +0 -1
- package/adapters/opencode/agents/exploration-agent.md +0 -1
- package/adapters/opencode/agents/hooks-enhancer.md +0 -1
- package/adapters/opencode/agents/implementation-agent.md +0 -1
- package/adapters/opencode/agents/learn-agent.md +0 -1
- package/adapters/opencode/agents/map-validator.md +0 -1
- package/adapters/opencode/agents/perf-analyzer.md +0 -1
- package/adapters/opencode/agents/perf-code-paths.md +0 -1
- package/adapters/opencode/agents/perf-investigation-logger.md +0 -1
- package/adapters/opencode/agents/perf-orchestrator.md +0 -1
- package/adapters/opencode/agents/perf-theory-gatherer.md +0 -1
- package/adapters/opencode/agents/perf-theory-tester.md +0 -1
- package/adapters/opencode/agents/plan-synthesizer.md +0 -1
- package/adapters/opencode/agents/planning-agent.md +0 -1
- package/adapters/opencode/agents/plugin-enhancer.md +0 -1
- package/adapters/opencode/agents/prompt-enhancer.md +0 -1
- package/adapters/opencode/agents/simple-fixer.md +0 -1
- package/adapters/opencode/agents/skills-enhancer.md +0 -1
- package/adapters/opencode/agents/sync-docs-agent.md +0 -1
- package/adapters/opencode/agents/task-discoverer.md +0 -1
- package/adapters/opencode/agents/test-coverage-checker.md +0 -1
- package/adapters/opencode/agents/worktree-manager.md +0 -1
- package/adapters/opencode/commands/agnix.md +0 -1
- package/adapters/opencode/commands/audit-project-agents.md +0 -1
- package/adapters/opencode/commands/audit-project-github.md +0 -1
- package/adapters/opencode/commands/audit-project.md +0 -1
- package/adapters/opencode/commands/consult.md +133 -57
- package/adapters/opencode/commands/debate.md +224 -0
- package/adapters/opencode/commands/delivery-approval.md +0 -1
- package/adapters/opencode/commands/deslop.md +0 -1
- package/adapters/opencode/commands/drift-detect.md +0 -1
- package/adapters/opencode/commands/enhance.md +0 -1
- package/adapters/opencode/commands/learn.md +0 -1
- package/adapters/opencode/commands/next-task.md +0 -1
- package/adapters/opencode/commands/perf.md +0 -1
- package/adapters/opencode/commands/repo-map.md +0 -1
- package/adapters/opencode/commands/ship-ci-review-loop.md +0 -1
- package/adapters/opencode/commands/ship-deployment.md +0 -1
- package/adapters/opencode/commands/ship-error-handling.md +0 -1
- package/adapters/opencode/commands/ship.md +0 -1
- package/adapters/opencode/commands/sync-docs.md +0 -1
- package/adapters/opencode/skills/agnix/SKILL.md +1 -2
- package/adapters/opencode/skills/consult/SKILL.md +33 -23
- package/adapters/opencode/skills/debate/SKILL.md +245 -0
- package/adapters/opencode/skills/deslop/SKILL.md +1 -2
- package/adapters/opencode/skills/discover-tasks/SKILL.md +1 -2
- package/adapters/opencode/skills/drift-analysis/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-agent-prompts/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-claude-memory/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-cross-file/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-docs/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-hooks/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-orchestrator/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-plugins/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-prompts/SKILL.md +1 -2
- package/adapters/opencode/skills/enhance-skills/SKILL.md +1 -2
- package/adapters/opencode/skills/learn/SKILL.md +1 -2
- package/adapters/opencode/skills/orchestrate-review/SKILL.md +0 -1
- package/adapters/opencode/skills/perf-analyzer/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-baseline-manager/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-benchmarker/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-code-paths/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-investigation-logger/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-profiler/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-theory-gatherer/SKILL.md +1 -2
- package/adapters/opencode/skills/perf-theory-tester/SKILL.md +1 -2
- package/adapters/opencode/skills/repo-mapping/SKILL.md +1 -2
- package/adapters/opencode/skills/sync-docs/SKILL.md +1 -2
- package/adapters/opencode/skills/validate-delivery/SKILL.md +1 -2
- package/lib/adapter-transforms.js +24 -4
- package/package.json +1 -1
- package/plugins/agnix/.claude-plugin/plugin.json +1 -1
- package/plugins/agnix/skills/agnix/SKILL.md +1 -1
- package/plugins/audit-project/.claude-plugin/plugin.json +1 -1
- package/plugins/audit-project/lib/adapter-transforms.js +24 -4
- package/plugins/consult/.claude-plugin/plugin.json +1 -1
- package/plugins/consult/agents/consult-agent.md +122 -29
- package/plugins/consult/commands/consult.md +135 -58
- package/plugins/consult/skills/consult/SKILL.md +31 -20
- package/plugins/debate/.claude-plugin/plugin.json +21 -0
- package/plugins/debate/agents/debate-orchestrator.md +175 -0
- package/plugins/debate/commands/debate.md +221 -0
- package/plugins/debate/lib/adapter-transforms.js +298 -0
- package/plugins/debate/lib/collectors/codebase.js +392 -0
- package/plugins/debate/lib/collectors/docs-patterns.js +713 -0
- package/plugins/debate/lib/collectors/documentation.js +219 -0
- package/plugins/debate/lib/collectors/github.js +330 -0
- package/plugins/debate/lib/collectors/index.js +126 -0
- package/plugins/debate/lib/config/index.js +14 -0
- package/plugins/debate/lib/cross-platform/index.js +539 -0
- package/plugins/debate/lib/discovery/index.js +352 -0
- package/plugins/debate/lib/drift-detect/collectors.js +37 -0
- package/plugins/debate/lib/enhance/agent-analyzer.js +421 -0
- package/plugins/debate/lib/enhance/agent-patterns.js +571 -0
- package/plugins/debate/lib/enhance/auto-suppression.js +622 -0
- package/plugins/debate/lib/enhance/benchmark.js +417 -0
- package/plugins/debate/lib/enhance/cross-file-analyzer.js +930 -0
- package/plugins/debate/lib/enhance/cross-file-patterns.js +370 -0
- package/plugins/debate/lib/enhance/docs-analyzer.js +325 -0
- package/plugins/debate/lib/enhance/docs-patterns.js +671 -0
- package/plugins/debate/lib/enhance/fixer.js +721 -0
- package/plugins/debate/lib/enhance/hook-analyzer.js +135 -0
- package/plugins/debate/lib/enhance/hook-patterns.js +40 -0
- package/plugins/debate/lib/enhance/index.js +127 -0
- package/plugins/debate/lib/enhance/plugin-analyzer.js +402 -0
- package/plugins/debate/lib/enhance/plugin-patterns.js +326 -0
- package/plugins/debate/lib/enhance/projectmemory-analyzer.js +551 -0
- package/plugins/debate/lib/enhance/projectmemory-patterns.js +617 -0
- package/plugins/debate/lib/enhance/prompt-analyzer.js +457 -0
- package/plugins/debate/lib/enhance/prompt-patterns.js +1484 -0
- package/plugins/debate/lib/enhance/reporter.js +1348 -0
- package/plugins/debate/lib/enhance/security-patterns.js +284 -0
- package/plugins/debate/lib/enhance/skill-analyzer.js +182 -0
- package/plugins/debate/lib/enhance/skill-patterns.js +147 -0
- package/plugins/debate/lib/enhance/suppression.js +352 -0
- package/plugins/debate/lib/enhance/tool-patterns.js +373 -0
- package/plugins/debate/lib/index.js +270 -0
- package/plugins/debate/lib/patterns/cli-enhancers.js +611 -0
- package/plugins/debate/lib/patterns/pipeline.js +948 -0
- package/plugins/debate/lib/patterns/review-patterns.js +558 -0
- package/plugins/debate/lib/patterns/slop-analyzers.js +2305 -0
- package/plugins/debate/lib/patterns/slop-patterns.js +1187 -0
- package/plugins/debate/lib/perf/analyzer/index.js +22 -0
- package/plugins/debate/lib/perf/argument-parser.js +105 -0
- package/plugins/debate/lib/perf/baseline-comparator.js +50 -0
- package/plugins/debate/lib/perf/baseline-store.js +127 -0
- package/plugins/debate/lib/perf/benchmark-runner.js +404 -0
- package/plugins/debate/lib/perf/breaking-point-finder.js +52 -0
- package/plugins/debate/lib/perf/breaking-point-runner.js +60 -0
- package/plugins/debate/lib/perf/checkpoint.js +123 -0
- package/plugins/debate/lib/perf/code-paths.js +86 -0
- package/plugins/debate/lib/perf/consolidation.js +37 -0
- package/plugins/debate/lib/perf/constraint-runner.js +71 -0
- package/plugins/debate/lib/perf/experiment-runner.js +32 -0
- package/plugins/debate/lib/perf/index.js +41 -0
- package/plugins/debate/lib/perf/investigation-state.js +874 -0
- package/plugins/debate/lib/perf/optimization-runner.js +79 -0
- package/plugins/debate/lib/perf/profilers/go.js +22 -0
- package/plugins/debate/lib/perf/profilers/index.js +46 -0
- package/plugins/debate/lib/perf/profilers/java.js +23 -0
- package/plugins/debate/lib/perf/profilers/node.js +27 -0
- package/plugins/debate/lib/perf/profilers/python.js +23 -0
- package/plugins/debate/lib/perf/profilers/rust.js +23 -0
- package/plugins/debate/lib/perf/profiling-runner.js +75 -0
- package/plugins/debate/lib/perf/schemas.js +140 -0
- package/plugins/debate/lib/platform/detect-platform.js +413 -0
- package/plugins/debate/lib/platform/detection-configs.js +93 -0
- package/plugins/debate/lib/platform/state-dir.js +132 -0
- package/plugins/debate/lib/platform/verify-tools.js +182 -0
- package/plugins/debate/lib/repo-map/cache.js +152 -0
- package/plugins/debate/lib/repo-map/concurrency.js +29 -0
- package/plugins/debate/lib/repo-map/index.js +222 -0
- package/plugins/debate/lib/repo-map/installer.js +212 -0
- package/plugins/debate/lib/repo-map/queries/go.js +27 -0
- package/plugins/debate/lib/repo-map/queries/index.js +100 -0
- package/plugins/debate/lib/repo-map/queries/java.js +38 -0
- package/plugins/debate/lib/repo-map/queries/javascript.js +55 -0
- package/plugins/debate/lib/repo-map/queries/python.js +24 -0
- package/plugins/debate/lib/repo-map/queries/rust.js +73 -0
- package/plugins/debate/lib/repo-map/queries/typescript.js +38 -0
- package/plugins/debate/lib/repo-map/runner.js +1364 -0
- package/plugins/debate/lib/repo-map/updater.js +562 -0
- package/plugins/debate/lib/repo-map/usage-analyzer.js +407 -0
- package/plugins/debate/lib/schemas/plugin-manifest.schema.json +57 -0
- package/plugins/debate/lib/schemas/validator.js +247 -0
- package/plugins/debate/lib/sources/custom-handler.js +199 -0
- package/plugins/debate/lib/sources/policy-questions.js +246 -0
- package/plugins/debate/lib/sources/source-cache.js +165 -0
- package/plugins/debate/lib/state/workflow-state.js +576 -0
- package/plugins/debate/lib/types/agent-frontmatter.d.ts +134 -0
- package/plugins/debate/lib/types/command-frontmatter.d.ts +107 -0
- package/plugins/debate/lib/types/hook-frontmatter.d.ts +115 -0
- package/plugins/debate/lib/types/index.d.ts +84 -0
- package/plugins/debate/lib/types/plugin-manifest.d.ts +102 -0
- package/plugins/debate/lib/types/skill-frontmatter.d.ts +89 -0
- package/plugins/debate/lib/utils/atomic-write.js +94 -0
- package/plugins/debate/lib/utils/cache-manager.js +159 -0
- package/plugins/debate/lib/utils/command-parser.js +0 -0
- package/plugins/debate/lib/utils/context-optimizer.js +300 -0
- package/plugins/debate/lib/utils/deprecation.js +37 -0
- package/plugins/debate/lib/utils/shell-escape.js +88 -0
- package/plugins/debate/lib/utils/state-helpers.js +61 -0
- package/plugins/debate/skills/debate/SKILL.md +264 -0
- package/plugins/deslop/.claude-plugin/plugin.json +1 -1
- package/plugins/deslop/lib/adapter-transforms.js +24 -4
- package/plugins/deslop/skills/deslop/SKILL.md +1 -1
- package/plugins/drift-detect/.claude-plugin/plugin.json +1 -1
- package/plugins/drift-detect/lib/adapter-transforms.js +24 -4
- package/plugins/drift-detect/skills/drift-analysis/SKILL.md +1 -1
- package/plugins/enhance/.claude-plugin/plugin.json +1 -1
- package/plugins/enhance/lib/adapter-transforms.js +24 -4
- package/plugins/enhance/skills/enhance-agent-prompts/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-claude-memory/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-cross-file/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-docs/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-hooks/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-orchestrator/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-plugins/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-prompts/SKILL.md +1 -1
- package/plugins/enhance/skills/enhance-skills/SKILL.md +1 -1
- package/plugins/learn/.claude-plugin/plugin.json +1 -1
- package/plugins/learn/agents/learn-agent.md +1 -1
- package/plugins/learn/lib/adapter-transforms.js +24 -4
- package/plugins/learn/skills/learn/SKILL.md +1 -1
- package/plugins/next-task/.claude-plugin/plugin.json +1 -1
- package/plugins/next-task/agents/exploration-agent.md +1 -1
- package/plugins/next-task/lib/adapter-transforms.js +24 -4
- package/plugins/next-task/skills/discover-tasks/SKILL.md +1 -1
- package/plugins/next-task/skills/validate-delivery/SKILL.md +1 -1
- package/plugins/perf/.claude-plugin/plugin.json +1 -1
- package/plugins/perf/lib/adapter-transforms.js +24 -4
- package/plugins/perf/skills/perf-analyzer/SKILL.md +1 -1
- package/plugins/perf/skills/perf-baseline-manager/SKILL.md +1 -1
- package/plugins/perf/skills/perf-benchmarker/SKILL.md +1 -1
- package/plugins/perf/skills/perf-code-paths/SKILL.md +1 -1
- package/plugins/perf/skills/perf-investigation-logger/SKILL.md +1 -1
- package/plugins/perf/skills/perf-profiler/SKILL.md +1 -1
- package/plugins/perf/skills/perf-theory-gatherer/SKILL.md +1 -1
- package/plugins/perf/skills/perf-theory-tester/SKILL.md +1 -1
- package/plugins/repo-map/.claude-plugin/plugin.json +1 -1
- package/plugins/repo-map/lib/adapter-transforms.js +24 -4
- package/plugins/ship/.claude-plugin/plugin.json +1 -1
- package/plugins/ship/lib/adapter-transforms.js +24 -4
- package/plugins/sync-docs/.claude-plugin/plugin.json +1 -1
- package/plugins/sync-docs/lib/adapter-transforms.js +24 -4
- package/plugins/sync-docs/skills/sync-docs/SKILL.md +1 -1
- package/scripts/gen-adapters.js +6 -7
- package/scripts/generate-docs.js +4 -2
- package/scripts/plugins.txt +1 -0
- 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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
content = content.replace(/\.claude
|
|
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,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
|
|
4
|
+
version: 5.1.0
|
|
5
5
|
argument-hint: "[path] [--fix] [--strict] [--target=claude-code|cursor|codex]"
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -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
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
content = content.replace(/\.claude
|
|
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-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
|
|
26
|
-
- **Agent** (this file): Programmatic entry point
|
|
27
|
-
- **Skill** (`consult`): Implementation source of truth. Provides provider configurations, model mappings, command templates, context packaging, and output parsing logic.
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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: "[
|
|
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
|
|
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 (
|
|
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
|
|
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
|
-
##
|
|
24
|
+
## Execution
|
|
25
25
|
|
|
26
|
-
Parse
|
|
26
|
+
### Phase 1: Parse Input (Flags + Natural Language)
|
|
27
27
|
|
|
28
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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"
|
|
75
|
+
[ERROR] Usage: /consult "your question" or /consult with gemini about your question
|
|
51
76
|
```
|
|
52
77
|
|
|
53
|
-
### Phase 2: Interactive Parameter
|
|
78
|
+
### Phase 2: Interactive Parameter Resolution
|
|
54
79
|
|
|
55
|
-
MUST resolve ALL missing parameters interactively
|
|
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:
|
|
96
|
+
#### Step 2b: Detect installed tools
|
|
70
97
|
|
|
71
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
106
|
-
|
|
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
|
-
|
|
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
|
|
152
|
+
#### Step 2d: Model selection (MUST ask if no --model)
|
|
111
153
|
|
|
112
|
-
After tool is resolved
|
|
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-
|
|
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"
|
|
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).
|
|
225
|
+
Map the user's choice to the model string (strip " (Recommended)" suffix if present).
|
|
184
226
|
|
|
185
|
-
IMPORTANT: Do NOT skip
|
|
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:
|
|
229
|
+
### Phase 3: Execute Consultation
|
|
188
230
|
|
|
189
|
-
With all parameters resolved (tool, effort, model, question, and optionally context
|
|
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:
|
|
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
|
-
|
|
246
|
+
#### Multi-instance (count > 1)
|
|
201
247
|
|
|
202
|
-
|
|
248
|
+
Spawn the `consult:consult-agent` via the Task tool with all resolved parameters:
|
|
203
249
|
|
|
204
|
-
|
|
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
|
-
|
|
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
|
|
283
|
+
Save session state to `{AI_STATE_DIR}/consult/last-session.json`.
|
|
284
|
+
|
|
285
|
+
#### Multi-instance
|
|
218
286
|
|
|
219
|
-
|
|
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"
|
|
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
|
-
|
|
242
|
-
/consult
|
|
243
|
-
/consult
|
|
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
|
|
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
|
```
|