Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .serena/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/cache
46 changes: 46 additions & 0 deletions .serena/memories/project_overview.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
# Alert-Bridge Project Overview

## Purpose
Alert-Bridge is a production-grade Alertmanager webhook receiver that bridges alerts from Prometheus Alertmanager to notification systems like Slack and PagerDuty. It provides:
- Alert deduplication to prevent notification spam
- State tracking (active → acknowledged → resolved)
- Multi-channel notification support
- Silence management

## Tech Stack
- **Language**: Go 1.24.2
- **Architecture**: Clean Architecture (Domain-Driven Design)
- **Databases**: In-memory, SQLite, MySQL support
- **Message Queue**: Slack Socket Mode for bi-directional communication
- **Metrics**: Prometheus client + OpenTelemetry
- **External APIs**: Slack API, PagerDuty Events API v2

## Directory Structure
```
alert-bridge/
├── cmd/alert-bridge/ # Main entry point
├── internal/
│ ├── domain/ # Core business entities and interfaces
│ │ ├── entity/ # Alert, AckEvent, Silence entities
│ │ └── repository/ # Repository interfaces
│ ├── usecase/ # Business logic use cases
│ │ ├── alert/ # ProcessAlertUseCase, Notifier interface
│ │ ├── slack/ # Slack interaction handling
│ │ └── pagerduty/ # PagerDuty webhook handling
│ ├── adapter/ # HTTP handlers and DTOs
│ │ ├── handler/ # HTTP request handlers
│ │ └── dto/ # Data transfer objects
│ └── infrastructure/ # External implementations
│ ├── slack/ # Slack client
│ ├── pagerduty/ # PagerDuty client
│ └── persistence/ # Repository implementations
├── test/
│ ├── e2e/ # Fast mock-based e2e tests (~1s)
│ └── e2e-docker/ # Docker-based integration tests (~5min)
└── config/ # Configuration templates
```

## Key Interfaces
- `alert.Notifier` - Contract for notification channels (Slack, PagerDuty)
- `repository.AlertRepository` - Alert persistence
- `repository.SilenceRepository` - Silence management
28 changes: 28 additions & 0 deletions .serena/memories/style_conventions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# Code Style and Conventions

## Go Conventions
- Follow standard Go naming conventions (camelCase for private, PascalCase for exported)
- Error variables prefixed with `Err` (e.g., `ErrAlertNotFound`)
- Context as first parameter in methods
- Return errors as last return value

## Architecture Patterns
- **Clean Architecture**: Domain → Use Case → Adapter → Infrastructure
- **Dependency Inversion**: All dependencies point inward toward domain
- **Interface Segregation**: Small, focused interfaces (e.g., `Notifier` with 3 methods)

## Linting
- Uses golangci-lint v2 with comprehensive ruleset
- Key enabled linters: errcheck, govet, staticcheck, gosec, gocritic, revive
- Max cyclomatic complexity: 20
- Local import prefix: `github.com/qj0r9j0vc2/alert-bridge`

## Entity Naming
- Severity: `SeverityCritical`, `SeverityWarning`, `SeverityInfo`
- State: `StateActive`, `StateAcked`, `StateResolved`

## Testing Conventions
- Test files: `*_test.go`
- Test function names: `Test<FunctionName><Scenario>`
- Use testify for assertions where appropriate
- E2E tests use harness pattern for setup/teardown
49 changes: 49 additions & 0 deletions .serena/memories/suggested_commands.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
# Suggested Commands for Alert-Bridge Development

## Building
```bash
make build # Build binary to bin/alert-bridge
go build -o bin/alert-bridge ./cmd/alert-bridge
```

## Testing
```bash
make test # Run all tests (unit + e2e mock)
make test-unit # Run only unit tests
make test-e2e # Run fast mock-based e2e tests (~1s)
make test-e2e-docker # Run Docker-based integration tests (~5min)
make test-coverage # Run tests with coverage report
```

## Linting & Formatting
```bash
make lint # Run golangci-lint
make fmt # Format code with gofmt and goimports
go vet ./... # Run go vet checks
```

## Dependency Management
```bash
make tidy # go mod tidy
make deps # go mod download
```

