loki-mode 7.5.17 → 7.5.28

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 (47) hide show
  1. package/README.md +10 -9
  2. package/SKILL.md +14 -14
  3. package/VERSION +1 -1
  4. package/autonomy/completion-council.sh +26 -3
  5. package/autonomy/lib/claude-flags.sh +132 -0
  6. package/autonomy/lib/mcp-config.sh +160 -0
  7. package/autonomy/lib/project-graph.sh +685 -0
  8. package/autonomy/lib/voter-agents.sh +356 -0
  9. package/autonomy/loki +108 -111
  10. package/autonomy/run.sh +95 -186
  11. package/bin/loki +12 -1
  12. package/dashboard/__init__.py +1 -1
  13. package/dashboard/requirements.txt +13 -8
  14. package/dashboard/server.py +33 -15
  15. package/dashboard/static/index.html +298 -299
  16. package/docs/INSTALLATION.md +54 -21
  17. package/docs/retrospectives/v7.5.15-fleet-postmortem.md +325 -0
  18. package/docs/retrospectives/v7.5.15-honesty-audit.md +136 -0
  19. package/docs/retrospectives/v7.5.15-llm-failure-modes.md +49 -0
  20. package/loki-ts/data/finding-schema.json +74 -0
  21. package/loki-ts/data/model-pricing.json +12 -0
  22. package/loki-ts/dist/loki.js +198 -172
  23. package/mcp/__init__.py +1 -1
  24. package/mcp/lsp_proxy.py +713 -0
  25. package/mcp/requirements.txt +9 -3
  26. package/mcp/tests/__init__.py +0 -0
  27. package/mcp/tests/test_lsp_proxy.py +377 -0
  28. package/memory/app_graph.py +153 -0
  29. package/memory/storage.py +6 -1
  30. package/memory/tests/test_app_graph.py +134 -0
  31. package/package.json +4 -3
  32. package/providers/claude.sh +115 -4
  33. package/providers/codex.sh +2 -2
  34. package/providers/loader.sh +4 -4
  35. package/providers/model_catalog.json +0 -9
  36. package/providers/models.sh +1 -2
  37. package/references/multi-provider.md +26 -35
  38. package/references/prompt-repetition.md +1 -1
  39. package/references/quality-control.md +1 -1
  40. package/skills/00-index.md +3 -3
  41. package/skills/model-selection.md +11 -14
  42. package/skills/providers.md +17 -57
  43. package/skills/quality-gates.md +2 -2
  44. package/skills/troubleshooting.md +1 -1
  45. package/src/integrations/github/action-handler.js +3 -2
  46. package/src/protocols/tools/start-project.js +1 -1
  47. package/providers/gemini.sh +0 -343
