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**: **CLI**:
```bash ```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`. **Manual**: Create `<config_dir>/targets.d/mysite.conf`.
@@ -258,7 +258,7 @@ Common uses:
### Viewing a Source ### Viewing a Source
```bash ```bash
gniza --cli targets show --name=mysite gniza --cli sources show --name=mysite
``` ```
Shows all configured fields including source type details and MySQL settings. 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 ### Deleting a Source
```bash ```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. 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**: **CLI**:
```bash ```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. This creates a config template. Edit it manually or use the TUI to configure.
@@ -371,7 +371,7 @@ Requires `rclone`.
### Testing a Destination ### Testing a Destination
```bash ```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. 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 ### Checking Disk Usage
```bash ```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. 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 gniza --cli backup --all
# Back up a specific source # Back up a specific source
gniza --cli backup --target=mysite gniza --cli backup --source=mysite
# Back up a specific source to a specific destination # 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 # Back up multiple sources
gniza --cli backup --target=mysite,databases gniza --cli backup --source=mysite,databases
``` ```
### How Backup Works ### How Backup Works
@@ -477,19 +477,19 @@ Each source uses `flock`-based locking to prevent overlapping backups of the sam
```bash ```bash
# Restore latest snapshot in-place # 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 # 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 # 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 # 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 # 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 ### Restore Behavior
@@ -514,19 +514,19 @@ Navigate to Restore, select a source, destination, and snapshot, choose in-place
gniza --cli snapshots list gniza --cli snapshots list
# List snapshots for a specific source # List snapshots for a specific source
gniza --cli snapshots list --target=mysite gniza --cli snapshots list --source=mysite
# List snapshots on a specific destination # List snapshots on a specific destination
gniza --cli snapshots list --remote=backup-server gniza --cli snapshots list --destination=backup-server
# Both # Both
gniza --cli snapshots list --target=mysite --remote=backup-server gniza --cli snapshots list --source=mysite --destination=backup-server
``` ```
### Browsing Snapshot Contents ### Browsing Snapshot Contents
```bash ```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. Lists all files in the snapshot.
@@ -579,10 +579,10 @@ Retention runs automatically after each successful backup. The oldest snapshots
gniza --cli retention --all gniza --cli retention --all
# Enforce for a specific source # Enforce for a specific source
gniza --cli retention --target=mysite gniza --cli retention --source=mysite
# Enforce on a specific destination # Enforce on a specific destination
gniza --cli retention --remote=backup-server gniza --cli retention --destination=backup-server
``` ```
### Snapshot Pinning ### 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: During restore, MySQL dumps from `_mysql/` are automatically restored. Use `--skip-mysql` to skip:
```bash ```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. In the TUI, toggle the "Restore MySQL databases" switch.
@@ -854,56 +854,56 @@ Launch with `gniza` (no arguments). Requires Python 3 and Textual.
### Sources ### Sources
```bash ```bash
gniza --cli targets list # List all sources gniza --cli sources list # List all sources
gniza --cli targets add --name=NAME --folders=PATHS # Create a source gniza --cli sources add --name=NAME --folders=PATHS # Create a source
gniza --cli targets delete --name=NAME # Delete a source gniza --cli sources delete --name=NAME # Delete a source
gniza --cli targets show --name=NAME # Show source details gniza --cli sources show --name=NAME # Show source details
``` ```
### Destinations ### Destinations
```bash ```bash
gniza --cli remotes list # List all destinations gniza --cli destinations list # List all destinations
gniza --cli remotes add --name=NAME # Create a destination gniza --cli destinations add --name=NAME # Create a destination
gniza --cli remotes delete --name=NAME # Delete a destination gniza --cli destinations delete --name=NAME # Delete a destination
gniza --cli remotes show --name=NAME # Show destination details gniza --cli destinations show --name=NAME # Show destination details
gniza --cli remotes test --name=NAME # Test connectivity gniza --cli destinations test --name=NAME # Test connectivity
gniza --cli remotes disk-info-short --name=NAME # Show disk usage gniza --cli destinations disk-info-short --name=NAME # Show disk usage
``` ```
### Backup ### Backup
```bash ```bash
gniza --cli backup --all # Back up everything gniza --cli backup --all # Back up everything
gniza --cli backup --target=NAME # Back up one source gniza --cli backup --source=NAME # Back up one source
gniza --cli backup --target=NAME --remote=NAME # Source to specific destination gniza --cli backup --source=NAME --destination=NAME # Source to specific destination
gniza --cli backup --target=a,b,c # Multiple sources gniza --cli backup --source=a,b,c # Multiple sources
``` ```
### Restore ### Restore
```bash ```bash
gniza --cli restore --target=NAME --remote=NAME --snapshot=TS gniza --cli restore --source=NAME --destination=NAME --snapshot=TS
gniza --cli restore --target=NAME --remote=NAME --dest=/tmp/restore gniza --cli restore --source=NAME --destination=NAME --dest=/tmp/restore
gniza --cli restore --target=NAME --remote=NAME --folder=/var/www gniza --cli restore --source=NAME --destination=NAME --folder=/var/www
gniza --cli restore --target=NAME --remote=NAME --skip-mysql gniza --cli restore --source=NAME --destination=NAME --skip-mysql
``` ```
### Snapshots ### Snapshots
```bash ```bash
gniza --cli snapshots list # All snapshots gniza --cli snapshots list # All snapshots
gniza --cli snapshots list --target=NAME # For one source gniza --cli snapshots list --source=NAME # For one source
gniza --cli snapshots list --remote=NAME # On one destination gniza --cli snapshots list --destination=NAME # On one destination
gniza --cli snapshots browse --target=NAME --snapshot=TS gniza --cli snapshots browse --source=NAME --snapshot=TS
``` ```
### Retention ### Retention
```bash ```bash
gniza --cli retention --all # Enforce everywhere gniza --cli retention --all # Enforce everywhere
gniza --cli retention --target=NAME # One source gniza --cli retention --source=NAME # One source
gniza --cli retention --remote=NAME # One destination gniza --cli retention --destination=NAME # One destination
``` ```
### Scheduling ### Scheduling
@@ -1004,7 +1004,7 @@ All global settings are in `gniza.conf` in the config directory.
### Credential Handling ### Credential Handling
- Passwords are never logged or displayed in output - 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 - MySQL passwords are passed via `MYSQL_PWD` environment variable
- SSH passwords are passed via `sshpass`, not command-line arguments - 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/`. Create at least one destination in `<config_dir>/remotes.d/`.
**SSH connection failures** **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) - Check that the SSH key exists and has correct permissions (600)
- Verify the remote host is reachable: `ssh -p PORT user@host` - Verify the remote host is reachable: `ssh -p PORT user@host`
- If using password auth, ensure `sshpass` is installed - 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 gniza
# Or use the CLI to add a source and destination # Or use the CLI to add a source and destination
gniza --cli targets add --name=mysite --folders=/var/www,/etc/nginx gniza --cli sources add --name=mysite --folders=/var/www,/etc/nginx
gniza --cli remotes add --name=backup-server gniza --cli destinations add --name=backup-server
# Run a backup # Run a backup
gniza --cli backup --target=mysite gniza --cli backup --source=mysite
gniza --cli backup --all 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 ## CLI Reference
``` ```
@@ -97,27 +95,27 @@ Options:
--version Show version --version Show version
Sources: Sources:
targets list List all configured sources sources list List all configured sources
targets add --name=NAME --folders=PATHS sources add --name=NAME --folders=PATHS
targets delete --name=NAME sources delete --name=NAME
targets show --name=NAME sources show --name=NAME
Destinations: Destinations:
remotes list List all configured destinations destinations list List all configured destinations
remotes add --name=NAME destinations add --name=NAME
remotes delete --name=NAME destinations delete --name=NAME
remotes show --name=NAME destinations show --name=NAME
remotes test --name=NAME Validate connectivity destinations test --name=NAME Validate connectivity
remotes disk-info-short --name=NAME Show disk usage destinations disk-info-short --name=NAME Show disk usage
Operations: Operations:
backup [--target=NAME] [--remote=NAME] [--all] backup [--source=NAME] [--destination=NAME] [--all]
restore --target=NAME --snapshot=TS [--remote=NAME] [--dest=DIR] [--skip-mysql] restore --source=NAME --snapshot=TS [--destination=NAME] [--dest=DIR] [--skip-mysql]
retention [--target=NAME] [--remote=NAME] [--all] retention [--source=NAME] [--destination=NAME] [--all]
Snapshots: Snapshots:
snapshots list [--target=NAME] [--remote=NAME] snapshots list [--source=NAME] [--destination=NAME]
snapshots browse --target=NAME --snapshot=TS [--remote=NAME] snapshots browse --source=NAME --snapshot=TS [--destination=NAME]
Scheduling: Scheduling:
schedule install | show | remove schedule install | show | remove

