# Roadmap This document tracks planned improvements to `glint`. Items are grouped by theme, roughly in priority order within each group. Nothing here is a commitment — the tool is experimental and the list will shift as real usage surfaces better priorities. --- ## Context-aware validation — ✓ single-context shipped in v0.2.0 Single-context simulation is fully implemented. Pass `--branch`, `--tag`, `--source`, or `--var` to either `glint check` or `glint graph`; jobs are evaluated and shown as active / manual / skipped. ```bash # shipped: single-context simulation glint check --branch develop .gitlab-ci.yml glint check --tag v1.2.0 .gitlab-ci.yml glint check --source merge_request_event --var CI_MERGE_REQUEST_TARGET_BRANCH_NAME=main .gitlab-ci.yml glint graph tree --branch main .gitlab-ci.yml # tree annotated with [skipped] / [manual] ``` **Remaining work** - **Multi-context simulation** — run multiple contexts in one invocation and print a comparison table: ```bash glint check --context branch=main --context branch=develop --context tag=v1.0.0 .gitlab-ci.yml ``` - **Context-scoped linting** — skip `needs:`/`dependencies:` cross-checks for jobs that are statically unreachable in the given context - **`rules:changes:` evaluation** — path glob evaluation against the local git tree (expression evaluator priority 5) --- ## Lint coverage The current rule set covers the most common sources of broken pipelines. These are the gaps most likely to matter in practice. - **Variable reference validation** — warn when a job references `$VAR` (or `${VAR}`) that is not declared anywhere in `variables:`, `default.variables`, or the job itself - **`services:` validation** — map form requires `name`; `alias` must be a valid DNS label - **`rules:changes` / `rules:exists`** — warn on glob patterns that can never match (e.g. absolute paths, double `**` on unsupported versions) - **`timeout` format** — must be a duration string GitLab understands (`1h 30m`, `90 minutes`, etc.) - **`id_tokens:` / `secrets:`** — presence and required-key checks - **`pages:publish`** — validate that the path is consistent with `artifacts.paths` - **`inherit:` completeness** — flag when a job overrides a default field that would require `inherit: default: false` to suppress - **Unreachable jobs** — detect jobs that can never run because every `rules:` branch evaluates to `never` (static analysis only, no variable expansion) - **Duplicate stage names** — GitLab silently merges them; warn to avoid confusion - **`cache:key:files`** — must be a list of paths, not a glob --- ## Include resolution - ~~**`include: local:`** full resolution~~ — ✓ shipped in v0.2.0; local files are read from disk, recursively resolved, and merged before linting - **`include: remote:`** (URL) — fetch and merge plain HTTP/HTTPS URLs (no auth required) - **Recursive include depth limit** — guard against include cycles across files - **Offline mode / cache** — persist fetched remote templates to a local cache directory; `--offline` flag to skip network calls and use only cached copies - **`include: inputs:`** — substitute CI component input values into fetched templates before merging, so component-scoped jobs get their correct `stage:` and keyword values --- ## Output formats Right now the only output is plain-text findings. Structured output enables integration with other tools. - **JSON** (`--format json`) — machine-readable findings with file, job, severity, rule ID, and message; stable schema - **SARIF** (`--format sarif`) — [Static Analysis Results Interchange Format](https://sarifweb.azurewebsites.net); consumed natively by GitHub Code Scanning and GitLab SAST - **JUnit XML** (`--format junit`) — lets CI pipelines publish lint results as a test report artifact - **GitHub / GitLab annotation format** — emit `::error file=…,line=…::message` lines so findings appear as inline comments in PR diffs --- ## Pipeline graph improvements The SVG renderer and terminal tree cover the basic layout. These would bring it closer to GitLab's full interactive view. - ~~**Terminal job tree**~~ — ✓ shipped in v0.2.0 as `glint graph tree`; stages as branches, jobs as leaves, context-aware annotations - **Multi-job connector accuracy** — draw one connector per job pair rather than one per stage pair in classic mode, so pipelines with uneven columns look correct - **Job tooltip / detail panel** — embed a hidden `