providers

package
v0.1.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 25, 2026 License: MIT Imports: 7 Imported by: 0

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

View Source
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 Mech

type Mech string

Mech describes how a provider is installed.

const (
	MechClaudePlugin     Mech = "claude plugin install"
	MechGeminiExtensions Mech = "gemini extensions install"
	MechOpenCodePlugin   Mech = "native opencode plugin"
	MechOpenClawSkill    Mech = "workspace skill + SOUL.md"
	MechNpxSkillsAdd     Mech = "npx skills add"
)

type Probe

type Probe struct {
	Kind ProbeKind
	Arg  string // e.g. "claude", "$HOME/.foo", "Cursor"
}

Probe is a single detection clause within a provider's detect spec.

func ProbesParse

func ProbesParse(spec string) []Probe

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 All

func All() []Provider

All returns all providers in the catalog.

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.

func Get

func Get(id string) *Provider

Get returns a provider by id, or nil if not found.

func Hard

func Hard() []Provider

Hard returns only non-soft providers (the ones that participate in auto-detect).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL