Commits
* terraform generate improve
* terraform generate improve
* chore(deps): bump openstatus API to add per-component impact
* feat(status-report): add impact helpers and --impact flag parser
* refactor(status-report): convert create/add-update to params structs
* feat(status-report): wire --impact into sr create
* feat(status-report): wire --impact into sr add-update
* feat(status-report): show impact in sr info
* test(status-report): assert outbound request body for impacts
* docs(status-report): regenerate CLI docs and add --impact examples
* version dump
Adds `openstatus check <URL>` (alias `c`): a top-level, unauthenticated
command that runs a one-shot HTTP check from 28 global regions via the
public OpenStatus speed checker.
Highlights:
- Live row-per-region output streaming as NDJSON arrives, followed by
a summary footer (fastest/slowest/mean/success-rate + share URL).
- --timing adds DNS / Connection / TLS / TTFB / Transfer columns.
- --json buffers a single object with full timing nested per region,
ready for jq pipelines.
- curl-style flags -X / -H / -d (with @file and @- stdin support).
- Typed errors for 429 (parsed Retry-After + body reset fallback),
4xx (with VPN/proxy hint when body mentions client IP), 5xx,
network errors, and truncated streams.
- Region codes mapped to human-readable names (e.g. koyeb_tyo →
"Tokyo (Koyeb)") from the upstream skill repo snapshot.
Internals:
- New internal/check/ package: client.go (NDJSON streaming parser),
render.go (table + summary + JSON output), regions.go (display
names), types.go (typed errors).
- internal/api/client.go gains PlayCheckerURL pinned to
www.openstatus.dev (skips a 308 redirect on every call).
- Tests use the existing RoundTripper-interceptor pattern from
internal/run/run_test.go; fixtures captured from live probes live
in internal/check/testdata/.
Docs:
- README: new check row, dedicated Quick Start example, Global Speed
Check section.
- Manpage and generated markdown regenerated.
- skills/cli/SKILL.md teaches when to reach for check vs. saved
monitors.
Version bumped to v1.2.0 (new top-level command = semver minor).
Configure golangci-lint v2.12.2 with a curated linter set (bodyclose,
errorlint, gocritic, gosec, revive, etc.) plus gofumpt + goimports
formatters. Add a GitHub Actions workflow that runs lint on push and PR.
Tune rule suppressions for CLI idioms (tablewriter result discard, PAGER
subprocess, urfave/cli int casts, proto Id/Url naming). Apply
golangci-lint --fix across 59 files for whitespace, gofumpt, and
staticcheck rewrites; tests still pass.
- Refreshed all dependencies via 'go get -u ./... && go mod tidy'
- Bumped urfave/cli/v3 v3.0.0-alpha9.2 -> v3.9.0; BeforeFunc now returns
(context.Context, error). Updated internal/cmd/app.go accordingly.
- Bumped buf SDK to a snapshot that includes MS_TEAMS and OpenTelemetry
symbols (used by upcoming terraform-generate sync).
- Ignore local .claude/ tooling dir.
- Add plan.md design doc for the upcoming terraform-generate sync work.
Add a read-only `notification` (alias `n`) top-level command to view
notification channels configured in the workspace. Supports all 12
provider types: discord, email, google_chat, grafana_oncall, ntfy,
pagerduty, opsgenie, slack, sms, telegram, webhook, and whatsapp.
- `notification list` shows ID, name, provider, and monitor count
- `notification info <id>` shows full provider config, linked monitors,
and timestamps with nested provider-specific data in JSON output
- Follows the same patterns as status-page (dual client factory,
interceptor test helpers, JSON/table output branching)
Adds `openstatus terraform generate` (alias `tf gen`) that fetches all
workspace resources and generates Terraform HCL files with import blocks.
- New `internal/terraform/` package with fetch, HCL generation (hclwrite),
naming/dedup, region mapping (28 regions), and enum converters
- Generates provider.tf, monitors.tf, notifications.tf, status_pages.tf,
and imports.tf in ./openstatus-terraform/
- Supports HTTP, TCP, DNS monitors, 12 notification providers, status pages
with components and component groups
- Cross-references single-value fields (page_id, monitor_id, group_id) as
Terraform traversals with fallback to raw strings
- Sensitive values emitted as "REPLACE_ME" with TODO comments
- Updates CLI skill with terraform trigger phrases and workflow docs
Add `maintenance` (alias `mt`) command with create, list, info, update,
and delete subcommands for managing maintenance windows via the
Connect RPC API.
Extract shared wizard helpers (NotEmpty, HandleFormError, BuildSummary,
FetchStatusPages, FetchPageComponents, ValidRFC3339) into
`internal/wizard/` and export StatusPageURL from `internal/statuspage/`
to eliminate duplication between statusreport and maintenance wizards.
Add FormatTimestamp utility to shorten RFC 3339 timestamps in human
output (`2006-01-02 15:04 UTC`) across both maintenance and
status report commands.
When required flags are missing and stdin is a TTY, launch a step-by-step
wizard using charmbracelet/huh instead of erroring out. Flags still work
for scripting and CI — non-TTY/--json mode returns a clear missing-flags
error.
Wizard features:
- Status page select with URL display (sr create)
- Component multi-select from the selected page (sr create)
- Status report select with unresolved-first filtering (sr add-update)
- Multi-line message input for create, single-line for add-update
- Summary note + confirmation before submission
- Ctrl+C prints "Aborted." and exits 130
Also adds IsStdinTerminal() to internal/cli for proper stdin TTY detection.
Add a skill that teaches Claude how to use the openstatus CLI — commands,
flags, workflows, and config format. Covers monitors-as-code, incident
lifecycle, status reports, and synthetic testing.
- Show custom domain URL instead of default slug URL in status page list
- Update proto dependency to include custom_domain on StatusPageSummary
- Display default locale and defined locales in status page info
- Fix missing fields in httpMonitorToLocal/tcpMonitorToLocal (DegradedAfter, Body, Headers, Assertions)
- Add parallel GetMonitorStatus and GetMonitorSummary RPC calls with graceful degradation
- Display global status (active/degraded/error) color-coded in config table
- Add per-region status table with provider labels
- Add summary metrics table (success/degraded/failed counts, P50-P99 latency, last ping)
- Add assertions table for HTTP monitors
- Add --time-range flag (1d/7d/14d) for summary period selection
- New JSON output wrapper struct with monitor, status, regions, and summary sections
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add a new `status-page` (alias `sp`) command group with two subcommands:
- `list`: displays all status pages with ID, title, and URL
- `info <page-id>`: shows page details and attached components grouped
by component group, using the GetStatusPageContent RPC
URL resolves to custom domain when available, otherwise slug.openstatus.dev.
Critical fixes:
- Fix region mapping collision causing silent data loss on round-trip
(Koyeb/Railway regions now use disambiguated codes like koyeb_fra, railway_us-west2)
- Fix global koanf instance causing state pollution between ReadConfig/ReadOpenStatus calls
- Fix partial failure in ApplyChanges leaving lock map in inconsistent state
- Fix spinner leak when statusToSDK fails in status-report list/add-update
- Fix TCP monitor creation accepting zero/invalid port values
High severity fixes:
- Fix strconv.Atoi error silently ignored in httpMonitorToLocal/tcpMonitorToLocal
- Fix DNS monitor info returning opaque "unknown monitor type" error
- Fix ResolveToken silently discarding file read errors (e.g. permission denied)
- Fix confirmation prompt blocking in non-interactive environments (added TTY check)
- Fix delete commands showing confirmation with empty ID before validation
- Fix --component-ids "" silently clearing components on status-report update
- Fix monitor trigger printing plain text in --json mode
- Fix http.DefaultClient used without timeout (added api.DefaultHTTPClient with 30s)
- Fix unknown jobType aborting entire result set in run command
- Fix monitor import truncating output file before API call succeeds
- Thread context.Context through all API calls so Ctrl+C cancels in-flight requests
- Fix race condition in `run` command: collect results per goroutine, print sequentially
- Fix spinner/output overlap: stop spinner after API call, before rendering
- Move ResolveAccessToken from internal/cli to internal/auth to avoid fragile dependency
- Pass through original errors in monitor commands instead of swallowing them
- Fix TOCTOU in monitor apply: compute diff locally, then apply once
- Add fsync to lock file writes to prevent corruption on crash
- Use net.SplitHostPort for TCP URI parsing to support IPv6
- Add login/logout commands with XDG-based token persistence
- Add status report CRUD commands via Connect RPC
- Add global --json, --quiet, --debug, --no-color flags
- Add centralized error formatting for Connect RPC errors
- Add signal handling with double Ctrl+C force exit
Add `openstatus status-report` (alias `sr`) command group with 6 subcommands:
- list: list reports with optional status filter and pagination
- info: show report details with update timeline
- create: create a report linked to a status page
- update: update report metadata (title, components)
- delete: delete a report with confirmation prompt
- add-update: add timeline entry with status transition
Extract shared auth interceptor and base URLs into `internal/api/`
so both monitors and status-report packages can reuse them.
Display regions grouped by provider (Fly.io, Koyeb, Railway) with short
codes instead of raw enum values for better readability.
- Add Koyeb and Railway region mappings to regionToString()
- Fix regionsToStrings() to use regionToString() for consistent short codes
- Add groupRegionsByProvider() to categorize regions by provider
- Update monitor info display to show each provider on its own row
- Add buf.build/gen/go/openstatus/api SDK dependencies for Connect RPC
- Replace direct HTTP calls with typed SDK client for all monitor operations:
- CreateMonitor: now dispatches to CreateHTTPMonitor/CreateTCPMonitor
- DeleteMonitor: uses SDK DeleteMonitor method
- GetMonitorInfo: uses SDK GetHTTPMonitor/GetTCPMonitor methods
- ListAllMonitors: uses SDK ListMonitors method
- TriggerMonitor: uses SDK TriggerMonitor method
- UpdateMonitor: uses SDK UpdateHTTPMonitor/UpdateTCPMonitor methods
- ExportMonitor: uses SDK ListMonitors for export
- Add conversion helpers between SDK types and local types:
- Periodicity, HTTPMethod, Region enums
- Monitor type conversions (HTTP/TCP)
- Assertion comparator conversions
- Update all tests to use Connect RPC response format
- Add .env to .gitignore
- Bump Go version to 1.24.0
* lock init
* apply
* ✅
* apply command
* 🚀
* 🔥
* full cli
* docs
* docs
* import
* add install command
* hide create and delete command
* improve doc
* chore(deps): bump openstatus API to add per-component impact
* feat(status-report): add impact helpers and --impact flag parser
* refactor(status-report): convert create/add-update to params structs
* feat(status-report): wire --impact into sr create
* feat(status-report): wire --impact into sr add-update
* feat(status-report): show impact in sr info
* test(status-report): assert outbound request body for impacts
* docs(status-report): regenerate CLI docs and add --impact examples
* version dump
Adds `openstatus check <URL>` (alias `c`): a top-level, unauthenticated
command that runs a one-shot HTTP check from 28 global regions via the
public OpenStatus speed checker.
Highlights:
- Live row-per-region output streaming as NDJSON arrives, followed by
a summary footer (fastest/slowest/mean/success-rate + share URL).
- --timing adds DNS / Connection / TLS / TTFB / Transfer columns.
- --json buffers a single object with full timing nested per region,
ready for jq pipelines.
- curl-style flags -X / -H / -d (with @file and @- stdin support).
- Typed errors for 429 (parsed Retry-After + body reset fallback),
4xx (with VPN/proxy hint when body mentions client IP), 5xx,
network errors, and truncated streams.
- Region codes mapped to human-readable names (e.g. koyeb_tyo →
"Tokyo (Koyeb)") from the upstream skill repo snapshot.
Internals:
- New internal/check/ package: client.go (NDJSON streaming parser),
render.go (table + summary + JSON output), regions.go (display
names), types.go (typed errors).
- internal/api/client.go gains PlayCheckerURL pinned to
www.openstatus.dev (skips a 308 redirect on every call).
- Tests use the existing RoundTripper-interceptor pattern from
internal/run/run_test.go; fixtures captured from live probes live
in internal/check/testdata/.
Docs:
- README: new check row, dedicated Quick Start example, Global Speed
Check section.
- Manpage and generated markdown regenerated.
- skills/cli/SKILL.md teaches when to reach for check vs. saved
monitors.
Version bumped to v1.2.0 (new top-level command = semver minor).
Configure golangci-lint v2.12.2 with a curated linter set (bodyclose,
errorlint, gocritic, gosec, revive, etc.) plus gofumpt + goimports
formatters. Add a GitHub Actions workflow that runs lint on push and PR.
Tune rule suppressions for CLI idioms (tablewriter result discard, PAGER
subprocess, urfave/cli int casts, proto Id/Url naming). Apply
golangci-lint --fix across 59 files for whitespace, gofumpt, and
staticcheck rewrites; tests still pass.
- Refreshed all dependencies via 'go get -u ./... && go mod tidy'
- Bumped urfave/cli/v3 v3.0.0-alpha9.2 -> v3.9.0; BeforeFunc now returns
(context.Context, error). Updated internal/cmd/app.go accordingly.
- Bumped buf SDK to a snapshot that includes MS_TEAMS and OpenTelemetry
symbols (used by upcoming terraform-generate sync).
- Ignore local .claude/ tooling dir.
- Add plan.md design doc for the upcoming terraform-generate sync work.
Add a read-only `notification` (alias `n`) top-level command to view
notification channels configured in the workspace. Supports all 12
provider types: discord, email, google_chat, grafana_oncall, ntfy,
pagerduty, opsgenie, slack, sms, telegram, webhook, and whatsapp.
- `notification list` shows ID, name, provider, and monitor count
- `notification info <id>` shows full provider config, linked monitors,
and timestamps with nested provider-specific data in JSON output
- Follows the same patterns as status-page (dual client factory,
interceptor test helpers, JSON/table output branching)
Adds `openstatus terraform generate` (alias `tf gen`) that fetches all
workspace resources and generates Terraform HCL files with import blocks.
- New `internal/terraform/` package with fetch, HCL generation (hclwrite),
naming/dedup, region mapping (28 regions), and enum converters
- Generates provider.tf, monitors.tf, notifications.tf, status_pages.tf,
and imports.tf in ./openstatus-terraform/
- Supports HTTP, TCP, DNS monitors, 12 notification providers, status pages
with components and component groups
- Cross-references single-value fields (page_id, monitor_id, group_id) as
Terraform traversals with fallback to raw strings
- Sensitive values emitted as "REPLACE_ME" with TODO comments
- Updates CLI skill with terraform trigger phrases and workflow docs
Add `maintenance` (alias `mt`) command with create, list, info, update,
and delete subcommands for managing maintenance windows via the
Connect RPC API.
Extract shared wizard helpers (NotEmpty, HandleFormError, BuildSummary,
FetchStatusPages, FetchPageComponents, ValidRFC3339) into
`internal/wizard/` and export StatusPageURL from `internal/statuspage/`
to eliminate duplication between statusreport and maintenance wizards.
Add FormatTimestamp utility to shorten RFC 3339 timestamps in human
output (`2006-01-02 15:04 UTC`) across both maintenance and
status report commands.
When required flags are missing and stdin is a TTY, launch a step-by-step
wizard using charmbracelet/huh instead of erroring out. Flags still work
for scripting and CI — non-TTY/--json mode returns a clear missing-flags
error.
Wizard features:
- Status page select with URL display (sr create)
- Component multi-select from the selected page (sr create)
- Status report select with unresolved-first filtering (sr add-update)
- Multi-line message input for create, single-line for add-update
- Summary note + confirmation before submission
- Ctrl+C prints "Aborted." and exits 130
Also adds IsStdinTerminal() to internal/cli for proper stdin TTY detection.
- Fix missing fields in httpMonitorToLocal/tcpMonitorToLocal (DegradedAfter, Body, Headers, Assertions)
- Add parallel GetMonitorStatus and GetMonitorSummary RPC calls with graceful degradation
- Display global status (active/degraded/error) color-coded in config table
- Add per-region status table with provider labels
- Add summary metrics table (success/degraded/failed counts, P50-P99 latency, last ping)
- Add assertions table for HTTP monitors
- Add --time-range flag (1d/7d/14d) for summary period selection
- New JSON output wrapper struct with monitor, status, regions, and summary sections
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add a new `status-page` (alias `sp`) command group with two subcommands:
- `list`: displays all status pages with ID, title, and URL
- `info <page-id>`: shows page details and attached components grouped
by component group, using the GetStatusPageContent RPC
URL resolves to custom domain when available, otherwise slug.openstatus.dev.
Critical fixes:
- Fix region mapping collision causing silent data loss on round-trip
(Koyeb/Railway regions now use disambiguated codes like koyeb_fra, railway_us-west2)
- Fix global koanf instance causing state pollution between ReadConfig/ReadOpenStatus calls
- Fix partial failure in ApplyChanges leaving lock map in inconsistent state
- Fix spinner leak when statusToSDK fails in status-report list/add-update
- Fix TCP monitor creation accepting zero/invalid port values
High severity fixes:
- Fix strconv.Atoi error silently ignored in httpMonitorToLocal/tcpMonitorToLocal
- Fix DNS monitor info returning opaque "unknown monitor type" error
- Fix ResolveToken silently discarding file read errors (e.g. permission denied)
- Fix confirmation prompt blocking in non-interactive environments (added TTY check)
- Fix delete commands showing confirmation with empty ID before validation
- Fix --component-ids "" silently clearing components on status-report update
- Fix monitor trigger printing plain text in --json mode
- Fix http.DefaultClient used without timeout (added api.DefaultHTTPClient with 30s)
- Fix unknown jobType aborting entire result set in run command
- Fix monitor import truncating output file before API call succeeds
- Thread context.Context through all API calls so Ctrl+C cancels in-flight requests
- Fix race condition in `run` command: collect results per goroutine, print sequentially
- Fix spinner/output overlap: stop spinner after API call, before rendering
- Move ResolveAccessToken from internal/cli to internal/auth to avoid fragile dependency
- Pass through original errors in monitor commands instead of swallowing them
- Fix TOCTOU in monitor apply: compute diff locally, then apply once
- Add fsync to lock file writes to prevent corruption on crash
- Use net.SplitHostPort for TCP URI parsing to support IPv6
- Add login/logout commands with XDG-based token persistence
- Add status report CRUD commands via Connect RPC
- Add global --json, --quiet, --debug, --no-color flags
- Add centralized error formatting for Connect RPC errors
- Add signal handling with double Ctrl+C force exit
Add `openstatus status-report` (alias `sr`) command group with 6 subcommands:
- list: list reports with optional status filter and pagination
- info: show report details with update timeline
- create: create a report linked to a status page
- update: update report metadata (title, components)
- delete: delete a report with confirmation prompt
- add-update: add timeline entry with status transition
Extract shared auth interceptor and base URLs into `internal/api/`
so both monitors and status-report packages can reuse them.
Display regions grouped by provider (Fly.io, Koyeb, Railway) with short
codes instead of raw enum values for better readability.
- Add Koyeb and Railway region mappings to regionToString()
- Fix regionsToStrings() to use regionToString() for consistent short codes
- Add groupRegionsByProvider() to categorize regions by provider
- Update monitor info display to show each provider on its own row
- Add buf.build/gen/go/openstatus/api SDK dependencies for Connect RPC
- Replace direct HTTP calls with typed SDK client for all monitor operations:
- CreateMonitor: now dispatches to CreateHTTPMonitor/CreateTCPMonitor
- DeleteMonitor: uses SDK DeleteMonitor method
- GetMonitorInfo: uses SDK GetHTTPMonitor/GetTCPMonitor methods
- ListAllMonitors: uses SDK ListMonitors method
- TriggerMonitor: uses SDK TriggerMonitor method
- UpdateMonitor: uses SDK UpdateHTTPMonitor/UpdateTCPMonitor methods
- ExportMonitor: uses SDK ListMonitors for export
- Add conversion helpers between SDK types and local types:
- Periodicity, HTTPMethod, Region enums
- Monitor type conversions (HTTP/TCP)
- Assertion comparator conversions
- Update all tests to use Connect RPC response format
- Add .env to .gitignore
- Bump Go version to 1.24.0