Rename CLI commands: targets→sources, remotes→destinations, --target→--source, --remote→--destination

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 <noreply@anthropic.com>
This commit is contained in:
shuki
2026-03-07 05:32:16 +02:00
parent 0eb1aeb7e6
commit 645e9cb38d
10 changed files with 324 additions and 111 deletions

View File

@@ -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 `<config_dir>/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 `<config_dir>/remotes.d/`.
**SSH connection failures**
- Test with: `gniza --cli remotes test --name=<destination>`
- Test with: `gniza --cli destinations test --name=<destination>`
- 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

View File

@@ -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

View File

@@ -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

View File

@@ -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:<name>" 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"

215
textual-mcp.log Normal file
View File

@@ -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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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": "<module>", "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}

View File

@@ -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")

View File

@@ -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:

View File

@@ -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:

View File

@@ -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:

View File

@@ -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