| Dimension | Shared | Only in A | Only in B | Overlap |
|---|---|---|---|---|
| Sections | 0 | 8 | 7 | 0% |
| Commands | 3 | 2 | 7 | 25% |
| Section tags | 3 | 2 | 5 | 30% |
What each file covers
Sections
0 shared · 8 only in A · 7 only in B- − Gemini Code Assistant Guide for Hovimestari
- − Project Overview
- − Core Architecture & Key Files
- − Developer Workflow & Commands
- − Import calendar events
- − Generate the daily brief
- − Project Conventions
- − Testing
- + Repository Guidelines
- + Project Structure & Module Organization
- + Build, Test, and Development Commands
- + Coding Style & Naming Conventions
- + Testing Guidelines
- + Commit & Pull Request Guidelines
- + Configuration & Secrets
Commands
3 shared · 2 only in A · 7 only in B- − task deps
- − go.mod
- + task run -- generate-brief
- + go test ./...
- + go build ./cmd/hovimestari
- + go test ./internal/...
- + go test -cover ./...
- + git log
- + task
- task build
- task test
- task lint
Section tags
3 shared · 2 only in A · 5 only in B- − testing-strategy
- − agent-behaviour
- + build
- + lint-format
- + git-pr
- + security
- + do-not
- test
- code-style
- architecture
Line diff
lepinkainen/hovimestari · GEMINI.md
@@ −1 @@
1# Gemini Code Assistant Guide for Hovimestari
2
3This guide provides essential information for AI code assistants working on the Hovimestari project.
4
5## Project Overview
6
7Hovimestari is a personal AI butler assistant written in Go. It gathers information from various sources (calendars, weather APIs, manual input), stores them as "memories" in a SQLite database, and uses a Large Language Model (LLM) to generate a personalized daily brief.
8
9- **Inspiration**: [Geoffrey Litt's AI assistant](https://www.geoffreylitt.com/2025/04/12/how-i-made-a-useful-ai-assistant-with-one-sqlite-table-and-a-handful-of-cron-jobs)
10- **Name**: "Hovimestari" is Finnish for "Butler".
11- **Primary Language**: Briefs are generated in Finnish by default, but the codebase, comments, and logs are in English.
12
13## Core Architecture & Key Files
14
15The project follows a modular structure, separating concerns into distinct packages within the `internal/` directory.
16
17- **Entry Point**: `cmd/hovimestari/main.go` initializes the [Cobra](https://github.com/spf13/cobra) CLI.
18- **CLI Commands**: Each command is a separate file in `cmd/hovimestari/commands/`.
19- **Configuration**: `internal/config/viper.go` manages configuration using [Viper](https://github.com/spf13/viper), supporting file-based (`config.json`), environment variables, and XDG standard directories (`~/.config/hovimestari/`).
20- **Database**: `internal/store/store.go` handles all interactions with the SQLite database (`memories.db`). It uses `modernc.org/sqlite` for CGO-free compilation. All data is stored in a single `memories` table.
21- **Brief Generation**: `internal/brief/brief.go` orchestrates the collection of memories and context to generate the final brief via the LLM.
22- **LLM Interaction**: `internal/llm/gemini.go` contains the client for the Google Gemini API. Prompts are stored in `prompts.json`.
23- **Importers**: Data sources are implemented as importers in `internal/importer/`. For example, `internal/importer/calendar/calendar.go` handles iCalendar/WebCal imports.
24- **Output**: `internal/output/` contains a multi-destination system to send briefs to the CLI, Discord, and Telegram.
25
26## Developer Workflow & Commands
27
28This project uses [Task](https://taskfile.dev/) as a command runner instead of Make. All common development tasks are defined in `Taskfile.yml`.
29
30- **Build the application**:
31
32 ```bash
33 task build
34 ```
35
36- **Run all tests**:
37
38 ```bash
39 task test
40 ```
41
42- **Run linter**:
43
44 ```bash
45 task lint
46 ```
47
48- **Tidy dependencies**:
49
50 ```bash
51 task deps
52 ```
53
54Application commands are executed via the compiled binary. For example:
55
56```bash
57# Import calendar events
58./build/hovimestari import-calendar
59
60# Generate the daily brief
61./build/hovimestari generate-brief
62```
63
64## Project Conventions
65
66- **Error Handling**: Use the `fmt.Errorf("...: %w", err)` pattern to wrap and add context to errors.
67- **Logging**: The project uses the standard `log/slog` library with a custom human-readable handler in `internal/logging/handler.go`. Use this for all logging.
68- **Dependencies**: Use the standard library where possible. For external dependencies, ensure they are added to `go.mod` and run `task deps`.
69- **Configuration**: When adding new configuration options, update the `Config` struct in `internal/config/viper.go` and the `config.example.json` file.
70- **Adding a Command**: To add a new CLI command, create a new file in `cmd/hovimestari/commands/` and add it to the root command in `cmd/hovimestari/main.go`. Follow the existing Cobra command structure.
71
72## Testing
73
74- Tests are located in `*_test.go` files alongside the code they test.
75- Tests should be deterministic and not rely on external services (network, LLM APIs, or the database). Mock these dependencies where necessary.
76- Run all tests using `task test`.
77
lepinkainen/hovimestari · AGENTS.md
@@ +1 @@
1# Repository Guidelines
2
3## Project Structure & Module Organization
4- Entry point lives in `cmd/hovimestari`, wiring the CLI with Kong.
5- Domain logic sits under `internal/*`: `brief` assembles daily briefs, `importer` handles calendar/weather ingestion, `store` wraps SQLite access, and `output` manages delivery channels.
6- Shared prompt artifacts reside in `llm-shared/`; background documentation sits in `docs/`.
7- Tests stay alongside sources as `_test.go` files; builds land in `build/`, and `config.example.json` documents configurable fields.
8
9## Build, Test, and Development Commands
10- `task build` runs lint and tests before emitting `build/hovimestari`.
11- `task run -- generate-brief` rebuilds then invokes the binary; append any CLI subcommand after `--`.
12- `task test` wraps `go test ./...`; add flags like `-race` or `-run` when needed.
13- `task lint` requires `golangci-lint` in `PATH`; install via `brew install golangci-lint` or the official script.
14- For quick iteration use `go build ./cmd/hovimestari` or `go test ./internal/...` directly.
15
16## Coding Style & Naming Conventions
17- Always format with `gofmt` (or `goimports`); Task targets assume formatted code.
18- Keep package names aligned with directory names (e.g., `internal/weather`, `internal/output`).
19- Exported symbols use CamelCase plus short doc comments; file-level helpers stay lowerCamelCase.
20- Configuration structs belong in `internal/config`; JSON keys mirror `config.example.json` using lower_case.
21
22## Testing Guidelines
23- Use Go's `testing` package with table-driven cases and `_test.go` suffixes.
24- Stub external services by faking interfaces in `internal/llm` or `internal/importer`; avoid live API calls.
25- Run `task test` (or `go test ./...`) before pushing; for coverage snapshots, run `go test -cover ./...`.
26
27## Commit & Pull Request Guidelines
28- Follow Conventional Commits (`feat:`, `fix:`, `chore:`) as in `git log`; keep subjects imperative under ~72 chars.
29- Group related changes per commit and document breaking changes in the body if applicable.
30- PRs should summarize behavior changes, list validation commands, and link issues (`Fixes #12`).
31- Attach CLI transcripts or config snippets when altering user workflows or outputs.
32
33## Configuration & Secrets
34- Use `config.example.json` as the starting point; do not commit populated `config.json`, `.env`, or `memories.db`.
35- Secrets load from `.env`, `$HOME/.hovimestari.env`, or environment variables before running `task` targets.
36- Document new configuration flags in `docs/04_configuration.md` and update sample values in `config.example.json`.
37
@@ −1 +1 @@
1−# Gemini Code Assistant Guide for Hovimestari
1+# Repository Guidelines
22
3−This guide provides essential information for AI code assistants working on the Hovimestari project.
3+## Project Structure & Module Organization
4+- Entry point lives in `cmd/hovimestari`, wiring the CLI with Kong.
5+- Domain logic sits under `internal/*`: `brief` assembles daily briefs, `importer` handles calendar/weather ingestion, `store` wraps SQLite access, and `output` manages delivery channels.
6+- Shared prompt artifacts reside in `llm-shared/`; background documentation sits in `docs/`.
7+- Tests stay alongside sources as `_test.go` files; builds land in `build/`, and `config.example.json` documents configurable fields.
48
5−## Project Overview
9+## Build, Test, and Development Commands
10+- `task build` runs lint and tests before emitting `build/hovimestari`.
11+- `task run -- generate-brief` rebuilds then invokes the binary; append any CLI subcommand after `--`.
12+- `task test` wraps `go test ./...`; add flags like `-race` or `-run` when needed.
13+- `task lint` requires `golangci-lint` in `PATH`; install via `brew install golangci-lint` or the official script.
14+- For quick iteration use `go build ./cmd/hovimestari` or `go test ./internal/...` directly.
615
7−Hovimestari is a personal AI butler assistant written in Go. It gathers information from various sources (calendars, weather APIs, manual input), stores them as "memories" in a SQLite database, and uses a Large Language Model (LLM) to generate a personalized daily brief.
16+## Coding Style & Naming Conventions
17+- Always format with `gofmt` (or `goimports`); Task targets assume formatted code.
18+- Keep package names aligned with directory names (e.g., `internal/weather`, `internal/output`).
19+- Exported symbols use CamelCase plus short doc comments; file-level helpers stay lowerCamelCase.
20+- Configuration structs belong in `internal/config`; JSON keys mirror `config.example.json` using lower_case.
821
9−- **Inspiration**: [Geoffrey Litt's AI assistant](https://www.geoffreylitt.com/2025/04/12/how-i-made-a-useful-ai-assistant-with-one-sqlite-table-and-a-handful-of-cron-jobs)
10−- **Name**: "Hovimestari" is Finnish for "Butler".
11−- **Primary Language**: Briefs are generated in Finnish by default, but the codebase, comments, and logs are in English.
22+## Testing Guidelines
23+- Use Go's `testing` package with table-driven cases and `_test.go` suffixes.
24+- Stub external services by faking interfaces in `internal/llm` or `internal/importer`; avoid live API calls.
25+- Run `task test` (or `go test ./...`) before pushing; for coverage snapshots, run `go test -cover ./...`.
1226
13−## Core Architecture & Key Files
27+## Commit & Pull Request Guidelines
28+- Follow Conventional Commits (`feat:`, `fix:`, `chore:`) as in `git log`; keep subjects imperative under ~72 chars.
29+- Group related changes per commit and document breaking changes in the body if applicable.
30+- PRs should summarize behavior changes, list validation commands, and link issues (`Fixes #12`).
31+- Attach CLI transcripts or config snippets when altering user workflows or outputs.
1432
15−The project follows a modular structure, separating concerns into distinct packages within the `internal/` directory.
16−
17−- **Entry Point**: `cmd/hovimestari/main.go` initializes the [Cobra](https://github.com/spf13/cobra) CLI.
18−- **CLI Commands**: Each command is a separate file in `cmd/hovimestari/commands/`.
19−- **Configuration**: `internal/config/viper.go` manages configuration using [Viper](https://github.com/spf13/viper), supporting file-based (`config.json`), environment variables, and XDG standard directories (`~/.config/hovimestari/`).
20−- **Database**: `internal/store/store.go` handles all interactions with the SQLite database (`memories.db`). It uses `modernc.org/sqlite` for CGO-free compilation. All data is stored in a single `memories` table.
21−- **Brief Generation**: `internal/brief/brief.go` orchestrates the collection of memories and context to generate the final brief via the LLM.
22−- **LLM Interaction**: `internal/llm/gemini.go` contains the client for the Google Gemini API. Prompts are stored in `prompts.json`.
23−- **Importers**: Data sources are implemented as importers in `internal/importer/`. For example, `internal/importer/calendar/calendar.go` handles iCalendar/WebCal imports.
24−- **Output**: `internal/output/` contains a multi-destination system to send briefs to the CLI, Discord, and Telegram.
25−
26−## Developer Workflow & Commands
27−
28−This project uses [Task](https://taskfile.dev/) as a command runner instead of Make. All common development tasks are defined in `Taskfile.yml`.
29−
30−- **Build the application**:
31−
32− ```bash
33− task build
34− ```
35−
36−- **Run all tests**:
37−
38− ```bash
39− task test
40− ```
41−
42−- **Run linter**:
43−
44− ```bash
45− task lint
46− ```
47−
48−- **Tidy dependencies**:
49−
50− ```bash
51− task deps
52− ```
53−
54−Application commands are executed via the compiled binary. For example:
55−
56−```bash
57−# Import calendar events
58−./build/hovimestari import-calendar
59−
60−# Generate the daily brief
61−./build/hovimestari generate-brief
62−```
63−
64−## Project Conventions
65−
66−- **Error Handling**: Use the `fmt.Errorf("...: %w", err)` pattern to wrap and add context to errors.
67−- **Logging**: The project uses the standard `log/slog` library with a custom human-readable handler in `internal/logging/handler.go`. Use this for all logging.
68−- **Dependencies**: Use the standard library where possible. For external dependencies, ensure they are added to `go.mod` and run `task deps`.
69−- **Configuration**: When adding new configuration options, update the `Config` struct in `internal/config/viper.go` and the `config.example.json` file.
70−- **Adding a Command**: To add a new CLI command, create a new file in `cmd/hovimestari/commands/` and add it to the root command in `cmd/hovimestari/main.go`. Follow the existing Cobra command structure.
71−
72−## Testing
73−
74−- Tests are located in `*_test.go` files alongside the code they test.
75−- Tests should be deterministic and not rely on external services (network, LLM APIs, or the database). Mock these dependencies where necessary.
76−- Run all tests using `task test`.
33+## Configuration & Secrets
34+- Use `config.example.json` as the starting point; do not commit populated `config.json`, `.env`, or `memories.db`.
35+- Secrets load from `.env`, `$HOME/.hovimestari.env`, or environment variables before running `task` targets.
36+- Document new configuration flags in `docs/04_configuration.md` and update sample values in `config.example.json`.
7737
