docs: sync README/manifest to v0.2.1 behavior and i18n keys

Written by AI agent working for @jtmorris. Model: Grok 4.5.
This commit is contained in:
Ebeneezer (Hermes Agent) 2026-07-15 01:11:59 -07:00
parent 7c31598594
commit bbce7f0100
4 changed files with 20 additions and 29 deletions

View file

@ -2,19 +2,21 @@
A lightweight widget plugin that shows Tailscale connectivity status on the Dank Bar with quick controls for toggling connection, switching exit nodes, and copying peer addresses. A lightweight widget plugin that shows Tailscale connectivity status on the Dank Bar with quick controls for toggling connection, switching exit nodes, and copying peer addresses.
![Tailscale Widget v0.2.0](resources/dms_tailscalectl_v0.1.0.png) ![Tailscale Widget v0.2.1](resources/dms_tailscalectl_v0.1.0.png)
## Features ## Features
- **Status icon** in the bar — `vpn_key` when connected, `vpn_key_off` when disconnected - **Status icon** in the bar — `vpn_key` when connected, `vpn_key_off` when disconnected
- **Right-click** to toggle Tailscale on/off - **Right-click** to toggle Tailscale on/off
- **Left-click** to open a popout showing: - **Left-click** to open a popout showing:
- Your current Tailscale IP - Your current Tailscale IP (when connected)
- Active exit node (with clear button) - Active exit node (with clear button)
- Peer list with hostnames and IPs - Peer list with hostnames and IPs (when connected)
- A clear "Not connected" empty state when disconnected (no stale peer list)
- **Click-to-copy** any hostname or IP to clipboard - **Click-to-copy** any hostname or IP to clipboard
- **Exit node selection** — click `↗` on any exit-node-capable peer to route through it - **Exit node selection** — click `↗` on any exit-node-capable peer to route through it
- **On-demand status** — polls Tailscale for ground truth on load, explicit actions, and post-mutation verification (defensive poll-act-poll for toggles; no always-on timer) - **On-demand status** — polls Tailscale for ground truth on load, explicit actions, and post-mutation verification (defensive poll-act-poll for toggles; no always-on timer)
- **Single-flight actions** — concurrent status/toggle/exit/copy chains are rejected while an operation is in flight
- **Toast notifications** for all errors - **Toast notifications** for all errors
## Requirements ## Requirements
@ -42,7 +44,8 @@ A lightweight widget plugin that shows Tailscale connectivity status on the Dank
tailscalectl/ tailscalectl/
├── plugin.json ├── plugin.json
├── TailscaleWidget.qml ├── TailscaleWidget.qml
└── lib.js ├── lib.js
└── i18n/
``` ```
3. Reload the plugin: 3. Reload the plugin:
@ -70,12 +73,14 @@ A lightweight widget plugin that shows Tailscale connectivity status on the Dank
"id": "tailscalectl", "id": "tailscalectl",
"name": "Tailscale", "name": "Tailscale",
"description": "Tailscale status and controls on the Dank Bar", "description": "Tailscale status and controls on the Dank Bar",
"version": "0.2.0", "author": "John Morris",
"author": "John Morris & Vybe (AI Slop... er... Coding Assistant)",
"icon": "vpn_key", "icon": "vpn_key",
"type": "widget", "type": "widget",
"capabilities": ["dankbar-widget"],
"component": "./TailscaleWidget.qml", "component": "./TailscaleWidget.qml",
"permissions": ["settings_read", "settings_write", "process"] "permissions": ["process"],
"requires": ["tailscale"],
"version": "0.2.1"
} }
``` ```
@ -84,7 +89,10 @@ A lightweight widget plugin that shows Tailscale connectivity status on the Dank
- Uses `Proc` singleton (from `qs.Common`) for all external `tailscale` commands (one-shot stdout capture + auto cleanup). - Uses `Proc` singleton (from `qs.Common`) for all external `tailscale` commands (one-shot stdout capture + auto cleanup).
- Fully I18n-ready via `I18n.tr(...)` (source keys in American English only today; see `tailscalectl/i18n/` for scaffolding). - Fully I18n-ready via `I18n.tr(...)` (source keys in American English only today; see `tailscalectl/i18n/` for scaffolding).
- Follows current `dms-plugin-dev` + DMS 1.4 plugin best practices (capabilities, requires, no raw Process for one-shots, etc.). - Follows current `dms-plugin-dev` + DMS 1.4 plugin best practices (capabilities, requires, no raw Process for one-shots, etc.).
- Toggle uses intentional defensive poll-act-poll (see code comments). - Toggle uses intentional defensive poll-act-poll; a failed status poll aborts the pending toggle (does not invent `up`/`down`).
- When `BackendState` is not `Running`, peer list / exit node / self IP are cleared so the UI never shows a stale connected-looking peer list.
- Status row uses `RowLayout` with a real `Layout.fillWidth` spacer (not a no-op on plain `Row`).
- Peer `ListView` uses `Flickable.StopAtBounds` (no desktop rubber-band overshoot).
## Testing ## Testing

