Purpose
Thin check-centric setup per the uniform setup contract (docs/PLUGIN-PHILOSOPHY.md
"Setup is explicit and repeatable" in the marketplace repository): check inspects and
reports, apply resolves. This plugin owns no consumer-project configuration. It runs
unconditionally (no consumer-config opt-in gate, unlike sibling formatter plugins Ruff/typos),
so the only tunable is the native userConfig toggle. Like typos-format, goimports has no
per-repo dependency-manager install path in the way Ruff's .venv does. It is conventionally
go installed to the machine-global $GOPATH/bin, never as a project dependency. apply is
therefore guidance-only: it never installs anything, matching the hook's own PATH-only
resolution and the plugin philosophy's never-download-silently rule.
Action routing: no argument or check runs the check; apply runs the check first, then
prints remediation guidance for each FAIL. Both are non-interactive. Never prompt when the
action is given.
check (read-only)
The hook script (${CLAUDE_PLUGIN_ROOT}/hooks/go-format.sh) is the single source of truth for
what it requires and how it resolves things.
Read it first. Probe what it actually does, don't recite this file. Then run each probe via Bash and report a PASS/FAIL/INFO table with one remediation line per FAIL. Do not modify anything.
When the plugin's toggle is disabled, every prerequisite absence downgrades from FAIL to INFO. The hook exits through its enabled-gate before probing anything, so a deliberately disabled plugin is not broken. Report the probes informationally and note that re-enabling restores the FAIL semantics.
- Bash version. Check against the hook's documented floor (README Requirements),
noting any features the hook degrades without (telemetry's
EPOCHREALTIME, Bash 5.0+). jq.command -v jq. FAIL if absent: the hook then skips with a visible once-per-session notice instead of formatting.goimportsbinary.command -v goimports(the hook resolves PATH only, no.venv-style per-repo convention). Report the resolved path andgoimports -h's first line when found (goimports has no--versionflag; the help header is the closest signal). FAIL when absent. The hook then emits a visible once-per-session skip notice instead of running.- Hook toggle. Report the effective
go_format_enabledvalue:${user_config.go_format_enabled}(unexpanded or empty means defaulttrue). - Hook registration. INFO: confirm the plugin is enabled for this project
(
/plugin→ Installed) rather than parsing settings files.
There is no consumer-config probe (unlike typos-format's config-walk check). This hook runs
unconditionally by design; report that plainly as INFO, not as a gap.
apply (idempotent)
Run check, then for each FAIL print remediation guidance. Never install anything. There is
no apply install-goimports-style write path: go install golang.org/x/tools/cmd/goimports@latest
writes to the machine-global $GOPATH/bin (not project-scoped) and @latest is not
idempotent-pinned, so the only responsible action is pointing at the command and letting the
consumer run it themselves.
After the consumer installs goimports themselves, re-run check and report its actual
result. Never claim resolved without re-verifying. For everything else apply only points:
- missing
goimports:go install golang.org/x/tools/cmd/goimports@latest(requires a Go toolchain: https://go.dev/dl/). - missing
jq/ Bash: platform install instructions from the README Requirements section; this skill never installs system packages. - toggle off: reconfigure through Claude Code's native flow, per the marketplace's
plugin-reconfiguration convention, which owns the verified-version record
(https://github.com/melodic-software/claude-code-plugins/blob/main/docs/conventions/plugin-reconfiguration/README.md):
interactive
/plugin configure go-format@<marketplace>any time, or headlessclaude plugin install go-format@<marketplace> -s <scope> --config go_format_enabled=true(repeatable per key) — against an already-installed plugin it printsalready installedand still writes the value. Do not uninstall to reconfigure: uninstalling drops this plugin's entire storedpluginConfigsentry, resetting every option in the README's Options reference to its manifest default.-sdefaults touser; pass the scopeclaude plugin listreports for this plugin, and run from that project's directory for aproject/localscope, or the write lands at a scope that does not load. This skill never writes user settings orpluginConfigs. Afterwards reruncheckin a fresh session — the rendered${user_config.*}is injected at skill load and each hook receives itsCLAUDE_PLUGIN_OPTION_*from an environment fixed at session start, so a same-sessioncheckstill reports the OLD value; report the observed effective value, never an unobserved change.
Re-running apply after everything passes changes nothing and reports "already configured".
What this skill does NOT do
- Run the formatter. Editing any
.gofile exercises the hook end-to-end. - Write the plugin cache, Claude Code user settings, or
pluginConfigs. - Install
goimports. Installation is always the consumer's own choice and command, at the machine level, never a project dependency this skill records. - Download or execute tools during
checkorapply.