View File

@@ -43,8 +43,8 @@ Options:
--version Show version --version Show version
Commands: Commands:
targets Manage sources (list, add, delete, show) sources Manage sources (list, add, delete, show)
remotes Manage destinations (list, add, delete, show, test) destinations Manage destinations (list, add, delete, show, test)
backup Run backup backup Run backup
restore Restore from a snapshot restore Restore from a snapshot
snapshots List or browse snapshots snapshots List or browse snapshots
@@ -74,41 +74,41 @@ Options:
--version Show version --version Show version
Sources (what to back up): Sources (what to back up):
targets list List all configured sources sources list List all configured sources
targets add --name=NAME --folders=PATHS sources add --name=NAME --folders=PATHS
Create a new source Create a new source
targets delete --name=NAME Delete a source sources delete --name=NAME Delete a source
targets show --name=NAME Show full source configuration sources show --name=NAME Show full source configuration
Destinations (where to store backups): Destinations (where to store backups):
remotes list List all configured destinations destinations list List all configured destinations
remotes add --name=NAME Create a new destination (edit config manually or via TUI) destinations add --name=NAME Create a new destination (edit config manually or via TUI)
remotes delete --name=NAME Delete a destination destinations delete --name=NAME Delete a destination
remotes show --name=NAME Show full destination configuration destinations show --name=NAME Show full destination configuration
remotes test --name=NAME Validate destination connectivity destinations test --name=NAME Validate destination connectivity
remotes disk-info-short --name=NAME Show destination disk usage (used/total/free) destinations disk-info-short --name=NAME Show destination disk usage (used/total/free)
Operations: 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. Run backup. If no source is specified, all sources are backed up.
Use --target=a,b,c to back up multiple sources. Use --source=a,b,c to back up multiple sources.
Use --remote=NAME to target a specific destination. 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] [--folder=PATH] [--skip-mysql]
Restore from a snapshot. Use --dest for custom restore location. Restore from a snapshot. Use --dest for custom restore location.
Use --folder to restore a single directory from the snapshot. Use --folder to restore a single directory from the snapshot.
Use --skip-mysql to skip MySQL database restore. 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 Enforce snapshot retention policies. Deletes snapshots beyond
the configured retention count (oldest first, pinned preserved). the configured retention count (oldest first, pinned preserved).
Snapshots: Snapshots:
snapshots list [--target=NAME] [--remote=NAME] snapshots list [--source=NAME] [--destination=NAME]
List available snapshots. Filter by source and/or destination. 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. List all files in a specific snapshot.
Scheduling: Scheduling:
@@ -236,8 +236,8 @@ run_cli() {
case "${SUBCOMMAND:-}" in case "${SUBCOMMAND:-}" in
backup) backup)
local target="" remote="" all=false local target="" remote="" all=false
target=$(_parse_flag "--target" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true target=$(_parse_flag "--source" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true
remote=$(_parse_flag "--remote" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true remote=$(_parse_flag "--destination" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true
_has_flag "--all" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}" && all=true _has_flag "--all" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}" && all=true
trap release_all_target_locks EXIT trap release_all_target_locks EXIT
@@ -264,9 +264,9 @@ run_cli() {
restore) restore)
local target="" snapshot="" remote="" dest="" folder="" 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 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 dest=$(_parse_flag "--dest" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true
folder=$(_parse_flag "--folder" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true folder=$(_parse_flag "--folder" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true
@@ -278,7 +278,7 @@ run_cli() {
done done
[[ -n "$skip_mysql" ]] && export SKIP_MYSQL_RESTORE="yes" [[ -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 if [[ -z "$remote" ]]; then
remote=$(list_remotes | head -1) remote=$(list_remotes | head -1)
@@ -292,7 +292,7 @@ run_cli() {
fi fi
;; ;;
targets) sources)
local action="${SUBCMD_ARGS[0]:-list}" local action="${SUBCMD_ARGS[0]:-list}"
local name="" folders="" local name="" folders=""
name=$(_parse_flag "--name" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true name=$(_parse_flag "--name" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true
@@ -377,7 +377,7 @@ run_cli() {
esac esac
;; ;;
remotes) destinations)
local action="${SUBCMD_ARGS[0]:-list}" local action="${SUBCMD_ARGS[0]:-list}"
local name="" local name=""
name=$(_parse_flag "--name" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true name=$(_parse_flag "--name" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true
@@ -460,8 +460,8 @@ run_cli() {
snapshots) snapshots)
local action="${SUBCMD_ARGS[0]:-list}" local action="${SUBCMD_ARGS[0]:-list}"
local target="" remote="" local target="" remote=""
target=$(_parse_flag "--target" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true target=$(_parse_flag "--source" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true
remote=$(_parse_flag "--remote" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true remote=$(_parse_flag "--destination" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true
case "$action" in case "$action" in
list) list)
@@ -484,7 +484,7 @@ run_cli() {
_restore_remote_globals _restore_remote_globals
;; ;;
browse) browse)
[[ -z "$target" ]] && die "browse requires --target=NAME" [[ -z "$target" ]] && die "browse requires --source=NAME"
local snapshot="" local snapshot=""
snapshot=$(_parse_flag "--snapshot" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true snapshot=$(_parse_flag "--snapshot" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true
[[ -z "$snapshot" ]] && die "browse requires --snapshot=TS" [[ -z "$snapshot" ]] && die "browse requires --snapshot=TS"
@@ -502,8 +502,8 @@ run_cli() {
retention) retention)
local target="" remote="" all=false local target="" remote="" all=false
target=$(_parse_flag "--target" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true target=$(_parse_flag "--source" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true
remote=$(_parse_flag "--remote" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true remote=$(_parse_flag "--destination" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true
_has_flag "--all" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}" && all=true _has_flag "--all" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}" && all=true
if [[ -z "$remote" ]]; then if [[ -z "$remote" ]]; then
@@ -560,8 +560,8 @@ run_cli() {
scheduled-run) scheduled-run)
local sched_name="" target="" remote="" local sched_name="" target="" remote=""
sched_name=$(_parse_flag "--schedule" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true sched_name=$(_parse_flag "--schedule" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true
target=$(_parse_flag "--target" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true target=$(_parse_flag "--source" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true
remote=$(_parse_flag "--remote" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true remote=$(_parse_flag "--destination" "${SUBCMD_ARGS[@]+"${SUBCMD_ARGS[@]}"}") || true
[[ -z "$sched_name" ]] && die "scheduled-run requires --schedule=NAME" [[ -z "$sched_name" ]] && die "scheduled-run requires --schedule=NAME"
trap release_all_target_locks EXIT trap release_all_target_locks EXIT

View File

@@ -6,8 +6,8 @@
# SCHEDULE_TIME="HH:MM" # SCHEDULE_TIME="HH:MM"
# SCHEDULE_DAY="" # dow (0-6) for weekly, dom (1-28) for monthly # SCHEDULE_DAY="" # dow (0-6) for weekly, dom (1-28) for monthly
# SCHEDULE_CRON="" # full 5-field cron expr for custom # SCHEDULE_CRON="" # full 5-field cron expr for custom
# REMOTES="" # comma-separated remote names (empty = all) # DESTINATIONS="" # comma-separated remote names (empty = all)
# TARGETS="" # comma-separated target names (empty = all) # SOURCES="" # comma-separated target names (empty = all)
# #
# Cron lines are tagged with "# gniza4linux:<name>" for clean install/remove. # 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 bin_path; bin_path=$(_gniza4linux_bin)
local extra_flags="" local extra_flags=""
if [[ -n "$SCHEDULE_REMOTES" ]]; then if [[ -n "$SCHEDULE_REMOTES" ]]; then
extra_flags+=" --remote=$SCHEDULE_REMOTES" extra_flags+=" --destination=$SCHEDULE_REMOTES"
fi fi
if [[ -n "$SCHEDULE_TARGETS" ]]; then if [[ -n "$SCHEDULE_TARGETS" ]]; then
extra_flags+=" --target=$SCHEDULE_TARGETS" extra_flags+=" --source=$SCHEDULE_TARGETS"
fi 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" 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: def _do_backup(self, target: str, remote: str) -> None:
job = job_manager.create_job("backup", f"Backup: {target}") job = job_manager.create_job("backup", f"Backup: {target}")
args = ["backup", f"--target={target}"] args = ["backup", f"--source={target}"]
if remote: if remote:
args.append(f"--remote={remote}") args.append(f"--destination={remote}")
job_manager.start_job(self.app, job, *args) job_manager.start_job(self.app, job, *args)
self.app.switch_screen("running_tasks") self.app.switch_screen("running_tasks")

View File

@@ -90,7 +90,7 @@ class RemotesScreen(Screen):
async def _fetch_disk_info(self) -> None: async def _fetch_disk_info(self) -> None:
remotes = list_conf_dir("remotes.d") remotes = list_conf_dir("remotes.d")
for name in remotes: 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" disk_text = stdout.strip() if rc == 0 and stdout.strip() else "N/A"
try: try:
table = self.query_one("#remotes-table", DataTable) table = self.query_one("#remotes-table", DataTable)
@@ -103,7 +103,7 @@ class RemotesScreen(Screen):
async def _test_remote(self, name: str) -> None: async def _test_remote(self, name: str) -> None:
log_screen = OperationLog(f"Testing Destination: {name}", show_spinner=False) log_screen = OperationLog(f"Testing Destination: {name}", show_spinner=False)
self.app.push_screen(log_screen) 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: if stdout:
log_screen.write(stdout) log_screen.write(stdout)
if stderr: if stderr:

View File

@@ -88,7 +88,7 @@ class RestoreScreen(Screen):
snap_sel = self.query_one("#restore-snapshot", Select) snap_sel = self.query_one("#restore-snapshot", Select)
snap_sel.set_options([]) snap_sel.set_options([])
self.notify(f"Loading snapshots for {target}/{remote}...") 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("===")] lines = [l.strip() for l in stdout.splitlines() if l.strip() and not l.startswith("===")]
if lines: if lines:
snap_sel.set_options([(s, s) for s in 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: 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}") 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: if dest:
args.append(f"--dest={dest}") args.append(f"--dest={dest}")
if skip_mysql: if skip_mysql:

View File

@@ -73,7 +73,7 @@ class RetentionScreen(Screen):
async def _do_cleanup(self, target: str) -> None: async def _do_cleanup(self, target: str) -> None:
log_screen = OperationLog(f"Retention: {target}", show_spinner=False) log_screen = OperationLog(f"Retention: {target}", show_spinner=False)
self.app.push_screen(log_screen) 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: if rc == 0:
log_screen.write("\n[green]Cleanup completed.[/green]") log_screen.write("\n[green]Cleanup completed.[/green]")
else: else:

View File

@@ -81,7 +81,7 @@ class SnapshotsScreen(Screen):
return return
target = str(target_sel.value) target = str(target_sel.value)
remote = str(remote_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 = self.query_one("#snap-table", DataTable)
table.clear() table.clear()
lines = [l.strip() for l in stdout.splitlines() if l.strip() and not l.startswith("===")] 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...") self.notify("Loading files...")
rc, stdout, stderr = await run_cli( 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 # Parse file list, strip remote prefix to get relative paths