Merge pull request 'fix(kugetsu): add fix_session_permissions command for cmd_doctor' (#93) from fix/issue-36-permissions-v2 into main

This commit was merged in pull request #93.
This commit is contained in:
2026-04-02 04:37:39 +02:00
2 changed files with 104 additions and 0 deletions

View File

@@ -697,12 +697,16 @@ cmd_env() {
cmd_doctor() {
local fix=false
local fix_permissions=false
while [ $# -gt 0 ]; do
case "$1" in
--fix)
fix=true
;;
--fix-permissions)
fix_permissions=true
;;
*)
;;
esac
@@ -800,6 +804,52 @@ cmd_doctor() {
fi
fi
fi
if [ "$fix_permissions" = true ]; then
echo ""
echo "Fixing session permissions..."
fix_session_permissions
fi
}
fix_session_permissions() {
local opencode_db="${OPENCODE_DB:-$HOME/.opencode/opencode.db}"
if [ ! -f "$opencode_db" ]; then
echo "[ERROR] opencode database not found: $opencode_db"
return 1
fi
local base_session_id=$(get_base_session_id)
local pm_agent_session_id=$(get_pm_agent_session_id)
local PERMISSION_JSON='[{"permission":"question","pattern":"*","action":"deny"},{"permission":"plan_enter","pattern":"*","action":"deny"},{"permission":"plan_exit","pattern":"*","action":"deny"},{"permission":"external_directory","pattern":"*","action":"allow"}]'
if [ -n "$base_session_id" ] && [ "$base_session_id" != "null" ]; then
echo "Updating base session permissions: $base_session_id"
python3 -c "
import sqlite3
conn = sqlite3.connect('$opencode_db')
cursor = conn.cursor()
cursor.execute(\"UPDATE session SET permission = ? WHERE id = ?\", ('$PERMISSION_JSON', '$base_session_id'))
conn.commit()
print('[OK] Base session permissions updated')
"
fi
if [ -n "$pm_agent_session_id" ] && [ "$pm_agent_session_id" != "null" ] && [ "$pm_agent_session_id" != "None" ]; then
echo "Updating PM agent session permissions: $pm_agent_session_id"
python3 -c "
import sqlite3
conn = sqlite3.connect('$opencode_db')
cursor = conn.cursor()
cursor.execute(\"UPDATE session SET permission = ? WHERE id = ?\", ('$PERMISSION_JSON', '$pm_agent_session_id'))
conn.commit()
print('[OK] PM agent session permissions updated')
"
fi
echo "Session permissions fix complete"
}
DEBUG_MODE=false
@@ -1054,6 +1104,8 @@ EOF
echo "Initialization complete!"
echo "- Base session: $new_session_id"
echo "- PM agent: ${new_pm_session_id:-created by hermes}"
fix_session_permissions
}
cmd_start() {

View File

@@ -646,6 +646,58 @@ echo ""
# Cleanup env files
rm -rf ~/.kugetsu/env 2>/dev/null || true
# Test E7: fix_session_permissions function exists
echo "--- Test: fix_session_permissions function exists ---"
if grep -q "fix_session_permissions()" "$KUGETSU"; then
pass "fix_session_permissions function exists"
else
fail "fix_session_permissions function not found"
fi
echo ""
# Test E8: cmd_doctor --fix-permissions flag is recognized
echo "--- Test: cmd_doctor --fix-permissions flag ---"
OUTPUT=$($KUGETSU doctor --fix-permissions 2>&1 || true)
if echo "$OUTPUT" | grep -q -E "(Fixing session permissions|Session permissions fix complete|opencode database not found)"; then
pass "cmd_doctor --fix-permissions flag is recognized"
else
fail "cmd_doctor --fix-permissions not recognized: $OUTPUT"
fi
echo ""
# Test E9: fix_session_permissions has valid permission JSON
echo "--- Test: fix_session_permissions has valid permission JSON ---"
PERMISSION_JSON='[{"permission":"question","pattern":"*","action":"deny"},{"permission":"plan_enter","pattern":"*","action":"deny"},{"permission":"plan_exit","pattern":"*","action":"deny"},{"permission":"external_directory","pattern":"*","action":"allow"}]'
if python3 -c "import json; json.loads('$PERMISSION_JSON')" 2>/dev/null; then
pass "fix_session_permissions has valid permission JSON"
else
fail "fix_session_permissions permission JSON is invalid"
fi
echo ""
# Test E10: fix_session_permissions SQL UPDATE syntax is valid
echo "--- Test: fix_session_permissions SQL UPDATE syntax ---"
if python3 -c "
import sqlite3
conn = sqlite3.connect(':memory:')
cursor = conn.cursor()
cursor.execute('CREATE TABLE session (id TEXT, permission TEXT)')
cursor.execute('INSERT INTO session (id, permission) VALUES (?, ?)', ('test_id', 'original'))
cursor.execute('UPDATE session SET permission = ? WHERE id = ?', ('$PERMISSION_JSON', 'test_id'))
conn.commit()
cursor.execute('SELECT permission FROM session WHERE id = ?', ('test_id',))
result = cursor.fetchone()
if result and 'external_directory' in result[0]:
print('OK')
else:
print('FAIL')
" 2>/dev/null | grep -q OK; then
pass "fix_session_permissions SQL UPDATE syntax is valid"
else
fail "fix_session_permissions SQL UPDATE syntax failed"
fi
echo ""
# Cleanup
cleanup