Documentation
¶
Overview ¶
Package providers catalogs the AI coding agents that hawk can be invoked from. The matrix is built into GrayCode Hawk's bin/install.js (PROVIDERS array, 34 entries) and adapted to native Go.
Each entry in the matrix describes:
- id: short kebab-case identifier
- label: human-readable name
- mech: install mechanism (e.g. "npx skills add (claude)")
- profile: vercel-labs/skills slug (for npx-based installs)
- detect: detection clause spec ("command:foo" or "dir:$HOME/.foo" or "vscode-ext:foo" or "macapp:Name" or "jetbrains-plugin:foo"); clauses are OR-separated by "||"
- soft: optional; true means detection is best-effort, the provider is excluded from auto-detect and only installable via explicit opt-in
The Detected field is populated by Detect() when a probe succeeds (e.g. the command is on PATH, the directory exists, etc.).
GrayCode native implementation. bin/install.js. Ported to native Go.
Index ¶
Constants ¶
This section is empty.
Variables ¶
var Catalog = []Provider{ {ID: "claude", Label: "Claude Code", Mech: MechClaudePlugin, Detect: "command:claude"}, {ID: "gemini", Label: "Gemini CLI", Mech: MechGeminiExtensions, Detect: "command:gemini"}, {ID: "opencode", Label: "opencode", Mech: MechOpenCodePlugin, Detect: "command:opencode"}, {ID: "openclaw", Label: "OpenClaw", Mech: MechOpenClawSkill, Detect: "command:openclaw||dir:$HOME/.openclaw/workspace"}, {ID: "codex", Label: "Codex CLI", Mech: MechNpxSkillsAdd, Detect: "command:codex", Profile: "codex"}, {ID: "cursor", Label: "Cursor", Mech: MechNpxSkillsAdd, Detect: "command:cursor||macapp:Cursor", Profile: "cursor"}, {ID: "windsurf", Label: "Windsurf", Mech: MechNpxSkillsAdd, Detect: "command:windsurf||macapp:Windsurf", Profile: "windsurf"}, {ID: "cline", Label: "Cline", Mech: MechNpxSkillsAdd, Detect: "vscode-ext:cline", Profile: "cline"}, {ID: "continue", Label: "Continue", Mech: MechNpxSkillsAdd, Detect: "vscode-ext:continue.continue||vscode-ext:continue", Profile: "continue"}, {ID: "kilo", Label: "Kilo Code", Mech: MechNpxSkillsAdd, Detect: "vscode-ext:kilocode", Profile: "kilo"}, {ID: "roo", Label: "Roo Code", Mech: MechNpxSkillsAdd, Detect: "vscode-ext:roo||vscode-ext:rooveterinaryinc.roo-cline||cursor-ext:roo", Profile: "roo"}, {ID: "augment", Label: "Augment Code", Mech: MechNpxSkillsAdd, Detect: "vscode-ext:augment||jetbrains-plugin:augment", Profile: "augment"}, {ID: "copilot", Label: "GitHub Copilot", Mech: MechNpxSkillsAdd, Detect: "command:copilot", Profile: "github-copilot", Soft: true}, {ID: "aider-desk", Label: "Aider Desk", Mech: MechNpxSkillsAdd, Detect: "command:aider", Profile: "aider-desk"}, {ID: "amp", Label: "Sourcegraph Amp", Mech: MechNpxSkillsAdd, Detect: "command:amp", Profile: "amp"}, {ID: "bob", Label: "IBM Bob", Mech: MechNpxSkillsAdd, Detect: "command:bob", Profile: "bob"}, {ID: "crush", Label: "Crush", Mech: MechNpxSkillsAdd, Detect: "command:crush", Profile: "crush"}, {ID: "devin", Label: "Devin (terminal)", Mech: MechNpxSkillsAdd, Detect: "command:devin", Profile: "devin"}, {ID: "droid", Label: "Droid (Factory)", Mech: MechNpxSkillsAdd, Detect: "command:droid", Profile: "droid"}, {ID: "forgecode", Label: "ForgeCode", Mech: MechNpxSkillsAdd, Detect: "command:forge", Profile: "forgecode"}, {ID: "goose", Label: "Block Goose", Mech: MechNpxSkillsAdd, Detect: "command:goose", Profile: "goose"}, {ID: "iflow", Label: "iFlow CLI", Mech: MechNpxSkillsAdd, Detect: "command:iflow", Profile: "iflow-cli"}, {ID: "kiro", Label: "Kiro CLI", Mech: MechNpxSkillsAdd, Detect: "command:kiro", Profile: "kiro-cli"}, {ID: "mistral", Label: "Mistral Vibe", Mech: MechNpxSkillsAdd, Detect: "command:mistral", Profile: "mistral-vibe"}, {ID: "openhands", Label: "OpenHands", Mech: MechNpxSkillsAdd, Detect: "command:openhands", Profile: "openhands"}, {ID: "qwen", Label: "Qwen Code", Mech: MechNpxSkillsAdd, Detect: "command:qwen", Profile: "qwen-code"}, {ID: "rovodev", Label: "Atlassian Rovo Dev", Mech: MechNpxSkillsAdd, Detect: "command:rovodev", Profile: "rovodev"}, {ID: "tabnine", Label: "Tabnine CLI", Mech: MechNpxSkillsAdd, Detect: "command:tabnine", Profile: "tabnine-cli"}, {ID: "trae", Label: "Trae", Mech: MechNpxSkillsAdd, Detect: "command:trae", Profile: "trae"}, {ID: "warp", Label: "Warp", Mech: MechNpxSkillsAdd, Detect: "command:warp", Profile: "warp"}, {ID: "replit", Label: "Replit Agent", Mech: MechNpxSkillsAdd, Detect: "command:replit", Profile: "replit"}, {ID: "junie", Label: "JetBrains Junie", Mech: MechNpxSkillsAdd, Detect: "jetbrains-plugin:junie", Profile: "junie", Soft: true}, {ID: "qoder", Label: "Qoder", Mech: MechNpxSkillsAdd, Detect: "dir:$HOME/.qoder", Profile: "qoder", Soft: true}, {ID: "antigravity", Label: "Google Antigravity", Mech: MechNpxSkillsAdd, Detect: "dir:$HOME/.gemini/antigravity", Profile: "antigravity", Soft: true}, }
Catalog is the full PROVIDERS matrix.
Functions ¶
This section is empty.
Types ¶
type Probe ¶
Probe is a single detection clause within a provider's detect spec.
func ProbesParse ¶
ProbesParse parses a "detect" spec string into a slice of Probe. Clauses are OR-separated by "||". Each clause is "<kind>:<arg>". $HOME and ~ are expanded.
type ProbeKind ¶
type ProbeKind string
ProbeKind identifies a single detection clause kind.
const ( ProbeCommand ProbeKind = "command" // command:<name> — binary on PATH ProbeDir ProbeKind = "dir" // dir:<path> — directory exists ProbeVSCodeExt ProbeKind = "vscode-ext" // vscode-ext:<id> — VS Code/Cursor/Windsurf extension ProbeCursorExt ProbeKind = "cursor-ext" // cursor-ext:<id> — Cursor-specific extension ProbeMacApp ProbeKind = "macapp" // macapp:<name> — installed macOS app ProbeJetBrainsPlugin ProbeKind = "jetbrains-plugin" // jetbrains-plugin:<id> )
type Provider ¶
type Provider struct {
ID string
Label string
Mech Mech
Detect string // raw spec string for human display
Probes []Probe
Profile string
Soft bool
// Detected is set by Detect() to true when at least one of
// the Probes fired. It is NOT serialized as part of the
// catalog snapshot.
Detected bool `json:"-"`
}
Provider is a single row in the PROVIDERS matrix.
func Detect ¶
func Detect() []Provider
Detect runs every probe in the catalog and returns the set of providers that have at least one probe firing. Soft providers are included (the caller can filter if needed).
The function is safe for concurrent use; the per-provider state is stored in a snapshot returned by Detect so callers can inspect it without mutating the global catalog.