## Running
```bash
make run # Run the application
make dev # Development mode with hot reload (requires air)
make docker-run # Run in Docker container
```

## Docker
```bash
make docker-build # Build Docker image
docker-compose -f docker-compose.test.yaml up # Run test environment
```

## Utility Commands (Darwin)
```bash
ls -la # List files
find . -name "*.go" -type f # Find Go files
grep -r "pattern" . # Search for pattern
```
23 changes: 23 additions & 0 deletions .serena/memories/task_completion_checklist.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Task Completion Checklist

When completing a task, ensure the following:

## Before Committing
1. **Tests pass**: `make test` runs without failures
2. **Linting passes**: `make lint` has no errors
3. **Formatting applied**: `make fmt` was run

## Code Quality Checks
- [ ] No hardcoded secrets or sensitive data
- [ ] Error handling is complete (no ignored errors)
- [ ] Context propagation is correct
- [ ] Thread-safety considered for concurrent code
- [ ] Interface contracts are satisfied

## E2E Testing
- For fast feedback: `make test-e2e` (mock-based, ~1s)
- For full integration: `make test-e2e-docker` (requires Docker)

## Documentation
- Update README if public API changes
- Add/update godoc comments for exported symbols
89 changes: 89 additions & 0 deletions .serena/project.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# list of languages for which language servers are started; choose from:
# al bash clojure cpp csharp
# csharp_omnisharp dart elixir elm erlang
# fortran fsharp go groovy haskell
# java julia kotlin lua markdown
# matlab nix pascal perl php
# powershell python python_jedi r rego
# ruby ruby_solargraph rust scala swift
# terraform toml typescript typescript_vts vue
# yaml zig
# (This list may be outdated. For the current list, see values of Language enum here:
# https://github.com/oraios/serena/blob/main/src/solidlsp/ls_config.py
# For some languages, there are alternative language servers, e.g. csharp_omnisharp, ruby_solargraph.)
# Note:
# - For C, use cpp
# - For JavaScript, use typescript
# - For Free Pascal/Lazarus, use pascal
# Special requirements:
# - csharp: Requires the presence of a .sln file in the project folder.
# - pascal: Requires Free Pascal Compiler (fpc) and optionally Lazarus.
# When using multiple languages, the first language server that supports a given file will be used for that file.
# The first language is the default language and the respective language server will be used as a fallback.
# Note that when using the JetBrains backend, language servers are not used and this list is correspondingly ignored.
languages:
- go

# the encoding used by text files in the project
# For a list of possible encodings, see https://docs.python.org/3.11/library/codecs.html#standard-encodings
encoding: "utf-8"

# whether to use project's .gitignore files to ignore files
ignore_all_files_in_gitignore: true

# list of additional paths to ignore in all projects
# same syntax as gitignore, so you can use * and **
ignored_paths: []

# whether the project is in read-only mode
# If set to true, all editing tools will be disabled and attempts to use them will result in an error
# Added on 2025-04-18
read_only: false

# list of tool names to exclude. We recommend not excluding any tools, see the readme for more details.
# Below is the complete list of tools for convenience.
# To make sure you have the latest list of tools, and to view their descriptions,
# execute `uv run scripts/print_tool_overview.py`.
#
# * `activate_project`: Activates a project by name.
# * `check_onboarding_performed`: Checks whether project onboarding was already performed.
# * `create_text_file`: Creates/overwrites a file in the project directory.
# * `delete_lines`: Deletes a range of lines within a file.
# * `delete_memory`: Deletes a memory from Serena's project-specific memory store.
# * `execute_shell_command`: Executes a shell command.
# * `find_referencing_code_snippets`: Finds code snippets in which the symbol at the given location is referenced.
# * `find_referencing_symbols`: Finds symbols that reference the symbol at the given location (optionally filtered by type).
# * `find_symbol`: Performs a global (or local) search for symbols with/containing a given name/substring (optionally filtered by type).
# * `get_current_config`: Prints the current configuration of the agent, including the active and available projects, tools, contexts, and modes.
# * `get_symbols_overview`: Gets an overview of the top-level symbols defined in a given file.
# * `initial_instructions`: Gets the initial instructions for the current project.
# Should only be used in settings where the system prompt cannot be set,
# e.g. in clients you have no control over, like Claude Desktop.
# * `insert_after_symbol`: Inserts content after the end of the definition of a given symbol.
# * `insert_at_line`: Inserts content at a given line in a file.
# * `insert_before_symbol`: Inserts content before the beginning of the definition of a given symbol.
# * `list_dir`: Lists files and directories in the given directory (optionally with recursion).
# * `list_memories`: Lists memories in Serena's project-specific memory store.
# * `onboarding`: Performs onboarding (identifying the project structure and essential tasks, e.g. for testing or building).
# * `prepare_for_new_conversation`: Provides instructions for preparing for a new conversation (in order to continue with the necessary context).
# * `read_file`: Reads a file within the project directory.
# * `read_memory`: Reads the memory with the given name from Serena's project-specific memory store.
# * `remove_project`: Removes a project from the Serena configuration.
# * `replace_lines`: Replaces a range of lines within a file with new content.
# * `replace_symbol_body`: Replaces the full definition of a symbol.
# * `restart_language_server`: Restarts the language server, may be necessary when edits not through Serena happen.
# * `search_for_pattern`: Performs a search for a pattern in the project.
# * `summarize_changes`: Provides instructions for summarizing the changes made to the codebase.
# * `switch_modes`: Activates modes by providing a list of their names
# * `think_about_collected_information`: Thinking tool for pondering the completeness of collected information.
# * `think_about_task_adherence`: Thinking tool for determining whether the agent is still on track with the current task.
# * `think_about_whether_you_are_done`: Thinking tool for determining whether the task is truly completed.
# * `write_memory`: Writes a named memory (for future reference) to Serena's project-specific memory store.
excluded_tools: []

# initial prompt for the project. It will always be given to the LLM upon activating the project
# (contrary to the memories, which are loaded on demand).
initial_prompt: ""

project_name: "hamburg"
included_optional_tools: []
47 changes: 31 additions & 16 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: build run test clean docker-build docker-run lint fmt help
.PHONY: build run test test-unit test-e2e test-e2e-docker clean docker-build docker-run lint fmt help

# Variables
BINARY_NAME=alert-bridge
Expand All @@ -14,10 +14,22 @@ build:
run:
$(GO) run ./cmd/alert-bridge

# Run tests
# Run all tests (unit + e2e mock-based)
test:
$(GO) test -v ./...

# Run only unit tests (excludes e2e)
test-unit:
$(GO) test -v ./internal/... ./cmd/...

# Run mock-based e2e tests (fast, no Docker required)
test-e2e:
$(GO) test -v ./test/e2e/... -timeout 60s

# Run Docker-based e2e tests (comprehensive, requires Docker)
test-e2e-docker:
./scripts/e2e-setup.sh

# Run tests with coverage
test-coverage:
$(GO) test -v -coverprofile=coverage.out ./...
Expand Down Expand Up @@ -70,17 +82,20 @@ dev:
# Help
help:
@echo "Available targets:"
@echo " build - Build the binary"
@echo " run - Run the application"
@echo " test - Run tests"
@echo " test-coverage - Run tests with coverage"
@echo " clean - Clean build artifacts"
@echo " docker-build - Build Docker image"
@echo " docker-run - Run Docker container"
@echo " lint - Run linter"
@echo " fmt - Format code"
@echo " tidy - Tidy dependencies"
@echo " deps - Download dependencies"
@echo " mocks - Generate mocks"
@echo " dev - Development mode with hot reload"
@echo " help - Show this help"
@echo " build - Build the binary"
@echo " run - Run the application"
@echo " test - Run all tests (unit + e2e mock-based)"
@echo " test-unit - Run only unit tests"
@echo " test-e2e - Run mock-based e2e tests (fast, no Docker)"
@echo " test-e2e-docker - Run Docker-based e2e tests (comprehensive)"
@echo " test-coverage - Run tests with coverage"
@echo " clean - Clean build artifacts"
@echo " docker-build - Build Docker image"
@echo " docker-run - Run Docker container"
@echo " lint - Run linter"
@echo " fmt - Format code"
@echo " tidy - Tidy dependencies"
@echo " deps - Download dependencies"
@echo " mocks - Generate mocks"
@echo " dev - Development mode with hot reload"
@echo " help - Show this help"
Loading