package/autonomy/loki CHANGED
@@ -428,6 +428,7 @@ show_help() {
428
428
  echo " resume Resume paused execution"
429
429
  echo " status [--json] Show current status (--json for machine-readable)"
430
430
  echo " stats [flags] Session statistics (--json, --efficiency)"
431
+ echo " kpis [--json] Accuracy + efficiency KPIs (v7.5.28+) [Phase K]"
431
432
  echo " logs Show recent log output"
432
433
  echo " dashboard [cmd] Dashboard server (start|stop|status|url|open)"
433
434
  echo " web [cmd] Web app UI (start|stop|status) -- serves web-app/dist/"
@@ -479,7 +480,7 @@ show_help() {
479
480
  echo " help Show this help"
480
481
  echo ""
481
482
  echo "Options for 'start':"
482
- echo " --provider NAME AI provider: claude (default), codex, gemini, cline, aider"
483
+ echo " --provider NAME AI provider: claude (default), codex, cline, aider"
483
484
  echo " --parallel Enable parallel mode with git worktrees"
484
485
  echo " --bg, --background Run in background mode"
485
486
  echo " --simple Force simple complexity tier (3 phases)"
@@ -497,7 +498,7 @@ show_help() {
497
498
  echo " --dry-run Preview generated PRD without starting"
498
499
  echo " --no-start Generate PRD but don't start execution"
499
500
  echo " --output FILE Save PRD to custom path"
500
- echo " --provider NAME AI provider: claude (default), codex, gemini, cline, aider"
501
+ echo " --provider NAME AI provider: claude (default), codex, cline, aider"
501
502
  echo " --parallel Enable parallel mode with git worktrees"
502
503
  echo " --budget USD Set cost budget limit"
503
504
  echo ""
@@ -508,24 +509,55 @@ show_help() {
508
509
  echo " --detach, -d Run in background (implies --worktree)"
509
510
  echo ""
510
511
  echo "Examples:"
511
- echo " loki run 123 # GitHub issue from current repo"
512
- echo " loki run PROJ-456 # Jira issue"
513
- echo " loki run owner/repo#789 # GitHub with specific repo"
514
- echo " loki demo # Run 60-second interactive demo"
515
- echo " loki init # Build a PRD interactively"
516
- echo " loki init -t saas-starter # Start from a template"
517
- echo " loki quick \"add dark mode\" # Quick single-task mode"
512
+ echo ""
513
+ echo " # Starting a session"
518
514
  echo " loki start ./prd.md # Start with PRD file"
519
- echo " loki start --bg # Start in background"
520
- echo " loki start --parallel # Start in parallel mode"
521
- echo " loki watch # Watch PRD for changes, auto-rerun"
522
- echo " loki export json # Export session data"
523
- echo " loki config set maxTier sonnet # Cap model cost"
524
- echo " loki status # Check current status"
525
- echo " loki remote # Start remote session (phone/browser)"
515
+ echo " loki start owner/repo#123 # GitHub issue (auto-fetches)"
516
+ echo " loki start PROJ-456 # Jira issue"
517
+ echo " loki start --bg ./prd.md # Start in background"
518
+ echo " loki start --parallel ./prd.md # Parallel mode (git worktrees)"
519
+ echo " loki quick \"add dark mode\" # Single-task mode (3 iters max)"
520
+ echo " loki demo # 60-second interactive demo"
521
+ echo " loki init -t saas-starter # Scaffold from template"
522
+ echo ""
523
+ echo " # Session ops + observability"
524
+ echo " loki status [--json] # Current status"
525
+ echo " loki stats --efficiency # Token + cost stats"
526
+ echo " loki kpis [--json] # Accuracy + efficiency KPI snapshot"
527
+ echo " loki doctor [--json] # System prereq + skill symlinks"
528
+ echo " loki logs # Tail recent log output"
529
+ echo " loki export json|markdown|csv|timeline # Export session"
530
+ echo " loki cleanup # Kill orphaned processes"
531
+ echo ""
532
+ echo " # Providers + model routing"
533
+ echo " loki provider list # Show 4 providers (claude/codex/cline/aider)"
534
+ echo " loki provider set codex # Switch active provider"
535
+ echo " # OpenRouter / Ollama routing (Phase I v7.5.25+):"
536
+ echo " export ANTHROPIC_BASE_URL=https://openrouter.ai/api/v1 \\\\"
537
+ echo " LOKI_MODEL_OVERRIDE=anthropic/claude-sonnet-4.5"
538
+ echo " loki start ./prd.md # Routes to OpenRouter via Claude Code"
539
+ echo ""
540
+ echo " # Cross-project context (Phase F v7.5.23+)"
541
+ echo " # Drop .loki/app.json with {schema_version:1,app_id:myapp,members:[ui,api]}"
542
+ echo " # at the parent of related repos for shared CLAUDE.md + memory."
543
+ echo ""
544
+ echo " # Memory + learnings"
545
+ echo " loki memory list # All learnings"
546
+ echo " loki memory search <query> # Search across learnings"
547
+ echo " loki memory consolidate # Run episodic-to-semantic pipeline"
548
+ echo ""
549
+ echo " # Config + dashboard"
550
+ echo " loki config set maxTier sonnet # Cap model cost"
551
+ echo " loki dashboard start # Web dashboard at localhost:57374"
552
+ echo " loki watch # Auto-rerun on PRD changes"
553
+ echo " loki remote # Remote session (phone/browser)"
554
+ echo ""
555
+ echo "Phase A-J features (v7.5.18 - v7.5.28) are default-on. See CHANGELOG."
526
556
  echo ""
527
557
  echo "Environment Variables:"
528
- echo " See: $RUN_SH (header comments)"
558
+ echo " Opt-outs: LOKI_HOOK_EVENTS=off, LOKI_DYNAMIC_PROMPT_SECTIONS=keep,"
559
+ echo " LOKI_MEMORY_BASE_PATH (shared memory dir for app graph)"
560
+ echo " See: $RUN_SH (header comments) for full list."
529
561
  }
530
562
 
531
563
  # Detect argument type for unified `loki start` (v6.84.0)
@@ -666,7 +698,7 @@ cmd_start() {
666
698
  echo " --issue URL|NUM Force issue mode with URL or number"
667
699
  echo ""
668
700
  echo "Options:"
669
- echo " --provider NAME AI provider: claude (default), codex, gemini, cline, aider"
701
+ echo " --provider NAME AI provider: claude (default), codex, cline, aider"
670
702
  echo " --parallel Enable parallel mode with git worktrees"
671
703
  echo " --bg, --background Run in background mode"
672
704
  echo " --simple Force simple complexity tier (3 phases)"
@@ -733,7 +765,7 @@ cmd_start() {
733
765
  args+=("--provider" "$provider")
734
766
  shift 2
735
767
  else
736
- echo -e "${RED}--provider requires a value (claude, codex, gemini, cline, aider)${NC}"
768
+ echo -e "${RED}--provider requires a value (claude, codex, cline, aider)${NC}"
737
769
  exit 1
738
770
  fi
739
771
  ;;
@@ -1446,7 +1478,7 @@ cmd_start() {
1446
1478
  --action "provider_selection" \
1447
1479
  --key "provider" \
1448
1480
  --value "$provider" \
1449
- --rejected '["'"$([ "$provider" != "claude" ] && echo "claude" || echo "codex")'", "'"$([ "$provider" != "gemini" ] && echo "gemini" || echo "codex")'"]' \
1481
+ --rejected '["'"$([ "$provider" != "claude" ] && echo "claude" || echo "codex")'", "'"$([ "$provider" != "cline" ] && echo "cline" || echo "aider")'"]' \
1450
1482
  --confidence 0.95
1451
1483
  fi
1452
1484
 
@@ -1467,7 +1499,6 @@ cmd_start() {
1467
1499
  case "$effective_provider" in
1468
1500
  claude) echo " npm install -g @anthropic-ai/claude-code" ;;
1469
1501
  codex) echo " npm install -g @openai/codex" ;;
1470
- gemini) echo " npm install -g @google/gemini-cli" ;;
1471
1502
  cline) echo " npm install -g @anthropic-ai/cline" ;;
1472
1503
  aider) echo " pip install aider-chat" ;;
1473
1504
  *) echo " Check the provider documentation for installation." ;;
@@ -1485,6 +1516,18 @@ cmd_start() {
1485
1516
  sleep 2
1486
1517
  fi
1487
1518
 
1519
+ # Phase F (v7.5.23): cross-project context discovery. Walks ONE parent
1520
+ # level looking for sibling repos sharing a `.loki/app.json` marker.
1521
+ # Exports LOKI_PROJECT_GRAPH_{ROOT,APP_ID,MEMBERS} which survive exec
1522
+ # into run.sh. Silent no-op when no graph is found (backward compat).
1523
+ local _pg_helper="$SKILL_DIR/autonomy/lib/project-graph.sh"
1524
+ if [ -f "$_pg_helper" ]; then
1525
+ # shellcheck disable=SC1090
1526
+ . "$_pg_helper"
1527
+ local _pg_target="${LOKI_TARGET_DIR:-$(pwd)}"
1528
+ loki_project_graph_discover "$_pg_target" || true
1529
+ fi
1530
+
1488
1531
  exec "$RUN_SH" "${args[@]}"
1489
1532
  }
1490
1533
 
@@ -2044,7 +2087,7 @@ cmd_status() {
2044
2087
  # Show provider with capability
2045
2088
  local capability="full features"
2046
2089
  case "$current_provider" in
2047
- codex|gemini|aider)
2090
+ codex|aider)
2048
2091
  capability="degraded mode"
2049
2092
  ;;
2050
2093
  cline)
@@ -2052,7 +2095,7 @@ cmd_status() {
2052
2095
  ;;
2053
2096
  esac
2054
2097
  echo -e "${CYAN}Provider:${NC} $current_provider ($capability)"
2055
- echo -e "${DIM} Switch with: loki provider set <claude|codex|gemini|cline|aider>${NC}"
2098
+ echo -e "${DIM} Switch with: loki provider set <claude|codex|cline|aider>${NC}"
2056
2099
  echo ""
2057
2100
 
2058
2101
  # Show running sessions (v6.4.0 - concurrent session support)
@@ -2709,7 +2752,7 @@ cmd_provider() {
2709
2752
  echo " loki provider set claude"
2710
2753
  echo " loki provider set codex"
2711
2754
  echo " loki provider list"
2712
- echo " loki provider info gemini"
2755
+ echo " loki provider info codex"
2713
2756
  echo " loki provider models"
2714
2757
  ;;
2715
2758
  esac
@@ -2737,7 +2780,7 @@ cmd_provider_show() {
2737
2780
  cline)
2738
2781
  echo -e "${GREEN}Status:${NC} Near-full mode (subagents, MCP, 12+ providers)"
2739
2782
  ;;
2740
- codex|gemini|aider)
2783
+ codex|aider)
2741
2784
  echo -e "${YELLOW}Status:${NC} Degraded mode (sequential only)"
2742
2785
  ;;
2743
2786
  esac
@@ -2758,17 +2801,22 @@ cmd_provider_set() {
2758
2801
 
2759
2802
  if [ -z "$new_provider" ]; then
2760
2803
  echo -e "${RED}Error: Provider name required${NC}"
2761
- echo "Usage: loki provider set <claude|codex|gemini|cline|aider>"
2804
+ echo "Usage: loki provider set <claude|codex|cline|aider>"
2762
2805
  exit 1
2763
2806
  fi
2764
2807
 
2765
2808
  # Validate provider
2766
2809
  case "$new_provider" in
2767
- claude|codex|gemini|cline|aider)
2810
+ gemini)
2811
+ echo -e "${RED}Error: Provider 'gemini' is deprecated as of v7.5.18 and has been removed.${NC}"
2812
+ echo "Active providers: claude, codex, cline, aider"
2813
+ exit 1
2814
+ ;;
2815
+ claude|codex|cline|aider)
2768
2816
  ;;
2769
2817
  *)
2770
2818
  echo -e "${RED}Error: Invalid provider '$new_provider'${NC}"
2771
- echo "Valid providers: claude, codex, gemini, cline, aider"
2819
+ echo "Valid providers: claude, codex, cline, aider"
2772
2820
  exit 1
