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.
- package/README.md +10 -9
- package/SKILL.md +14 -14
- package/VERSION +1 -1
- package/autonomy/completion-council.sh +26 -3
- package/autonomy/lib/claude-flags.sh +132 -0
- package/autonomy/lib/mcp-config.sh +160 -0
- package/autonomy/lib/project-graph.sh +685 -0
- package/autonomy/lib/voter-agents.sh +356 -0
- package/autonomy/loki +108 -111
- package/autonomy/run.sh +95 -186
- package/bin/loki +12 -1
- package/dashboard/__init__.py +1 -1
- package/dashboard/requirements.txt +13 -8
- package/dashboard/server.py +33 -15
- package/dashboard/static/index.html +298 -299
- package/docs/INSTALLATION.md +54 -21
- package/docs/retrospectives/v7.5.15-fleet-postmortem.md +325 -0
- package/docs/retrospectives/v7.5.15-honesty-audit.md +136 -0
- package/docs/retrospectives/v7.5.15-llm-failure-modes.md +49 -0
- package/loki-ts/data/finding-schema.json +74 -0
- package/loki-ts/data/model-pricing.json +12 -0
- package/loki-ts/dist/loki.js +198 -172
- package/mcp/__init__.py +1 -1
- package/mcp/lsp_proxy.py +713 -0
- package/mcp/requirements.txt +9 -3
- package/mcp/tests/__init__.py +0 -0
- package/mcp/tests/test_lsp_proxy.py +377 -0
- package/memory/app_graph.py +153 -0
- package/memory/storage.py +6 -1
- package/memory/tests/test_app_graph.py +134 -0
- package/package.json +4 -3
- package/providers/claude.sh +115 -4
- package/providers/codex.sh +2 -2
- package/providers/loader.sh +4 -4
- package/providers/model_catalog.json +0 -9
- package/providers/models.sh +1 -2
- package/references/multi-provider.md +26 -35
- package/references/prompt-repetition.md +1 -1
- package/references/quality-control.md +1 -1
- package/skills/00-index.md +3 -3
- package/skills/model-selection.md +11 -14
- package/skills/providers.md +17 -57
- package/skills/quality-gates.md +2 -2
- package/skills/troubleshooting.md +1 -1
- package/src/integrations/github/action-handler.js +3 -2
- package/src/protocols/tools/start-project.js +1 -1
- 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,
|
|
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,
|
|
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 "
|
|
512
|
-
echo "
|
|
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
|
|
520
|
-
echo " loki start
|
|
521
|
-
echo " loki
|
|
522
|
-
echo " loki
|
|
523
|
-
echo " loki
|
|
524
|
-
echo " loki
|
|
525
|
-
echo " loki
|
|
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 "
|
|
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,
|
|
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,
|
|
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" != "
|
|
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|
|
|
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|
|
|
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
|
|
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|
|
|
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|
|
|
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
|
-
|
|
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,
|
|
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" "
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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
|
-
|
|
5946
|
-
|
|
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
|
|
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
|
|
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/
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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","
|
|
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|
|
|
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,
|
|
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','
|
|
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,
|
|
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/
|
|
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
|
;;
|