From 645e9cb38dd0406fcf544dd186014d680f30370b Mon Sep 17 00:00:00 2001 From: shuki Date: Sat, 7 Mar 2026 05:32:16 +0200 Subject: [PATCH] =?UTF-8?q?Rename=20CLI=20commands:=20targets=E2=86=92sour?= =?UTF-8?q?ces,=20remotes=E2=86=92destinations,=20--target=E2=86=92--sourc?= =?UTF-8?q?e,=20--remote=E2=86=92--destination?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Full rename of all user-facing CLI command names and flags across the entire codebase: bin/gniza, TUI screens, schedule cron generation, README, and DOCUMENTATION. Co-Authored-By: Claude Opus 4.6 --- DOCUMENTATION.md | 90 ++++++++-------- README.md | 38 ++++--- bin/gniza | 66 ++++++------ lib/schedule.sh | 8 +- textual-mcp.log | 215 +++++++++++++++++++++++++++++++++++++++ tui/screens/backup.py | 4 +- tui/screens/remotes.py | 4 +- tui/screens/restore.py | 4 +- tui/screens/retention.py | 2 +- tui/screens/snapshots.py | 4 +- 10 files changed, 324 insertions(+), 111 deletions(-) create mode 100644 textual-mcp.log diff --git a/DOCUMENTATION.md b/DOCUMENTATION.md index 9147815..b785341 100644 --- a/DOCUMENTATION.md +++ b/DOCUMENTATION.md @@ -131,7 +131,7 @@ Each backup creates a **snapshot** — a timestamped directory containing a full **CLI**: ```bash -gniza --cli targets add --name=mysite --folders=/var/www,/etc/nginx +gniza --cli sources add --name=mysite --folders=/var/www,/etc/nginx ``` **Manual**: Create `/targets.d/mysite.conf`. @@ -258,7 +258,7 @@ Common uses: ### Viewing a Source ```bash -gniza --cli targets show --name=mysite +gniza --cli sources show --name=mysite ``` Shows all configured fields including source type details and MySQL settings. @@ -266,7 +266,7 @@ Shows all configured fields including source type details and MySQL settings. ### Deleting a Source ```bash -gniza --cli targets delete --name=mysite +gniza --cli sources delete --name=mysite ``` This removes the config file only. Existing snapshots on destinations are not affected. @@ -281,7 +281,7 @@ This removes the config file only. Existing snapshots on destinations are not af **CLI**: ```bash -gniza --cli remotes add --name=backup-server +gniza --cli destinations add --name=backup-server ``` This creates a config template. Edit it manually or use the TUI to configure. @@ -371,7 +371,7 @@ Requires `rclone`. ### Testing a Destination ```bash -gniza --cli remotes test --name=backup-server +gniza --cli destinations test --name=backup-server ``` Validates connectivity and configuration. For SSH destinations, tests the SSH connection. For S3/GDrive, verifies credentials and access. @@ -379,7 +379,7 @@ Validates connectivity and configuration. For SSH destinations, tests the SSH co ### Checking Disk Usage ```bash -gniza --cli remotes disk-info-short --name=backup-server +gniza --cli destinations disk-info-short --name=backup-server ``` Shows used/total space, free space, and usage percentage. Works with SSH and local destinations. @@ -395,13 +395,13 @@ Shows used/total space, free space, and usage percentage. Works with SSH and loc gniza --cli backup --all # Back up a specific source -gniza --cli backup --target=mysite +gniza --cli backup --source=mysite # Back up a specific source to a specific destination -gniza --cli backup --target=mysite --remote=backup-server +gniza --cli backup --source=mysite --destination=backup-server # Back up multiple sources -gniza --cli backup --target=mysite,databases +gniza --cli backup --source=mysite,databases ``` ### How Backup Works @@ -477,19 +477,19 @@ Each source uses `flock`-based locking to prevent overlapping backups of the sam ```bash # Restore latest snapshot in-place -gniza --cli restore --target=mysite --remote=backup-server +gniza --cli restore --source=mysite --destination=backup-server # Restore a specific snapshot -gniza --cli restore --target=mysite --remote=backup-server --snapshot=2026-03-07T020000 +gniza --cli restore --source=mysite --destination=backup-server --snapshot=2026-03-07T020000 # Restore to a custom directory -gniza --cli restore --target=mysite --remote=backup-server --dest=/tmp/restore +gniza --cli restore --source=mysite --destination=backup-server --dest=/tmp/restore # Restore a single folder from a snapshot -gniza --cli restore --target=mysite --remote=backup-server --snapshot=2026-03-07T020000 --folder=/var/www +gniza --cli restore --source=mysite --destination=backup-server --snapshot=2026-03-07T020000 --folder=/var/www # Skip MySQL restore -gniza --cli restore --target=mysite --remote=backup-server --skip-mysql +gniza --cli restore --source=mysite --destination=backup-server --skip-mysql ``` ### Restore Behavior @@ -514,19 +514,19 @@ Navigate to Restore, select a source, destination, and snapshot, choose in-place gniza --cli snapshots list # List snapshots for a specific source -gniza --cli snapshots list --target=mysite +gniza --cli snapshots list --source=mysite # List snapshots on a specific destination -gniza --cli snapshots list --remote=backup-server +gniza --cli snapshots list --destination=backup-server # Both -gniza --cli snapshots list --target=mysite --remote=backup-server +gniza --cli snapshots list --source=mysite --destination=backup-server ``` ### Browsing Snapshot Contents ```bash -gniza --cli snapshots browse --target=mysite --snapshot=2026-03-07T020000 +gniza --cli snapshots browse --source=mysite --snapshot=2026-03-07T020000 ``` Lists all files in the snapshot. @@ -579,10 +579,10 @@ Retention runs automatically after each successful backup. The oldest snapshots gniza --cli retention --all # Enforce for a specific source -gniza --cli retention --target=mysite +gniza --cli retention --source=mysite # Enforce on a specific destination -gniza --cli retention --remote=backup-server +gniza --cli retention --destination=backup-server ``` ### Snapshot Pinning @@ -704,7 +704,7 @@ Default options ensure consistent dumps for InnoDB tables and include stored pro During restore, MySQL dumps from `_mysql/` are automatically restored. Use `--skip-mysql` to skip: ```bash -gniza --cli restore --target=mysite --remote=backup-server --skip-mysql +gniza --cli restore --source=mysite --destination=backup-server --skip-mysql ``` In the TUI, toggle the "Restore MySQL databases" switch. @@ -854,56 +854,56 @@ Launch with `gniza` (no arguments). Requires Python 3 and Textual. ### Sources ```bash -gniza --cli targets list # List all sources -gniza --cli targets add --name=NAME --folders=PATHS # Create a source -gniza --cli targets delete --name=NAME # Delete a source -gniza --cli targets show --name=NAME # Show source details +gniza --cli sources list # List all sources +gniza --cli sources add --name=NAME --folders=PATHS # Create a source +gniza --cli sources delete --name=NAME # Delete a source +gniza --cli sources show --name=NAME # Show source details ``` ### Destinations ```bash -gniza --cli remotes list # List all destinations -gniza --cli remotes add --name=NAME # Create a destination -gniza --cli remotes delete --name=NAME # Delete a destination -gniza --cli remotes show --name=NAME # Show destination details -gniza --cli remotes test --name=NAME # Test connectivity -gniza --cli remotes disk-info-short --name=NAME # Show disk usage +gniza --cli destinations list # List all destinations +gniza --cli destinations add --name=NAME # Create a destination +gniza --cli destinations delete --name=NAME # Delete a destination +gniza --cli destinations show --name=NAME # Show destination details +gniza --cli destinations test --name=NAME # Test connectivity +gniza --cli destinations disk-info-short --name=NAME # Show disk usage ``` ### Backup ```bash gniza --cli backup --all # Back up everything -gniza --cli backup --target=NAME # Back up one source -gniza --cli backup --target=NAME --remote=NAME # Source to specific destination -gniza --cli backup --target=a,b,c # Multiple sources +gniza --cli backup --source=NAME # Back up one source +gniza --cli backup --source=NAME --destination=NAME # Source to specific destination +gniza --cli backup --source=a,b,c # Multiple sources ``` ### Restore ```bash -gniza --cli restore --target=NAME --remote=NAME --snapshot=TS -gniza --cli restore --target=NAME --remote=NAME --dest=/tmp/restore -gniza --cli restore --target=NAME --remote=NAME --folder=/var/www -gniza --cli restore --target=NAME --remote=NAME --skip-mysql +gniza --cli restore --source=NAME --destination=NAME --snapshot=TS +gniza --cli restore --source=NAME --destination=NAME --dest=/tmp/restore +gniza --cli restore --source=NAME --destination=NAME --folder=/var/www +gniza --cli restore --source=NAME --destination=NAME --skip-mysql ``` ### Snapshots ```bash gniza --cli snapshots list # All snapshots -gniza --cli snapshots list --target=NAME # For one source -gniza --cli snapshots list --remote=NAME # On one destination -gniza --cli snapshots browse --target=NAME --snapshot=TS +gniza --cli snapshots list --source=NAME # For one source +gniza --cli snapshots list --destination=NAME # On one destination +gniza --cli snapshots browse --source=NAME --snapshot=TS ``` ### Retention ```bash gniza --cli retention --all # Enforce everywhere -gniza --cli retention --target=NAME # One source -gniza --cli retention --remote=NAME # One destination +gniza --cli retention --source=NAME # One source +gniza --cli retention --destination=NAME # One destination ``` ### Scheduling @@ -1004,7 +1004,7 @@ All global settings are in `gniza.conf` in the config directory. ### Credential Handling - Passwords are never logged or displayed in output -- `targets show` and `remotes show` mask passwords with `****` +- `sources show` and `destinations show` mask passwords with `****` - MySQL passwords are passed via `MYSQL_PWD` environment variable - SSH passwords are passed via `sshpass`, not command-line arguments @@ -1040,7 +1040,7 @@ gniza --cli --debug backup --all Create at least one destination in `/remotes.d/`. **SSH connection failures** -- Test with: `gniza --cli remotes test --name=` +- Test with: `gniza --cli destinations test --name=` - Check that the SSH key exists and has correct permissions (600) - Verify the remote host is reachable: `ssh -p PORT user@host` - If using password auth, ensure `sshpass` is installed diff --git a/README.md b/README.md index f043f3a..0cb73c5 100644 --- a/README.md +++ b/README.md @@ -74,16 +74,14 @@ The installer detects dependencies, sets up config directories, and optionally l gniza # Or use the CLI to add a source and destination -gniza --cli targets add --name=mysite --folders=/var/www,/etc/nginx -gniza --cli remotes add --name=backup-server +gniza --cli sources add --name=mysite --folders=/var/www,/etc/nginx +gniza --cli destinations add --name=backup-server # Run a backup -gniza --cli backup --target=mysite +gniza --cli backup --source=mysite gniza --cli backup --all ``` -> **Note**: The CLI uses `targets` for sources and `remotes` for destinations. The TUI uses the friendlier "Sources" and "Destinations" labels. - ## CLI Reference ``` @@ -97,27 +95,27 @@ Options: --version Show version Sources: - targets list List all configured sources - targets add --name=NAME --folders=PATHS - targets delete --name=NAME - targets show --name=NAME + sources list List all configured sources + sources add --name=NAME --folders=PATHS + sources delete --name=NAME + sources show --name=NAME Destinations: - remotes list List all configured destinations - remotes add --name=NAME - remotes delete --name=NAME - remotes show --name=NAME - remotes test --name=NAME Validate connectivity - remotes disk-info-short --name=NAME Show disk usage + destinations list List all configured destinations + destinations add --name=NAME + destinations delete --name=NAME + destinations show --name=NAME + destinations test --name=NAME Validate connectivity + destinations disk-info-short --name=NAME Show disk usage Operations: - backup [--target=NAME] [--remote=NAME] [--all] - restore --target=NAME --snapshot=TS [--remote=NAME] [--dest=DIR] [--skip-mysql] - retention [--target=NAME] [--remote=NAME] [--all] + backup [--source=NAME] [--destination=NAME] [--all] + restore --source=NAME --snapshot=TS [--destination=NAME] [--dest=DIR] [--skip-mysql] + retention [--source=NAME] [--destination=NAME] [--all] Snapshots: - snapshots list [--target=NAME] [--remote=NAME] - snapshots browse --target=NAME --snapshot=TS [--remote=NAME] + snapshots list [--source=NAME] [--destination=NAME] + snapshots browse --source=NAME --snapshot=TS [--destination=NAME] Scheduling: schedule install | show | remove diff --git a/bin/gniza b/bin/gniza index 06bb3df..0e6d23f 100755 --- a/bin/gniza +++ b/bin/gniza @@ -43,8 +43,8 @@ Options: --version Show version Commands: - targets Manage sources (list, add, delete, show) - remotes Manage destinations (list, add, delete, show, test) + sources Manage sources (list, add, delete, show) + destinations Manage destinations (list, add, delete, show, test) backup Run backup restore Restore from a snapshot snapshots List or browse snapshots @@ -74,41 +74,41 @@ Options: --version Show version Sources (what to back up): - targets list List all configured sources - targets add --name=NAME --folders=PATHS + sources list List all configured sources + sources add --name=NAME --folders=PATHS Create a new source - targets delete --name=NAME Delete a source - targets show --name=NAME Show full source configuration + sources delete --name=NAME Delete a source + sources show --name=NAME Show full source configuration Destinations (where to store backups): - remotes list List all configured destinations - remotes add --name=NAME Create a new destination (edit config manually or via TUI) - remotes delete --name=NAME Delete a destination - remotes show --name=NAME Show full destination configuration - remotes test --name=NAME Validate destination connectivity - remotes disk-info-short --name=NAME Show destination disk usage (used/total/free) + destinations list List all configured destinations + destinations add --name=NAME Create a new destination (edit config manually or via TUI) + destinations delete --name=NAME Delete a destination + destinations show --name=NAME Show full destination configuration + destinations test --name=NAME Validate destination connectivity + destinations disk-info-short --name=NAME Show destination disk usage (used/total/free) Operations: - backup [--target=NAME] [--remote=NAME] [--all] + backup [--source=NAME] [--destination=NAME] [--all] Run backup. If no source is specified, all sources are backed up. - Use --target=a,b,c to back up multiple sources. - Use --remote=NAME to target a specific destination. + Use --source=a,b,c to back up multiple sources. + Use --destination=NAME to target a specific destination. - restore --target=NAME --snapshot=TS [--remote=NAME] [--dest=DIR] + restore --source=NAME --snapshot=TS [--destination=NAME] [--dest=DIR] [--folder=PATH] [--skip-mysql] Restore from a snapshot. Use --dest for custom restore location. Use --folder to restore a single directory from the snapshot. Use --skip-mysql to skip MySQL database restore. - retention [--target=NAME] [--remote=NAME] [--all] + retention [--source=NAME] [--destination=NAME] [--all] Enforce snapshot retention policies. Deletes snapshots beyond the configured retention count (oldest first, pinned preserved). Snapshots: - snapshots list [--target=NAME] [--remote=NAME] + snapshots list [--source=NAME] [--destination=NAME] List available snapshots. Filter by source and/or destination. - snapshots browse --target=NAME --snapshot=TS [--remote=NAME] + snapshots browse --source=NAME --snapshot=TS [--destination=NAME] List all files in a specific snapshot. Scheduling: @@ -236,8 +236,8 @@ run_cli() { case "${SUBCOMMAND:-}" in backup) local target="" remote="" all=false - target=$(_parse_flag "--target" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true - remote=$(_parse_flag "--remote" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true + target=$(_parse_flag "--source" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true + remote=$(_parse_flag "--destination" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true _has_flag "--all" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}" && all=true trap release_all_target_locks EXIT @@ -264,9 +264,9 @@ run_cli() { restore) local target="" snapshot="" remote="" dest="" folder="" - target=$(_parse_flag "--target" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true + target=$(_parse_flag "--source" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true snapshot=$(_parse_flag "--snapshot" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true - remote=$(_parse_flag "--remote" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true + remote=$(_parse_flag "--destination" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true dest=$(_parse_flag "--dest" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true folder=$(_parse_flag "--folder" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true @@ -278,7 +278,7 @@ run_cli() { done [[ -n "$skip_mysql" ]] && export SKIP_MYSQL_RESTORE="yes" - [[ -z "$target" ]] && die "restore requires --target=NAME" + [[ -z "$target" ]] && die "restore requires --source=NAME" if [[ -z "$remote" ]]; then remote=$(list_remotes | head -1) @@ -292,7 +292,7 @@ run_cli() { fi ;; - targets) + sources) local action="${SUBCMD_ARGS[0]:-list}" local name="" folders="" name=$(_parse_flag "--name" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true @@ -377,7 +377,7 @@ run_cli() { esac ;; - remotes) + destinations) local action="${SUBCMD_ARGS[0]:-list}" local name="" name=$(_parse_flag "--name" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true @@ -460,8 +460,8 @@ run_cli() { snapshots) local action="${SUBCMD_ARGS[0]:-list}" local target="" remote="" - target=$(_parse_flag "--target" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true - remote=$(_parse_flag "--remote" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true + target=$(_parse_flag "--source" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true + remote=$(_parse_flag "--destination" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true case "$action" in list) @@ -484,7 +484,7 @@ run_cli() { _restore_remote_globals ;; browse) - [[ -z "$target" ]] && die "browse requires --target=NAME" + [[ -z "$target" ]] && die "browse requires --source=NAME" local snapshot="" snapshot=$(_parse_flag "--snapshot" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true [[ -z "$snapshot" ]] && die "browse requires --snapshot=TS" @@ -502,8 +502,8 @@ run_cli() { retention) local target="" remote="" all=false - target=$(_parse_flag "--target" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true - remote=$(_parse_flag "--remote" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true + target=$(_parse_flag "--source" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true + remote=$(_parse_flag "--destination" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true _has_flag "--all" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}" && all=true if [[ -z "$remote" ]]; then @@ -560,8 +560,8 @@ run_cli() { scheduled-run) local sched_name="" target="" remote="" sched_name=$(_parse_flag "--schedule" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true - target=$(_parse_flag "--target" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true - remote=$(_parse_flag "--remote" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true + target=$(_parse_flag "--source" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true + remote=$(_parse_flag "--destination" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true [[ -z "$sched_name" ]] && die "scheduled-run requires --schedule=NAME" trap release_all_target_locks EXIT diff --git a/lib/schedule.sh b/lib/schedule.sh index 754df55..80e2e8b 100644 --- a/lib/schedule.sh +++ b/lib/schedule.sh @@ -6,8 +6,8 @@ # SCHEDULE_TIME="HH:MM" # SCHEDULE_DAY="" # dow (0-6) for weekly, dom (1-28) for monthly # SCHEDULE_CRON="" # full 5-field cron expr for custom -# REMOTES="" # comma-separated remote names (empty = all) -# TARGETS="" # comma-separated target names (empty = all) +# DESTINATIONS="" # comma-separated remote names (empty = all) +# SOURCES="" # comma-separated target names (empty = all) # # Cron lines are tagged with "# gniza4linux:" for clean install/remove. @@ -179,10 +179,10 @@ build_cron_line() { local bin_path; bin_path=$(_gniza4linux_bin) local extra_flags="" if [[ -n "$SCHEDULE_REMOTES" ]]; then - extra_flags+=" --remote=$SCHEDULE_REMOTES" + extra_flags+=" --destination=$SCHEDULE_REMOTES" fi if [[ -n "$SCHEDULE_TARGETS" ]]; then - extra_flags+=" --target=$SCHEDULE_TARGETS" + extra_flags+=" --source=$SCHEDULE_TARGETS" fi echo "${cron_expr} PATH=\"/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\" ${bin_path} scheduled-run --schedule=${name}${extra_flags} >>\"${LOG_DIR}/cron.log\" 2>&1" diff --git a/textual-mcp.log b/textual-mcp.log new file mode 100644 index 0000000..d477c4e --- /dev/null +++ b/textual-mcp.log @@ -0,0 +1,215 @@ +{"timestamp": "2026-03-05 21:23:53.404333+00:00", "level": "INFO", "logger": "textual_mcp.validation_tools", "message": "Registered validation tools: validate_tcss, validate_tcss_file, validate_inline_styles, check_selector", "module": "validation_tools", "function": "register_validation_tools", "line": 360, "taskName": null} +{"timestamp": "2026-03-05 21:23:53.404389+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered validation tools", "module": "server", "function": "_register_tools", "line": 53, "taskName": null} +{"timestamp": "2026-03-05 21:23:53.404775+00:00", "level": "INFO", "logger": "textual_mcp.analysis_tools", "message": "Registered analysis tools: analyze_selectors, extract_css_variables, detect_style_conflicts", "module": "analysis_tools", "function": "register_analysis_tools", "line": 99, "taskName": null} +{"timestamp": "2026-03-05 21:23:53.404809+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered analysis tools", "module": "server", "function": "_register_tools", "line": 56, "taskName": null} +{"timestamp": "2026-03-05 21:23:53.406338+00:00", "level": "INFO", "logger": "textual_mcp.widget_tools", "message": "Registered widget tools: generate_widget, list_widget_types, list_event_handlers, validate_widget_name", "module": "widget_tools", "function": "register_widget_tools", "line": 343, "taskName": null} +{"timestamp": "2026-03-05 21:23:53.406373+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered widget tools", "module": "server", "function": "_register_tools", "line": 59, "taskName": null} +{"timestamp": "2026-03-05 21:23:53.407350+00:00", "level": "INFO", "logger": "textual_mcp.layout_tools", "message": "Registered layout tools: generate_grid_layout", "module": "layout_tools", "function": "register_layout_tools", "line": 139, "taskName": null} +{"timestamp": "2026-03-05 21:23:53.407381+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered layout tools", "module": "server", "function": "_register_tools", "line": 62, "taskName": null} +{"timestamp": "2026-03-05 21:23:53.410993+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Registered documentation tools: search_textual_docs, index_textual_docs, search_textual_code_examples, get_css_property_info, list_css_properties", "module": "documentation_tools", "function": "register_documentation_tools", "line": 613, "taskName": null} +{"timestamp": "2026-03-05 21:23:53.411033+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered documentation tools", "module": "server", "function": "_register_tools", "line": 65, "taskName": null} +{"timestamp": "2026-03-05 21:24:05.699004+00:00", "level": "INFO", "logger": "faiss.loader", "message": "Loading faiss with AVX2 support.", "module": "loader", "function": "", "line": 125, "taskName": null} +{"timestamp": "2026-03-05 21:24:05.790357+00:00", "level": "INFO", "logger": "faiss.loader", "message": "Successfully loaded faiss with AVX2 support.", "module": "loader", "function": "", "line": 127, "taskName": null} +{"timestamp": "2026-03-05 21:24:05.799673+00:00", "level": "INFO", "logger": "faiss", "message": "Failed to load GPU Faiss: name 'GpuIndexIVFFlat' is not defined. Will not load constructor refs for GPU indexes. This is only an error if you're trying to use GPU Faiss.", "module": "__init__", "function": "", "line": 174, "taskName": null} +{"timestamp": "2026-03-06 06:02:21.919660+00:00", "level": "INFO", "logger": "textual_mcp.validation_tools", "message": "Registered validation tools: validate_tcss, validate_tcss_file, validate_inline_styles, check_selector", "module": "validation_tools", "function": "register_validation_tools", "line": 360, "taskName": null} +{"timestamp": "2026-03-06 06:02:21.919723+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered validation tools", "module": "server", "function": "_register_tools", "line": 53, "taskName": null} +{"timestamp": "2026-03-06 06:02:21.920155+00:00", "level": "INFO", "logger": "textual_mcp.analysis_tools", "message": "Registered analysis tools: analyze_selectors, extract_css_variables, detect_style_conflicts", "module": "analysis_tools", "function": "register_analysis_tools", "line": 99, "taskName": null} +{"timestamp": "2026-03-06 06:02:21.920197+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered analysis tools", "module": "server", "function": "_register_tools", "line": 56, "taskName": null} +{"timestamp": "2026-03-06 06:02:21.921779+00:00", "level": "INFO", "logger": "textual_mcp.widget_tools", "message": "Registered widget tools: generate_widget, list_widget_types, list_event_handlers, validate_widget_name", "module": "widget_tools", "function": "register_widget_tools", "line": 343, "taskName": null} +{"timestamp": "2026-03-06 06:02:21.921815+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered widget tools", "module": "server", "function": "_register_tools", "line": 59, "taskName": null} +{"timestamp": "2026-03-06 06:02:21.922877+00:00", "level": "INFO", "logger": "textual_mcp.layout_tools", "message": "Registered layout tools: generate_grid_layout", "module": "layout_tools", "function": "register_layout_tools", "line": 139, "taskName": null} +{"timestamp": "2026-03-06 06:02:21.922910+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered layout tools", "module": "server", "function": "_register_tools", "line": 62, "taskName": null} +{"timestamp": "2026-03-06 06:02:21.926075+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Registered documentation tools: search_textual_docs, index_textual_docs, search_textual_code_examples, get_css_property_info, list_css_properties", "module": "documentation_tools", "function": "register_documentation_tools", "line": 613, "taskName": null} +{"timestamp": "2026-03-06 06:02:21.926112+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered documentation tools", "module": "server", "function": "_register_tools", "line": 65, "taskName": null} +{"timestamp": "2026-03-06 06:02:27.672642+00:00", "level": "INFO", "logger": "faiss.loader", "message": "Loading faiss with AVX2 support.", "module": "loader", "function": "", "line": 125, "taskName": null} +{"timestamp": "2026-03-06 06:02:27.695574+00:00", "level": "INFO", "logger": "faiss.loader", "message": "Successfully loaded faiss with AVX2 support.", "module": "loader", "function": "", "line": 127, "taskName": null} +{"timestamp": "2026-03-06 06:02:27.698070+00:00", "level": "INFO", "logger": "faiss", "message": "Failed to load GPU Faiss: name 'GpuIndexIVFFlat' is not defined. Will not load constructor refs for GPU indexes. This is only an error if you're trying to use GPU Faiss.", "module": "__init__", "function": "", "line": 174, "taskName": null} +{"timestamp": "2026-03-06 18:51:21.615569+00:00", "level": "INFO", "logger": "textual_mcp.validation_tools", "message": "Registered validation tools: validate_tcss, validate_tcss_file, validate_inline_styles, check_selector", "module": "validation_tools", "function": "register_validation_tools", "line": 360, "taskName": null} +{"timestamp": "2026-03-06 18:51:21.615822+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered validation tools", "module": "server", "function": "_register_tools", "line": 53, "taskName": null} +{"timestamp": "2026-03-06 18:51:21.616233+00:00", "level": "INFO", "logger": "textual_mcp.analysis_tools", "message": "Registered analysis tools: analyze_selectors, extract_css_variables, detect_style_conflicts", "module": "analysis_tools", "function": "register_analysis_tools", "line": 99, "taskName": null} +{"timestamp": "2026-03-06 18:51:21.616268+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered analysis tools", "module": "server", "function": "_register_tools", "line": 56, "taskName": null} +{"timestamp": "2026-03-06 18:51:21.617856+00:00", "level": "INFO", "logger": "textual_mcp.widget_tools", "message": "Registered widget tools: generate_widget, list_widget_types, list_event_handlers, validate_widget_name", "module": "widget_tools", "function": "register_widget_tools", "line": 343, "taskName": null} +{"timestamp": "2026-03-06 18:51:21.617899+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered widget tools", "module": "server", "function": "_register_tools", "line": 59, "taskName": null} +{"timestamp": "2026-03-06 18:51:21.618975+00:00", "level": "INFO", "logger": "textual_mcp.layout_tools", "message": "Registered layout tools: generate_grid_layout", "module": "layout_tools", "function": "register_layout_tools", "line": 139, "taskName": null} +{"timestamp": "2026-03-06 18:51:21.619009+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered layout tools", "module": "server", "function": "_register_tools", "line": 62, "taskName": null} +{"timestamp": "2026-03-06 18:51:21.622202+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Registered documentation tools: search_textual_docs, index_textual_docs, search_textual_code_examples, get_css_property_info, list_css_properties", "module": "documentation_tools", "function": "register_documentation_tools", "line": 613, "taskName": null} +{"timestamp": "2026-03-06 18:51:21.622241+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered documentation tools", "module": "server", "function": "_register_tools", "line": 65, "taskName": null} +{"timestamp": "2026-03-06 18:51:27.209804+00:00", "level": "INFO", "logger": "faiss.loader", "message": "Loading faiss with AVX2 support.", "module": "loader", "function": "", "line": 125, "taskName": null} +{"timestamp": "2026-03-06 18:51:27.236483+00:00", "level": "INFO", "logger": "faiss.loader", "message": "Successfully loaded faiss with AVX2 support.", "module": "loader", "function": "", "line": 127, "taskName": null} +{"timestamp": "2026-03-06 18:51:27.240377+00:00", "level": "INFO", "logger": "faiss", "message": "Failed to load GPU Faiss: name 'GpuIndexIVFFlat' is not defined. Will not load constructor refs for GPU indexes. This is only an error if you're trying to use GPU Faiss.", "module": "__init__", "function": "", "line": 174, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.861575+00:00", "level": "INFO", "logger": "textual_mcp.textual_docs_memory", "message": "Initialized VectorDB with embeddings: BAAI/bge-base-en-v1.5, persisting to: data/textual_docs.db", "module": "memory", "function": "__init__", "line": 45, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.861647+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Auto-indexing documentation on first use", "module": "documentation_tools", "function": "get_docs_memory", "line": 45, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.861696+00:00", "level": "WARNING", "logger": "textual_mcp.server", "message": "Failed to initialize documentation search: no running event loop", "module": "server", "function": "__init__", "line": 45, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.865661+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Textual MCP Server initialized", "module": "server", "function": "__init__", "line": 47, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.870751+00:00", "level": "INFO", "logger": "textual_mcp.validation_tools", "message": "Registered validation tools: validate_tcss, validate_tcss_file, validate_inline_styles, check_selector", "module": "validation_tools", "function": "register_validation_tools", "line": 360, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.870793+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered validation tools", "module": "server", "function": "_register_tools", "line": 53, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.871228+00:00", "level": "INFO", "logger": "textual_mcp.analysis_tools", "message": "Registered analysis tools: analyze_selectors, extract_css_variables, detect_style_conflicts", "module": "analysis_tools", "function": "register_analysis_tools", "line": 99, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.871277+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered analysis tools", "module": "server", "function": "_register_tools", "line": 56, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.873445+00:00", "level": "INFO", "logger": "textual_mcp.widget_tools", "message": "Registered widget tools: generate_widget, list_widget_types, list_event_handlers, validate_widget_name", "module": "widget_tools", "function": "register_widget_tools", "line": 343, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.873483+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered widget tools", "module": "server", "function": "_register_tools", "line": 59, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.874495+00:00", "level": "INFO", "logger": "textual_mcp.layout_tools", "message": "Registered layout tools: generate_grid_layout", "module": "layout_tools", "function": "register_layout_tools", "line": 139, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.874532+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered layout tools", "module": "server", "function": "_register_tools", "line": 62, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.877548+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Registered documentation tools: search_textual_docs, index_textual_docs, search_textual_code_examples, get_css_property_info, list_css_properties", "module": "documentation_tools", "function": "register_documentation_tools", "line": 613, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.877586+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered documentation tools", "module": "server", "function": "_register_tools", "line": 65, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.877622+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Documentation search will be indexed on first use", "module": "server", "function": "__init__", "line": 41, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.877645+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Textual MCP Server initialized", "module": "server", "function": "__init__", "line": 47, "taskName": null} +{"timestamp": "2026-03-06 18:51:29.900602+00:00", "level": "INFO", "logger": "mcp.server.lowlevel.server", "message": "Processing request of type ListToolsRequest", "module": "server", "function": "_handle_request", "line": 625, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-06 18:51:29.901623+00:00", "level": "INFO", "logger": "mcp.server.lowlevel.server", "message": "Processing request of type ListPromptsRequest", "module": "server", "function": "_handle_request", "line": 625, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-06 18:51:29.902193+00:00", "level": "INFO", "logger": "mcp.server.lowlevel.server", "message": "Processing request of type ListResourcesRequest", "module": "server", "function": "_handle_request", "line": 625, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-06 20:04:55.207922+00:00", "level": "INFO", "logger": "textual_mcp.validation_tools", "message": "Registered validation tools: validate_tcss, validate_tcss_file, validate_inline_styles, check_selector", "module": "validation_tools", "function": "register_validation_tools", "line": 360, "taskName": null} +{"timestamp": "2026-03-06 20:04:55.207987+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered validation tools", "module": "server", "function": "_register_tools", "line": 53, "taskName": null} +{"timestamp": "2026-03-06 20:04:55.208407+00:00", "level": "INFO", "logger": "textual_mcp.analysis_tools", "message": "Registered analysis tools: analyze_selectors, extract_css_variables, detect_style_conflicts", "module": "analysis_tools", "function": "register_analysis_tools", "line": 99, "taskName": null} +{"timestamp": "2026-03-06 20:04:55.208446+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered analysis tools", "module": "server", "function": "_register_tools", "line": 56, "taskName": null} +{"timestamp": "2026-03-06 20:04:55.210092+00:00", "level": "INFO", "logger": "textual_mcp.widget_tools", "message": "Registered widget tools: generate_widget, list_widget_types, list_event_handlers, validate_widget_name", "module": "widget_tools", "function": "register_widget_tools", "line": 343, "taskName": null} +{"timestamp": "2026-03-06 20:04:55.210146+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered widget tools", "module": "server", "function": "_register_tools", "line": 59, "taskName": null} +{"timestamp": "2026-03-06 20:04:55.211226+00:00", "level": "INFO", "logger": "textual_mcp.layout_tools", "message": "Registered layout tools: generate_grid_layout", "module": "layout_tools", "function": "register_layout_tools", "line": 139, "taskName": null} +{"timestamp": "2026-03-06 20:04:55.211257+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered layout tools", "module": "server", "function": "_register_tools", "line": 62, "taskName": null} +{"timestamp": "2026-03-06 20:04:55.214289+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Registered documentation tools: search_textual_docs, index_textual_docs, search_textual_code_examples, get_css_property_info, list_css_properties", "module": "documentation_tools", "function": "register_documentation_tools", "line": 613, "taskName": null} +{"timestamp": "2026-03-06 20:04:55.214326+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered documentation tools", "module": "server", "function": "_register_tools", "line": 65, "taskName": null} +{"timestamp": "2026-03-06 20:05:00.618655+00:00", "level": "INFO", "logger": "faiss.loader", "message": "Loading faiss with AVX2 support.", "module": "loader", "function": "", "line": 125, "taskName": null} +{"timestamp": "2026-03-06 20:05:00.641939+00:00", "level": "INFO", "logger": "faiss.loader", "message": "Successfully loaded faiss with AVX2 support.", "module": "loader", "function": "", "line": 127, "taskName": null} +{"timestamp": "2026-03-06 20:05:00.644263+00:00", "level": "INFO", "logger": "faiss", "message": "Failed to load GPU Faiss: name 'GpuIndexIVFFlat' is not defined. Will not load constructor refs for GPU indexes. This is only an error if you're trying to use GPU Faiss.", "module": "__init__", "function": "", "line": 174, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.893641+00:00", "level": "INFO", "logger": "textual_mcp.textual_docs_memory", "message": "Initialized VectorDB with embeddings: BAAI/bge-base-en-v1.5, persisting to: data/textual_docs.db", "module": "memory", "function": "__init__", "line": 45, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.893709+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Auto-indexing documentation on first use", "module": "documentation_tools", "function": "get_docs_memory", "line": 45, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.893746+00:00", "level": "WARNING", "logger": "textual_mcp.server", "message": "Failed to initialize documentation search: no running event loop", "module": "server", "function": "__init__", "line": 45, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.894551+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Textual MCP Server initialized", "module": "server", "function": "__init__", "line": 47, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.900638+00:00", "level": "INFO", "logger": "textual_mcp.validation_tools", "message": "Registered validation tools: validate_tcss, validate_tcss_file, validate_inline_styles, check_selector", "module": "validation_tools", "function": "register_validation_tools", "line": 360, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.900679+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered validation tools", "module": "server", "function": "_register_tools", "line": 53, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.901136+00:00", "level": "INFO", "logger": "textual_mcp.analysis_tools", "message": "Registered analysis tools: analyze_selectors, extract_css_variables, detect_style_conflicts", "module": "analysis_tools", "function": "register_analysis_tools", "line": 99, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.901166+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered analysis tools", "module": "server", "function": "_register_tools", "line": 56, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.902781+00:00", "level": "INFO", "logger": "textual_mcp.widget_tools", "message": "Registered widget tools: generate_widget, list_widget_types, list_event_handlers, validate_widget_name", "module": "widget_tools", "function": "register_widget_tools", "line": 343, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.902820+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered widget tools", "module": "server", "function": "_register_tools", "line": 59, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.903839+00:00", "level": "INFO", "logger": "textual_mcp.layout_tools", "message": "Registered layout tools: generate_grid_layout", "module": "layout_tools", "function": "register_layout_tools", "line": 139, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.903871+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered layout tools", "module": "server", "function": "_register_tools", "line": 62, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.907029+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Registered documentation tools: search_textual_docs, index_textual_docs, search_textual_code_examples, get_css_property_info, list_css_properties", "module": "documentation_tools", "function": "register_documentation_tools", "line": 613, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.907075+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered documentation tools", "module": "server", "function": "_register_tools", "line": 65, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.907111+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Documentation search will be indexed on first use", "module": "server", "function": "__init__", "line": 41, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.907137+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Textual MCP Server initialized", "module": "server", "function": "__init__", "line": 47, "taskName": null} +{"timestamp": "2026-03-06 20:05:02.918843+00:00", "level": "INFO", "logger": "mcp.server.lowlevel.server", "message": "Processing request of type ListToolsRequest", "module": "server", "function": "_handle_request", "line": 625, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-06 20:05:02.920421+00:00", "level": "INFO", "logger": "mcp.server.lowlevel.server", "message": "Processing request of type ListPromptsRequest", "module": "server", "function": "_handle_request", "line": 625, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-06 20:05:02.920968+00:00", "level": "INFO", "logger": "mcp.server.lowlevel.server", "message": "Processing request of type ListResourcesRequest", "module": "server", "function": "_handle_request", "line": 625, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-06 20:17:15.195632+00:00", "level": "INFO", "logger": "textual_mcp.validation_tools", "message": "Registered validation tools: validate_tcss, validate_tcss_file, validate_inline_styles, check_selector", "module": "validation_tools", "function": "register_validation_tools", "line": 360, "taskName": null} +{"timestamp": "2026-03-06 20:17:15.195967+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered validation tools", "module": "server", "function": "_register_tools", "line": 53, "taskName": null} +{"timestamp": "2026-03-06 20:17:15.198225+00:00", "level": "INFO", "logger": "textual_mcp.analysis_tools", "message": "Registered analysis tools: analyze_selectors, extract_css_variables, detect_style_conflicts", "module": "analysis_tools", "function": "register_analysis_tools", "line": 99, "taskName": null} +{"timestamp": "2026-03-06 20:17:15.198263+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered analysis tools", "module": "server", "function": "_register_tools", "line": 56, "taskName": null} +{"timestamp": "2026-03-06 20:17:15.205964+00:00", "level": "INFO", "logger": "textual_mcp.widget_tools", "message": "Registered widget tools: generate_widget, list_widget_types, list_event_handlers, validate_widget_name", "module": "widget_tools", "function": "register_widget_tools", "line": 343, "taskName": null} +{"timestamp": "2026-03-06 20:17:15.206013+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered widget tools", "module": "server", "function": "_register_tools", "line": 59, "taskName": null} +{"timestamp": "2026-03-06 20:17:15.212916+00:00", "level": "INFO", "logger": "textual_mcp.layout_tools", "message": "Registered layout tools: generate_grid_layout", "module": "layout_tools", "function": "register_layout_tools", "line": 139, "taskName": null} +{"timestamp": "2026-03-06 20:17:15.212964+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered layout tools", "module": "server", "function": "_register_tools", "line": 62, "taskName": null} +{"timestamp": "2026-03-06 20:17:15.224199+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Registered documentation tools: search_textual_docs, index_textual_docs, search_textual_code_examples, get_css_property_info, list_css_properties", "module": "documentation_tools", "function": "register_documentation_tools", "line": 613, "taskName": null} +{"timestamp": "2026-03-06 20:17:15.224617+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered documentation tools", "module": "server", "function": "_register_tools", "line": 65, "taskName": null} +{"timestamp": "2026-03-06 20:17:15.225647+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Documentation search will be indexed on first use", "module": "server", "function": "__init__", "line": 41, "taskName": null} +{"timestamp": "2026-03-06 20:17:15.225674+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Textual MCP Server initialized", "module": "server", "function": "__init__", "line": 47, "taskName": null} +{"timestamp": "2026-03-06 21:25:17.545813+00:00", "level": "INFO", "logger": "mcp.server.lowlevel.server", "message": "Processing request of type CallToolRequest", "module": "server", "function": "_handle_request", "line": 625, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-06 21:25:17.610864+00:00", "level": "INFO", "logger": "textual_mcp.tools", "message": "Tool execution started", "module": "logging_config", "function": "log_tool_execution", "line": 149, "taskName": "mcp.server.lowlevel.server.Server._handle_message", "tool_name": "search_textual_docs", "parameters": {"query": "two column layout horizontal containers", "limit": 10, "content_type": null}, "event": "tool_start"} +{"timestamp": "2026-03-06 21:25:18.205094+00:00", "level": "ERROR", "logger": "textual_mcp.tools", "message": "Tool execution failed", "module": "logging_config", "function": "log_tool_completion", "line": 174, "taskName": "mcp.server.lowlevel.server.Server._handle_message", "tool_name": "search_textual_docs", "success": false, "duration_ms": 595.49, "event": "tool_complete", "error": "Documentation search failed: tuple index out of range"} +{"timestamp": "2026-03-06 21:25:18.458587+00:00", "level": "INFO", "logger": "mcp.server.lowlevel.server", "message": "Warning: FutureWarning: `encoder_attention_mask` is deprecated and will be removed in version 4.55.0 for `BertSdpaSelfAttention.forward`.", "module": "server", "function": "_handle_message", "line": 615, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-06 21:25:19.961037+00:00", "level": "INFO", "logger": "mcp.server.lowlevel.server", "message": "Processing request of type CallToolRequest", "module": "server", "function": "_handle_request", "line": 625, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-06 21:25:19.963033+00:00", "level": "INFO", "logger": "textual_mcp.tools", "message": "Tool execution started", "module": "logging_config", "function": "log_tool_execution", "line": 149, "taskName": "mcp.server.lowlevel.server.Server._handle_message", "tool_name": "index_textual_docs", "parameters": {"force_reindex": false}, "event": "tool_start"} +{"timestamp": "2026-03-06 21:25:19.969041+00:00", "level": "INFO", "logger": "textual_mcp.chonkie_processor", "message": "Using sentence-transformers/all-MiniLM-L6-v2. For better performance, run 'python scripts/init_embeddings.py'", "module": "chonkie_processor", "function": "_get_embedding_model", "line": 97, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-06 21:25:33.297974+00:00", "level": "INFO", "logger": "textual_mcp.chonkie_processor", "message": "Initialized Chonkie processors with embedding model: sentence-transformers/all-MiniLM-L6-v2", "module": "chonkie_processor", "function": "__init__", "line": 77, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-06 21:25:33.298334+00:00", "level": "INFO", "logger": "textual_mcp.document_processor", "message": "Using Chonkie chunking strategy", "module": "document_processor", "function": "__init__", "line": 42, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-06 21:25:33.675220+00:00", "level": "INFO", "logger": "textual_mcp.index_textual_docs", "message": "GitHub API rate limit: 49/60", "module": "documentation_tools", "function": "index_textual_docs", "line": 290, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-06 21:25:33.675333+00:00", "level": "ERROR", "logger": "textual_mcp.tools", "message": "Tool execution failed", "module": "logging_config", "function": "log_tool_completion", "line": 174, "taskName": "mcp.server.lowlevel.server.Server._handle_message", "tool_name": "index_textual_docs", "success": false, "duration_ms": 13712.31, "event": "tool_complete", "error": "Insufficient GitHub API rate limit for indexing.\nCurrent limit: 49/60 requests\nNeed approximately 300 requests to index all documentation.\nRate limit resets at: 2026-03-07 00:02:43\nPlease wait until the rate limit resets or use a different token."} +{"timestamp": "2026-03-06 21:25:33.727799+00:00", "level": "INFO", "logger": "mcp.server.lowlevel.server", "message": "Warning: UserWarning: Could not load tokenizer with 'tokenizers'. Falling back to 'tiktoken'.", "module": "server", "function": "_handle_message", "line": 615, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-06 21:25:50.450420+00:00", "level": "INFO", "logger": "textual_mcp.validation_tools", "message": "Registered validation tools: validate_tcss, validate_tcss_file, validate_inline_styles, check_selector", "module": "validation_tools", "function": "register_validation_tools", "line": 360, "taskName": null} +{"timestamp": "2026-03-06 21:25:50.450489+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered validation tools", "module": "server", "function": "_register_tools", "line": 53, "taskName": null} +{"timestamp": "2026-03-06 21:25:50.451007+00:00", "level": "INFO", "logger": "textual_mcp.analysis_tools", "message": "Registered analysis tools: analyze_selectors, extract_css_variables, detect_style_conflicts", "module": "analysis_tools", "function": "register_analysis_tools", "line": 99, "taskName": null} +{"timestamp": "2026-03-06 21:25:50.451046+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered analysis tools", "module": "server", "function": "_register_tools", "line": 56, "taskName": null} +{"timestamp": "2026-03-06 21:25:50.452919+00:00", "level": "INFO", "logger": "textual_mcp.widget_tools", "message": "Registered widget tools: generate_widget, list_widget_types, list_event_handlers, validate_widget_name", "module": "widget_tools", "function": "register_widget_tools", "line": 343, "taskName": null} +{"timestamp": "2026-03-06 21:25:50.452957+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered widget tools", "module": "server", "function": "_register_tools", "line": 59, "taskName": null} +{"timestamp": "2026-03-06 21:25:50.454122+00:00", "level": "INFO", "logger": "textual_mcp.layout_tools", "message": "Registered layout tools: generate_grid_layout", "module": "layout_tools", "function": "register_layout_tools", "line": 139, "taskName": null} +{"timestamp": "2026-03-06 21:25:50.454160+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered layout tools", "module": "server", "function": "_register_tools", "line": 62, "taskName": null} +{"timestamp": "2026-03-06 21:25:50.457822+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Registered documentation tools: search_textual_docs, index_textual_docs, search_textual_code_examples, get_css_property_info, list_css_properties", "module": "documentation_tools", "function": "register_documentation_tools", "line": 613, "taskName": null} +{"timestamp": "2026-03-06 21:25:50.457860+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered documentation tools", "module": "server", "function": "_register_tools", "line": 65, "taskName": null} +{"timestamp": "2026-03-06 21:25:57.114880+00:00", "level": "INFO", "logger": "faiss.loader", "message": "Loading faiss with AVX2 support.", "module": "loader", "function": "", "line": 125, "taskName": null} +{"timestamp": "2026-03-06 21:25:57.141672+00:00", "level": "INFO", "logger": "faiss.loader", "message": "Successfully loaded faiss with AVX2 support.", "module": "loader", "function": "", "line": 127, "taskName": null} +{"timestamp": "2026-03-06 21:25:57.145411+00:00", "level": "INFO", "logger": "faiss", "message": "Failed to load GPU Faiss: name 'GpuIndexIVFFlat' is not defined. Will not load constructor refs for GPU indexes. This is only an error if you're trying to use GPU Faiss.", "module": "__init__", "function": "", "line": 174, "taskName": null} +{"timestamp": "2026-03-07 00:59:54.429750+00:00", "level": "INFO", "logger": "textual_mcp.validation_tools", "message": "Registered validation tools: validate_tcss, validate_tcss_file, validate_inline_styles, check_selector", "module": "validation_tools", "function": "register_validation_tools", "line": 360, "taskName": null} +{"timestamp": "2026-03-07 00:59:54.429813+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered validation tools", "module": "server", "function": "_register_tools", "line": 53, "taskName": null} +{"timestamp": "2026-03-07 00:59:54.430278+00:00", "level": "INFO", "logger": "textual_mcp.analysis_tools", "message": "Registered analysis tools: analyze_selectors, extract_css_variables, detect_style_conflicts", "module": "analysis_tools", "function": "register_analysis_tools", "line": 99, "taskName": null} +{"timestamp": "2026-03-07 00:59:54.430310+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered analysis tools", "module": "server", "function": "_register_tools", "line": 56, "taskName": null} +{"timestamp": "2026-03-07 00:59:54.431854+00:00", "level": "INFO", "logger": "textual_mcp.widget_tools", "message": "Registered widget tools: generate_widget, list_widget_types, list_event_handlers, validate_widget_name", "module": "widget_tools", "function": "register_widget_tools", "line": 343, "taskName": null} +{"timestamp": "2026-03-07 00:59:54.431889+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered widget tools", "module": "server", "function": "_register_tools", "line": 59, "taskName": null} +{"timestamp": "2026-03-07 00:59:54.432939+00:00", "level": "INFO", "logger": "textual_mcp.layout_tools", "message": "Registered layout tools: generate_grid_layout", "module": "layout_tools", "function": "register_layout_tools", "line": 139, "taskName": null} +{"timestamp": "2026-03-07 00:59:54.432980+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered layout tools", "module": "server", "function": "_register_tools", "line": 62, "taskName": null} +{"timestamp": "2026-03-07 00:59:54.435941+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Registered documentation tools: search_textual_docs, index_textual_docs, search_textual_code_examples, get_css_property_info, list_css_properties", "module": "documentation_tools", "function": "register_documentation_tools", "line": 613, "taskName": null} +{"timestamp": "2026-03-07 00:59:54.435977+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered documentation tools", "module": "server", "function": "_register_tools", "line": 65, "taskName": null} +{"timestamp": "2026-03-07 00:59:59.987853+00:00", "level": "INFO", "logger": "faiss.loader", "message": "Loading faiss with AVX2 support.", "module": "loader", "function": "", "line": 125, "taskName": null} +{"timestamp": "2026-03-07 01:00:00.011057+00:00", "level": "INFO", "logger": "faiss.loader", "message": "Successfully loaded faiss with AVX2 support.", "module": "loader", "function": "", "line": 127, "taskName": null} +{"timestamp": "2026-03-07 01:00:00.013439+00:00", "level": "INFO", "logger": "faiss", "message": "Failed to load GPU Faiss: name 'GpuIndexIVFFlat' is not defined. Will not load constructor refs for GPU indexes. This is only an error if you're trying to use GPU Faiss.", "module": "__init__", "function": "", "line": 174, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.092551+00:00", "level": "INFO", "logger": "textual_mcp.textual_docs_memory", "message": "Initialized VectorDB with embeddings: BAAI/bge-base-en-v1.5, persisting to: data/textual_docs.db", "module": "memory", "function": "__init__", "line": 45, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.092704+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Auto-indexing documentation on first use", "module": "documentation_tools", "function": "get_docs_memory", "line": 45, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.092747+00:00", "level": "WARNING", "logger": "textual_mcp.server", "message": "Failed to initialize documentation search: no running event loop", "module": "server", "function": "__init__", "line": 45, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.093553+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Textual MCP Server initialized", "module": "server", "function": "__init__", "line": 47, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.098904+00:00", "level": "INFO", "logger": "textual_mcp.validation_tools", "message": "Registered validation tools: validate_tcss, validate_tcss_file, validate_inline_styles, check_selector", "module": "validation_tools", "function": "register_validation_tools", "line": 360, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.098945+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered validation tools", "module": "server", "function": "_register_tools", "line": 53, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.099348+00:00", "level": "INFO", "logger": "textual_mcp.analysis_tools", "message": "Registered analysis tools: analyze_selectors, extract_css_variables, detect_style_conflicts", "module": "analysis_tools", "function": "register_analysis_tools", "line": 99, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.099380+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered analysis tools", "module": "server", "function": "_register_tools", "line": 56, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.100982+00:00", "level": "INFO", "logger": "textual_mcp.widget_tools", "message": "Registered widget tools: generate_widget, list_widget_types, list_event_handlers, validate_widget_name", "module": "widget_tools", "function": "register_widget_tools", "line": 343, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.101022+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered widget tools", "module": "server", "function": "_register_tools", "line": 59, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.101994+00:00", "level": "INFO", "logger": "textual_mcp.layout_tools", "message": "Registered layout tools: generate_grid_layout", "module": "layout_tools", "function": "register_layout_tools", "line": 139, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.102031+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered layout tools", "module": "server", "function": "_register_tools", "line": 62, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.105102+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Registered documentation tools: search_textual_docs, index_textual_docs, search_textual_code_examples, get_css_property_info, list_css_properties", "module": "documentation_tools", "function": "register_documentation_tools", "line": 613, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.105138+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered documentation tools", "module": "server", "function": "_register_tools", "line": 65, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.105168+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Documentation search will be indexed on first use", "module": "server", "function": "__init__", "line": 41, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.105192+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Textual MCP Server initialized", "module": "server", "function": "__init__", "line": 47, "taskName": null} +{"timestamp": "2026-03-07 01:00:23.116031+00:00", "level": "INFO", "logger": "mcp.server.lowlevel.server", "message": "Processing request of type ListToolsRequest", "module": "server", "function": "_handle_request", "line": 625, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-07 01:00:23.117055+00:00", "level": "INFO", "logger": "mcp.server.lowlevel.server", "message": "Processing request of type ListPromptsRequest", "module": "server", "function": "_handle_request", "line": 625, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-07 01:00:23.117668+00:00", "level": "INFO", "logger": "mcp.server.lowlevel.server", "message": "Processing request of type ListResourcesRequest", "module": "server", "function": "_handle_request", "line": 625, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-07 01:04:18.376331+00:00", "level": "INFO", "logger": "textual_mcp.validation_tools", "message": "Registered validation tools: validate_tcss, validate_tcss_file, validate_inline_styles, check_selector", "module": "validation_tools", "function": "register_validation_tools", "line": 360, "taskName": null} +{"timestamp": "2026-03-07 01:04:18.376382+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered validation tools", "module": "server", "function": "_register_tools", "line": 53, "taskName": null} +{"timestamp": "2026-03-07 01:04:18.376768+00:00", "level": "INFO", "logger": "textual_mcp.analysis_tools", "message": "Registered analysis tools: analyze_selectors, extract_css_variables, detect_style_conflicts", "module": "analysis_tools", "function": "register_analysis_tools", "line": 99, "taskName": null} +{"timestamp": "2026-03-07 01:04:18.376802+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered analysis tools", "module": "server", "function": "_register_tools", "line": 56, "taskName": null} +{"timestamp": "2026-03-07 01:04:18.378428+00:00", "level": "INFO", "logger": "textual_mcp.widget_tools", "message": "Registered widget tools: generate_widget, list_widget_types, list_event_handlers, validate_widget_name", "module": "widget_tools", "function": "register_widget_tools", "line": 343, "taskName": null} +{"timestamp": "2026-03-07 01:04:18.378475+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered widget tools", "module": "server", "function": "_register_tools", "line": 59, "taskName": null} +{"timestamp": "2026-03-07 01:04:18.379480+00:00", "level": "INFO", "logger": "textual_mcp.layout_tools", "message": "Registered layout tools: generate_grid_layout", "module": "layout_tools", "function": "register_layout_tools", "line": 139, "taskName": null} +{"timestamp": "2026-03-07 01:04:18.379516+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered layout tools", "module": "server", "function": "_register_tools", "line": 62, "taskName": null} +{"timestamp": "2026-03-07 01:04:18.383305+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Registered documentation tools: search_textual_docs, index_textual_docs, search_textual_code_examples, get_css_property_info, list_css_properties", "module": "documentation_tools", "function": "register_documentation_tools", "line": 613, "taskName": null} +{"timestamp": "2026-03-07 01:04:18.383358+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered documentation tools", "module": "server", "function": "_register_tools", "line": 65, "taskName": null} +{"timestamp": "2026-03-07 01:04:18.383391+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Documentation search will be indexed on first use", "module": "server", "function": "__init__", "line": 41, "taskName": null} +{"timestamp": "2026-03-07 01:04:18.383414+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Textual MCP Server initialized", "module": "server", "function": "__init__", "line": 47, "taskName": null} +{"timestamp": "2026-03-07 01:06:00.999097+00:00", "level": "INFO", "logger": "textual_mcp.validation_tools", "message": "Registered validation tools: validate_tcss, validate_tcss_file, validate_inline_styles, check_selector", "module": "validation_tools", "function": "register_validation_tools", "line": 360, "taskName": null} +{"timestamp": "2026-03-07 01:06:00.999157+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered validation tools", "module": "server", "function": "_register_tools", "line": 53, "taskName": null} +{"timestamp": "2026-03-07 01:06:00.999577+00:00", "level": "INFO", "logger": "textual_mcp.analysis_tools", "message": "Registered analysis tools: analyze_selectors, extract_css_variables, detect_style_conflicts", "module": "analysis_tools", "function": "register_analysis_tools", "line": 99, "taskName": null} +{"timestamp": "2026-03-07 01:06:00.999609+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered analysis tools", "module": "server", "function": "_register_tools", "line": 56, "taskName": null} +{"timestamp": "2026-03-07 01:06:01.001287+00:00", "level": "INFO", "logger": "textual_mcp.widget_tools", "message": "Registered widget tools: generate_widget, list_widget_types, list_event_handlers, validate_widget_name", "module": "widget_tools", "function": "register_widget_tools", "line": 343, "taskName": null} +{"timestamp": "2026-03-07 01:06:01.001332+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered widget tools", "module": "server", "function": "_register_tools", "line": 59, "taskName": null} +{"timestamp": "2026-03-07 01:06:01.002577+00:00", "level": "INFO", "logger": "textual_mcp.layout_tools", "message": "Registered layout tools: generate_grid_layout", "module": "layout_tools", "function": "register_layout_tools", "line": 139, "taskName": null} +{"timestamp": "2026-03-07 01:06:01.002614+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered layout tools", "module": "server", "function": "_register_tools", "line": 62, "taskName": null} +{"timestamp": "2026-03-07 01:06:01.005804+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Registered documentation tools: search_textual_docs, index_textual_docs, search_textual_code_examples, get_css_property_info, list_css_properties", "module": "documentation_tools", "function": "register_documentation_tools", "line": 613, "taskName": null} +{"timestamp": "2026-03-07 01:06:01.005851+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered documentation tools", "module": "server", "function": "_register_tools", "line": 65, "taskName": null} +{"timestamp": "2026-03-07 01:06:04.758951+00:00", "level": "INFO", "logger": "faiss.loader", "message": "Loading faiss with AVX2 support.", "module": "loader", "function": "", "line": 125, "taskName": null} +{"timestamp": "2026-03-07 01:06:04.767790+00:00", "level": "INFO", "logger": "faiss.loader", "message": "Successfully loaded faiss with AVX2 support.", "module": "loader", "function": "", "line": 127, "taskName": null} +{"timestamp": "2026-03-07 01:06:04.769559+00:00", "level": "INFO", "logger": "faiss", "message": "Failed to load GPU Faiss: name 'GpuIndexIVFFlat' is not defined. Will not load constructor refs for GPU indexes. This is only an error if you're trying to use GPU Faiss.", "module": "__init__", "function": "", "line": 174, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.692438+00:00", "level": "INFO", "logger": "textual_mcp.textual_docs_memory", "message": "Initialized VectorDB with embeddings: BAAI/bge-base-en-v1.5, persisting to: data/textual_docs.db", "module": "memory", "function": "__init__", "line": 45, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.692506+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Auto-indexing documentation on first use", "module": "documentation_tools", "function": "get_docs_memory", "line": 45, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.692544+00:00", "level": "WARNING", "logger": "textual_mcp.server", "message": "Failed to initialize documentation search: no running event loop", "module": "server", "function": "__init__", "line": 45, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.693061+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Textual MCP Server initialized", "module": "server", "function": "__init__", "line": 47, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.698114+00:00", "level": "INFO", "logger": "textual_mcp.validation_tools", "message": "Registered validation tools: validate_tcss, validate_tcss_file, validate_inline_styles, check_selector", "module": "validation_tools", "function": "register_validation_tools", "line": 360, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.698155+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered validation tools", "module": "server", "function": "_register_tools", "line": 53, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.698593+00:00", "level": "INFO", "logger": "textual_mcp.analysis_tools", "message": "Registered analysis tools: analyze_selectors, extract_css_variables, detect_style_conflicts", "module": "analysis_tools", "function": "register_analysis_tools", "line": 99, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.698625+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered analysis tools", "module": "server", "function": "_register_tools", "line": 56, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.700177+00:00", "level": "INFO", "logger": "textual_mcp.widget_tools", "message": "Registered widget tools: generate_widget, list_widget_types, list_event_handlers, validate_widget_name", "module": "widget_tools", "function": "register_widget_tools", "line": 343, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.700213+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered widget tools", "module": "server", "function": "_register_tools", "line": 59, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.701190+00:00", "level": "INFO", "logger": "textual_mcp.layout_tools", "message": "Registered layout tools: generate_grid_layout", "module": "layout_tools", "function": "register_layout_tools", "line": 139, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.701232+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered layout tools", "module": "server", "function": "_register_tools", "line": 62, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.704402+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Registered documentation tools: search_textual_docs, index_textual_docs, search_textual_code_examples, get_css_property_info, list_css_properties", "module": "documentation_tools", "function": "register_documentation_tools", "line": 613, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.704442+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered documentation tools", "module": "server", "function": "_register_tools", "line": 65, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.704474+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Documentation search will be indexed on first use", "module": "server", "function": "__init__", "line": 41, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.704496+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Textual MCP Server initialized", "module": "server", "function": "__init__", "line": 47, "taskName": null} +{"timestamp": "2026-03-07 01:06:06.714130+00:00", "level": "INFO", "logger": "mcp.server.lowlevel.server", "message": "Processing request of type ListToolsRequest", "module": "server", "function": "_handle_request", "line": 625, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-07 01:06:06.715194+00:00", "level": "INFO", "logger": "mcp.server.lowlevel.server", "message": "Processing request of type ListPromptsRequest", "module": "server", "function": "_handle_request", "line": 625, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-07 01:06:06.715640+00:00", "level": "INFO", "logger": "mcp.server.lowlevel.server", "message": "Processing request of type ListResourcesRequest", "module": "server", "function": "_handle_request", "line": 625, "taskName": "mcp.server.lowlevel.server.Server._handle_message"} +{"timestamp": "2026-03-07 01:23:59.722604+00:00", "level": "INFO", "logger": "textual_mcp.validation_tools", "message": "Registered validation tools: validate_tcss, validate_tcss_file, validate_inline_styles, check_selector", "module": "validation_tools", "function": "register_validation_tools", "line": 360, "taskName": null} +{"timestamp": "2026-03-07 01:23:59.722698+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered validation tools", "module": "server", "function": "_register_tools", "line": 53, "taskName": null} +{"timestamp": "2026-03-07 01:23:59.723301+00:00", "level": "INFO", "logger": "textual_mcp.analysis_tools", "message": "Registered analysis tools: analyze_selectors, extract_css_variables, detect_style_conflicts", "module": "analysis_tools", "function": "register_analysis_tools", "line": 99, "taskName": null} +{"timestamp": "2026-03-07 01:23:59.723372+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered analysis tools", "module": "server", "function": "_register_tools", "line": 56, "taskName": null} +{"timestamp": "2026-03-07 01:23:59.725938+00:00", "level": "INFO", "logger": "textual_mcp.widget_tools", "message": "Registered widget tools: generate_widget, list_widget_types, list_event_handlers, validate_widget_name", "module": "widget_tools", "function": "register_widget_tools", "line": 343, "taskName": null} +{"timestamp": "2026-03-07 01:23:59.726011+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered widget tools", "module": "server", "function": "_register_tools", "line": 59, "taskName": null} +{"timestamp": "2026-03-07 01:23:59.727604+00:00", "level": "INFO", "logger": "textual_mcp.layout_tools", "message": "Registered layout tools: generate_grid_layout", "module": "layout_tools", "function": "register_layout_tools", "line": 139, "taskName": null} +{"timestamp": "2026-03-07 01:23:59.727807+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered layout tools", "module": "server", "function": "_register_tools", "line": 62, "taskName": null} +{"timestamp": "2026-03-07 01:23:59.732119+00:00", "level": "INFO", "logger": "textual_mcp.documentation_tools", "message": "Registered documentation tools: search_textual_docs, index_textual_docs, search_textual_code_examples, get_css_property_info, list_css_properties", "module": "documentation_tools", "function": "register_documentation_tools", "line": 613, "taskName": null} +{"timestamp": "2026-03-07 01:23:59.732166+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Registered documentation tools", "module": "server", "function": "_register_tools", "line": 65, "taskName": null} +{"timestamp": "2026-03-07 01:23:59.732197+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Documentation search will be indexed on first use", "module": "server", "function": "__init__", "line": 41, "taskName": null} +{"timestamp": "2026-03-07 01:23:59.732219+00:00", "level": "INFO", "logger": "textual_mcp.server", "message": "Textual MCP Server initialized", "module": "server", "function": "__init__", "line": 47, "taskName": null} diff --git a/tui/screens/backup.py b/tui/screens/backup.py index b3f24b3..9d620ce 100644 --- a/tui/screens/backup.py +++ b/tui/screens/backup.py @@ -91,9 +91,9 @@ class BackupScreen(Screen): def _do_backup(self, target: str, remote: str) -> None: job = job_manager.create_job("backup", f"Backup: {target}") - args = ["backup", f"--target={target}"] + args = ["backup", f"--source={target}"] if remote: - args.append(f"--remote={remote}") + args.append(f"--destination={remote}") job_manager.start_job(self.app, job, *args) self.app.switch_screen("running_tasks") diff --git a/tui/screens/remotes.py b/tui/screens/remotes.py index b208b06..8c2c4a4 100644 --- a/tui/screens/remotes.py +++ b/tui/screens/remotes.py @@ -90,7 +90,7 @@ class RemotesScreen(Screen): async def _fetch_disk_info(self) -> None: remotes = list_conf_dir("remotes.d") for name in remotes: - rc, stdout, stderr = await run_cli("remotes", "disk-info-short", f"--name={name}") + rc, stdout, stderr = await run_cli("destinations", "disk-info-short", f"--name={name}") disk_text = stdout.strip() if rc == 0 and stdout.strip() else "N/A" try: table = self.query_one("#remotes-table", DataTable) @@ -103,7 +103,7 @@ class RemotesScreen(Screen): async def _test_remote(self, name: str) -> None: log_screen = OperationLog(f"Testing Destination: {name}", show_spinner=False) self.app.push_screen(log_screen) - rc, stdout, stderr = await run_cli("remotes", "test", f"--name={name}") + rc, stdout, stderr = await run_cli("destinations", "test", f"--name={name}") if stdout: log_screen.write(stdout) if stderr: diff --git a/tui/screens/restore.py b/tui/screens/restore.py index 08fe4fc..79ba2d8 100644 --- a/tui/screens/restore.py +++ b/tui/screens/restore.py @@ -88,7 +88,7 @@ class RestoreScreen(Screen): snap_sel = self.query_one("#restore-snapshot", Select) snap_sel.set_options([]) self.notify(f"Loading snapshots for {target}/{remote}...") - rc, stdout, stderr = await run_cli("snapshots", "list", f"--target={target}", f"--remote={remote}") + rc, stdout, stderr = await run_cli("snapshots", "list", f"--source={target}", f"--destination={remote}") lines = [l.strip() for l in stdout.splitlines() if l.strip() and not l.startswith("===")] if lines: snap_sel.set_options([(s, s) for s in lines]) @@ -148,7 +148,7 @@ class RestoreScreen(Screen): def _do_restore(self, target: str, remote: str, snapshot: str, dest: str, skip_mysql: bool = False) -> None: job = job_manager.create_job("restore", f"Restore: {target}") - args = ["restore", f"--target={target}", f"--remote={remote}", f"--snapshot={snapshot}"] + args = ["restore", f"--source={target}", f"--destination={remote}", f"--snapshot={snapshot}"] if dest: args.append(f"--dest={dest}") if skip_mysql: diff --git a/tui/screens/retention.py b/tui/screens/retention.py index 16434c9..3dff990 100644 --- a/tui/screens/retention.py +++ b/tui/screens/retention.py @@ -73,7 +73,7 @@ class RetentionScreen(Screen): async def _do_cleanup(self, target: str) -> None: log_screen = OperationLog(f"Retention: {target}", show_spinner=False) self.app.push_screen(log_screen) - rc = await stream_cli(log_screen.write, "retention", f"--target={target}") + rc = await stream_cli(log_screen.write, "retention", f"--source={target}") if rc == 0: log_screen.write("\n[green]Cleanup completed.[/green]") else: diff --git a/tui/screens/snapshots.py b/tui/screens/snapshots.py index 8aa1322..512711f 100644 --- a/tui/screens/snapshots.py +++ b/tui/screens/snapshots.py @@ -81,7 +81,7 @@ class SnapshotsScreen(Screen): return target = str(target_sel.value) remote = str(remote_sel.value) - rc, stdout, stderr = await run_cli("snapshots", "list", f"--target={target}", f"--remote={remote}") + rc, stdout, stderr = await run_cli("snapshots", "list", f"--source={target}", f"--destination={remote}") table = self.query_one("#snap-table", DataTable) table.clear() lines = [l.strip() for l in stdout.splitlines() if l.strip() and not l.startswith("===")] @@ -109,7 +109,7 @@ class SnapshotsScreen(Screen): self.notify("Loading files...") rc, stdout, stderr = await run_cli( - "snapshots", "browse", f"--target={target}", f"--remote={remote}", f"--snapshot={snapshot}" + "snapshots", "browse", f"--source={target}", f"--destination={remote}", f"--snapshot={snapshot}" ) # Parse file list, strip remote prefix to get relative paths