2773
2821
  ;;
2774
2822
  esac
@@ -2784,9 +2832,6 @@ cmd_provider_set() {
2784
2832
  codex)
2785
2833
  echo "Install: npm install -g @openai/codex"
2786
2834
  ;;
2787
- gemini)
2788
- echo "Install: npm install -g @google/gemini-cli"
2789
- ;;
2790
2835
  cline)
2791
2836
  echo "Install: npm install -g cline"
2792
2837
  ;;
@@ -2821,7 +2866,6 @@ cmd_provider_list() {
2821
2866
  # Check which CLIs are installed
2822
2867
  local claude_status="${RED}not installed${NC}"
2823
2868
  local codex_status="${RED}not installed${NC}"
2824
- local gemini_status="${RED}not installed${NC}"
2825
2869
  local cline_status="${RED}not installed${NC}"
2826
2870
  local aider_status="${RED}not installed${NC}"
2827
2871
 
@@ -2831,9 +2875,6 @@ cmd_provider_list() {
2831
2875
  if command -v codex &> /dev/null; then
2832
2876
  codex_status="${GREEN}installed${NC}"
2833
2877
  fi
2834
- if command -v gemini &> /dev/null; then
2835
- gemini_status="${GREEN}installed${NC}"
2836
- fi
2837
2878
  if command -v cline &> /dev/null; then
2838
2879
  cline_status="${GREEN}installed${NC}"
2839
2880
  fi
@@ -2850,10 +2891,6 @@ cmd_provider_list() {
2850
2891
  [ "$current" = "codex" ] && marker=" ${CYAN}(current)${NC}"
2851
2892
  echo -e " codex - Codex CLI (OpenAI) $codex_status$marker"
2852
2893
 
2853
- marker=""
2854
- [ "$current" = "gemini" ] && marker=" ${CYAN}(current)${NC}"
2855
- echo -e " gemini - Gemini CLI (Google) $gemini_status$marker"
2856
-
2857
2894
  marker=""
2858
2895
  [ "$current" = "cline" ] && marker=" ${CYAN}(current)${NC}"
2859
2896
  echo -e " cline - Cline (multi-provider) $cline_status$marker"
@@ -2899,18 +2936,6 @@ cmd_provider_info() {
2899
2936
  echo ""
2900
2937
  echo "Status: Degraded mode"
2901
2938
  ;;
2902
- gemini)
2903
- echo "Name: Gemini CLI"
2904
- echo "Vendor: Google"
2905
- echo "CLI: gemini"
2906
- echo "Flag: --approval-mode=yolo"
2907
- echo ""
2908
- echo "Features:"
2909
- echo " - Autonomous mode"
2910
- echo " - Sequential only (no subagents)"
2911
- echo ""
2912
- echo "Status: Degraded mode"
2913
- ;;
2914
2939
  cline)
2915
2940
  echo "Name: Cline CLI (Multi-Provider)"
2916
2941
  echo "Vendor: Cline (supports 12+ providers)"
@@ -2954,7 +2979,7 @@ cmd_provider_models() {
2954
2979
  echo -e "${BOLD}Model Configuration (resolved):${NC}"
2955
2980
  echo ""
2956
2981
 
2957
- local providers=("claude" "codex" "gemini" "cline" "aider")
2982
+ local providers=("claude" "codex" "cline" "aider")
2958
2983
  for provider in "${providers[@]}"; do
2959
2984
  local provider_file="$script_dir/providers/${provider}.sh"
2960
2985
  [ -f "$provider_file" ] || continue
@@ -3002,7 +3027,7 @@ cmd_provider_models() {
3002
3027
  fi
3003
3028
  fi
3004
3029
  else
3005
- # Multi-tier providers (claude, gemini): check provider-specific per-tier, then generic
3030
+ # Multi-tier providers (claude): check provider-specific per-tier, then generic
3006
3031
  local provider_var="LOKI_${provider_upper}_MODEL_${tier_upper}"
3007
3032
  local generic_var="LOKI_MODEL_${tier_upper}"
3008
3033
 
@@ -3034,14 +3059,6 @@ cmd_provider_models() {
3034
3059
  effort_d=$(bash -c "source '$provider_file' 2>/dev/null; echo \$PROVIDER_EFFORT_DEVELOPMENT")
3035
3060
  effort_f=$(bash -c "source '$provider_file' 2>/dev/null; echo \$PROVIDER_EFFORT_FAST")
3036
3061
  echo " Effort: planning=$effort_p, development=$effort_d, fast=$effort_f"
3037
- elif [ "$provider" = "gemini" ]; then
3038
- local think_p think_d think_f fb
3039
- think_p=$(bash -c "source '$provider_file' 2>/dev/null; echo \$PROVIDER_THINKING_PLANNING")
3040
- think_d=$(bash -c "source '$provider_file' 2>/dev/null; echo \$PROVIDER_THINKING_DEVELOPMENT")
3041
- think_f=$(bash -c "source '$provider_file' 2>/dev/null; echo \$PROVIDER_THINKING_FAST")
3042
- fb=$(bash -c "source '$provider_file' 2>/dev/null; echo \$PROVIDER_MODEL_FALLBACK")
3043
- echo " Thinking: planning=$think_p, development=$think_d, fast=$think_f"
3044
- echo " Fallback: $fb"
3045
3062
  fi
3046
3063
  echo ""
3047
3064
  done
@@ -4533,7 +4550,7 @@ cmd_run() {
4533
4550
  echo " --dry-run Preview generated PRD without starting"
4534
4551
  echo " --no-start Generate PRD but don't start execution"
4535
4552
  echo " --output FILE Save PRD to custom path"
4536
- echo " --provider NAME AI provider: claude (default), codex, gemini, cline, aider"
4553
+ echo " --provider NAME AI provider: claude (default), codex, cline, aider"
4537
4554
  echo " --parallel Enable parallel mode with git worktrees"
4538
4555
  echo " --bg, --background Run in background mode"
4539
4556
  echo " --simple Force simple complexity tier"
@@ -5021,7 +5038,7 @@ cmd_issue() {
5021
5038
  echo " --output FILE Save PRD to custom path (default: .loki/prd-issue-N.md)"
5022
5039
  echo ""
5023
5040
  echo "Options passed to 'start' (when --start is used):"
5024
- echo " --provider NAME AI provider: claude (default), codex, gemini, cline, aider"
5041
+ echo " --provider NAME AI provider: claude (default), codex, cline, aider"
5025
5042
  echo " --parallel Enable parallel mode with git worktrees"
5026
5043
  echo " --bg, --background Run in background mode"
5027
5044
  echo ""
@@ -5883,7 +5900,7 @@ cmd_config() {
5883
5900
  echo " model.planning Model for planning tier"
5884
5901
  echo " model.development Model for development tier"
5885
5902
  echo " model.fast Model for fast tier"
5886
- echo " provider Default AI provider: claude, codex, gemini, cline, aider"
5903
+ echo " provider Default AI provider: claude, codex, cline, aider"
5887
5904
  echo " issue.provider Default issue provider: github, gitlab, jira, azure_devops"
5888
5905
  echo " blind_validation Blind validation mode: true, false (default: true)"
5889
5906
  echo " adversarial_testing Adversarial testing: true, false (default: true)"
@@ -5942,8 +5959,12 @@ cmd_config_set() {
5942
5959
  ;;
5943
5960
  provider)
5944
5961
  case "$value" in
5945
- claude|codex|gemini|cline|aider) ;;
5946
- *) echo -e "${RED}Invalid provider: $value (expected: claude, codex, gemini, cline, aider)${NC}"; return 1 ;;
5962
+ gemini)
5963
+ echo -e "${RED}Invalid provider: 'gemini' is deprecated as of v7.5.18. Active providers: claude, codex, cline, aider${NC}"
5964
+ return 1
5965
+ ;;
5966
+ claude|codex|cline|aider) ;;
5967
+ *) echo -e "${RED}Invalid provider: $value (expected: claude, codex, cline, aider)${NC}"; return 1 ;;
5947
5968
  esac
5948
5969
  ;;
5949
5970
  issue.provider)
@@ -6268,7 +6289,6 @@ cmd_setup_skill() {
6268
6289
  local skill_targets=(
6269
6290
  "$HOME/.claude/skills/loki-mode:Claude Code"
6270
6291
  "$HOME/.codex/skills/loki-mode:Codex CLI"
6271
- "$HOME/.gemini/skills/loki-mode:Gemini CLI"
6272
6292
  "$HOME/.cline/skills/loki-mode:Cline CLI"
6273
6293
  "$HOME/.aider/skills/loki-mode:Aider CLI"
6274
6294
  )
@@ -6552,7 +6572,7 @@ cmd_doctor() {
6552
6572
  echo " --json Output machine-readable JSON"
6553
6573
  echo ""
6554
6574
  echo "Checks: node, python3, jq, git, curl, bash version,"
6555
- echo " claude/codex/gemini CLIs, and disk space."
6575
+ echo " claude/codex CLIs, and disk space."
6556
6576
  return 0
6557
6577
  ;;
6558
6578
  *)
@@ -6627,9 +6647,6 @@ cmd_doctor() {
6627
6647
  codex)
6628
6648
  version=$(codex --version 2>/dev/null | head -1 | sed 's/[^0-9.]//g' | head -1)
6629
6649
  ;;
6630
- gemini)
6631
- version=$(gemini --version 2>/dev/null | head -1 | sed 's/[^0-9.]//g' | head -1)
6632
- ;;
6633
6650
  cline)
6634
6651
  version=$(cline --version 2>/dev/null | head -1 | sed 's/[^0-9.]//g' | head -1)
6635
6652
  ;;
@@ -6680,13 +6697,12 @@ cmd_doctor() {
6680
6697
  echo -e "${CYAN}AI Providers:${NC}"
6681
6698
  doctor_check "Claude CLI" claude optional || true
6682
6699
  doctor_check "Codex CLI" codex optional || true
6683
- doctor_check "Gemini CLI" gemini optional || true
6684
6700
  doctor_check "Cline CLI" cline optional || true
6685
6701
  doctor_check "Aider CLI" aider optional || true
6686
6702
 
6687
6703
  # Check if at least one provider is installed
6688
6704
  local _any_provider=false
6689
- for _dp in claude codex gemini cline aider; do
6705
+ for _dp in claude codex cline aider; do
6690
6706
  command -v "$_dp" &>/dev/null && _any_provider=true && break
6691
6707
  done
6692
6708
  if ! $_any_provider; then
@@ -6711,19 +6727,12 @@ cmd_doctor() {
6711
6727
  elif command -v codex &>/dev/null; then
6712
6728
  echo -e " ${DIM} -- ${NC} OPENAI_API_KEY not set (Codex CLI uses its own login)"
6713
6729
  fi
6714
- if [ -n "${GOOGLE_API_KEY:-${GEMINI_API_KEY:-}}" ]; then
6715
- echo -e " ${GREEN}PASS${NC} GOOGLE_API_KEY is set"
6716
- pass_count=$((pass_count + 1))
6717
- elif command -v gemini &>/dev/null; then
6718
- echo -e " ${DIM} -- ${NC} GOOGLE_API_KEY not set (Gemini CLI uses its own login)"
6719
- fi
6720
6730
  echo ""
6721
6731
 
6722
6732
  echo -e "${CYAN}Skills:${NC}"
6723
6733
  local skill_dirs=(
6724
6734
  "$HOME/.claude/skills/loki-mode:Claude Code"
6725
6735
  "$HOME/.codex/skills/loki-mode:Codex CLI"
6726
- "$HOME/.gemini/skills/loki-mode:Gemini CLI"
6727
6736
  "$HOME/.cline/skills/loki-mode:Cline CLI"
6728
6737
  "$HOME/.aider/skills/loki-mode:Aider CLI"
6729
6738
  )
@@ -6952,7 +6961,6 @@ checks.append(check_tool('bash', 'bash', 'recommended', '4.0'))
6952
6961
  checks.append(check_tool('Bun', 'bun', 'recommended', '1.3'))
6953
6962
  checks.append(check_tool('Claude CLI', 'claude', 'optional'))
6954
6963
  checks.append(check_tool('Codex CLI', 'codex', 'optional'))
6955
- checks.append(check_tool('Gemini CLI', 'gemini', 'optional'))
6956
6964
  checks.append(check_tool('Cline CLI', 'cline', 'optional'))
6957
6965
  checks.append(check_tool('Aider CLI', 'aider', 'optional'))
6958
6966
 
@@ -8198,7 +8206,6 @@ QPRDEOF
8198
8206
  case "$_quick_provider" in
8199
8207
  claude) echo " npm install -g @anthropic-ai/claude-code" ;;
8200
8208
  codex) echo " npm install -g @openai/codex" ;;
8201
- gemini) echo " npm install -g @google/gemini-cli" ;;
8202
8209
  cline) echo " npm install -g @anthropic-ai/cline" ;;
