ai-consultants 2.10.1

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 (62) hide show
  1. package/.claude/commands/ai-consultants:consult.md +94 -0
  2. package/.claude/commands/ai-consultants:debate.md +103 -0
  3. package/.claude/commands/ai-consultants:help.md +30 -0
  4. package/CLAUDE.md +839 -0
  5. package/LICENSE +21 -0
  6. package/README.md +758 -0
  7. package/SKILL.md +156 -0
  8. package/bin/ai-consultants +96 -0
  9. package/docs/COST_RATES.md +172 -0
  10. package/docs/JSON_SCHEMA.md +305 -0
  11. package/docs/SETUP.md +879 -0
  12. package/docs/SMART_ROUTING.md +219 -0
  13. package/docs/cost_rates.json +143 -0
  14. package/package.json +47 -0
  15. package/references/configuration.md +141 -0
  16. package/references/details.md +60 -0
  17. package/scripts/build_context.sh +562 -0
  18. package/scripts/classify_question.sh +148 -0
  19. package/scripts/config.sh +753 -0
  20. package/scripts/configure.sh +1093 -0
  21. package/scripts/consult_all.sh +934 -0
  22. package/scripts/debate_round.sh +421 -0
  23. package/scripts/doctor.sh +642 -0
  24. package/scripts/followup.sh +197 -0
  25. package/scripts/install.sh +319 -0
  26. package/scripts/lib/api.sh +640 -0
  27. package/scripts/lib/api_query.sh +228 -0
  28. package/scripts/lib/cache.sh +338 -0
  29. package/scripts/lib/chunking.sh +880 -0
  30. package/scripts/lib/code_optimizer.sh +671 -0
  31. package/scripts/lib/common.sh +1088 -0
  32. package/scripts/lib/costs.sh +674 -0
  33. package/scripts/lib/personas.sh +372 -0
  34. package/scripts/lib/progress.sh +251 -0
  35. package/scripts/lib/reflection.sh +447 -0
  36. package/scripts/lib/routing.sh +566 -0
  37. package/scripts/lib/schema.json +165 -0
  38. package/scripts/lib/session.sh +327 -0
  39. package/scripts/lib/symbol_map.sh +445 -0
  40. package/scripts/lib/voting.sh +495 -0
  41. package/scripts/peer_review.sh +460 -0
  42. package/scripts/preflight_check.sh +452 -0
  43. package/scripts/query_aider.sh +83 -0
  44. package/scripts/query_amp.sh +67 -0
  45. package/scripts/query_claude.sh +99 -0
  46. package/scripts/query_codex.sh +92 -0
  47. package/scripts/query_cursor.sh +72 -0
  48. package/scripts/query_deepseek.sh +17 -0
  49. package/scripts/query_gemini.sh +85 -0
  50. package/scripts/query_glm.sh +17 -0
  51. package/scripts/query_grok.sh +17 -0
  52. package/scripts/query_kilo.sh +140 -0
  53. package/scripts/query_kimi.sh +67 -0
  54. package/scripts/query_minimax.sh +17 -0
  55. package/scripts/query_mistral.sh +97 -0
  56. package/scripts/query_ollama.sh +328 -0
  57. package/scripts/query_qwen3.sh +93 -0
  58. package/scripts/setup_wizard.sh +367 -0
  59. package/scripts/skillport-install.sh +196 -0
  60. package/scripts/synthesize.sh +332 -0
  61. package/templates/consultation_report.md +323 -0
  62. package/templates/synthesis_prompt.md +120 -0
