loki-mode 7.5.17 → 7.5.27
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 +675 -0
- package/autonomy/lib/voter-agents.sh +356 -0
- package/autonomy/loki +61 -96
- package/autonomy/run.sh +95 -186
- package/bin/loki +10 -0
- 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 +109 -108
- 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
|
@@ -479,7 +479,7 @@ show_help() {
|
|
|
479
479
|
echo " help Show this help"
|
|
480
480
|
echo ""
|
|
481
481
|
echo "Options for 'start':"
|
|
482
|
-
echo " --provider NAME AI provider: claude (default), codex,
|
|
482
|
+
echo " --provider NAME AI provider: claude (default), codex, cline, aider"
|
|
483
483
|
echo " --parallel Enable parallel mode with git worktrees"
|
|
484
484
|
echo " --bg, --background Run in background mode"
|
|
485
485
|
echo " --simple Force simple complexity tier (3 phases)"
|
|
@@ -497,7 +497,7 @@ show_help() {
|
|
|
497
497
|
echo " --dry-run Preview generated PRD without starting"
|
|
498
498
|
echo " --no-start Generate PRD but don't start execution"
|
|
499
499
|
echo " --output FILE Save PRD to custom path"
|
|
500
|
-
echo " --provider NAME AI provider: claude (default), codex,
|
|
500
|
+
echo " --provider NAME AI provider: claude (default), codex, cline, aider"
|
|
501
501
|
echo " --parallel Enable parallel mode with git worktrees"
|
|
502
502
|
echo " --budget USD Set cost budget limit"
|
|
503
503
|
echo ""
|
|
@@ -666,7 +666,7 @@ cmd_start() {
|
|
|
666
666
|
echo " --issue URL|NUM Force issue mode with URL or number"
|
|
667
667
|
echo ""
|
|
668
668
|
echo "Options:"
|
|
669
|
-
echo " --provider NAME AI provider: claude (default), codex,
|
|
669
|
+
echo " --provider NAME AI provider: claude (default), codex, cline, aider"
|
|
670
670
|
echo " --parallel Enable parallel mode with git worktrees"
|
|
671
671
|
echo " --bg, --background Run in background mode"
|
|
672
672
|
echo " --simple Force simple complexity tier (3 phases)"
|
|
@@ -733,7 +733,7 @@ cmd_start() {
|
|
|
733
733
|
args+=("--provider" "$provider")
|
|
734
734
|
shift 2
|
|
735
735
|
else
|
|
736
|
-
echo -e "${RED}--provider requires a value (claude, codex,
|
|
736
|
+
echo -e "${RED}--provider requires a value (claude, codex, cline, aider)${NC}"
|
|
737
737
|
exit 1
|
|
738
738
|
fi
|
|
739
739
|
;;
|
|
@@ -1446,7 +1446,7 @@ cmd_start() {
|
|
|
1446
1446
|
--action "provider_selection" \
|
|
1447
1447
|
--key "provider" \
|
|
1448
1448
|
--value "$provider" \
|
|
1449
|
-
--rejected '["'"$([ "$provider" != "claude" ] && echo "claude" || echo "codex")'", "'"$([ "$provider" != "
|
|
1449
|
+
--rejected '["'"$([ "$provider" != "claude" ] && echo "claude" || echo "codex")'", "'"$([ "$provider" != "cline" ] && echo "cline" || echo "aider")'"]' \
|
|
1450
1450
|
--confidence 0.95
|
|
1451
1451
|
fi
|
|
1452
1452
|
|
|
@@ -1467,7 +1467,6 @@ cmd_start() {
|
|
|
1467
1467
|
case "$effective_provider" in
|
|
1468
1468
|
claude) echo " npm install -g @anthropic-ai/claude-code" ;;
|
|
1469
1469
|
codex) echo " npm install -g @openai/codex" ;;
|
|
1470
|
-
gemini) echo " npm install -g @google/gemini-cli" ;;
|
|
1471
1470
|
cline) echo " npm install -g @anthropic-ai/cline" ;;
|
|
1472
1471
|
aider) echo " pip install aider-chat" ;;
|
|
1473
1472
|
*) echo " Check the provider documentation for installation." ;;
|
|
@@ -1485,6 +1484,18 @@ cmd_start() {
|
|
|
1485
1484
|
sleep 2
|
|
1486
1485
|
fi
|
|
1487
1486
|
|
|
1487
|
+
# Phase F (v7.5.23): cross-project context discovery. Walks ONE parent
|
|
1488
|
+
# level looking for sibling repos sharing a `.loki/app.json` marker.
|
|
1489
|
+
# Exports LOKI_PROJECT_GRAPH_{ROOT,APP_ID,MEMBERS} which survive exec
|
|
1490
|
+
# into run.sh. Silent no-op when no graph is found (backward compat).
|
|
1491
|
+
local _pg_helper="$SKILL_DIR/autonomy/lib/project-graph.sh"
|
|
1492
|
+
if [ -f "$_pg_helper" ]; then
|
|
1493
|
+
# shellcheck disable=SC1090
|
|
1494
|
+
. "$_pg_helper"
|
|
1495
|
+
local _pg_target="${LOKI_TARGET_DIR:-$(pwd)}"
|
|
1496
|
+
loki_project_graph_discover "$_pg_target" || true
|
|
1497
|
+
fi
|
|
1498
|
+
|
|
1488
1499
|
exec "$RUN_SH" "${args[@]}"
|
|
1489
1500
|
}
|
|
1490
1501
|
|
|
@@ -2044,7 +2055,7 @@ cmd_status() {
|
|
|
2044
2055
|
# Show provider with capability
|
|
2045
2056
|
local capability="full features"
|
|
2046
2057
|
case "$current_provider" in
|
|
2047
|
-
codex|
|
|
2058
|
+
codex|aider)
|
|
2048
2059
|
capability="degraded mode"
|
|
2049
2060
|
;;
|
|
2050
2061
|
cline)
|
|
@@ -2052,7 +2063,7 @@ cmd_status() {
|
|
|
2052
2063
|
;;
|
|
2053
2064
|
esac
|
|
2054
2065
|
echo -e "${CYAN}Provider:${NC} $current_provider ($capability)"
|
|
2055
|
-
echo -e "${DIM} Switch with: loki provider set <claude|codex|
|
|
2066
|
+
echo -e "${DIM} Switch with: loki provider set <claude|codex|cline|aider>${NC}"
|
|
2056
2067
|
echo ""
|
|
2057
2068
|
|
|
2058
2069
|
# Show running sessions (v6.4.0 - concurrent session support)
|
|
@@ -2709,7 +2720,7 @@ cmd_provider() {
|
|
|
2709
2720
|
echo " loki provider set claude"
|
|
2710
2721
|
echo " loki provider set codex"
|
|
2711
2722
|
echo " loki provider list"
|
|
2712
|
-
echo " loki provider info
|
|
2723
|
+
echo " loki provider info codex"
|
|
2713
2724
|
echo " loki provider models"
|
|
2714
2725
|
;;
|
|
2715
2726
|
esac
|
|
@@ -2737,7 +2748,7 @@ cmd_provider_show() {
|
|
|
2737
2748
|
cline)
|
|
2738
2749
|
echo -e "${GREEN}Status:${NC} Near-full mode (subagents, MCP, 12+ providers)"
|
|
2739
2750
|
;;
|
|
2740
|
-
codex|
|
|
2751
|
+
codex|aider)
|
|
2741
2752
|
echo -e "${YELLOW}Status:${NC} Degraded mode (sequential only)"
|
|
2742
2753
|
;;
|
|
2743
2754
|
esac
|
|
@@ -2758,17 +2769,22 @@ cmd_provider_set() {
|
|
|
2758
2769
|
|
|
2759
2770
|
if [ -z "$new_provider" ]; then
|
|
2760
2771
|
echo -e "${RED}Error: Provider name required${NC}"
|
|
2761
|
-
echo "Usage: loki provider set <claude|codex|
|
|
2772
|
+
echo "Usage: loki provider set <claude|codex|cline|aider>"
|
|
2762
2773
|
exit 1
|
|
2763
2774
|
fi
|
|
2764
2775
|
|
|
2765
2776
|
# Validate provider
|
|
2766
2777
|
case "$new_provider" in
|
|
2767
|
-
|
|
2778
|
+
gemini)
|
|
2779
|
+
echo -e "${RED}Error: Provider 'gemini' is deprecated as of v7.5.18 and has been removed.${NC}"
|
|
2780
|
+
echo "Active providers: claude, codex, cline, aider"
|
|
2781
|
+
exit 1
|
|
2782
|
+
;;
|
|
2783
|
+
claude|codex|cline|aider)
|
|
2768
2784
|
;;
|
|
2769
2785
|
*)
|
|
2770
2786
|
echo -e "${RED}Error: Invalid provider '$new_provider'${NC}"
|
|
2771
|
-
echo "Valid providers: claude, codex,
|
|
2787
|
+
echo "Valid providers: claude, codex, cline, aider"
|
|
2772
2788
|
exit 1
|
|
2773
2789
|
;;
|
|
2774
2790
|
esac
|
|
@@ -2784,9 +2800,6 @@ cmd_provider_set() {
|
|
|
2784
2800
|
codex)
|
|
2785
2801
|
echo "Install: npm install -g @openai/codex"
|
|
2786
2802
|
;;
|
|
2787
|
-
gemini)
|
|
2788
|
-
echo "Install: npm install -g @google/gemini-cli"
|
|
2789
|
-
;;
|
|
2790
2803
|
cline)
|
|
2791
2804
|
echo "Install: npm install -g cline"
|
|
2792
2805
|
;;
|
|
@@ -2821,7 +2834,6 @@ cmd_provider_list() {
|
|
|
2821
2834
|
# Check which CLIs are installed
|
|
2822
2835
|
local claude_status="${RED}not installed${NC}"
|
|
2823
2836
|
local codex_status="${RED}not installed${NC}"
|
|
2824
|
-
local gemini_status="${RED}not installed${NC}"
|
|
2825
2837
|
local cline_status="${RED}not installed${NC}"
|
|
2826
2838
|
local aider_status="${RED}not installed${NC}"
|
|
2827
2839
|
|
|
@@ -2831,9 +2843,6 @@ cmd_provider_list() {
|
|
|
2831
2843
|
if command -v codex &> /dev/null; then
|
|
2832
2844
|
codex_status="${GREEN}installed${NC}"
|
|
2833
2845
|
fi
|
|
2834
|
-
if command -v gemini &> /dev/null; then
|
|
2835
|
-
gemini_status="${GREEN}installed${NC}"
|
|
2836
|
-
fi
|
|
2837
2846
|
if command -v cline &> /dev/null; then
|
|
2838
2847
|
cline_status="${GREEN}installed${NC}"
|
|
2839
2848
|
fi
|
|
@@ -2850,10 +2859,6 @@ cmd_provider_list() {
|
|
|
2850
2859
|
[ "$current" = "codex" ] && marker=" ${CYAN}(current)${NC}"
|
|
2851
2860
|
echo -e " codex - Codex CLI (OpenAI) $codex_status$marker"
|
|
2852
2861
|
|
|
2853
|
-
marker=""
|
|
2854
|
-
[ "$current" = "gemini" ] && marker=" ${CYAN}(current)${NC}"
|
|
2855
|
-
echo -e " gemini - Gemini CLI (Google) $gemini_status$marker"
|
|
2856
|
-
|
|
2857
2862
|
marker=""
|
|
2858
2863
|
[ "$current" = "cline" ] && marker=" ${CYAN}(current)${NC}"
|
|
2859
2864
|
echo -e " cline - Cline (multi-provider) $cline_status$marker"
|
|
@@ -2899,18 +2904,6 @@ cmd_provider_info() {
|
|
|
2899
2904
|
echo ""
|
|
2900
2905
|
echo "Status: Degraded mode"
|
|
2901
2906
|
;;
|
|
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
2907
|
cline)
|
|
2915
2908
|
echo "Name: Cline CLI (Multi-Provider)"
|
|
2916
2909
|
echo "Vendor: Cline (supports 12+ providers)"
|
|
@@ -2954,7 +2947,7 @@ cmd_provider_models() {
|
|
|
2954
2947
|
echo -e "${BOLD}Model Configuration (resolved):${NC}"
|
|
2955
2948
|
echo ""
|
|
2956
2949
|
|
|
2957
|
-
local providers=("claude" "codex" "
|
|
2950
|
+
local providers=("claude" "codex" "cline" "aider")
|
|
2958
2951
|
for provider in "${providers[@]}"; do
|
|
2959
2952
|
local provider_file="$script_dir/providers/${provider}.sh"
|
|
2960
2953
|
[ -f "$provider_file" ] || continue
|
|
@@ -3002,7 +2995,7 @@ cmd_provider_models() {
|
|
|
3002
2995
|
fi
|
|
3003
2996
|
fi
|
|
3004
2997
|
else
|
|
3005
|
-
# Multi-tier providers (claude
|
|
2998
|
+
# Multi-tier providers (claude): check provider-specific per-tier, then generic
|
|
3006
2999
|
local provider_var="LOKI_${provider_upper}_MODEL_${tier_upper}"
|
|
3007
3000
|
local generic_var="LOKI_MODEL_${tier_upper}"
|
|
3008
3001
|
|
|
@@ -3034,14 +3027,6 @@ cmd_provider_models() {
|
|
|
3034
3027
|
effort_d=$(bash -c "source '$provider_file' 2>/dev/null; echo \$PROVIDER_EFFORT_DEVELOPMENT")
|
|
3035
3028
|
effort_f=$(bash -c "source '$provider_file' 2>/dev/null; echo \$PROVIDER_EFFORT_FAST")
|
|
3036
3029
|
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
3030
|
fi
|
|
3046
3031
|
echo ""
|
|
3047
3032
|
done
|
|
@@ -4533,7 +4518,7 @@ cmd_run() {
|
|
|
4533
4518
|
echo " --dry-run Preview generated PRD without starting"
|
|
4534
4519
|
echo " --no-start Generate PRD but don't start execution"
|
|
4535
4520
|
echo " --output FILE Save PRD to custom path"
|
|
4536
|
-
echo " --provider NAME AI provider: claude (default), codex,
|
|
4521
|
+
echo " --provider NAME AI provider: claude (default), codex, cline, aider"
|
|
4537
4522
|
echo " --parallel Enable parallel mode with git worktrees"
|
|
4538
4523
|
echo " --bg, --background Run in background mode"
|
|
4539
4524
|
echo " --simple Force simple complexity tier"
|
|
@@ -5021,7 +5006,7 @@ cmd_issue() {
|
|
|
5021
5006
|
echo " --output FILE Save PRD to custom path (default: .loki/prd-issue-N.md)"
|
|
5022
5007
|
echo ""
|
|
5023
5008
|
echo "Options passed to 'start' (when --start is used):"
|
|
5024
|
-
echo " --provider NAME AI provider: claude (default), codex,
|
|
5009
|
+
echo " --provider NAME AI provider: claude (default), codex, cline, aider"
|
|
5025
5010
|
echo " --parallel Enable parallel mode with git worktrees"
|
|
5026
5011
|
echo " --bg, --background Run in background mode"
|
|
5027
5012
|
echo ""
|
|
@@ -5883,7 +5868,7 @@ cmd_config() {
|
|
|
5883
5868
|
echo " model.planning Model for planning tier"
|
|
5884
5869
|
echo " model.development Model for development tier"
|
|
5885
5870
|
echo " model.fast Model for fast tier"
|
|
5886
|
-
echo " provider Default AI provider: claude, codex,
|
|
5871
|
+
echo " provider Default AI provider: claude, codex, cline, aider"
|
|
5887
5872
|
echo " issue.provider Default issue provider: github, gitlab, jira, azure_devops"
|
|
5888
5873
|
echo " blind_validation Blind validation mode: true, false (default: true)"
|
|
5889
5874
|
echo " adversarial_testing Adversarial testing: true, false (default: true)"
|
|
@@ -5942,8 +5927,12 @@ cmd_config_set() {
|
|
|
5942
5927
|
;;
|
|
5943
5928
|
provider)
|
|
5944
5929
|
case "$value" in
|
|
5945
|
-
|
|
5946
|
-
|
|
5930
|
+
gemini)
|
|
5931
|
+
echo -e "${RED}Invalid provider: 'gemini' is deprecated as of v7.5.18. Active providers: claude, codex, cline, aider${NC}"
|
|
5932
|
+
return 1
|
|
5933
|
+
;;
|
|
5934
|
+
claude|codex|cline|aider) ;;
|
|
5935
|
+
*) echo -e "${RED}Invalid provider: $value (expected: claude, codex, cline, aider)${NC}"; return 1 ;;
|
|
5947
5936
|
esac
|
|
5948
5937
|
;;
|
|
5949
5938
|
issue.provider)
|
|
@@ -6268,7 +6257,6 @@ cmd_setup_skill() {
|
|
|
6268
6257
|
local skill_targets=(
|
|
6269
6258
|
"$HOME/.claude/skills/loki-mode:Claude Code"
|
|
6270
6259
|
"$HOME/.codex/skills/loki-mode:Codex CLI"
|
|
6271
|
-
"$HOME/.gemini/skills/loki-mode:Gemini CLI"
|
|
6272
6260
|
"$HOME/.cline/skills/loki-mode:Cline CLI"
|
|
6273
6261
|
"$HOME/.aider/skills/loki-mode:Aider CLI"
|
|
6274
6262
|
)
|
|
@@ -6552,7 +6540,7 @@ cmd_doctor() {
|
|
|
6552
6540
|
echo " --json Output machine-readable JSON"
|
|
6553
6541
|
echo ""
|
|
6554
6542
|
echo "Checks: node, python3, jq, git, curl, bash version,"
|
|
6555
|
-
echo " claude/codex
|
|
6543
|
+
echo " claude/codex CLIs, and disk space."
|
|
6556
6544
|
return 0
|
|
6557
6545
|
;;
|
|
6558
6546
|
*)
|
|
@@ -6627,9 +6615,6 @@ cmd_doctor() {
|
|
|
6627
6615
|
codex)
|
|
6628
6616
|
version=$(codex --version 2>/dev/null | head -1 | sed 's/[^0-9.]//g' | head -1)
|
|
6629
6617
|
;;
|
|
6630
|
-
gemini)
|
|
6631
|
-
version=$(gemini --version 2>/dev/null | head -1 | sed 's/[^0-9.]//g' | head -1)
|
|
6632
|
-
;;
|
|
6633
6618
|
cline)
|
|
6634
6619
|
version=$(cline --version 2>/dev/null | head -1 | sed 's/[^0-9.]//g' | head -1)
|
|
6635
6620
|
;;
|
|
@@ -6680,13 +6665,12 @@ cmd_doctor() {
|
|
|
6680
6665
|
echo -e "${CYAN}AI Providers:${NC}"
|
|
6681
6666
|
doctor_check "Claude CLI" claude optional || true
|
|
6682
6667
|
doctor_check "Codex CLI" codex optional || true
|
|
6683
|
-
doctor_check "Gemini CLI" gemini optional || true
|
|
6684
6668
|
doctor_check "Cline CLI" cline optional || true
|
|
6685
6669
|
doctor_check "Aider CLI" aider optional || true
|
|
6686
6670
|
|
|
6687
6671
|
# Check if at least one provider is installed
|
|
6688
6672
|
local _any_provider=false
|
|
6689
|
-
for _dp in claude codex
|
|
6673
|
+
for _dp in claude codex cline aider; do
|
|
6690
6674
|
command -v "$_dp" &>/dev/null && _any_provider=true && break
|
|
6691
6675
|
done
|
|
6692
6676
|
if ! $_any_provider; then
|
|
@@ -6711,19 +6695,12 @@ cmd_doctor() {
|
|
|
6711
6695
|
elif command -v codex &>/dev/null; then
|
|
6712
6696
|
echo -e " ${DIM} -- ${NC} OPENAI_API_KEY not set (Codex CLI uses its own login)"
|
|
6713
6697
|
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
6698
|
echo ""
|
|
6721
6699
|
|
|
6722
6700
|
echo -e "${CYAN}Skills:${NC}"
|
|
6723
6701
|
local skill_dirs=(
|
|
6724
6702
|
"$HOME/.claude/skills/loki-mode:Claude Code"
|
|
6725
6703
|
"$HOME/.codex/skills/loki-mode:Codex CLI"
|
|
6726
|
-
"$HOME/.gemini/skills/loki-mode:Gemini CLI"
|
|
6727
6704
|
"$HOME/.cline/skills/loki-mode:Cline CLI"
|
|
6728
6705
|
"$HOME/.aider/skills/loki-mode:Aider CLI"
|
|
6729
6706
|
)
|
|
@@ -6952,7 +6929,6 @@ checks.append(check_tool('bash', 'bash', 'recommended', '4.0'))
|
|
|
6952
6929
|
checks.append(check_tool('Bun', 'bun', 'recommended', '1.3'))
|
|
6953
6930
|
checks.append(check_tool('Claude CLI', 'claude', 'optional'))
|
|
6954
6931
|
checks.append(check_tool('Codex CLI', 'codex', 'optional'))
|
|
6955
|
-
checks.append(check_tool('Gemini CLI', 'gemini', 'optional'))
|
|
6956
6932
|
checks.append(check_tool('Cline CLI', 'cline', 'optional'))
|
|
6957
6933
|
checks.append(check_tool('Aider CLI', 'aider', 'optional'))
|
|
6958
6934
|
|
|
@@ -8198,7 +8174,6 @@ QPRDEOF
|
|
|
8198
8174
|
case "$_quick_provider" in
|
|
8199
8175
|
claude) echo " npm install -g @anthropic-ai/claude-code" ;;
|
|
8200
8176
|
codex) echo " npm install -g @openai/codex" ;;
|
|
8201
|
-
gemini) echo " npm install -g @google/gemini-cli" ;;
|
|
8202
8177
|
cline) echo " npm install -g @anthropic-ai/cline" ;;
|
|
8203
8178
|
aider) echo " pip install aider-chat" ;;
|
|
8204
8179
|
*) echo " Check the provider documentation for installation." ;;
|
|
@@ -8443,7 +8418,7 @@ INSTRUCTIONS:
|
|
|
8443
8418
|
echo -e "${CYAN}[AI] Analyzing $svc_name failure with ${LOKI_PROVIDER:-claude}...${NC}"
|
|
8444
8419
|
|
|
8445
8420
|
# 4. LET AI FIX: Run loki quick with the AI prompt
|
|
8446
|
-
# The AI provider (claude/codex/
|
|
8421
|
+
# The AI provider (claude/codex/ollama) decides what to fix
|
|
8447
8422
|
fix_count=$((fix_count + 1))
|
|
8448
8423
|
echo -e "${CYAN}[FIX] Attempt $fix_count/$max_fixes${NC}"
|
|
8449
8424
|
|
|
@@ -8968,7 +8943,7 @@ ENDGITIGNORE
|
|
|
8968
8943
|
|
|
8969
8944
|
# Check if an AI provider CLI is available
|
|
8970
8945
|
local _has_provider=false
|
|
8971
|
-
for _pcli in claude codex
|
|
8946
|
+
for _pcli in claude codex cline aider; do
|
|
8972
8947
|
if command -v "$_pcli" &>/dev/null; then
|
|
8973
8948
|
_has_provider=true
|
|
8974
8949
|
break
|
|
@@ -8980,7 +8955,6 @@ ENDGITIGNORE
|
|
|
8980
8955
|
echo " Install at least one before running 'loki start':"
|
|
8981
8956
|
echo " npm install -g @anthropic-ai/claude-code (recommended)"
|
|
8982
8957
|
echo " npm install -g @openai/codex"
|
|
8983
|
-
echo " npm install -g @google/gemini-cli"
|
|
8984
8958
|
echo ""
|
|
8985
8959
|
echo " Then verify your setup: ${BOLD}loki doctor${NC}"
|
|
8986
8960
|
fi
|
|
@@ -9851,9 +9825,6 @@ except Exception: pass
|
|
|
9851
9825
|
codex)
|
|
9852
9826
|
(cd "$codebase_path" && codex exec --full-auto "$phase_prompt" 2>&1) || phase_exit=$?
|
|
9853
9827
|
;;
|
|
9854
|
-
gemini)
|
|
9855
|
-
(cd "$codebase_path" && gemini --approval-mode=yolo "$phase_prompt" 2>&1) || phase_exit=$?
|
|
9856
|
-
;;
|
|
9857
9828
|
cline)
|
|
9858
9829
|
(cd "$codebase_path" && cline -y "$phase_prompt" 2>&1) || phase_exit=$?
|
|
9859
9830
|
;;
|
|
@@ -9864,7 +9835,7 @@ except Exception: pass
|
|
|
9864
9835
|
(cd "$codebase_path" && aider --message "$phase_prompt" --yes-always --no-auto-commits --model "$aider_model" $aider_flags 2>&1) || phase_exit=$?
|
|
9865
9836
|
;;
|
|
9866
9837
|
*)
|
|
9867
|
-
echo -e "${RED}Error: Unknown provider '${provider_name}'. Supported: claude, codex,
|
|
9838
|
+
echo -e "${RED}Error: Unknown provider '${provider_name}'. Supported: claude, codex, cline, aider${NC}"
|
|
9868
9839
|
phase_exit=1
|
|
9869
9840
|
;;
|
|
9870
9841
|
esac
|
|
@@ -10021,9 +9992,6 @@ except Exception: pass
|
|
|
10021
9992
|
codex)
|
|
10022
9993
|
(cd "$codebase_path" && codex exec --full-auto "$doc_prompt" 2>&1) || doc_exit=$?
|
|
10023
9994
|
;;
|
|
10024
|
-
gemini)
|
|
10025
|
-
(cd "$codebase_path" && gemini --approval-mode=yolo "$doc_prompt" 2>&1) || doc_exit=$?
|
|
10026
|
-
;;
|
|
10027
9995
|
cline)
|
|
10028
9996
|
(cd "$codebase_path" && cline -y "$doc_prompt" 2>&1) || doc_exit=$?
|
|
10029
9997
|
;;
|
|
@@ -10531,9 +10499,6 @@ except Exception: pass
|
|
|
10531
10499
|
codex)
|
|
10532
10500
|
(cd "$codebase_path" && codex exec --full-auto "$heal_prompt" 2>&1) || heal_exit=$?
|
|
10533
10501
|
;;
|
|
10534
|
-
gemini)
|
|
10535
|
-
(cd "$codebase_path" && gemini --approval-mode=yolo "$heal_prompt" 2>&1) || heal_exit=$?
|
|
10536
|
-
;;
|
|
10537
10502
|
cline)
|
|
10538
10503
|
(cd "$codebase_path" && cline -y "$heal_prompt" 2>&1) || heal_exit=$?
|
|
10539
10504
|
;;
|
|
@@ -10546,7 +10511,7 @@ except Exception: pass
|
|
|
10546
10511
|
# BUG-HEAL-003: Unknown provider should error, not silently succeed
|
|
10547
10512
|
*)
|
|
10548
10513
|
echo -e "${RED}Error: Unknown provider: $provider${NC}"
|
|
10549
|
-
echo "Supported providers: claude, codex,
|
|
10514
|
+
echo "Supported providers: claude, codex, cline, aider"
|
|
10550
10515
|
return 1
|
|
10551
10516
|
;;
|
|
10552
10517
|
esac
|
|
@@ -11312,12 +11277,12 @@ PYEOF
|
|
|
11312
11277
|
mkdir -p "$loki_dir/state"
|
|
11313
11278
|
local current_provider
|
|
11314
11279
|
current_provider=$(cat "$loki_dir/state/provider" 2>/dev/null || echo "claude")
|
|
11315
|
-
local chain="${LOKI_FAILOVER_CHAIN:-claude,codex,
|
|
11280
|
+
local chain="${LOKI_FAILOVER_CHAIN:-claude,codex,cline}"
|
|
11316
11281
|
|
|
11317
11282
|
cat > "$failover_file" << FEOF
|
|
11318
11283
|
{
|
|
11319
11284
|
"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","
|
|
11285
|
+
"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
11286
|
"currentProvider": "$current_provider",
|
|
11322
11287
|
"primaryProvider": "$current_provider",
|
|
11323
11288
|
"lastFailover": null,
|
|
@@ -11355,7 +11320,7 @@ with open('$failover_file', 'w') as f: json.dump(d, f, indent=2)
|
|
|
11355
11320
|
local IFS=','
|
|
11356
11321
|
for p in $new_chain; do
|
|
11357
11322
|
case "$p" in
|
|
11358
|
-
claude|codex|
|
|
11323
|
+
claude|codex|cline|aider) ;;
|
|
11359
11324
|
*) echo -e "${RED}Error: invalid provider '$p' in chain${NC}"; return 1 ;;
|
|
11360
11325
|
esac
|
|
11361
11326
|
done
|
|
@@ -11383,9 +11348,9 @@ with open('$failover_file', 'w') as f: json.dump(d, f, indent=2)
|
|
|
11383
11348
|
source "$script_dir/../providers/loader.sh"
|
|
11384
11349
|
fi
|
|
11385
11350
|
|
|
11386
|
-
local chain_providers="claude,codex,
|
|
11351
|
+
local chain_providers="claude,codex,cline"
|
|
11387
11352
|
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','
|
|
11353
|
+
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
11354
|
fi
|
|
11390
11355
|
|
|
11391
11356
|
local IFS=','
|
|
@@ -11411,7 +11376,6 @@ with open('$failover_file', 'w') as f: json.dump(d, f, indent=2)
|
|
|
11411
11376
|
case "$p" in
|
|
11412
11377
|
claude) [ -n "${ANTHROPIC_API_KEY:-}" ] && has_key=true ;;
|
|
11413
11378
|
codex) [ -n "${OPENAI_API_KEY:-}" ] && has_key=true ;;
|
|
11414
|
-
gemini) [ -n "${GOOGLE_API_KEY:-${GEMINI_API_KEY:-}}" ] && has_key=true ;;
|
|
11415
11379
|
cline|aider) has_key=true ;; # Key check varies
|
|
11416
11380
|
esac
|
|
11417
11381
|
|
|
@@ -11452,7 +11416,7 @@ with open('$failover_file', 'w') as f: json.dump(d, f, indent=2)
|
|
|
11452
11416
|
echo " (no args) Show failover status and health"
|
|
11453
11417
|
echo " --enable Enable auto-failover"
|
|
11454
11418
|
echo " --disable Disable auto-failover"
|
|
11455
|
-
echo " --chain X,Y,Z Set failover chain (e.g., claude,codex,
|
|
11419
|
+
echo " --chain X,Y,Z Set failover chain (e.g., claude,codex,cline)"
|
|
11456
11420
|
echo " --test Test all providers in chain"
|
|
11457
11421
|
echo " --reset Reset failover state to defaults"
|
|
11458
11422
|
echo " --help, -h Show this help"
|
|
@@ -11816,7 +11780,7 @@ if integration_count > 3 or complexity in ('complex', 'enterprise'):
|
|
|
11816
11780
|
recommended_provider = 'Claude'
|
|
11817
11781
|
provider_reason = 'Full feature support needed (subagents, parallel, MCP)'
|
|
11818
11782
|
elif complexity == 'simple' and endpoint_count == 0:
|
|
11819
|
-
recommended_provider = 'Any (Claude/Codex/
|
|
11783
|
+
recommended_provider = 'Any (Claude/Codex/Cline)'
|
|
11820
11784
|
provider_reason = 'Simple project works with all providers'
|
|
11821
11785
|
else:
|
|
11822
11786
|
recommended_provider = 'Claude'
|
|
@@ -12083,6 +12047,14 @@ maybe_show_auto_plan() {
|
|
|
12083
12047
|
|
|
12084
12048
|
# Main command dispatcher
|
|
12085
12049
|
main() {
|
|
12050
|
+
# v7.5.18: early guard -- LOKI_PROVIDER=gemini is no longer supported.
|
|
12051
|
+
if [ "${LOKI_PROVIDER:-}" = "gemini" ]; then
|
|
12052
|
+
echo -e "${RED}Error: Provider 'gemini' is deprecated as of v7.5.18 and has been removed.${NC}" >&2
|
|
12053
|
+
echo "Active providers: claude, codex, cline, aider" >&2
|
|
12054
|
+
echo "Unset LOKI_PROVIDER or use: LOKI_PROVIDER=claude" >&2
|
|
12055
|
+
exit 1
|
|
12056
|
+
fi
|
|
12057
|
+
|
|
12086
12058
|
if [ $# -eq 0 ]; then
|
|
12087
12059
|
show_help
|
|
12088
12060
|
exit 0
|
|
@@ -17871,9 +17843,6 @@ USER TASK: ${prompt}"
|
|
|
17871
17843
|
codex)
|
|
17872
17844
|
codex exec --full-auto "$full_prompt" 2>&1 || agent_exit=$?
|
|
17873
17845
|
;;
|
|
17874
|
-
gemini)
|
|
17875
|
-
gemini --approval-mode=yolo "$full_prompt" 2>&1 || agent_exit=$?
|
|
17876
|
-
;;
|
|
17877
17846
|
cline)
|
|
17878
17847
|
cline -y "$full_prompt" 2>&1 || agent_exit=$?
|
|
17879
17848
|
;;
|
|
@@ -17982,7 +17951,6 @@ $diff"
|
|
|
17982
17951
|
case "$provider" in
|
|
17983
17952
|
claude) claude -p "$review_prompt" 2>&1 ;;
|
|
17984
17953
|
codex) codex exec --full-auto "$review_prompt" 2>&1 ;;
|
|
17985
|
-
gemini) gemini --approval-mode=yolo "$review_prompt" 2>&1 ;;
|
|
17986
17954
|
cline) cline -y "$review_prompt" 2>&1 ;;
|
|
17987
17955
|
*) echo -e "${RED}Unknown provider: $provider${NC}"; return 1 ;;
|
|
17988
17956
|
esac
|
|
@@ -19575,9 +19543,6 @@ _docs_invoke_provider() {
|
|
|
19575
19543
|
codex)
|
|
19576
19544
|
result=$($t_prefix codex exec --full-auto "$prompt" 2>/dev/null) || exit_code=$?
|
|
19577
19545
|
;;
|
|
19578
|
-
gemini)
|
|
19579
|
-
result=$($t_prefix gemini --approval-mode=yolo "$prompt" 2>/dev/null) || exit_code=$?
|
|
19580
|
-
;;
|
|
19581
19546
|
cline)
|
|
19582
19547
|
result=$($t_prefix cline -y "$prompt" 2>/dev/null) || exit_code=$?
|
|
19583
19548
|
;;
|