Releases: faustbrian/glippy
Release list
Glippy v1.0.0
Glippy v1.0.0
Status: stable release contract
Glippy v1 is one opinionated Go CLI for deterministic width-aware formatting,
correctness-focused linting, transactional fixes, repository checks, machine
diagnostics, and editor integration through stdin/stdout and LSP. These notes
define the first stable Glippy release.
Changes From Gox v0.1.0
Gox v0.1.0 is the previous tagged, published stable version; its
GitHub release is
not a draft or prerelease. This section is the complete public contract delta
from that tag. The frozen v1 manifests under
testdata/contracts/v1 are the exact
current-state authority; the linked Gox v0.1.0 references identify the old
surface.
| Surface | Gox v0.1.0 | Glippy v1.0.0 | Required adoption action |
|---|---|---|---|
| Identity | gox, github.com/faustbrian/gox, .gox.toml, //gox:, and GOX_CACHE_DIR |
glippy, github.com/faustbrian/glippy, .glippy.toml, //glippy:, and GLIPPY_CACHE_DIR |
Rename invocations, imports, configuration, suppressions, and cache overrides as described below. |
| Formatter | The current width-aware dialect, but five comment/directive ownership areas contained valid-source refusals or unnecessary verbatim fallback | The same layout policy with those source-fidelity defects corrected | Run glippy fmt --check or --diff; no deliberate layout-policy migration is required. |
| Rules | 7 IDs | 129 stable IDs: the 7 retained IDs plus 122 additions | Audit the 59 newly default-enabled correctness rules or generate a reviewed baseline. |
| Fixes | 2 fix-bearing rules: one safe and one suggestion | 20 fix-bearing rules: 3 safe, 16 suggestion, and 1 unsafe | Ordinary --fix still selects safe fixes only; opt into other classes explicitly. |
| Configuration | Version 1 with one lint.preset and no profiles, matrices, path overrides, baselines, or contracts |
Version 1 plus the additive fields and defaults listed below | Rename the file; existing fields remain accepted. Choose a profile only when its broader policy is intended. |
| CLI | fmt, lint, check, explain, version, and completion |
Those commands plus lsp, init, config, rules, and help, with the additive modes listed below |
Replace the binary name; existing command meanings are retained. |
| Machine output | Formatter, lint, and combined-check JSON schema version 1 | Formatter, lint, rule, and statistics schema version 1; combined-check schema version 2; GitHub, short, and SARIF reporters | Combined-check consumers must accept schema version 2 and the new per-file states. |
| Source versions | Go 1.25 and Go 1.26 | Go 1.25 through Go 1.27 | No action for existing source; Go 1.27 syntax is now accepted. |
| Native targets | macOS/Linux on amd64/arm64 | The same four targets, now bound to native runtime and release-budget evidence | No platform migration. Windows remains unsupported. |
| Release support | Current supported stable release | Superseded and unsupported when v1 is published | Upgrade to v1 before reporting defects; no v0.1 or long-term-support line is retained. |
There are no removed or renamed lint rule IDs, no reclassified existing fixes,
no removed configuration fields or commands, no reassigned exit codes, and no
supported operating-system or architecture removal in this delta.
Product Identity Migration
This release changes the product identity from Gox to Glippy:
- install
github.com/faustbrian/glippy/cmd/glippyand invokeglippy; - rename
.gox.tomlto.glippy.toml; - replace
//gox:suppressions with//glippy:suppressions; - replace
GOX_CACHE_DIRand Gox cache paths withGLIPPY_CACHE_DIRand the
Glippy cache namespace; and - update CI, hooks, editor commands, archive names, and version assertions.
Automatic configuration discovery accepts .gox.toml only when
.glippy.toml is absent. Finding both names fails instead of selecting one.
Legacy //gox: suppressions remain effective through this release but produce
an actionable legacy-directive migration finding. Gox cache entries are not
reused as Glippy entries.
Formatter Output Changes
Glippy v1 makes no deliberate formatter policy change relative to Gox v0.1.0.
The canonical width, indentation, block, list, binary-expression, selector,
literal, parenthesis, import-order, and blank-line policies remain the same.
Five correction areas resolve valid-source refusals or unnecessary verbatim
fallback caused by incomplete comment or directive ownership proof:
| Corrected construct | Gox v0.1.0 result | Glippy v1 result | Classification |
|---|---|---|---|
| Comments and suppressions between a label and its statement, including closing labels | Refused with no output owner | Preserves label, comment, directive line, and required blank gap | Source-fidelity defect correction |
Declaration documentation and grouped value specs ending in //nolint |
Refused equivalence validation | Preserves documentation and the trailing suppression on its physical line | Source-fidelity defect correction |
| External line-scoped suppressions on a composite opening nested in a call, an enclosing binary assignment/return or label, a field with a blank gap, or an inline field in plain/generic/grouped types | Refused when width-aware layout moved the external anchor | Preserves the affected declaration verbatim while formatting unaffected declarations | Directive-ownership defect correction |
| Blank lines between trailing top-level directive groups | Refused equivalence validation | Preserves each directive group and the separating blank line | Directive-gap defect correction |
Comments immediately before or after else, including else if |
Refused with no output owner | Preserves the comment at the else boundary |
Comment-ownership defect correction |
Label comments
Gox v0.1.0 produced no source for this valid input and reported
comment 0 has no proven output owner:
package labels
func run(){goto target;target:
// explain target
work()}Glippy v1 produces:
package labels
func run() {
goto target
target:
// explain target
work()
}Declaration documentation and trailing suppressions
Gox v0.1.0 refused this declaration because comment identity or ordering
changed:
package comments
// errUnavailable documents the declaration.
var errUnavailable = errors.New("unavailable") //nolint:unusedGlippy v1 preserves both owners while applying declaration spacing:
package comments
// errUnavailable documents the declaration.
var errUnavailable = errors.New("unavailable") //nolint:unusedNested external suppression anchors
Gox v0.1.0 refused this already canonical declaration because the external
directive source anchor changed:
package comments
func run() {
http.SetCookie(w, &http.Cookie{ //nolint:gosec
Name: "sort",
})
}Glippy v1 emits the declaration unchanged. If another declaration in the same
file needs ordinary canonical formatting, Glippy formats that declaration
without moving the protected suppression anchor.
Trailing directive groups
Gox v0.1.0 refused these trailing groups because a directive source anchor
changed:
package internal
//go:generate first
//go:generate second
//go:generate third
//go:generate fourthGlippy v1 emits the source unchanged, including the blank line separating the
two directive groups.
Comments around else
Gox v0.1.0 produced no source for this input and reported that the comment had
no proven output owner:
package control
func run(value int){if value==0{work()}else /* value != 0 */{retry()}}Glippy v1 produces:
package control
func run(value int) {
if value == 0 {
work()
} else /* value != 0 */ {
retry()
}
}The exact regression fixtures are in
internal/format/format_test.go. The
complete construct-by-construct input, prior result, v1 output, and
classification inventory is the
v1 formatter delta. The
current formatter specification and canonical examples are in the
formatter rules. The pinned 17-repository source-
fidelity and idempotency evidence is recorded by the
v1 corpus adjudication
and v0.9 exit audit. Publication
requires every correction to pass parse, normalized equivalence, comment and
directive identity, idempotency, width, golden, fuzz, and corpus gates.
Glippy deliberately is not a product-wide gofmt fixed point. Width-aware
layouts, retained import order, preserved literal and parenthesis spelling,
structural indentation, and explicit empty-statement spelling can differ from
gofmt. Repositories must remove competing gofmt, gofumpt, or golines authority
when adopting Glippy. See the
formatter migration guide.
Lint Rule Delta
The seven Gox v0.1.0 rule IDs are retained with the same group membership,
default severity, analysis tier, and fix classification:
context-key
defer-in-infinite-loop
duplicate-condition
errors-is-arguments
ineffective-break
nilness
redundant-bool-comparison
Four retained rules change only by exposing the new requires_effect_facts
metadata field as false. Three retained rules also establish broader v1
reporting or fix-reporting boundaries:
| Rule | v0.1 boundary | v1 boundary | Classification and adoption impact |
|---|---|---|---|
defer-in-infinite-loop |
Treated only built-in panic and runtime.Goexit as terminal helpers |
Reuses bounded no-return facts from selected local-source modules and exact standard-library terminal APIs | Precision correction; removes findings on paths proven to terminate. Re-run recommended or strict policy before adopting. |
nilness |
Used the s... |
Gox v0.1.0
Gox v0.1.0 is the first supported release of the Go-native formatter, linter,
and safe fixer.
Highlights
- Deterministic, width-aware formatting for complete files and standard-input
fragments, including compressed blocks, semicolon-separated statements,
boolean chains, calls, literals, signatures, and function literals. - Comment, directive, literal, build-constraint, and source-trivia preservation
backed by reparsing, normalized equivalence, idempotency, corpus, and fuzz
gates. - Correctness-focused linting with demand-driven syntax, types, CFG, and SSA
analysis tiers and deterministic text or versioned JSON diagnostics. - Safe, suggestion, and unsafe fix classes with stale-source and overlap
rejection, full-file validation, formatter normalization, and atomic local
replacement. - Cohesive
fmt,lint,check,explain,version, and shell-completion
command surfaces for editors, CI, and pre-commit workflows.
Installation
Download the archive for macOS or Linux on amd64 or arm64, verify it with the
published checksum file, and place gox on PATH. Source installation is also
available:
go install github.com/faustbrian/gox/cmd/gox@v0.1.0Verify GitHub-hosted build provenance with:
gh attestation verify <downloaded-artifact> --repo faustbrian/goxCompatibility And Scope
- Supported source languages: Go 1.25 and Go 1.26.
- Supported runtimes: macOS and Linux on amd64 and arm64.
- Windows is unsupported.
- Network, distributed, and userspace filesystems and forced-power-loss
durability are outside write and fix guarantees. - Gox intentionally has documented formatting divergences from gofmt, gofumpt,
and golines. Use one formatter authority per selected file and review the
migration guide before repository-wide adoption. - The maintainer accepted the documented ecosystem-collision and
trademark-risk boundary for the Gox name. This is not legal trademark
clearance.
Every archive contains the 0BSD project license and deterministic third-party
notices. The release manifest binds all four archives to source commit
c0435d6fd70918bcdc0b1acbc9c107f9af1424fa and Go 1.26.5.
Full changelog: https://github.com/faustbrian/gox/commits/v0.1.0