@@ -0,0 +1,99 @@
1
+ #!/bin/bash
2
+ # query_claude.sh - Query Claude CLI or API
3
+ #
4
+ # Usage: ./query_claude.sh "question" [context_file] [output_file]
5
+ #
6
+ # Environment variables:
7
+ # CLAUDE_MODEL - Model to use (default: opus-4.6)
8
+ # CLAUDE_TIMEOUT - Timeout in seconds (default: 240)
9
+ # CLAUDE_USE_API - Use API mode instead of CLI (default: false)
10
+ # ANTHROPIC_API_KEY - API key for API mode
11
+ # ENABLE_PERSONA - Enable "The Synthesizer" persona (default: true)
12
+
13
+ set -euo pipefail
14
+
15
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
+ source "$SCRIPT_DIR/lib/common.sh"
17
+ source "$SCRIPT_DIR/lib/personas.sh"
18
+
19
+ # --- Parameters ---
20
+ QUERY="${1:-}"
21
+ CONTEXT_FILE="${2:-}"
22
+ OUTPUT_FILE="${3:-/tmp/claude_response.json}"
23
+
24
+ # --- Configuration ---
25
+ ENABLE_PERSONA="${ENABLE_PERSONA:-true}"
26
+ CONSULTANT_NAME="Claude"
27
+ CLAUDE_CMD="${CLAUDE_CMD:-claude}"
28
+ MODEL_USED="${CLAUDE_MODEL:-opus-4.6}"
29
+
30
+ # --- Build query ---
31
+ FULL_QUERY=$(build_full_query "$QUERY" "$CONTEXT_FILE")
32
+ validate_query "$FULL_QUERY" "Claude" || exit 1
33
+
34
+ # --- Add persona if enabled ---
35
+ if [[ "$ENABLE_PERSONA" == "true" ]]; then
36
+ FULL_QUERY=$(build_query_with_persona "$CONSULTANT_NAME" "$FULL_QUERY")
37
+ fi
38
+
39
+ # --- Timestamp for metadata ---
40
+ START_TIME=$(get_timestamp_ms)
41
+
42
+ # --- Execution (CLI or API mode) ---
43
+ TEMP_OUTPUT=$(mktemp)
44
+
45
+ if is_api_mode "claude"; then
46
+ # --- API Mode ---
47
+ log_api_mode_status "claude"
48
+ validate_api_mode "claude" || exit 1
49
+
50
+ source "$SCRIPT_DIR/lib/api_query.sh"
51
+
52
+ run_api_mode_query \
53
+ "$CONSULTANT_NAME" \
54
+ "$MODEL_USED" \
55
+ "$FULL_QUERY" \
56
+ "$TEMP_OUTPUT" \
57
+ "$CLAUDE_TIMEOUT_SECONDS"
58
+
59
+ exit_code=$?
60
+ else
61
+ # --- CLI Mode ---
62
+ log_api_mode_status "claude"
63
+ check_command "$CLAUDE_CMD" "Claude CLI" "Visit https://docs.anthropic.com/en/docs/claude-code" || exit 1
64
+
65
+ # Claude CLI uses --print for non-interactive mode
66
+ echo "$FULL_QUERY" | run_query \
67
+ "Claude" \
68
+ "$TEMP_OUTPUT" \
69
+ "$CLAUDE_TIMEOUT_SECONDS" \
70
+ "$CLAUDE_CMD" --print --model "$MODEL_USED"
71
+
72
+ exit_code=$?
73
+ fi
74
+
75
+ # --- Calculate latency ---
76
+ END_TIME=$(get_timestamp_ms)
77
+ LATENCY_MS=$((END_TIME - START_TIME))
78
+
79
+ # --- Configuration for response building ---
80
+ PERSONA_NAME=$(get_persona_name "$CONSULTANT_NAME")
81
+
82
+ # --- Post-processing: wrap in full schema using shared helpers ---
83
+ if [[ $exit_code -eq 0 && -f "$TEMP_OUTPUT" && -s "$TEMP_OUTPUT" ]]; then
84
+ RAW_RESPONSE=$(cat "$TEMP_OUTPUT")
85
+ rm -f "$TEMP_OUTPUT"
86
+
87
+ # Try to parse as structured JSON
88
+ if echo "$RAW_RESPONSE" | jq -e '.response.summary' > /dev/null 2>&1; then
89
+ build_structured_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" "$RAW_RESPONSE" "$LATENCY_MS" > "$OUTPUT_FILE"
90
+ else
91
+ build_fallback_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" "$RAW_RESPONSE" "$LATENCY_MS" > "$OUTPUT_FILE"
92
+ fi
93
+ else
94
+ rm -f "$TEMP_OUTPUT"
95
+ build_error_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" "Query failed with exit code $exit_code" "$LATENCY_MS" > "$OUTPUT_FILE"
96
+ fi
97
+
98
+ cat "$OUTPUT_FILE"
99
+ exit $exit_code
@@ -0,0 +1,92 @@
1
+ #!/bin/bash
2
+ # query_codex.sh - Query OpenAI Codex CLI or API (v2.6 with API mode support)
3
+ #
4
+ # Usage: ./query_codex.sh "question" [context_file] [output_file]
5
+ #
6
+ # Environment variables:
7
+ # CODEX_MODEL - Model to use (default: gpt-5.3-codex)
8
+ # CODEX_TIMEOUT - Timeout in seconds (default: 180)
9
+ # CODEX_USE_API - Use API mode instead of CLI (default: false)
10
+ # OPENAI_API_KEY - API key for API mode
11
+ # ENABLE_PERSONA - Enable "The Pragmatist" persona (default: true)
12
+
13
+ set -euo pipefail
14
+
15
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
+ source "$SCRIPT_DIR/lib/common.sh"
17
+ source "$SCRIPT_DIR/lib/personas.sh"
18
+
19
+ # --- Parameters ---
20
+ QUERY="${1:-}"
21
+ CONTEXT_FILE="${2:-}"
22
+ OUTPUT_FILE="${3:-/tmp/codex_response.json}"
23
+
24
+ # --- Configuration ---
25
+ ENABLE_PERSONA="${ENABLE_PERSONA:-true}"
26
+ CONSULTANT_NAME="Codex"
27
+
28
+ # --- Build query ---
29
+ FULL_QUERY=$(build_full_query "$QUERY" "$CONTEXT_FILE")
30
+ validate_query "$FULL_QUERY" "Codex" || exit 1
31
+
32
+ # --- Add persona if enabled ---
33
+ if [[ "$ENABLE_PERSONA" == "true" ]]; then
34
+ FULL_QUERY=$(build_query_with_persona "$CONSULTANT_NAME" "$FULL_QUERY")
35
+ fi
36
+
37
+ # --- Timestamp for metadata ---
38
+ START_TIME=$(get_timestamp_ms)
39
+
40
+ # --- Execution (CLI or API mode) ---
41
+ TEMP_OUTPUT=$(mktemp)
42
+
43
+ if is_api_mode "codex"; then
44
+ # --- API Mode ---
45
+ log_api_mode_status "codex"
46
+ validate_api_mode "codex" || exit 1
47
+
48
+ source "$SCRIPT_DIR/lib/api_query.sh"
49
+
50
+ run_api_mode_query \
51
+ "$CONSULTANT_NAME" \
52
+ "$CODEX_MODEL" \
53
+ "$FULL_QUERY" \
54
+ "$TEMP_OUTPUT" \
55
+ "$CODEX_TIMEOUT_SECONDS"
56
+
57
+ exit_code=$?
58
+ else
59
+ # --- CLI Mode ---
60
+ log_api_mode_status "codex"
61
+ check_command "$CODEX_CMD" "Codex CLI" "npm install -g @openai/codex" || exit 1
62
+
63
+ # Build command
64
+ CMD_ARGS=("$CODEX_CMD" "exec" "--skip-git-repo-check")
65
+ if [[ -n "$CODEX_MODEL" ]]; then
66
+ CMD_ARGS+=("-m" "$CODEX_MODEL")
67
+ fi
68
+
69
+ # Codex uses query as the last argument, not from stdin
70
+ run_query \
71
+ "Codex" \
72
+ "$TEMP_OUTPUT" \
73
+ "$CODEX_TIMEOUT_SECONDS" \
74
+ "${CMD_ARGS[@]}" "$FULL_QUERY" < /dev/null
75
+
76
+ exit_code=$?
77
+ fi
78
+
79
+ # --- Calculate latency ---
80
+ END_TIME=$(get_timestamp_ms)
81
+ LATENCY_MS=$((END_TIME - START_TIME))
82
+
83
+ # --- Configuration for response building ---
84
+ MODEL_USED="${CODEX_MODEL:-gpt-5.3-codex}"
85
+ PERSONA_NAME=$(get_persona_name "$CONSULTANT_NAME")
86
+
87
+ # --- Post-processing: use shared helper ---
88
+ process_consultant_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" \
89
+ "$TEMP_OUTPUT" "$OUTPUT_FILE" "$exit_code" "$LATENCY_MS"
90
+
91
+ cat "$OUTPUT_FILE"
92
+ exit $exit_code
@@ -0,0 +1,72 @@
1
+ #!/bin/bash
2
+ # query_cursor.sh - Query Cursor CLI
3
+ #
4
+ # Usage: ./query_cursor.sh "question" [context_file] [output_file]
5
+ #
6
+ # Environment variables:
7
+ # CURSOR_MODEL - Model to use (default: uses Cursor's default)
8
+ # CURSOR_TIMEOUT - Timeout in seconds (default: 180)
9
+ # ENABLE_PERSONA - Enable "The Integrator" persona (default: true)
10
+
11
+ set -euo pipefail
12
+
13
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
14
+ source "$SCRIPT_DIR/lib/common.sh"
15
+ source "$SCRIPT_DIR/lib/personas.sh"
16
+
17
+ # --- Parameters ---
18
+ QUERY="${1:-}"
19
+ CONTEXT_FILE="${2:-}"
20
+ OUTPUT_FILE="${3:-/tmp/cursor_response.json}"
21
+
22
+ # --- Configuration ---
23
+ ENABLE_PERSONA="${ENABLE_PERSONA:-true}"
24
+ CONSULTANT_NAME="Cursor"
25
+ MODEL_USED="${CURSOR_MODEL:-cursor}"
26
+
27
+ # --- Check prerequisites ---
28
+ check_command "$CURSOR_CMD" "Cursor CLI" "curl https://cursor.com/install -fsS | bash" || exit 1
29
+
30
+ # --- Build query ---
31
+ FULL_QUERY=$(build_full_query "$QUERY" "$CONTEXT_FILE")
32
+ validate_query "$FULL_QUERY" "Cursor" || exit 1
33
+
34
+ # --- Add persona if enabled ---
35
+ if [[ "$ENABLE_PERSONA" == "true" ]]; then
36
+ FULL_QUERY=$(build_query_with_persona "$CONSULTANT_NAME" "$FULL_QUERY")
37
+ fi
38
+
39
+ # --- Timestamp for metadata ---
40
+ START_TIME=$(get_timestamp_ms)
41
+
42
+ # --- Execution ---
43
+ TEMP_OUTPUT=$(mktemp)
44
+ trap 'rm -f "$TEMP_OUTPUT"' EXIT
45
+
46
+ # Build command args with optional model
47
+ # -p = print mode, -f = force-allow / trust workspace (prevents interactive prompt)
48
+ CMD_ARGS=("$CURSOR_CMD" "-p" "-f" "--output-format" "text")
49
+ if [[ -n "${CURSOR_MODEL:-}" ]]; then
50
+ CMD_ARGS+=("--model" "$CURSOR_MODEL")
51
+ fi
52
+
53
+ run_query \
54
+ "Cursor" \
55
+ "$TEMP_OUTPUT" \
56
+ "$CURSOR_TIMEOUT_SECONDS" \
57
+ "${CMD_ARGS[@]}" "$FULL_QUERY" < /dev/null
58
+
59
+ exit_code=$?
60
+
61
+ # --- Calculate latency ---
62
+ END_TIME=$(get_timestamp_ms)
63
+ LATENCY_MS=$((END_TIME - START_TIME))
64
+
65
+ # --- Post-processing: use shared helper ---
66
+ PERSONA_NAME=$(get_persona_name "$CONSULTANT_NAME")
67
+
68
+ process_consultant_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" \
69
+ "$TEMP_OUTPUT" "$OUTPUT_FILE" "$exit_code" "$LATENCY_MS"
70
+
71
+ cat "$OUTPUT_FILE"
72
+ exit $exit_code
@@ -0,0 +1,17 @@
1
+ #!/bin/bash
2
+ # query_deepseek.sh - Query DeepSeek via HTTP API
3
+ #
4
+ # Usage: ./query_deepseek.sh "question" [context_file] [output_file]
5
+ #
6
+ # Environment variables:
7
+ # DEEPSEEK_API_KEY - API key for DeepSeek (required)
8
+ # DEEPSEEK_MODEL - Model to use (default: deepseek-reasoner)
9
+ # DEEPSEEK_TIMEOUT - Timeout in seconds (default: 180)
10
+ # ENABLE_PERSONA - Enable "The Code Specialist" persona (default: true)
11
+
12
+ set -euo pipefail
13
+
14
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
15
+ source "$SCRIPT_DIR/lib/api_query.sh"
16
+
17
+ run_api_consultant "DeepSeek" "$@"
@@ -0,0 +1,85 @@
1
+ #!/bin/bash
2
+ # query_gemini.sh - Query Google Gemini CLI or API (v2.6 with API mode support)
3
+ #
4
+ # Usage: ./query_gemini.sh "question" [context_file] [output_file]
5
+ #
6
+ # Environment variables:
7
+ # GEMINI_MODEL - Model to use (default: gemini-3.1-pro-preview)
8
+ # GEMINI_TIMEOUT - Timeout in seconds (default: 180)
9
+ # GEMINI_USE_API - Use API mode instead of CLI (default: false)
10
+ # GEMINI_API_KEY - API key for API mode
11
+ # ENABLE_PERSONA - Enable "The Architect" persona (default: true)
12
+
13
+ set -euo pipefail
14
+
15
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
16
+ source "$SCRIPT_DIR/lib/common.sh"
17
+ source "$SCRIPT_DIR/lib/personas.sh"
18
+
19
+ # --- Parameters ---
20
+ QUERY="${1:-}"
21
+ CONTEXT_FILE="${2:-}"
22
+ OUTPUT_FILE="${3:-/tmp/gemini_response.json}"
23
+
24
+ # --- Configuration ---
25
+ ENABLE_PERSONA="${ENABLE_PERSONA:-true}"
26
+ CONSULTANT_NAME="Gemini"
27
+
28
+ # --- Build query ---
29
+ FULL_QUERY=$(build_full_query "$QUERY" "$CONTEXT_FILE")
30
+ validate_query "$FULL_QUERY" "Gemini" || exit 1
31
+
32
+ # --- Add persona if enabled ---
33
+ if [[ "$ENABLE_PERSONA" == "true" ]]; then
34
+ FULL_QUERY=$(build_query_with_persona "$CONSULTANT_NAME" "$FULL_QUERY")
35
+ fi
36
+
37
+ # --- Timestamp for metadata ---
38
+ START_TIME=$(get_timestamp_ms)
39
+
40
+ # --- Execution (CLI or API mode) ---
41
+ TEMP_OUTPUT=$(mktemp)
42
+
43
+ if is_api_mode "gemini"; then
44
+ # --- API Mode ---
45
+ log_api_mode_status "gemini"
46
+ validate_api_mode "gemini" || exit 1
47
+
48
+ source "$SCRIPT_DIR/lib/api_query.sh"
49
+
50
+ run_api_mode_query \
51
+ "$CONSULTANT_NAME" \
52
+ "$GEMINI_MODEL" \
53
+ "$FULL_QUERY" \
54
+ "$TEMP_OUTPUT" \
55
+ "$GEMINI_TIMEOUT_SECONDS"
56
+
57
+ exit_code=$?
58
+ else
59
+ # --- CLI Mode ---
60
+ log_api_mode_status "gemini"
61
+ check_command "$GEMINI_CMD" "Gemini CLI" "npm install -g @google/gemini-cli" || exit 1
62
+
63
+ echo "$FULL_QUERY" | run_query \
64
+ "Gemini" \
65
+ "$TEMP_OUTPUT" \
66
+ "$GEMINI_TIMEOUT_SECONDS" \
67
+ "$GEMINI_CMD" -p - -m "$GEMINI_MODEL" --output-format json
68
+
69
+ exit_code=$?
70
+ fi
71
+
72
+ # --- Calculate latency ---
73
+ END_TIME=$(get_timestamp_ms)
74
+ LATENCY_MS=$((END_TIME - START_TIME))
75
+
76
+ # --- Configuration for response building ---
77
+ MODEL_USED="$GEMINI_MODEL"
78
+ PERSONA_NAME=$(get_persona_name "$CONSULTANT_NAME")
79
+
80
+ # --- Post-processing: use shared helper ---
81
+ process_consultant_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" \
82
+ "$TEMP_OUTPUT" "$OUTPUT_FILE" "$exit_code" "$LATENCY_MS" "response"
83
+
84
+ cat "$OUTPUT_FILE"
85
+ exit $exit_code
@@ -0,0 +1,17 @@
1
+ #!/bin/bash
2
+ # query_glm.sh - Query GLM (Zhipu AI) via HTTP API (v2.0 with Persona and Confidence)
3
+ #
4
+ # Usage: ./query_glm.sh "question" [context_file] [output_file]
5
+ #
6
+ # Environment variables:
7
+ # GLM_API_KEY - API key for Zhipu AI (required)
8
+ # GLM_MODEL - Model to use (default: glm-4)
9
+ # GLM_TIMEOUT - Timeout in seconds (default: 180)
10
+ # ENABLE_PERSONA - Enable "The Methodologist" persona (default: true)
11
+
12
+ set -euo pipefail
13
+
14
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
15
+ source "$SCRIPT_DIR/lib/api_query.sh"
16
+
17
+ run_api_consultant "GLM" "$@"
@@ -0,0 +1,17 @@
1
+ #!/bin/bash
2
+ # query_grok.sh - Query Grok (xAI) via HTTP API (v2.0 with Persona and Confidence)
3
+ #
4
+ # Usage: ./query_grok.sh "question" [context_file] [output_file]
5
+ #
6
+ # Environment variables:
7
+ # GROK_API_KEY - API key for xAI (required)
8
+ # GROK_MODEL - Model to use (default: grok-4-1-fast-reasoning)
9
+ # GROK_TIMEOUT - Timeout in seconds (default: 180)
10
+ # ENABLE_PERSONA - Enable "The Provocateur" persona (default: true)
11
+
12
+ set -euo pipefail
13
+
14
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
15
+ source "$SCRIPT_DIR/lib/api_query.sh"
16
+
17
+ run_api_consultant "Grok" "$@"
@@ -0,0 +1,140 @@
1
+ #!/bin/bash
2
+ # query_kilo.sh - Query Kilo Code CLI
3
+ #
4
+ # Usage: ./query_kilo.sh "question" [context_file] [output_file]
5
+ #
6
+ # Environment variables:
7
+ # KILO_MODEL - Model to use (default: uses Kilo's internal provider)
8
+ # KILO_TIMEOUT - Timeout in seconds (default: 180)
9
+ # ENABLE_PERSONA - Enable "The Innovator" persona (default: true)
10
+
11
+ set -euo pipefail
12
+
13
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
14
+ source "$SCRIPT_DIR/lib/common.sh"
15
+ source "$SCRIPT_DIR/lib/personas.sh"
16
+
17
+ # --- Parameters ---
18
+ QUERY="${1:-}"
19
+ CONTEXT_FILE="${2:-}"
20
+ OUTPUT_FILE="${3:-/tmp/kilo_response.json}"
21
+
22
+ # --- Configuration ---
23
+ ENABLE_PERSONA="${ENABLE_PERSONA:-true}"
24
+ CONSULTANT_NAME="Kilo"
25
+ MODEL_USED="${KILO_MODEL:-kilo}"
26
+
27
+ # --- Check prerequisites ---
28
+ check_command "$KILO_CMD" "Kilo Code CLI" "npm install -g @kilocode/cli" || exit 1
29
+
30
+ # --- Build query ---
31
+ FULL_QUERY=$(build_full_query "$QUERY" "$CONTEXT_FILE")
32
+ validate_query "$FULL_QUERY" "Kilo Code" || exit 1
33
+
34
+ # --- Add persona if enabled ---
35
+ if [[ "$ENABLE_PERSONA" == "true" ]]; then
36
+ FULL_QUERY=$(build_query_with_persona "$CONSULTANT_NAME" "$FULL_QUERY")
37
+ fi
38
+
39
+ # --- Timestamp for metadata ---
40
+ START_TIME=$(get_timestamp_ms)
41
+
42
+ # --- Execution ---
43
+ TEMP_OUTPUT=$(mktemp)
44
+ TEMP_RAW=$(mktemp)
45
+ trap 'rm -f "$TEMP_OUTPUT" "$TEMP_RAW"' EXIT
46
+
47
+ # Build command args: run subcommand + --auto + --dir /tmp (prevent SKILL.md loading)
48
+ KILO_ARGS=("$KILO_CMD" "run" "--auto" "--dir" "/tmp")
49
+ if [[ -n "${KILO_MODEL:-}" && "${KILO_MODEL}" != "auto" ]]; then
50
+ KILO_ARGS+=("--model" "$KILO_MODEL")
51
+ fi
52
+ KILO_ARGS+=("$FULL_QUERY")
53
+
54
+ # Use run_with_timeout for cross-platform support (Linux/macOS/POSIX)
55
+ log_info "Consulting Kilo Code (timeout: ${KILO_TIMEOUT_SECONDS}s)..."
56
+
57
+ if run_with_timeout "$KILO_TIMEOUT_SECONDS" "${KILO_ARGS[@]}" > "$TEMP_RAW" 2>&1; then
58
+ exit_code=0
59
+ else
60
+ exit_code=$?
61
+ fi
62
+
63
+ # --- Strip ANSI escape codes from Kilo's text output ---
64
+ if [[ -f "$TEMP_RAW" && -s "$TEMP_RAW" ]]; then
65
+ # Kilo outputs plain text with ANSI codes; strip them for clean output
66
+ CONTENT=$(LC_ALL=C sed 's/\x1b\[[0-9;]*[a-zA-Z]//g' "$TEMP_RAW" | sed '/^$/d') || true
67
+
68
+ if [[ -n "${CONTENT:-}" ]]; then
69
+ exit_code=0
70
+ log_success "[Kilo Code] Response received (${#CONTENT} chars)"
71
+ else
72
+ log_error "[Kilo Code] Could not extract response"
73
+ exit_code=1
74
+ fi
75
+ fi
76
+
77
+ # --- Calculate latency ---
78
+ END_TIME=$(get_timestamp_ms)
79
+ LATENCY_MS=$((END_TIME - START_TIME))
80
+
81
+ # --- Post-processing: extract structure from markdown output ---
82
+ PERSONA_NAME=$(get_persona_name "$CONSULTANT_NAME")
83
+
84
+ if [[ $exit_code -eq 0 && -n "${CONTENT:-}" ]]; then
85
+ # Check if Kilo returned valid JSON (unlikely but handle it)
86
+ if echo "$CONTENT" | jq -e '.response.summary' > /dev/null 2>&1; then
87
+ echo "$CONTENT" > "$TEMP_OUTPUT"
88
+ process_consultant_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" \
89
+ "$TEMP_OUTPUT" "$OUTPUT_FILE" "$exit_code" "$LATENCY_MS"
90
+ else
91
+ # Extract structured fields from markdown/text output
92
+ # Summary: first meaningful line(s), up to 200 chars
93
+ local_summary=$(echo "$CONTENT" | head -5 | tr '\n' ' ' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' | head -c 200)
94
+
95
+ # Approach: look for headings or key phrases
96
+ local_approach=$(echo "$CONTENT" | grep -iE '^#+\s|^approach:|^recommendation:|^solution:' | head -1 | \
97
+ sed 's/^[#[:space:]]*//;s/^[Aa]pproach:[[:space:]]*//' | head -c 100)
98
+ [[ -z "$local_approach" ]] && local_approach=$(echo "$local_summary" | head -c 60)
99
+
100
+ # Confidence: estimate from language strength
101
+ local_confidence=6
102
+ if echo "$CONTENT" | grep -qiE 'highly recommend|strongly suggest|definitely|clearly the best'; then
103
+ local_confidence=8
104
+ elif echo "$CONTENT" | grep -qiE 'recommend|suggest|good approach|effective|solid'; then
105
+ local_confidence=7
106
+ elif echo "$CONTENT" | grep -qiE 'might|could|possibly|one option|uncertain|depends'; then
107
+ local_confidence=5
108
+ fi
109
+
110
+ jq -n \
111
+ --arg consultant "$CONSULTANT_NAME" \
112
+ --arg model "$MODEL_USED" \
113
+ --arg persona "$PERSONA_NAME" \
114
+ --arg summary "$local_summary" \
115
+ --arg detailed "$CONTENT" \
116
+ --arg approach "$local_approach" \
117
+ --argjson confidence "$local_confidence" \
118
+ --argjson metadata "$(build_response_metadata "$LATENCY_MS" "$MODEL_USED")" \
119
+ '{
120
+ consultant: $consultant, model: $model, persona: $persona,
121
+ response: {
122
+ summary: $summary, detailed: $detailed, approach: $approach,
123
+ pros: [], cons: [],
124
+ caveats: ["Structured fields extracted from unformatted CLI output"]
125
+ },
126
+ confidence: {
127
+ score: $confidence,
128
+ reasoning: "Confidence estimated from response language patterns",
129
+ uncertainty_factors: ["Non-JSON response format"]
130
+ },
131
+ metadata: $metadata
132
+ }' > "$OUTPUT_FILE"
133
+ fi
134
+ else
135
+ build_error_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" \
136
+ "Query failed with exit code $exit_code" "$LATENCY_MS" > "$OUTPUT_FILE"
137
+ fi
138
+
139
+ cat "$OUTPUT_FILE"
140
+ exit $exit_code
@@ -0,0 +1,67 @@
1
+ #!/bin/bash
2
+ # query_kimi.sh - Query Kimi CLI (v2.9)
3
+ #
4
+ # Usage: ./query_kimi.sh "question" [context_file] [output_file]
5
+ #
6
+ # Environment variables:
7
+ # KIMI_MODEL - Model identifier (default: kimi-code/kimi-for-coding)
8
+ # KIMI_TIMEOUT - Timeout in seconds (default: 180)
9
+ # ENABLE_PERSONA - Enable "The Eastern Sage" persona (default: true)
10
+
11
+ set -euo pipefail
12
+
13
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
14
+ source "$SCRIPT_DIR/lib/common.sh"
15
+ source "$SCRIPT_DIR/lib/personas.sh"
16
+
17
+ # --- Parameters ---
18
+ QUERY="${1:-}"
19
+ CONTEXT_FILE="${2:-}"
20
+ OUTPUT_FILE="${3:-/tmp/kimi_response.json}"
21
+
22
+ # --- Configuration ---
23
+ ENABLE_PERSONA="${ENABLE_PERSONA:-true}"
24
+ CONSULTANT_NAME="Kimi"
25
+
26
+ # --- Build query ---
27
+ FULL_QUERY=$(build_full_query "$QUERY" "$CONTEXT_FILE")
28
+ validate_query "$FULL_QUERY" "Kimi" || exit 1
29
+
30
+ # --- Add persona if enabled ---
31
+ if [[ "$ENABLE_PERSONA" == "true" ]]; then
32
+ FULL_QUERY=$(build_query_with_persona "$CONSULTANT_NAME" "$FULL_QUERY")
33
+ fi
34
+
35
+ # --- Timestamp for metadata ---
36
+ START_TIME=$(get_timestamp_ms)
37
+
38
+ # --- Execution ---
39
+ TEMP_OUTPUT=$(mktemp)
40
+
41
+ # Check CLI prerequisite
42
+ check_command "$KIMI_CMD" "Kimi CLI" "curl -L code.kimi.com/install.sh | bash" || exit 1
43
+
44
+ # Kimi CLI uses --quiet (equivalent to --print --output-format text --final-message-only)
45
+ # and --input-format text for piped stdin
46
+ echo "$FULL_QUERY" | run_query \
47
+ "Kimi" \
48
+ "$TEMP_OUTPUT" \
49
+ "$KIMI_TIMEOUT_SECONDS" \
50
+ "$KIMI_CMD" --quiet --input-format text
51
+
52
+ exit_code=$?
53
+
54
+ # --- Calculate latency ---
55
+ END_TIME=$(get_timestamp_ms)
56
+ LATENCY_MS=$((END_TIME - START_TIME))
57
+
58
+ # --- Configuration for response building ---
59
+ MODEL_USED="$KIMI_MODEL"
60
+ PERSONA_NAME=$(get_persona_name "$CONSULTANT_NAME")
61
+
62
+ # --- Post-processing: use shared helper ---
63
+ process_consultant_response "$CONSULTANT_NAME" "$MODEL_USED" "$PERSONA_NAME" \
64
+ "$TEMP_OUTPUT" "$OUTPUT_FILE" "$exit_code" "$LATENCY_MS"
65
+
66
+ cat "$OUTPUT_FILE"
67
+ exit $exit_code
@@ -0,0 +1,17 @@
1
+ #!/bin/bash
2
+ # query_minimax.sh - Query MiniMax via HTTP API
3
+ #
4
+ # Usage: ./query_minimax.sh "question" [context_file] [output_file]
5
+ #
6
+ # Environment variables:
7
+ # MINIMAX_API_KEY - API key for MiniMax (required)
8
+ # MINIMAX_MODEL - Model to use (default: MiniMax-M2.5)
9
+ # MINIMAX_TIMEOUT - Timeout in seconds (default: 180)
10
+ # ENABLE_PERSONA - Enable "The Pragmatic Optimizer" persona (default: true)
11
+
12
+ set -euo pipefail
13
+
14
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
15
+ source "$SCRIPT_DIR/lib/api_query.sh"
16
+
17
+ run_api_consultant "MiniMax" "$@"