{"owner":"TwiN","repo":"gatus","hasSkills":true,"hasMcp":false,"mcpConfig":null,"found":["AGENTS.md",".github/copilot-instructions.md"],"skills":{"AGENTS.md":"# AGENTS.md\n\nGuidance for AI coding agents working in this repository.\n\n## Commands\n\n- `make install` — Build the `gatus` binary\n- `make run` — Run in dev mode (uses `./config.yaml`)\n- `make test` — Run all Go tests with coverage\n- `make clean` — Remove built binary\n- `make frontend-install` — Install frontend npm dependencies\n- `make frontend-build` — Build the Vue.js frontend (**must run after any `web/` changes**)\n- `make frontend-dev` — Start the Vue dev server\n\n## Key Rules\n\n- **Vendored dependencies**: After adding/updating a Go dependency, run `go mod tidy && go mod vendor`\n- **Frontend build artifacts**: `web/static/` is generated by `make frontend-build` and embedded into the Go binary at compile time via `//go:embed`. Never edit files in `web/static/` directly\n- **Config validation order**: In `config/config.go` `parseAndValidateConfigBytes`, `ValidateAlertingConfig` **must** run before `ValidateEndpointsConfig` because provider default alerts must be parsed before endpoint defaults are set\n- **Invalid configs panic at startup** — validation errors are fatal, not graceful\n- **Hot-reload**: `main.go` watches the config file and re-runs the full stop → save → load → init → start cycle. New startup logic must account for this\n\n## Environment Variables\n\n- `GATUS_CONFIG_PATH` — Config file path (default: `config/config.yaml`); can be a directory of YAML files (deep-merged)\n- `GATUS_LOG_LEVEL` — `DEBUG`, `INFO`, `WARN`, `ERROR`\n- `ENVIRONMENT=dev` — Enables CORS for frontend dev on `localhost:8081`\n\n## Project Structure\n\n- `main.go` — Entry point; loads config, initializes storage, starts watchdog + API server\n- `config/` — Central config struct (`config.go`) and sub-packages per config section (each with `ValidateAndSetDefaults()`)\n- `alerting/` — Alerting config (`config.go`), alert types (`alert/type.go`), and one sub-package per provider under `provider/`\n- `api/` — Fiber-based HTTP API routes and SPA serving\n- `watchdog/` — Monitoring loop; spawns a goroutine per endpoint with semaphore-based concurrency control\n- `client/` — HTTP/gRPC client used for health checks\n- `storage/store/` — Storage abstraction with `memory/`, `sql/` (SQLite + PostgreSQL) implementations\n- `security/` — Authentication (basic + OIDC) and security middleware\n- `web/app/` — Vue 3 frontend source; builds to `web/static/` (embedded into the Go binary)\n- `vendor/` — Vendored Go dependencies (committed to repo)\n\n## Common Changes\n\n### Adding an Alerting Provider\n\nUse `alerting/provider/slack/` as the reference implementation. Every new provider touches **6 locations**:\n\n1. **Create provider package** — `alerting/provider/{name}/{name}.go` + `{name}_test.go`\n   - `Config` struct with `Validate()` and `Merge(*Config)` methods\n   - `AlertProvider` struct with `DefaultConfig` (yaml inline), `DefaultAlert *alert.Alert`, `Overrides []Override`\n   - Use `client.GetHTTPClient(nil)` (not `http.DefaultClient`), always `defer response.Body.Close()`\n2. **Register type** — Add `Type{Name} Type = \"{name}\"` in `alerting/alert/type.go`\n3. **Add to config struct** — Add field to `alerting.Config` in `alerting/config.go`; the **YAML tag must exactly match** the `alert.Type` string (reflection-based lookup via `GetAlertingProviderByAlertType`)\n4. **Add compile-time checks** — Both `_ AlertProvider = (*pkg.AlertProvider)(nil)` **and** `_ Config[pkg.Config] = (*pkg.Config)(nil)` in `alerting/provider/provider.go`\n5. **Register in validation** — Add the type to the `alertTypes` slice in `config/config.go` `ValidateAlertingConfig`\n6. **Document** — Add to README.md in alphabetical order\n\n### Adding a Config Section\n\n1. Create package in `config/` with struct + `ValidateAndSetDefaults()` method\n2. Add field to `Config` struct in `config/config.go`\n3. Add `Validate*` call in `parseAndValidateConfigBytes` — **respect ordering constraints** (see comments in that function)\n\n## Frontend\n\n- Vue 3 Composition API (`<script setup>`) + Tailwind CSS\n- Props-based data flow — **do not use provide/inject**\n- All components must include `dark:` prefixed Tailwind classes for dark mode\n- `window.config` contains server-injected UI settings (Go template placeholders)\n\n## API Routes (`api/api.go`)\n\n- Unprotected routes are registered **before** `ApplySecurityMiddleware`\n- Protected routes are registered **after** — placement order matters\n\n## Testing\n\n- Config structs should have `*_test.go` files\n- Use `t.Parallel()` where appropriate\n- API tests spin up test servers (see existing `*_test.go` in `api/`)\n\n## Commits & PRs\n\nWhen creating a commit or PR as an agent, state that it was made by an agent and include your model name and version.\n",".github/copilot-instructions.md":"See AGENTS.md for agent instructions"},"files":{"AGENTS.md":"# AGENTS.md\n\nGuidance for AI coding agents working in this repository.\n\n## Commands\n\n- `make install` — Build the `gatus` binary\n- `make run` — Run in dev mode (uses `./config.yaml`)\n- `make test` — Run all Go tests with coverage\n- `make clean` — Remove built binary\n- `make frontend-install` — Install frontend npm dependencies\n- `make frontend-build` — Build the Vue.js frontend (**must run after any `web/` changes**)\n- `make frontend-dev` — Start the Vue dev server\n\n## Key Rules\n\n- **Vendored dependencies**: After adding/updating a Go dependency, run `go mod tidy && go mod vendor`\n- **Frontend build artifacts**: `web/static/` is generated by `make frontend-build` and embedded into the Go binary at compile time via `//go:embed`. Never edit files in `web/static/` directly\n- **Config validation order**: In `config/config.go` `parseAndValidateConfigBytes`, `ValidateAlertingConfig` **must** run before `ValidateEndpointsConfig` because provider default alerts must be parsed before endpoint defaults are set\n- **Invalid configs panic at startup** — validation errors are fatal, not graceful\n- **Hot-reload**: `main.go` watches the config file and re-runs the full stop → save → load → init → start cycle. New startup logic must account for this\n\n## Environment Variables\n\n- `GATUS_CONFIG_PATH` — Config file path (default: `config/config.yaml`); can be a directory of YAML files (deep-merged)\n- `GATUS_LOG_LEVEL` — `DEBUG`, `INFO`, `WARN`, `ERROR`\n- `ENVIRONMENT=dev` — Enables CORS for frontend dev on `localhost:8081`\n\n## Project Structure\n\n- `main.go` — Entry point; loads config, initializes storage, starts watchdog + API server\n- `config/` — Central config struct (`config.go`) and sub-packages per config section (each with `ValidateAndSetDefaults()`)\n- `alerting/` — Alerting config (`config.go`), alert types (`alert/type.go`), and one sub-package per provider under `provider/`\n- `api/` — Fiber-based HTTP API routes and SPA serving\n- `watchdog/` — Monitoring loop; spawns a goroutine per endpoint with semaphore-based concurrency control\n- `client/` — HTTP/gRPC client used for health checks\n- `storage/store/` — Storage abstraction with `memory/`, `sql/` (SQLite + PostgreSQL) implementations\n- `security/` — Authentication (basic + OIDC) and security middleware\n- `web/app/` — Vue 3 frontend source; builds to `web/static/` (embedded into the Go binary)\n- `vendor/` — Vendored Go dependencies (committed to repo)\n\n## Common Changes\n\n### Adding an Alerting Provider\n\nUse `alerting/provider/slack/` as the reference implementation. Every new provider touches **6 locations**:\n\n1. **Create provider package** — `alerting/provider/{name}/{name}.go` + `{name}_test.go`\n   - `Config` struct with `Validate()` and `Merge(*Config)` methods\n   - `AlertProvider` struct with `DefaultConfig` (yaml inline), `DefaultAlert *alert.Alert`, `Overrides []Override`\n   - Use `client.GetHTTPClient(nil)` (not `http.DefaultClient`), always `defer response.Body.Close()`\n2. **Register type** — Add `Type{Name} Type = \"{name}\"` in `alerting/alert/type.go`\n3. **Add to config struct** — Add field to `alerting.Config` in `alerting/config.go`; the **YAML tag must exactly match** the `alert.Type` string (reflection-based lookup via `GetAlertingProviderByAlertType`)\n4. **Add compile-time checks** — Both `_ AlertProvider = (*pkg.AlertProvider)(nil)` **and** `_ Config[pkg.Config] = (*pkg.Config)(nil)` in `alerting/provider/provider.go`\n5. **Register in validation** — Add the type to the `alertTypes` slice in `config/config.go` `ValidateAlertingConfig`\n6. **Document** — Add to README.md in alphabetical order\n\n### Adding a Config Section\n\n1. Create package in `config/` with struct + `ValidateAndSetDefaults()` method\n2. Add field to `Config` struct in `config/config.go`\n3. Add `Validate*` call in `parseAndValidateConfigBytes` — **respect ordering constraints** (see comments in that function)\n\n## Frontend\n\n- Vue 3 Composition API (`<script setup>`) + Tailwind CSS\n- Props-based data flow — **do not use provide/inject**\n- All components must include `dark:` prefixed Tailwind classes for dark mode\n- `window.config` contains server-injected UI settings (Go template placeholders)\n\n## API Routes (`api/api.go`)\n\n- Unprotected routes are registered **before** `ApplySecurityMiddleware`\n- Protected routes are registered **after** — placement order matters\n\n## Testing\n\n- Config structs should have `*_test.go` files\n- Use `t.Parallel()` where appropriate\n- API tests spin up test servers (see existing `*_test.go` in `api/`)\n\n## Commits & PRs\n\nWhen creating a commit or PR as an agent, state that it was made by an agent and include your model name and version.\n",".github/copilot-instructions.md":"See AGENTS.md for agent instructions"},"items":[{"name":"AGENTS.md","path":"AGENTS.md","title":"AGENTS.md","content":"# AGENTS.md\n\nGuidance for AI coding agents working in this repository.\n\n## Commands\n\n- `make install` — Build the `gatus` binary\n- `make run` — Run in dev mode (uses `./config.yaml`)\n- `make test` — Run all Go tests with coverage\n- `make clean` — Remove built binary\n- `make frontend-install` — Install frontend npm dependencies\n- `make frontend-build` — Build the Vue.js frontend (**must run after any `web/` changes**)\n- `make frontend-dev` — Start the Vue dev server\n\n## Key Rules\n\n- **Vendored dependencies**: After adding/updating a Go dependency, run `go mod tidy && go mod vendor`\n- **Frontend build artifacts**: `web/static/` is generated by `make frontend-build` and embedded into the Go binary at compile time via `//go:embed`. Never edit files in `web/static/` directly\n- **Config validation order**: In `config/config.go` `parseAndValidateConfigBytes`, `ValidateAlertingConfig` **must** run before `ValidateEndpointsConfig` because provider default alerts must be parsed before endpoint defaults are set\n- **Invalid configs panic at startup** — validation errors are fatal, not graceful\n- **Hot-reload**: `main.go` watches the config file and re-runs the full stop → save → load → init → start cycle. New startup logic must account for this\n\n## Environment Variables\n\n- `GATUS_CONFIG_PATH` — Config file path (default: `config/config.yaml`); can be a directory of YAML files (deep-merged)\n- `GATUS_LOG_LEVEL` — `DEBUG`, `INFO`, `WARN`, `ERROR`\n- `ENVIRONMENT=dev` — Enables CORS for frontend dev on `localhost:8081`\n\n## Project Structure\n\n- `main.go` — Entry point; loads config, initializes storage, starts watchdog + API server\n- `config/` — Central config struct (`config.go`) and sub-packages per config section (each with `ValidateAndSetDefaults()`)\n- `alerting/` — Alerting config (`config.go`), alert types (`alert/type.go`), and one sub-package per provider under `provider/`\n- `api/` — Fiber-based HTTP API routes and SPA serving\n- `watchdog/` — Monitoring loop; spawns a goroutine per endpoint with semaphore-based concurrency control\n- `client/` — HTTP/gRPC client used for health checks\n- `storage/store/` — Storage abstraction with `memory/`, `sql/` (SQLite + PostgreSQL) implementations\n- `security/` — Authentication (basic + OIDC) and security middleware\n- `web/app/` — Vue 3 frontend source; builds to `web/static/` (embedded into the Go binary)\n- `vendor/` — Vendored Go dependencies (committed to repo)\n\n## Common Changes\n\n### Adding an Alerting Provider\n\nUse `alerting/provider/slack/` as the reference implementation. Every new provider touches **6 locations**:\n\n1. **Create provider package** — `alerting/provider/{name}/{name}.go` + `{name}_test.go`\n   - `Config` struct with `Validate()` and `Merge(*Config)` methods\n   - `AlertProvider` struct with `DefaultConfig` (yaml inline), `DefaultAlert *alert.Alert`, `Overrides []Override`\n   - Use `client.GetHTTPClient(nil)` (not `http.DefaultClient`), always `defer response.Body.Close()`\n2. **Register type** — Add `Type{Name} Type = \"{name}\"` in `alerting/alert/type.go`\n3. **Add to config struct** — Add field to `alerting.Config` in `alerting/config.go`; the **YAML tag must exactly match** the `alert.Type` string (reflection-based lookup via `GetAlertingProviderByAlertType`)\n4. **Add compile-time checks** — Both `_ AlertProvider = (*pkg.AlertProvider)(nil)` **and** `_ Config[pkg.Config] = (*pkg.Config)(nil)` in `alerting/provider/provider.go`\n5. **Register in validation** — Add the type to the `alertTypes` slice in `config/config.go` `ValidateAlertingConfig`\n6. **Document** — Add to README.md in alphabetical order\n\n### Adding a Config Section\n\n1. Create package in `config/` with struct + `ValidateAndSetDefaults()` method\n2. Add field to `Config` struct in `config/config.go`\n3. Add `Validate*` call in `parseAndValidateConfigBytes` — **respect ordering constraints** (see comments in that function)\n\n## Frontend\n\n- Vue 3 Composition API (`<script setup>`) + Tailwind CSS\n- Props-based data flow — **do not use provide/inject**\n- All components must include `dark:` prefixed Tailwind classes for dark mode\n- `window.config` contains server-injected UI settings (Go template placeholders)\n\n## API Routes (`api/api.go`)\n\n- Unprotected routes are registered **before** `ApplySecurityMiddleware`\n- Protected routes are registered **after** — placement order matters\n\n## Testing\n\n- Config structs should have `*_test.go` files\n- Use `t.Parallel()` where appropriate\n- API tests spin up test servers (see existing `*_test.go` in `api/`)\n\n## Commits & PRs\n\nWhen creating a commit or PR as an agent, state that it was made by an agent and include your model name and version.\n","category":"root","tokens":1167},{"name":"copilot-instructions.md","path":".github/copilot-instructions.md","title":"copilot-instructions.md","content":"See AGENTS.md for agent instructions","category":".github","tokens":9}]}