From eab6f8b53530d0c4a7861dad7c8edddf2f21ed2a Mon Sep 17 00:00:00 2001 From: Paul Payne Date: Sun, 22 Feb 2026 21:34:00 -0800 Subject: [PATCH] refactor: update tools handling and improve CLI documentation --- README.md | 44 ++++++++++++++++------------------- app/src/pages/Tools.tsx | 21 +++++------------ app/src/services/api/hooks.ts | 4 ++-- app/src/types/index.ts | 5 ---- cli/src/castle_cli/main.py | 2 +- notification-bridge | 2 +- recommendations.md | 5 ++-- 7 files changed, 32 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 4564db3..c546130 100644 --- a/README.md +++ b/README.md @@ -33,9 +33,6 @@ castle gateway reload # Standalone tool — CLI tool with argparse, stdin/stdout, Unix pipes castle create my-tool --type tool --description "Does something" - -# Category tool — adds to existing tools// package -castle create my-tool --type tool --category document --description "Converts something" ``` ## CLI Reference @@ -53,8 +50,8 @@ castle gateway start|stop|reload Manage Caddy reverse proxy castle service enable|disable NAME Manage a systemd service castle service status Show all service statuses castle services start|stop Start/stop everything -castle tool list List tools grouped by category -castle tool info NAME Show tool details + docs +castle tool list List all tools +castle tool info NAME Show tool details ``` ## Registry @@ -96,7 +93,7 @@ central-context/ <- content storage API (git submodule) notification-bridge/ <- desktop notification forwarder (git submodule) protonmail/ <- email sync tool/job devbox-connect/ <- SSH tunnel manager -tools/ <- category tool packages (document/, search/, system/, etc.) +pdf2md/ <- standalone tool (each tool is its own project) ruff.toml <- shared lint config pyrightconfig.json <- shared type checking config ``` @@ -130,24 +127,23 @@ pyrightconfig.json <- shared type checking config ### Tools -| Tool | Category | Description | -|------|----------|-------------| -| docx2md | document | Convert Word .docx to Markdown | -| pdf2md | document | Convert PDF to Markdown | -| html2text | document | Convert HTML to plain text | -| md2pdf | document | Convert Markdown to PDF | -| mbox2eml | document | Convert MBOX mailboxes to .eml files | -| search | search | Manage searchable file collections | -| docx-extractor | search | Extract content from Word files | -| pdf-extractor | search | Extract content from PDF files | -| text-extractor | search | Extract content from text files | -| schedule | system | Manage systemd user timers | -| backup-collect | system | Collect files for backup | -| android-backup | android | Backup Android devices via ADB | -| browser | browser | Browse the web via browser-use | -| gpt | gpt | OpenAI text generation | -| mdscraper | mdscraper | Combine text files into markdown | -| devbox-connect | standalone | SSH tunnel manager | +| Tool | Description | +|------|-------------| +| android-backup | Backup Android devices via ADB | +| browser | Browse the web via browser-use | +| devbox-connect | SSH tunnel manager | +| docx-extractor | Extract content from Word files | +| docx2md | Convert Word .docx to Markdown | +| gpt | OpenAI text generation | +| html2text | Convert HTML to plain text | +| mbox2eml | Convert MBOX mailboxes to .eml files | +| md2pdf | Convert Markdown to PDF | +| mdscraper | Combine text files into markdown | +| pdf-extractor | Extract content from PDF files | +| pdf2md | Convert PDF to Markdown | +| schedule | Manage systemd user timers | +| search | Manage searchable file collections | +| text-extractor | Extract content from text files | ### Frontends diff --git a/app/src/pages/Tools.tsx b/app/src/pages/Tools.tsx index 8f3761a..b4fb73f 100644 --- a/app/src/pages/Tools.tsx +++ b/app/src/pages/Tools.tsx @@ -4,7 +4,7 @@ import { useTools } from "@/services/api/hooks" import { ToolCard } from "@/components/ToolCard" export function ToolsPage() { - const { data: categories, isLoading } = useTools() + const { data: tools, isLoading } = useTools() return (
@@ -14,24 +14,15 @@ export function ToolsPage() {

Tools

- CLI utilities grouped by category. Each tool is installed to PATH via castle and run with uv. + CLI utilities installed to PATH via castle and run with uv.

{isLoading ? (

Loading tools...

- ) : categories?.length ? ( -
- {categories.map((cat) => ( -
-

- {cat.name} -

-
- {cat.tools.map((tool) => ( - - ))} -
-
+ ) : tools?.length ? ( +
+ {tools.map((tool) => ( + ))}
) : ( diff --git a/app/src/services/api/hooks.ts b/app/src/services/api/hooks.ts index 73a3334..3fba341 100644 --- a/app/src/services/api/hooks.ts +++ b/app/src/services/api/hooks.ts @@ -8,7 +8,7 @@ import type { GatewayInfo, ServiceActionResponse, SSEHealthEvent, - ToolCategory, + ToolSummary, ToolDetail, } from "@/types" @@ -110,7 +110,7 @@ export function useToolAction() { export function useTools() { return useQuery({ queryKey: ["tools"], - queryFn: () => apiClient.get("/tools"), + queryFn: () => apiClient.get("/tools"), }) } diff --git a/app/src/types/index.ts b/app/src/types/index.ts index dd98573..b82bc43 100644 --- a/app/src/types/index.ts +++ b/app/src/types/index.ts @@ -69,11 +69,6 @@ export interface ToolSummary { installed: boolean } -export interface ToolCategory { - name: string - tools: ToolSummary[] -} - export interface ToolDetail extends ToolSummary { docs: string | null } diff --git a/cli/src/castle_cli/main.py b/cli/src/castle_cli/main.py index 502cf50..2d9185d 100644 --- a/cli/src/castle_cli/main.py +++ b/cli/src/castle_cli/main.py @@ -120,7 +120,7 @@ def build_parser() -> argparse.ArgumentParser: # castle tool tool_parser = subparsers.add_parser("tool", help="Manage tools") tool_sub = tool_parser.add_subparsers(dest="tool_command") - tool_sub.add_parser("list", help="List all tools by category") + tool_sub.add_parser("list", help="List all tools") tool_info_parser = tool_sub.add_parser("info", help="Show tool details") tool_info_parser.add_argument("name", help="Tool name") diff --git a/notification-bridge b/notification-bridge index c2b03a1..360a409 160000 --- a/notification-bridge +++ b/notification-bridge @@ -1 +1 @@ -Subproject commit c2b03a11c1f41b95e9753f19e03f8a8cfc99b7d6 +Subproject commit 360a409ca49444d13a5d8cc881d83c2c1b6d1843 diff --git a/recommendations.md b/recommendations.md index 3c452a3..2859a11 100644 --- a/recommendations.md +++ b/recommendations.md @@ -164,9 +164,8 @@ Each project has its own ruff rules (devbox-connect: `E,F,I,W`; mboxer: `ALL`). Don't move toolkit in as a monolith. Instead: 1. Add toolkit as a submodule -2. Graduate heavy tools (`search`, `protonmail`, `browser`) into independent castle projects -3. Keep lightweight tools (`docx2md`, `html2text`, etc.) grouped in a single `tools` package -4. Promote toolkit's meta-tooling up into the castle CLI +2. Graduate all tools into independent castle projects (each tool is its own standalone package) +3. Promote toolkit's meta-tooling up into the castle CLI ## 11. What to defer