8203
8210
  aider) echo " pip install aider-chat" ;;
8204
8211
  *) echo " Check the provider documentation for installation." ;;
@@ -8443,7 +8450,7 @@ INSTRUCTIONS:
8443
8450
  echo -e "${CYAN}[AI] Analyzing $svc_name failure with ${LOKI_PROVIDER:-claude}...${NC}"
8444
8451
 
8445
8452
  # 4. LET AI FIX: Run loki quick with the AI prompt
8446
- # The AI provider (claude/codex/gemini/ollama) decides what to fix
8453
+ # The AI provider (claude/codex/ollama) decides what to fix
8447
8454
  fix_count=$((fix_count + 1))
8448
8455
  echo -e "${CYAN}[FIX] Attempt $fix_count/$max_fixes${NC}"
8449
8456
 
@@ -8968,7 +8975,7 @@ ENDGITIGNORE
8968
8975
 
8969
8976
  # Check if an AI provider CLI is available
8970
8977
  local _has_provider=false
8971
- for _pcli in claude codex gemini cline aider; do
8978
+ for _pcli in claude codex cline aider; do
8972
8979
  if command -v "$_pcli" &>/dev/null; then
8973
8980
  _has_provider=true
8974
8981
  break
@@ -8980,7 +8987,6 @@ ENDGITIGNORE
8980
8987
  echo " Install at least one before running 'loki start':"
