fix(kugetsu): add fix_session_permissions command for cmd_doctor #93
@@ -695,12 +695,16 @@ cmd_env() {
|
|||||||
|
|
||||||
cmd_doctor() {
|
cmd_doctor() {
|
||||||
local fix=false
|
local fix=false
|
||||||
|
local fix_permissions=false
|
||||||
|
|
||||||
while [ $# -gt 0 ]; do
|
while [ $# -gt 0 ]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
--fix)
|
--fix)
|
||||||
fix=true
|
fix=true
|
||||||
;;
|
;;
|
||||||
|
--fix-permissions)
|
||||||
|
fix_permissions=true
|
||||||
|
;;
|
||||||
*)
|
*)
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
@@ -798,6 +802,52 @@ cmd_doctor() {
|
|||||||
fi
|
fi
|
||||||
fi
|
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
|
DEBUG_MODE=false
|
||||||
@@ -1052,6 +1102,8 @@ EOF
|
|||||||
echo "Initialization complete!"
|
echo "Initialization complete!"
|
||||||
echo "- Base session: $new_session_id"
|
echo "- Base session: $new_session_id"
|
||||||
echo "- PM agent: ${new_pm_session_id:-created by hermes}"
|
echo "- PM agent: ${new_pm_session_id:-created by hermes}"
|
||||||
|
|
||||||
|
fix_session_permissions
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd_start() {
|
cmd_start() {
|
||||||
|
|||||||
@@ -637,6 +637,58 @@ echo ""
|
|||||||
# Cleanup env files
|
# Cleanup env files
|
||||||
rm -rf ~/.kugetsu/env 2>/dev/null || true
|
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
|
||||||
cleanup
|
cleanup
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user