refactor: update tools handling and improve CLI documentation
This commit is contained in:
44
README.md
44
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/<category>/ 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
|
||||
|
||||
|
||||
@@ -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 (
|
||||
<div className="max-w-6xl mx-auto px-6 py-8">
|
||||
@@ -14,26 +14,17 @@ export function ToolsPage() {
|
||||
|
||||
<h1 className="text-3xl font-bold mb-2">Tools</h1>
|
||||
<p className="text-sm text-[var(--muted)] mb-8">
|
||||
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.
|
||||
</p>
|
||||
|
||||
{isLoading ? (
|
||||
<p className="text-[var(--muted)]">Loading tools...</p>
|
||||
) : categories?.length ? (
|
||||
<div className="space-y-8">
|
||||
{categories.map((cat) => (
|
||||
<section key={cat.name}>
|
||||
<h2 className="text-lg font-semibold mb-3 text-[var(--muted)]">
|
||||
{cat.name}
|
||||
</h2>
|
||||
) : tools?.length ? (
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
||||
{cat.tools.map((tool) => (
|
||||
{tools.map((tool) => (
|
||||
<ToolCard key={tool.id} tool={tool} />
|
||||
))}
|
||||
</div>
|
||||
</section>
|
||||
))}
|
||||
</div>
|
||||
) : (
|
||||
<p className="text-[var(--muted)]">No tools registered.</p>
|
||||
)}
|
||||
|
||||
@@ -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<ToolCategory[]>("/tools"),
|
||||
queryFn: () => apiClient.get<ToolSummary[]>("/tools"),
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
@@ -69,11 +69,6 @@ export interface ToolSummary {
|
||||
installed: boolean
|
||||
}
|
||||
|
||||
export interface ToolCategory {
|
||||
name: string
|
||||
tools: ToolSummary[]
|
||||
}
|
||||
|
||||
export interface ToolDetail extends ToolSummary {
|
||||
docs: string | null
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
|
||||
Submodule notification-bridge updated: c2b03a11c1...360a409ca4
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user