8981
8988
  echo " npm install -g @anthropic-ai/claude-code (recommended)"
8982
8989
  echo " npm install -g @openai/codex"
8983
- echo " npm install -g @google/gemini-cli"
8984
8990
  echo ""
8985
8991
  echo " Then verify your setup: ${BOLD}loki doctor${NC}"
8986
8992
  fi
@@ -9851,9 +9857,6 @@ except Exception: pass
9851
9857
  codex)
9852
9858
  (cd "$codebase_path" && codex exec --full-auto "$phase_prompt" 2>&1) || phase_exit=$?
9853
9859
  ;;
9854
- gemini)
9855
- (cd "$codebase_path" && gemini --approval-mode=yolo "$phase_prompt" 2>&1) || phase_exit=$?
9856
- ;;
9857
9860
  cline)
9858
9861
  (cd "$codebase_path" && cline -y "$phase_prompt" 2>&1) || phase_exit=$?
9859
9862
  ;;
@@ -9864,7 +9867,7 @@ except Exception: pass
9864
9867
  (cd "$codebase_path" && aider --message "$phase_prompt" --yes-always --no-auto-commits --model "$aider_model" $aider_flags 2>&1) || phase_exit=$?
9865
9868
  ;;
9866
9869
  *)
9867
- echo -e "${RED}Error: Unknown provider '${provider_name}'. Supported: claude, codex, gemini, cline, aider${NC}"
9870
+ echo -e "${RED}Error: Unknown provider '${provider_name}'. Supported: claude, codex, cline, aider${NC}"
9868
9871
  phase_exit=1
