Replace the per-line fmt.Println loop with writeTextFindings() in
cmd/glint/output.go. The new renderer:
- Aligns all findings into four space-separated columns: location,
rule ID, severity, message — widths computed from the full finding
set so all lines are flush
- Colors severity words when stdout is a TTY and NO_COLOR is not set:
red+bold for "error", orange+bold for "warning"; location dimmed;
rule ID bold
- Formats location as file:line:col when column is known, file:line
otherwise, falling back to just file
To populate column numbers, add Column int to model.Job (set from
keyNode.Column in the YAML parser) and Finding.Column (set during
the checkJob source-location attachment pass and in the ten cross-job
check sites that explicitly set Line: job.Line).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- `glint explain <RULE>`: new subcommand printing rule description,
rationale, bad-YAML example and fix for every GL001–GL043 rule.
`glint explain` (no arg) lists all rules with ID, severity, title.
Rule IDs are case-insensitive.
- GL042 (rules:if: evaluated reachability): warns when every rules:if:
condition evaluates to false given the values of variables declared in
the pipeline YAML, making the job statically unreachable. Conservative:
only fires when all referenced variables are declared in YAML; predefined
CI_* / GITLAB_* variables are skipped to avoid false positives.
- GL043 (inherit: completeness): warns when inherit: default: is declared
but there is no default: block in the pipeline (dead declaration), or
when the list form names fields not set in the default: block.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>