chore: import upstream snapshot with attribution
CI: cua-driver distro-compat matrix / debian:12 (glibc 2.36) (push) Has been cancelled
CI: SPDX Headers / Check SPDX headers (warn-only) (push) Has been cancelled
CD: Docs MCP Server / build (linux/amd64) (push) Has been cancelled
CD: Docs MCP Server / build (linux/arm64) (push) Has been cancelled
CD: Docs MCP Server / merge (push) Has been cancelled
CI: cua-driver distro-compat matrix / Resolve release version (push) Has been cancelled
CI: cua-driver distro-compat matrix / fedora:41 (glibc 2.40) (push) Has been cancelled
CI: cua-driver distro-compat matrix / rockylinux:9 (glibc 2.34) (push) Has been cancelled
CI: cua-driver distro-compat matrix / ubuntu:22.04 (glibc 2.35) (push) Has been cancelled
CI: cua-driver distro-compat matrix / ubuntu:24.04 (glibc 2.39) (push) Has been cancelled
CI: cua-driver distro-compat matrix / Distro compat summary (push) Has been cancelled
CI: Rust Linux unit / Rust Linux unit and compile (push) Has been cancelled
CI: Rust Windows unit / Rust Windows unit and compile (push) Has been cancelled
CI: Nix Linux Rust source / Nix / compositor build (push) Has been cancelled
CI: Nix Linux Rust source / Nix / driver package (push) Has been cancelled
CI: Nix Linux Rust source / Nix / Rust unit tests (push) Has been cancelled
CI: cua-driver distro-compat matrix / debian:12 (glibc 2.36) (push) Has been cancelled
CI: SPDX Headers / Check SPDX headers (warn-only) (push) Has been cancelled
CD: Docs MCP Server / build (linux/amd64) (push) Has been cancelled
CD: Docs MCP Server / build (linux/arm64) (push) Has been cancelled
CD: Docs MCP Server / merge (push) Has been cancelled
CI: cua-driver distro-compat matrix / Resolve release version (push) Has been cancelled
CI: cua-driver distro-compat matrix / fedora:41 (glibc 2.40) (push) Has been cancelled
CI: cua-driver distro-compat matrix / rockylinux:9 (glibc 2.34) (push) Has been cancelled
CI: cua-driver distro-compat matrix / ubuntu:22.04 (glibc 2.35) (push) Has been cancelled
CI: cua-driver distro-compat matrix / ubuntu:24.04 (glibc 2.39) (push) Has been cancelled
CI: cua-driver distro-compat matrix / Distro compat summary (push) Has been cancelled
CI: Rust Linux unit / Rust Linux unit and compile (push) Has been cancelled
CI: Rust Windows unit / Rust Windows unit and compile (push) Has been cancelled
CI: Nix Linux Rust source / Nix / compositor build (push) Has been cancelled
CI: Nix Linux Rust source / Nix / driver package (push) Has been cancelled
CI: Nix Linux Rust source / Nix / Rust unit tests (push) Has been cancelled
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Find the SQLite binary
|
||||
BINARY_PATH=$(which sqlite3)
|
||||
BINARY_NAME=$(basename "$BINARY_PATH")
|
||||
|
||||
# Get the version
|
||||
VERSION_OUTPUT=$(sqlite3 --version 2>&1)
|
||||
VERSION=$(echo "$VERSION_OUTPUT" | awk '{print $1}' | sed 's/^[^0-9]*//')
|
||||
# Validate version format - if invalid format, extract what we can
|
||||
if ! [[ "$VERSION" =~ ^[0-9]+\.[0-9]+ ]]; then
|
||||
VERSION=$(echo "$VERSION_OUTPUT" | grep -oE '^[0-9]+\.[0-9]+' | head -n1)
|
||||
fi
|
||||
|
||||
# Extract display_name from .desktop file or use package metadata
|
||||
DISPLAY_NAME=""
|
||||
DESKTOP_FILE=""
|
||||
ICON_FROM_DESKTOP=""
|
||||
|
||||
# Find .desktop file in package contents
|
||||
DESKTOP_FILE=$(dpkg -L sqlite3 2>/dev/null | grep '\.desktop$' | head -n1)
|
||||
if [ -n "$DESKTOP_FILE" ] && [ -f "$DESKTOP_FILE" ]; then
|
||||
# Extract display name from .desktop file
|
||||
DISPLAY_NAME=$(grep "^Name=" "$DESKTOP_FILE" | head -n1 | cut -d'=' -f2- | head -c 100)
|
||||
# Extract icon reference from .desktop file
|
||||
ICON_FROM_DESKTOP=$(grep "^Icon=" "$DESKTOP_FILE" | head -n1 | cut -d'=' -f2-)
|
||||
fi
|
||||
|
||||
# If no display name found, try package description
|
||||
if [ -z "$DISPLAY_NAME" ]; then
|
||||
DISPLAY_NAME=$(dpkg -s sqlite3 2>/dev/null | grep "^Description:" | cut -d' ' -f2-)
|
||||
fi
|
||||
|
||||
# Find icon files
|
||||
ICON_PATHS=()
|
||||
|
||||
# If we have an icon reference from .desktop file, resolve it using icon theme
|
||||
if [ -n "$ICON_FROM_DESKTOP" ]; then
|
||||
# Use find to search for icon files matching the icon name
|
||||
for ext in .png .svg .ico .jpg; do
|
||||
while IFS= read -r file; do
|
||||
if [ -f "$file" ]; then
|
||||
ICON_PATHS+=("$file")
|
||||
fi
|
||||
done < <(find /usr/share/icons /usr/share/pixmaps -name "*$ICON_FROM_DESKTOP*$ext" -type f 2>/dev/null | head -n 5)
|
||||
done
|
||||
fi
|
||||
|
||||
# Search for sqlite-specific icons in system icon directories
|
||||
for search_term in "sqlite" "database" "sql"; do
|
||||
for ext in .png .svg .ico .jpg; do
|
||||
while IFS= read -r file; do
|
||||
if [ -f "$file" ]; then
|
||||
ICON_PATHS+=("$file")
|
||||
fi
|
||||
done < <(find /usr/share/icons /usr/share/pixmaps -iname "*${search_term}*${ext}" -type f 2>/dev/null | head -n 3)
|
||||
done
|
||||
done
|
||||
|
||||
# Remove duplicates, sort, and limit to reasonable number
|
||||
ICON_PATHS=($(printf '%s\n' "${ICON_PATHS[@]}" | sort -u | head -n 20))
|
||||
|
||||
# Build icon path array JSON
|
||||
ICON_JSON="["
|
||||
for i in "${!ICON_PATHS[@]}"; do
|
||||
if [ $i -gt 0 ]; then
|
||||
ICON_JSON="$ICON_JSON,"
|
||||
fi
|
||||
# Escape backslashes and quotes
|
||||
ESCAPED_PATH="${ICON_PATHS[$i]//\\/\\\\}"
|
||||
ESCAPED_PATH="${ESCAPED_PATH//\"/\\\"}"
|
||||
ICON_JSON="$ICON_JSON\"$ESCAPED_PATH\""
|
||||
done
|
||||
ICON_JSON="$ICON_JSON]"
|
||||
|
||||
# Create the metadata JSON object
|
||||
cat <<EOF
|
||||
{
|
||||
"binary_path": "$BINARY_PATH",
|
||||
"binary_name": "$BINARY_NAME",
|
||||
"display_name": "$DISPLAY_NAME",
|
||||
"desktop_entry": $( [ -n "$DESKTOP_FILE" ] && [ -f "$DESKTOP_FILE" ] && echo \"\"$DESKTOP_FILE\"\" || echo null ),
|
||||
"icon_paths": $ICON_JSON,
|
||||
"version": "$VERSION"
|
||||
}
|
||||
EOF
|
||||
@@ -0,0 +1,14 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
# Update package lists
|
||||
sudo apt-get update
|
||||
|
||||
# Install SQLite3 command-line tool and development libraries
|
||||
sudo apt-get install -y sqlite3
|
||||
|
||||
# Verify installation
|
||||
which sqlite3
|
||||
sqlite3 --version
|
||||
|
||||
echo "SQLite installation complete!"
|
||||
@@ -0,0 +1,52 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Create a demo database file
|
||||
mkdir -p ~/.sqlite3
|
||||
DB_FILE="$HOME/.sqlite3/demo.db"
|
||||
|
||||
# Create and populate a demo database
|
||||
sqlite3 "$DB_FILE" <<'EOF'
|
||||
-- Create a sample table
|
||||
CREATE TABLE IF NOT EXISTS employees (
|
||||
id INTEGER PRIMARY KEY,
|
||||
name TEXT NOT NULL,
|
||||
department TEXT NOT NULL,
|
||||
salary REAL NOT NULL
|
||||
);
|
||||
|
||||
-- Insert sample data
|
||||
INSERT OR IGNORE INTO employees (id, name, department, salary) VALUES
|
||||
(1, 'Alice Johnson', 'Engineering', 95000),
|
||||
(2, 'Bob Smith', 'Sales', 75000),
|
||||
(3, 'Carol White', 'Marketing', 80000),
|
||||
(4, 'David Brown', 'Engineering', 92000);
|
||||
|
||||
-- Display the data
|
||||
SELECT 'Database Contents:' as info;
|
||||
SELECT '==================' as separator;
|
||||
SELECT printf('%-5s %-15s %-15s %10s', 'ID', 'Name', 'Department', 'Salary') as header;
|
||||
SELECT '==================' as separator;
|
||||
SELECT printf('%-5d %-15s %-15s %10.0f', id, name, department, salary) FROM employees;
|
||||
SELECT '' as blank;
|
||||
SELECT 'Database Information:' as info;
|
||||
SELECT '==================' as separator;
|
||||
SELECT 'Total Employees: ' || COUNT(*) FROM employees;
|
||||
SELECT 'SQLite Version: ' || sqlite_version() AS version;
|
||||
EOF
|
||||
|
||||
# Create a shell script that will be executed in the terminal
|
||||
cat > ~/.sqlite3/interactive.sh << 'SHELL_EOF'
|
||||
#!/bin/bash
|
||||
echo "=== SQLite Interactive Database Shell ==="
|
||||
echo "Type '.help' for help, '.quit' to exit"
|
||||
echo "Database file: $HOME/.sqlite3/demo.db"
|
||||
echo ""
|
||||
sqlite3 "$HOME/.sqlite3/demo.db"
|
||||
SHELL_EOF
|
||||
chmod +x ~/.sqlite3/interactive.sh
|
||||
|
||||
# Launch in xfce4-terminal and keep it open
|
||||
xfce4-terminal --title="SQLite Database Shell" --command="bash -c '~/.sqlite3/interactive.sh'" &
|
||||
|
||||
# Wait for terminal to start
|
||||
sleep 3
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 944 B |
Binary file not shown.
|
After Width: | Height: | Size: 1.2 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 2.7 KiB |
+88
@@ -0,0 +1,88 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg id="svg2476" width="48" height="48" version="1.0" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<defs id="defs2478">
|
||||
<linearGradient id="linearGradient2507" x1="302.86" x2="302.86" y1="366.65" y2="609.51" gradientTransform="matrix(.067325 0 0 .0147 -.34114 37.04)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop5050" style="stop-opacity:0" offset="0"/>
|
||||
<stop id="stop5056" offset=".5"/>
|
||||
<stop id="stop5052" style="stop-opacity:0" offset="1"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="radialGradient2504" cx="605.71" cy="486.65" r="117.14" gradientTransform="matrix(-.02304 0 0 .0147 21.623 37.04)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient5060"/>
|
||||
<linearGradient id="linearGradient5060">
|
||||
<stop id="stop5062" offset="0"/>
|
||||
<stop id="stop5064" style="stop-opacity:0" offset="1"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="radialGradient2501" cx="605.71" cy="486.65" r="117.14" gradientTransform="matrix(.02304 0 0 .0147 26.361 37.04)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient5060"/>
|
||||
<linearGradient id="linearGradient2498" x1="-51.786" x2="-51.786" y1="50.786" y2="2.9062" gradientTransform="matrix(.8075 0 0 .89483 59.41 -2.9806)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop3106" style="stop-color:#aaa" offset="0"/>
|
||||
<stop id="stop3108" style="stop-color:#c8c8c8" offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient2496" x1="25.132" x2="25.132" y1=".98521" y2="47.013" gradientTransform="matrix(1 0 0 .95617 -1.0065e-7 -1.9149)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop3602" style="stop-color:#f4f4f4" offset="0"/>
|
||||
<stop id="stop3604" style="stop-color:#dbdbdb" offset="1"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="radialGradient2493" cx="102" cy="112.3" r="139.56" gradientTransform="matrix(.3617 0 0 -.39078 .85106 47.517)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop41" style="stop-color:#b7b8b9" offset="0"/>
|
||||
<stop id="stop47" style="stop-color:#ececec" offset=".18851"/>
|
||||
<stop id="stop49" style="stop-color:#fafafa;stop-opacity:0" offset=".25718"/>
|
||||
<stop id="stop51" style="stop-color:#fff;stop-opacity:0" offset=".30111"/>
|
||||
<stop id="stop53" style="stop-color:#fafafa;stop-opacity:0" offset=".5313"/>
|
||||
<stop id="stop55" style="stop-color:#ebecec;stop-opacity:0" offset=".8449"/>
|
||||
<stop id="stop57" style="stop-color:#e1e2e3;stop-opacity:0" offset="1"/>
|
||||
</radialGradient>
|
||||
<radialGradient id="radialGradient2490" cx="23.335" cy="41.636" r="22.627" gradientTransform="matrix(.57452 0 0 .22094 10.594 23.801)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop23421" offset="0"/>
|
||||
<stop id="stop23423" style="stop-opacity:0" offset="1"/>
|
||||
</radialGradient>
|
||||
<linearGradient id="linearGradient2487" x1="24" x2="24" y1="2" y2="46.017" gradientTransform="matrix(1 0 0 .97778 0 -.96667)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop3213" style="stop-color:#fff" offset="0"/>
|
||||
<stop id="stop3215" style="stop-color:#fff;stop-opacity:0" offset="1"/>
|
||||
</linearGradient>
|
||||
<filter id="filter3212" x="-.14846" y="-.16434" width="1.2969" height="1.3287" color-interpolation-filters="sRGB">
|
||||
<feGaussianBlur id="feGaussianBlur3214" stdDeviation="0.77391625"/>
|
||||
</filter>
|
||||
<linearGradient id="linearGradient2483" x1="32.892" x2="36.358" y1="8.059" y2="5.4565" gradientTransform="matrix(.9977 0 0 1.0407 .1638 -1.1058)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop8591" style="stop-color:#fefefe" offset="0"/>
|
||||
<stop id="stop8593" style="stop-color:#cbcbcb" offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient2479" x1="89.018" x2="89.018" y1="22.537" y2="27.546" gradientTransform="translate(-70.157 8.4539)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient3858"/>
|
||||
<linearGradient id="linearGradient2477" x1="103.95" x2="89.424" y1="-7.6657" y2="-7.6657" gradientTransform="matrix(.45783 0 0 .43229 -23.592 36.912)" gradientUnits="userSpaceOnUse" spreadMethod="reflect" xlink:href="#linearGradient2793"/>
|
||||
<linearGradient id="linearGradient2473" x1="89.018" x2="89.018" y1="22.537" y2="27.546" gradientTransform="translate(-70.157 2.4539)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient3858"/>
|
||||
<linearGradient id="linearGradient2471" x1="103.95" x2="89.424" y1="-7.6657" y2="-7.6657" gradientTransform="matrix(.45783 0 0 .43229 -23.592 30.912)" gradientUnits="userSpaceOnUse" spreadMethod="reflect" xlink:href="#linearGradient2793"/>
|
||||
<linearGradient id="linearGradient3858">
|
||||
<stop id="stop3860" style="stop-color:#a0a0a0" offset="0"/>
|
||||
<stop id="stop3862" style="stop-color:#4a4a4a" offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient2466" x1="89.018" x2="89.018" y1="22.537" y2="27.546" gradientTransform="translate(-70.157 -3.5461)" gradientUnits="userSpaceOnUse" xlink:href="#linearGradient3858"/>
|
||||
<linearGradient id="linearGradient2793">
|
||||
<stop id="stop2795" style="stop-color:#868688" offset="0"/>
|
||||
<stop id="stop2797" style="stop-color:#d9d9da" offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient2463" x1="103.95" x2="89.424" y1="-7.6657" y2="-7.6657" gradientTransform="matrix(.45783 0 0 .43229 -23.592 24.912)" gradientUnits="userSpaceOnUse" spreadMethod="reflect" xlink:href="#linearGradient2793"/>
|
||||
<linearGradient id="linearGradient2460" x1="109.96" x2="109.96" y1="-24.911" y2="-2.3758" gradientTransform="matrix(.45813 0 0 .43889 -23.62 20.933)" gradientUnits="userSpaceOnUse">
|
||||
<stop id="stop2511" style="stop-color:#b3b3b3" offset="0"/>
|
||||
<stop id="stop2513" style="stop-color:#dadada" offset="1"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linearGradient2458" x1="102.31" x2="102.31" y1="-2.3925" y2="-24.582" gradientTransform="matrix(.45813 0 0 .43889 -23.62 20.933)" gradientUnits="userSpaceOnUse" spreadMethod="reflect">
|
||||
<stop id="stop3846" style="stop-color:#a5a6a8" offset="0"/>
|
||||
<stop id="stop3848" style="stop-color:#e8e8e8" offset="1"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<g id="layer1">
|
||||
<rect id="rect2879" x="7.7378" y="42.43" width="32.508" height="3.5701" style="fill:url(#linearGradient2507);opacity:.3"/>
|
||||
<path id="path2881" d="m7.7378 42.43v3.5699c-1.1865 0.0067-2.8684-0.79982-2.8684-1.7852 0-0.98533 1.324-1.7847 2.8684-1.7847z" style="fill:url(#radialGradient2504);opacity:.3"/>
|
||||
<path id="path2883" d="m40.246 42.43v3.5699c1.1865 0.0067 2.8684-0.79982 2.8684-1.7852 0-0.98533-1.324-1.7847-2.8684-1.7847z" style="fill:url(#radialGradient2501);opacity:.3"/>
|
||||
<path id="path4160" d="m6.5 0.4972h24.061c1.4069 0.47465 8.9655 5.8822 10.939 9.6264v34.379h-35v-44.006z" style="fill:url(#linearGradient2496);stroke-linejoin:round;stroke-width:.99992;stroke:url(#linearGradient2498)"/>
|
||||
<path id="path4191" d="m7.3617 44c-0.1993 0-0.3617-0.17546-0.3617-0.39078v-42.204c0-0.21571 0.1624-0.39078 0.3617-0.39078 7.4831 0.10801 15.776-0.16158 23.25 0.026895l10.283 8.866 0.10598 33.702c0 0.21532-0.16204 0.39078-0.3617 0.39078h-33.277z" style="fill:url(#radialGradient2493)"/>
|
||||
<path id="path23417" d="m37 33c0.0011 2.7613-5.8195 5-13 5s-13.001-2.2387-13-5c-0.0011-2.7613 5.8195-5 13-5s13.001 2.2387 13 5z" style="fill-rule:evenodd;fill:url(#radialGradient2490);opacity:.3"/>
|
||||
<path id="path2435" d="m40.5 10.259v33.263h-33v-42.045h22.866" style="fill:none;opacity:.6;stroke-linejoin:round;stroke-width:.99992;stroke:url(#linearGradient2487)"/>
|
||||
<path id="path12038" d="m28.617 0.92126c4.2825 0 2.1532 8.4832 2.1532 8.4832s10.358-1.8023 10.358 2.8187c0-2.6097-11.302-10.729-12.511-11.302z" style="fill-rule:evenodd;filter:url(#filter3212);opacity:.4"/>
|
||||
<path id="path4474" d="m28.617 0.92126c3.1865 0 2.3358 7.6619 2.3358 7.6619s10.175-0.98105 10.175 3.64c0-1.1259 0.08591-1.9322-0.13378-2.2836-1.5783-2.5242-8.3955-8.1884-10.857-8.9308-0.18422-0.055555-0.5927-0.087535-1.5198-0.087535z" style="fill-rule:evenodd;fill:url(#linearGradient2483)"/>
|
||||
<path id="path4834" d="m35.49 31.068c0 2.4466-5.1487 4.4322-11.493 4.4322-6.344 0-11.493-1.9856-11.493-4.4322 0.11446-5.4694-1.4047-4.34 11.493-4.4322 13.193-0.0952 11.331-1.1267 11.493 4.4322z" style="fill:url(#linearGradient2477);stroke:url(#linearGradient2479)"/>
|
||||
<path id="path4838" d="m35.5 27c0 2.4853-5.1487 4.5-11.5 4.5-6.3513 0-11.5-2.0147-11.5-4.5 0-2.4853 5.1487-4.5 11.5-4.5 6.3513 0 11.5 2.0147 11.5 4.5z" style="fill:#868688;stroke:#d8d8d8"/>
|
||||
<path id="path3866" d="m35.49 25.068c0 2.4466-5.1487 4.4322-11.493 4.4322-6.344 0-11.493-1.9856-11.493-4.4322 0.11446-5.4694-1.4047-4.34 11.493-4.4322 13.193-0.0952 11.331-1.1267 11.493 4.4322z" style="fill:url(#linearGradient2471);stroke:url(#linearGradient2473)"/>
|
||||
<path id="path3868" d="m35.5 21c0 2.4853-5.1487 4.5-11.5 4.5-6.3513 0-11.5-2.0147-11.5-4.5 0-2.4853 5.1487-4.5 11.5-4.5 6.3513 0 11.5 2.0147 11.5 4.5z" style="fill:#868688;stroke:#d8d8d8"/>
|
||||
<path id="path3878" d="m35.49 19.068c0 2.4466-5.1487 4.4322-11.493 4.4322-6.344 0-11.493-1.9856-11.493-4.4322 0.11446-5.4694-1.4047-4.34 11.493-4.4322 13.193-0.0952 11.331-1.1267 11.493 4.4322z" style="fill:url(#linearGradient2463);stroke:url(#linearGradient2466)"/>
|
||||
<path id="path3880" d="m35.5 15c0 2.4853-5.1487 4.5-11.5 4.5-6.3513 0-11.5-2.0147-11.5-4.5 0-2.4853 5.1487-4.5 11.5-4.5 6.3513 0 11.5 2.0147 11.5 4.5z" style="fill:url(#linearGradient2458);stroke:url(#linearGradient2460)"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 9.2 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 67 KiB |
BIN
Binary file not shown.
|
After Width: | Height: | Size: 75 KiB |
@@ -0,0 +1,42 @@
|
||||
{
|
||||
"app_id": "sqlite",
|
||||
"os": "linux",
|
||||
"install_exit_code": 0,
|
||||
"download_available": true,
|
||||
"is_cli": true,
|
||||
"install_script": "#!/bin/bash\nset -e\n\n# Update package lists\nsudo apt-get update\n\n# Install SQLite3 command-line tool and development libraries\nsudo apt-get install -y sqlite3\n\n# Verify installation\nwhich sqlite3\nsqlite3 --version\n\necho \"SQLite installation complete!\"",
|
||||
"launch_script": "#!/bin/bash\n\n# Create a demo database file\nmkdir -p ~/.sqlite3\nDB_FILE=\"$HOME/.sqlite3/demo.db\"\n\n# Create and populate a demo database\nsqlite3 \"$DB_FILE\" <<'EOF'\n-- Create a sample table\nCREATE TABLE IF NOT EXISTS employees (\n id INTEGER PRIMARY KEY,\n name TEXT NOT NULL,\n department TEXT NOT NULL,\n salary REAL NOT NULL\n);\n\n-- Insert sample data\nINSERT OR IGNORE INTO employees (id, name, department, salary) VALUES\n (1, 'Alice Johnson', 'Engineering', 95000),\n (2, 'Bob Smith', 'Sales', 75000),\n (3, 'Carol White', 'Marketing', 80000),\n (4, 'David Brown', 'Engineering', 92000);\n\n-- Display the data\nSELECT 'Database Contents:' as info;\nSELECT '==================' as separator;\nSELECT printf('%-5s %-15s %-15s %10s', 'ID', 'Name', 'Department', 'Salary') as header;\nSELECT '==================' as separator;\nSELECT printf('%-5d %-15s %-15s %10.0f', id, name, department, salary) FROM employees;\nSELECT '' as blank;\nSELECT 'Database Information:' as info;\nSELECT '==================' as separator;\nSELECT 'Total Employees: ' || COUNT(*) FROM employees;\nSELECT 'SQLite Version: ' || sqlite_version() AS version;\nEOF\n\n# Create a shell script that will be executed in the terminal\ncat > ~/.sqlite3/interactive.sh << 'SHELL_EOF'\n#!/bin/bash\necho \"=== SQLite Interactive Database Shell ===\"\necho \"Type '.help' for help, '.quit' to exit\"\necho \"Database file: $HOME/.sqlite3/demo.db\"\necho \"\"\nsqlite3 \"$HOME/.sqlite3/demo.db\"\nSHELL_EOF\nchmod +x ~/.sqlite3/interactive.sh\n\n# Launch in xfce4-terminal and keep it open\nxfce4-terminal --title=\"SQLite Database Shell\" --command=\"bash -c '~/.sqlite3/interactive.sh'\" &\n\n# Wait for terminal to start\nsleep 3",
|
||||
"extract_metadata_script": "#!/bin/bash\n\n# Find the SQLite binary\nBINARY_PATH=$(which sqlite3)\nBINARY_NAME=$(basename \"$BINARY_PATH\")\n\n# Get the version\nVERSION_OUTPUT=$(sqlite3 --version 2>&1)\nVERSION=$(echo \"$VERSION_OUTPUT\" | awk '{print $1}' | sed 's/^[^0-9]*//')\n# Validate version format - if invalid format, extract what we can\nif ! [[ \"$VERSION\" =~ ^[0-9]+\\.[0-9]+ ]]; then\n VERSION=$(echo \"$VERSION_OUTPUT\" | grep -oE '^[0-9]+\\.[0-9]+' | head -n1)\nfi\n\n# Extract display_name from .desktop file or use package metadata\nDISPLAY_NAME=\"\"\nDESKTOP_FILE=\"\"\nICON_FROM_DESKTOP=\"\"\n\n# Find .desktop file in package contents\nDESKTOP_FILE=$(dpkg -L sqlite3 2>/dev/null | grep '\\.desktop$' | head -n1)\nif [ -n \"$DESKTOP_FILE\" ] && [ -f \"$DESKTOP_FILE\" ]; then\n # Extract display name from .desktop file\n DISPLAY_NAME=$(grep \"^Name=\" \"$DESKTOP_FILE\" | head -n1 | cut -d'=' -f2- | head -c 100)\n # Extract icon reference from .desktop file\n ICON_FROM_DESKTOP=$(grep \"^Icon=\" \"$DESKTOP_FILE\" | head -n1 | cut -d'=' -f2-)\nfi\n\n# If no display name found, try package description\nif [ -z \"$DISPLAY_NAME\" ]; then\n DISPLAY_NAME=$(dpkg -s sqlite3 2>/dev/null | grep \"^Description:\" | cut -d' ' -f2-)\nfi\n\n# Find icon files\nICON_PATHS=()\n\n# If we have an icon reference from .desktop file, resolve it using icon theme\nif [ -n \"$ICON_FROM_DESKTOP\" ]; then\n # Use find to search for icon files matching the icon name\n for ext in .png .svg .ico .jpg; do\n while IFS= read -r file; do\n if [ -f \"$file\" ]; then\n ICON_PATHS+=(\"$file\")\n fi\n done < <(find /usr/share/icons /usr/share/pixmaps -name \"*$ICON_FROM_DESKTOP*$ext\" -type f 2>/dev/null | head -n 5)\n done\nfi\n\n# Search for sqlite-specific icons in system icon directories\nfor search_term in \"sqlite\" \"database\" \"sql\"; do\n for ext in .png .svg .ico .jpg; do\n while IFS= read -r file; do\n if [ -f \"$file\" ]; then\n ICON_PATHS+=(\"$file\")\n fi\n done < <(find /usr/share/icons /usr/share/pixmaps -iname \"*${search_term}*${ext}\" -type f 2>/dev/null | head -n 3)\n done\ndone\n\n# Remove duplicates, sort, and limit to reasonable number\nICON_PATHS=($(printf '%s\\n' \"${ICON_PATHS[@]}\" | sort -u | head -n 20))\n\n# Build icon path array JSON\nICON_JSON=\"[\"\nfor i in \"${!ICON_PATHS[@]}\"; do\n if [ $i -gt 0 ]; then\n ICON_JSON=\"$ICON_JSON,\"\n fi\n # Escape backslashes and quotes\n ESCAPED_PATH=\"${ICON_PATHS[$i]//\\\\/\\\\\\\\}\"\n ESCAPED_PATH=\"${ESCAPED_PATH//\\\"/\\\\\\\"}\"\n ICON_JSON=\"$ICON_JSON\\\"$ESCAPED_PATH\\\"\"\ndone\nICON_JSON=\"$ICON_JSON]\"\n\n# Create the metadata JSON object\ncat <<EOF\n{\n \"binary_path\": \"$BINARY_PATH\",\n \"binary_name\": \"$BINARY_NAME\",\n \"display_name\": \"$DISPLAY_NAME\",\n \"desktop_entry\": $( [ -n \"$DESKTOP_FILE\" ] && [ -f \"$DESKTOP_FILE\" ] && echo \\\"\\\"$DESKTOP_FILE\\\"\\\" || echo null ),\n \"icon_paths\": $ICON_JSON,\n \"version\": \"$VERSION\"\n}\nEOF",
|
||||
"metadata": {
|
||||
"binary_path": "/usr/bin/sqlite3",
|
||||
"binary_name": "sqlite3",
|
||||
"display_name": "Command line interface for SQLite 3",
|
||||
"desktop_entry": null,
|
||||
"icon_paths": [
|
||||
"/usr/share/icons/Humanity/mimes/128/libreoffice-oasis-database.svg",
|
||||
"/usr/share/icons/Humanity/mimes/256/libreoffice-oasis-database.svg",
|
||||
"/usr/share/icons/Humanity/mimes/32/libreoffice-oasis-database.svg",
|
||||
"/usr/share/icons/Humanity/mimes/48/text-x-sql.svg",
|
||||
"/usr/share/icons/elementary-xfce/apps/22/office-database.png",
|
||||
"/usr/share/icons/elementary-xfce/apps/32/office-database.png",
|
||||
"/usr/share/icons/elementary-xfce/apps/64/office-database.png",
|
||||
"/usr/share/icons/elementary-xfce/mimes/22/text-x-sql.png"
|
||||
],
|
||||
"version": "3.37.2"
|
||||
},
|
||||
"install_stdout": "Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease\nGet:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [128 kB]\nGet:3 http://security.ubuntu.com/ubuntu jammy-security InRelease [129 kB]\nGet:4 http://archive.ubuntu.com/ubuntu jammy-backports InRelease [127 kB]\nGet:5 https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu jammy InRelease [18.1 kB]\nGet:6 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 Packages [4226 kB]\nGet:7 https://ppa.launchpadcontent.net/mozillateam/ppa/ubuntu jammy InRelease [24.6 kB]\nGet:8 http://security.ubuntu.com/ubuntu jammy-security/main amd64 Packages [3889 kB]\nGet:9 https://ppa.launchpadcontent.net/deadsnakes/ppa/ubuntu jammy/main adc64 Packages [38.8 kB]\nGet:10 https://ppa.launchpadcontent.net/mozillateam/ppa/ubuntu jammy/main amd64 Packages [45.0 kB]\nGet:11 http://archive.ubuntu.com/ubuntu jammy-updates/restricted amd64 Packages [7143 kB]\nGet:12 http://archive.ubuntu.com/ubuntu jammy-updates/universe amd64 Packages [1622 kB]\nGet:13 http://security.ubuntu.com/ubuntu jammy-security/restricted amd64 Packages [6917 kB]\nGet:14 http://security.ubuntu.com/ubuntu jammy-security/universe amd64 Packages [1311 kB]\nFetched 25.6 MB in 3s (9252 kB/s)\nReading package lists...\nReading package lists...\nBuilding dependency tree...\nReading state information...\nSuggested packages:\n sqlite3-doc\nThe following NEW packages will be installed:\n sqlite3\n0 upgraded, 1 newly installed, 0 to remove and 42 not upgraded.\nNeed to get 769 kB of archives.\nAfter this operation, 1874 kB of additional disk space will be used.\nGet:1 http://archive.ubuntu.com/ubuntu jammy-updates/main amd64 sqlite3 amd64 3.37.2-2ubuntu0.5 [769 kB]\nFetched 769 kB in 1s (1061 kB/s)\nSelecting previously unselected package sqlite3.\n(Reading database ... (Reading database ... 5%(Reading database ... 10%(Reading database ... 15%(Reading database ... 20%(Reading database ... 25%(Reading database ... 30%(Reading database ... 35%(Reading database ... 40%(Reading database ... 45%(Reading database ... 50%(Reading database ... 55%(Reading database ... 60%(Reading database ... 65%(Reading database ... 70%(Reading database ... 75%(Reading database ... 80%(Reading database ... 85%(Reading database ... 90%(Reading database ... 95%(Reading database ... 100%(Reading database ... 74323 files and directories currently installed.)\nPreparing to unpack .../sqlite3_3.37.2-2ubuntu0.5_amd64.deb ...\nUnpacking sqlite3 (3.37.2-2ubuntu0.5) ...\nSetting up sqlite3 (3.37.2-2ubuntu0.5) ...\nProcessing triggers for man-db (2.10.2-1) ...\n/usr/bin/sqlite3\n3.37.2 2022-01-06 13:25:41 872ba256cbf61d9290b571c0e6d82a20c224ca3ad82971edc46b29818d5dalt1\nSQLite installation complete!",
|
||||
"sandbox_name": "linux-0efda8ec",
|
||||
"notes": "SQLite is a CLI/TUI application successfully installed via apt. The launch script creates a demo database with sample employee data and opens an interactive SQLite shell in xfce4-terminal. The screenshot shows the SQLite shell running with version 3.37.2, displaying the interactive database prompt. The extract_metadata script dynamically discovers binary path via `which`, version via `sqlite3 --version` with format validation, display name from package metadata via `dpkg -s`, and discovers relevant icons from system icon theme directories using find with sqlite/database/sql search terms.",
|
||||
"screenshot_verification": "PASS: SQLite Database Shell is running and displaying version 3.37.2 with the sqlite> prompt ready for input, showing the database file path and help instructions.",
|
||||
"verification_passed": true,
|
||||
"extracted_icons": [
|
||||
"cua_sandbox_apps\\apps\\sqlite\\linux\\logs\\icon-unknownxunknown.svg",
|
||||
"cua_sandbox_apps\\apps\\sqlite\\linux\\logs\\icon-unknownxunknown.svg",
|
||||
"cua_sandbox_apps\\apps\\sqlite\\linux\\logs\\icon-unknownxunknown.svg",
|
||||
"cua_sandbox_apps\\apps\\sqlite\\linux\\logs\\icon-unknownxunknown.svg",
|
||||
"cua_sandbox_apps\\apps\\sqlite\\linux\\logs\\icon-22x22.png",
|
||||
"cua_sandbox_apps\\apps\\sqlite\\linux\\logs\\icon-32x32.png",
|
||||
"cua_sandbox_apps\\apps\\sqlite\\linux\\logs\\icon-64x64.png",
|
||||
"cua_sandbox_apps\\apps\\sqlite\\linux\\logs\\icon-22x22.png"
|
||||
]
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
+558
@@ -0,0 +1,558 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Claude Code transcript - Index</title>
|
||||
<style>
|
||||
:root { --bg-color: #f5f5f5; --card-bg: #ffffff; --user-bg: #e3f2fd; --user-border: #1976d2; --assistant-bg: #f5f5f5; --assistant-border: #9e9e9e; --thinking-bg: #fff8e1; --thinking-border: #ffc107; --thinking-text: #666; --tool-bg: #f3e5f5; --tool-border: #9c27b0; --tool-result-bg: #e8f5e9; --tool-error-bg: #ffebee; --text-color: #212121; --text-muted: #757575; --code-bg: #263238; --code-text: #aed581; }
|
||||
* { box-sizing: border-box; }
|
||||
body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: var(--bg-color); color: var(--text-color); margin: 0; padding: 16px; line-height: 1.6; }
|
||||
.container { max-width: 800px; margin: 0 auto; }
|
||||
h1 { font-size: 1.5rem; margin-bottom: 24px; padding-bottom: 8px; border-bottom: 2px solid var(--user-border); }
|
||||
.header-row { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 12px; border-bottom: 2px solid var(--user-border); padding-bottom: 8px; margin-bottom: 24px; }
|
||||
.header-row h1 { border-bottom: none; padding-bottom: 0; margin-bottom: 0; flex: 1; min-width: 200px; }
|
||||
.message { margin-bottom: 16px; border-radius: 12px; overflow: hidden; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
|
||||
.message.user { background: var(--user-bg); border-left: 4px solid var(--user-border); }
|
||||
.message.assistant { background: var(--card-bg); border-left: 4px solid var(--assistant-border); }
|
||||
.message.tool-reply { background: #fff8e1; border-left: 4px solid #ff9800; }
|
||||
.tool-reply .role-label { color: #e65100; }
|
||||
.tool-reply .tool-result { background: transparent; padding: 0; margin: 0; }
|
||||
.tool-reply .tool-result .truncatable.truncated::after { background: linear-gradient(to bottom, transparent, #fff8e1); }
|
||||
.message-header { display: flex; justify-content: space-between; align-items: center; padding: 8px 16px; background: rgba(0,0,0,0.03); font-size: 0.85rem; }
|
||||
.role-label { font-weight: 600; text-transform: uppercase; letter-spacing: 0.5px; }
|
||||
.user .role-label { color: var(--user-border); }
|
||||
time { color: var(--text-muted); font-size: 0.8rem; }
|
||||
.timestamp-link { color: inherit; text-decoration: none; }
|
||||
.timestamp-link:hover { text-decoration: underline; }
|
||||
.message:target { animation: highlight 2s ease-out; }
|
||||
@keyframes highlight { 0% { background-color: rgba(25, 118, 210, 0.2); } 100% { background-color: transparent; } }
|
||||
.message-content { padding: 16px; }
|
||||
.message-content p { margin: 0 0 12px 0; }
|
||||
.message-content p:last-child { margin-bottom: 0; }
|
||||
.thinking { background: var(--thinking-bg); border: 1px solid var(--thinking-border); border-radius: 8px; padding: 12px; margin: 12px 0; font-size: 0.9rem; color: var(--thinking-text); }
|
||||
.thinking-label { font-size: 0.75rem; font-weight: 600; text-transform: uppercase; color: #f57c00; margin-bottom: 8px; }
|
||||
.thinking p { margin: 8px 0; }
|
||||
.assistant-text { margin: 8px 0; }
|
||||
.tool-use { background: var(--tool-bg); border: 1px solid var(--tool-border); border-radius: 8px; padding: 12px; margin: 12px 0; }
|
||||
.tool-header { font-weight: 600; color: var(--tool-border); margin-bottom: 8px; display: flex; align-items: center; gap: 8px; }
|
||||
.tool-icon { font-size: 1.1rem; }
|
||||
.tool-description { font-size: 0.9rem; color: var(--text-muted); margin-bottom: 8px; font-style: italic; }
|
||||
.tool-result { background: var(--tool-result-bg); border-radius: 8px; padding: 12px; margin: 12px 0; }
|
||||
.tool-result.tool-error { background: var(--tool-error-bg); }
|
||||
.file-tool { border-radius: 8px; padding: 12px; margin: 12px 0; }
|
||||
.write-tool { background: linear-gradient(135deg, #e3f2fd 0%, #e8f5e9 100%); border: 1px solid #4caf50; }
|
||||
.edit-tool { background: linear-gradient(135deg, #fff3e0 0%, #fce4ec 100%); border: 1px solid #ff9800; }
|
||||
.file-tool-header { font-weight: 600; margin-bottom: 4px; display: flex; align-items: center; gap: 8px; font-size: 0.95rem; }
|
||||
.write-header { color: #2e7d32; }
|
||||
.edit-header { color: #e65100; }
|
||||
.file-tool-icon { font-size: 1rem; }
|
||||
.file-tool-path { font-family: monospace; background: rgba(0,0,0,0.08); padding: 2px 8px; border-radius: 4px; }
|
||||
.file-tool-fullpath { font-family: monospace; font-size: 0.8rem; color: var(--text-muted); margin-bottom: 8px; word-break: break-all; }
|
||||
.file-content { margin: 0; }
|
||||
.edit-section { display: flex; margin: 4px 0; border-radius: 4px; overflow: hidden; }
|
||||
.edit-label { padding: 8px 12px; font-weight: bold; font-family: monospace; display: flex; align-items: flex-start; }
|
||||
.edit-old { background: #fce4ec; }
|
||||
.edit-old .edit-label { color: #b71c1c; background: #f8bbd9; }
|
||||
.edit-old .edit-content { color: #880e4f; }
|
||||
.edit-new { background: #e8f5e9; }
|
||||
.edit-new .edit-label { color: #1b5e20; background: #a5d6a7; }
|
||||
.edit-new .edit-content { color: #1b5e20; }
|
||||
.edit-content { margin: 0; flex: 1; background: transparent; font-size: 0.85rem; }
|
||||
.edit-replace-all { font-size: 0.75rem; font-weight: normal; color: var(--text-muted); }
|
||||
.write-tool .truncatable.truncated::after { background: linear-gradient(to bottom, transparent, #e6f4ea); }
|
||||
.edit-tool .truncatable.truncated::after { background: linear-gradient(to bottom, transparent, #fff0e5); }
|
||||
.todo-list { background: linear-gradient(135deg, #e8f5e9 0%, #f1f8e9 100%); border: 1px solid #81c784; border-radius: 8px; padding: 12px; margin: 12px 0; }
|
||||
.todo-header { font-weight: 600; color: #2e7d32; margin-bottom: 10px; display: flex; align-items: center; gap: 8px; font-size: 0.95rem; }
|
||||
.todo-items { list-style: none; margin: 0; padding: 0; }
|
||||
.todo-item { display: flex; align-items: flex-start; gap: 10px; padding: 6px 0; border-bottom: 1px solid rgba(0,0,0,0.06); font-size: 0.9rem; }
|
||||
.todo-item:last-child { border-bottom: none; }
|
||||
.todo-icon { flex-shrink: 0; width: 20px; height: 20px; display: flex; align-items: center; justify-content: center; font-weight: bold; border-radius: 50%; }
|
||||
.todo-completed .todo-icon { color: #2e7d32; background: rgba(46, 125, 50, 0.15); }
|
||||
.todo-completed .todo-content { color: #558b2f; text-decoration: line-through; }
|
||||
.todo-in-progress .todo-icon { color: #f57c00; background: rgba(245, 124, 0, 0.15); }
|
||||
.todo-in-progress .todo-content { color: #e65100; font-weight: 500; }
|
||||
.todo-pending .todo-icon { color: #757575; background: rgba(0,0,0,0.05); }
|
||||
.todo-pending .todo-content { color: #616161; }
|
||||
pre { background: var(--code-bg); color: var(--code-text); padding: 12px; border-radius: 6px; overflow-x: auto; font-size: 0.85rem; line-height: 1.5; margin: 8px 0; white-space: pre-wrap; word-wrap: break-word; }
|
||||
pre.json { color: #e0e0e0; }
|
||||
code { background: rgba(0,0,0,0.08); padding: 2px 6px; border-radius: 4px; font-size: 0.9em; }
|
||||
pre code { background: none; padding: 0; }
|
||||
.user-content { margin: 0; }
|
||||
.truncatable { position: relative; }
|
||||
.truncatable.truncated .truncatable-content { max-height: 200px; overflow: hidden; }
|
||||
.truncatable.truncated::after { content: ''; position: absolute; bottom: 32px; left: 0; right: 0; height: 60px; background: linear-gradient(to bottom, transparent, var(--card-bg)); pointer-events: none; }
|
||||
.message.user .truncatable.truncated::after { background: linear-gradient(to bottom, transparent, var(--user-bg)); }
|
||||
.message.tool-reply .truncatable.truncated::after { background: linear-gradient(to bottom, transparent, #fff8e1); }
|
||||
.tool-use .truncatable.truncated::after { background: linear-gradient(to bottom, transparent, var(--tool-bg)); }
|
||||
.tool-result .truncatable.truncated::after { background: linear-gradient(to bottom, transparent, var(--tool-result-bg)); }
|
||||
.expand-btn { display: none; width: 100%; padding: 8px 16px; margin-top: 4px; background: rgba(0,0,0,0.05); border: 1px solid rgba(0,0,0,0.1); border-radius: 6px; cursor: pointer; font-size: 0.85rem; color: var(--text-muted); }
|
||||
.expand-btn:hover { background: rgba(0,0,0,0.1); }
|
||||
.truncatable.truncated .expand-btn, .truncatable.expanded .expand-btn { display: block; }
|
||||
.pagination { display: flex; justify-content: center; gap: 8px; margin: 24px 0; flex-wrap: wrap; }
|
||||
.pagination a, .pagination span { padding: 5px 10px; border-radius: 6px; text-decoration: none; font-size: 0.85rem; }
|
||||
.pagination a { background: var(--card-bg); color: var(--user-border); border: 1px solid var(--user-border); }
|
||||
.pagination a:hover { background: var(--user-bg); }
|
||||
.pagination .current { background: var(--user-border); color: white; }
|
||||
.pagination .disabled { color: var(--text-muted); border: 1px solid #ddd; }
|
||||
.pagination .index-link { background: var(--user-border); color: white; }
|
||||
details.continuation { margin-bottom: 16px; }
|
||||
details.continuation summary { cursor: pointer; padding: 12px 16px; background: var(--user-bg); border-left: 4px solid var(--user-border); border-radius: 12px; font-weight: 500; color: var(--text-muted); }
|
||||
details.continuation summary:hover { background: rgba(25, 118, 210, 0.15); }
|
||||
details.continuation[open] summary { border-radius: 12px 12px 0 0; margin-bottom: 0; }
|
||||
.index-item { margin-bottom: 16px; border-radius: 12px; overflow: hidden; box-shadow: 0 1px 3px rgba(0,0,0,0.1); background: var(--user-bg); border-left: 4px solid var(--user-border); }
|
||||
.index-item a { display: block; text-decoration: none; color: inherit; }
|
||||
.index-item a:hover { background: rgba(25, 118, 210, 0.1); }
|
||||
.index-item-header { display: flex; justify-content: space-between; align-items: center; padding: 8px 16px; background: rgba(0,0,0,0.03); font-size: 0.85rem; }
|
||||
.index-item-number { font-weight: 600; color: var(--user-border); }
|
||||
.index-item-content { padding: 16px; }
|
||||
.index-item-stats { padding: 8px 16px 12px 32px; font-size: 0.85rem; color: var(--text-muted); border-top: 1px solid rgba(0,0,0,0.06); }
|
||||
.index-item-commit { margin-top: 6px; padding: 4px 8px; background: #fff3e0; border-radius: 4px; font-size: 0.85rem; color: #e65100; }
|
||||
.index-item-commit code { background: rgba(0,0,0,0.08); padding: 1px 4px; border-radius: 3px; font-size: 0.8rem; margin-right: 6px; }
|
||||
.commit-card { margin: 8px 0; padding: 10px 14px; background: #fff3e0; border-left: 4px solid #ff9800; border-radius: 6px; }
|
||||
.commit-card a { text-decoration: none; color: #5d4037; display: block; }
|
||||
.commit-card a:hover { color: #e65100; }
|
||||
.commit-card-hash { font-family: monospace; color: #e65100; font-weight: 600; margin-right: 8px; }
|
||||
.index-commit { margin-bottom: 12px; padding: 10px 16px; background: #fff3e0; border-left: 4px solid #ff9800; border-radius: 8px; box-shadow: 0 1px 2px rgba(0,0,0,0.05); }
|
||||
.index-commit a { display: block; text-decoration: none; color: inherit; }
|
||||
.index-commit a:hover { background: rgba(255, 152, 0, 0.1); margin: -10px -16px; padding: 10px 16px; border-radius: 8px; }
|
||||
.index-commit-header { display: flex; justify-content: space-between; align-items: center; font-size: 0.85rem; margin-bottom: 4px; }
|
||||
.index-commit-hash { font-family: monospace; color: #e65100; font-weight: 600; }
|
||||
.index-commit-msg { color: #5d4037; }
|
||||
.index-item-long-text { margin-top: 8px; padding: 12px; background: var(--card-bg); border-radius: 8px; border-left: 3px solid var(--assistant-border); }
|
||||
.index-item-long-text .truncatable.truncated::after { background: linear-gradient(to bottom, transparent, var(--card-bg)); }
|
||||
.index-item-long-text-content { color: var(--text-color); }
|
||||
#search-box { display: none; align-items: center; gap: 8px; }
|
||||
#search-box input { padding: 6px 12px; border: 1px solid var(--assistant-border); border-radius: 6px; font-size: 16px; width: 180px; }
|
||||
#search-box button, #modal-search-btn, #modal-close-btn { background: var(--user-border); color: white; border: none; border-radius: 6px; padding: 6px 10px; cursor: pointer; display: flex; align-items: center; justify-content: center; }
|
||||
#search-box button:hover, #modal-search-btn:hover { background: #1565c0; }
|
||||
#modal-close-btn { background: var(--text-muted); margin-left: 8px; }
|
||||
#modal-close-btn:hover { background: #616161; }
|
||||
#search-modal[open] { border: none; border-radius: 12px; box-shadow: 0 4px 24px rgba(0,0,0,0.2); padding: 0; width: 90vw; max-width: 900px; height: 80vh; max-height: 80vh; display: flex; flex-direction: column; }
|
||||
#search-modal::backdrop { background: rgba(0,0,0,0.5); }
|
||||
.search-modal-header { display: flex; align-items: center; gap: 8px; padding: 16px; border-bottom: 1px solid var(--assistant-border); background: var(--bg-color); border-radius: 12px 12px 0 0; }
|
||||
.search-modal-header input { flex: 1; padding: 8px 12px; border: 1px solid var(--assistant-border); border-radius: 6px; font-size: 16px; }
|
||||
#search-status { padding: 8px 16px; font-size: 0.85rem; color: var(--text-muted); border-bottom: 1px solid rgba(0,0,0,0.06); }
|
||||
#search-results { flex: 1; overflow-y: auto; padding: 16px; }
|
||||
.search-result { margin-bottom: 16px; border-radius: 8px; overflow: hidden; box-shadow: 0 1px 3px rgba(0,0,0,0.1); }
|
||||
.search-result a { display: block; text-decoration: none; color: inherit; }
|
||||
.search-result a:hover { background: rgba(25, 118, 210, 0.05); }
|
||||
.search-result-page { padding: 6px 12px; background: rgba(0,0,0,0.03); font-size: 0.8rem; color: var(--text-muted); border-bottom: 1px solid rgba(0,0,0,0.06); }
|
||||
.search-result-content { padding: 12px; }
|
||||
.search-result mark { background: #fff59d; padding: 1px 2px; border-radius: 2px; }
|
||||
@media (max-width: 600px) { body { padding: 8px; } .message, .index-item { border-radius: 8px; } .message-content, .index-item-content { padding: 12px; } pre { font-size: 0.8rem; padding: 8px; } #search-box input { width: 120px; } #search-modal[open] { width: 95vw; height: 90vh; } }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<div class="header-row">
|
||||
<h1>Claude Code transcript</h1>
|
||||
<div id="search-box">
|
||||
<input type="text" id="search-input" placeholder="Search..." aria-label="Search transcripts">
|
||||
<button id="search-btn" type="button" aria-label="Search">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"></circle><path d="m21 21-4.35-4.35"></path></svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="pagination">
|
||||
<span class="current">Index</span>
|
||||
<span class="disabled">← Prev</span>
|
||||
<a href="page-001.html">1</a>
|
||||
<a href="page-001.html">Next →</a>
|
||||
</div>
|
||||
|
||||
<p style="color: var(--text-muted); margin-bottom: 24px;">1 prompts · 125 messages · 41 tool calls · 0 commits · 1 pages</p>
|
||||
|
||||
<div class="index-item"><a href="page-001.html#msg-2026-04-13T00-01-17-829Z"><div class="index-item-header"><span class="index-item-number">#1</span><time datetime="2026-04-13T00:01:17.829Z" data-timestamp="2026-04-13T00:01:17.829Z">2026-04-13T00:01:17.829Z</time></div><div class="index-item-content"><p>Create install and launch scripts for: SQLite
|
||||
Target OS: linux
|
||||
App metadata: {"id": "sqlite", "name": "SQLite", "description": "SQLite is a lightweight, self-contained, serverless SQL database engine that is the most widely deployed database in the world. It is an in-process, zero-configuration database library that reads and writes directly to ordinary disk files. A complete SQL database with multiple tables, indices, triggers, and views is contained in a single disk file. SQLite offers full-featured SQL support, ACID transactions, and is ideal for embedded applications, application file formats, local data storage, and systems with memory constraints.", "website": "https://www.sqlite.org", "icon_url": "https://www.sqlite.org/images/sqlite370.png", "categories": ["Database"], "tags": ["database", "sql", "embedded", "serverless", "public-domain", "cross-platform", "lightweight", "zero-configuration", "in-process", "transactional"], "os_support": ["linux", "windows", "macos", "android"], "requires_payment": false, "foss": true, "gh_repo": "https://github.com/sqlite/sqlite", "self_hostable": true, "requires_hardware": false, "package_managers": {"apt": "sqlite3", "brew": "sqlite", "choco": "SQLite", "winget": "SQLite.SQLite"}, "download_url": "https://www.sqlite.org/download.html"}</p>
|
||||
<p>Research the official install method, create scripts, test them in a sandbox, LAUNCH the app, take a screenshot showing it running, and submit your result.
|
||||
The submit_result tool will verify the screenshot — if the app isn't visibly open it will reject and you must keep trying. Remember to delete the sandbox when done.</p></div></a><div class="index-item-stats"><span>11 mcp__sandbox__sandbox_write · 11 mcp__sandbox__sandbox_run · 6 mcp__sandbox__sandbox_read · 4 todo · 4 mcp__sandbox__submit_result · 1 fetch · 1 mcp__sandbox__create_sandbox · 1 mcp__sandbox__sandbox_screenshot · 1 read · 1 mcp__sandbox__delete_sandbox</span>
|
||||
<div class="index-item-long-text"><div class="truncatable"><div class="truncatable-content"><div class="index-item-long-text-content"><p>Perfect! I've successfully completed the SQLite installer for Linux. Here's a summary of what was created:</p>
|
||||
<h2>📊 SQLite Linux Installation - Summary</h2>
|
||||
<h3>✅ Installation Complete</h3>
|
||||
<p>I've created fully functional install and launch scripts for <strong>SQLite 3.37.2</strong> on Linux, tested in an Ubuntu sandbox environment.</p>
|
||||
<h3>📦 Deliverables Created:</h3>
|
||||
<ol>
|
||||
<li><strong>Install Script</strong> (<code>install_sqlite.sh</code>)</li>
|
||||
<li>Uses <code>sudo apt-get update</code> and <code>apt-get install -y sqlite3</code></li>
|
||||
<li>Verifies installation with <code>which sqlite3</code> and <code>sqlite3 --version</code></li>
|
||||
<li>
|
||||
<p>Fully tested and successful</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Launch Script</strong> (<code>launch_sqlite_demo.sh</code>)</p>
|
||||
</li>
|
||||
<li>Creates a demo SQLite database at <code>~/.sqlite3/demo.db</code></li>
|
||||
<li>Populates with sample employee data (4 records)</li>
|
||||
<li>Opens interactive SQLite shell in xfce4-terminal</li>
|
||||
<li>
|
||||
<p>Displays database contents and information on startup</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Extract Metadata Script</strong> (<code>extract_metadata.sh</code>)</p>
|
||||
</li>
|
||||
<li>Dynamically discovers binary path via <code>which sqlite3</code></li>
|
||||
<li>Extracts version from <code>sqlite3 --version</code> with format validation</li>
|
||||
<li>Gets display name from package metadata (<code>dpkg -s</code>)</li>
|
||||
<li>Discovers relevant database and SQL icons from system theme directories</li>
|
||||
<li>Outputs clean JSON with all metadata</li>
|
||||
</ol>
|
||||
<h3>📸 Verification:</h3>
|
||||
<ul>
|
||||
<li><strong>Screenshot</strong>: SQLite interactive shell running in terminal showing version 3.37.2 with the <code>sqlite></code> prompt ready for commands</li>
|
||||
<li><strong>Metadata Extracted</strong>:</li>
|
||||
<li>Binary Path: <code>/usr/bin/sqlite3</code></li>
|
||||
<li>Display Name: "Command line interface for SQLite 3"</li>
|
||||
<li>Version: 3.37.2</li>
|
||||
<li>8 relevant database and SQL icons discovered</li>
|
||||
</ul>
|
||||
<h3>🎯 Key Features:</h3>
|
||||
<ul>
|
||||
<li>✅ Uses Ubuntu package manager (apt) for reliable installation</li>
|
||||
<li>✅ CLI/TUI application successfully displayed in terminal</li>
|
||||
<li>✅ Demo database with sample data for immediate testing</li>
|
||||
<li>✅ Robust metadata extraction with fallback strategies</li>
|
||||
<li>✅ Properly parsed from package metadata, not hardcoded</li>
|
||||
<li>✅ All tests passed and submission accepted</li>
|
||||
</ul>
|
||||
<p>The sandbox has been cleaned up successfully!</p></div></div><button class="expand-btn">Show more</button></div></div>
|
||||
</div></div>
|
||||
|
||||
|
||||
<div class="pagination">
|
||||
<span class="current">Index</span>
|
||||
<span class="disabled">← Prev</span>
|
||||
<a href="page-001.html">1</a>
|
||||
<a href="page-001.html">Next →</a>
|
||||
</div>
|
||||
|
||||
|
||||
<dialog id="search-modal">
|
||||
<div class="search-modal-header">
|
||||
<input type="text" id="modal-search-input" placeholder="Search..." aria-label="Search transcripts">
|
||||
<button id="modal-search-btn" type="button" aria-label="Search">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"></circle><path d="m21 21-4.35-4.35"></path></svg>
|
||||
</button>
|
||||
<button id="modal-close-btn" type="button" aria-label="Close">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 6 6 18"></path><path d="m6 6 12 12"></path></svg>
|
||||
</button>
|
||||
</div>
|
||||
<div id="search-status"></div>
|
||||
<div id="search-results"></div>
|
||||
</dialog>
|
||||
<script>
|
||||
(function() {
|
||||
var totalPages = 1;
|
||||
var searchBox = document.getElementById('search-box');
|
||||
var searchInput = document.getElementById('search-input');
|
||||
var searchBtn = document.getElementById('search-btn');
|
||||
var modal = document.getElementById('search-modal');
|
||||
var modalInput = document.getElementById('modal-search-input');
|
||||
var modalSearchBtn = document.getElementById('modal-search-btn');
|
||||
var modalCloseBtn = document.getElementById('modal-close-btn');
|
||||
var searchStatus = document.getElementById('search-status');
|
||||
var searchResults = document.getElementById('search-results');
|
||||
|
||||
if (!searchBox || !modal) return;
|
||||
|
||||
// Hide search on file:// protocol (doesn't work due to CORS restrictions)
|
||||
if (window.location.protocol === 'file:') return;
|
||||
|
||||
// Show search box (progressive enhancement)
|
||||
searchBox.style.display = 'flex';
|
||||
|
||||
// Gist preview support - detect if we're on gisthost.github.io or gistpreview.github.io
|
||||
var hostname = window.location.hostname;
|
||||
var isGistPreview = hostname === 'gisthost.github.io' || hostname === 'gistpreview.github.io';
|
||||
var gistId = null;
|
||||
var gistOwner = null;
|
||||
var gistInfoLoaded = false;
|
||||
|
||||
if (isGistPreview) {
|
||||
// Extract gist ID from URL query string like ?78a436a8a9e7a2e603738b8193b95410/index.html
|
||||
var queryMatch = window.location.search.match(/^\?([a-f0-9]+)/i);
|
||||
if (queryMatch) {
|
||||
gistId = queryMatch[1];
|
||||
}
|
||||
}
|
||||
|
||||
async function loadGistInfo() {
|
||||
if (!isGistPreview || !gistId || gistInfoLoaded) return;
|
||||
try {
|
||||
var response = await fetch('https://api.github.com/gists/' + gistId);
|
||||
if (response.ok) {
|
||||
var info = await response.json();
|
||||
gistOwner = info.owner.login;
|
||||
gistInfoLoaded = true;
|
||||
}
|
||||
} catch (e) {
|
||||
console.error('Failed to load gist info:', e);
|
||||
}
|
||||
}
|
||||
|
||||
function getPageFetchUrl(pageFile) {
|
||||
if (isGistPreview && gistOwner && gistId) {
|
||||
// Use raw gist URL for fetching content
|
||||
return 'https://gist.githubusercontent.com/' + gistOwner + '/' + gistId + '/raw/' + pageFile;
|
||||
}
|
||||
return pageFile;
|
||||
}
|
||||
|
||||
function getPageLinkUrl(pageFile) {
|
||||
if (isGistPreview && gistId) {
|
||||
// Use gistpreview URL format for navigation links
|
||||
return '?' + gistId + '/' + pageFile;
|
||||
}
|
||||
return pageFile;
|
||||
}
|
||||
|
||||
function escapeHtml(text) {
|
||||
var div = document.createElement('div');
|
||||
div.textContent = text;
|
||||
return div.innerHTML;
|
||||
}
|
||||
|
||||
function escapeRegex(string) {
|
||||
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
||||
}
|
||||
|
||||
function openModal(query) {
|
||||
modalInput.value = query || '';
|
||||
searchResults.innerHTML = '';
|
||||
searchStatus.textContent = '';
|
||||
modal.showModal();
|
||||
modalInput.focus();
|
||||
if (query) {
|
||||
performSearch(query);
|
||||
}
|
||||
}
|
||||
|
||||
function closeModal() {
|
||||
modal.close();
|
||||
// Update URL to remove search fragment, preserving path and query string
|
||||
if (window.location.hash.startsWith('#search=')) {
|
||||
history.replaceState(null, '', window.location.pathname + window.location.search);
|
||||
}
|
||||
}
|
||||
|
||||
function updateUrlHash(query) {
|
||||
if (query) {
|
||||
// Preserve path and query string when adding hash
|
||||
history.replaceState(null, '', window.location.pathname + window.location.search + '#search=' + encodeURIComponent(query));
|
||||
}
|
||||
}
|
||||
|
||||
function highlightTextNodes(element, searchTerm) {
|
||||
var walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT, null, false);
|
||||
var nodesToReplace = [];
|
||||
|
||||
while (walker.nextNode()) {
|
||||
var node = walker.currentNode;
|
||||
if (node.nodeValue.toLowerCase().indexOf(searchTerm.toLowerCase()) !== -1) {
|
||||
nodesToReplace.push(node);
|
||||
}
|
||||
}
|
||||
|
||||
nodesToReplace.forEach(function(node) {
|
||||
var text = node.nodeValue;
|
||||
var regex = new RegExp('(' + escapeRegex(searchTerm) + ')', 'gi');
|
||||
var parts = text.split(regex);
|
||||
if (parts.length > 1) {
|
||||
var span = document.createElement('span');
|
||||
parts.forEach(function(part) {
|
||||
if (part.toLowerCase() === searchTerm.toLowerCase()) {
|
||||
var mark = document.createElement('mark');
|
||||
mark.textContent = part;
|
||||
span.appendChild(mark);
|
||||
} else {
|
||||
span.appendChild(document.createTextNode(part));
|
||||
}
|
||||
});
|
||||
node.parentNode.replaceChild(span, node);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function fixInternalLinks(element, pageFile) {
|
||||
// Update all internal anchor links to include the page file
|
||||
var links = element.querySelectorAll('a[href^="#"]');
|
||||
links.forEach(function(link) {
|
||||
var href = link.getAttribute('href');
|
||||
link.setAttribute('href', pageFile + href);
|
||||
});
|
||||
}
|
||||
|
||||
function processPage(pageFile, html, query) {
|
||||
var parser = new DOMParser();
|
||||
var doc = parser.parseFromString(html, 'text/html');
|
||||
var resultsFromPage = 0;
|
||||
|
||||
// Find all message blocks
|
||||
var messages = doc.querySelectorAll('.message');
|
||||
messages.forEach(function(msg) {
|
||||
var text = msg.textContent || '';
|
||||
if (text.toLowerCase().indexOf(query.toLowerCase()) !== -1) {
|
||||
resultsFromPage++;
|
||||
|
||||
// Get the message ID for linking
|
||||
var msgId = msg.id || '';
|
||||
var pageLinkUrl = getPageLinkUrl(pageFile);
|
||||
var link = pageLinkUrl + (msgId ? '#' + msgId : '');
|
||||
|
||||
// Clone the message HTML and highlight matches
|
||||
var clone = msg.cloneNode(true);
|
||||
// Fix internal links to include the page file
|
||||
fixInternalLinks(clone, pageLinkUrl);
|
||||
highlightTextNodes(clone, query);
|
||||
|
||||
var resultDiv = document.createElement('div');
|
||||
resultDiv.className = 'search-result';
|
||||
resultDiv.innerHTML = '<a href="' + link + '">' +
|
||||
'<div class="search-result-page">' + escapeHtml(pageFile) + '</div>' +
|
||||
'<div class="search-result-content">' + clone.innerHTML + '</div>' +
|
||||
'</a>';
|
||||
searchResults.appendChild(resultDiv);
|
||||
}
|
||||
});
|
||||
|
||||
return resultsFromPage;
|
||||
}
|
||||
|
||||
async function performSearch(query) {
|
||||
if (!query.trim()) {
|
||||
searchStatus.textContent = 'Enter a search term';
|
||||
return;
|
||||
}
|
||||
|
||||
updateUrlHash(query);
|
||||
searchResults.innerHTML = '';
|
||||
searchStatus.textContent = 'Searching...';
|
||||
|
||||
// Load gist info if on gistpreview (needed for constructing URLs)
|
||||
if (isGistPreview && !gistInfoLoaded) {
|
||||
searchStatus.textContent = 'Loading gist info...';
|
||||
await loadGistInfo();
|
||||
if (!gistOwner) {
|
||||
searchStatus.textContent = 'Failed to load gist info. Search unavailable.';
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
var resultsFound = 0;
|
||||
var pagesSearched = 0;
|
||||
|
||||
// Build list of pages to fetch
|
||||
var pagesToFetch = [];
|
||||
for (var i = 1; i <= totalPages; i++) {
|
||||
pagesToFetch.push('page-' + String(i).padStart(3, '0') + '.html');
|
||||
}
|
||||
|
||||
searchStatus.textContent = 'Searching...';
|
||||
|
||||
// Process pages in batches of 3, but show results immediately as each completes
|
||||
var batchSize = 3;
|
||||
for (var i = 0; i < pagesToFetch.length; i += batchSize) {
|
||||
var batch = pagesToFetch.slice(i, i + batchSize);
|
||||
|
||||
// Create promises that process results immediately when each fetch completes
|
||||
var promises = batch.map(function(pageFile) {
|
||||
return fetch(getPageFetchUrl(pageFile))
|
||||
.then(function(response) {
|
||||
if (!response.ok) throw new Error('Failed to fetch');
|
||||
return response.text();
|
||||
})
|
||||
.then(function(html) {
|
||||
// Process and display results immediately
|
||||
var count = processPage(pageFile, html, query);
|
||||
resultsFound += count;
|
||||
pagesSearched++;
|
||||
searchStatus.textContent = 'Found ' + resultsFound + ' result(s) in ' + pagesSearched + '/' + totalPages + ' pages...';
|
||||
})
|
||||
.catch(function() {
|
||||
pagesSearched++;
|
||||
searchStatus.textContent = 'Found ' + resultsFound + ' result(s) in ' + pagesSearched + '/' + totalPages + ' pages...';
|
||||
});
|
||||
});
|
||||
|
||||
// Wait for this batch to complete before starting the next
|
||||
await Promise.all(promises);
|
||||
}
|
||||
|
||||
searchStatus.textContent = 'Found ' + resultsFound + ' result(s) in ' + totalPages + ' pages';
|
||||
}
|
||||
|
||||
// Event listeners
|
||||
searchBtn.addEventListener('click', function() {
|
||||
openModal(searchInput.value);
|
||||
});
|
||||
|
||||
searchInput.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Enter') {
|
||||
openModal(searchInput.value);
|
||||
}
|
||||
});
|
||||
|
||||
modalSearchBtn.addEventListener('click', function() {
|
||||
performSearch(modalInput.value);
|
||||
});
|
||||
|
||||
modalInput.addEventListener('keydown', function(e) {
|
||||
if (e.key === 'Enter') {
|
||||
performSearch(modalInput.value);
|
||||
}
|
||||
});
|
||||
|
||||
modalCloseBtn.addEventListener('click', closeModal);
|
||||
|
||||
modal.addEventListener('click', function(e) {
|
||||
if (e.target === modal) {
|
||||
closeModal();
|
||||
}
|
||||
});
|
||||
|
||||
// Check for #search= in URL on page load
|
||||
if (window.location.hash.startsWith('#search=')) {
|
||||
var query = decodeURIComponent(window.location.hash.substring(8));
|
||||
if (query) {
|
||||
searchInput.value = query;
|
||||
openModal(query);
|
||||
}
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
</div>
|
||||
<script>
|
||||
document.querySelectorAll('time[data-timestamp]').forEach(function(el) {
|
||||
const timestamp = el.getAttribute('data-timestamp');
|
||||
const date = new Date(timestamp);
|
||||
const now = new Date();
|
||||
const isToday = date.toDateString() === now.toDateString();
|
||||
const timeStr = date.toLocaleTimeString(undefined, { hour: '2-digit', minute: '2-digit' });
|
||||
if (isToday) { el.textContent = timeStr; }
|
||||
else { el.textContent = date.toLocaleDateString(undefined, { month: 'short', day: 'numeric' }) + ' ' + timeStr; }
|
||||
});
|
||||
document.querySelectorAll('pre.json').forEach(function(el) {
|
||||
let text = el.textContent;
|
||||
text = text.replace(/"([^"]+)":/g, '<span style="color: #ce93d8">"$1"</span>:');
|
||||
text = text.replace(/: "([^"]*)"/g, ': <span style="color: #81d4fa">"$1"</span>');
|
||||
text = text.replace(/: (\d+)/g, ': <span style="color: #ffcc80">$1</span>');
|
||||
text = text.replace(/: (true|false|null)/g, ': <span style="color: #f48fb1">$1</span>');
|
||||
el.innerHTML = text;
|
||||
});
|
||||
document.querySelectorAll('.truncatable').forEach(function(wrapper) {
|
||||
const content = wrapper.querySelector('.truncatable-content');
|
||||
const btn = wrapper.querySelector('.expand-btn');
|
||||
if (content.scrollHeight > 250) {
|
||||
wrapper.classList.add('truncated');
|
||||
btn.addEventListener('click', function() {
|
||||
if (wrapper.classList.contains('truncated')) { wrapper.classList.remove('truncated'); wrapper.classList.add('expanded'); btn.textContent = 'Show less'; }
|
||||
else { wrapper.classList.remove('expanded'); wrapper.classList.add('truncated'); btn.textContent = 'Show more'; }
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
+1450
File diff suppressed because one or more lines are too long
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"binary_path": "/usr/bin/sqlite3",
|
||||
"binary_name": "sqlite3",
|
||||
"display_name": "Command line interface for SQLite 3",
|
||||
"desktop_entry": null,
|
||||
"icon_paths": [
|
||||
"/usr/share/icons/Humanity/mimes/128/libreoffice-oasis-database.svg",
|
||||
"/usr/share/icons/Humanity/mimes/256/libreoffice-oasis-database.svg",
|
||||
"/usr/share/icons/Humanity/mimes/32/libreoffice-oasis-database.svg",
|
||||
"/usr/share/icons/Humanity/mimes/48/text-x-sql.svg",
|
||||
"/usr/share/icons/elementary-xfce/apps/22/office-database.png",
|
||||
"/usr/share/icons/elementary-xfce/apps/32/office-database.png",
|
||||
"/usr/share/icons/elementary-xfce/apps/64/office-database.png",
|
||||
"/usr/share/icons/elementary-xfce/mimes/22/text-x-sql.png"
|
||||
],
|
||||
"version": "3.37.2"
|
||||
}
|
||||
Reference in New Issue
Block a user