9869
9872
  ;;
9870
9873
  esac
@@ -10021,9 +10024,6 @@ except Exception: pass
10021
10024
  codex)
10022
10025
  (cd "$codebase_path" && codex exec --full-auto "$doc_prompt" 2>&1) || doc_exit=$?
10023
10026
  ;;
10024
- gemini)
10025
- (cd "$codebase_path" && gemini --approval-mode=yolo "$doc_prompt" 2>&1) || doc_exit=$?
10026
- ;;
10027
10027
  cline)
10028
10028
  (cd "$codebase_path" && cline -y "$doc_prompt" 2>&1) || doc_exit=$?
10029
10029
  ;;
@@ -10531,9 +10531,6 @@ except Exception: pass
10531
10531
  codex)
10532
10532
  (cd "$codebase_path" && codex exec --full-auto "$heal_prompt" 2>&1) || heal_exit=$?
10533
10533
  ;;
10534
- gemini)
10535
- (cd "$codebase_path" && gemini --approval-mode=yolo "$heal_prompt" 2>&1) || heal_exit=$?
10536
- ;;
10537
10534
  cline)
10538
10535
  (cd "$codebase_path" && cline -y "$heal_prompt" 2>&1) || heal_exit=$?
10539
10536
  ;;
@@ -10546,7 +10543,7 @@ except Exception: pass
10546
10543
  # BUG-HEAL-003: Unknown provider should error, not silently succeed
10547
10544
  *)
10548
10545
  echo -e "${RED}Error: Unknown provider: $provider${NC}"
10549
- echo "Supported providers: claude, codex, gemini, cline, aider"
10546
+ echo "Supported providers: claude, codex, cline, aider"
10550
10547
  return 1
10551
10548
  ;;
10552
10549
  esac
@@ -11312,12 +11309,12 @@ PYEOF
11312
11309
  mkdir -p "$loki_dir/state"
11313
11310
  local current_provider
11314
11311
  current_provider=$(cat "$loki_dir/state/provider" 2>/dev/null || echo "claude")
11315
- local chain="${LOKI_FAILOVER_CHAIN:-claude,codex,gemini}"
11312
+ local chain="${LOKI_FAILOVER_CHAIN:-claude,codex,cline}"
11316
11313
 
11317
11314
  cat > "$failover_file" << FEOF
11318
11315
  {
11319
11316
  "enabled": true,
11320
- "chain": $(printf '%s' "$chain" | python3 -c 'import sys,json; print(json.dumps(sys.stdin.read().strip().split(",")))' 2>/dev/null || echo '["claude","codex","gemini"]'),
11317
+ "chain": $(printf '%s' "$chain" | python3 -c 'import sys,json; print(json.dumps(sys.stdin.read().strip().split(",")))' 2>/dev/null || echo '["claude","codex","cline"]'),
11321
11318
  "currentProvider": "$current_provider",
11322
11319
  "primaryProvider": "$current_provider",
11323
11320
  "lastFailover": null,
@@ -11355,7 +11352,7 @@ with open('$failover_file', 'w') as f: json.dump(d, f, indent=2)
11355
11352
  local IFS=','
11356
11353
  for p in $new_chain; do
11357
11354
  case "$p" in
11358
- claude|codex|gemini|cline|aider) ;;
11355
+ claude|codex|cline|aider) ;;
11359
11356
  *) echo -e "${RED}Error: invalid provider '$p' in chain${NC}"; return 1 ;;
11360
11357
  esac
11361
11358
  done
@@ -11383,9 +11380,9 @@ with open('$failover_file', 'w') as f: json.dump(d, f, indent=2)
11383
11380
  source "$script_dir/../providers/loader.sh"
11384
11381
  fi
11385
11382
 
11386
- local chain_providers="claude,codex,gemini"
11383
+ local chain_providers="claude,codex,cline"
11387
11384
  if [ -f "$failover_file" ]; then