View file

@ -11,25 +11,7 @@ This plugin is fully instrumented with `I18n.tr(...)` (from `qs.Common`) for all
See `getStrings()` and `errorMessage()` in `lib.js` for the canonical list. See `getStrings()` and `errorMessage()` in `lib.js` for the canonical list.
Example `en.json` (for documentation / future tools): Example `en.json` (for documentation / future tools) lives beside this README.
```json
{
"Tailscale": "Tailscale",
"Connected": "Connected",
"Disconnected": "Disconnected",
"Exit node: ": "Exit node: ",
"None": "None",
"Copied %1 to clipboard": "Copied %1 to clipboard",
"Invalid exit node hostname": "Invalid exit node hostname",
"Failed to connect to Tailscale": "Failed to connect to Tailscale",
"Failed to disconnect from Tailscale": "Failed to disconnect from Tailscale",
"Failed to set exit node": "Failed to set exit node",
"Failed to read Tailscale status": "Failed to read Tailscale status",
"Error copying to clipboard": "Error copying to clipboard",
"Tailscale command failed": "Tailscale command failed"
}
```
## Notes ## Notes
@ -37,4 +19,4 @@ Example `en.json` (for documentation / future tools):
- Plugin name/description in `plugin.json` and technical IDs ("tailscalectl") remain English. - Plugin name/description in `plugin.json` and technical IDs ("tailscalectl") remain English.
- This follows DMS `dms-plugin-dev` best practice for future-proofing even when only en is shipped. - This follows DMS `dms-plugin-dev` best practice for future-proofing even when only en is shipped.
Written by AI agent working for @jtmorris. Model: grok-build-0.1. Written by AI agent working for @jtmorris. Model: Grok 4.5.

View file

@ -6,6 +6,7 @@
"None": "None", "None": "None",
"Copied %1 to clipboard": "Copied %1 to clipboard", "Copied %1 to clipboard": "Copied %1 to clipboard",
"Invalid exit node hostname": "Invalid exit node hostname", "Invalid exit node hostname": "Invalid exit node hostname",
"Not connected": "Not connected",
"Failed to connect to Tailscale": "Failed to connect to Tailscale", "Failed to connect to Tailscale": "Failed to connect to Tailscale",
"Failed to disconnect from Tailscale": "Failed to disconnect from Tailscale", "Failed to disconnect from Tailscale": "Failed to disconnect from Tailscale",
"Failed to set exit node": "Failed to set exit node", "Failed to set exit node": "Failed to set exit node",

View file

@ -9,5 +9,5 @@
"component": "./TailscaleWidget.qml", "component": "./TailscaleWidget.qml",
"permissions": ["process"], "permissions": ["process"],
"requires": ["tailscale"], "requires": ["tailscale"],
"version": "0.2.0" "version": "0.2.1"
} }