Mac: add summarize tool
This commit is contained in:
@@ -75,139 +75,154 @@ private enum InstallState: Equatable {
|
|||||||
// MARK: - View
|
// MARK: - View
|
||||||
|
|
||||||
struct ToolsSettings: View {
|
struct ToolsSettings: View {
|
||||||
private let tools: [ToolEntry] = [
|
private let tools: [ToolEntry] = Self.makeTools()
|
||||||
ToolEntry(
|
|
||||||
id: "mcporter",
|
static var toolIDsForTests: [String] {
|
||||||
name: "🧳 mcporter",
|
makeTools().map(\.id)
|
||||||
url: URL(string: "https://github.com/steipete/mcporter")!,
|
}
|
||||||
description: "MCP runtime/CLI to discover servers, run tools, and sync configs across AI clients.",
|
|
||||||
method: .node(package: "mcporter", binary: "mcporter"),
|
private static func makeTools() -> [ToolEntry] {
|
||||||
kind: .tool),
|
[
|
||||||
ToolEntry(
|
ToolEntry(
|
||||||
id: "peekaboo",
|
id: "mcporter",
|
||||||
name: "🫣 Peekaboo",
|
name: "🧳 mcporter",
|
||||||
url: URL(string: "https://github.com/steipete/Peekaboo")!,
|
url: URL(string: "https://github.com/steipete/mcporter")!,
|
||||||
description: "Lightning-fast macOS screenshots with AI vision helpers for step-by-step automation.",
|
description: "MCP runtime/CLI to discover servers, run tools, and sync configs across AI clients.",
|
||||||
method: .brew(formula: "steipete/tap/peekaboo", binary: "peekaboo"),
|
method: .node(package: "mcporter", binary: "mcporter"),
|
||||||
kind: .tool),
|
kind: .tool),
|
||||||
ToolEntry(
|
ToolEntry(
|
||||||
id: "camsnap",
|
id: "peekaboo",
|
||||||
name: "📸 camsnap",
|
name: "🫣 Peekaboo",
|
||||||
url: URL(string: "https://github.com/steipete/camsnap")!,
|
url: URL(string: "https://github.com/steipete/Peekaboo")!,
|
||||||
description: "One command to grab frames, clips, or motion alerts from RTSP/ONVIF cameras.",
|
description: "Lightning-fast macOS screenshots with AI vision helpers for step-by-step automation.",
|
||||||
method: .brew(formula: "steipete/tap/camsnap", binary: "camsnap"),
|
method: .brew(formula: "steipete/tap/peekaboo", binary: "peekaboo"),
|
||||||
kind: .tool),
|
kind: .tool),
|
||||||
ToolEntry(
|
ToolEntry(
|
||||||
id: "oracle",
|
id: "camsnap",
|
||||||
name: "🧿 oracle",
|
name: "📸 camsnap",
|
||||||
url: URL(string: "https://github.com/steipete/oracle")!,
|
url: URL(string: "https://github.com/steipete/camsnap")!,
|
||||||
description: "Runs OpenAI-ready agent workflows from the CLI with session replay and browser control.",
|
description: "One command to grab frames, clips, or motion alerts from RTSP/ONVIF cameras.",
|
||||||
method: .node(package: "@steipete/oracle", binary: "oracle"),
|
method: .brew(formula: "steipete/tap/camsnap", binary: "camsnap"),
|
||||||
kind: .tool),
|
kind: .tool),
|
||||||
ToolEntry(
|
ToolEntry(
|
||||||
id: "qmd",
|
id: "oracle",
|
||||||
name: "🔎 qmd",
|
name: "🧿 oracle",
|
||||||
url: URL(string: "https://github.com/tobi/qmd")!,
|
url: URL(string: "https://github.com/steipete/oracle")!,
|
||||||
description: "Hybrid markdown search (BM25 + vectors + rerank) with an MCP server for agents.",
|
description: "Runs OpenAI-ready agent workflows from the CLI with session replay and browser control.",
|
||||||
method: .node(package: "https://github.com/tobi/qmd", binary: "qmd"),
|
method: .node(package: "@steipete/oracle", binary: "oracle"),
|
||||||
kind: .tool),
|
kind: .tool),
|
||||||
ToolEntry(
|
ToolEntry(
|
||||||
id: "eightctl",
|
id: "summarize",
|
||||||
name: "🛏️ eightctl",
|
name: "🧾 summarize",
|
||||||
url: URL(string: "https://github.com/steipete/eightctl")!,
|
url: URL(string: "https://github.com/steipete/summarize")!,
|
||||||
description: "Control your sleep, from the terminal.",
|
description: "Link → clean text → summary (web pages, YouTube, and local/remote files).",
|
||||||
method: .go(module: "github.com/steipete/eightctl/cmd/eightctl@latest", binary: "eightctl"),
|
method: .brew(formula: "steipete/tap/summarize", binary: "summarize"),
|
||||||
kind: .tool),
|
kind: .tool),
|
||||||
ToolEntry(
|
ToolEntry(
|
||||||
id: "imsg",
|
id: "qmd",
|
||||||
name: "💬 imsg",
|
name: "🔎 qmd",
|
||||||
url: URL(string: "https://github.com/steipete/imsg")!,
|
url: URL(string: "https://github.com/tobi/qmd")!,
|
||||||
description: "Send, read, stream iMessage & SMS.",
|
description: "Hybrid markdown search (BM25 + vectors + rerank) with an MCP server for agents.",
|
||||||
method: .go(module: "github.com/steipete/imsg/cmd/imsg@latest", binary: "imsg"),
|
method: .node(package: "https://github.com/tobi/qmd", binary: "qmd"),
|
||||||
kind: .tool),
|
kind: .tool),
|
||||||
ToolEntry(
|
ToolEntry(
|
||||||
id: "wacli",
|
id: "eightctl",
|
||||||
name: "🗃️ wacli",
|
name: "🛏️ eightctl",
|
||||||
url: URL(string: "https://github.com/steipete/wacli")!,
|
url: URL(string: "https://github.com/steipete/eightctl")!,
|
||||||
description: "WhatsApp CLI: sync, search, send.",
|
description: "Control your sleep, from the terminal.",
|
||||||
method: .go(module: "github.com/steipete/wacli/cmd/wacli@latest", binary: "wacli"),
|
method: .go(module: "github.com/steipete/eightctl/cmd/eightctl@latest", binary: "eightctl"),
|
||||||
kind: .tool),
|
kind: .tool),
|
||||||
ToolEntry(
|
ToolEntry(
|
||||||
id: "spotify-player",
|
id: "imsg",
|
||||||
name: "🎵 spotify-player",
|
name: "💬 imsg",
|
||||||
url: URL(string: "https://github.com/aome510/spotify-player")!,
|
url: URL(string: "https://github.com/steipete/imsg")!,
|
||||||
description: "Terminal Spotify client to queue, search, and control playback without leaving chat.",
|
description: "Send, read, stream iMessage & SMS.",
|
||||||
method: .brew(formula: "spotify_player", binary: "spotify_player"),
|
method: .go(module: "github.com/steipete/imsg/cmd/imsg@latest", binary: "imsg"),
|
||||||
kind: .tool),
|
kind: .tool),
|
||||||
ToolEntry(
|
ToolEntry(
|
||||||
id: "sonoscli",
|
id: "wacli",
|
||||||
name: "🔊 sonoscli",
|
name: "🗃️ wacli",
|
||||||
url: URL(string: "https://github.com/steipete/sonoscli")!,
|
url: URL(string: "https://github.com/steipete/wacli")!,
|
||||||
description: "Control Sonos speakers (discover, status, play/pause, volume, grouping) from scripts.",
|
description: "WhatsApp CLI: sync, search, send.",
|
||||||
method: .go(module: "github.com/steipete/sonoscli/cmd/sonos@latest", binary: "sonos"),
|
method: .go(module: "github.com/steipete/wacli/cmd/wacli@latest", binary: "wacli"),
|
||||||
kind: .tool),
|
kind: .tool),
|
||||||
ToolEntry(
|
ToolEntry(
|
||||||
id: "blucli",
|
id: "spotify-player",
|
||||||
name: "🫐 blucli",
|
name: "🎵 spotify-player",
|
||||||
url: URL(string: "https://github.com/steipete/blucli")!,
|
url: URL(string: "https://github.com/aome510/spotify-player")!,
|
||||||
description: "Play, group, and automate BluOS players from scripts.",
|
description: "Terminal Spotify client to queue, search, and control playback without leaving chat.",
|
||||||
method: .go(module: "github.com/steipete/blucli/cmd/blu@latest", binary: "blu"),
|
method: .brew(formula: "spotify_player", binary: "spotify_player"),
|
||||||
kind: .tool),
|
kind: .tool),
|
||||||
ToolEntry(
|
ToolEntry(
|
||||||
id: "sag",
|
id: "sonoscli",
|
||||||
name: "🗣️ sag",
|
name: "🔊 sonoscli",
|
||||||
url: URL(string: "https://github.com/steipete/sag")!,
|
url: URL(string: "https://github.com/steipete/sonoscli")!,
|
||||||
description: "ElevenLabs speech with mac-style say UX; streams to speakers by default.",
|
description: "Control Sonos speakers (discover, status, play/pause, volume, grouping) from scripts.",
|
||||||
method: .brew(formula: "steipete/tap/sag", binary: "sag"),
|
method: .go(module: "github.com/steipete/sonoscli/cmd/sonos@latest", binary: "sonos"),
|
||||||
kind: .tool),
|
kind: .tool),
|
||||||
ToolEntry(
|
ToolEntry(
|
||||||
id: "openhue-cli",
|
id: "blucli",
|
||||||
name: "💡 OpenHue CLI",
|
name: "🫐 blucli",
|
||||||
url: URL(string: "https://github.com/openhue/openhue-cli")!,
|
url: URL(string: "https://github.com/steipete/blucli")!,
|
||||||
description: "Control Philips Hue lights from scripts—scenes, dimming, and automations.",
|
description: "Play, group, and automate BluOS players from scripts.",
|
||||||
method: .brew(formula: "openhue/cli/openhue-cli", binary: "openhue"),
|
method: .go(module: "github.com/steipete/blucli/cmd/blu@latest", binary: "blu"),
|
||||||
kind: .tool),
|
kind: .tool),
|
||||||
ToolEntry(
|
ToolEntry(
|
||||||
id: "openai-whisper",
|
id: "sag",
|
||||||
name: "🎙️ OpenAI Whisper",
|
name: "🗣️ sag",
|
||||||
url: URL(string: "https://github.com/openai/whisper")!,
|
url: URL(string: "https://github.com/steipete/sag")!,
|
||||||
description: "Local speech-to-text for quick dictation and voicemail transcripts.",
|
description: "ElevenLabs speech with mac-style say UX; streams to speakers by default.",
|
||||||
method: .brew(formula: "openai-whisper", binary: "whisper"),
|
method: .brew(formula: "steipete/tap/sag", binary: "sag"),
|
||||||
kind: .tool),
|
kind: .tool),
|
||||||
ToolEntry(
|
ToolEntry(
|
||||||
id: "gog",
|
id: "openhue-cli",
|
||||||
name: "📮 gog",
|
name: "💡 OpenHue CLI",
|
||||||
url: URL(string: "https://github.com/steipete/gogcli")!,
|
url: URL(string: "https://github.com/openhue/openhue-cli")!,
|
||||||
description: "Google Suite CLI: Gmail, Calendar, Drive, Contacts.",
|
description: "Control Philips Hue lights from scripts—scenes, dimming, and automations.",
|
||||||
method: .brew(formula: "steipete/tap/gogcli", binary: "gog"),
|
method: .brew(formula: "openhue/cli/openhue-cli", binary: "openhue"),
|
||||||
kind: .tool),
|
kind: .tool),
|
||||||
ToolEntry(
|
ToolEntry(
|
||||||
id: "gemini-cli",
|
id: "openai-whisper",
|
||||||
name: "♊️ Gemini CLI",
|
name: "🎙️ OpenAI Whisper",
|
||||||
url: URL(string: "https://github.com/google-gemini/gemini-cli")!,
|
url: URL(string: "https://github.com/openai/whisper")!,
|
||||||
description: "Google Gemini models from the terminal for fast Q&A and web-grounded summaries.",
|
description: "Local speech-to-text for quick dictation and voicemail transcripts.",
|
||||||
method: .brew(formula: "gemini-cli", binary: "gemini"),
|
method: .brew(formula: "openai-whisper", binary: "whisper"),
|
||||||
kind: .tool),
|
kind: .tool),
|
||||||
ToolEntry(
|
ToolEntry(
|
||||||
id: "bird",
|
id: "gog",
|
||||||
name: "🐦 bird",
|
name: "📮 gog",
|
||||||
url: URL(string: "https://github.com/steipete/bird")!,
|
url: URL(string: "https://github.com/steipete/gogcli")!,
|
||||||
description: "Fast X/Twitter CLI to tweet, reply, read threads, and search without a browser.",
|
description: "Google Suite CLI: Gmail, Calendar, Drive, Contacts.",
|
||||||
method: .pnpm(
|
method: .brew(formula: "steipete/tap/gogcli", binary: "gog"),
|
||||||
repoPath: "\(NSHomeDirectory())/Projects/bird",
|
kind: .tool),
|
||||||
script: "binary",
|
ToolEntry(
|
||||||
binary: "bird"),
|
id: "gemini-cli",
|
||||||
kind: .tool),
|
name: "♊️ Gemini CLI",
|
||||||
ToolEntry(
|
url: URL(string: "https://github.com/google-gemini/gemini-cli")!,
|
||||||
id: "agent-tools",
|
description: "Google Gemini models from the terminal for fast Q&A and web-grounded summaries.",
|
||||||
name: "🧰 agent-tools",
|
method: .brew(formula: "gemini-cli", binary: "gemini"),
|
||||||
url: URL(string: "https://github.com/badlogic/agent-tools")!,
|
kind: .tool),
|
||||||
description: "Collection of utilities and scripts tuned for autonomous agents and MCP clients.",
|
ToolEntry(
|
||||||
method: .gitClone(
|
id: "bird",
|
||||||
url: "https://github.com/badlogic/agent-tools.git",
|
name: "🐦 bird",
|
||||||
destination: "\(NSHomeDirectory())/agent-tools"),
|
url: URL(string: "https://github.com/steipete/bird")!,
|
||||||
kind: .tool),
|
description: "Fast X/Twitter CLI to tweet, reply, read threads, and search without a browser.",
|
||||||
]
|
method: .pnpm(
|
||||||
|
repoPath: "\(NSHomeDirectory())/Projects/bird",
|
||||||
|
script: "binary",
|
||||||
|
binary: "bird"),
|
||||||
|
kind: .tool),
|
||||||
|
ToolEntry(
|
||||||
|
id: "agent-tools",
|
||||||
|
name: "🧰 agent-tools",
|
||||||
|
url: URL(string: "https://github.com/badlogic/agent-tools")!,
|
||||||
|
description: "Collection of utilities and scripts tuned for autonomous agents and MCP clients.",
|
||||||
|
method: .gitClone(
|
||||||
|
url: "https://github.com/badlogic/agent-tools.git",
|
||||||
|
destination: "\(NSHomeDirectory())/agent-tools"),
|
||||||
|
kind: .tool),
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
@AppStorage("tools.packageManager") private var packageManagerRaw = NodePackageManager.npm.rawValue
|
@AppStorage("tools.packageManager") private var packageManagerRaw = NodePackageManager.npm.rawValue
|
||||||
@State private var installStates: [String: InstallState] = [:]
|
@State private var installStates: [String: InstallState] = [:]
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ struct SettingsViewSmokeTests {
|
|||||||
enabled: false,
|
enabled: false,
|
||||||
createdAtMs: 1_700_000_000_000,
|
createdAtMs: 1_700_000_000_000,
|
||||||
updatedAtMs: 1_700_000_100_000,
|
updatedAtMs: 1_700_000_100_000,
|
||||||
schedule: .every(everyMs: 30_000, anchorMs: nil),
|
schedule: .every(everyMs: 30000, anchorMs: nil),
|
||||||
sessionTarget: .isolated,
|
sessionTarget: .isolated,
|
||||||
wakeMode: .nextHeartbeat,
|
wakeMode: .nextHeartbeat,
|
||||||
payload: .agentTurn(
|
payload: .agentTurn(
|
||||||
@@ -148,4 +148,8 @@ struct SettingsViewSmokeTests {
|
|||||||
let view = ToolsSettings()
|
let view = ToolsSettings()
|
||||||
_ = view.body
|
_ = view.body
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test func toolsSettingsIncludesSummarize() {
|
||||||
|
#expect(ToolsSettings.toolIDsForTests.contains("summarize"))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user