11388
- chain_providers=$(_FAILOVER_FILE="$failover_file" python3 -c "import json, os; print(','.join(json.load(open(os.environ['_FAILOVER_FILE'])).get('chain', ['claude','codex','gemini'])))" 2>/dev/null || echo "claude,codex,gemini")
11385
+ chain_providers=$(_FAILOVER_FILE="$failover_file" python3 -c "import json, os; print(','.join(json.load(open(os.environ['_FAILOVER_FILE'])).get('chain', ['claude','codex','cline'])))" 2>/dev/null || echo "claude,codex,cline")
11389
11386
  fi
11390
11387
 
11391
11388
  local IFS=','
@@ -11411,7 +11408,6 @@ with open('$failover_file', 'w') as f: json.dump(d, f, indent=2)
11411
11408
  case "$p" in
11412
11409
  claude) [ -n "${ANTHROPIC_API_KEY:-}" ] && has_key=true ;;
11413
11410
  codex) [ -n "${OPENAI_API_KEY:-}" ] && has_key=true ;;
11414
- gemini) [ -n "${GOOGLE_API_KEY:-${GEMINI_API_KEY:-}}" ] && has_key=true ;;
11415
11411
  cline|aider) has_key=true ;; # Key check varies
11416
11412
  esac
11417
11413
 
@@ -11452,7 +11448,7 @@ with open('$failover_file', 'w') as f: json.dump(d, f, indent=2)
11452
11448
  echo " (no args) Show failover status and health"
11453
11449
  echo " --enable Enable auto-failover"
11454
11450
  echo " --disable Disable auto-failover"
11455
- echo " --chain X,Y,Z Set failover chain (e.g., claude,codex,gemini)"
11451
+ echo " --chain X,Y,Z Set failover chain (e.g., claude,codex,cline)"
11456
11452
  echo " --test Test all providers in chain"
11457
11453
  echo " --reset Reset failover state to defaults"
11458
11454
  echo " --help, -h Show this help"
@@ -11816,7 +11812,7 @@ if integration_count > 3 or complexity in ('complex', 'enterprise'):
11816
11812
  recommended_provider = 'Claude'
11817
11813
  provider_reason = 'Full feature support needed (subagents, parallel, MCP)'
11818
11814
  elif complexity == 'simple' and endpoint_count == 0:
11819
- recommended_provider = 'Any (Claude/Codex/Gemini)'
11815
+ recommended_provider = 'Any (Claude/Codex/Cline)'
11820
11816
  provider_reason = 'Simple project works with all providers'
11821
11817
  else:
11822
11818
  recommended_provider = 'Claude'
@@ -12083,6 +12079,14 @@ maybe_show_auto_plan() {
12083
12079
 
12084
12080
  # Main command dispatcher
12085
12081
  main() {
12082
+ # v7.5.18: early guard -- LOKI_PROVIDER=gemini is no longer supported.
12083
+ if [ "${LOKI_PROVIDER:-}" = "gemini" ]; then
12084
+ echo -e "${RED}Error: Provider 'gemini' is deprecated as of v7.5.18 and has been removed.${NC}" >&2
12085
+ echo "Active providers: claude, codex, cline, aider" >&2
12086
+ echo "Unset LOKI_PROVIDER or use: LOKI_PROVIDER=claude" >&2
12087
+ exit 1
12088
+ fi
12089
+
12086
12090
  if [ $# -eq 0 ]; then
12087
12091
  show_help
12088
12092
  exit 0
@@ -17871,9 +17875,6 @@ USER TASK: ${prompt}"
17871
17875
  codex)
17872
17876
  codex exec --full-auto "$full_prompt" 2>&1 || agent_exit=$?
17873
17877
  ;;
17874
- gemini)
17875
- gemini --approval-mode=yolo "$full_prompt" 2>&1 || agent_exit=$?
17876
- ;;
17877
17878
  cline)
17878
17879
  cline -y "$full_prompt" 2>&1 || agent_exit=$?
17879
17880
  ;;
@@ -17982,7 +17983,6 @@ $diff"
17982
17983
  case "$provider" in
17983
17984
  claude) claude -p "$review_prompt" 2>&1 ;;
17984
17985
  codex) codex exec --full-auto "$review_prompt" 2>&1 ;;
17985
- gemini) gemini --approval-mode=yolo "$review_prompt" 2>&1 ;;
17986
17986
  cline) cline -y "$review_prompt" 2>&1 ;;
17987
17987
  *) echo -e "${RED}Unknown provider: $provider${NC}"; return 1 ;;
17988
17988
  esac
@@ -19575,9 +19575,6 @@ _docs_invoke_provider() {
19575
19575
  codex)
19576
19576
  result=$($t_prefix codex exec --full-auto "$prompt" 2>/dev/null) || exit_code=$?
19577
19577
  ;;
19578
- gemini)
19579
- result=$($t_prefix gemini --approval-mode=yolo "$prompt" 2>/dev/null) || exit_code=$?
19580
- ;;
19581
19578
  cline)
19582
19579
  result=$($t_prefix cline -y "$prompt" 2>/dev/null) || exit_code=$?
19583
19580
  ;;